我正在尝试开发 Firefox 附加组件,它应该向内部开发人员的工具添加新元素,例如 console
和 scratchpad
。
我试图以最简单的方式做到这一点——通过 firefox addons SDK (Jetpack),但是在文档中只提到了将元素添加到主工具栏。
是否可以在便签本工具栏上添加按钮?如果是,我在哪里可以找到代码示例?
感谢您的帮助!
最佳答案
simple way possible — via firefox addons SDK (Jetpack)
这实际上或多或少是“可能的最困难的方法”。 SDK 使它支持开箱即用的东西变得简单,比如向主窗口添加工具栏按钮,或上下文菜单项等。但是当涉及到 SDK 不适合的东西时,就像这里的情况一样,你实际上必须编写 SDK 样板 + 低级 XUL/XPCOM 东西并且不能使用 XUL 覆盖作为额外的好处(因为无需重新启动的附加组件不支持这些)。
Scratchpad - 带有 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
随你便。
Scatchpad - 使用 SDK
在 SDK 中,由于您不能使用叠加层,因此您必须:
- 通过
nsIWindowWatcher.registerNotification
注册观察员(SDK 曾经为此提供一些东西,但已被弃用) - 使用适当的
chrome://browser/content/devtools/scratchpad.xul
监听窗口位置,忽略其他窗口。 - 一旦打开这样的窗口,请收听
load
. - 一次
load
ed,使用 DOM API 手动注入(inject)你想要的 DOM 元素(替换覆盖) - 确保在再次卸载窗口时正确处理事情。
- 确保在您的附加组件被禁用后自行清理(再次从任何仍打开的窗口中删除所有 UI,当然还有观察者本身)。
控制台
您没有真正指定哪个控制台、浏览器控制台或每页控制台?
无论如何,你会叠加, chrome://browser/content/devtools/webconsole.xul
在 SDK 中,事情变得更加棘手,因为每页 Web 控制台实际上并不是顶级窗口:
- 您需要注意它是否是顶级窗口(浏览器控制台)
- 注意
chrome://browser/content/browser.xul
和处理load
控制台 URI 的事件(加载到<xul:iframe>
中)。 chrome://browser/content/devtools/framework/toolbox-window.xul
也是如此当 devtools 显示在分离的窗口中时。
关于javascript - 是否可以将按钮添加到暂存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24737403/