Bug 1290766 - Return the scroll capture information from the PPluginWidget Create method, instead of using a separate asynchronous method which is delivered later and may race with fast shutdown. r=billm

MozReview-Commit-ID: JJA1VaIuDxL

--HG--
extra : rebase_source : 13a97843b3f2dbfd66478d5ba41e2365dd94a11f
This commit is contained in:
Benjamin Smedberg 2016-10-05 11:36:26 -04:00
Родитель 3af5386475
Коммит b251dfc1b5
7 изменённых файлов: 36 добавлений и 41 удалений

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

@ -31,7 +31,15 @@ sync protocol PPluginWidget {
parent:
async __delete__();
sync Create() returns (nsresult aResult);
/**
* Used to set the ID of a scroll capture container from the parent process,
* so that we can create a proxy container in the layer tree.
* @param aScrollCaptureId async container ID of the parent container
* @param aPluginInstanceId plugin ID on which to set the scroll capture ID
*/
sync Create() returns (nsresult aResult, uint64_t aScrollCaptureId,
uintptr_t aPluginInstanceId);
async SetFocus(bool aRaise);
/**
@ -47,16 +55,6 @@ parent:
* on the chrome side. This is only currently used on Windows.
*/
sync SetNativeChildWindow(uintptr_t childWindow);
child:
/**
* Used to set the ID of a scroll capture container from the parent process,
* so that we can create a proxy container in the layer tree.
* @param aScrollCaptureId async container ID of the parent container
* @param aPluginInstanceId plugin ID on which to set the scroll capture ID
*/
async SetScrollCaptureId(uint64_t aScrollCaptureId,
uintptr_t aPluginInstanceId);
};
}

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

@ -35,25 +35,6 @@ PluginWidgetChild::~PluginWidgetChild()
MOZ_COUNT_DTOR(PluginWidgetChild);
}
bool
PluginWidgetChild::RecvSetScrollCaptureId(const uint64_t& aScrollCaptureId,
const uintptr_t& aPluginInstanceId)
{
#if defined(XP_WIN)
PluginInstanceParent* instance =
PluginInstanceParent::LookupPluginInstanceByID(aPluginInstanceId);
if (instance) {
Unused << NS_WARN_IF(NS_FAILED(instance->SetScrollCaptureId(aScrollCaptureId)));
}
return true;
#else
MOZ_ASSERT_UNREACHABLE(
"PluginWidgetChild::RecvSetScrollCaptureId calls not expected.");
return false;
#endif
}
// Called by the proxy widget when it is destroyed by layout. Only gets
// called once.
void

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

