Как мне преобразовать расширение, которое использует XBL, чтобы использовать пользовательский элемент? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть расширение наложения Thunderbird. Он использует XBL для изменения меню Help в строке меню Thunderbird, где он заменяет оригинальные пункты меню одним «Hello, World!»пункт меню.

Help menu in Thunderbird’s menu bar, where the original menu items have been replaced with a single

Поскольку XBL находится на выходе , я хотел бы обновить расширение для использования custom element .

В настоящее время привязка прикреплена так:

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>

Как я могу преобразовать этот код для использования пользовательского элемента?

Я искал в Интернете, но все материалы, которые я нашел ( пример ) демонстрирует, как создать пользовательский элемент и вставить в родительский элемент.

Я не хочу этого делать. Я хочу создать пользовательский элемент и затем использовать его для замены элемента, который уже существует в интерфейсе Thunderbird (в данном случае <menupopup>).

Может кто-нибудь мне помочь?

Полный код расширения доступен на GitHub .

1 Ответ

0 голосов
/ 13 октября 2019

Я решил свою собственную проблему, подключив элемент <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);
}
...