mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-25 03:05:34 +00:00
0be64b42c5
Calling Cu.importGlobalProperties immediately defines the import properties and any prototypes that they require. Aside from CPU overhead, this also tends to consume a lot of memory, especially for objects with complex prototypes. And it does this once for every global you call it in. This is especially a problem for content processes, since we get this memory overhead in each and every content process. This patch moves Marionette to use the new XPCOMUtils.defineLazyGlobalGetters so that symbols are constructed only when actually needed. MozReview-Commit-ID: 3RYWTcdO7FM --HG-- extra : rebase_source : 0c450c8900e5de5446796b34ae4ab6bdf0fe9118
61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
/* 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/. */
|
|
|
|
"use strict";
|
|
|
|
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
XPCOMUtils.defineLazyGlobalGetters(this, ["URL"]);
|
|
|
|
this.EXPORTED_SYMBOLS = ["navigate"];
|
|
|
|
/** @namespace */
|
|
this.navigate = {};
|
|
|
|
/**
|
|
* Determines if we expect to get a DOM load event (DOMContentLoaded)
|
|
* on navigating to the <code>future</code> URL.
|
|
*
|
|
* @param {string} current
|
|
* URL the browser is currently visiting.
|
|
* @param {string=} future
|
|
* Destination URL, if known.
|
|
*
|
|
* @return {boolean}
|
|
* Full page load would be expected if future is followed.
|
|
*
|
|
* @throws TypeError
|
|
* If <code>current</code> is not defined, or any of
|
|
* <code>current</code> or <code>future</code> are invalid URLs.
|
|
*/
|
|
navigate.isLoadEventExpected = function(current, future = undefined) {
|
|
// assume we will go somewhere exciting
|
|
if (typeof current == "undefined") {
|
|
throw new TypeError("Expected at least one URL");
|
|
}
|
|
|
|
// Assume we will go somewhere exciting
|
|
if (typeof future == "undefined") {
|
|
return true;
|
|
}
|
|
|
|
let cur = new URL(current);
|
|
let fut = new URL(future);
|
|
|
|
// Assume javascript:<whatever> will modify the current document
|
|
// but this is not an entirely safe assumption to make,
|
|
// considering it could be used to set window.location
|
|
if (fut.protocol == "javascript:") {
|
|
return false;
|
|
}
|
|
|
|
// If hashes are present and identical
|
|
if (cur.href.includes("#") && fut.href.includes("#") &&
|
|
cur.hash === fut.hash) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|