ツールバーボタンとボタン右クリック時のメニュー追加

// ツールバーボタン作成
const { Services } = ChromeUtils.import('resource://gre/modules/Services.jsm');
const uri = Services.io.newURI('data:text/css;charset=utf-8,' + encodeURIComponent(
`
#MyToolbarButton {
  list-style-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><circle fill="context-fill" cx="8" cy="8" r="6"/></svg>');
}
`
), null, null);
const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
 
const { CustomizableUI } = ChromeUtils.import('resource:///modules/CustomizableUI.jsm');
CustomizableUI.createWidget({
  id: 'MyToolbarButton',
  defaultArea: CustomizableUI.AREA_NAVBAR,
  label: 'テストボタン',
  tooltiptext: 'テストボタン',
  onCommand(event) {
    event.target.ownerGlobal.alert('ボタン テスト');
  },
});
 
// ツールバーのコンテキストメニュー追加
const ToolbarContextMenu = {
  handleEvent(event) {
    const popup = event.target;
    switch (event.type) {
      case 'popupshowing': {
        const trigger = popup.triggerNode;
        const node = popup.ownerDocument.getElementById('MyToolbarButton');
        if (popup.id === 'toolbar-context-menu' && node && node.contains(trigger)) {
          popup.addEventListener('popuphidden', this);
          this.build(popup);
        }
        break;
      }
      case 'popuphidden': {
        if (popup.id === 'toolbar-context-menu') {
          popup.removeEventListener('popuphidden', this);
          this.clear(popup);
        }
        break;
      }
    }
  },
 
  build(popup) {
    const window = popup.ownerGlobal;
    const df = window.MozXULElement.parseXULToFragment(
`
<menuitem id="MyToolbarButton_test" label="テスト"
  oncommand="window.alert('コンテキスト テスト');"/>
<menuseparator id="MyToolbarButton_sep"/>
`
    );
    popup.firstElementChild.before(df);
  },
 
  clear(popup) {
    const elements = popup.querySelectorAll('*[id^=MyToolbarButton_]');
    for (const e of elements) e.remove();
  },
};
document.addEventListener('popupshowing', ToolbarContextMenu); 

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2021年09月02日 10:25