Title: [196053] trunk/Source/WebKit2
Revision
196053
Author
carlo...@webkit.org
Date
2016-02-03 00:18:23 -0800 (Wed, 03 Feb 2016)

Log Message

[UNIX] Add support for windowless NPAPI plugins with no UI in non X11 platforms
https://bugs.webkit.org/show_bug.cgi?id=151992

Reviewed by Darin Adler.

We are currently disabling all plugins when running under wayland,
for example. There are some plugins, like the one used by
extensions.gnome.org, that don't do any rendering, so there's not
reason not to support those plugins under wayland or any other
unix non-x11 platform.
X11 specific code has been moved to a new class NetscapePluginX11,
only used under X11. The common code is in NetscapePluginUnix.cpp
that will use the X11 implementatin only when needed and
available. For windowed plugins we will fail the initialization
under non-X11 plaforms, while for windowless plugins we will just
return early from paint method.

* PlatformEfl.cmake: Add new files to compilation.
* PlatformGTK.cmake: Ditto.
* UIProcess/API/gtk/WebKitSettings.cpp:
(webkit_settings_set_enable_plugins): Do not disable plugins in wayland.
* UIProcess/gtk/WebPreferencesGtk.cpp:
(WebKit::WebPreferences::platformInitializeStore): Ditto.
* WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
(WebKit::NPN_GetValue): Use PlatformDisplay instead of
NetscapePlugin::x11HostDisplay() and don't claim to support X11
specific features under non-x11 platforms.
* WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
(WebKit::NetscapePlugin::NetscapePlugin): Remove X11 and GTK
specific memebers that are now moved to a dedicated class NetscapePluginX11.
* WebProcess/Plugins/Netscape/NetscapePlugin.h:
(WebKit::NetscapePlugin::frameRectInWindowCoordinates): Make this public.
(WebKit::NetscapePlugin::clipRect): Add getter.
(WebKit::NetscapePlugin::size): Ditto.
(WebKit::NetscapePlugin::isWindowed): Ditto.
(WebKit::NetscapePlugin::isVisible): Ditto.
* WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp: Added.
(WebKit::NetscapePlugin::platformPreInitialize):
(WebKit::NetscapePlugin::platformPostInitialize):
(WebKit::NetscapePlugin::platformDestroy):
(WebKit::NetscapePlugin::platformInvalidate):
(WebKit::NetscapePlugin::platformGeometryDidChange):
(WebKit::NetscapePlugin::platformVisibilityDidChange):
(WebKit::NetscapePlugin::platformPaint):
(WebKit::NetscapePlugin::platformHandleMouseEvent):
(WebKit::NetscapePlugin::platformHandleWheelEvent):
(WebKit::NetscapePlugin::platformSetFocus):
(WebKit::NetscapePlugin::wantsPluginRelativeNPWindowCoordinates):
(WebKit::NetscapePlugin::platformHandleMouseEnterEvent):
(WebKit::NetscapePlugin::platformHandleMouseLeaveEvent):
(WebKit::NetscapePlugin::platformHandleKeyboardEvent):
* WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h: Added.
(WebKit::NetscapePluginUnix::~NetscapePluginUnix):
* WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
(WebKit::getPluginDisplay):
(WebKit::displayDepth):
(WebKit::x11HostDisplay):
(WebKit::NetscapePluginX11::create):
(WebKit::NetscapePluginX11::NetscapePluginX11):
(WebKit::NetscapePluginX11::~NetscapePluginX11):
(WebKit::NetscapePluginX11::windowType):
(WebKit::NetscapePluginX11::window):
(WebKit::NetscapePluginX11::geometryDidChange):
(WebKit::NetscapePluginX11::visibilityDidChange):
(WebKit::NetscapePluginX11::paint):
(WebKit::initializeXEvent):
(WebKit::NetscapePluginX11::handleMouseEvent):
(WebKit::NetscapePluginX11::handleWheelEvent):
(WebKit::NetscapePluginX11::setFocus):
(WebKit::NetscapePluginX11::handleMouseEnterEvent):
(WebKit::NetscapePluginX11::handleMouseLeaveEvent):
(WebKit::NetscapePluginX11::handleKeyboardEvent):
(WebKit::setCommonMouseEventFields): Deleted.
(WebKit::setXKeyEventFields): Deleted.
* WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (196052 => 196053)


