可以在暂存器上添加按钮吗?

时间:2014-07-14 13:15:23

标签: javascript firefox firefox-addon firefox-addon-sdk

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

我尝试以最简单的方式执行此操作 - 通过firefox插件SDK(Jetpack),但在文档中仅提及仅向主工具栏添加元素。

是否可以在便笺簿工具栏上添加按钮?如果是,我可以在哪里找到代码示例?

感谢您的帮助!

2 个答案:

答案 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叠加作为额外的奖励(因为不重新启动的附加组件不支持这些)。

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中,由于您无法使用叠加层,因此您必须:

  1. 通过nsIWindowWatcher.registerNotification注册一个观察者(SDK曾经为此提供了一些东西,但已被弃用)
  2. 使用正确的chrome://browser/content/devtools/scratchpad.xul位置收听窗口,忽略其他窗口。
  3. 打开此窗口后,请将其收听load
  4. load编辑后,使用DOM API手动将所需的DOM元素注入其中(替换叠加层)
  5. 确保在再次卸载窗口时正确处理。
  6. 确保在禁用加载项后自行清理(再次从任何仍然打开的窗口移除任何UI,当然还有观察者本身)。
  7. 控制台

    您没有真正指定哪个控制台,浏览器控制台或每页控制台?

    无论如何,你要叠加,chrome://browser/content/devtools/webconsole.xul

    在SDK中,事情变得更加棘手,因为每页Web控制台实际上并不是顶级窗口:

    • 您需要注意它是顶级窗口(浏览器控制台)
    • 关注chrome://browser/content/browser.xul并处理控制台URI的load事件(加载到<xul:iframe>)。
    • ,当devtools显示在分离的窗口中时,chrome://browser/content/devtools/framework/toolbox-window.xul也是如此。