diff -r 000000000000 -r 6474c204b198 tools/performance/startup/quit.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/performance/startup/quit.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,120 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + From mozilla/toolkit/content + These files did not have a license +*/ + +function quitHook() +{ + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://" + location.host + "/server/shutdown", true); + xhr.onreadystatechange = function (event) + { + if (xhr.readyState == 4) + goQuitApplication(); + }; + xhr.send(null); +} + +function canQuitApplication() +{ + var os = Components.classes["@mozilla.org/observer-service;1"] + .getService(Components.interfaces.nsIObserverService); + if (!os) + { + return true; + } + + try + { + 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 false; + } + } + catch (ex) + { + } + os.notifyObservers(null, "quit-application-granted", null); + return true; +} + +function goQuitApplication() +{ + const privs = 'UniversalXPConnect'; + + try + { + netscape.security.PrivilegeManager.enablePrivilege(privs); + } + catch(ex) + { + throw('goQuitApplication: privilege failure ' + ex); + } + + if (!canQuitApplication()) + { + return false; + } + + const kAppStartup = '@mozilla.org/toolkit/app-startup;1'; + const kAppShell = '@mozilla.org/appshell/appShellService;1'; + var appService; + var forceQuit; + + if (kAppStartup in Components.classes) + { + appService = Components.classes[kAppStartup]. + getService(Components.interfaces.nsIAppStartup); + forceQuit = Components.interfaces.nsIAppStartup.eForceQuit; + + } + else if (kAppShell in Components.classes) + { + appService = Components.classes[kAppShell]. + getService(Components.interfaces.nsIAppShellService); + forceQuit = Components.interfaces.nsIAppShellService.eForceQuit; + } + else + { + throw 'goQuitApplication: no AppStartup/appShell'; + } + + var windowManager = Components. + classes['@mozilla.org/appshell/window-mediator;1'].getService(); + + var windowManagerInterface = windowManager. + QueryInterface(Components.interfaces.nsIWindowMediator); + + var enumerator = windowManagerInterface.getEnumerator(null); + + while (enumerator.hasMoreElements()) + { + var domWindow = enumerator.getNext(); + if (("tryToClose" in domWindow) && !domWindow.tryToClose()) + { + return false; + } + domWindow.close(); + } + + try + { + appService.quit(forceQuit); + } + catch(ex) + { + throw('goQuitApplication: ' + ex); + } + + return true; +}