--- trunk/Source/WebKit2/ChangeLog	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/ChangeLog	2016-02-03 08:18:23 UTC (rev 196053)
@@ -1,3 +1,81 @@
+2016-02-02  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [UNIX] Add support for windowless NPAPI plugins with no UI in non X11 platforms
+        https://bugs.webkit.org/show_bug.cgi?id=151992
+
+        Reviewed by Darin Adler.
+
+        We are currently disabling all plugins when running under wayland,
+        for example. There are some plugins, like the one used by
+        extensions.gnome.org, that don't do any rendering, so there's not
+        reason not to support those plugins under wayland or any other
+        unix non-x11 platform.
+        X11 specific code has been moved to a new class NetscapePluginX11,
+        only used under X11. The common code is in NetscapePluginUnix.cpp
+        that will use the X11 implementatin only when needed and
+        available. For windowed plugins we will fail the initialization
+        under non-X11 plaforms, while for windowless plugins we will just
+        return early from paint method.
+
+        * PlatformEfl.cmake: Add new files to compilation.
+        * PlatformGTK.cmake: Ditto.
+        * UIProcess/API/gtk/WebKitSettings.cpp:
+        (webkit_settings_set_enable_plugins): Do not disable plugins in wayland.
+        * UIProcess/gtk/WebPreferencesGtk.cpp:
+        (WebKit::WebPreferences::platformInitializeStore): Ditto.
+        * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
+        (WebKit::NPN_GetValue): Use PlatformDisplay instead of
+        NetscapePlugin::x11HostDisplay() and don't claim to support X11
+        specific features under non-x11 platforms.
+        * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
+        (WebKit::NetscapePlugin::NetscapePlugin): Remove X11 and GTK
+        specific memebers that are now moved to a dedicated class NetscapePluginX11.
+        * WebProcess/Plugins/Netscape/NetscapePlugin.h:
+        (WebKit::NetscapePlugin::frameRectInWindowCoordinates): Make this public.
+        (WebKit::NetscapePlugin::clipRect): Add getter.
+        (WebKit::NetscapePlugin::size): Ditto.
+        (WebKit::NetscapePlugin::isWindowed): Ditto.
+        (WebKit::NetscapePlugin::isVisible): Ditto.
+        * WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp: Added.
+        (WebKit::NetscapePlugin::platformPreInitialize):
+        (WebKit::NetscapePlugin::platformPostInitialize):
+        (WebKit::NetscapePlugin::platformDestroy):
+        (WebKit::NetscapePlugin::platformInvalidate):
+        (WebKit::NetscapePlugin::platformGeometryDidChange):
+        (WebKit::NetscapePlugin::platformVisibilityDidChange):
+        (WebKit::NetscapePlugin::platformPaint):
+        (WebKit::NetscapePlugin::platformHandleMouseEvent):
+        (WebKit::NetscapePlugin::platformHandleWheelEvent):
+        (WebKit::NetscapePlugin::platformSetFocus):
+        (WebKit::NetscapePlugin::wantsPluginRelativeNPWindowCoordinates):
+        (WebKit::NetscapePlugin::platformHandleMouseEnterEvent):
+        (WebKit::NetscapePlugin::platformHandleMouseLeaveEvent):
+        (WebKit::NetscapePlugin::platformHandleKeyboardEvent):
+        * WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h: Added.
+        (WebKit::NetscapePluginUnix::~NetscapePluginUnix):
+        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp:
+        (WebKit::getPluginDisplay):
+        (WebKit::displayDepth):
+        (WebKit::x11HostDisplay):
+        (WebKit::NetscapePluginX11::create):
+        (WebKit::NetscapePluginX11::NetscapePluginX11):
+        (WebKit::NetscapePluginX11::~NetscapePluginX11):
+        (WebKit::NetscapePluginX11::windowType):
+        (WebKit::NetscapePluginX11::window):
+        (WebKit::NetscapePluginX11::geometryDidChange):
+        (WebKit::NetscapePluginX11::visibilityDidChange):
+        (WebKit::NetscapePluginX11::paint):
+        (WebKit::initializeXEvent):
+        (WebKit::NetscapePluginX11::handleMouseEvent):
+        (WebKit::NetscapePluginX11::handleWheelEvent):
+        (WebKit::NetscapePluginX11::setFocus):
+        (WebKit::NetscapePluginX11::handleMouseEnterEvent):
+        (WebKit::NetscapePluginX11::handleMouseLeaveEvent):
+        (WebKit::NetscapePluginX11::handleKeyboardEvent):
+        (WebKit::setCommonMouseEventFields): Deleted.
+        (WebKit::setXKeyEventFields): Deleted.
+        * WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h: Added.
+
 2016-02-02  Gyuyoung Kim  <gyuyoung....@webkit.org>
 
         Remove ENABLE(GLOBAL_FASTMALLOC_NEW) guard in WebMemorySamplerLinux.cpp

Modified: trunk/Source/WebKit2/PlatformEfl.cmake (196052 => 196053)


--- trunk/Source/WebKit2/PlatformEfl.cmake	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/PlatformEfl.cmake	2016-02-03 08:18:23 UTC (rev 196053)
@@ -200,6 +200,7 @@
 
     WebProcess/MediaCache/WebMediaKeyStorageManager.cpp
 
+    WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp
     WebProcess/Plugins/Netscape/unix/PluginProxyUnix.cpp
 
     WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp
@@ -273,6 +274,8 @@
     "${WEBKIT2_DIR}/WebProcess/soup"
     "${WEBKIT2_DIR}/WebProcess/unix"
     "${WEBKIT2_DIR}/WebProcess/InjectedBundle/API/efl"
+    "${WEBKIT2_DIR}/WebProcess/Plugins/Netscape/unix"
+    "${WEBKIT2_DIR}/WebProcess/Plugins/Netscape/x11"
     "${WEBKIT2_DIR}/WebProcess/WebCoreSupport/efl"
     "${WEBKIT2_DIR}/WebProcess/WebCoreSupport/soup"
     "${WEBKIT2_DIR}/WebProcess/WebPage/CoordinatedGraphics"

Modified: trunk/Source/WebKit2/PlatformGTK.cmake (196052 => 196053)


--- trunk/Source/WebKit2/PlatformGTK.cmake	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/PlatformGTK.cmake	2016-02-03 08:18:23 UTC (rev 196053)
@@ -338,6 +338,7 @@
 
     WebProcess/MediaCache/WebMediaKeyStorageManager.cpp
 
+    WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp
     WebProcess/Plugins/Netscape/unix/PluginProxyUnix.cpp
 
     WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp
@@ -524,6 +525,8 @@
     "${WEBKIT2_DIR}/UIProcess/gtk"
     "${WEBKIT2_DIR}/UIProcess/soup"
     "${WEBKIT2_DIR}/WebProcess/InjectedBundle/API/gtk"
+    "${WEBKIT2_DIR}/WebProcess/Plugins/Netscape/unix"
+    "${WEBKIT2_DIR}/WebProcess/Plugins/Netscape/x11"
     "${WEBKIT2_DIR}/WebProcess/gtk"
     "${WEBKIT2_DIR}/WebProcess/soup"
     "${WEBKIT2_DIR}/WebProcess/unix"
@@ -793,6 +796,7 @@
         WebProcess/Plugins/Netscape/NetscapePluginNone.cpp
         WebProcess/Plugins/Netscape/NetscapePluginStream.cpp
 
