Firefox addon 如何在引导Firefox扩展中实现XPCOM组件(nsIContentPolicy)
我有一个Firefox的自举扩展。 现在我想实现NSIContentPolicyXPCOM组件。 我编写了一个组件模块代码。 现在我想注册这个组件。 我想注册组件的原因是我想将我的组件添加到具有“内容策略”类别的Firefox addon 如何在引导Firefox扩展中实现XPCOM组件(nsIContentPolicy),firefox-addon,firefox-addon-sdk,xpcom,Firefox Addon,Firefox Addon Sdk,Xpcom,我有一个Firefox的自举扩展。 现在我想实现NSIContentPolicyXPCOM组件。 我编写了一个组件模块代码。 现在我想注册这个组件。 我想注册组件的原因是我想将我的组件添加到具有“内容策略”类别的nsCategoryManager.addCategoryEntry var {Cc, Ci, Cu} = require("chrome"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); //console.error("
nsCategoryManager.addCategoryEntry
var {Cc, Ci, Cu} = require("chrome");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
//console.error("Running interceptor");
function Interceptor()
}
Interceptor.prototype = {
classDescription: "DeferredTo HTTP requests Interceptor",
classID: "{B5B3D9A0-08FC-11E3-8253-5EF06188709B}",
contractID: "@deferredto.com/Interceptor;1",
QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy]),
shouldLoad : function dt_shouldLoad(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
console.log("dt_shouldLoad");
if (contentLocation.scheme != "http" && contentLocation.scheme != "https")
return Ci.nsIContentPolicy.ACCEPT;
let result = Ci.nsIContentPolicy.ACCEPT;
// we should check for TYPE_SUBDOCUMENT as well if we want frames.
if ((Ci.nsIContentPolicy.TYPE_DOCUMENT == aContentType) &&
SOME_REGULAR_EXPRESSION.test(aContentLocation.spec)) {
// do stuff here, possibly changing result.
}
return result;
},
shouldProcess: function ILO_shouldProcess() Ci.nsIContentPolicy.ACCEPT,
_xpcom_categories: [
{ category: "content-policy", service: true }
],
classInfo: XPCOMUtils.generateCI(
{classID: Components.ID("{B5B3D9A0-08FC-11E3-8253-5EF06188709B}"),
contractID: "@deferredto.com/Interceptor;1",
classDescription: "Interceptor implements nsIContentPolicy to block images that are not yet at screen @DeferredTo",
interfaces: [
Ci.nsIContentPolicy,
],
flags: Ci.nsIClassInfo.SINGLETON})
}
var components = [Interceptor];
var NSGetFactory = XPCOMUtils.generateNSGetFactory([Interceptor]);
问题:
- 是否可以从引导扩展注册组件
- 是否可以从无重启扩展注册组件
- 是否可以不使用NSCategoryManager.addCategoryEntry“内容策略” 组件李>
- 如何在引导扩展中注册组件或以某种方式添加 新的“内容策略”类别条目
"requirements": {
"sdk/page-mod": "sdk/page-mod",
"sdk/self": "sdk/self",
"chrome": "chrome"},
这就是我尝试导入模块的方式:
var {Cc, Ci, Cu} = require("chrome");
Cu.import("resource://deferredto/lib/interceptor.js");
我试过很多方法,但都不管用。chrome.manifest文件中的资源项不允许用于引导扩展名。组件模块文件的路径为:
resources/deferredto/lib/interceptor.js
Adblock Plus,它在运行时不重启,但不使用SDK,就像您的SDK一样。可能有一些SDK插件在运行时注册组件,但我不知道有哪些开源插件是我建议从头开始考虑的
关于ABP实现的几点意见,以及为使其与SDK一起工作应做哪些更改:
- 类别管理器可通过
获得Cc[“@mozilla.org/categorymanager;1”].getService(Ci.nsicegorymanager)
- 组件注册器应通过要求
模块中的chrome
以及components
提供components.manager.getService(Ci.nsicomponentregistrator)
- 作为Adblock Plus,您必须自己注销组件
- 不幸的是,卸载部分也有点欺骗,因为您无法同步地注销组件和类别条目,这是由于。因此,Adblock Plus使用异步方式,它只向主线程分派一个可运行的(事件,如果您愿意的话)。我不认为您可以在这里使用任何SDK,因为SDK将在任何异步代码有机会运行之前进行清理,因此您需要自己使用低级XPCOM可运行(或计时器)
- 代码将在运行时注册组件。您不能触摸
或类似的内容线束选项
(我自己也实现了一个函数,但这也不是SDK代码,需要进行调整以在SDK中运行,就像ABP一样。它也与ABP非常相似。)现在我的
nsIContentPolicy
基于SDK的组件如下所示。文件interceptor.js
:
'use strict';
var { Class } = require('sdk/core/heritage');
var xpcom = require('sdk/platform/xpcom');
var { Cc, Ci, Cu, Cm } = require('chrome');
var categoryManager = Cc["@mozilla.org/categorymanager;1"]
.getService(Ci.nsICategoryManager);
// nsIDOMNode
const TYPE_DOCUMENT_NODE = Ci.nsIDOMNode.DOCUMENT_NODE;
/// Interceptor
var contractId = "@deferredto.com/Interceptor;1";
var Interceptor = Class({
extends: xpcom.Unknown,
interfaces: [ 'nsIContentPolicy' ],
get wrappedJSObject() this,
shouldLoad : function dt_shouldLoad(contentType, contentLocation, requestOrigin, context, mimeTypeGuess, extra) {
let result = Ci.nsIContentPolicy.ACCEPT;
return result;
},
shouldProcess: function () Ci.nsIContentPolicy.ACCEPT
});
var factory = xpcom.Factory({
contract: contractId,
Component: Interceptor,
unregister: false // see https://bugzilla.mozilla.org/show_bug.cgi?id=753687
});
/// unload
var unload = require("sdk/system/unload");
unload.when(function() {
function trueUnregister() {
categoryManager.deleteCategoryEntry("content-policy", contractId, false);
try {
console.log("xpcom.isRegistered(factory)=" + xpcom.isRegistered(factory));
console.log("trueUnregister");
xpcom.unregister(factory);
console.log("xpcom.isRegistered(factory)=" + xpcom.isRegistered(factory));
} catch (ex) {
Cu.reportError(ex);
}
}
if ("dispatch" in Cu) {
console.log('"dispatch" in Cu');
Cu.dispatch(trueUnregister, trueUnregister);
} else {
console.log('"dispatch" not! in Cu');
Cu.import("resource://gre/modules/Services.jsm");
Services.tm.mainThread.dispatch(trueUnregister, 0);
}
});
//xpcom.register(factory);
var interceptor = Cc[contractId].createInstance(Ci.nsIContentPolicy);
categoryManager.deleteCategoryEntry("content-policy", contractId, false);
categoryManager.addCategoryEntry("content-policy", contractId, contractId, false, true);
您可以从sdk使用它,如下所示:
var interceptor = require("./interceptor");
最后我找到了Firefox插件SDK解决方案:。我不知道。很高兴知道。关于类别的评论,尤其是卸载部分,仍然有效。;)可能是这个新模块。我之前调查过这个问题,加载项SDK是第一个检查的地方。