我的nsIContentPolicy Firefox/IceWeasel扩展XPCOMponent实现中缺少了什么来调用shouldLoad? 简言之

我的nsIContentPolicy Firefox/IceWeasel扩展XPCOMponent实现中缺少了什么来调用shouldLoad? 简言之,firefox,xpcom,Firefox,Xpcom,根据下面详述的代码,为什么不调用shouldLoad函数 较长版本 我的目标 我正在尝试构建一个Firefox/Iceweasel扩展,它将取消/重定向某些url请求 背景 根据我在web上看到的情况,实现这一点的一种方法(如果我想拦截每个请求,而不仅仅是顶级文档)是制作一个实现nsIContentPolicy接口的XPCOM组件,并在扩展中注册该组件,并让shoulLoad函数检查请求的url,并在适当时拒绝 问题 我已经尽最大努力实现了一个组件,并将其与扩展集成在一起。组件的工作方式似乎是在

根据下面详述的代码,为什么不调用shouldLoad函数

较长版本 我的目标 我正在尝试构建一个Firefox/Iceweasel扩展,它将取消/重定向某些url请求

背景 根据我在web上看到的情况,实现这一点的一种方法(如果我想拦截每个请求,而不仅仅是顶级文档)是制作一个实现nsIContentPolicy接口的XPCOM组件,并在扩展中注册该组件,并让shoulLoad函数检查请求的url,并在适当时拒绝

问题 我已经尽最大努力实现了一个组件,并将其与扩展集成在一起。组件的工作方式似乎是在compreg.dat中注册,但是-据我所知,shouldLoad函数没有被调用

细节 环境 我在DebianLinux上开发,使用的是与FireFox 3.5.16相对应的IceWeasel版本

延伸 我的扩展基于上给出的示例扩展 本质上,它所做的只是添加一个菜单项,打开一个类似警告的对话框,说“你好,世界”。它有一个onLoad注册,可以触发并发出警告,说“onLoad Reporting!”。警报每次都会毫无问题地发出

参考文献 我已经安装了扩展重定向器,似乎是按照同样的原理运行的, 而且它是有效的(因此这很可能是我的代码中的错误,而不是环境不好)

组成部分 我的组件实现基于我在internet上找到的各种来源。 我把它放在目录{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]);
地位 冰鼬似乎能识别出这种成分。如果我删除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 Component,@abc.def.com/policycomp;1 content-policy,@mozilla.org/no-data-protocol-content-policy;1,@mozilla.org/no-data-protocol-content-policy;1 ... ... @mozilla.org/embedded/browser/content-policy;1,{f66bc334-1dd1-11b2-bab2-90e04fe15c19} 内容策略,@mozilla.org/data-document-content-policy;1,@mozilla.org/data-document-content-policy;1. 内容策略,我的QWERTY nsIContentPolicy XPCOM组件,@abc.def.com/policycomp;1. 内容策略,@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

  • 我是否需要以更明确的方式将组件注册为对扩展有效,如果需要,如何注册


  • 提前谢谢

    看起来您没有验证您的
    shouldLoad
    方法是否真的没有被调用。我建议使用查看组件中真正发生了什么。似乎更可能是调用了它,但它抛出了一个异常,如“aContext.loadURI不是函数”。原因是
    TYPE_DOCUMENT
    调用的
    aContext
    是一个
    HTMLDocument
    对象,它没有
    loadURI
    方法。您可能需要调用
    aContext.defaultView.location.replace()
    。但从内容策略执行此操作将是一个安全漏洞(事实上,从内容策略执行任何可能导致网页脚本运行的操作都将是一个安全漏洞)。如果你看一下,你会发现它附带了大警告

    因此,像这样的操作需要延迟,以确保它在引擎处于一致状态时发生。例如,你可以做:

    aContext.defaultView.setTimeout("window.location.replace('http://www.stroustrup.com/')", 0);
    
    怎么了?:)

    除了上面提到的,您可能不应该定义自定义的
    \u xpcom\u工厂
    函数。内容策略始终作为服务使用,这意味着它们自动成为单例。当然,您自己访问组件的代码也应该使用
    getService()

    我需要在chrome.manifest中添加一些内容吗?还是只针对FF 4+

    是的,对于FF4+。比如:

    component {6ffd2f60-3784-11e1-b86c-0800200c9a66} components/PolicyComponent.js
    contract @abc.def.com/policycomp;1 {6ffd2f60-3784-11e1-b86c-0800200c9a66}
    category content-policy @abc.def.com/policycomp;1 @abc.def.com/policycomp;1
    
    我是否需要进一步实例化组件/服务?比如说,onLoad钩子中的overlay.js

    不,这是由内置内容策略组件自动执行的

    我是否需要以更明确的方式将组件注册为对扩展有效,如果需要,如何注册


    不知道你的意思。

    你实际上在使用Firefox 3.5(别管名字了)?使用一款在不久前已经过时的浏览器听起来是一个非常糟糕的主意。这是因为我使用的是非常稳定的Debian版本(现在不记得名字了),所以它有一个旧的和过时的(但稳定的!)FF版本。(在冰鼬化身中)。我想这就是原因。也许我可以升级一下。。隐马尔可夫模型。。。老实说,自从我正常运行Chrome以来,我并没有考虑过这一点,但现在我正在为FF开发,我在我的默认平台上使用了closes功能。这个想法很有趣!我一定会尝试一下,然后回来。你的反馈确实是一个正确方向的暗示。使用dump,我可以看到函数确实被调用了。问题似乎是我的组件变量名没有大写:所以我调用了一个未定义的var来获取两个位置的比较常量(Ci.nsicontpolicy.TYPE_DOCUMENT等)。使用专有的var名称,它可以工作。很抱歉发帖后有这样的小错误。然而,似乎