2

現在のページの Javascript が起動される前に Javascript コードを起動する Firefox 拡張機能を作成しようとしています。私の Javascript コードは基本的に、ページの Javascript コードを実行または拒否できるかどうかを制御します。

私は最初にこの回答に従おうとしましたが、それを機能させる方法を実際に理解できずonDOMContentLoaded、Javascriptが既に実行された後にロードされる に依存していることに気付きました。

次に、XPCOM に注意を向けましたが、もう一度 Firefox のチュートリアルが何を伝えているのかよくわかりませんでした。

私は最近、Firebug を介して拡張機能を作成しようとしましたが、同じ問題に遭遇したようです...解析/実行された後にのみJavascriptにアクセスできます。これが私が書いた結果のコードです。イベントでファイルのオブジェクトにアクセスできればonExamineResponse、問題は解決できると思いますが、その方法がわかりません...次のコードについて話しているのです。

BeepbopListener.prototype = {
    onRequest: function(context, file) {
       ...
    },

    onExamineResponse: function(context, file) {
        FBTrace.sysout("onexamineresponse " + file);  // this returns something like
        // '[xpconnect wrapped (nsISupports, nsIHttpChannel, nsIRequest, nsIUploadChannel, nsITraceableChannel, nsIHttpChannelInternal)]'
        // but I don't know how to access those elements...
        var pattern = /\.js$/;
        if (pattern.test(file.href) && FBTrace.DBG_BEEPBOP) {
          FBTrace.sysout("ONEXAMINE DOESN'T EVEN GET IN THIS IF SO YOU WON'T SEE THIS");
        }
    },

    ...
};

私の質問は... ページ上のすべての Javascript コードを実行前にアクセスする方法を示すチュートリアルはありますか? また、誰かが有益な洞察を持っているなら、私はそれを聞きたいです. ああ、もっとコードが必要な場合は、お知らせください。投稿します。

4

2 に答える 2

2

content-document-global-createdオブザーバー通知をリッスンすることで、JavaScriptコードが実行される前に新しいドキュメントにアクセスできます。ただし、この時点でドキュメントは空になり、パーサーが<script>タグを追加するとすぐにJavaScriptコードが実行されます。これを実際に防ぐことはできません。これが私が知っているスクリプト実行を制御するためのオプションです。

nsIDocShell.allowJavascript1) :を使用してウィンドウのすべてのJavaScriptを無効にします。

wnd.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
   .getInterface(Components.interfaces.nsIWebNavigation)
   .QueryInterface(Components.interfaces.nsIDocShell)
   .allowJavascript = false;

これはオールオアナッシングアプローチです。新しいドキュメントが同じフレームに読み込まれた場合でも、JavaScriptは無効のままであることに注意してください。

2)XPCOMコンポーネントにnsIContentPolicyインターフェースcontent-policyを実装し、 (を介してnsICategoryManager)カテゴリに登録します。関数shouldLoad()はスクリプトを選択的にブロックできますが<script src="...">、ページ上のインラインスクリプトではなく、外部スクリプト(を意味する)に対してのみ呼び出されます。

3)JavaScriptデバッガーサービスを使用して、スクリプトの実行をインターセプトします。jsdIDebuggerService.interruptHookJavaScriptの実行をステップスルーし、いつでもスクリプトを中止するために使用できます。しかし、それはもちろんJavaScriptの実行を非常に遅くします。少なくともjsdIDebuggerService.addFilter()、特定のドキュメントに制限するために使用する必要があります。そうしないと、ブラウザ全体(ブラウザUIを含む)の速度が低下します。

于 2012-04-19T07:19:29.437 に答える
2

現在のページの Javascript が起動される前に Javascript コードを起動する Firefox 拡張機能を作成しようとしています。私の Javascript コードは基本的に、ページの Javascript コードを実行または拒否できるかどうかを制御します。

ドキュメントが完全に解析されないようにすることから始めて、同じドキュメントをフェッチし、このドキュメントに対して何らかの処理を行ってから、結果のドキュメントをページに挿入します。これが私が現在行っている方法ですhttps://stackoverflow.com/a/36097573/6085033

于 2016-03-19T04:47:07.577 に答える