diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp index d51462b63402..b2f007096b54 100644 --- a/dom/base/nsFrameLoader.cpp +++ b/dom/base/nsFrameLoader.cpp @@ -47,6 +47,7 @@ #include "nsBaseWidget.h" #include "nsQueryObject.h" #include "ReferrerInfo.h" +#include "nsIOpenWindowInfo.h" #include "nsIURI.h" #include "nsNetUtil.h" @@ -257,7 +258,12 @@ static bool IsTopContent(BrowsingContext* aParent, Element* aOwner) { } static already_AddRefed CreateBrowsingContext( - Element* aOwner, BrowsingContext* aOpener) { + Element* aOwner, nsIOpenWindowInfo* aOpenWindowInfo) { + RefPtr opener; + if (aOpenWindowInfo && !aOpenWindowInfo->GetForceNoOpener()) { + opener = aOpenWindowInfo->GetParent(); + } + Document* doc = aOwner->OwnerDoc(); // Get our parent docshell off the document of mOwnerContent // XXXbz this is such a total hack.... We really need to have a @@ -290,7 +296,7 @@ static already_AddRefed CreateBrowsingContext( if (IsTopContent(parentContext, aOwner)) { // Create toplevel content without a parent & as Type::Content. RefPtr bc = BrowsingContext::CreateDetached( - nullptr, aOpener, frameName, BrowsingContext::Type::Content); + nullptr, opener, frameName, BrowsingContext::Type::Content); // If this is a mozbrowser frame, pretend it's windowless so that it gets // ownership of its BrowsingContext even though it's a top-level content @@ -304,10 +310,13 @@ static already_AddRefed CreateBrowsingContext( return bc.forget(); } + MOZ_ASSERT(!aOpenWindowInfo, + "Can't have openWindowInfo for non-toplevel context"); + auto type = parentContext->IsContent() ? BrowsingContext::Type::Content : BrowsingContext::Type::Chrome; - return BrowsingContext::CreateDetached(parentContext, aOpener, frameName, + return BrowsingContext::CreateDetached(parentContext, nullptr, frameName, type); } @@ -339,9 +348,8 @@ static bool InitialLoadIsRemote(Element* aOwner) { nsGkAtoms::_true, eCaseMatters); } -already_AddRefed nsFrameLoader::Create(Element* aOwner, - BrowsingContext* aOpener, - bool aNetworkCreated) { +already_AddRefed nsFrameLoader::Create( + Element* aOwner, bool aNetworkCreated, nsIOpenWindowInfo* aOpenWindowInfo) { NS_ENSURE_TRUE(aOwner, nullptr); Document* doc = aOwner->OwnerDoc(); @@ -370,7 +378,8 @@ already_AddRefed nsFrameLoader::Create(Element* aOwner, doc->IsStaticDocument()), nullptr); - RefPtr context = CreateBrowsingContext(aOwner, aOpener); + RefPtr context = + CreateBrowsingContext(aOwner, aOpenWindowInfo); NS_ENSURE_TRUE(context, nullptr); // Determine the initial RemoteType from the load environment. An empty or @@ -378,8 +387,6 @@ already_AddRefed nsFrameLoader::Create(Element* aOwner, // denotes a remote frame. nsAutoString remoteType(VoidString()); if (InitialLoadIsRemote(aOwner)) { - MOZ_ASSERT(!aOpener, "Cannot pass `aOpener` for a remote frame!"); - // If the `remoteType` attribute is specified and valid, use it. Otherwise, // use a default remote type. bool hasRemoteType = @@ -391,6 +398,7 @@ already_AddRefed nsFrameLoader::Create(Element* aOwner, RefPtr fl = new nsFrameLoader(aOwner, context, remoteType, aNetworkCreated); + fl->mOpenWindowInfo = aOpenWindowInfo; return fl.forget(); } @@ -411,7 +419,7 @@ already_AddRefed nsFrameLoader::Recreate( RefPtr context = aContext; if (!context) { - context = CreateBrowsingContext(aOwner, /* opener */ nullptr); + context = CreateBrowsingContext(aOwner, /* openWindowInfo */ nullptr); } NS_ENSURE_TRUE(context, nullptr); @@ -2478,20 +2486,15 @@ bool nsFrameLoader::TryRemoteBrowserInternal() { return false; } + uint64_t nextRemoteBrowserId = + mOpenWindowInfo ? mOpenWindowInfo->GetNextRemoteBrowserId() : 0; + if (!EnsureBrowsingContextAttached()) { return false; } RefPtr openerContentParent; - RefPtr openerContentPrincipal; RefPtr sameTabGroupAs; - if (auto* host = BrowserHost::GetFrom(parentDocShell->GetOpener())) { - openerContentParent = host->GetContentParent(); - BrowserParent* openerBrowserParent = host->GetActor(); - if (openerBrowserParent) { - openerContentPrincipal = openerBrowserParent->GetContentPrincipal(); - } - } //