fune/toolkit/components/windowwatcher/nsOpenWindowInfo.cpp
Makoto Kato 6f0f4ec37e Bug 1777509 - Don't return browsing context directly when creating new window. r=nika,geckoview-reviewers,owlish
Desktop's `nsIBrowserWindow.createContetnWindow` will return null when
creating new window. Then browsing context is observed by `nsFrameLoader`.

Actually, GeckoView's `createContentWindow` always creates new window.
So if using new window option, we should return null like desktop.

Also, if no callback, we return browsing context even if creating new window
due to no way to notify browsing context. And,
`nsIWindowProvider.provideWindow` doesn't use the callback, we have to return
browsing context for this situation.

Differential Revision: https://phabricator.services.mozilla.com/D197131
2024-04-24 11:17:43 +00:00

97 lines
2.8 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsOpenWindowInfo.h"
#include "mozilla/OriginAttributes.h"
#include "mozilla/dom/ToJSValue.h"
#include "mozilla/dom/BrowserParent.h"
NS_IMPL_ISUPPORTS(nsOpenWindowInfo, nsIOpenWindowInfo)
NS_IMETHODIMP nsOpenWindowInfo::GetParent(
mozilla::dom::BrowsingContext** aParent) {
*aParent = do_AddRef(mParent).take();
return NS_OK;
}
NS_IMETHODIMP nsOpenWindowInfo::GetIsRemote(bool* aIsRemote) {
*aIsRemote = mIsRemote;
return NS_OK;
}
NS_IMETHODIMP nsOpenWindowInfo::GetIsForWindowDotPrint(bool* aResult) {
*aResult = mIsForWindowDotPrint;
return NS_OK;
}
NS_IMETHODIMP nsOpenWindowInfo::GetIsForPrinting(bool* aIsForPrinting) {
*aIsForPrinting = mIsForPrinting;
return NS_OK;
}
NS_IMETHODIMP nsOpenWindowInfo::GetForceNoOpener(bool* aForceNoOpener) {
*aForceNoOpener = mForceNoOpener;
return NS_OK;
}
NS_IMETHODIMP nsOpenWindowInfo::GetScriptableOriginAttributes(
JSContext* aCx, JS::MutableHandle<JS::Value> aAttrs) {
bool ok = ToJSValue(aCx, mOriginAttributes, aAttrs);
NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE);
return NS_OK;
}
const mozilla::OriginAttributes& nsOpenWindowInfo::GetOriginAttributes() {
return mOriginAttributes;
}
mozilla::dom::BrowserParent* nsOpenWindowInfo::GetNextRemoteBrowser() {
return mNextRemoteBrowser;
}
nsIBrowsingContextReadyCallback*
nsOpenWindowInfo::BrowsingContextReadyCallback() {
return mBrowsingContextReadyCallback;
}
NS_IMETHODIMP nsOpenWindowInfo::Cancel() {
if (mBrowsingContextReadyCallback) {
mBrowsingContextReadyCallback->BrowsingContextReady(nullptr);
mBrowsingContextReadyCallback = nullptr;
}
return NS_OK;
}
NS_IMPL_ISUPPORTS(nsBrowsingContextReadyCallback,
nsIBrowsingContextReadyCallback)
nsBrowsingContextReadyCallback::nsBrowsingContextReadyCallback(
RefPtr<mozilla::dom::BrowsingContextCallbackReceivedPromise::Private>
aPromise)
: mPromise(std::move(aPromise)) {}
nsBrowsingContextReadyCallback::~nsBrowsingContextReadyCallback() {
if (mPromise) {
mPromise->Reject(NS_ERROR_FAILURE, __func__);
}
mPromise = nullptr;
}
NS_IMETHODIMP nsBrowsingContextReadyCallback::BrowsingContextReady(
mozilla::dom::BrowsingContext* aBC) {
MOZ_DIAGNOSTIC_ASSERT(mPromise,
"The 'browsing context ready' callback is null");
if (!mPromise) {
return NS_OK;
}
if (aBC) {
mPromise->Resolve(aBC, __func__);
} else {
mPromise->Reject(NS_ERROR_FAILURE, __func__);
}
mPromise = nullptr;
return NS_OK;
}