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扩展......那么我恐怕我误解了一些东西,你能解释一下吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top