+        WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp
         WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp
 
         ${DERIVED_SOURCES_WEBKIT2_DIR}/PluginControllerProxyMessageReceiver.cpp

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp (196052 => 196053)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp	2016-02-03 08:18:23 UTC (rev 196053)
@@ -1594,12 +1594,6 @@
 {
     g_return_if_fail(WEBKIT_IS_SETTINGS(settings));
 
-#if PLATFORM(WAYLAND)
-    // Do not allow to change this setting in Wayland, since plugins are not supported.
-    if (WebCore::PlatformDisplay::sharedDisplay().type() == WebCore::PlatformDisplay::Type::Wayland)
-        return;
-#endif
-
     WebKitSettingsPrivate* priv = settings->priv;
     bool currentValue = priv->preferences->pluginsEnabled();
     if (currentValue == enabled)

Modified: trunk/Source/WebKit2/UIProcess/gtk/WebPreferencesGtk.cpp (196052 => 196053)


--- trunk/Source/WebKit2/UIProcess/gtk/WebPreferencesGtk.cpp	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebPreferencesGtk.cpp	2016-02-03 08:18:23 UTC (rev 196053)
@@ -39,8 +39,6 @@
         // FIXME: Accelerated compositing under Wayland is not yet supported.
         // https://bugs.webkit.org/show_bug.cgi?id=115803
         setAcceleratedCompositingEnabled(false);
-
-        setPluginsEnabled(false);
     }
 #endif
 #if !ENABLE(OPENGL)

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp (196052 => 196053)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp	2016-02-03 08:18:23 UTC (rev 196053)
@@ -45,6 +45,10 @@
 #include <WebCore/MachSendRight.h>
 #endif
 
