Firefoxに再起動のメニューを追加する

FirefoxのuserChrome.js用スクリプトです。
再起動のメニュー(メインメニュー・アプリメニュー)を追加します。

RestartInMenu.uc.js

RestartInMenu.uc.js// ==UserScript==
// @name          RestartInMenu.uc.js
// @description   Restart from the menu (main menu / app menu).
// @include       main
// @charset       UTF-8
// @author        toshi (https://github.com/k08045kk)
// @license       MIT License | https://opensource.org/licenses/MIT
// @compatibility 78+
// @version       0.4
// @since         0.1 - 20210924 - 初版
// @since         0.2 - 20210926 - Thunderbird対応
// @since         0.3 - 20210926 - リファクタリング
// @since         0.4 - 20211031 - Firefox78対応
// @see           https://github.com/k08045kk/userChrome.js
// @see           https://www.bugbugnow.net/2021/09/firefox-restart-in-menu.html
// ==/UserScript==

(() => {
  // -------------------- config --------------------
  const MENU_ITEM_LABEL_NAME = 'Restart';
  // --------------------/config --------------------


  const cmd_restart = (event) => {
    // see chrome://global/content/aboutProfiles.js
    const Ci = Components.interfaces;
    const flags = Ci.nsIAppStartup.eRestart | Ci.nsIAppStartup.eAttemptQuit;
    Services.startup.quit(flags);
  };

  // File menu (Main menu)
  try {
    let filemenu = document.getElementById('menu_FileRestartItem');
    const filequit = document.getElementById('menu_FileQuitItem');
    if (filemenu == null && filequit) {
      filemenu = document.createXULElement('menuitem');
      filemenu.setAttribute('id', 'menu_FileRestartItem');
      filemenu.setAttribute('label', MENU_ITEM_LABEL_NAME);
      filemenu.setAttribute('accesskey', 'r');
      filemenu.addEventListener('command', cmd_restart);

      filequit.parentNode.insertBefore(filemenu, filequit);
    }
  } catch (e) { Components.utils.reportError(e); }

  // App menu (Hamburger menu)
  try {
    const target = document.getElementById('appMenu-popup')            // Firefox91/Thunderbird91
                || document.getElementById('appmenu-popup');           // ???
    const observer = new MutationObserver((mutationsList, observer) => {
      let appmenu = document.getElementById('appMenu-restart-button');
      const appquit = document.getElementById('appMenu-quit-button2') // Firefox91
                   || document.getElementById('appMenu-quit-button')  // Firefox78
                   || document.getElementById('appMenu-quit')         // Thunderbird??
                   || document.getElementById('appmenu-quit');        // Thunderbird91
      if (appmenu == null && appquit) {
        appmenu = document.createXULElement('toolbarbutton');
        appmenu.setAttribute('id', 'appMenu-restart-button');
        appmenu.setAttribute('class', 'subviewbutton');
        appmenu.setAttribute('label', MENU_ITEM_LABEL_NAME);
        appmenu.addEventListener('command', cmd_restart);

        appquit.parentNode.insertBefore(appmenu, appquit);

        observer.disconnect();
      }
    });
    observer.observe(target, {attributes:true});
  } catch (e) { Components.utils.reportError(e); }
})();