【发布时间】:2012-02-03 05:06:13
【问题描述】:
总之
为什么,根据下面详述的代码,shouldLoad 函数没有被调用?
加长版
我的目标
我正在尝试构建一个将取消/重定向某些 url 请求的 Firefox/Iceweasel 扩展。
背景
根据我在网上看到的情况,一种方法(如果我想拦截每个请求而不仅仅是顶部文档)是制作一个实现 nsIContentPolicy 接口的 XPCOM 组件,并将该组件注册到扩展,并让 shouldLoad 函数检查请求的 url 并在适当的时候拒绝。
问题
我已尽我最大的努力实现了一个组件,并将其与我的扩展程序集成。该组件似乎在它在 compreg.dat 等中注册的意义上工作,但据我所知,shouldLoad 函数没有被调用。
详情
环境我正在使用与 FireFox 3.5.16 对应的 IceWeasel 版本在 Debian Linux 上进行开发。
延期我的扩展基于一个示例扩展 http://kb.mozillazine.org/Getting_started_with_extension_development#reg-em 本质上,它所做的只是添加一个菜单项,该菜单项打开一个类似警报的对话框,说你好世界。它有一个 onLoad 注册,会触发并警告说“onLoad Reporting!”。警报每次都会毫无问题地触发。
参考我已经安装了扩展重定向器,看起来运行原理相同, https://addons.mozilla.org/en-US/firefox/addon/redirector/ 它可以工作(所以这很可能是我的代码中的一个错误,而不是环境不好)。
零件我的组件实现基于我在互联网上找到的各种资源。 我已经把它放在目录{pathtoextension}/helloworld/components/PolicyComponent.js的一个文件里了,它的代码如下:
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
const CI = Components.interfaces, CC = Components.classes, CR = Components.results;
var componentobj = null;
function PolicyComponent()
{
// this.wrappedJSObject = this;
}
PolicyComponent.prototype = {
classDescription: "My QWERTY nsIContentPolicy XPCOM Component",
classID: Components.ID("{6ffd2f60-3784-11e1-b86c-0800200c9a66}"),
contractID: "@abc.def.com/policycomp;1",
QueryInterface: XPCOMUtils.generateQI([CI.nsIContentPolicy]),
testFunction: function() { return "Your component is not entirely broken!"; },
_xpcom_categories: [{
category: "content-policy"
}],
_xpcom_factory :
{
createInstance: function(outer, iid)
{
if (outer)
{ throw CR.NS_ERROR_NO_AGGREGATION;}
if (componentobj == null)
{
componentobj = new PolicyComponent();
}
else {}
return componentobj.QueryInterface(iid);
}
},
shouldLoad: function(contentType, contentLocation, requestOrigin, aContext, mimeTypeGuess, extra)
{
if (contentType != Ci.nsIContentPolicy.TYPE_DOCUMENT) {
return Ci.nsIContentPolicy.ACCEPT;
}
if(-1 != contentLocation.spec.search("abc"))
{
aContext.loadURI("http://www.stroustrup.com/", requestOrigin, null);
return Ci.nsIContentPolicy.REJECT_REQUEST;
}
return CI.nsIContentPolicy.ACCEPT;
},
shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) {
return CI.nsIContentPolicy.ACCEPT;
}
};
var components = [PolicyComponent];
if (XPCOMUtils.generateNSGetFactory)
var NSGetFactory = XPCOMUtils.generateNSGetFactory([PolicyComponent]);
else
var NSGetModule = XPCOMUtils.generateNSGetModule([PolicyComponent]);
状态
该组件似乎已被 IceWeasel 识别。如果我删除 compreg.dat 和 xpti.dat 并重新启动 IceWeasel,compreg.dat 中内容策略的 grep 会给出以下结果:
... @mozilla.org/embedding/browser/content-policy;1,{f66bc334-1dd1-11b2-bab2-90e04fe15c19} content-policy,@mozilla.org/data-document-content-policy;1,@mozilla.org/data-document-content-policy;1 content-policy,My QWERTY nsIContentPolicy XPCOM 组件,@abc.def.com/policycomp;1 content-policy,@mozilla.org/no-data-protocol-content-policy;1,@mozilla.org/no-data-protocol-content-policy;1 ...所以看起来该组件至少有一些正确的地方。 但是,我仍然可以访问 url 中带有“abc”的网页(这让人相信 shouldLoad 函数没有被调用)。
更多信息我没有在 chrome.manifest 文件中添加任何关于扩展的内容。我相信在 FF/IW 的 3.5.x 版本中我不需要这样做。
问题
怎么了? :)
我需要向 chrome.manifest 添加一些内容吗?还是只适用于 FF 4+?
我是否需要以某种方式进一步实例化组件/服务?比如 onLoad 钩子中的 overlay.js?
我是否需要以更明确的方式将组件注册为对扩展有效,如果需要,如何?
提前致谢!
【问题讨论】:
-
您实际上是在使用 Firefox 3.5(不管名字)?使用不久前生命终结的浏览器听起来是个非常糟糕的主意。
-
这是因为我使用的是非常稳定的 Debian 版本(现在不记得名字了),所以它有一个旧的和过时的(但稳定的!)版本的 FF。 (在 Iceweasel 的化身中)。嗯,我认为这就是原因。也许我可以升级它......嗯......老实说,自从我通常运行 Chrome 以来,我并没有考虑太多,但现在我正在为 FF 开发,我在我的默认平台上使用了 closes 的东西。