Firefox XPCOM组件-调用方法UnnamedClass的权限被拒绝

Firefox XPCOM组件-调用方法UnnamedClass的权限被拒绝,firefox,xpcom,firefox-3,Firefox,Xpcom,Firefox 3,firefox XPCOM组件能否跨多个页面读取和写入页面内容 情景: 一组本地HTML和javascript文件。“Main.html”文件打开一个窗口“pluginWindow”,并使用以下命令创建插件: netscape.security.privilegmanager.enablePrivilege('UniversalXPConnect') var obj=Components.classes[cid].createInstance() plugin=obj.QueryInterfa

firefox XPCOM组件能否跨多个页面读取和写入页面内容

情景: 一组本地HTML和javascript文件。“Main.html”文件打开一个窗口“pluginWindow”,并使用以下命令创建插件:


netscape.security.privilegmanager.enablePrivilege('UniversalXPConnect')
var obj=Components.classes[cid].createInstance()
plugin=obj.QueryInterface(Components.interfaces.IPlugin)
plugin.addObserver(handleEvent);

有3种方法的插件

IPlugin.Read
-从插件读取数据
IPlugin.Write
-将数据写入插件
IPlugin.addObserver
-添加用于读取的回调处理程序。

然后,“Main.html”调用pluginWindow并尝试调用plugin方法Write

我收到一个错误:


调用方法UnnamedClass的权限被拒绝。Write

Main.html和其他窗口是否以chrome权限运行? 如果您“正常”访问Main.html,只需将其放在Firefox的位置栏上,那么它的功能将受到限制(否则,任意网页也可以执行相同的功能)

如果您正在创建firefox插件,请将代码放置在XUL覆盖中

如果你真的想让任何网页做你的插件所做的任何事情,你可以建立一些机制,通过这个机制,网页可以要求插件使用chrome权限进行操作,然后将结果发送到页面


如果你不做Firefox扩展…那么我恐怕误解了一些东西,你能解释得更多吗?

< P>首先,你的C++代码真的是一个或一个,可能是作为一部分的一部分安装的吗?听起来是晚一点

如果是这样的话,它不能从不可信的JS代码中使用——任何网页或本地HTML文件。它完全可以从特权代码中使用,特权代码是最常见的类型

使用
enablePrivilege('UniversalXPConnect')
调用创建组件时,您正在解决这个问题。不建议这样做,除非不会将其分发给用户(因为此调用弹出一个令人困惑的框,并且如果您将首选项设置为始终允许file://scripts使用XPCOM,则这可能是一个安全问题,因为并非所有本地页都是可信的-请考虑保存的网页)

由于相同的原因,
Write
调用失败-不信任file://页面使用XPCOM组件。如果您在与Write调用本身相同的函数中添加另一个
enablePrivilege
调用,则可能可以让它工作

根据情况,可能有更好的解决方案

如果您的文件必须被视为受信任的文件,您可能希望将其打包为扩展名,并通过chrome://URL访问它们。这使这些页面中的代码有权调用任何XPCOM组件,包括您的组件

如果组件的方法可以从任何页面安全使用,或者如果环境受到控制,并且浏览器中没有加载不受信任的页面,则可以使组件可访问内容(例如,在中搜索nsSidebar,也可以搜索
nsSecurityCheckedComponent

哦,当你在这里没有得到好的答案时,你应该试试mozilla新闻组/邮件列表


[编辑回复评论]考虑将需要调用组件的代码放入Chrome://Script中。或者,您应该能够使用类似这样的代码使用chrome权限“祝福”您的页面(注意,这样做与您需要的相反-取消chrome权限)。

您确定要标记此“c++”吗?也许“Javascript”更适合。。。就实际问题而言,对不起,我不知道:(我把它标记为C++,因为这是一个C++插件,希望答案会面向C++解决方案。MIN .HTML是否使用Chrome特权运行:不,我不确定你把我的代码放在XUL覆盖中的意思。代码是本地C++。In。HTML创建它。现在研究XUL覆盖。谢谢!你是正确的。C++代码实际上是XPCOM组件。这些页面是从自定义协议返回的,是的,它们总是安全的。在从协议处理程序返回的页面的上下文中,组件是安全的。(回答正文中的回答。评论仅限于300个字符…)