1

Addon SDK (V1.9) で Firefox 拡張機能を開発しています。

目的

特定のコンテンツ タイプの HTTP リクエストを、それらが読み込まれる前 (リクエストが送信される前) に調べる必要があります。

問題

「observer-service」モジュールを介してオブザーバーを追加する場合、「http-on-modify-request」を使用してすべての HTTP リクエストを調べます。これにより、ヘッダーが提供されます。ただし、コンテンツ タイプをチェックするときは、要求に応じて設定されることはありません。

content-type は確かに応答に設定されており、「http-on-examine-response」を使用して調べています。しかし、これはリクエストがすでにロードされていることを意味し、私の拡張機能の目的を無効にします。

編集

@ Wladimir Palantリクエスト ヘッダーの送信時に content-type が設定されていないことを指摘していただきありがとうございます。

私に関連する一連の正規表現でHTTPリクエストのURLをテストしてブロックしようとしています。ただし、特定のコンテンツ タイプ (画像など) はアプリケーションに関連しないため、スキップできるようにしたいと考えていました。

4

1 に答える 1

0

それでは、本題を締めくくります。ブラウザに読み込まれるリソースを完全に制御する最善の方法は、nsIContentPolicyを使用することです。

@WladimirPalant はここに素晴らしい例を書きました。これは、彼のコードが Addon SDK (v1.9) に適合する様子です。

const { Cc, Ci, Cu, Cm, components } = require('chrome');
const { XPCOMUtils } = Cu.import("resource://gre/modules/XPCOMUtils.jsm");


let policy =
{
    classDescription: "Test content policy",
    classID: components.ID("{12345678-1234-1234-1234-123456789abc}"),
    contractID: "@adblockplus.org/test-policy;1",
    xpcom_categories: ["content-policy"],

    init: function()
    {
        let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
        registrar.registerFactory(this.classID, this.classDescription, this.contractID, this);

        let catMan = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager);
        for each (let category in this.xpcom_categories)
            catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true);
},

    // nsIContentPolicy interface implementation
    shouldLoad: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra)
    {
        dump("shouldLoad: " + contentType + " " +
                      (contentLocation ? contentLocation.spec : "null") + " " +
                      (requestOrigin ? requestOrigin.spec : "null") + " " +
                      node + " " +
                      mimeTypeGuess + "\n");
        return Ci.nsIContentPolicy.ACCEPT;
    },

    shouldProcess: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra)
    {
        dump("shouldProcess: " + contentType + " " +
                        (contentLocation ? contentLocation.spec : "null") + " " +
                        (requestOrigin ? requestOrigin.spec : "null") + " " +
                        node + " " +
                        mimeTypeGuess + "\n");
        return Ci.nsIContentPolicy.ACCEPT;
    },

    // nsIFactory interface implementation
    createInstance: function(outer, iid)
    {
        if (outer)
            throw Cr.NS_ERROR_NO_AGGREGATION;
        return this.QueryInterface(iid);
    },

    // nsISupports interface implementation
    QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy, Ci.nsIFactory])
};

policy.init();
于 2012-08-24T19:09:34.827 に答える