Changeset 65704 in webkit


Ignore:
Timestamp:
Aug 19, 2010 2:22:32 PM (14 years ago)
Author:
Adam Roben
Message:

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.

Location:
trunk/WebKit2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit2/ChangeLog

    r65703 r65704  
     12010-08-19  Adam Roben  <aroben@apple.com>
     2
     3        Implement PluginInfoStore::pluginsDirectories
     4
     5        This makes WebKit2 able to find and load Flash on Windows.
     6
     7        Note that we aren't yet respecting the MozillaPlugins registry key.
     8        That's covered by <http://webkit.org/b/44271>.
     9
     10        Fixes <http://webkit.org/b/43510> <rdar://problem/8273827> WebKit2
     11        should load plugins from the same directories as old-WebKit
     12
     13        Reviewed by Jon Honeycutt and Ada Chan.
     14
     15        * UIProcess/Plugins/win/PluginInfoStoreWin.cpp:
     16        (WebKit::parseVersionString):
     17        (WebKit::compareVersions):
     18        (WebKit::safariPluginsDirectory):
     19        (WebKit::addMozillaPluginDirectories):
     20        (WebKit::addWindowsMediaPlayerPluginDirectory):
     21        (WebKit::addQuickTimePluginDirectory):
     22        (WebKit::addAdobeAcrobatPluginDirectory):
     23        (WebKit::addMacromediaPluginDirectories):
     24        (WebKit::PluginInfoStore::pluginsDirectories):
     25        Ported (and ever-so-slightly cleaned up) code from WebCore's
     26        PluginDatabaseWin.cpp.
     27
    1282010-08-19  Adam Roben  <aroben@apple.com>
    229
  • trunk/WebKit2/UIProcess/Plugins/win/PluginInfoStoreWin.cpp

    r65484 r65704  
    2929#include "NotImplemented.h"
    3030#include <WebCore/FileSystem.h>
     31#include <shlwapi.h>
    3132#include <wtf/OwnArrayPtr.h>
    3233
     
    3536namespace WebKit {
    3637
     38static inline Vector<int> parseVersionString(const String& versionString)
     39{
     40    Vector<int> version;
     41
     42    unsigned startPos = 0;
     43    unsigned endPos;
     44   
     45    while (startPos < versionString.length()) {
     46        for (endPos = startPos; endPos < versionString.length(); ++endPos)
     47            if (versionString[endPos] == '.' || versionString[endPos] == '_')
     48                break;
     49
     50        int versionComponent = versionString.substring(startPos, endPos - startPos).toInt();
     51        version.append(versionComponent);
     52
     53        startPos = endPos + 1;
     54    }
     55
     56    return version;
     57}
     58
     59// This returns whether versionA is higher than versionB
     60static inline bool compareVersions(const Vector<int>& versionA, const Vector<int>& versionB)
     61{
     62    for (unsigned i = 0; i < versionA.size(); i++) {
     63        if (i >= versionB.size())
     64            return true;
     65
     66        if (versionA[i] > versionB[i])
     67            return true;
     68        else if (versionA[i] < versionB[i])
     69            return false;
     70    }
     71
     72    // If we come here, the versions are either the same or versionB has an extra component, just return false
     73    return false;
     74}
     75
     76static inline String safariPluginsDirectory()
     77{
     78    static String pluginsDirectory;
     79    static bool cachedPluginDirectory = false;
     80
     81    if (!cachedPluginDirectory) {
     82        cachedPluginDirectory = true;
     83
     84        WCHAR moduleFileNameStr[MAX_PATH];
     85        int moduleFileNameLen = ::GetModuleFileNameW(0, moduleFileNameStr, _countof(moduleFileNameStr));
     86
     87        if (!moduleFileNameLen || moduleFileNameLen == _countof(moduleFileNameStr))
     88            return pluginsDirectory;
     89
     90        if (!::PathRemoveFileSpecW(moduleFileNameStr))
     91            return pluginsDirectory;
     92
     93        pluginsDirectory = String(moduleFileNameStr) + "\\Plugins";
     94    }
     95
     96    return pluginsDirectory;
     97}
     98
     99static inline void addMozillaPluginDirectories(Vector<String>& directories)
     100{
     101    // Enumerate all Mozilla plugin directories in the registry
     102    HKEY key;
     103    LONG result = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Mozilla", 0, KEY_READ, &key);
     104    if (result != ERROR_SUCCESS)
     105        return;
     106
     107    WCHAR name[128];
     108    FILETIME lastModified;
     109
     110    // Enumerate subkeys
     111    for (int i = 0;; i++) {
     112        DWORD nameLen = _countof(name);
     113        result = ::RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
     114
     115        if (result != ERROR_SUCCESS)
     116            break;
     117
     118        String extensionsPath = String(name, nameLen) + "\\Extensions";
     119        HKEY extensionsKey;
     120
     121        // Try opening the key
     122        result = ::RegOpenKeyExW(key, extensionsPath.charactersWithNullTermination(), 0, KEY_READ, &extensionsKey);
     123
     124        if (result == ERROR_SUCCESS) {
     125            // Now get the plugins directory
     126            WCHAR pluginsDirectoryStr[MAX_PATH];
     127            DWORD pluginsDirectorySize = sizeof(pluginsDirectoryStr);
     128            DWORD type;
     129
     130            result = ::RegQueryValueExW(extensionsKey, L"Plugins", 0, &type, reinterpret_cast<LPBYTE>(&pluginsDirectoryStr), &pluginsDirectorySize);
     131
     132            if (result == ERROR_SUCCESS && type == REG_SZ)
     133                directories.append(String(pluginsDirectoryStr, pluginsDirectorySize / sizeof(WCHAR) - 1));
     134
     135            ::RegCloseKey(extensionsKey);
     136        }
     137    }
     138
     139    ::RegCloseKey(key);
     140}
     141
     142static inline void addWindowsMediaPlayerPluginDirectory(Vector<String>& directories)
     143{
     144    // The new WMP Firefox plugin is installed in \PFiles\Plugins if it can't find any Firefox installs
     145    WCHAR pluginDirectoryStr[MAX_PATH + 1];
     146    DWORD pluginDirectorySize = ::ExpandEnvironmentStringsW(L"%SYSTEMDRIVE%\\PFiles\\Plugins", pluginDirectoryStr, _countof(pluginDirectoryStr));
     147
     148    if (pluginDirectorySize > 0 && pluginDirectorySize <= _countof(pluginDirectoryStr))
     149        directories.append(String(pluginDirectoryStr, pluginDirectorySize - 1));
     150
     151    DWORD type;
     152    WCHAR installationDirectoryStr[MAX_PATH];
     153    DWORD installationDirectorySize = sizeof(installationDirectoryStr);
     154
     155    HRESULT result = ::SHGetValueW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MediaPlayer", L"Installation Directory", &type, reinterpret_cast<LPBYTE>(&installationDirectoryStr), &installationDirectorySize);
     156
     157    if (result == ERROR_SUCCESS && type == REG_SZ)
     158        directories.append(String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1));
     159}
     160
     161static inline void addQuickTimePluginDirectory(Vector<String>& directories)
     162{
     163    DWORD type;
     164    WCHAR installationDirectoryStr[MAX_PATH];
     165    DWORD installationDirectorySize = sizeof(installationDirectoryStr);
     166
     167    HRESULT result = ::SHGetValueW(HKEY_LOCAL_MACHINE, L"Software\\Apple Computer, Inc.\\QuickTime", L"InstallDir", &type, reinterpret_cast<LPBYTE>(&installationDirectoryStr), &installationDirectorySize);
     168
     169    if (result == ERROR_SUCCESS && type == REG_SZ) {
     170        String pluginDir = String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1) + "\\plugins";
     171        directories.append(pluginDir);
     172    }
     173}
     174
     175static inline void addAdobeAcrobatPluginDirectory(Vector<String>& directories)
     176{
     177    HKEY key;
     178    HRESULT result = ::RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Adobe\\Acrobat Reader", 0, KEY_READ, &key);
     179    if (result != ERROR_SUCCESS)
     180        return;
     181
     182    WCHAR name[128];
     183    FILETIME lastModified;
     184
     185    Vector<int> latestAcrobatVersion;
     186    String latestAcrobatVersionString;
     187
     188    // Enumerate subkeys
     189    for (int i = 0;; i++) {
     190        DWORD nameLen = _countof(name);
     191        result = ::RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
     192
     193        if (result != ERROR_SUCCESS)
     194            break;
     195
     196        Vector<int> acrobatVersion = parseVersionString(String(name, nameLen));
     197        if (compareVersions(acrobatVersion, latestAcrobatVersion)) {
     198            latestAcrobatVersion = acrobatVersion;
     199            latestAcrobatVersionString = String(name, nameLen);
     200        }
     201    }
     202
     203    if (!latestAcrobatVersionString.isNull()) {
     204        DWORD type;
     205        WCHAR acrobatInstallPathStr[MAX_PATH];
     206        DWORD acrobatInstallPathSize = sizeof(acrobatInstallPathStr);
     207
     208        String acrobatPluginKeyPath = "Software\\Adobe\\Acrobat Reader\\" + latestAcrobatVersionString + "\\InstallPath";
     209        result = ::SHGetValueW(HKEY_LOCAL_MACHINE, acrobatPluginKeyPath.charactersWithNullTermination(), 0, &type, reinterpret_cast<LPBYTE>(acrobatInstallPathStr), &acrobatInstallPathSize);
     210
     211        if (result == ERROR_SUCCESS) {
     212            String acrobatPluginDirectory = String(acrobatInstallPathStr, acrobatInstallPathSize / sizeof(WCHAR) - 1) + "\\browser";
     213            directories.append(acrobatPluginDirectory);
     214        }
     215    }
     216
     217    ::RegCloseKey(key);
     218}
     219
     220static inline void addMacromediaPluginDirectories(Vector<String>& directories)
     221{
     222#if !OS(WINCE)
     223    WCHAR systemDirectoryStr[MAX_PATH];
     224
     225    if (!::GetSystemDirectoryW(systemDirectoryStr, _countof(systemDirectoryStr)))
     226        return;
     227
     228    WCHAR macromediaDirectoryStr[MAX_PATH];
     229
     230    if (!::PathCombineW(macromediaDirectoryStr, systemDirectoryStr, L"macromed\\Flash"))
     231        return;
     232
     233    directories.append(macromediaDirectoryStr);
     234
     235    if (!::PathCombineW(macromediaDirectoryStr, systemDirectoryStr, L"macromed\\Shockwave 10"))
     236        return;
     237
     238    directories.append(macromediaDirectoryStr);
     239#endif
     240}
     241
    37242Vector<String> PluginInfoStore::pluginsDirectories()
    38243{
    39     // FIXME: <http://webkit.org/b/43510> Migrate logic here from PluginDatabase::defaultPluginDirectories.
    40     notImplemented();
    41     return Vector<String>();
     244    Vector<String> directories;
     245
     246    String ourDirectory = safariPluginsDirectory();
     247    if (!ourDirectory.isNull())
     248        directories.append(ourDirectory);
     249
     250    addQuickTimePluginDirectory(directories);
     251    addAdobeAcrobatPluginDirectory(directories);
     252    addMozillaPluginDirectories(directories);
     253    addWindowsMediaPlayerPluginDirectory(directories);
     254    addMacromediaPluginDirectories(directories);
     255
     256    return directories;
    42257}
    43258
Note: See TracChangeset for help on using the changeset viewer.