+#if PLUGIN_ARCHITECTURE(X11)
+#include <WebCore/PlatformDisplayX11.h>
+#endif
+
 using namespace WebCore;
 
 namespace WebKit {
@@ -524,18 +528,21 @@
             break;
 #endif
 #elif PLUGIN_ARCHITECTURE(X11)
-       case NPNVxDisplay: {
-           if (!npp)
-               return NPERR_GENERIC_ERROR;
-           *reinterpret_cast<Display**>(value) = NetscapePlugin::x11HostDisplay();
-           break;
-       }
-       case NPNVSupportsXEmbedBool:
-           *static_cast<NPBool*>(value) = true;
-           break;
-       case NPNVSupportsWindowless:
-           *static_cast<NPBool*>(value) = true;
-           break;
+        case NPNVxDisplay: {
+            if (!npp)
+                return NPERR_GENERIC_ERROR;
+            auto& display = PlatformDisplay::sharedDisplay();
+            if (display.type() != PlatformDisplay::Type::X11)
+                return NPERR_GENERIC_ERROR;
+            *reinterpret_cast<Display**>(value) = downcast<PlatformDisplayX11>(display).native();
+            break;
+        }
+        case NPNVSupportsXEmbedBool:
+            *static_cast<NPBool*>(value) = PlatformDisplay::sharedDisplay().type() == PlatformDisplay::Type::X11;
+            break;
+        case NPNVSupportsWindowless:
+            *static_cast<NPBool*>(value) = true;
+            break;
 
        case NPNVToolkit: {
            // Gtk based plugins need to be assured about the toolkit version.

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp (196052 => 196053)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp	2016-02-03 08:18:23 UTC (rev 196053)
@@ -42,6 +42,10 @@
 #include <utility>
 #include <wtf/text/CString.h>
 
+#if PLUGIN_ARCHITECTURE(X11)
+#include "NetscapePluginUnix.h"
+#endif
+
 using namespace WebCore;
 
 namespace WebKit {
@@ -90,13 +94,7 @@
     , m_nullEventTimer(RunLoop::main(), this, &NetscapePlugin::nullEventTimerFired)
     , m_npCGContext()
 #endif
-#elif PLUGIN_ARCHITECTURE(X11)
-    , m_drawable(0)
-    , m_pluginDisplay(0)
-#if PLATFORM(GTK)
-    , m_platformPluginWidget(0)
 #endif
-#endif
 {
     m_npp.ndata = this;
     m_npp.pdata = 0;

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h (196052 => 196053)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h	2016-02-03 08:18:23 UTC (rev 196053)
@@ -38,10 +38,6 @@
 #include <wtf/text/CString.h>
 #include <wtf/text/StringHash.h>
 
-#if PLUGIN_ARCHITECTURE(X11)
-#include <WebCore/XUniqueResource.h>
-#endif
-
 namespace WebCore {
 class MachSendRight;
 class HTTPHeaderMap;
@@ -54,7 +50,8 @@
 namespace WebKit {
 
 class NetscapePluginStream;
-    
+class NetscapePluginUnix;
+
 class NetscapePlugin : public Plugin {
 public:
     static RefPtr<NetscapePlugin> create(PassRefPtr<NetscapePluginModule>);
@@ -95,6 +92,12 @@
 
 #endif
 
+#if PLUGIN_ARCHITECTURE(X11)
+    const WebCore::IntRect& frameRectInWindowCoordinates() const { return m_frameRectInWindowCoordinates; }
+#endif
+    const WebCore::IntRect& clipRect() const { return m_clipRect; }
+    const WebCore::IntSize& size() const { return m_pluginSize; }
+
     PluginQuirks quirks() const { return m_pluginModule->pluginQuirks(); }
 
     void invalidate(const NPRect*);
@@ -109,6 +112,8 @@
     bool evaluate(NPObject*, const String&scriptString, NPVariant* result);
     bool isPrivateBrowsingEnabled();
     bool isMuted() const;
+    bool isWindowed() const { return m_isWindowed; }
+    bool isVisible() const { return m_isVisible; }
 
     static void setSetExceptionFunction(void (*)(const String&));
 
@@ -155,6 +160,9 @@
     NPError NPP_GetValue(NPPVariable, void *value);
     NPError NPP_SetValue(NPNVariable, void *value);
 
+    // Convert the given point from plug-in coordinates to root view coordinates.
+    virtual WebCore::IntPoint convertToRootView(const WebCore::IntPoint&) const override;
+
 private:
     NetscapePlugin(PassRefPtr<NetscapePluginModule> pluginModule);
 
@@ -258,9 +266,6 @@
 
     virtual bool supportsSnapshotting() const override;
 
-    // Convert the given point from plug-in coordinates to root view coordinates.
-    virtual WebCore::IntPoint convertToRootView(const WebCore::IntPoint&) const override;
-
     // Convert the given point from root view coordinates to plug-in coordinates. Returns false if the point can't be
     // converted (if the transformation matrix isn't invertible).
     bool convertFromRootView(const WebCore::IntPoint& pointInRootViewCoordinates, WebCore::IntPoint& pointInPluginCoordinates);
@@ -277,11 +282,6 @@
 
     void updateNPNPrivateMode();
 
-#if PLUGIN_ARCHITECTURE(X11)
-    bool platformPostInitializeWindowed(bool needsXEmbed, uint64_t windowID);
-    bool platformPostInitializeWindowless();
-#endif
-
     uint64_t m_nextRequestID;
 
     typedef HashMap<uint64_t, std::pair<String, void*>> PendingURLNotifyMap;
@@ -394,15 +394,8 @@
     NP_CGContext m_npCGContext;
 #endif
 #elif PLUGIN_ARCHITECTURE(X11)
-    WebCore::XUniquePixmap m_drawable;
-    Display* m_pluginDisplay;
-#if PLATFORM(GTK)
-    GtkWidget* m_platformPluginWidget;
+    std::unique_ptr<NetscapePluginUnix> m_impl;
 #endif
-
-public: // Need to call it in the NPN_GetValue browser callback.
-    static Display* x11HostDisplay();
-#endif
 };
 
 } // namespace WebKit

Added: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp (0 => 196053)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp	                        (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.cpp	2016-02-03 08:18:23 UTC (rev 196053)
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "NetscapePlugin.h"
+
+#if PLUGIN_ARCHITECTURE(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#include "NetscapePluginX11.h"
+#include "WebEvent.h"
+#include <WebCore/NotImplemented.h>
+#include <WebCore/PlatformDisplay.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void NetscapePlugin::platformPreInitialize()
+{
+}
+
+bool NetscapePlugin::platformPostInitialize()
+{
+#if PLATFORM(X11)
+    if (PlatformDisplay::sharedDisplay().type() == PlatformDisplay::Type::X11) {
+        m_impl = NetscapePluginX11::create(*this);
+        if (!m_impl)
+            return false;
+    }
+#endif
+
+    if (m_impl) {
+        m_npWindow.type = m_impl->windowType();
+        m_npWindow.window = m_impl->window();
+        m_npWindow.ws_info = m_impl->windowSystemInfo();
+        callSetWindow();
+    }
+
+    return true;
+}
+
+void NetscapePlugin::platformDestroy()
+{
+    m_impl = nullptr;
+}
+
+bool NetscapePlugin::platformInvalidate(const IntRect&)
+{
+    notImplemented();
+    return false;
+}
+
+void NetscapePlugin::platformGeometryDidChange()
+{
+    if (!m_impl)
+        return;
+    m_impl->geometryDidChange();
+}
+
+void NetscapePlugin::platformVisibilityDidChange()
+{
+    if (!m_isWindowed || !m_impl)
+        return;
+
+    m_impl->visibilityDidChange();
+}
+
+void NetscapePlugin::platformPaint(GraphicsContext& context, const IntRect& dirtyRect, bool /*isSnapshot*/)
+{
+    if (m_isWindowed || !m_impl)
+        return;
+
+    if (!m_isStarted) {
+        // FIXME: we should paint a missing plugin icon.
+        return;
+    }
+
+    m_impl->paint(context, dirtyRect);
+}
+
+bool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent& event)
+{
+    if (m_isWindowed || !m_impl)
+        return false;
+
+    if ((event.type() == WebEvent::MouseDown || event.type() == WebEvent::MouseUp)
+        && event.button() == WebMouseEvent::RightButton
+        && quirks().contains(PluginQuirks::IgnoreRightClickInWindowlessMode))
+        return false;
+
+    return m_impl->handleMouseEvent(event);
+}
+
+bool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent& event)
+{
+    if (m_isWindowed || !m_impl)
+        return false;
+
+    return m_impl->handleWheelEvent(event);
+}
+
+void NetscapePlugin::platformSetFocus(bool focusIn)
+{
+    if (m_isWindowed || !m_impl)
+        return;
+
+    m_impl->setFocus(focusIn);
+}
+
+bool NetscapePlugin::wantsPluginRelativeNPWindowCoordinates()
+{
+    return true;
+}
+
+bool NetscapePlugin::platformHandleMouseEnterEvent(const WebMouseEvent& event)
+{
+    if (m_isWindowed || !m_impl)
+        return false;
+
+    return m_impl->handleMouseEnterEvent(event);
+}
+
+bool NetscapePlugin::platformHandleMouseLeaveEvent(const WebMouseEvent& event)
+{
+    if (m_isWindowed || !m_impl)
+        return false;
+
+    return m_impl->handleMouseLeaveEvent(event);
+}
+
+bool NetscapePlugin::platformHandleKeyboardEvent(const WebKeyboardEvent& event)
+{
+    // We don't generate other types of keyboard events via WebEventFactory.
+    ASSERT(event.type() == WebEvent::KeyDown || event.type() == WebEvent::KeyUp);
+
+    if (m_isWindowed || !m_impl)
+        return false;
+
+    return m_impl->handleKeyboardEvent(event);
+}
+
+} // namespace WebKit
+
+#endif // PLUGIN_ARCHITECTURE(X11) && ENABLE(NETSCAPE_PLUGIN_API)

Added: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h (0 => 196053)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h	                        (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/unix/NetscapePluginUnix.h	2016-02-03 08:18:23 UTC (rev 196053)
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NetscapePluginUnix_h
+#define NetscapePluginUnix_h
+
+#if PLUGIN_ARCHITECTURE(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#include <WebCore/npruntime_internal.h>
+
+namespace WebCore {
+class GraphicsContext;
+class IntRect;
+}
+
+namespace WebKit {
+
+class WebKeyboardEvent;
+class WebMouseEvent;
+class WebWheelEvent;
+
+class NetscapePluginUnix {
+public:
+    virtual ~NetscapePluginUnix() { }
+    virtual NPWindowType windowType() const = 0;
+    virtual void* window() const = 0;
+    virtual NPSetWindowCallbackStruct* windowSystemInfo() = 0;
+    virtual void geometryDidChange() = 0;
+    virtual void visibilityDidChange() = 0;
+    virtual void paint(WebCore::GraphicsContext&, const WebCore::IntRect&) = 0;
+    virtual bool handleMouseEvent(const WebMouseEvent&) = 0;
+    virtual bool handleWheelEvent(const WebWheelEvent&) = 0;
+    virtual bool handleMouseEnterEvent(const WebMouseEvent&) = 0;
+    virtual bool handleMouseLeaveEvent(const WebMouseEvent&) = 0;
+    virtual bool handleKeyboardEvent(const WebKeyboardEvent&) = 0;
+    virtual void setFocus(bool) = 0;
+};
+
+} // namespace WebKit
+
+#endif // PLUGIN_ARCHITECTURE(X11) && ENABLE(NETSCAPE_PLUGIN_API)
+
+#endif // NetscapePluginUnix_h

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp (196052 => 196053)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp	2016-02-03 07:01:28 UTC (rev 196052)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.cpp	2016-02-03 08:18:23 UTC (rev 196053)
@@ -25,10 +25,11 @@
  */
 
 #include "config.h"
+#include "NetscapePluginX11.h"
+
 #if PLUGIN_ARCHITECTURE(X11) && ENABLE(NETSCAPE_PLUGIN_API)
 
 #include "NetscapePlugin.h"
-
 #include "PluginController.h"
 #include "WebEvent.h"
 #include <WebCore/GraphicsContext.h>
@@ -57,6 +58,11 @@
 
 namespace WebKit {
 
+static inline Display* x11HostDisplay()
+{
+    return downcast<PlatformDisplayX11>(PlatformDisplay::sharedDisplay()).native();
+}
+
 static Display* getPluginDisplay()
 {
 #if PLATFORM(GTK)
@@ -66,7 +72,7 @@
 #elif PLATFORM(EFL) && defined(HAVE_ECORE_X)
     return static_cast<Display*>(ecore_x_display_get());
 #else
-    return 0;
+    return nullptr;
 #endif
 }
 
@@ -86,7 +92,7 @@
 #if PLATFORM(GTK)
     return gdk_visual_get_depth(gdk_screen_get_system_visual(gdk_screen_get_default()));
 #elif PLATFORM(EFL) && defined(HAVE_ECORE_X)
-    return ecore_x_default_depth_get(NetscapePlugin::x11HostDisplay(), ecore_x_default_screen_get());
+    return ecore_x_default_depth_get(x11HostDisplay(), ecore_x_default_screen_get());
 #else
     return 0;
 #endif
@@ -103,11 +109,6 @@
 #endif
 }
 
-Display* NetscapePlugin::x11HostDisplay()
-{
-    return downcast<PlatformDisplayX11>(PlatformDisplay::sharedDisplay()).native();
-}
-
 #if PLATFORM(GTK)
 static gboolean socketPlugRemovedCallback(GtkSocket*)
 {
@@ -119,181 +120,160 @@
 }
 #endif
 
-bool NetscapePlugin::platformPostInitializeWindowed(bool needsXEmbed, uint64_t windowID)
+std::unique_ptr<NetscapePluginX11> NetscapePluginX11::create(NetscapePlugin& plugin)
 {
-    m_npWindow.type = NPWindowTypeWindow;
-    if (!needsXEmbed) {
+#if PLATFORM(GTK)
+    uint64_t windowID = 0;
+#endif
+    if (plugin.isWindowed()) {
+#if PLATFORM(GTK)
+        // NPPVplugiNeedsXEmbed is a boolean value, but at least the
+        // Flash player plugin is using an 'int' instead.
+        int needsXEmbed = 0;
+        plugin.NPP_GetValue(NPPVpluginNeedsXEmbed, &needsXEmbed);
+        if (needsXEmbed) {
+            windowID = plugin.controller()->createPluginContainer();
+            if (!windowID)
+                return nullptr;
+        } else {
+            notImplemented();
+            return nullptr;
+        }
+#else
         notImplemented();
-        return false;
+        return nullptr;
+#endif
     }
 
-    Display* display = x11HostDisplay();
+    Display* display = getPluginDisplay();
+    if (!display)
+        return nullptr;
 
 #if PLATFORM(GTK)
-    // It seems flash needs the socket to be in the same process,
-    // I guess it uses gdk_window_lookup(), so we create a new socket here
-    // containing a plug with the UI process socket embedded.
-    m_platformPluginWidget = gtk_plug_new(static_cast<Window>(windowID));
-
-    // Hide the GtkPlug on delete-event since we assume the widget is valid while the plugin is active.
-    // platformDestroy() will be called anyway right after the delete-event.
-    g_signal_connect(m_platformPluginWidget, "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr);
-
-    GtkWidget* socket = gtk_socket_new();
-    // Do not show the plug widget until the socket is connected.
-    g_signal_connect_swapped(socket, "plug-added", G_CALLBACK(gtk_widget_show), m_platformPluginWidget);
-    g_signal_connect(socket, "plug-removed", G_CALLBACK(socketPlugRemovedCallback), nullptr);
-    gtk_container_add(GTK_CONTAINER(m_platformPluginWidget), socket);
-    gtk_widget_show(socket);
-
-    m_npWindow.window = GINT_TO_POINTER(gtk_socket_get_id(GTK_SOCKET(socket)));
-    GdkWindow* window = gtk_widget_get_window(socket);
-    NPSetWindowCallbackStruct* callbackStruct = static_cast<NPSetWindowCallbackStruct*>(m_npWindow.ws_info);
-    callbackStruct->display = GDK_WINDOW_XDISPLAY(window);
-    callbackStruct->visual = GDK_VISUAL_XVISUAL(gdk_window_get_visual(window));
-    callbackStruct->depth = gdk_visual_get_depth(gdk_window_get_visual(window));
-    callbackStruct->colormap = XCreateColormap(display, GDK_ROOT_WINDOW(), callbackStruct->visual, AllocNone);
-#else
-    UNUSED_PARAM(windowID);
+    if (plugin.isWindowed())
+        return std::make_unique<NetscapePluginX11>(plugin, display, windowID);
 #endif
 
-    XFlush(display);
-
-    callSetWindow();
-
-    return true;
+    return std::make_unique<NetscapePluginX11>(plugin, display);
 }
 
-bool NetscapePlugin::platformPostInitializeWindowless()
+NetscapePluginX11::NetscapePluginX11(NetscapePlugin& plugin, Display* display)
+    : m_plugin(plugin)
+    , m_pluginDisplay(display)
 {
-    Display* display = x11HostDisplay();
-    m_npWindow.type = NPWindowTypeDrawable;
-    m_npWindow.window = 0;
-
+    Display* hostDisplay = x11HostDisplay();
     int depth = displayDepth();
+    m_setWindowCallbackStruct.display = hostDisplay;
+    m_setWindowCallbackStruct.depth = depth;
 
-    NPSetWindowCallbackStruct* callbackStruct = static_cast<NPSetWindowCallbackStruct*>(m_npWindow.ws_info);
-    callbackStruct->display = display;
-    callbackStruct->depth = depth;
-
     XVisualInfo visualTemplate;
     visualTemplate.screen = x11Screen();
     visualTemplate.depth = depth;
     visualTemplate.c_class = TrueColor;
     int numMatching;
-    XUniquePtr<XVisualInfo> visualInfo(XGetVisualInfo(display, VisualScreenMask | VisualDepthMask | VisualClassMask, &visualTemplate, &numMatching));
+    XUniquePtr<XVisualInfo> visualInfo(XGetVisualInfo(hostDisplay, VisualScreenMask | VisualDepthMask | VisualClassMask, &visualTemplate, &numMatching));
     ASSERT(visualInfo);
     Visual* visual = visualInfo.get()[0].visual;
     ASSERT(visual);
 
-    callbackStruct->visual = visual;
-    callbackStruct->colormap = XCreateColormap(display, rootWindowID(), visual, AllocNone);
-
-    callSetWindow();
-
-    return true;
+    m_setWindowCallbackStruct.visual = visual;
+    m_setWindowCallbackStruct.colormap = XCreateColormap(hostDisplay, rootWindowID(), visual, AllocNone);
 }
 
-void NetscapePlugin::platformPreInitialize()
+#if PLATFORM(GTK)
+NetscapePluginX11::NetscapePluginX11(NetscapePlugin& plugin, Display* display, uint64_t windowID)
+    : m_plugin(plugin)
+    , m_pluginDisplay(display)
+    , m_windowID(windowID)
 {
-}
+    // It seems flash needs the socket to be in the same process,
+    // I guess it uses gdk_window_lookup(), so we create a new socket here
+    // containing a plug with the UI process socket embedded.
+    m_platformPluginWidget = gtk_plug_new(static_cast<Window>(windowID));
 
-bool NetscapePlugin::platformPostInitialize()
-{
-    uint64_t windowID = 0;
-    // NPPVpluginNeedsXEmbed is a boolean value, but at least the
-    // Flash player plugin is using an 'int' instead.
-    int needsXEmbed = 0;
-    if (m_isWindowed) {
-        NPP_GetValue(NPPVpluginNeedsXEmbed, &needsXEmbed);
-        if (needsXEmbed) {
-            windowID = controller()->createPluginContainer();
-            if (!windowID)
-                return false;
-        } else {
-            notImplemented();
-            return false;
-        }
-    }
+    // Hide the GtkPlug on delete-event since we assume the widget is valid while the plugin is active.
+    // platformDestroy() will be called anyway right after the delete-event.
+    g_signal_connect(m_platformPluginWidget, "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr);
 
-    if (!(m_pluginDisplay = getPluginDisplay()))
-        return false;
+    GtkWidget* socket = gtk_socket_new();
+    // Do not show the plug widget until the socket is connected.
+    g_signal_connect_swapped(socket, "plug-added", G_CALLBACK(gtk_widget_show), m_platformPluginWidget);
+    g_signal_connect(socket, "plug-removed", G_CALLBACK(socketPlugRemovedCallback), nullptr);
+    gtk_container_add(GTK_CONTAINER(m_platformPluginWidget), socket);
+    gtk_widget_show(socket);
 
-    NPSetWindowCallbackStruct* callbackStruct = new NPSetWindowCallbackStruct;
-    callbackStruct->type = 0;
-    m_npWindow.ws_info = callbackStruct;
+    Display* hostDisplay = x11HostDisplay();
+    m_npWindowID = gtk_socket_get_id(GTK_SOCKET(socket));
+    GdkWindow* window = gtk_widget_get_window(socket);
+    m_setWindowCallbackStruct.display = GDK_WINDOW_XDISPLAY(window);
+    m_setWindowCallbackStruct.visual = GDK_VISUAL_XVISUAL(gdk_window_get_visual(window));
+    m_setWindowCallbackStruct.depth = gdk_visual_get_depth(gdk_window_get_visual(window));
+    m_setWindowCallbackStruct.colormap = XCreateColormap(hostDisplay, GDK_ROOT_WINDOW(), m_setWindowCallbackStruct.visual, AllocNone);
 
-    if (m_isWindowed)
-        return platformPostInitializeWindowed(needsXEmbed, windowID);
-
-    return platformPostInitializeWindowless();
+    XFlush(hostDisplay);
 }
+#endif
 
-void NetscapePlugin::platformDestroy()
+NetscapePluginX11::~NetscapePluginX11()
 {
-    NPSetWindowCallbackStruct* callbackStruct = static_cast<NPSetWindowCallbackStruct*>(m_npWindow.ws_info);
-    Display* hostDisplay = x11HostDisplay();
-    XFreeColormap(hostDisplay, callbackStruct->colormap);
-    delete callbackStruct;
+    XFreeColormap(x11HostDisplay(), m_setWindowCallbackStruct.colormap);
 
     m_drawable.reset();
 
 #if PLATFORM(GTK)
-    if (m_platformPluginWidget) {
+    if (m_platformPluginWidget)
         gtk_widget_destroy(m_platformPluginWidget);
-        m_platformPluginWidget = 0;
-    }
 #endif
 }
 
-bool NetscapePlugin::platformInvalidate(const IntRect&)
+NPWindowType NetscapePluginX11::windowType() const
 {
-    notImplemented();
-    return false;
+    return m_plugin.isWindowed() ? NPWindowTypeWindow : NPWindowTypeDrawable;
 }
 
-void NetscapePlugin::platformGeometryDidChange()
+void* NetscapePluginX11::window() const
 {
-    if (m_isWindowed) {
+#if PLATFORM(GTK)
+    return m_plugin.isWindowed() ? GINT_TO_POINTER(m_npWindowID) : nullptr;
+#else
+    return nullptr;
+#endif
+}
+
+void NetscapePluginX11::geometryDidChange()
+{
+    if (m_plugin.isWindowed()) {
         uint64_t windowID = 0;
 #if PLATFORM(GTK)
         windowID = static_cast<uint64_t>(GDK_WINDOW_XID(gtk_plug_get_socket_window(GTK_PLUG(m_platformPluginWidget))));
 #endif
-        controller()->windowedPluginGeometryDidChange(m_frameRectInWindowCoordinates, m_clipRect, windowID);
+        m_plugin.controller()->windowedPluginGeometryDidChange(m_plugin.frameRectInWindowCoordinates(), m_plugin.clipRect(), windowID);
         return;
     }
 
     m_drawable.reset();
-    if (m_pluginSize.isEmpty())
+    if (m_plugin.size().isEmpty())
         return;
 
-    m_drawable = XCreatePixmap(x11HostDisplay(), rootWindowID(), m_pluginSize.width(), m_pluginSize.height(), displayDepth());
+    m_drawable = XCreatePixmap(x11HostDisplay(), rootWindowID(), m_plugin.size().width(), m_plugin.size().height(), displayDepth());
     XSync(x11HostDisplay(), false); // Make sure that the server knows about the Drawable.
 }
 
-void NetscapePlugin::platformVisibilityDidChange()
+void NetscapePluginX11::visibilityDidChange()
 {
-    if (!m_isWindowed)
-        return;
-
+    ASSERT(m_plugin.isWindowed());
     uint64_t windowID = 0;
 #if PLATFORM(GTK)
     windowID = static_cast<uint64_t>(GDK_WINDOW_XID(gtk_plug_get_socket_window(GTK_PLUG(m_platformPluginWidget))));
 #endif
-    controller()->windowedPluginVisibilityDidChange(m_isVisible, windowID);
-    controller()->windowedPluginGeometryDidChange(m_frameRectInWindowCoordinates, m_clipRect, windowID);
+    m_plugin.controller()->windowedPluginVisibilityDidChange(m_plugin.isVisible(), windowID);
+    m_plugin.controller()->windowedPluginGeometryDidChange(m_plugin.frameRectInWindowCoordinates(), m_plugin.clipRect(), windowID);
 }
 
-void NetscapePlugin::platformPaint(GraphicsContext& context, const IntRect& dirtyRect, bool /*isSnapshot*/)
+void NetscapePluginX11::paint(GraphicsContext& context, const IntRect& dirtyRect)
 {
-    if (m_isWindowed)
-        return;
+    ASSERT(m_plugin.isWindowed());
 
-    if (!m_isStarted) {
-        // FIXME: we should paint a missing plugin icon.
-        return;
-    }
-
     if (context.paintingDisabled() || !m_drawable)
         return;
 
@@ -313,14 +293,14 @@
     exposeEvent.width = exposedRect.width();
     exposeEvent.height = exposedRect.height();
 
-    NPP_HandleEvent(&xevent);
+    m_plugin.NPP_HandleEvent(&xevent);
 
     if (m_pluginDisplay != x11HostDisplay())
         XSync(m_pluginDisplay, false);
 
 #if PLATFORM(GTK) || (PLATFORM(EFL) && USE(CAIRO))
     RefPtr<cairo_surface_t> drawableSurface = adoptRef(cairo_xlib_surface_create(m_pluginDisplay, m_drawable.get(),
-        static_cast<NPSetWindowCallbackStruct*>(m_npWindow.ws_info)->visual, m_pluginSize.width(), m_pluginSize.height()));
+        m_setWindowCallbackStruct.visual, m_plugin.size().width(), m_plugin.size().height()));
     cairo_t* cr = context.platformContext()->cr();
     cairo_save(cr);
 
@@ -342,7 +322,7 @@
     memset(&event, 0, sizeof(XEvent));
     event.xany.serial = 0;
     event.xany.send_event = false;
-    event.xany.display = NetscapePlugin::x11HostDisplay();
+    event.xany.display = x11HostDisplay();
     event.xany.window = 0;
 }
 
@@ -440,26 +420,20 @@
     xCrossing.focus = false;
 }
 
-bool NetscapePlugin::platformHandleMouseEvent(const WebMouseEvent& event)
+bool NetscapePluginX11::handleMouseEvent(const WebMouseEvent& event)
 {
-    if (m_isWindowed)
-        return false;
+    ASSERT(m_plugin.isWindowed());
 
-    if ((event.type() == WebEvent::MouseDown || event.type() == WebEvent::MouseUp)
-         && event.button() == WebMouseEvent::RightButton
-         && quirks().contains(PluginQuirks::IgnoreRightClickInWindowlessMode))
-        return false;
-
     XEvent xEvent;
     initializeXEvent(xEvent);
 
     switch (event.type()) {
     case WebEvent::MouseDown:
     case WebEvent::MouseUp:
-        setXButtonEventFields(xEvent, event, convertToRootView(IntPoint()));
+        setXButtonEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()));
         break;
     case WebEvent::MouseMove:
-        setXMotionEventFields(xEvent, event, convertToRootView(IntPoint()));
+        setXMotionEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()));
         break;
     case WebEvent::MouseForceChanged:
     case WebEvent::MouseForceDown:
@@ -479,7 +453,7 @@
         return false;
     }
 
-    return !NPP_HandleEvent(&xEvent);
+    return !m_plugin.NPP_HandleEvent(&xEvent);
 }
 
 // We undefine these constants in npruntime_internal.h to avoid collision
@@ -489,22 +463,20 @@
 const int kFocusInType = 9;
 const int kFocusOutType = 10;
 
-bool NetscapePlugin::platformHandleWheelEvent(const WebWheelEvent& event)
+bool NetscapePluginX11::handleWheelEvent(const WebWheelEvent& event)
 {
-    if (m_isWindowed)
-        return false;
+    ASSERT(m_plugin.isWindowed());
 
     XEvent xEvent;
     initializeXEvent(xEvent);
-    setXButtonEventFieldsByWebWheelEvent(xEvent, event, convertToRootView(IntPoint()));
+    setXButtonEventFieldsByWebWheelEvent(xEvent, event, m_plugin.convertToRootView(IntPoint()));
 
-    return !NPP_HandleEvent(&xEvent);
+    return !m_plugin.NPP_HandleEvent(&xEvent);
 }
 
-void NetscapePlugin::platformSetFocus(bool focusIn)
+void NetscapePluginX11::setFocus(bool focusIn)
 {
-    if (m_isWindowed)
-        return;
+    ASSERT(m_plugin.isWindowed());
 
     XEvent xEvent;
     initializeXEvent(xEvent);
@@ -513,36 +485,29 @@
     focusEvent.mode = NotifyNormal;
     focusEvent.detail = NotifyDetailNone;
 
-    NPP_HandleEvent(&xEvent);
+    m_plugin.NPP_HandleEvent(&xEvent);
 }
 
-bool NetscapePlugin::wantsPluginRelativeNPWindowCoordinates()
+bool NetscapePluginX11::handleMouseEnterEvent(const WebMouseEvent& event)
 {
-    return true;
-}
+    ASSERT(m_plugin.isWindowed());
 
-bool NetscapePlugin::platformHandleMouseEnterEvent(const WebMouseEvent& event)
-{
-    if (m_isWindowed)
-        return false;
-
     XEvent xEvent;
     initializeXEvent(xEvent);
-    setXCrossingEventFields(xEvent, event, convertToRootView(IntPoint()), EnterNotify);
+    setXCrossingEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()), EnterNotify);
 
