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