Прочетох NsIContentPolicy и претърсих целия Stackoverflow за подходящ урок за прилагане на NsIContentPolicy, но всичко беше напразно . Знам, че Adblock използва NsIContentPolicy като основно оръжие. Обратното инженерство Adblock не ми помогна да разбера как да внедря NsIContentPolicy. Има ли някаква проста добавка, използваща NsIContentPolicy за обучение, или някакъв добър урок за NsIContentPolicy?
Пример за nsIContentPolicy за добавка за firefox?
Отговори (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.