ERROR : CANNOT READ PROPERTY 'PUSH' OF UNDEFINED IN JS

The Webpack

Để có thể làm được việc này, họ cần tìm hiểu một chút về kiểu cách mà React bunlde các script JS của mình, kia là sử dụng Webpack. Webpack vẫn bundle toàn bộ các thư viện, source code js do chúng ta viết thành một tệp tin JS và bảo đảm an toàn thứ trường đoản cú load các module (dependcy tree) này phải chăng để rất có thể chạy trơn tru.

Bạn đang xem: Error : cannot read property 'push' of undefined in js

File injectPreloadHook.js (và tựa như với injectAfterloadHook.js) sẽ được load trên document_start, khi mà HTML đã có được load hoàn thành và js không được chạy, tại lúc này ta rất có thể inject một đoạn js vào phần của trang:

var s = document.createElement("script");s.src = chrome.runtime.getURL("preloadHook.js");s.onload = function() this.remove();;(document.head || document.documentElement).appendChild(s);hàm này sẽ load thêm đoạn script preloadHook.js (chính là phần code ở trên) để rồi ở afterloadHook.js được load sinh sống document_end chúng ta cũng có thể lấy ra được thay đổi esmodules:

*

Và viết một vòng lặp 1-1 giản, tìm kiếm xem module nào tất cả thuộc tính FeatureFlags, họ đã bao gồm cái đề xuất tìm

*

The Code

console.log("Afterload Hook STARTED !!!");cw_timer = setInterval(() => if (typeof CW !== "undefined" && typeof RM !== "undefined" && typeof CW.application !== "undefined" && typeof CW.application.domainLifecycleContext !== "undefined" && typeof CW.application.domainLifecycleContext.messageRepository !== "undefined" ) window.clearInterval(cw_timer); // include to lớn Chat++ for (i in window.esmodules) let m = window.esmodules; if (m.FeatureFlags) window.featureModule = m; console.log("FOUND FeatureFlags module", window.featureModule); console.log("Disable feature render by AST"); window.featureModule.FeatureFlags.FRE2252 = false; console.log("Clear htmlCache"); for (i in CW.application.domainLifecycleContext.messageRepository.entities) let msg = CW.application.domainLifecycleContext.messageRepository.entities; console.log(msg.body.body); msg.body.body.htmlCache = null; console.log("Reset buildtime"); RL.rooms.buildtime = 0; console.log("Wait for Chat++ load và rebuild room"); , 100);Cùng điểm qua từng phần của hàm này:

Chúng ta chờ cho đến khi Chatwork được load trả toàn bằng cách setInterval và check biến CW.Lặp qua mảng esmodules cùng tìm module nào tất cả thuộc tính FeatureFlags rồi lưu vào biến hóa window.featureModuleDisable feature nàyKhi đoạn script này được chạy thì room lúc này đã được load xong, vị vậy ta yêu cầu reset bằng cáchClear hết cục bộ htmlCache của room hiện tạiXoá buildtime do tại hàm build của RoomView.build có kiểm tra biến này như sau:

if (0 != this.buildtime) return this.view.build(n), r.CW.application.getACL().changeSelectRoomFromOldCode(this.id, n.jumpTo), !0;this.load(n, (function() t.view.build(n)))Rồi sau đó, đợi Chat++ load vào vào thôi

*
. Make Chat++ great again!

The Bonus

Niềm vui ngắn chẳng tày gang, được một thời gian thì lại lỗi. Render hoàn toàn ok, nhưng cho đến lúc edit message thì bị lỗi:

Uncaught (in promise) TypeError: Cannot read property "tokens" of null at t.searchUrlTokens (index.js:3534) at Function.e.from (index.js:3558) at n.createEditing (index.js:3558) at index.js:3630 at e.mapMessage (index.js:3630) at e.editMessage (index.js:3630) at t.

Xem thêm: Số Hóa Dữ Liệu Bản Đồ — Qgis Là Gì, Số Hóa Dữ Liệu Bản Đồ — Qgis Tutorials And Tips

(index.js:3630) at index.js:3630 at Object.next (index.js:3630) at index.js:3630Cùng kiểm soát đoạn code gây lỗi:

t.prototype.getAST = function() return u.FeatureFlags.FRE2252 ? i.ChatworkSyntax.tokenize(this.getValue()) : null,t.prototype.searchUrlTokens = function() return function e(t) return t.reduce((function(t, n) var o = d.default(n) , r = p.isIncludesExternalLink(n); return o ? r ? t.concat(, e(o)) : t.concat(e(o)) : r ? t.concat() : t ), <>) (this.getAST().tokens)Holly shit, ko còn kiểm tra flag FeatureFlags.FRE2252 nữa mà thực hiện thẳng luôn hàm getAST với tokens, nhưng cụ thể là khi bật FeatureFlags.FRE2252 thì hàm này vẫn trả về là null với dẫn đến lỗi.

Trong source code có tương đối nhiều hàm getAST cơ mà hàm getAST bọn họ cần tìm nằm ở module ChatworkNotation. Kiểm tra hàm này:

t.prototype.getAST = function() return d.FeatureFlags.FRE2252 ? i.ChatworkSyntax.tokenize(this.getValue()) : null return window.tokenizer.default(this.getValue());Để fix lỗi này, bạn cũng có thể dùng trick như sau: overwrite lại hàm getAST, bật FeatureFlags.FRE2252lên, call hàm getAST cũ để đưa ra tokens rồi tiếp đến lại tắt . Code cần thêm vào Chat++ như sau:

// Get ChatworkNotationif (m.ChatworkNotation) window.notationModule = m;để lấy ra module ChatworkNotation. Thực hiện cùng trick proxy để overwrite hàm getAST như sau:

console.log("Overwrite getAST");getAST_handler = apply: function(target, thisArg, args) // temporary enable FeatureFlags.FRE2252 lớn make getAST() works then disable it window.featureModule.FeatureFlags.FRE2252 = true; r = target.apply(thisArg, args); window.featureModule.FeatureFlags.FRE2252 = false; return r; notationModule.ChatworkNotation.prototype.getAST = new Proxy(notationModule.ChatworkNotation.prototype.getAST, getAST_handler);và cố kỉnh là Chat++ emo lại works like a charm.