2

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

4

2 回答 2

1

Main.html 和其他窗口是否以 chrome 权限运行?如果您“正常”访问 Main.html,只需将其放在 Firefox 的地址栏上,那么它的功能就会受到限制(否则,任意网页都可以完全一样)。

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

如果您真的想允许任何网页执行您的插件所做的任何事情,您可以建立一些机制,通过该机制页面可以要求插件使用其 chrome 权限执行操作,然后将结果发送到页面。

如果您没有制作 Firefox 扩展...那么恐怕我误解了一些东西,您能解释一下吗?

于 2008-09-25T15:22:31.607 回答
1

首先,您的 C++ 代码真的是插件还是XPCOM 组件,可能作为扩展的一部分安装?好像是后者。

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

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

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

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

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

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

哦,当您在这里没有得到好的答案时,您绝对应该尝试使用 mozilla 新闻组/邮件列表。

[编辑回复评论] 考虑将需要调用组件的代码放在 chrome:// 脚本中。或者,您应该能够使用这样的代码“祝福”您的页面具有 chrome 权限请注意,它与您需要的相反 - 剥夺 chrome 权限)。

于 2008-09-28T21:44:37.690 回答