Bug 1103177 - When tabs are torn out, swap plugin widget parents. r=roc

This commit is contained in:
Jim Mathies 2015-02-08 17:50:01 -06:00
Родитель ceb106d8e4
Коммит a8bf5c7379
4 изменённых файлов: 47 добавлений и 0 удалений

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

@ -76,6 +76,8 @@
#include "AppProcessChecker.h"
#include "ContentParent.h"
#include "TabParent.h"
#include "mozilla/plugins/PPluginWidgetParent.h"
#include "../plugins/ipc/PluginWidgetParent.h"
#include "mozilla/AsyncEventDispatcher.h"
#include "mozilla/GuardObjects.h"
#include "mozilla/Preferences.h"
@ -970,6 +972,8 @@ nsFrameLoader::SwapWithOtherRemoteLoader(nsFrameLoader* aOther,
nsRefPtr<nsFrameLoader>& aFirstToSwap,
nsRefPtr<nsFrameLoader>& aSecondToSwap)
{
MOZ_ASSERT(NS_IsMainThread());
Element* ourContent = mOwnerContent;
Element* otherContent = aOther->mOwnerContent;
@ -1024,6 +1028,17 @@ nsFrameLoader::SwapWithOtherRemoteLoader(nsFrameLoader* aOther,
return rv;
}
// Native plugin windows used by this remote content need to be reparented.
const nsTArray<mozilla::plugins::PPluginWidgetParent*>& plugins =
aOther->mRemoteBrowser->ManagedPPluginWidgetParent();
nsPIDOMWindow* newWin = ourDoc->GetWindow();
if (newWin) {
nsRefPtr<nsIWidget> newParent = ((nsGlobalWindow*)newWin)->GetMainWidget();
for (uint32_t idx = 0; idx < plugins.Length(); ++idx) {
static_cast<mozilla::plugins::PluginWidgetParent*>(plugins[idx])->SetParent(newParent);
}
}
SetOwnerContent(otherContent);
aOther->SetOwnerContent(ourContent);

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

@ -0,0 +1,21 @@
--- nsFrameLoader.cpp
+++ nsFrameLoader.cpp
@@ -48,17 +48,17 @@
#include "nsIDOMHTMLDocument.h"
#include "nsIXULWindow.h"
#include "nsIEditor.h"
#include "nsIMozBrowserFrame.h"
#include "nsIPermissionManager.h"
#include "nsISHistory.h"
#include "nsNullPrincipal.h"
#include "nsIScriptError.h"
-
+#include "nsGlobalWindow.h"
#include "nsLayoutUtils.h"
#include "nsView.h"
#include "nsIURI.h"
#include "nsIURL.h"
#include "nsNetUtil.h"
#include "nsGkAtoms.h"

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

@ -75,6 +75,14 @@ PluginWidgetParent::GetTabParent()
return static_cast<mozilla::dom::TabParent*>(Manager());
}
void
PluginWidgetParent::SetParent(nsIWidget* aParent)
{
if (mWidget && aParent) {
mWidget->SetParent(aParent);
}
}
#if defined(XP_WIN)
// static
void

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

@ -48,6 +48,9 @@ public:
// Called by PBrowser when it receives a Destroy() call from the child.
void ParentDestroy();
// Sets mWidget's parent
void SetParent(nsIWidget* aParent);
private:
void ShutdownCommon(bool aParentInitiated);