An example of nsIContentPolicy for firefox addon?

前端 未结 1 622
春和景丽
春和景丽 2020-12-06 03:25

I have read NsIContentPolicy and have searched whole Stackoverflow for a proper tutorial for implementing NsIContentPolicy, but all in vain. I know that Adblock uses NsICon

相关标签:
1条回答
  • 2020-12-06 04:16

    I am not aware of any good tutorial but I can give you some minimal example code:

    Cu.import("resource://gre/modules/XPCOMUtils.jsm");
    Cu.import("resource://gre/modules/Services.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 = Components.manager.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);
    
        onShutdown.add((function()
        {
          for each (let category in this.xpcom_categories)
            catMan.deleteCategoryEntry(category, this.contractID, false);
    
          // This needs to run asynchronously, see bug 753687
          Services.tm.currentThread.dispatch(function()
          {
            registrar.unregisterFactory(this.classID, this);
          }.bind(this), Ci.nsIEventTarget.DISPATCH_NORMAL);
        }).bind(this));
      },
    
      // 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();
    

    This comes from the minimal content policy implementation I use to look at issues with the content policies implementation - it doesn't do anything other than dumping all content policies calls to the console (window.dump documentation). Obviously, in a real implementation the fields classDescription , classID and contractID should be changed to something proper. onShutdown belongs to the private framework I am using: this extension is restartless which is why it needs to register the component "manually" and will also run this code to remove it if it is shut down during a browser session.

    You can also download the complete extension: testpolicy.xpi.

    0 讨论(0)
提交回复
热议问题