Firefox XPCOM 组件可以跨多个页面读写页面内容吗?
设想:
一堆本地 HTML 和 javascript 文件。 “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。
我收到一个错误:
Permission denied to call method UnnamedClass.Write
首先,你的 C++ 代码真的是plugin or an XPCOM组件,可能作为一部分安装扩大?看来是后者了
如果是这样,则无法从不受信任的 JS 代码(任何网页或本地 HTML 文件)使用它。它完全可以通过特权代码使用,其中最常见的类型是扩大 code.
您在使用创建组件时解决了这个问题enablePrivilege('UniversalXPConnect')
称呼。这并不是真正推荐的,除非这不会分发给用户(因为此调用会弹出一个令人困惑的框,并且如果您设置首选项始终允许 file:// 脚本使用 XPCOM,则可能是一个安全问题,因为并非所有本地脚本页面是可信的 - 想想保存的网页)。
Your Write
由于同样的原因,调用失败 - file:// 页面不被信任使用 XPCOM 组件。如果您添加另一个,您可能可以让它工作enablePrivilege
调用与 Write 调用本身相同的函数。
根据具体情况,可能会有更好的解决方案。
如果您的文件必须被视为受信任,您可能需要将它们打包为扩展名并通过 chrome:// URL 访问它们。这使这些页面中的代码有权调用任何 XPCOM 组件,包括您的组件。
如果组件的方法可以从任何页面安全使用,或者环境受到控制并且浏览器中没有加载不受信任的页面,则可以使组件可访问内容(在莫兹拉代码举个例子,也为了nsISecurityCheckedComponent
).
哦,当您在这里没有得到好的答案时,您一定应该尝试 mozilla 新闻组/邮件列表。
[编辑回复评论] 考虑将需要调用组件的代码放在 chrome:// 脚本中。或者,您应该能够使用以下代码“祝福”您的页面具有 chrome 权限this(请注意,它的作用与您所需的相反 - 剥夺了 chrome 权限)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)