PBrowserParent* nsIContentParent::AllocPBrowserParent(const TabId& aTabId, const IPCTabContext& aContext, const uint32_t& aChromeFlags, const ContentParentId& aCpId, const bool& aIsForApp, const bool& aIsForBrowser) { Unused << aCpId; Unused << aIsForApp; Unused << aIsForBrowser; if (!CanOpenBrowser(aContext)) { return nullptr; } uint32_t chromeFlags = aChromeFlags; if (aContext.type() == IPCTabContext::TPopupIPCTabContext) { // CanOpenBrowser has ensured that the IPCTabContext is of // type PopupIPCTabContext, and that the opener TabParent is // reachable. const PopupIPCTabContext& popupContext = aContext.get_PopupIPCTabContext(); auto opener = TabParent::GetFrom(popupContext.opener().get_PBrowserParent()); // We must ensure that the private browsing and remoteness flags // match those of the opener. nsCOMPtr<nsILoadContext> loadContext = opener->GetLoadContext(); if (!loadContext) { return nullptr; } bool isPrivate; loadContext->GetUsePrivateBrowsing(&isPrivate); if (isPrivate) { chromeFlags |= nsIWebBrowserChrome::CHROME_PRIVATE_WINDOW; } } // And because we're allocating a remote browser, of course the // window is remote. chromeFlags |= nsIWebBrowserChrome::CHROME_REMOTE_WINDOW; MaybeInvalidTabContext tc(aContext); MOZ_ASSERT(tc.IsValid()); TabParent* parent = new TabParent(this, aTabId, tc.GetTabContext(), chromeFlags); // We release this ref in DeallocPBrowserParent() NS_ADDREF(parent); return parent; }
PBrowserParent* nsIContentParent::AllocPBrowserParent(const IPCTabContext& aContext, const uint32_t& aChromeFlags, const uint64_t& aId, const bool& aIsForApp, const bool& aIsForBrowser) { unused << aChromeFlags; unused << aId; unused << aIsForApp; unused << aIsForBrowser; if (!CanOpenBrowser(aContext)) { return nullptr; } MaybeInvalidTabContext tc(aContext); MOZ_ASSERT(tc.IsValid()); TabParent* parent = new TabParent(this, tc.GetTabContext(), aChromeFlags); // We release this ref in DeallocPBrowserParent() NS_ADDREF(parent); return parent; }
PBrowserParent* nsIContentParent::AllocPBrowserParent(const TabId& aTabId, const TabId& aSameTabGroupAs, const IPCTabContext& aContext, const uint32_t& aChromeFlags, const ContentParentId& aCpId, const bool& aIsForBrowser) { MOZ_ASSERT(!aSameTabGroupAs); Unused << aCpId; Unused << aIsForBrowser; if (!CanOpenBrowser(aContext)) { return nullptr; } uint32_t chromeFlags = aChromeFlags; TabId openerTabId(0); ContentParentId openerCpId(0); if (aContext.type() == IPCTabContext::TPopupIPCTabContext) { // CanOpenBrowser has ensured that the IPCTabContext is of // type PopupIPCTabContext, and that the opener TabParent is // reachable. const PopupIPCTabContext& popupContext = aContext.get_PopupIPCTabContext(); auto opener = TabParent::GetFrom(popupContext.opener().get_PBrowserParent()); openerTabId = opener->GetTabId(); openerCpId = opener->Manager()->ChildID(); // We must ensure that the private browsing and remoteness flags // match those of the opener. nsCOMPtr<nsILoadContext> loadContext = opener->GetLoadContext(); if (!loadContext) { return nullptr; } bool isPrivate; loadContext->GetUsePrivateBrowsing(&isPrivate); if (isPrivate) { chromeFlags |= nsIWebBrowserChrome::CHROME_PRIVATE_WINDOW; } } if (openerTabId > 0 || aContext.type() == IPCTabContext::TUnsafeIPCTabContext) { // Creation of PBrowser triggered from grandchild process is currently // broken and not supported (i.e. this code path doesn't work in // ContentBridgeParent). // // If you're working on fixing the code path for ContentBridgeParent, // remember to handle the remote frame registration below carefully as it // has to be registered in parent process. MOZ_ASSERT(XRE_IsParentProcess()); if (!XRE_IsParentProcess()) { return nullptr; } // The creation of PBrowser was triggered from content process through // either window.open() or service worker's openWindow(). // We need to register remote frame with the child generated tab id. ContentProcessManager* cpm = ContentProcessManager::GetSingleton(); if (!cpm->RegisterRemoteFrame(aTabId, openerCpId, openerTabId, aContext, aCpId)) { return nullptr; } } // And because we're allocating a remote browser, of course the // window is remote. chromeFlags |= nsIWebBrowserChrome::CHROME_REMOTE_WINDOW; MaybeInvalidTabContext tc(aContext); MOZ_ASSERT(tc.IsValid()); TabParent* parent = new TabParent(this, aTabId, tc.GetTabContext(), chromeFlags); // We release this ref in DeallocPBrowserParent() NS_ADDREF(parent); return parent; }