Bug 1435115 - Remove usage of enablePrivilege from quit.js. r=jmaher

This patch moves the contents of quit.js into talos-powers-content.js,
and makes it callable from content via TalosPowersContent. The code
required a few minor tweaks.

MozReview-Commit-ID: KkAbcFO0xzT

--HG--
extra : rebase_source : 4a165bc613fbc73ff8edd7bcfe2cf9cbd4a2af05
This commit is contained in:
Andrew McCreight 2018-02-01 16:05:30 -08:00
parent 4a7ebcb3bb
commit a6f34d4700
9 changed files with 110 additions and 150 deletions

View File

@ -6,7 +6,7 @@
<meta charset="utf-8">
<head>
<script language="Javascript" type="text/javascript" src="scripts/MozillaFileLogger.js"></script>
<script language="Javascript" type="text/javascript" src="tests/quit.js"></script>
<script language="Javascript" type="text/javascript" src="chrome://talos-powers-content/content/TalosPowersContent.js"></script>
<title>shutdown script</title>
</head>
@ -16,7 +16,7 @@
//JMAHER: this is temporarily commented out because this hangs the fennec browser
// dumpLog('\tBrowser outer width/height: ' + window.outerWidth + '/' + window.outerHeight);
dumpLog('__metrics\n');
goQuitApplication(true);
TalosPowersContent.goQuitApplication(true);
">
</body>
</html>

View File

@ -5,8 +5,8 @@
<title>Session Restore Regression Test</title>
<script type="text/javascript" src="chrome://pageloader/content/MozillaFileLogger.js"></script>
<script type="text/javascript" src="chrome://pageloader/content/quit.js"></script>
<script type="text/javascript" src="chrome://talos-powers-content/content/TalosContentProfiler.js"></script>
<script type="text/javascript" src="chrome://talos-powers-content/content/TalosPowersContent.js"></script>
<script type="text/javascript" src="chrome://session-restore-test/content/main.js">
</script>

View File

@ -31,7 +31,7 @@ addEventListener("load", function() {
dumpLog("__startTimestamp" +
Date.now() + // eslint-disable-line mozilla/avoid-Date-timing
"__endTimestamp\n\n");
goQuitApplication();
TalosPowersContent.goQuitApplication();
});
// In case the add-on has broadcasted the message before we were loaded,

View File

@ -5,7 +5,7 @@
<head>
<script language="Javascript" type="text/javascript" src="../../../../scripts/Profiler.js"></script>
<script language="Javascript" type="text/javascript" src="../../../../scripts/MozillaFileLogger.js"></script>
<script language="JavaScript" type="text/javascript" src="../../../../tests/quit.js"></script>
<script language="Javascript" type="text/javascript" src="chrome://talos-powers-content/content/TalosPowersContent.js"></script>
<script language="javascript" type="text/javascript">
function runTest() {
@ -24,7 +24,7 @@ function logResults(data) {
window.setTimeout(function() {
goQuitApplication();
TalosPowersContent.goQuitApplication();
window.close();
}, 0);
} else {

View File

@ -9,7 +9,6 @@
<script language="Javascript" type="text/javascript" src="chrome://talos-powers-content/content/TalosPowersContent.js"></script>
<script language="Javascript" type="text/javascript" src="../scripts/MozillaFileLogger.js"></script>
<script language="Javascript" type="text/javascript" src="chrome://talos-powers-content/content/TalosContentProfiler.js"></script>
<script language="JavaScript" type="text/javascript" src="../tests/quit.js"></script>
<script language="javascript" type="text/javascript">
async function painted() {
@ -57,7 +56,7 @@ function dumpConsoleAndQuit() {
// eslint-disable-next-line mozilla/avoid-Date-timing
dumpLog("__startTimestamp" + Date.now() + "__endTimestamp\n");
}
goQuitApplication();
TalosPowersContent.goQuitApplication();
window.close();
}, 0);
}

View File

