Skip to content

Instantly share code, notes, and snippets.

@coke12103
Last active March 5, 2020 00:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save coke12103/f4c8d1dc690a112132ea2dd76b4d9ae5 to your computer and use it in GitHub Desktop.
Save coke12103/f4c8d1dc690a112132ea2dd76b4d9ae5 to your computer and use it in GitHub Desktop.
FalkonでZenza Watch Dev版を動くようにした時のメモ

FalkonでZenza Watch Dev版を動くようにした時のメモ

備忘録と今後FalkonでZenza Watchを動かそうと思った変人への知見。

動かない状況と原因

  • FalkonにはFalkon GreaseMonkeyなるUserScriptを動かす用のエクステンションが標準搭載されている。
  • しかしFalkon GreaseMonkey上で実行されたスクリプトで参照できるwindowは何故かページ上のwindowと一致していない。(詳しく調べてないけど空間を共有していないっぽい?)
  • Zenza Watch Dev版は自分のスクリプトの一部をBlobとしてheadに埋め込みwindowから独自の関数などを参照しているのでエラーを吐いて動かない。
  • これとは別にStableのZenza Watchも試したがそちらもなんらかの原因で動かない。(こちらは調べてないので同じ原因かはわからない)
  • FalkonはマイナーブラウザなのでUserScriptでの実用例すらも全く出てこない。

解決

  • Zenza Watch Dev版は自分のスクリプトの一部をBlobにしてheadに埋め込んでいる。
  • つまりZenza Watchのスクリプト全体をすべてBlobにしてheadに埋め込むことで動くようになるのでは?とheadに埋め込んでみた。
  • ページ上のwindowになさそうだったので@requireで追加されるlodashもついでに手動でheadから読み込むようにしてみた。
  • 結果としてこんな感じに先頭付近と末尾に追記すると動くようになる。
 // ==/UserScript==
 /* eslint-disable */
+// ここからFalkonで動作させるためのコード
+const FalkonZenzaWatch = async function(){
+// 一旦ここまで末尾からもっと
 const AntiPrototypeJs = function() {
   if (this.promise !== null || !window.Prototype || window.PureArray) {
 })(globalThis ? globalThis.window : window);
+}; 
+// Falkonで動作させるためのコード再び
+(() => {
+  try {
+    const zanza_blob = new Blob([
+      `(${FalkonZenzaWatch})();`
+	   ], {type: 'text/javascript'});
+    const src = URL.createObjectURL(zanza_blob);
+    const handler = () => {
+      URL.revokeObjectURL(src);
+      script.remove();
+    };
+    const script = Object.assign(document.createElement('script'), {
+      id: 'FalkonZenzaWatch',
+      type: 'text/javascript',
+      src,
+      onload: handler,
+      onerror: handler,
+      charset: 'UTF-8'
+    });
+    const l = Object.assign(document.createElement('script'), {
+      id: 'lodash',
+      type: 'text/javascript',
+      src: 'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js'
+    });
+    document.head.append(script);
+    document.head.append(l);
+  } catch(e) {
+    console.warn('Falkon Zenza Load failed!', e);
+  }
+})();
+
+// 以上!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment