diff --git a/toolkit/components/remotebrowserutils/RemoteWebNavigation.js b/toolkit/components/remotebrowserutils/RemoteWebNavigation.js index 08722245db09..bc009a5838b1 100644 --- a/toolkit/components/remotebrowserutils/RemoteWebNavigation.js +++ b/toolkit/components/remotebrowserutils/RemoteWebNavigation.js @@ -13,6 +13,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "Utils", "resource://gre/modules/sessionstore/Utils.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", + "resource://gre/modules/PrivateBrowsingUtils.jsm"); function makeURI(url) { return Services.io.newURI(url); @@ -72,6 +74,29 @@ RemoteWebNavigation.prototype = { }, loadURIWithOptions(aURI, aLoadFlags, aReferrer, aReferrerPolicy, aPostData, aHeaders, aBaseURI, aTriggeringPrincipal) { + // We know the url is going to be loaded, let's start requesting network + // connection before the content process asks. + // Note that we might have already setup the speculative connection in some + // cases, especially when the url is from location bar or its popup menu. + if (aURI.startsWith("http")) { + let uri = makeURI(aURI); + let principal = aTriggeringPrincipal; + // We usually have a aTriggeringPrincipal assigned, but in case we don't + // have one, create it with OA inferred from the current context. + if (!principal) { + let attrs = { + userContextId: this._browser.getAttribute("usercontextid") || 0, + privateBrowsingId: PrivateBrowsingUtils.isBrowserPrivate(this._browser) ? 1 : 0 + }; + principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, attrs); + } + try { + Services.io.speculativeConnect2(uri, principal, null); + } catch (ex) { + // Can't setup speculative connection for this uri string for some + // reason, just ignore it. + } + } this._sendMessage("WebNavigation:LoadURI", { uri: aURI, flags: aLoadFlags,