-    return !NPP_HandleEvent(&xEvent);
+    return !m_plugin.NPP_HandleEvent(&xEvent);
 }
 
-bool NetscapePlugin::platformHandleMouseLeaveEvent(const WebMouseEvent& event)
+bool NetscapePluginX11::handleMouseLeaveEvent(const WebMouseEvent& event)
 {
-    if (m_isWindowed)
-        return false;
+    ASSERT(m_plugin.isWindowed());
 
     XEvent xEvent;
     initializeXEvent(xEvent);
-    setXCrossingEventFields(xEvent, event, convertToRootView(IntPoint()), LeaveNotify);
+    setXCrossingEventFields(xEvent, event, m_plugin.convertToRootView(IntPoint()), LeaveNotify);
 
-    return !NPP_HandleEvent(&xEvent);
+    return !m_plugin.NPP_HandleEvent(&xEvent);
 }
 
 static inline void setXKeyEventFields(XEvent& xEvent, const WebKeyboardEvent& webEvent)
@@ -565,8 +530,9 @@
     xKey.y_root = 0;
 }
 
-bool NetscapePlugin::platformHandleKeyboardEvent(const WebKeyboardEvent& event)
+bool NetscapePluginX11::handleKeyboardEvent(const WebKeyboardEvent& event)
 {
+    ASSERT(m_plugin.isWindowed());
     // We don't generate other types of keyboard events via WebEventFactory.
     ASSERT(event.type() == WebEvent::KeyDown || event.type() == WebEvent::KeyUp);
 
@@ -574,7 +540,7 @@
     initializeXEvent(xEvent);
     setXKeyEventFields(xEvent, event);
 
-    return !NPP_HandleEvent(&xEvent);
+    return !m_plugin.NPP_HandleEvent(&xEvent);
 }
 
 } // namespace WebKit

