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:
Mike Conley 2014-06-20 13:55:40 -04:00
Родитель c223d57d83
Коммит 04d328098e
3 изменённых файлов: 26 добавлений и 11 удалений

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

@ -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);