2011-03-01 Balazs Kelemen <kbalazs@webkit.org>
authorkbalazs@webkit.org <kbalazs@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Mar 2011 17:47:11 +0000 (17:47 +0000)
committerkbalazs@webkit.org <kbalazs@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Mar 2011 17:47:11 +0000 (17:47 +0000)
        Reviewed by Anders Carlsson.

        [Qt][WK2] Plugin initialization
        https://bugs.webkit.org/show_bug.cgi?id=48127

        Apply the quirks that are necessary for the flash plugin
        to not crash on X11.

        * Platform/qt/ModuleQt.cpp:
        (WebKit::Module::load): Use the ResolveAllSymbols hint as we do in WebCore.
        * Shared/Plugins/Netscape/NetscapePluginModule.cpp:
        (WebKit::NetscapePluginModule::tryLoad): Call applyX11QuirksBeforeLoad
        if PLUGIN_ARCHITECTURE is X11.
        * Shared/Plugins/Netscape/NetscapePluginModule.h:
        * Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp:
        (WebKit::initializeGTK):  The same hack that we do in WebCore.
        Call gtk_init because flash don't do it for itself.
        (WebKit::NetscapePluginModule::applyX11QuirksBeforeLoad): Added for X11.
        Do the hacks that we need to do before calling NP_Initialize on the
        flash plugin to save it form crashing.
        * Shared/Plugins/PluginQuirks.h: Use PLUGIN_ARCHITECTURE macros.
        Added RequiresGTKToolKit quirk for X11.
        * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
        (WebKit::NPN_GetValue): Handle the RequiresGTKToolKit quirk on X11.
        * WebProcess/Plugins/Netscape/NetscapePlugin.h:
        (WebKit::NetscapePlugin::quirks): Added getter for the PluginModule's
        quirks to be available in NPN_GetValue.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@80007 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Platform/qt/ModuleQt.cpp
Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.cpp
Source/WebKit2/Shared/Plugins/Netscape/NetscapePluginModule.h
Source/WebKit2/Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp
Source/WebKit2/Shared/Plugins/PluginQuirks.h
Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp
Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h

index 4dd6997..5177931 100644 (file)
@@ -1,3 +1,33 @@
+2011-03-01  Balazs Kelemen  <kbalazs@webkit.org>
+
+        Reviewed by Anders Carlsson.
+
+        [Qt][WK2] Plugin initialization
+        https://bugs.webkit.org/show_bug.cgi?id=48127
+
+        Apply the quirks that are necessary for the flash plugin
+        to not crash on X11.
+
+        * Platform/qt/ModuleQt.cpp:
+        (WebKit::Module::load): Use the ResolveAllSymbols hint as we do in WebCore.
+        * Shared/Plugins/Netscape/NetscapePluginModule.cpp:
+        (WebKit::NetscapePluginModule::tryLoad): Call applyX11QuirksBeforeLoad
+        if PLUGIN_ARCHITECTURE is X11.
+        * Shared/Plugins/Netscape/NetscapePluginModule.h:
+        * Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp:
+        (WebKit::initializeGTK):  The same hack that we do in WebCore.
+        Call gtk_init because flash don't do it for itself.
+        (WebKit::NetscapePluginModule::applyX11QuirksBeforeLoad): Added for X11.
+        Do the hacks that we need to do before calling NP_Initialize on the
+        flash plugin to save it form crashing.
+        * Shared/Plugins/PluginQuirks.h: Use PLUGIN_ARCHITECTURE macros.
+        Added RequiresGTKToolKit quirk for X11.
+        * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
+        (WebKit::NPN_GetValue): Handle the RequiresGTKToolKit quirk on X11.
+        * WebProcess/Plugins/Netscape/NetscapePlugin.h:
+        (WebKit::NetscapePlugin::quirks): Added getter for the PluginModule's
+        quirks to be available in NPN_GetValue.
+
 2011-03-01  Adam Roben  <aroben@apple.com>
 
         Convert seconds to milliseconds before calling ::SetTimer
