Implement PluginInfoStore::shouldUsePlugin on Windows
authoraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 5 Nov 2010 18:15:26 +0000 (18:15 +0000)
committeraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 5 Nov 2010 18:15:26 +0000 (18:15 +0000)
Fixes <http://webkit.org/b/43509> <rdar://problem/8273822> WebKit2
should refuse to load the same plugins that old-WebKit refuses to load

Reviewed by Anders Carlsson.

* UIProcess/Plugins/win/PluginInfoStoreWin.cpp:
(WebKit::fileVersion): Helper function to construct a 64-bit file
version from two 32-bit numbers.
(WebKit::PluginInfoStore::getPluginInfo): Ported code from
WebCore::PluginPackage::fetchInfo to get the plugin's version. We now
store it in Plugin::fileVersion.

(WebKit::isOldWindowsMediaPlayerPlugin):
(WebKit::isNewWindowsMediaPlayerPlugin):
Added these helpers. The code came from
WebCore::PluginDatabase::getPluginPathsInDirectories.

(WebKit::PluginInfoStore::shouldUsePlugin): Implemented. The code was
ported from WebCore::PluginDatabase::getPluginPathsInDirectories and
WebCore::PluginPackage::isPluginBlacklisted.

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

WebKit2/ChangeLog
WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp

index 6665c50..d5d0474 100644 (file)
@@ -1,5 +1,30 @@
 2010-11-05  Adam Roben  <aroben@apple.com>
 
 2010-11-05  Adam Roben  <aroben@apple.com>
 
+        Implement PluginInfoStore::shouldUsePlugin on Windows
+
+        Fixes <http://webkit.org/b/43509> <rdar://problem/8273822> WebKit2
+        should refuse to load the same plugins that old-WebKit refuses to load
+
+        Reviewed by Anders Carlsson.
+
+        * UIProcess/Plugins/win/PluginInfoStoreWin.cpp:
+        (WebKit::fileVersion): Helper function to construct a 64-bit file
+        version from two 32-bit numbers.
+        (WebKit::PluginInfoStore::getPluginInfo): Ported code from
+        WebCore::PluginPackage::fetchInfo to get the plugin's version. We now
+        store it in Plugin::fileVersion.
+
+        (WebKit::isOldWindowsMediaPlayerPlugin):
+        (WebKit::isNewWindowsMediaPlayerPlugin):
+        Added these helpers. The code came from
+        WebCore::PluginDatabase::getPluginPathsInDirectories.
+
+        (WebKit::PluginInfoStore::shouldUsePlugin): Implemented. The code was
+        ported from WebCore::PluginDatabase::getPluginPathsInDirectories and
+        WebCore::PluginPackage::isPluginBlacklisted.
+
+2010-11-05  Adam Roben  <aroben@apple.com>
+
         Operate on m_plugins directly in PluginInfoStore::shouldUsePlugin
 
         We'll need to operate on m_plugins if we ever want to unload an
         Operate on m_plugins directly in PluginInfoStore::shouldUsePlugin
 
         We'll need to operate on m_plugins if we ever want to unload an
index 8eb860e..fe7d896 100644 (file)
@@ -352,6 +352,14 @@ static String getVersionInfo(const LPVOID versionInfoData, const String& info)
     return String(reinterpret_cast<UChar*>(buffer), bufferLength - 1);
 }
 
     return String(reinterpret_cast<UChar*>(buffer), bufferLength - 1);
 }
 
+static uint64_t fileVersion(DWORD leastSignificant, DWORD mostSignificant)
+{
+    ULARGE_INTEGER version;
+    version.LowPart = leastSignificant;
+    version.HighPart = mostSignificant;
+    return version.QuadPart;
+}
+
 bool PluginInfoStore::getPluginInfo(const String& pluginPath, Plugin& plugin)
 {
     String pathCopy = pluginPath;
 bool PluginInfoStore::getPluginInfo(const String& pluginPath, Plugin& plugin)
 {
     String pathCopy = pluginPath;
@@ -368,6 +376,11 @@ bool PluginInfoStore::getPluginInfo(const String& pluginPath, Plugin& plugin)
     if (name.isNull() || description.isNull())
         return false;
 
     if (name.isNull() || description.isNull())
         return false;
 
+    VS_FIXEDFILEINFO* info;
+    UINT infoSize;
+    if (!::VerQueryValueW(versionInfoData.get(), L"\\", reinterpret_cast<void**>(&info), &infoSize) || infoSize < sizeof(VS_FIXEDFILEINFO))
+        return false;
+
     Vector<String> types;
     getVersionInfo(versionInfoData.get(), "MIMEType").split('|', types);
     Vector<String> extensionLists;
     Vector<String> types;
     getVersionInfo(versionInfoData.get(), "MIMEType").split('|', types);
     Vector<String> extensionLists;
@@ -403,14 +416,72 @@ bool PluginInfoStore::getPluginInfo(const String& pluginPath, Plugin& plugin)
     plugin.info.name = name;
     plugin.info.file = pathGetFileName(pluginPath);
     plugin.info.mimes.swap(mimes);
     plugin.info.name = name;
     plugin.info.file = pathGetFileName(pluginPath);
     plugin.info.mimes.swap(mimes);
+    plugin.fileVersion = fileVersion(info->dwFileVersionLS, info->dwFileVersionMS);
+
     return true;
 }
 
     return true;
 }
 
+static bool isOldWindowsMediaPlayerPlugin(const PluginInfoStore::Plugin& plugin)
+{
+    return equalIgnoringCase(plugin.info.file, "npdsplay.dll");
+}
+
+static bool isNewWindowsMediaPlayerPlugin(const PluginInfoStore::Plugin& plugin)
+{
+    return equalIgnoringCase(plugin.info.file, "np-mswmp.dll");
+}
+
 bool PluginInfoStore::shouldUsePlugin(const Plugin& plugin)
 {
 bool PluginInfoStore::shouldUsePlugin(const Plugin& plugin)
 {
-    // FIXME: <http://webkit.org/b/43509> Migrate logic here from
-    // PluginDatabase::getPluginPathsInDirectories and PluginPackage::isPluginBlacklisted.
-    notImplemented();
+    // FIXME: We should prefer a newer version of a plugin to an older version, rather than loading
+    // both. <http://webkit.org/b/49075>
+
+    if (plugin.info.name == "Citrix ICA Client") {
+        // The Citrix ICA Client plug-in requires a Mozilla-based browser; see <rdar://6418681>.
+        return false;
+    }
+
+    if (plugin.info.name == "Silverlight Plug-In") {
+        // workaround for <rdar://5557379> Crash in Silverlight when opening microsoft.com.
+        // the latest 1.0 version of Silverlight does not reproduce this crash, so allow it
+        // and any newer versions
+        static const uint64_t minimumRequiredVersion = fileVersion(0x51BE0000, 0x00010000);
+        return plugin.fileVersion >= minimumRequiredVersion;
+    }
+
+    if (equalIgnoringCase(plugin.info.file, "npmozax.dll")) {
+        // Bug 15217: Mozilla ActiveX control complains about missing xpcom_core.dll
+        return false;
+    }
+
+    if (plugin.info.name == "Yahoo Application State Plugin") {
+        // https://bugs.webkit.org/show_bug.cgi?id=26860
+        // Bug in Yahoo Application State plug-in earlier than 1.0.0.6 leads to heap corruption.
+        static const uint64_t minimumRequiredVersion = fileVersion(0x00000006, 0x00010000);
+        return plugin.fileVersion >= minimumRequiredVersion;
+    }
+
+    if (isOldWindowsMediaPlayerPlugin(plugin)) {
+        // Don't load the old Windows Media Player plugin if we've already loaded the new Windows
+        // Media Player plugin.
+        for (size_t i = 0; i < m_plugins.size(); ++i) {
+            if (!isNewWindowsMediaPlayerPlugin(m_plugins[i]))
+                continue;
+            return false;
+        }
+        return true;
+    }
+
+    if (isNewWindowsMediaPlayerPlugin(plugin)) {
+        // Unload the old Windows Media Player plugin if we've already loaded it.
+        for (size_t i = 0; i < m_plugins.size(); ++i) {
+            if (!isOldWindowsMediaPlayerPlugin(m_plugins[i]))
+                continue;
+            m_plugins.remove(i);
+        }
+        return true;
+    }
+
     return true;
 }
 
     return true;
 }