Added: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h (0 => 196053)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h	                        (rev 0)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/x11/NetscapePluginX11.h	2016-02-03 08:18:23 UTC (rev 196053)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 University of Szeged
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NetscapePluginX11_h
+#define NetscapePluginX11_h
+
+#if PLUGIN_ARCHITECTURE(X11)
+
+#include "NetscapePluginUnix.h"
+#include <WebCore/XUniqueResource.h>
+
+namespace WebKit {
+
+class NetscapePlugin;
+
+class NetscapePluginX11 final : public NetscapePluginUnix {
+public:
+    static std::unique_ptr<NetscapePluginX11> create(NetscapePlugin&);
+    NetscapePluginX11(NetscapePlugin&, Display*);
+#if PLATFORM(GTK)
+    NetscapePluginX11(NetscapePlugin&, Display*, uint64_t windowID);
+#endif
+    virtual ~NetscapePluginX11();
+
+private:
+    virtual NPWindowType windowType() const override;
+    virtual void* window() const override;
+    virtual NPSetWindowCallbackStruct* windowSystemInfo() override { return &m_setWindowCallbackStruct; }
+    virtual void geometryDidChange() override;
+    virtual void visibilityDidChange() override;
+    virtual void paint(WebCore::GraphicsContext&, const WebCore::IntRect&) override;
+    virtual bool handleMouseEvent(const WebMouseEvent&) override;
+    virtual bool handleWheelEvent(const WebWheelEvent&) override;
+    virtual bool handleMouseEnterEvent(const WebMouseEvent&) override;
+    virtual bool handleMouseLeaveEvent(const WebMouseEvent&) override;
+    virtual bool handleKeyboardEvent(const WebKeyboardEvent&) override;
+    virtual void setFocus(bool) override;
+
+    NetscapePlugin& m_plugin;
+    Display* m_pluginDisplay { nullptr };
+    WebCore::XUniquePixmap m_drawable;
+    NPSetWindowCallbackStruct m_setWindowCallbackStruct;
+#if PLATFORM(GTK)
+    uint64_t m_windowID { 0 };
+    unsigned long m_npWindowID { 0 };
+    GtkWidget* m_platformPluginWidget { nullptr };
+#endif
+};
+} // namespace WebKit
+
+#endif // PLUGIN_ARCHITECTURE(X11)
+
+#endif // NetscapePluginX11_h
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to