index de83691..98815a2 100644 (file)
@@ -32,6 +32,7 @@ namespace WebKit {
 bool Module::load()
 {
     m_lib.setFileName(static_cast<QString>(m_path));
+    m_lib.setLoadHints(QLibrary::ResolveAllSymbolsHint);
     return m_lib.load();
 }
 
index e574e18..e7ddb63 100644 (file)
@@ -210,6 +210,10 @@ bool NetscapePluginModule::load()
 
 bool NetscapePluginModule::tryLoad()
 {
+#if PLUGIN_ARCHITECTURE(X11)
+    applyX11QuirksBeforeLoad();
+#endif
+
     m_module = adoptPtr(new Module(m_pluginPath));
     if (!m_module->load())
         return false;
index 24b9e40..aee26bb 100644 (file)
@@ -64,6 +64,10 @@ private:
 
     void determineQuirks();
 
+#if PLUGIN_ARCHITECTURE(X11)
+    void applyX11QuirksBeforeLoad();
+#endif
+
     void incrementLoadCount();
     void decrementLoadCount();
 
index a651d3b..b5e3aad 100644 (file)
 #include "PluginDatabase.h"
 #include "PluginPackage.h"
 
+#if PLATFORM(QT)
+#include <QLibrary>
+#endif
+
 using namespace WebCore;
 
 namespace WebKit {
 
+#if PLATFORM(QT)
+static void initializeGTK()
+{
+    QLibrary library("libgtk-x11-2.0.so.0");
+    if (library.load()) {
+        typedef void *(*gtk_init_check_ptr)(int*, char***);
+        gtk_init_check_ptr gtkInitCheck = reinterpret_cast<gtk_init_check_ptr>(library.resolve("gtk_init_check"));
+        // NOTE: We're using gtk_init_check() since gtk_init() calls exit() on failure.
+        if (gtkInitCheck)
+            (void) gtkInitCheck(0, 0);
+    }
+}
+#endif
+
+void NetscapePluginModule::applyX11QuirksBeforeLoad()
+{
+#if PLATFORM(QT)
+    if (m_pluginPath.contains("npwrapper") || m_pluginPath.contains("flashplayer")) {
+        initializeGTK();
+        m_pluginQuirks.add(PluginQuirks::RequiresGTKToolKit);
+    }
+#endif
+}
+
 bool NetscapePluginModule::getPluginInfo(const String& pluginPath, PluginInfoStore::Plugin& plugin)
 {
     // We are loading the plugin here since it does not seem to be a standardized way to
index 68d894a..9f8c1c4 100644 (file)
@@ -32,12 +32,17 @@ class PluginQuirks {
 public:
     enum PluginQuirk {
         // Mac specific quirks:
-#if PLATFORM(MAC)
+#if PLUGIN_ARCHITECTURE(MAC)
         // The plug-in wants the call to getprogame() to return "WebKitPluginHost".
         // Adobe Flash Will not handle key down events otherwise.
         PrognameShouldBeWebKitPluginHost,
         // Supports receiving a paint event, even when using CoreAnimation rendering.
         SupportsSnapshotting,
+#elif PLUGIN_ARCHITECTURE(X11)
+        // Flash and npwrapper ask the browser about which GTK version does it use
+        // and refuse to load and work if it is not GTK 2 so we need to fake it in
+        // NPN_GetValue even when it is a lie.
+        RequiresGTKToolKit,
 #endif
         NumPluginQuirks
     };
index 9a528d0..679de6f 100644 (file)
@@ -483,6 +483,18 @@ static NPError NPN_GetValue(NPP npp, NPNVariable variable, void *value)
        case NPNVSupportsWindowless:
            *(NPBool*)value = true;
            break;
+#elif PLUGIN_ARCHITECTURE(X11)
+       case NPNVToolkit: {
+           const uint32_t expectedGTKToolKitVersion = 2;
+
+           RefPtr<NetscapePlugin> plugin = NetscapePlugin::fromNPP(npp);
+           if (plugin->quirks().contains(PluginQuirks::RequiresGTKToolKit)) {
+               *reinterpret_cast<uint32_t*>(value) = expectedGTKToolKitVersion;
+               break;
+           }
+
+           return NPERR_GENERIC_ERROR;
+       }
 #endif
         default:
             notImplemented();
index e16823c..e865d93 100644 (file)
@@ -70,6 +70,8 @@ public:
     HWND containingWindow() const;
 #endif
 
+    PluginQuirks quirks() const { return m_pluginModule->pluginQuirks(); }
+
     void invalidate(const NPRect*);
     static const char* userAgent(NPP);
     void loadURL(const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields,