好的,对于任何有一点 SDK 经验的人来说,这个答案应该是非常明显的。我意识到我可以使用panel https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/panel。在我看来,“面板”这个名字在表达这个想法时并不像“对话框”那么清晰,而且我已经习惯了使用带有小部件的面板,以至于我没有想到我可以独立使用它!
Edit
不幸的是,根据错误 595040 https://bugzilla.mozilla.org/show_bug.cgi?id=595040,这些对话框不是持久的,这意味着如果面板失去焦点,“对话框”就会消失...所以面板看起来毕竟不是合适的候选者...:(
Edit 2
从那时起,我就继续前进,一切工作都令我满意sdk/window/utils
and openDialog
在其返回的窗口上我添加一个负载侦听器,然后调用tabs.activeTab.on('ready',
然后设置tabs.activeTab.url
到我的附加本地 HTML 文件,这样ready
事件将获得一个选项卡,我可以将工作人员附加到该选项卡。我认为 chrome privs 仍然存在问题,但至少主要通信是使用 SDK 进程。
更新至编辑2:
按请求提供的代码示例:
var data = require('sdk/self').data,
tabs = require('sdk/tabs');
var win = require('sdk/window/utils').openDialog({
// No "url" supplied here in this case as we add it below (in order to have a ready listener in place before load which can give us access to the tab worker)
// For more, see https://developer.mozilla.org/en-US/docs/Web/API/window.open#Position_and_size_features
features: Object.keys({
chrome: true, // Needed for centerscreen per docs
centerscreen: true, // Doesn't seem to be working for some reason (even though it does work when calling via XPCOM)
resizable: true,
scrollbars: true
}).join() + ',width=850,height=650',
name: "My window name"
// parent:
// args:
});
win.addEventListener('load', function () {
tabs.activeTab.on('ready', function (tab) {
var worker = tab.attach({
contentScriptFile: ....
// ...
});
// Use worker.port.on, worker.port.emit, etc...
});
tabs.activeTab.url = data.url('myHTMLFile.html');
});