зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
3af5386475
Коммит
b251dfc1b5
|
@ -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']:
|
||||
|
|
Загрузка…
Ссылка в новой задаче