@ -19,9 +19,6 @@ public:
PluginWidgetChild();
virtual ~PluginWidgetChild();
bool RecvSetScrollCaptureId(const uint64_t& aScrollCaptureId,
const uintptr_t& aPluginInstanceId) override;
virtual void ActorDestroy(ActorDestroyReason aWhy) override;
void SetWidget(mozilla::widget::PluginWidgetProxy* aWidget) {

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

@ -84,10 +84,14 @@ PluginWidgetParent::SetParent(nsIWidget* aParent)
// makes use of some of the utility functions as well.
bool
PluginWidgetParent::RecvCreate(nsresult* aResult)
PluginWidgetParent::RecvCreate(nsresult* aResult, uint64_t* aScrollCaptureId,
uintptr_t* aPluginInstanceId)
{
PWLOG("PluginWidgetParent::RecvCreate()\n");
*aScrollCaptureId = 0;
*aPluginInstanceId = 0;
mWidget = do_CreateInstance(kWidgetCID, aResult);
NS_ASSERTION(NS_SUCCEEDED(*aResult), "widget create failure");
@ -142,10 +146,9 @@ PluginWidgetParent::RecvCreate(nsresult* aResult)
GetTabParent()->Manager()->AsContentParent());
NS_ASSERTION(winres, "SetPropW call failure");
uint64_t scrollCaptureId = mWidget->CreateScrollCaptureContainer();
uintptr_t pluginId =
*aScrollCaptureId = mWidget->CreateScrollCaptureContainer();
*aPluginInstanceId =
reinterpret_cast<uintptr_t>(mWidget->GetNativeData(NS_NATIVE_PLUGIN_ID));
Unused << SendSetScrollCaptureId(scrollCaptureId, pluginId);
#endif
// This is a special call we make to nsBaseWidget to register this

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

@ -29,7 +29,8 @@ public:
virtual ~PluginWidgetParent();
virtual void ActorDestroy(ActorDestroyReason aWhy) override;
virtual bool RecvCreate(nsresult* aResult) override;
virtual bool RecvCreate(nsresult* aResult, uint64_t* aScrollCaptureId,
uintptr_t* aPluginInstanceId) override;
virtual bool RecvSetFocus(const bool& aRaise) override;
virtual bool RecvGetNativePluginPort(uintptr_t* value) override;
bool RecvSetNativeChildWindow(const uintptr_t& aChildWindow) override;

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

@ -5,6 +5,7 @@
#include "PluginWidgetProxy.h"
#include "mozilla/dom/TabChild.h"
#include "mozilla/plugins/PluginWidgetChild.h"
#include "mozilla/plugins/PluginInstanceParent.h"
#include "nsDebug.h"
#define PWLOG(...)
@ -23,6 +24,8 @@ nsIWidget::CreatePluginProxyWidget(TabChild* aTabChild,
namespace mozilla {
namespace widget {
using mozilla::plugins::PluginInstanceParent;
NS_IMPL_ISUPPORTS_INHERITED(PluginWidgetProxy, PuppetWidget, nsIWidget)
#define ENSURE_CHANNEL do { \
@ -57,7 +60,9 @@ PluginWidgetProxy::Create(nsIWidget* aParent,
PWLOG("PluginWidgetProxy::Create()\n");
nsresult rv = NS_ERROR_UNEXPECTED;
mActor->SendCreate(&rv);
uint64_t scrollCaptureId;
uintptr_t pluginInstanceId;
mActor->SendCreate(&rv, &scrollCaptureId, &pluginInstanceId);
if (NS_FAILED(rv)) {
NS_WARNING("failed to create chrome widget, plugins won't paint.");
return rv;
@ -70,6 +75,14 @@ PluginWidgetProxy::Create(nsIWidget* aParent,
mEnabled = true;
mVisible = true;
#if defined(XP_WIN)
PluginInstanceParent* instance =
PluginInstanceParent::LookupPluginInstanceByID(pluginInstanceId);
if (instance) {
Unused << NS_WARN_IF(NS_FAILED(instance->SetScrollCaptureId(scrollCaptureId)));
}
#endif
return NS_OK;
}

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

@ -162,7 +162,6 @@ UNIFIED_SOURCES += [
'nsScreenManagerProxy.cpp',
'nsTransferable.cpp',
'nsXPLookAndFeel.cpp',
'PluginWidgetProxy.cpp',
'PuppetBidiKeyboard.cpp',
'PuppetWidget.cpp',
'ScreenProxy.cpp',
@ -194,9 +193,12 @@ if CONFIG['MOZ_XUL'] and CONFIG['NS_PRINTING']:
# nsBaseWidget.cpp needs to be built separately because of name clashes in the OS X headers
# nsBaseDragService.cpp moved out of UNIFIED to fix xgill crash (bug 1259850) after moving widget/ContentHelper -> apz/util/TouchActionHelper
# PluginWidgetProxy includes MacOS system headers which define a Point struct
# that conflicts with mozilla::gfx::Point
SOURCES += [
'nsBaseDragService.cpp',
'nsBaseWidget.cpp'
'nsBaseWidget.cpp',
'PluginWidgetProxy.cpp',
]
if CONFIG['MOZ_INSTRUMENT_EVENT_LOOP']: