title: How to implement XPCOM component (nsIContentPolicy) in bootstrapped Firefox extension
body: <p>I have a bootstrapped extension for Firefox. 
  And now I want to implement nsIContentPolicy XPCOM component.
  I wrote a component module code. 
  And now I want to register this component.
  The reason I want to register component is that I want to add my component to  <code>nsICategoryManager.addCategoryEntry</code> with "content-policy" category.</p>
  
  <pre><code>var {Cc, Ci, Cu} = require("chrome");
  
  Cu.import("resource://gre/modules/XPCOMUtils.jsm");
  
  //console.error("Running interceptor");
  
  function Interceptor() 
  }
  
  Interceptor.prototype = {
  
      classDescription: "DeferredTo HTTP requests Interceptor",
      classID: "{B5B3D9A0-08FC-11E3-8253-5EF06188709B}",
      contractID: "@deferredto.com/Interceptor;1",
      QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy]),
  
      shouldLoad : function dt_shouldLoad(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
          console.log("dt_shouldLoad");
  
          if (contentLocation.scheme != "http" &amp;&amp; contentLocation.scheme != "https")
              return Ci.nsIContentPolicy.ACCEPT;
  
          let result = Ci.nsIContentPolicy.ACCEPT;
  
          // we should check for TYPE_SUBDOCUMENT as well if we want frames.
          if ((Ci.nsIContentPolicy.TYPE_DOCUMENT == aContentType) &amp;&amp;
              SOME_REGULAR_EXPRESSION.test(aContentLocation.spec)) {
              // do stuff here, possibly changing result.
          }
          return result;
      },
  
      shouldProcess: function ILO_shouldProcess() Ci.nsIContentPolicy.ACCEPT,
  
      _xpcom_categories: [
          { category: "content-policy", service: true }
      ],
      classInfo: XPCOMUtils.generateCI(
      {classID: Components.ID("{B5B3D9A0-08FC-11E3-8253-5EF06188709B}"),
       contractID: "@deferredto.com/Interceptor;1",
       classDescription: "Interceptor implements nsIContentPolicy to block images that are not yet at screen @DeferredTo",
       interfaces: [
                    Ci.nsIContentPolicy,
                    ],
       flags: Ci.nsIClassInfo.SINGLETON})
  }
  
  var components = [Interceptor];
  
  var NSGetFactory = XPCOMUtils.generateNSGetFactory([Interceptor]);
  </code></pre>
  
  <p>Questions: </p>
  
  <ul>
  <li>Is it possible to register the component from bootstrapped extension?</li>
  <li>Is it possible to register the component from restartless extension?</li>
  <li>Is it possible to use nsICategoryManager.addCategoryEntry "content-policy" without
  component? </li>
  <li>How to register the component in bootstrapped extension or somehow add
  new "content-policy" category entry?</li>
  </ul>
  
  <p>I've added to harness-options.js</p>
  
  <pre><code>"requirements": {
  "sdk/page-mod": "sdk/page-mod",
  "sdk/self": "sdk/self",
  "chrome": "chrome"},
  </code></pre>
  
  <p>That is how I try to import module:</p>
  
  <pre><code>var {Cc, Ci, Cu} = require("chrome");
  Cu.import("resource://deferredto/lib/interceptor.js");
  </code></pre>
  
  <p>I' ve tried many paths ))) But none works. resource entry in chrome.manifest file does not allowed for bootstrapped extensions. The path to component module file is:
      <code>resources/deferredto/lib/interceptor.js</code></p>