зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1222516 part 3. Rejigger our rel="noreferrer" support to avoid setting an opener altogether instead of setting one and then nulling it out. r=mconley
This commit is contained in:
Родитель
588a38e713
Коммит
d53cc929eb
|
@ -9765,9 +9765,16 @@ nsDocShell::InternalLoad(nsIURI* aURI,
|
|||
if (aWindowTarget && *aWindowTarget) {
|
||||
// Locate the target DocShell.
|
||||
nsCOMPtr<nsIDocShellTreeItem> targetItem;
|
||||
rv = FindItemWithName(aWindowTarget, nullptr, this,
|
||||
getter_AddRefs(targetItem));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsDependentString name(aWindowTarget);
|
||||
// Only _self, _parent, and _top are supported in noopener case.
|
||||
if (!(aFlags & INTERNAL_LOAD_FLAGS_NO_OPENER) ||
|
||||
name.LowerCaseEqualsLiteral("_self") ||
|
||||
name.LowerCaseEqualsLiteral("_parent") ||
|
||||
name.LowerCaseEqualsLiteral("_top")) {
|
||||
rv = FindItemWithName(aWindowTarget, nullptr, this,
|
||||
getter_AddRefs(targetItem));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
targetDocShell = do_QueryInterface(targetItem);
|
||||
if (targetDocShell) {
|
||||
|
@ -9995,6 +10002,54 @@ nsDocShell::InternalLoad(nsIURI* aURI,
|
|||
if (aURI) {
|
||||
aURI->GetSpec(spec);
|
||||
}
|
||||
// If we are a noopener load, we just hand the whole thing over to our
|
||||
// window.
|
||||
if (aFlags & INTERNAL_LOAD_FLAGS_NO_OPENER) {
|
||||
// Various asserts that we know to hold because NO_OPENER loads can only
|
||||
// happen for links.
|
||||
MOZ_ASSERT(!aLoadReplace);
|
||||
MOZ_ASSERT(aPrincipalToInherit == aTriggeringPrincipal);
|
||||
MOZ_ASSERT(aFlags == INTERNAL_LOAD_FLAGS_NO_OPENER ||
|
||||
aFlags == (INTERNAL_LOAD_FLAGS_NO_OPENER |
|
||||
INTERNAL_LOAD_FLAGS_DONT_SEND_REFERRER));
|
||||
MOZ_ASSERT(!aPostData);
|
||||
MOZ_ASSERT(!aHeadersData);
|
||||
MOZ_ASSERT(aLoadType == LOAD_LINK);
|
||||
MOZ_ASSERT(!aSHEntry);
|
||||
MOZ_ASSERT(aFirstParty); // Windowwatcher will assume this.
|
||||
|
||||
nsCOMPtr<nsIDocShellLoadInfo> loadInfo;
|
||||
rv = CreateLoadInfo(getter_AddRefs(loadInfo));
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Set up our loadinfo so it will do the load as much like we would have
|
||||
// as possible.
|
||||
loadInfo->SetReferrer(aReferrer);
|
||||
loadInfo->SetReferrerPolicy(aReferrerPolicy);
|
||||
loadInfo->SetSendReferrer(!(aFlags &
|
||||
INTERNAL_LOAD_FLAGS_DONT_SEND_REFERRER));
|
||||
loadInfo->SetOriginalURI(aOriginalURI);
|
||||
loadInfo->SetLoadReplace(aLoadReplace);
|
||||
loadInfo->SetTriggeringPrincipal(aTriggeringPrincipal);
|
||||
loadInfo->SetInheritPrincipal(
|
||||
aFlags & INTERNAL_LOAD_FLAGS_INHERIT_PRINCIPAL);
|
||||
// Explicit principal because we do not want any guesses as to what the
|
||||
// principal to inherit is: it should be aTriggeringPrincipal.
|
||||
loadInfo->SetPrincipalIsExplicit(true);
|
||||
loadInfo->SetLoadType(ConvertLoadTypeToDocShellLoadInfo(LOAD_LINK));
|
||||
|
||||
rv = win->Open(NS_ConvertUTF8toUTF16(spec),
|
||||
name, // window name
|
||||
EmptyString(), // Features
|
||||
loadInfo,
|
||||
true, // aForceNoOpener
|
||||
getter_AddRefs(newWin));
|
||||
MOZ_ASSERT(!newWin);
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = win->OpenNoNavigate(NS_ConvertUTF8toUTF16(spec),
|
||||
name, // window name
|
||||
EmptyString(), // Features
|
||||
|
@ -10009,11 +10064,6 @@ nsDocShell::InternalLoad(nsIURI* aURI,
|
|||
if (!newDoc || newDoc->IsInitialDocument()) {
|
||||
isNewWindow = true;
|
||||
aFlags |= INTERNAL_LOAD_FLAGS_FIRST_LOAD;
|
||||
|
||||
// set opener object to null for noreferrer
|
||||
if (aFlags & INTERNAL_LOAD_FLAGS_NO_OPENER) {
|
||||
piNewWin->SetOpenerWindow(nullptr, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
[noreferrer-window-name.html]
|
||||
type: testharness
|
||||
expected: TIMEOUT
|
||||
[rel=noreferrer and reuse of names]
|
||||
expected: TIMEOUT
|
||||
|
Загрузка…
Ссылка в новой задаче