Bug 1704651 - Wait for the right load in ClientOpenWindow. r=asuth

With fission+BFCache, we get a notification for the initial document,
and that fails the same-origin check (because about:blank isn't
same-origin with the opener) so we resolve the promise with null
rather than returning a client.

Instead, wait for the right load to arrive if the top level window
global is the initial document.

Differential Revision: https://phabricator.services.mozilla.com/D112072
This commit is contained in:
Emilio Cobos Álvarez 2021-04-15 12:11:02 +00:00
Родитель 8695079145
Коммит 0677a9ec85
2 изменённых файлов: 15 добавлений и 4 удалений

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

@ -83,8 +83,10 @@ class WebProgressListener final : public nsIWebProgressListener,
// Our caller keeps a strong reference, so it is safe to remove the listener // Our caller keeps a strong reference, so it is safe to remove the listener
// from the BrowsingContext's nsIWebProgress. // from the BrowsingContext's nsIWebProgress.
nsCOMPtr<nsIWebProgress> webProgress = browsingContext->GetWebProgress(); auto RemoveListener = [&] {
webProgress->RemoveProgressListener(this); nsCOMPtr<nsIWebProgress> webProgress = browsingContext->GetWebProgress();
webProgress->RemoveProgressListener(this);
};
RefPtr<dom::WindowGlobalParent> wgp = RefPtr<dom::WindowGlobalParent> wgp =
browsingContext->GetCurrentWindowGlobal(); browsingContext->GetCurrentWindowGlobal();
@ -93,9 +95,18 @@ class WebProgressListener final : public nsIWebProgressListener,
rv.ThrowInvalidStateError("Unable to open window"); rv.ThrowInvalidStateError("Unable to open window");
mPromise->Reject(rv, __func__); mPromise->Reject(rv, __func__);
mPromise = nullptr; mPromise = nullptr;
RemoveListener();
return NS_OK; return NS_OK;
} }
if (NS_WARN_IF(wgp->IsInitialDocument())) {
// This is the load of the initial document, which is not the document we
// care about for the purposes of checking same-originness of the URL.
return NS_OK;
}
RemoveListener();
// Check same origin. If the origins do not match, resolve with null (per // Check same origin. If the origins do not match, resolve with null (per
// step 7.2.7.1 of the openWindow spec). // step 7.2.7.1 of the openWindow spec).
nsCOMPtr<nsIScriptSecurityManager> securityManager = nsCOMPtr<nsIScriptSecurityManager> securityManager =
@ -104,7 +115,7 @@ class WebProgressListener final : public nsIWebProgressListener,
wgp->DocumentPrincipal()->OriginAttributesRef().mPrivateBrowsingId > 0; wgp->DocumentPrincipal()->OriginAttributesRef().mPrivateBrowsingId > 0;
nsresult rv = securityManager->CheckSameOriginURI( nsresult rv = securityManager->CheckSameOriginURI(
wgp->GetDocumentURI(), mBaseURI, false, isPrivateWin); wgp->GetDocumentURI(), mBaseURI, false, isPrivateWin);
if (NS_FAILED(rv)) { if (NS_WARN_IF(NS_FAILED(rv))) {
mPromise->Resolve(CopyableErrorResult(), __func__); mPromise->Resolve(CopyableErrorResult(), __func__);
mPromise = nullptr; mPromise = nullptr;
return NS_OK; return NS_OK;

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

@ -25,7 +25,7 @@ function testForUrl(url, throwType, clientProperties, resultsArray) {
} else if (clientProperties) { } else if (clientProperties) {
resultsArray.push({ resultsArray.push({
result: e instanceof WindowClient, result: e instanceof WindowClient,
message: "openWindow should resolve to a WindowClient", message: `openWindow should resolve to a WindowClient for url ${url}, got ${e}`,
}); });
resultsArray.push({ resultsArray.push({
result: e.url == clientProperties.url, result: e.url == clientProperties.url,