Пример за 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›imports трябва да се актуализира,‹/s›, но все пак това блокира само мрежово съдържание, а какво ще кажете за промяна на дървото на dom? - person msangel; 19.12.2015
comment
@msangel: Актуализирах връзката. Кодът тук е само пример от обикновено стартиращо разширение - ако вашето разширение е базирано на SDK, можете да го коригирате така, че да работи за вас, но моля, не редактирайте публикацията. Въпросът е относно правилата за съдържание, които са полезни само за блокиране на мрежови заявки, DOM модификациите трябва да се извършват по други начини. - person Wladimir Palant; 19.12.2015