18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Collabora, Ltd.  All rights reserved.
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008-2009 Torch Mobile, Inc.  All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginDatabase.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "KURL.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginPackage.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <windows.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <shlwapi.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE)
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// WINCE doesn't support Registry Key Access Rights. The parameter should always be 0
390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#ifndef KEY_ENUMERATE_SUB_KEYS
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define KEY_ENUMERATE_SUB_KEYS 0
410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#endif
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochDWORD SHGetValue(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData)
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HKEY key;
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (RegOpenKeyEx(hkey, pszSubKey, 0, 0, &key) == ERROR_SUCCESS) {
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        DWORD result = RegQueryValueEx(key, pszValue, 0, pdwType, (LPBYTE)pvData, pcbData);
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RegCloseKey(key);
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return result;
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return ERROR_INVALID_NAME;
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochBOOL PathRemoveFileSpec(LPWSTR moduleFileNameStr)
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!*moduleFileNameStr)
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return FALSE;
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    LPWSTR lastPos = 0;
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    LPWSTR curPos = moduleFileNameStr;
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    do {
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (*curPos == L'/' || *curPos == L'\\')
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            lastPos = curPos;
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } while (*++curPos);
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (lastPos == curPos - 1)
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return FALSE;
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (lastPos)
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        *lastPos = 0;
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else {
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        moduleFileNameStr[0] = L'\\';
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        moduleFileNameStr[1] = 0;
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return TRUE;
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addPluginPathsFromRegistry(HKEY rootKey, HashSet<String>& paths)
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HKEY key;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HRESULT result = RegOpenKeyExW(rootKey, L"Software\\MozillaPlugins", 0, KEY_ENUMERATE_SUB_KEYS, &key);
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result != ERROR_SUCCESS)
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    wchar_t name[128];
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FILETIME lastModified;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Enumerate subkeys
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0;; i++) {
95e14391e94c850b8bd03680c23b38978db68687a8John Reck        DWORD nameLen = WTF_ARRAY_LENGTH(name);
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result != ERROR_SUCCESS)
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WCHAR pathStr[_MAX_PATH];
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DWORD pathStrSize = sizeof(pathStr);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DWORD type;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = SHGetValue(key, name, TEXT("Path"), &type, (LPBYTE)pathStr, &pathStrSize);
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result != ERROR_SUCCESS || type != REG_SZ)
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paths.add(String(pathStr, pathStrSize / sizeof(WCHAR) - 1));
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RegCloseKey(key);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid PluginDatabase::getPluginPathsInDirectories(HashSet<String>& paths) const
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This should be a case insensitive set.
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashSet<String> uniqueFilenames;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HANDLE hFind = INVALID_HANDLE_VALUE;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WIN32_FIND_DATAW findFileData;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String oldWMPPluginPath;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String newWMPPluginPath;
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<String>::const_iterator end = m_pluginDirectories.end();
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (Vector<String>::const_iterator it = m_pluginDirectories.begin(); it != end; ++it) {
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String pattern = *it + "\\*";
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        hFind = FindFirstFileW(pattern.charactersWithNullTermination(), &findFileData);
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (hFind == INVALID_HANDLE_VALUE)
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            continue;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        do {
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String filename = String(findFileData.cFileName, wcslen(findFileData.cFileName));
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ((!filename.startsWith("np", false) || !filename.endsWith("dll", false)) &&
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                (!equalIgnoringCase(filename, "Plugin.dll") || !it->endsWith("Shockwave 10", false)))
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String fullPath = *it + "\\" + filename;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!uniqueFilenames.add(fullPath).second)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                continue;
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            paths.add(fullPath);
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (equalIgnoringCase(filename, "npdsplay.dll"))
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                oldWMPPluginPath = fullPath;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (equalIgnoringCase(filename, "np-mswmp.dll"))
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                newWMPPluginPath = fullPath;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } while (FindNextFileW(hFind, &findFileData) != 0);
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FindClose(hFind);
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addPluginPathsFromRegistry(HKEY_LOCAL_MACHINE, paths);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addPluginPathsFromRegistry(HKEY_CURRENT_USER, paths);
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If both the old and new WMP plugin are present in the plugins set,
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we remove the old one so we don't end up choosing the old one.
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!oldWMPPluginPath.isEmpty() && !newWMPPluginPath.isEmpty())
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paths.remove(oldWMPPluginPath);
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline Vector<int> parseVersionString(const String& versionString)
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<int> version;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned startPos = 0;
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned endPos;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (startPos < versionString.length()) {
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (endPos = startPos; endPos < versionString.length(); ++endPos)
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (versionString[endPos] == '.' || versionString[endPos] == '_')
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int versionComponent = versionString.substring(startPos, endPos - startPos).toInt();
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version.append(versionComponent);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        startPos = endPos + 1;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return version;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This returns whether versionA is higher than versionB
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline bool compareVersions(const Vector<int>& versionA, const Vector<int>& versionB)
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < versionA.size(); i++) {
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i >= versionB.size())
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (versionA[i] > versionB[i])
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (versionA[i] < versionB[i])
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we come here, the versions are either the same or versionB has an extra component, just return false
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addMozillaPluginDirectories(Vector<String>& directories)
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Enumerate all Mozilla plugin directories in the registry
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HKEY key;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LONG result;
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Mozilla"), 0, KEY_READ, &key);
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result == ERROR_SUCCESS) {
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WCHAR name[128];
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FILETIME lastModified;
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Enumerate subkeys
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0;; i++) {
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DWORD nameLen = sizeof(name) / sizeof(WCHAR);
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (result != ERROR_SUCCESS)
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String extensionsPath = String(name, nameLen) + "\\Extensions";
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HKEY extensionsKey;
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Try opening the key
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = RegOpenKeyEx(key, extensionsPath.charactersWithNullTermination(), 0, KEY_READ, &extensionsKey);
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (result == ERROR_SUCCESS) {
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Now get the plugins directory
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                WCHAR pluginsDirectoryStr[_MAX_PATH];
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                DWORD pluginsDirectorySize = sizeof(pluginsDirectoryStr);
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                DWORD type;
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                result = RegQueryValueEx(extensionsKey, TEXT("Plugins"), 0, &type, (LPBYTE)&pluginsDirectoryStr, &pluginsDirectorySize);
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (result == ERROR_SUCCESS && type == REG_SZ)
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    directories.append(String(pluginsDirectoryStr, pluginsDirectorySize / sizeof(WCHAR) - 1));
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                RegCloseKey(extensionsKey);
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RegCloseKey(key);
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addWindowsMediaPlayerPluginDirectory(Vector<String>& directories)
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
253d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The new WMP Firefox plugin is installed in \PFiles\Plugins if it can't find any Firefox installs
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WCHAR pluginDirectoryStr[_MAX_PATH + 1];
256e14391e94c850b8bd03680c23b38978db68687a8John Reck    DWORD pluginDirectorySize = ::ExpandEnvironmentStringsW(TEXT("%SYSTEMDRIVE%\\PFiles\\Plugins"), pluginDirectoryStr, WTF_ARRAY_LENGTH(pluginDirectoryStr));
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (pluginDirectorySize > 0 && pluginDirectorySize <= WTF_ARRAY_LENGTH(pluginDirectoryStr))
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        directories.append(String(pluginDirectoryStr, pluginDirectorySize - 1));
2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DWORD type;
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WCHAR installationDirectoryStr[_MAX_PATH];
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DWORD installationDirectorySize = sizeof(installationDirectoryStr);
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HRESULT result = SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\MediaPlayer"), TEXT("Installation Directory"), &type, (LPBYTE)&installationDirectoryStr, &installationDirectorySize);
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result == ERROR_SUCCESS && type == REG_SZ)
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        directories.append(String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1));
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addQuickTimePluginDirectory(Vector<String>& directories)
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DWORD type;
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WCHAR installationDirectoryStr[_MAX_PATH];
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DWORD installationDirectorySize = sizeof(installationDirectoryStr);
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HRESULT result = SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Apple Computer, Inc.\\QuickTime"), TEXT("InstallDir"), &type, (LPBYTE)&installationDirectoryStr, &installationDirectorySize);
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result == ERROR_SUCCESS && type == REG_SZ) {
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String pluginDir = String(installationDirectoryStr, installationDirectorySize / sizeof(WCHAR) - 1) + "\\plugins";
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        directories.append(pluginDir);
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addAdobeAcrobatPluginDirectory(Vector<String>& directories)
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HKEY key;
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Adobe\\Acrobat Reader"), 0, KEY_READ, &key);
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (result != ERROR_SUCCESS)
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WCHAR name[128];
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FILETIME lastModified;
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<int> latestAcrobatVersion;
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String latestAcrobatVersionString;
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Enumerate subkeys
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0;; i++) {
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DWORD nameLen = sizeof(name) / sizeof(WCHAR);
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result != ERROR_SUCCESS)
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Vector<int> acrobatVersion = parseVersionString(String(name, nameLen));
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (compareVersions(acrobatVersion, latestAcrobatVersion)) {
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            latestAcrobatVersion = acrobatVersion;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            latestAcrobatVersionString = String(name, nameLen);
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!latestAcrobatVersionString.isNull()) {
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DWORD type;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WCHAR acrobatInstallPathStr[_MAX_PATH];
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DWORD acrobatInstallPathSize = sizeof(acrobatInstallPathStr);
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String acrobatPluginKeyPath = "Software\\Adobe\\Acrobat Reader\\" + latestAcrobatVersionString + "\\InstallPath";
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = SHGetValue(HKEY_LOCAL_MACHINE, acrobatPluginKeyPath.charactersWithNullTermination(), 0, &type, (LPBYTE)acrobatInstallPathStr, &acrobatInstallPathSize);
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result == ERROR_SUCCESS) {
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            String acrobatPluginDirectory = String(acrobatInstallPathStr, acrobatInstallPathSize / sizeof(WCHAR) - 1) + "\\browser";
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            directories.append(acrobatPluginDirectory);
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RegCloseKey(key);
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic inline void addJavaPluginDirectory(Vector<String>& directories)
3325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
3335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    HKEY key;
3345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    HRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\JavaSoft\\Java Plug-in"), 0, KEY_READ, &key);
3355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (result != ERROR_SUCCESS)
3365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return;
3375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    WCHAR name[128];
3395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    FILETIME lastModified;
3405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    Vector<int> latestJavaVersion;
3425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    String latestJavaVersionString;
3435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Enumerate subkeys
3455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    for (int i = 0;; i++) {
3465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        DWORD nameLen = sizeof(name) / sizeof(WCHAR);
3475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        result = RegEnumKeyExW(key, i, name, &nameLen, 0, 0, 0, &lastModified);
3485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (result != ERROR_SUCCESS)
3505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            break;
3515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        Vector<int> javaVersion = parseVersionString(String(name, nameLen));
3535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (compareVersions(javaVersion, latestJavaVersion)) {
3545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            latestJavaVersion = javaVersion;
3555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            latestJavaVersionString = String(name, nameLen);
3565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
3575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
3585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!latestJavaVersionString.isEmpty()) {
3605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        DWORD type;
3615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        WCHAR javaInstallPathStr[_MAX_PATH];
3625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        DWORD javaInstallPathSize = sizeof(javaInstallPathStr);
3635ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        DWORD useNewPluginValue;
3645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        DWORD useNewPluginSize;
3655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        String javaPluginKeyPath = "Software\\JavaSoft\\Java Plug-in\\" + latestJavaVersionString;
3675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        result = SHGetValue(HKEY_LOCAL_MACHINE, javaPluginKeyPath.charactersWithNullTermination(), TEXT("UseNewJavaPlugin"), &type, (LPVOID)&useNewPluginValue, &useNewPluginSize);
3685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        if (result == ERROR_SUCCESS && useNewPluginValue == 1) {
3705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            result = SHGetValue(HKEY_LOCAL_MACHINE, javaPluginKeyPath.charactersWithNullTermination(), TEXT("JavaHome"), &type, (LPBYTE)javaInstallPathStr, &javaInstallPathSize);
3715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            if (result == ERROR_SUCCESS) {
3725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                String javaPluginDirectory = String(javaInstallPathStr, javaInstallPathSize / sizeof(WCHAR) - 1) + "\\bin\\new_plugin";
3735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                directories.append(javaPluginDirectory);
3745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            }
3755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        }
3765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    }
3775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    RegCloseKey(key);
3795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
3805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline String safariPluginsDirectory()
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WCHAR moduleFileNameStr[_MAX_PATH];
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static String pluginsDirectory;
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool cachedPluginDirectory = false;
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!cachedPluginDirectory) {
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cachedPluginDirectory = true;
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int moduleFileNameLen = GetModuleFileName(0, moduleFileNameStr, _MAX_PATH);
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!moduleFileNameLen || moduleFileNameLen == _MAX_PATH)
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto exit;
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!PathRemoveFileSpec(moduleFileNameStr))
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto exit;
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginsDirectory = String(moduleFileNameStr) + "\\Plugins";
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexit:
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pluginsDirectory;
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addMacromediaPluginDirectories(Vector<String>& directories)
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
406d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(WINCE)
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WCHAR systemDirectoryStr[MAX_PATH];
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
409e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!GetSystemDirectory(systemDirectoryStr, WTF_ARRAY_LENGTH(systemDirectoryStr)))
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WCHAR macromediaDirectoryStr[MAX_PATH];
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PathCombine(macromediaDirectoryStr, systemDirectoryStr, TEXT("macromed\\Flash"));
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    directories.append(macromediaDirectoryStr);
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PathCombine(macromediaDirectoryStr, systemDirectoryStr, TEXT("macromed\\Shockwave 10"));
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    directories.append(macromediaDirectoryStr);
4190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectVector<String> PluginDatabase::defaultPluginDirectories()
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<String> directories;
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String ourDirectory = safariPluginsDirectory();
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ourDirectory.isNull())
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        directories.append(ourDirectory);
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addQuickTimePluginDirectory(directories);
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addAdobeAcrobatPluginDirectory(directories);
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addMozillaPluginDirectories(directories);
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addWindowsMediaPlayerPluginDirectory(directories);
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    addMacromediaPluginDirectories(directories);
4345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(QT)
4355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    addJavaPluginDirectory(directories);
4365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return directories;
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool PluginDatabase::isPreferredPluginDirectory(const String& directory)
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String ourDirectory = safariPluginsDirectory();
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ourDirectory.isNull() && !directory.isNull())
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return ourDirectory == directory;
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
452