summaryrefslogtreecommitdiffstats
path: root/widget/PluginWidgetProxy.cpp
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /widget/PluginWidgetProxy.cpp
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'widget/PluginWidgetProxy.cpp')
-rw-r--r--widget/PluginWidgetProxy.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/widget/PluginWidgetProxy.cpp b/widget/PluginWidgetProxy.cpp
new file mode 100644
index 000000000..679bf29e3
--- /dev/null
+++ b/widget/PluginWidgetProxy.cpp
@@ -0,0 +1,195 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "PluginWidgetProxy.h"
+#include "mozilla/dom/TabChild.h"
+#include "mozilla/plugins/PluginWidgetChild.h"
+#include "mozilla/plugins/PluginInstanceParent.h"
+#include "nsDebug.h"
+
+#define PWLOG(...)
+// #define PWLOG(...) printf_stderr(__VA_ARGS__)
+
+/* static */
+already_AddRefed<nsIWidget>
+nsIWidget::CreatePluginProxyWidget(TabChild* aTabChild,
+ mozilla::plugins::PluginWidgetChild* aActor)
+{
+ nsCOMPtr<nsIWidget> widget =
+ new mozilla::widget::PluginWidgetProxy(aTabChild, aActor);
+ return widget.forget();
+}
+
+namespace mozilla {
+namespace widget {
+
+using mozilla::plugins::PluginInstanceParent;
+
+NS_IMPL_ISUPPORTS_INHERITED(PluginWidgetProxy, PuppetWidget, nsIWidget)
+
+#define ENSURE_CHANNEL do { \
+ if (!mActor) { \
+ NS_WARNING("called on an invalid channel."); \
+ return NS_ERROR_FAILURE; \
+ } \
+} while (0)
+
+PluginWidgetProxy::PluginWidgetProxy(dom::TabChild* aTabChild,
+ mozilla::plugins::PluginWidgetChild* aActor) :
+ PuppetWidget(aTabChild),
+ mActor(aActor),
+ mCachedPluginPort(0)
+{
+ // See ChannelDestroyed() in the header
+ mActor->SetWidget(this);
+}
+
+PluginWidgetProxy::~PluginWidgetProxy()
+{
+ PWLOG("PluginWidgetProxy::~PluginWidgetProxy()\n");
+}
+
+nsresult
+PluginWidgetProxy::Create(nsIWidget* aParent,
+ nsNativeWidget aNativeParent,
+ const LayoutDeviceIntRect& aRect,
+ nsWidgetInitData* aInitData)
+{
+ ENSURE_CHANNEL;
+ PWLOG("PluginWidgetProxy::Create()\n");
+
+ nsresult rv = NS_ERROR_UNEXPECTED;
+ 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;
+ }
+
+ BaseCreate(aParent, aInitData);
+ mParent = aParent;
+
+ mBounds = aRect;
+ 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;
+}
+
+NS_IMETHODIMP
+PluginWidgetProxy::SetParent(nsIWidget* aNewParent)
+{
+ nsCOMPtr<nsIWidget> kungFuDeathGrip(this);
+ nsIWidget* parent = GetParent();
+ if (parent) {
+ parent->RemoveChild(this);
+ }
+ if (aNewParent) {
+ aNewParent->AddChild(this);
+ }
+ mParent = aNewParent;
+ return NS_OK;
+}
+
+nsIWidget*
+PluginWidgetProxy::GetParent(void)
+{
+ return mParent.get();
+}
+
+void
+PluginWidgetProxy::Destroy()
+{
+ PWLOG("PluginWidgetProxy::Destroy()\n");
+
+ if (mActor) {
+ // Communicate that the layout widget has been torn down before the sub
+ // protocol.
+ mActor->ProxyShutdown();
+ mActor = nullptr;
+ }
+
+ PuppetWidget::Destroy();
+}
+
+void
+PluginWidgetProxy::GetWindowClipRegion(nsTArray<LayoutDeviceIntRect>* aRects)
+{
+ if (mClipRects && mClipRectCount) {
+ aRects->AppendElements(mClipRects.get(), mClipRectCount);
+ }
+}
+
+void*
+PluginWidgetProxy::GetNativeData(uint32_t aDataType)
+{
+ if (!mActor) {
+ return nullptr;
+ }
+ auto tab = static_cast<mozilla::dom::TabChild*>(mActor->Manager());
+ if (tab && tab->IsDestroyed()) {
+ return nullptr;
+ }
+ switch (aDataType) {
+ case NS_NATIVE_PLUGIN_PORT:
+ case NS_NATIVE_WINDOW:
+ case NS_NATIVE_SHAREABLE_WINDOW:
+ break;
+ default:
+ NS_WARNING("PluginWidgetProxy::GetNativeData received request for unsupported data type.");
+ return nullptr;
+ }
+ // The parent side window handle or xid never changes so we can
+ // cache this for our lifetime.
+ if (mCachedPluginPort) {
+ return (void*)mCachedPluginPort;
+ }
+ mActor->SendGetNativePluginPort(&mCachedPluginPort);
+ PWLOG("PluginWidgetProxy::GetNativeData %p\n", (void*)mCachedPluginPort);
+ return (void*)mCachedPluginPort;
+}
+
+#if defined(XP_WIN)
+void
+PluginWidgetProxy::SetNativeData(uint32_t aDataType, uintptr_t aVal)
+{
+ if (!mActor) {
+ return;
+ }
+
+ auto tab = static_cast<mozilla::dom::TabChild*>(mActor->Manager());
+ if (tab && tab->IsDestroyed()) {
+ return;
+ }
+
+ switch (aDataType) {
+ case NS_NATIVE_CHILD_WINDOW:
+ mActor->SendSetNativeChildWindow(aVal);
+ break;
+ default:
+ NS_ERROR("SetNativeData called with unsupported data type.");
+ }
+}
+#endif
+
+NS_IMETHODIMP
+PluginWidgetProxy::SetFocus(bool aRaise)
+{
+ ENSURE_CHANNEL;
+ PWLOG("PluginWidgetProxy::SetFocus(%d)\n", aRaise);
+ mActor->SendSetFocus(aRaise);
+ return NS_OK;
+}
+
+} // namespace widget
+} // namespace mozilla