@ -8,6 +8,97 @@
var { interfaces: Ci, utils: Cu } = Components;
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");
// Something aborted the quit process.
if (cancelQuit.data) {
return false;
}
} catch (ex) {
}
os.notifyObservers(null, "quit-application-granted");
return true;
}
function goQuitApplication(waitForSafeBrowsing) {
var xulRuntime = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULRuntime);
if (xulRuntime.processType == xulRuntime.PROCESS_TYPE_CONTENT) {
// If we're running in a remote browser, emit an event for a
// frame script to pick up to quit the whole browser.
var event = new content.CustomEvent("TalosQuitApplication", {bubbles: true, detail: {waitForSafeBrowsing}});
content.document.dispatchEvent(event);
return false;
}
if (waitForSafeBrowsing) {
var SafeBrowsing = ChromeUtils.import("resource://gre/modules/SafeBrowsing.jsm", {}).SafeBrowsing;
var whenDone = () => {
goQuitApplication(false);
};
SafeBrowsing.addMozEntriesFinishedPromise.then(whenDone, whenDone);
// Speed things up in case nobody else called this:
SafeBrowsing.init();
return false;
}
if (!canQuitApplication()) {
return false;
}
const kAppStartup = "@mozilla.org/toolkit/app-startup;1";
const kAppShell = "@mozilla.org/appshell/appShellService;1";
var appService;
if (kAppStartup in Components.classes) {
appService = Components.classes[kAppStartup].
getService(Components.interfaces.nsIAppStartup);
} else if (kAppShell in Components.classes) {
appService = Components.classes[kAppShell].
getService(Components.interfaces.nsIAppShellService);
} 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(appService.eForceQuit);
} catch (ex) {
throw ("goQuitApplication: " + ex);
}
return true;
}
/**
* Content that wants to quit the whole session should
* fire the TalosQuitApplication custom event. This will
@ -85,6 +176,10 @@ addEventListener("TalosPowersContentGetStartupInfo", (e) => {
});
});
addEventListener("TalosPowersGoQuitApplication", (e) => {
goQuitApplication(e.detail);
});
/* *
* Mediator for the generic ParentExec mechanism.
* Listens for a query event from the content, forwards it as a query message

View File

@ -51,6 +51,14 @@ var TalosPowersParent;
});
});
},
goQuitApplication(waitForSafeBrowsing) {
var event = new CustomEvent("TalosPowersGoQuitApplication", {
bubbles: true,
detail: waitForSafeBrowsing,
});
document.dispatchEvent(event);
},
};
/**

View File

@ -1,141 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Mozilla Automated Testing Code
*
* The Initial Developer of the Original Code is
* Mozilla Corporation.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Bob Clary <bob@bclary.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
From mozilla/toolkit/content
These files did not have a license
*/
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");
// Something aborted the quit process.
if (cancelQuit.data) {
return false;
}
} catch (ex) {
}
os.notifyObservers(null, "quit-application-granted");
return true;
}
function goQuitApplication(waitForSafeBrowsing) {
/* eslint-disable mozilla/use-chromeutils-import */
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (ex) {
throw ("goQuitApplication: privilege failure " + ex);
}
var xulRuntime = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULRuntime);
if (xulRuntime.processType == xulRuntime.PROCESS_TYPE_CONTENT) {
// If we're running in a remote browser, emit an event for a
// frame script to pick up to quit the whole browser.
var event = new CustomEvent("TalosQuitApplication", {bubbles: true, detail: {waitForSafeBrowsing}});
document.dispatchEvent(event);
return false;
}
if (waitForSafeBrowsing) {
var SafeBrowsing = Components.utils.
import("resource://gre/modules/SafeBrowsing.jsm", {}).SafeBrowsing;
var whenDone = () => {
goQuitApplication(false);
};
SafeBrowsing.addMozEntriesFinishedPromise.then(whenDone, whenDone);
// Speed things up in case nobody else called this:
SafeBrowsing.init();
return false;
}
if (!canQuitApplication()) {
return false;
}
const kAppStartup = "@mozilla.org/toolkit/app-startup;1";
const kAppShell = "@mozilla.org/appshell/appShellService;1";
var appService;
if (kAppStartup in Components.classes) {
appService = Components.classes[kAppStartup].
getService(Components.interfaces.nsIAppStartup);
} else if (kAppShell in Components.classes) {
appService = Components.classes[kAppShell].
getService(Components.interfaces.nsIAppShellService);
} 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(appService.eForceQuit);
} catch (ex) {
throw ("goQuitApplication: " + ex);
}
return true;
}

View File

@ -3,7 +3,6 @@
<script language="JavaScript" type="text/javascript" src="../../scripts/MozillaFileLogger.js"></script>
<script language="JavaScript" src="chrome://talos-powers-content/content/TalosContentProfiler.js"></script>
<script language="JavaScript" type="text/javascript" src="chrome://talos-powers-content/content/TalosPowersContent.js"></script>
<script language="JavaScript" type="text/javascript" src="../quit.js"></script>
<script>
var OPENER_DELAY = 1000; // ms delay between tests
var kid, kidStartTime, kidEndTime, openTime;