我正在尝试开发 Firefox 插件,它应该向内部开发人员的工具添加新元素,例如 consolescratchpad

我试图以最简单的方式做到这一点——通过 firefox 插件 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 并处理控制台 URI 的 load 事件(加载到 <xul:iframe> 中)。
  • chrome://browser/content/devtools/framework/toolbox-window.xul 相同,当 devtools 显示在分离窗口中时。
  • 关于javascript - 是否可以将按钮添加到便笺簿?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24737403/

    10-12 14:47