FirefoxのファイルメニューにRestartを追加するuserChrome.js

http://amb.vis.ne.jp/mozilla/?p=50スクリプトは、
終了確認ダイアログを表示しない。
sessionstoreがcurrentWindowのみしか機能しない。

そこでmulti-windowでもsessionstoreが正常に機能するように改良してみました。

改良後スクリプト

/**
 * A user script for userChrome.js extension.
 * @name    Restart Firefox
 * @description    Add 'Restart' command to 'File' menu in Firefox menubar.
 * @compatibility    Firefox 1.5 - 3.0
 * @author    Gomita
 * @version    2007.02.14
 * @permalink    http://amb.vis.ne.jp/mozilla/?p=50
 */

// 2007.02.14 modified by http://d.hatena.ne.jp/dgdg/20070214/1171472940
//   - add "R" accesskey
//   - supporting multi-window

(function()
{
    // create 'Restart' menuitem
    var menuitem = document.createElement("menuitem");
    menuitem.setAttribute("label", "Restart");
    menuitem.setAttribute("accesskey", "R");
    
/* original
    menuitem.addEventListener("command", function()
    {
        const APP_START = Components.classes['@mozilla.org/toolkit/app-startup;1'].getService(Components.interfaces.nsIAppStartup);
        APP_START.quit(APP_START.eRestart | APP_START.eAttemptQuit);
    }, false);
*/
    menuitem.addEventListener("command", restartApp, false);

    // insert 'Restart' menuitem before 'File' > 'Exit'
    document.getElementById("menu_FilePopup").insertBefore(menuitem, document.getElementById("menu_FileQuitItem"));



//restartApp find here:
//  - chrome://mozapps/content/extensions/extensions.js
//  - %FirefoxApplicationDir%/chrome/toolkit.jar/content/mozapps/extensions/extensions.js
function restartApp() {
  const nsIAppStartup = Components.interfaces.nsIAppStartup;

  // Notify all windows that an application quit has been requested.
  var os = Components.classes["@mozilla.org/observer-service;1"]
                     .getService(Components.interfaces.nsIObserverService);
  var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
                             .createInstance(Components.interfaces.nsISupportsPRBool);
  os.notifyObservers(cancelQuit, "quit-application-requested", null);

  // Something aborted the quit process. 
  if (cancelQuit.data)
    return;

  // Notify all windows that an application quit has been granted.
  os.notifyObservers(null, "quit-application-granted", null);

  // Enumerate all windows and call shutdown handlers
  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var windows = wm.getEnumerator(null);
  while (windows.hasMoreElements()) {
    var win = windows.getNext();
    if (("tryToClose" in win) && !win.tryToClose())
      return;
  }
  Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(nsIAppStartup)
            .quit(nsIAppStartup.eRestart | nsIAppStartup.eAttemptQuit);
}

})();

説明など

改良後のスクリプトにはrestartApp()が定義されています。
この関数はFirefoxにAdd-onをインストールした時に表示されるリスタートボタンに使われていたものです。
chromeURL(chrome://mozapps/content/extensions/extensions.js)をFirefoxで開くとrestartApp()が定義されているjsファイルをダウンロードすることが出来ます。

この関数を探すのに、DOM Inspectorを使用しました。



FirefoxのtoolメニューからAdd-onsを起動します。
同じくtoolメニューからDOM Inspectorを起動します。
DOM InspectorのFileメニュー > Inspect a Window でAdd-onsを指定します。
Ctrl + F で restart と検索します。

restartApp() なるものを見つけることが出来ると思います。
続いて DOM Inspectorのロケーションバーをみると

chrome://mozapps/content/extensions/extensions.xul

となっているはずです。
このchromeURLの実体がどこにあるかというと、

Firefoxのインストールディレクトリ/chrome/toolkit.jar

に含まれています。
chromeURLは同ディレクトリにあるtoolkit.manifestによって定義されています。
toolkit.jarを解凍してXULファイル

mozapps/extensions/extensions.xul

をエディタで見てみると以下のような部分を見つけることが出来ると思います。

  <script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/>
  <script type="application/x-javascript" src="chrome://global/content/contentAreaUtils.js"/>
  <script type="application/x-javascript" src="chrome://mozapps/content/extensions/extensions.js"/>
  <script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/>
  <script type="application/x-javascript" src="chrome://global/content/nsTransferable.js"/>

この中で、同じディレクトリにある

chrome://mozapps/content/extensions/extensions.js

を見てみます。
探していたrestartApp()を発見できました。

後はこれをuserChrome.jsに組み込むだけです。