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

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


person Nok Imchen    schedule 28.05.2012    source источник


Ответы (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 документация). Очевидно, что в реальной реализации поля classDescription , classID и contractID должны быть изменены на что-то правильное. onShutdown принадлежит частной структуре, которую я использую: это расширение не требует перезапуска, поэтому ему необходимо зарегистрировать компонент «вручную», а также запустить этот код для его удаления, если он будет закрыт во время сеанса браузера.

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

person Wladimir Palant    schedule 28.05.2012
comment
Владимир, этот testpolicy.xpi именно то, что я искал :) Большое спасибо :) - person Nok Imchen; 29.05.2012
comment
пример ссылки не работает, ‹s›импорт необходимо обновить,‹/s›, но тем не менее, этот блокирует только сетевой контент, и как насчет изменения дерева dom? - person msangel; 19.12.2015
comment
@msangel: я обновил ссылку. Приведенный здесь код является просто примером простого загружаемого расширения. Если ваше расширение основано на SDK, вы можете настроить его так, чтобы оно работало на вас, но, пожалуйста, не редактируйте сообщение. Вопрос касается политик контента, которые полезны только для блокировки сетевых запросов, модификации DOM должны происходить другими способами. - person Wladimir Palant; 19.12.2015