我正在尝试开发Firefox插件,该插件应该为内部开发人员的工具添加新元素,例如console
和scratchpad
。
我尝试以最简单的方式执行此操作 - 通过firefox插件SDK(Jetpack),但在文档中仅提及仅向主工具栏添加元素。
是否可以在便笺簿工具栏上添加按钮?如果是,我可以在哪里找到代码示例?
感谢您的帮助!
答案 0 :(得分:2)
是的,这是可能的。我不知道SDK方法,但这里是非sdk。
使用以下代码:
var devtools = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools;
var HUDService = devtools.require("devtools/webconsole/hudservice");
var hud = HUDService.getBrowserConsole();
if (!hud) {
//browser console is not open
} else {
var btnClear = hud.chromeWindow.document.querySelector('.webconsole-clear-console-button');
var newBtn = hud.chromeWindow.document.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var props = {
class: 'devtools-toolbarbutton',
label: 'blah',
}
for (var p in props) {
newBtn.setAttribute(p, props[p]);
}
btnClear.parentNode.insertBefore(newBtn, btnClear.nextSibling);
}
此代码在" clear"之后插入一个按钮。按钮。
请注意记录消息的区域,它是html命名空间中的iframe,但它周围的东西是xul命名空间。 (我非常肯定)
答案 1 :(得分:2)
简单的方法 - 通过firefox插件SDK(Jetpack)
实际上这或多或少是“最难的方式”。 SDK使开箱即用的东西变得简单,例如在主窗口中添加工具栏按钮,或上下文菜单项等。但是当涉及到SDK不适合的东西时,就像这里的情况一样,你实际上必须编写SDK样板+低级XUL / XPCOM的东西,并且不能使用XUL叠加作为额外的奖励(因为不重新启动的附加组件不支持这些)。
这是完整的 XUL叠加插件。
install.rdf
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>my@addon</em:id>
<em:name>My Add-on</em:name>
<em:version>1</em:version>
<em:creator>Nils Maier</em:creator>
<!-- Firefox -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>30.0</em:minVersion>
<em:maxVersion>33.*</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>
chrome.manifest
content my-addon ./
overlay chrome://browser/content/devtools/scratchpad.xul chrome://my-addon/content/overlay.xul
overlay.xul
<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<commandset id="sp-commandset">
<command id="my-addon-button-command" oncommand="alert('hellow, world');"/>
</commandset>
<toolbar id="sp-toolbar">
<toolbarbutton id="my-addon-button" command="my-addon-button-command"
class="devtools-toolbarbutton" label="My Add-on button"/>
</toolbar>
</overlay>
重点是:根据需要修改scratchpad.xul
。
在SDK中,由于您无法使用叠加层,因此您必须:
nsIWindowWatcher.registerNotification
注册一个观察者(SDK曾经为此提供了一些东西,但已被弃用)chrome://browser/content/devtools/scratchpad.xul
位置收听窗口,忽略其他窗口。load
。load
编辑后,使用DOM API手动将所需的DOM元素注入其中(替换叠加层)您没有真正指定哪个控制台,浏览器控制台或每页控制台?
无论如何,你要叠加,chrome://browser/content/devtools/webconsole.xul
在SDK中,事情变得更加棘手,因为每页Web控制台实际上并不是顶级窗口:
chrome://browser/content/browser.xul
并处理控制台URI的load
事件(加载到<xul:iframe>
)。chrome://browser/content/devtools/framework/toolbox-window.xul
也是如此。