Firefox XPCOM组件 - 拒绝调用方法UnnamedClass的权限
题
firefox XPCOM组件可以跨多个页面读写页面内容吗?
方案:
一堆本地HTML和JavaScript文件。 A“Main.html”文件打开一个窗口“pluginWindow”,并使用:
创建一个插件
<代码>
netscape.security.PrivilegeManager.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并尝试调用插件方法Write。
我收到错误:
拒绝调用方法UnnamedClass.Write
解决方案
首先,您的C ++代码是否真的是插件或 XPCOM组件,可能作为扩展程序?听起来像是晚些时候。
如果是这样,它不可用于不受信任的JS代码 - 任何网页或本地HTML文件。它可以从特权代码中完全使用,其中最常见的类型是扩展名代码。
使用 enablePrivilege('UniversalXPConnect')
调用创建组件时,您正在解决此问题。这不是真的推荐,除非这不会分发给用户(因为这个调用会弹出一个令人困惑的框,如果你设置一个首选项以始终允许file://脚本使用XPCOM,那么它可能是一个安全问题,因为并非所有本地页面是可信的 - 想想保存的网页。
您的 Write
调用失败的原因相同 - file://不信任使用XPCOM组件的页面。如果您在与Write调用本身相同的函数中添加另一个 enablePrivilege
调用,则可能可以使其工作。
根据具体情况,可能会有更好的解决方案。
如果您的文件必须被视为受信任,您可能希望将它们打包为扩展程序,并通过chrome:// URL访问它们。这使得这些页面中的代码可以调用任何XPCOM组件,包括你的组件。
如果组件的方法可以安全地从任何页面使用,或者如果环境受到控制并且浏览器中没有加载不受信任的页面,则可以使组件可以访问内容(在 mozilla代码示例以及 nsISecurityCheckedComponent
)。
哦,当你在这里没有得到好的答案时,你一定要试试mozilla新闻组/邮件列表。
[编辑回复评论]考虑将需要调用组件的代码放在chrome://脚本中。或者,你应该能够“祝福”。使用Chrome权限的页面使用此(请注意,它与您需要的相反 - 剥离了chrome特权)。
其他提示
Main.html和其他窗口是否使用chrome权限运行? 如果您正常访问Main.html,只需将其放在Firefox的位置栏上,那么它将对它的功能有所限制(否则,任意网页都可以完全相同)。
如果要创建firefox插件,请将代码放在XUL叠加层中。
如果您真的想允许任何网页执行您的插件所做的任何事情,您可以建立一些机制,通过页面可以让插件使用其chrome权限执行操作,然后将结果发送到页面
如果你没有制作firefox扩展......那么我恐怕我误解了一些东西,你能解释一下吗?