Bug 1384714: Use subscript loader to load browser.xul scripts. r?mossop draft
authorKris Maglione <maglione.k@gmail.com>
Tue, 25 Jul 2017 20:56:37 -0700
changeset 616179 a03ef37338cbc44afd8d7514bd27d3838f155694
parent 615653 914753bd9224d104e4ffe5669480a5c511555d12
child 639416 25c8d29ecc9ccfc84dd65cf21e2c16beebb56f6f
push id70623
push usermaglione.k@gmail.com
push dateWed, 26 Jul 2017 20:37:49 +0000
reviewersmossop
bugs1384714
milestone56.0a1
Bug 1384714: Use subscript loader to load browser.xul scripts. r?mossop There's a lot of overhead to loading scripts from <script> tags in browser.xul. They're loaded asynchronously, and can't begin loading until after we begin loading browser.xul. They're loaded using off-main-thread compilation, which means we need to create and merge a new JS zone for each script we load that way. They don't benefit from the startup cache at all. If we load those scripts using the subscript loader, they're loaded from the preloader cache, and begin loading as early as possible. And they're all loaded into a single off-thread zone, which means there are less zones to create and merge. From a quick test, this seems to save about 20-40ms on Windows ts_paint talos runs. The main downside is that subscript loader scripts don't benefit from lazy parsing, so we might wind up increasing memory usage if most of the functions in those scripts aren't used very often. But we should hopefully be able to fix that by migrating more browser JS to lazy loading. MozReview-Commit-ID: Lozb0d0QweC
browser/base/content/browser.xul
browser/base/content/global-scripts.inc
tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -60,17 +60,19 @@
         retargetdocumentfocus="urlbar"
         persist="screenX screenY width height sizemode">
 
 # All JS files which are not content (only) dependent that browser.xul
 # wishes to include *must* go into the global-scripts.inc file
 # so that they can be shared by macBrowserOverlay.xul.
 #include global-scripts.inc
 
-<script type="application/javascript" src="chrome://global/content/contentAreaUtils.js"/>
+<script type="application/javascript">
+  Services.scriptloader.loadSubScript("chrome://global/content/contentAreaUtils.js", this);
+</script>
 
 # All sets except for popupsets (commands, keys, stringbundles and broadcasters) *must* go into the
 # browser-sets.inc file for sharing with hiddenWindow.xul.
 #define FULL_BROWSER_WINDOW
 #include browser-sets.inc
 #undef FULL_BROWSER_WINDOW
 
   <popupset id="mainPopupSet">
--- a/browser/base/content/global-scripts.inc
+++ b/browser/base/content/global-scripts.inc
@@ -2,23 +2,30 @@
 # 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/.
 
 # If you update this list, you may need to add a mapping within the following
 # file so that ESLint works correctly:
 # tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
 
-<script type="application/javascript" src="chrome://browser/content/browser.js"/>
+<script type="application/javascript">
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+for (let script of [
+  "chrome://browser/content/browser.js",
 
-<script type="application/javascript" src="chrome://browser/content/browser-captivePortal.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-compacttheme.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-feeds.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-media.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-places.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-plugins.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-sidebar.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-tabsintitlebar.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-trackingprotection.js"/>
-
+  "chrome://browser/content/browser-captivePortal.js",
+  "chrome://browser/content/browser-compacttheme.js",
+  "chrome://browser/content/browser-feeds.js",
+  "chrome://browser/content/browser-media.js",
+  "chrome://browser/content/browser-places.js",
+  "chrome://browser/content/browser-plugins.js",
+  "chrome://browser/content/browser-sidebar.js",
+  "chrome://browser/content/browser-tabsintitlebar.js",
+  "chrome://browser/content/browser-trackingprotection.js",
 #ifdef MOZ_DATA_REPORTING
-<script type="application/javascript" src="chrome://browser/content/browser-data-submission-info-bar.js"/>
+  "chrome://browser/content/browser-data-submission-info-bar.js",
 #endif
+]) {
+  Services.scriptloader.loadSubScript(script, this);
+}
+</script>
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
@@ -44,17 +44,17 @@ const MAPPINGS = {
   "browserPlacesViews.js":
     "browser/components/places/content/browserPlacesViews.js",
   "panelUI.js": "browser/components/customizableui/content/panelUI.js",
   "viewSourceUtils.js":
     "toolkit/components/viewsource/content/viewSourceUtils.js"
 };
 
 const globalScriptsRegExp =
-  /<script type=\"application\/javascript\" src=\"(.*)\"\/>/;
+  /<script type=\"application\/javascript\" src=\"(.*)\"\/>|^\s*"(.*?\.js)",$/;
 
 function getGlobalScriptsIncludes() {
   let fileData;
   try {
     fileData = fs.readFileSync(helpers.globalScriptsPath, {encoding: "utf8"});
   } catch (ex) {
     // The file isn't present, so this isn't an m-c repository.
     return null;
@@ -62,18 +62,18 @@ function getGlobalScriptsIncludes() {
 
   fileData = fileData.split("\n");
 
   let result = [];
 
   for (let line of fileData) {
     let match = line.match(globalScriptsRegExp);
     if (match) {
-      let sourceFile =
-        match[1].replace("chrome://browser/content/", "browser/base/content/")
+      let sourceFile = (match[1] || match[2])
+                .replace("chrome://browser/content/", "browser/base/content/")
                 .replace("chrome://global/content/", "toolkit/content/");
 
       for (let mapping of Object.getOwnPropertyNames(MAPPINGS)) {
         if (sourceFile.includes(mapping)) {
           sourceFile = MAPPINGS[mapping];
         }
       }