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

--HG--
extra : rebase_source : 069a003dfd1d6d66540da814a1fd19742c4fca26
extra : amend_source : b93e0ef7b320c99f4a27ddf6e8af6a681b6dba0f
This commit is contained in:
Kris Maglione 2017-07-25 20:56:37 -07:00
parent 620fec28ff
commit b744ab0807
3 changed files with 26 additions and 18 deletions

View File

@ -65,7 +65,9 @@
# 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.

View File

@ -7,23 +7,29 @@
# 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");
<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-pageActions.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"/>
for (let script of [
"chrome://browser/content/browser.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-pageActions.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
#ifndef MOZILLA_OFFICIAL
<script type="application/javascript" src="chrome://browser/content/browser-development-helpers.js"/>
"chrome://browser/content/browser-development-helpers.js",
#endif
]) {
Services.scriptloader.loadSubScript(script, this);
}
</script>

View File

@ -49,7 +49,7 @@ const MAPPINGS = {
};
const globalScriptsRegExp =
/<script type=\"application\/javascript\" src=\"(.*)\"\/>/;
/<script type=\"application\/javascript\" src=\"(.*)\"\/>|^\s*"(.*?\.js)",$/;
function getGlobalScriptsIncludes() {
let fileData;
@ -67,8 +67,8 @@ function getGlobalScriptsIncludes() {
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)) {