зеркало из https://github.com/mozilla/gecko-dev.git
Bug 989501 - Part 1: If an opening nsITabParent is found when creating a new content window, use that opener's ContentParent to make the new remote browser. r=smaug.
This commit is contained in:
Родитель
c223d57d83
Коммит
04d328098e
|
@ -2069,14 +2069,23 @@ nsFrameLoader::TryRemoteBrowser()
|
|||
return false;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIDocShellTreeItem> parentAsItem(parentWin->GetDocShell());
|
||||
if (!parentAsItem) {
|
||||
nsCOMPtr<nsIDocShell> parentDocShell = parentWin->GetDocShell();
|
||||
if (!parentDocShell) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TabParent* openingTab = static_cast<TabParent*>(parentDocShell->GetOpener());
|
||||
ContentParent* openerContentParent = nullptr;
|
||||
|
||||
if (openingTab &&
|
||||
openingTab->Manager() &&
|
||||
openingTab->Manager()->IsContentParent()) {
|
||||
openerContentParent = openingTab->Manager()->AsContentParent();
|
||||
}
|
||||
|
||||
// <iframe mozbrowser> gets to skip these checks.
|
||||
if (!OwnerIsBrowserOrAppFrame()) {
|
||||
if (parentAsItem->ItemType() != nsIDocShellTreeItem::typeChrome) {
|
||||
if (parentDocShell->ItemType() != nsIDocShellTreeItem::typeChrome) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -2096,7 +2105,7 @@ nsFrameLoader::TryRemoteBrowser()
|
|||
|
||||
uint32_t chromeFlags = 0;
|
||||
nsCOMPtr<nsIDocShellTreeOwner> parentOwner;
|
||||
if (NS_FAILED(parentAsItem->GetTreeOwner(getter_AddRefs(parentOwner))) ||
|
||||
if (NS_FAILED(parentDocShell->GetTreeOwner(getter_AddRefs(parentOwner))) ||
|
||||
!parentOwner) {
|
||||
return false;
|
||||
}
|
||||
|
@ -2133,11 +2142,11 @@ nsFrameLoader::TryRemoteBrowser()
|
|||
NS_ENSURE_TRUE(rv, false);
|
||||
|
||||
nsCOMPtr<Element> ownerElement = mOwnerContent;
|
||||
mRemoteBrowser = ContentParent::CreateBrowserOrApp(context, ownerElement);
|
||||
mRemoteBrowser = ContentParent::CreateBrowserOrApp(context, ownerElement, openerContentParent);
|
||||
if (mRemoteBrowser) {
|
||||
mChildID = mRemoteBrowser->Manager()->ChildID();
|
||||
nsCOMPtr<nsIDocShellTreeItem> rootItem;
|
||||
parentAsItem->GetRootTreeItem(getter_AddRefs(rootItem));
|
||||
parentDocShell->GetRootTreeItem(getter_AddRefs(rootItem));
|
||||
nsCOMPtr<nsIDOMWindow> rootWin = rootItem->GetWindow();
|
||||
nsCOMPtr<nsIDOMChromeWindow> rootChromeWin = do_QueryInterface(rootWin);
|
||||
|
||||
|
@ -2155,6 +2164,7 @@ nsFrameLoader::TryRemoteBrowser()
|
|||
eCaseMatters)) {
|
||||
unused << mRemoteBrowser->SendSetUpdateHitRegion(true);
|
||||
}
|
||||
parentDocShell->SetOpenedRemote(mRemoteBrowser);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -831,7 +831,8 @@ ContentParent::AnswerBridgeToChildProcess(const uint64_t& id)
|
|||
|
||||
/*static*/ TabParent*
|
||||
ContentParent::CreateBrowserOrApp(const TabContext& aContext,
|
||||
Element* aFrameElement)
|
||||
Element* aFrameElement,
|
||||
ContentParent* aOpenerContentParent)
|
||||
{
|
||||
if (!sCanLaunchSubprocesses) {
|
||||
return nullptr;
|
||||
|
@ -863,9 +864,12 @@ ContentParent::CreateBrowserOrApp(const TabContext& aContext,
|
|||
parent->SetIsForApp(isForApp);
|
||||
parent->SetIsForBrowser(isForBrowser);
|
||||
constructorSender = parent;
|
||||
} else if (nsRefPtr<ContentParent> cp =
|
||||
GetNewOrUsed(aContext.IsBrowserElement(), initialPriority)) {
|
||||
constructorSender = cp;
|
||||
} else {
|
||||
if (aOpenerContentParent) {
|
||||
constructorSender = aOpenerContentParent;
|
||||
} else {
|
||||
constructorSender = GetNewOrUsed(aContext.IsBrowserElement(), initialPriority);
|
||||
}
|
||||
}
|
||||
if (constructorSender) {
|
||||
uint32_t chromeFlags = 0;
|
||||
|
|
|
@ -115,7 +115,8 @@ public:
|
|||
*/
|
||||
static TabParent*
|
||||
CreateBrowserOrApp(const TabContext& aContext,
|
||||
Element* aFrameElement);
|
||||
Element* aFrameElement,
|
||||
ContentParent* aOpenerContentParent);
|
||||
|
||||
static void GetAll(nsTArray<ContentParent*>& aArray);
|
||||
static void GetAllEvenIfDead(nsTArray<ContentParent*>& aArray);
|
||||
|
|
Загрузка…
Ссылка в новой задаче