備忘録と今後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);
+ }
+})();
+
+// 以上!