Я прочитал 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.