Bug 1113196 - Pass a sane set of parameters to loadinfo for top-level loads in e10s. r=sicking

This commit is contained in:
Blake Kaplan
2016-03-04 08:54:07 -08:00
parent aa2a129ca9
commit bd476fb1d1
9 changed files with 134 additions and 77 deletions

View File

@@ -10570,11 +10570,39 @@ nsDocShell::DoURILoad(nsIURI* aURI,
bool isSrcdoc = !aSrcdoc.IsVoid();
// There are three cases we care about:
// * Null mScriptGlobal: shouldn't happen but does (see bug 1240246). In this
// case, we create a loadingPrincipal as for a top-level load, but we leave
// requestingNode and requestingWindow null.
// * Top-level load (GetFrameElementInternal returns null). In this case,
// requestingNode is null, but requestingWindow is our mScriptGlobal.
// TODO we want to pass null for loadingPrincipal in this case.
// * Subframe load: requestingWindow is null, but requestingNode is the frame
// element for the load. loadingPrincipal is the NodePrincipal of the frame
// element.
nsCOMPtr<nsINode> requestingNode;
nsCOMPtr<nsPIDOMWindowOuter> requestingWindow;
nsCOMPtr<nsIPrincipal> loadingPrincipal;
if (mScriptGlobal) {
requestingNode = mScriptGlobal->AsOuter()->GetFrameElementInternal();
if (!requestingNode) {
requestingNode = mScriptGlobal->GetExtantDoc();
if (requestingNode) {
// If we have a requesting node, then use that as our loadingPrincipal.
loadingPrincipal = requestingNode->NodePrincipal();
} else {
MOZ_ASSERT(aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT);
requestingWindow = mScriptGlobal->AsOuter();
}
}
if (!loadingPrincipal) {
if (mItemType != typeChrome) {
nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
ssm->GetDocShellCodebasePrincipal(aURI, this, getter_AddRefs(loadingPrincipal));
} else {
// This is a top-level chrome load, use a system principal for the
// loadingPrincipal.
loadingPrincipal = nsContentUtils::GetSystemPrincipal();
}
}
@@ -10605,19 +10633,19 @@ nsDocShell::DoURILoad(nsIURI* aURI,
securityFlags |= nsILoadInfo::SEC_SANDBOXED;
}
nsCOMPtr<nsILoadInfo> loadInfo =
requestingWindow ?
new LoadInfo(requestingWindow, loadingPrincipal, triggeringPrincipal,
securityFlags) :
new LoadInfo(loadingPrincipal, triggeringPrincipal, requestingNode,
securityFlags, aContentPolicyType);
if (!isSrcdoc) {
rv = NS_NewChannelInternal(getter_AddRefs(channel),
aURI,
requestingNode,
requestingNode
? requestingNode->NodePrincipal()
: triggeringPrincipal.get(),
triggeringPrincipal,
securityFlags,
aContentPolicyType,
nullptr, // loadGroup
static_cast<nsIInterfaceRequestor*>(this),
loadFlags);
loadInfo,
nullptr, // loadGroup
static_cast<nsIInterfaceRequestor*>(this),
loadFlags);
if (NS_FAILED(rv)) {
if (rv == NS_ERROR_UNKNOWN_PROTOCOL) {
@@ -10652,26 +10680,13 @@ nsDocShell::DoURILoad(nsIURI* aURI,
NS_ENSURE_TRUE(vsh, NS_ERROR_FAILURE);
rv = vsh->NewSrcdocChannel(aURI, aBaseURI, aSrcdoc,
requestingNode,
requestingNode
? requestingNode->NodePrincipal()
: triggeringPrincipal.get(),
triggeringPrincipal,
securityFlags,
aContentPolicyType,
getter_AddRefs(channel));
loadInfo, getter_AddRefs(channel));
} else {
rv = NS_NewInputStreamChannelInternal(getter_AddRefs(channel),
aURI,
aSrcdoc,
NS_LITERAL_CSTRING("text/html"),
requestingNode,
requestingNode ?
requestingNode->NodePrincipal() :
triggeringPrincipal.get(),
triggeringPrincipal,
securityFlags,
aContentPolicyType,
loadInfo,
true);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIInputStreamChannel> isc = do_QueryInterface(channel);