2008-11-05 Simon Hausmann <hausmann@webkit.org>
authorhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Nov 2008 15:31:10 +0000 (15:31 +0000)
committerhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Nov 2008 15:31:10 +0000 (15:31 +0000)
        Reviewed by Tor Arne Vestbø

        Unify determineQuirks between the Qt and the Gtk PluginPackage.
        Share the code for parsing the module version from the description.
        This is currently used to determine Flash based quirks.

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

WebCore/ChangeLog
WebCore/plugins/PluginPackage.cpp
WebCore/plugins/PluginPackage.h
WebCore/plugins/gtk/PluginPackageGtk.cpp
WebCore/plugins/qt/PluginPackageQt.cpp

index 8db466f..8ff445f 100644 (file)
@@ -1,3 +1,21 @@
+2008-11-05  Simon Hausmann  <hausmann@webkit.org>
+
+        Reviewed by Tor Arne Vestbø
+
+        Unify determineQuirks between the Qt and the Gtk PluginPackage.
+        Share the code for parsing the module version from the description.
+        This is currently used to determine Flash based quirks.
+
+        * plugins/PluginPackage.cpp:
+        (WebCore::PluginPackage::createPackage):
+        (WebCore::PluginPackage::determineQuirks):
+        (WebCore::PluginPackage::determineModuleVersionFromDescription):
+        * plugins/PluginPackage.h:
+        * plugins/gtk/PluginPackageGtk.cpp:
+        (WebCore::PluginPackage::fetchInfo):
+        * plugins/qt/PluginPackageQt.cpp:
+        (WebCore::PluginPackage::fetchInfo):
+
 2008-11-04  Cameron Zwarich  <zwarich@apple.com>
 
         Rubber-stamped by Sam Weinig.
index e7f43a5..f88cc7c 100644 (file)
@@ -148,8 +148,88 @@ PassRefPtr<PluginPackage> PluginPackage::createPackage(const String& path, const
 
     if (!package->fetchInfo())
         return 0;
-    
+
     return package.release();
 }
 
+#if defined(XP_UNIX)
+void PluginPackage::determineQuirks(const String& mimeType)
+{
+    if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) {
+        // Because a single process cannot create multiple VMs, and we cannot reliably unload a
+        // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM
+        m_quirks.add(PluginQuirkDontUnloadPlugin);
+
+        // Setting the window region to an empty region causes bad scrolling repaint problems
+        // with the Java plug-in.
+        m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling);
+        return;
+    }
+
+    if (mimeType == "application/x-shockwave-flash") {
+        static const PlatformModuleVersion flashTenVersion(0x0a000000);
+
+        if (compareFileVersion(flashTenVersion) >= 0) {
+            // Flash 10.0 b218 doesn't like having a NULL window handle
+            m_quirks.add(PluginQuirkDontSetNullWindowHandleOnDestroy);
+        } else {
+            // Flash 9 and older requests windowless plugins if we return a mozilla user agent
+            m_quirks.add(PluginQuirkWantsMozillaUserAgent);
+        }
+
+        m_quirks.add(PluginQuirkThrottleInvalidate);
+        m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages);
+        m_quirks.add(PluginQuirkFlashURLNotifyBug);
+    }
+}
+#endif
+
+void PluginPackage::determineModuleVersionFromDescription()
+{
+    // It's a bit lame to detect the plugin version by parsing it
+    // from the plugin description string, but it doesn't seem that
+    // version information is available in any standardized way at
+    // the module level, like in Windows
+
+    if (m_description.isEmpty())
+        return;
+
+    if (m_description.startsWith("Shockwave Flash") && m_description.length() >= 19) {
+        // The flash version as a PlatformModuleVersion differs on Unix from Windows
+        // since the revision can be larger than a 8 bits, so we allow it 16 here and
+        // push the major/minor up 8 bits. Thus on Unix, Flash's version may be
+        // 0x0a000000 instead of 0x000a0000.
+
+        Vector<String> versionParts;
+        m_description.substring(16).split(' ', /*allowEmptyEntries =*/ false, versionParts);
+        if (versionParts.isEmpty())
+            return;
+
+        if (versionParts.size() >= 1) {
+            Vector<String> majorMinorParts;
+            versionParts[0].split('.', majorMinorParts);
+            if (majorMinorParts.size() >= 1) {
+                bool converted = false;
+                unsigned major = majorMinorParts[0].toUInt(&converted);
+                if (converted)
+                    m_moduleVersion = (major & 0xff) << 24;
+            }
+            if (majorMinorParts.size() == 2) {
+                bool converted = false;
+                unsigned minor = majorMinorParts[1].toUInt(&converted);
+                if (converted)
+                    m_moduleVersion |= (minor & 0xff) << 16;
+            }
+        }
+
+        if (versionParts.size() >= 2) {
+            String revision = versionParts[1];
+            if (revision.length() > 1 && (revision[0] == 'r' || revision[0] == 'b')) {
+                revision.remove(0, 1);
+                m_moduleVersion |= revision.toInt() & 0xffff;
+            }
+        }
+    }
+}
+
 }
