[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

aroben at apple.com aroben at apple.com
Wed Dec 22 12:21:15 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 542573eeb7aaa0acc414641349d648045c159a17
Author: aroben at apple.com <aroben at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Aug 19 21:22:32 2010 +0000

    Implement PluginInfoStore::pluginsDirectories
    
    This makes WebKit2 able to find and load Flash on Windows.
    
    Note that we aren't yet respecting the MozillaPlugins registry key.
    That's covered by <http://webkit.org/b/44271>.
    
    Fixes <http://webkit.org/b/43510> <rdar://problem/8273827> WebKit2
    should load plugins from the same directories as old-WebKit
    
    Reviewed by Jon Honeycutt and Ada Chan.
    
    * UIProcess/Plugins/win/PluginInfoStoreWin.cpp:
    (WebKit::parseVersionString):
    (WebKit::compareVersions):
    (WebKit::safariPluginsDirectory):
    (WebKit::addMozillaPluginDirectories):
    (WebKit::addWindowsMediaPlayerPluginDirectory):
    (WebKit::addQuickTimePluginDirectory):
    (WebKit::addAdobeAcrobatPluginDirectory):
    (WebKit::addMacromediaPluginDirectories):
    (WebKit::PluginInfoStore::pluginsDirectories):
    Ported (and ever-so-slightly cleaned up) code from WebCore's
    PluginDatabaseWin.cpp.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@65704 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 5feb5c9..c14f415 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,5 +1,32 @@
 2010-08-19  Adam Roben  <aroben at apple.com>
 
+        Implement PluginInfoStore::pluginsDirectories
+
+        This makes WebKit2 able to find and load Flash on Windows.
+
+        Note that we aren't yet respecting the MozillaPlugins registry key.
+        That's covered by <http://webkit.org/b/44271>.
+
+        Fixes <http://webkit.org/b/43510> <rdar://problem/8273827> WebKit2
+        should load plugins from the same directories as old-WebKit
+
+        Reviewed by Jon Honeycutt and Ada Chan.
+
+        * UIProcess/Plugins/win/PluginInfoStoreWin.cpp:
+        (WebKit::parseVersionString):
+        (WebKit::compareVersions):
+        (WebKit::safariPluginsDirectory):
+        (WebKit::addMozillaPluginDirectories):
+        (WebKit::addWindowsMediaPlayerPluginDirectory):
+        (WebKit::addQuickTimePluginDirectory):
+        (WebKit::addAdobeAcrobatPluginDirectory):
+        (WebKit::addMacromediaPluginDirectories):
+        (WebKit::PluginInfoStore::pluginsDirectories):
+        Ported (and ever-so-slightly cleaned up) code from WebCore's
+        PluginDatabaseWin.cpp.
+
+2010-08-19  Adam Roben  <aroben at apple.com>
+
         Call NP_GetEntryPoints before NP_Initialize on Windows
 
         Doing otherwise will cause Flash and QuickTime to crash inside
diff --git a/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp b/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp
index 472bb9c..e0c80a6 100644
--- a/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp
+++ b/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp
@@ -28,17 +28,232 @@
 #define DISABLE_NOT_IMPLEMENTED_WARNINGS 1
 #include "NotImplemented.h"
 #include <WebCore/FileSystem.h>
+#include <shlwapi.h>
 #include <wtf/OwnArrayPtr.h>
 
 using namespace WebCore;
 
 namespace WebKit {
 
+static inline Vector<int> parseVersionString(const String& versionString)
+{
+    Vector<int> version;
+
+    unsigned startPos = 0;
+    unsigned endPos;
+    
+    while (startPos < versionString.length()) {
+        for (endPos = startPos; endPos < versionString.length(); ++endPos)
+            if (versionString[endPos] == '.' || versionString[endPos] == '_')
+                break;
+
+        int versionComponent = versionString.substring(startPos, endPos - startPos).toInt();
+        version.append(versionComponent);
+
+        startPos = endPos + 1;
+    }
+
+    return version;
+}
+
+// This returns whether versionA is higher than versionB
+static inline bool compareVersions(const Vector<int>& versionA, const Vector<int>& versionB)
+{
+    for (unsigned i = 0; i < versionA.size(); i++) {
+        if (i >= versionB.size())
+            return true;
+
+        if (versionA[i] > versionB[i])
+            return true;
+        else if (versionA[i] < versionB[i])
+            return false;
+    }
+
+    // If we come here, the versions are either the same or versionB has an extra component, just return false
+    return false;
+}
+
+static inline String safariPluginsDirectory()
+{
+    static String pluginsDirectory;
+    static bool cachedPluginDirectory = false;
+
+    if (!cachedPluginDirectory) {
+        cachedPluginDirectory = true;
+
+        WCHAR moduleFileNameStr[MAX_PATH];
+        int moduleFileNameLen = ::GetModuleFileNameW(0, moduleFileNameStr, _countof(moduleFileNameStr));
+
+        if (!moduleFileNameLen || moduleFileNameLen == _countof(moduleFileNameStr))
+            return pluginsDirectory;
+
+        if (!::PathRemoveFileSpecW(moduleFileNameStr))
+            return pluginsDirectory;
+
+        pluginsDirectory = String(moduleFileNameStr) + "\\Plugins";
+    }
+
+    return pluginsDirectory;
+}
+
+static inline void addMozillaPluginDirectories(Vector<String>& directories)
+{
+    // Enumerate all Mozilla plugin directories in the registry
+    HKEY key;
+    LONG result = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Mozilla", 0, KEY_READ, &key);
+    if (result != ERROR_SUCCESS)
+        return;
+
+    WCHAR name[128];
+    FILETIME lastModified;
+
+    // Enumerate subkeys
+    for (int i = 0;; i++) {
+        DWORD nameLen = _countof(name);
+        result = ::RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
+
+        if (result != ERROR_SUCCESS)
+            break;
+
+        String extensionsPath = String(name, nameLen) + "\\Extensions";
+        HKEY extensionsKey;
+
+        // Try opening the key
+        result = ::RegOpenKeyExW(key, extensionsPath.charactersWithNullTermination(), 0, KEY_READ, &extensionsKey);
+
+        if (result == ERROR_SUCCESS) {
+            // Now get the plugins directory
+            WCHAR pluginsDirectoryStr[MAX_PATH];
+            DWORD pluginsDirectorySize = sizeof(pluginsDirectoryStr);
+            DWORD type;
+
+            result = ::RegQueryValueExW(extensionsKey, L"Plugins", 0, &type, reinterpret_cast<LPBYTE>(&pluginsDirectoryStr), &pluginsDirectorySize);
+
+            if (result == ERROR_SUCCESS && type == REG_SZ)
+                directories.append(String(pluginsDirectoryStr, pluginsDirectorySize / sizeof(WCHAR) - 1));
+
+            ::RegCloseKey(extensionsKey);
+        }
+    }
+
+    ::RegCloseKey(key);
+}
+
+static inline void addWindowsMediaPlayerPluginDirectory(Vector<String>& directories)
+{
+    // The new WMP Firefox plugin is installed in \PFiles\Plugins if it can't find any Firefox installs
+    WCHAR pluginDirectoryStr[MAX_PATH + 1];
+    DWORD pluginDirectorySize = ::ExpandEnvironmentStringsW(L"%SYSTEMDRIVE%\\PFiles\\Plugins", pluginDirectoryStr, _countof(pluginDirectoryStr));
+
+    if (pluginDirectorySize > 0 && pluginDirectorySize <= _countof(pluginDirectoryStr))
+        directories.append(String(pluginDirectoryStr, pluginDirectorySize - 1));
+
+    DWORD type;
+    WCHAR installationDirectoryStr[MAX_PATH];
+    DWORD installationDirectorySize = sizeof(installationDirectoryStr);
+
+    HRESULT result = ::SHGetValueW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MediaPlayer", L"Installation Directory", &type, reinterpret_cast<LPBYTE>(&installationDirectoryStr), &installationDirectorySize);
+
+    if (result == ERROR_SUCCESS && type == REG_SZ)
+        directories.append(String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1));
+}
+
+static inline void addQuickTimePluginDirectory(Vector<String>& directories)
+{
+    DWORD type;
+    WCHAR installationDirectoryStr[MAX_PATH];
+    DWORD installationDirectorySize = sizeof(installationDirectoryStr);
+
+    HRESULT result = ::SHGetValueW(HKEY_LOCAL_MACHINE, L"Software\\Apple Computer, Inc.\\QuickTime", L"InstallDir", &type, reinterpret_cast<LPBYTE>(&installationDirectoryStr), &installationDirectorySize);
+
+    if (result == ERROR_SUCCESS && type == REG_SZ) {
+        String pluginDir = String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1) + "\\plugins";
+        directories.append(pluginDir);
+    }
+}
+
+static inline void addAdobeAcrobatPluginDirectory(Vector<String>& directories)
+{
+    HKEY key;
+    HRESULT result = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Adobe\\Acrobat Reader", 0, KEY_READ, &key);
+    if (result != ERROR_SUCCESS)
+        return;
+
+    WCHAR name[128];
+    FILETIME lastModified;
+
+    Vector<int> latestAcrobatVersion;
+    String latestAcrobatVersionString;
+
+    // Enumerate subkeys
+    for (int i = 0;; i++) {
+        DWORD nameLen = _countof(name);
+        result = ::RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
+
+        if (result != ERROR_SUCCESS)
+            break;
+
+        Vector<int> acrobatVersion = parseVersionString(String(name, nameLen));
+        if (compareVersions(acrobatVersion, latestAcrobatVersion)) {
+            latestAcrobatVersion = acrobatVersion;
+            latestAcrobatVersionString = String(name, nameLen);
+        }
+    }
+
+    if (!latestAcrobatVersionString.isNull()) {
+        DWORD type;
+        WCHAR acrobatInstallPathStr[MAX_PATH];
+        DWORD acrobatInstallPathSize = sizeof(acrobatInstallPathStr);
+
+        String acrobatPluginKeyPath = "Software\\Adobe\\Acrobat Reader\\" + latestAcrobatVersionString + "\\InstallPath";
+        result = ::SHGetValueW(HKEY_LOCAL_MACHINE, acrobatPluginKeyPath.charactersWithNullTermination(), 0, &type, reinterpret_cast<LPBYTE>(acrobatInstallPathStr), &acrobatInstallPathSize);
+
+        if (result == ERROR_SUCCESS) {
+            String acrobatPluginDirectory = String(acrobatInstallPathStr, acrobatInstallPathSize / sizeof(WCHAR) - 1) + "\\browser";
+            directories.append(acrobatPluginDirectory);
+        }
+    }
+
+    ::RegCloseKey(key);
+}
+
+static inline void addMacromediaPluginDirectories(Vector<String>& directories)
+{
+#if !OS(WINCE)
+    WCHAR systemDirectoryStr[MAX_PATH];
+
+    if (!::GetSystemDirectoryW(systemDirectoryStr, _countof(systemDirectoryStr)))
+        return;
+
+    WCHAR macromediaDirectoryStr[MAX_PATH];
+
+    if (!::PathCombineW(macromediaDirectoryStr, systemDirectoryStr, L"macromed\\Flash"))
+        return;
+
+    directories.append(macromediaDirectoryStr);
+
+    if (!::PathCombineW(macromediaDirectoryStr, systemDirectoryStr, L"macromed\\Shockwave 10"))
+        return;
+
+    directories.append(macromediaDirectoryStr);
+#endif
+}
+
 Vector<String> PluginInfoStore::pluginsDirectories()
 {
-    // FIXME: <http://webkit.org/b/43510> Migrate logic here from PluginDatabase::defaultPluginDirectories.
-    notImplemented();
-    return Vector<String>();
+    Vector<String> directories;
+
+    String ourDirectory = safariPluginsDirectory();
+    if (!ourDirectory.isNull())
+        directories.append(ourDirectory);
+
+    addQuickTimePluginDirectory(directories);
+    addAdobeAcrobatPluginDirectory(directories);
+    addMozillaPluginDirectories(directories);
+    addWindowsMediaPlayerPluginDirectory(directories);
+    addMacromediaPluginDirectories(directories);
+
+    return directories;
 }
 
 class PathWalker : public Noncopyable {

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list