0

オーバーレイ Thunderbird 拡張機能があります。XBL を使用して Thunderbird のメニュー バーのヘルプメニューを変更し、元のメニュー項目を単一の「Hello, World!」に置き換えます。メニュー項目。

元のメニュー項目が単一のメニュー項目に置き換えられた、Thunderbird のメニュー バーのヘルプ メニュー

XBL がリリースされつつあるのでカスタム要素を使用するように拡張機能を更新したいと考えています。

現在、バインディングは次のようにアタッチされています。

bindings.css

menu#helpMenu {
  -moz-binding: url("./test.xml#helpMenu");
}

test.xml

<?xml version="1.0"?>

<bindings
  xmlns="http://www.mozilla.org/xbl"
  xmlns:xbl="http://www.mozilla.org/xbl"
  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
>
  <!-- Original helpMenu implementation found in omi.ja/chrome/messenger/content/messenger/mailWindowOverlay.xul -->
  <binding id="helpMenu">
    <content>
      <xul:menupopup>
        <xul:menuitem
          label="Hello, World!"
          oncommand="alert('Hello, World!')"
        />
      </xul:menupopup>

      <children />
    </content>
  </binding>
</bindings>

このコードをカスタム要素を使用するように変換するにはどうすればよいですか?

オンラインで検索しましたが、見つけたすべての資料 ( example ) は、カスタム要素を作成して親に挿入する方法を示しています。

私はこれをしたくありません。カスタム要素を作成し、それを使用して、Thunderbird のインターフェイスに既に存在する要素 (この場合は) を置き換え<menupopup>たいと考えています。

誰でも私を助けることができますか?

拡張機能の完全なコードはGitHubで入手できます。

4

1 に答える 1

0

<menupopup>XULファイルの要素にフックし、その中にカスタム要素をネストすることで、私自身の問題を解決しました。次に、JavaScript を使用して不要なメニュー要素を削除しました。

これが最善の解決策かどうかはわかりませんが、必要なことは実行します。しかし、もっと良い方法があれば、私はまだ聞きたいと思っています。

test.xul

<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script>
    const popup = document.getElementById('menu_HelpPopup');
    const separators = popup.querySelectorAll('menuseparator');
    const items = popup.querySelectorAll('menuitem:not(#test)');
    [...items, ...separators].forEach((item) => { item.parentNode.removeChild(item) });
  </script>
  <script src="test.js"></script>

  <menupopup id="menu_HelpPopup">
    <help-menu />
  </menupopup>
</overlay>

test.js

"use strict";

// This is loaded into all XUL windows.
// Wrap in a block to prevent leaking to window scope.
{
  class MozHelpMenu extends MozXULElement {
    connectedCallback() {
      this.appendChild(MozXULElement.parseXULToFragment(`
        <menuitem id="test" label="Hello, World!" oncommand="alert('Hello, World!')" />
      `));
    }
  }

  customElements.define('help-menu', MozHelpMenu);
}
于 2019-10-13T15:25:14.077 に答える