Bug 1597154 - pt 3. Defer to documentchannel for process switching for all schemes r=mattwoodrow

Differential Revision: https://phabricator.services.mozilla.com/D58899

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Paul Bone 2020-01-16 03:52:46 +00:00
Родитель c31347cc28
Коммит 6557402e10
2 изменённых файлов: 39 добавлений и 14 удалений

Просмотреть файл

@ -9374,6 +9374,8 @@ static bool IsConsideredSameOriginForUIR(nsIPrincipal* aTriggeringPrincipal,
return NS_OK;
}
// Changes here should also be made in
// E10SUtils.documentChannelPermittedForURI().
static bool SchemeUsesDocChannel(nsIURI* aURI) {
if (SchemeIsJavascript(aURI) || NS_IsAboutBlank(aURI)) {
return false;

Просмотреть файл

@ -137,7 +137,22 @@ const kSafeSchemes = [
"xmpp",
];
const kDocumentChannelAllowedSchemes = ["http", "https", "ftp", "data"];
const kDocumentChannelDeniedSchemes = ["javascript"];
const kDocumentChannelDeniedURIs = [
"about:blank",
"about:printpreview",
"about:privatebrowsing",
"about:crashcontent",
];
// Changes here should also be made in SchemeUsesDocChannel in
// nsDocShell.cpp.
function documentChannelPermittedForURI(aURI) {
return (
!kDocumentChannelDeniedSchemes.includes(aURI.scheme) &&
!kDocumentChannelDeniedURIs.includes(aURI.spec)
);
}
// Note that even if the scheme fits the criteria for a web-handled scheme
// (ie it is compatible with the checks registerProtocolHandler uses), it may
@ -724,9 +739,10 @@ var E10SUtils = {
// for now, and let DocumentChannel do it during the response.
if (
currentRemoteType != NOT_REMOTE &&
requiredRemoteType != NOT_REMOTE &&
uriObject &&
(remoteSubframes || documentChannel) &&
kDocumentChannelAllowedSchemes.includes(uriObject.scheme)
documentChannelPermittedForURI(uriObject)
) {
mustChangeProcess = false;
}
@ -788,18 +804,6 @@ var E10SUtils = {
return false;
}
// If we are using DocumentChannel or remote subframes (fission), and
// are loading a HTTP URI, we can start the load in the current
// process, and then perform the switch later-on using the
// RedirectProcessChooser mechanism.
if (
Services.appinfo.remoteType != NOT_REMOTE &&
(useRemoteSubframes || documentChannel) &&
kDocumentChannelAllowedSchemes.includes(aURI.scheme)
) {
return true;
}
// If we are in a Large-Allocation process, and it wouldn't be content visible
// to change processes, we want to load into a new process so that we can throw
// this one out. We don't want to move into a new process if we have post data,
@ -841,6 +845,25 @@ var E10SUtils = {
);
}
// If we are using DocumentChannel or remote subframes (fission), we
// can start the load in the current process, and then perform the
// switch later-on using the nsIProcessSwitchRequestor mechanism.
let wantRemoteType = this.getRemoteTypeForURIObject(
aURI,
true,
useRemoteSubframes,
Services.appinfo.remoteType,
webNav.currentURI
);
if (
(useRemoteSubframes || documentChannel) &&
Services.appinfo.remoteType != NOT_REMOTE &&
wantRemoteType != NOT_REMOTE &&
documentChannelPermittedForURI(aURI)
) {
return true;
}
// If the URI can be loaded in the current process then continue
return this.shouldLoadURIInThisProcess(aURI, useRemoteSubframes);
},