我正在开发一个Firefox (SDK)插件,在某个时候,它需要打开一个内部页面(所以是resource://<addon_id>/data/path/to/some_page.html),并且仍然能够保持与该插件通信的能力。
以下是我到目前为止所采用的策略,但都失败了。
open打开一个新的选项卡,并希望,因为它是一个内部页面,self.port在页面的上下文中对脚本是可用的,它们可以侦听和发出消息。没有用- self根本没有用。sdk/tabs.open打开一个新选项卡,并注入一个内容脚本。self这一次是可用的,但是没有消息发送或接收到该插件。这似乎是某种安全措施。有趣的是,发送或接收消息的失败是无声的,因此没有将消息转储到控制台。sdk/tabs.open打开一个新选项卡,直接访问选项卡的(DOM) window对象,并通过window.postMessage API发送/接收消息。这似乎需要调用getBrowserForTab,然后访问contentWindow.wrappedJSObject。但是,在getBrowserForTab .open调用的onOpened处理程序中调用sdk/tabs返回undefined。我卡住了。
使用面板实现这一点似乎要容易得多,但是遗憾的是,这个策略对我来说是不可用的,因为页面需要是非模型的。如何才能做到这一点?
发布于 2015-07-15 18:07:09
使用sdk/tbro.open打开一个新的选项卡,并注入一个内容脚本。self这一次是可用的,但是没有消息发送或接收到该插件。这似乎是某种安全措施。有趣的是,发送或接收消息的失败是无声的,因此没有将消息转储到控制台。
这个方法应该有效,你能提供一些代码和Firefox版本/ jpm版本等等吗?您的代码应该如下所示:
require("sdk/tabs").open({
url: "./page.html",
onReady(tab) {
let worker = tab.attach({
contentScriptFile: "./content.js"
});
// send and received stuff using `worker.port`
}
});您也可以使用page-mod实现该功能:
const { data: { url } } = require("sdk/self");
require("sdk/page-mod").PageMod({
include: url("./page.html"),
contentScriptFile: "./content.js",
onAttach(worker) {
// send and received stuff using `worker.port`
}
});
// if you want to open the page in a tab immediately
require("sdk/tabs").open("./page.html");使用page-mod的主要优点是,即使页面没有被加载项打开(因此,如果用户书签URL或在选项卡中手动输入URL等),它也能工作。
我尝试了这两个版本,并且在content.js中同时使用了self.port.on和self.port.emit,它就像预期的那样工作--只是弹出一条文本消息。
发布于 2015-07-15 17:00:53
只需将资源url类型加载到浏览器,它就会加载。要沟通,你可以做contentWindow.wrappedJSObject,但尝试使用消息,它更好。我个人使用观察员服务。您甚至可以使用这种方法将您的addon页面点击到您的addon范围:https://gist.github.com/yajd/17ee5b1b98cb717c8429不要按照面板的方式,html页面是我所做的最好的方法。https://github.com/Noitidart/l10n/tree/xhtml-xul实际上使用xhtml,这样您就可以将它本地化。
https://stackoverflow.com/questions/31428509
复制相似问题