Bug 1261152 - Keep the content process alive between tps runs. r?jmaher draft
authorMike Conley <mconley@mozilla.com>
Fri, 15 Apr 2016 12:33:13 -0400
changeset 352090 b5615c73476c281667302714f2713d75c3b94eee
parent 352089 e8211e5d7d520a836fa6a315fa50ca68bfc731ca
child 518572 f9e9b0b97bd577bb9063840a4669afa3884d188a
push id15609
push usermconley@mozilla.com
push dateFri, 15 Apr 2016 16:45:11 +0000
reviewersjmaher
bugs1261152
milestone48.0a1
Bug 1261152 - Keep the content process alive between tps runs. r?jmaher MozReview-Commit-ID: 77wW1Y9z62B
testing/talos/talos/tests/tabswitch/bootstrap.js
testing/talos/talos/tests/tabswitch/content/tabswitch-content-process.js
testing/talos/talos/tests/tabswitch/content/test.html
testing/talos/talos/tests/tabswitch/tps.manifest
--- 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