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に組み込むだけです。