这不是您可以使用可用的附加组件 SDK API 完成的事情,这是有充分理由的 - 附加组件不应不必要地浪费屏幕空间,而添加工具栏就是这样。您可以通过使用低级模块并直接访问浏览器的 XUL 来实现此目标。像这样的东西应该可以工作(未经测试的代码和非常hacky):
var widgetID = "foobar";
var buttonID = "widget:" + require("self").id + "-" + widgetID;
var toolbarName = "My Extension Toolbar";
require("widget").Widget({
id: widgetID,
...
});
if (firstRun)
{
var winUtils = require("window-utils");
for (var window in winUtils.browserWindowIterator())
{
var toolbox = window.gNavToolbox;
if (toolbox)
{
// Does the button exist already?
var button = toolbox.ownerDocument.getElementById(buttonID);
if (button && button.parentNode.getAttribute("toolbarname") == toolbarName)
continue; // Button already in the right toolbar
else if (button)
{
// Remove button from its current location
var toolbar = button.parentNode;
toolbar.removeChild(button);
// Make sure this change is persisted
toolbar.setAttribute("currentset", toolbar.currentSet);
toolbar.ownerDocument.persist(toolbar.id, "currentset");
}
var toolbar = toolbox.appendCustomToolbar("My Extension Toolbar", buttonID);
toolbar.currentSet = toolbar.getAttribute("currentset");
toolbar.ownerDocument.persist(toolbar.id, "currentset");
// Send change notification, the widget needs reinitializing
var event = toolbox.ownerDocument.createEvent("Events");
event.initEvent("customizationchange", true, true);
toolbox.dispatchEvent(event);
}
}
}
请注意未定义的firstRun
变量 - 您只想执行一次,否则您将恢复用户选择将您的小部件移动到其他位置(您可以通过simple-prefs
模块或类似的方式存储标志)。另请注意,buttonID
计算使用addon-kit/lib/widget.js
SDK 中文件的内部详细信息 - 工具栏按钮 ID 的计算方式可能会在未来的 SDK 版本中更改,但我认为这是获取使用 SDK 创建的小部件的唯一方法。当然,代码的其他部分也有很多内部结构。
文档:window-utils
模块(browserWindowIterator
未记录)<xul:toolbox>
,,,<xul:toolbar>
。