広告をブロックするためのクロム拡張を作成しています。これまでにすべてがかなりうまくいった。JavaScript - addEventListenerが定義されていません
- 無効に
WebSocket
- 無効に
console.log
- 無効に
alert
- 無効にポップアップ(
window.open
)もちろん - 無効に
onbeforeunload
、ブロックするようになっている:私の目標はにありますこれらの機能は指定されたウェブサイトでのみ機能します。私は機能をブロックする方法を探しました。私が見つけた唯一の方法はそう、これは私の拡張機能のコードの前に実行されてから他のコードを防ぐことができます(document_start
で実行されるコンテンツのスクリプトinit.js
を追加manifest.json
で
- に拡張子が使用して機能を無効にすることです誰も盗むしないと、私はそれらを無効にする前に、私の拡張子が
- オーバーライドブラックリストに載った機能を非サンドボックス環境にアクセスできるように、Webページに
init.js
ジェクトコードから) - をこれらの関数への参照を保存することができます
私はすべてをやりましたが、問題は関数をオーバーライドする方法でした。私はEcmaScript7の仕様では、は、機能がプロキシのインスタンスかどうかを検出する方法がないとわかりました。だから、私はこれらの関数をすべてproxyfiedし、期待どおりに動作します。ウェブサイトは私がこれらの機能すべてをオーバーライドしたことに気付かなかった。
しかし、それはすべての機能のために働くと期待しますaddEventListener
。 onbeforeunload
をブロックするには、プロキシハンドラを追加し、リスナー名がonbeforeunload
かどうかを確認するコールを追跡する必要があります。
addEventListener = new Proxy(addEventListener, {
apply: (f, t, args) => {
if(args[0] !== 'onbeforeunload'){
f.apply(t, args);
}
}
});
この呼び出しをフィルタリングし、onbeforeunload
イベントを設定していないだけの呼び出しを許可する必要があります。私は、次のスクリプトを書きました。しかし、それはをスローするReferenceError:addEventListenerは定義されていない。それは私をたくさん驚かせました。 addEventListener
がまだdocument_start
で初期化されていないが、console.log(typeof addEventListener)がコンソールにログfunction
が記録されている可能性が高いと思われます。どのようにそれは可能ですか?
私はそれを説明できませんでした。しかし、私はそれを関数に入れようとしてから、addEventListener
がアクセス可能になるまでその関数にを入れようとしました(上記のコードをtry...catch
でもカプセル化しました)。しかし、addEventListener
を変更すると常にReferenceErrorがスローされ、はエラーにスローされません。
また、デベロッパーコンソールやjavascript:...
メソッドからもアクセスしようとしましたが、正常に動作していますが、エラーなしで変更できます。
編集
確認のために、問題はbecuase私がきちんと非サンドボックス(実際の)ページ環境にスクリプトを注入し、私は本当のwindow
オブジェクトへのアクセス権を持って、this oneのようではありません。
なぜソケットとconsole.logを無効にしますか? @DanielHerr。 –
多くのウェブサイトでは、「ウェブソケット」を介して広告をイメージ:データとして転送しています。標準の 'adBlock'はそれらを決してブロックできません。だから、私は自分の拡張を作成することに決めました。 –