Пример nsIContentPolicy для аддона Firefox?

я прочиталNsIContentPolicy и искали весь Stackoverflow для правильного учебника по реализации NsIContentPolicy, но все тщетно. Я знаю, что Adblock использует NsIContentPolicy в качестве основного оружия. Обратный инжиниринг Adblock не помог мне понять, как реализовать NsIContentPolicy. Есть ли какое-нибудь простое дополнение, использующее NsIContentPolicy для обучения, или какое-нибудь хорошее руководство по NsIContentPolicy?

Ответы на вопрос(1)

Решение Вопроса

но я могу дать вам минимальный пример кода:

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();

Это происходит из-за минимальной реализации политики контента, которую я использую для рассмотрения проблем с реализацией политик контента - она не делает ничего, кроме вывода всех вызовов политик контента на консоль (window.dump documentation). Очевидно, что в реальной реализации поляclassDescription , classID а такжеcontractID должно быть изменено на что-то правильное.onShutdown принадлежит к частной платформе, которую я использую: это расширение не перезапускается, поэтому необходимо зарегистрировать компонент "вручную" и также запустит этот код, чтобы удалить его, если он выключен во время сеанса браузера.

Вы также можете скачать полное расширение:testpolicy.xpi.

 19 дек. 2015 г., 01:59
пример ссылки не работает, необходимо обновить & lt; s & gt; import, & lt; / s & gt; но все же этот блок только сетевой контент, а как насчет изменения дерева dom?
 19 дек. 2015 г., 20:35
@msangel: я обновил ссылку. Приведенный здесь код является просто примером из простого загружаемого расширения - если ваше расширение основано на SDK, вы можете настроить его так, чтобы оно работало для вас, но, пожалуйста, не редактируйте сообщение. Речь идет о политиках контента, которые полезны только для блокировки сетевых запросов, модификации DOM должны происходить другими способами.
 Nok Imchen29 мая 2012 г., 06:48
Владимир, этот testpolicy.xpi - именно то, что я искал :) Большое спасибо :)

Ваш ответ на вопрос