index bdf2daa..707eb25 100644 (file)
@@ -74,6 +74,8 @@ namespace WebCore {
         bool isPluginBlacklisted();
         void determineQuirks(const String& mimeType);
 
+        void determineModuleVersionFromDescription();
+
         bool m_isLoaded;
         int m_loadCount;
 
index 5a097b2..0d0a45a 100644 (file)
@@ -80,36 +80,6 @@ static PlatformModuleVersion getModuleVersion(const char *description)
     return version;
 }
 
-void PluginPackage::determineQuirks(const String& mimeType)
-{
-    if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) {
-        // Because a single process cannot create multiple VMs, and we cannot reliably unload a
-        // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM
-        m_quirks.add(PluginQuirkDontUnloadPlugin);
-
-        // Setting the window region to an empty region causes bad scrolling repaint problems
-        // with the Java plug-in.
-        m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling);
-        return;
-    }
-    
-    if (mimeType == "application/x-shockwave-flash") {
-        static const PlatformModuleVersion flashTenVersion(0x0a000000);
-
-        if (compareFileVersion(flashTenVersion) >= 0) {
-            // Flash 10.0 b218 doesn't like having a NULL window handle
-            m_quirks.add(PluginQuirkDontSetNullWindowHandleOnDestroy);
-        } else {
-            // Flash 9 and older requests windowless plugins if we return a mozilla user agent
-            m_quirks.add(PluginQuirkWantsMozillaUserAgent);
-        }
-
-        m_quirks.add(PluginQuirkThrottleInvalidate);
-        m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages);
-        m_quirks.add(PluginQuirkFlashURLNotifyBug);
-    }
-}
-
 bool PluginPackage::fetchInfo()
 {
 #if defined(XP_UNIX)
@@ -131,7 +101,7 @@ bool PluginPackage::fetchInfo()
     err = NPP_GetValue(0, NPPVpluginDescriptionString, &buffer);
     if (err == NPERR_NO_ERROR) {
         m_description = buffer;
-        m_moduleVersion = getModuleVersion(buffer); 
+        determineModuleVersionFromDescription();
     }
 
     const gchar* types = NP_GetMIMEDescription();
index 423c4e1..b7fa812 100644 (file)
 
 namespace WebCore {
 
-void PluginPackage::determineQuirks(const String& mimeType)
-{
-    if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) {
-        // Because a single process cannot create multiple VMs, and we cannot reliably unload a
-        // Java VM, we cannot unload the Java plugin, or we'll lose reference to our only VM
-        m_quirks.add(PluginQuirkDontUnloadPlugin);
-
-        // Setting the window region to an empty region causes bad scrolling repaint problems
-        // with the Java plug-in.
-        m_quirks.add(PluginQuirkDontClipToZeroRectWhenScrolling);
-    }
-    
-    if (mimeType == "application/x-shockwave-flash") {
-        // The flash plugin only requests windowless plugins if we return a mozilla user agent
-        m_quirks.add(PluginQuirkWantsMozillaUserAgent);
-        m_quirks.add(PluginQuirkThrottleInvalidate);
-        m_quirks.add(PluginQuirkThrottleWMUserPlusOneMessages);
-        m_quirks.add(PluginQuirkFlashURLNotifyBug);
-    }
-
-}
-
 bool PluginPackage::fetchInfo()
 {
     if (!load())
@@ -81,6 +59,7 @@ bool PluginPackage::fetchInfo()
         return false;
     }
     m_description = buf;
+    determineModuleVersionFromDescription();
 
     String s = gm();
     Vector<String> types;