Bug 1261152 - Keep the content process alive between tps runs. r?jmaher
MozReview-Commit-ID: 77wW1Y9z62B
--- a/testing/talos/talos/tests/tabswitch/bootstrap.js
+++ b/testing/talos/talos/tests/tabswitch/bootstrap.js
@@ -2,16 +2,17 @@
// -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Promise.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
+Cu.import("resource://gre/modules/RemotePageManager.jsm");
let aboutNewTabService = Cc["@mozilla.org/browser/aboutnewtab-service;1"]
.getService(Ci.nsIAboutNewTabService);
var aboutBlankTab = null;
let context = {};
let TalosParentProfiler;
@@ -425,17 +426,23 @@ function test(window) {
let resultsTab = win.gBrowser.loadOneTab('data:text/html;charset=utf-8,' +
encodeURIComponent(output));
let pref = Services.prefs.getBoolPref("browser.tabs.warnOnCloseOtherTabs");
if (pref)
Services.prefs.setBoolPref("browser.tabs.warnOnCloseOtherTabs", false);
win.gBrowser.removeAllTabsBut(resultsTab);
if (pref)
Services.prefs.setBoolPref("browser.tabs.warnOnCloseOtherTabs", pref);
- Services.obs.notifyObservers(win, 'tabswitch-test-results', JSON.stringify({'times': times, 'urls': testURLs}));
+
+ remotePage.sendAsyncMessage("tabswitch-test-results", {
+ times,
+ urls: testURLs,
+ });
+
+ win.close();
});
}
function unloadFromWindow(window) {
if (!window)
return;
let toolsMenu = window.document.getElementById("menu_ToolsPopup");
if (!toolsMenu)
@@ -471,17 +478,18 @@ function shutdown(aData, aReason) {
// Unload from any existing windows
let list = Services.wm.getEnumerator("navigator:browser");
while (list.hasMoreElements()) {
let window = list.getNext().QueryInterface(Ci.nsIDOMWindow);
unloadFromWindow(window);
}
Services.obs.removeObserver(observer, "tabswitch-urlfile");
- Services.obs.removeObserver(observer, "tabswitch-do-test");
+
+ remotePage.destroy();
}
function handleFile(win, file) {
let localFile = Cc["@mozilla.org/file/local;1"]
.createInstance(Ci.nsILocalFile);
localFile.initWithPath(file);
let localURI = Services.io.newFileURI(localFile);
@@ -505,31 +513,37 @@ function handleFile(win, file) {
}
});
return testURLs;
}
var observer = {
observe: function(aSubject, aTopic, aData) {
- if (aTopic == "tabswitch-do-test") {
- test(aSubject);
- } else if (aTopic == "tabswitch-urlfile") {
+ if (aTopic == "tabswitch-urlfile") {
handleFile(aSubject, aData);
}
}
};
+var remotePage;
+
function startup(aData, aReason) {
// Load into any existing windows
let list = Services.wm.getEnumerator("navigator:browser");
let window;
while (list.hasMoreElements()) {
window = list.getNext().QueryInterface(Ci.nsIDOMWindow);
loadIntoWindow(window);
}
// Load into any new windows
Services.wm.addListener(windowListener);
Services.obs.addObserver(observer, "tabswitch-urlfile", false);
- Services.obs.addObserver(observer, "tabswitch-do-test", false);
+
+ Services.ppmm.loadProcessScript("chrome://tabswitch/content/tabswitch-content-process.js", true);
+
+ remotePage = new RemotePages("about:tabswitch");
+ remotePage.addMessageListener("tabswitch-do-test", function doTest(msg) {
+ test(msg.target.browser.ownerGlobal);
+ });
}
new file mode 100644
--- /dev/null
+++ b/testing/talos/talos/tests/tabswitch/content/tabswitch-content-process.js
@@ -0,0 +1,32 @@
+const {classes: Cc, utils: Cu, interfaces: Ci} = Components;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const CHROME_URI = "chrome://tabswitch/content/test.html";
+
+class TabSwitchAboutModule {
+ constructor() {
+ this.QueryInterface = XPCOMUtils.generateQI([Ci.nsIAboutModule]);
+ }
+
+ newChannel(aURI, aLoadInfo) {
+ let uri = Services.io.newURI(CHROME_URI, null, null);
+ let chan = Services.io.newChannelFromURIWithLoadInfo(uri, aLoadInfo);
+ chan.originalURI = aURI;
+ return chan;
+ }
+
+ getURIFlags(aURI) {
+ return Ci.nsIAboutModule.ALLOW_SCRIPT |
+ Ci.nsIAboutModule.URI_MUST_LOAD_IN_CHILD;
+ }
+}
+
+let factory = XPCOMUtils._getFactory(TabSwitchAboutModule);
+let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+let UUIDGenerator = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator);
+
+registrar.registerFactory(UUIDGenerator.generateUUID(), "",
+ "@mozilla.org/network/protocol/about;1?what=tabswitch",
+ factory);
--- a/testing/talos/talos/tests/tabswitch/content/test.html
+++ b/testing/talos/talos/tests/tabswitch/content/test.html
@@ -1,27 +1,18 @@
<html>
<head>
<script>
- const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
- Cu.import("resource://gre/modules/Services.jsm");
function do_test(override) {
if (override || document.location.hash.indexOf("#auto") == 0) {
- var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIWebNavigation)
- .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
- .rootTreeItem
- .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIDOMWindow);
- Services.obs.notifyObservers(mainWindow, 'tabswitch-do-test', null);
- Services.obs.addObserver(function onStartup(aSubject, aTopic, aData) {
- aSubject.close();
- var data = JSON.parse(aData);
+ sendAsyncMessage("tabswitch-do-test");
+ addMessageListener("tabswitch-test-results", function onMessage(msg) {
+ let data = msg.data;
content.tpRecordTime(data.times.join(','), 0, data.urls.join(','));
- }, 'tabswitch-test-results', false);
+ });
}
}
</script>
</head>
<body onload="do_test(false)">
Hello Talos!
</body>
</html>
--- a/testing/talos/talos/tests/tabswitch/tps.manifest
+++ b/testing/talos/talos/tests/tabswitch/tps.manifest
@@ -1,1 +1,1 @@
-% chrome://tabswitch/content/test.html#auto
+% about:tabswitch#auto