15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/common/plugin_list.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/file_version_info.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/file_version_info_win.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/memory_mapped_file.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/pe_image.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/common/plugin_constants_win.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryApps[] = 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths"; 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryFirefox[] = L"firefox.exe"; 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryAcrobat[] = L"Acrobat.exe"; 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryAcrobatReader[] = L"AcroRd32.exe"; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryWindowsMedia[] = L"wmplayer.exe"; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryQuickTime[] = L"QuickTimePlayer.exe"; 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryPath[] = L"Path"; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryFirefoxInstalled[] = 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"SOFTWARE\\Mozilla\\Mozilla Firefox"; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryJava[] = 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"Software\\JavaSoft\\Java Runtime Environment"; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryBrowserJavaVersion[] = L"BrowserJavaVersion"; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryCurrentJavaVersion[] = L"CurrentVersion"; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kRegistryJavaHome[] = L"JavaHome"; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kJavaDeploy1[] = L"npdeploytk.dll"; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kJavaDeploy2[] = L"npdeployjava1.dll"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath AppendPluginsDir(const base::FilePath& path) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return path.AppendASCII("plugins"); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the directory where the application data and libraries exist. This 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// may be a versioned subdirectory, or it may be the same directory as the 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetExeDirectory(), depending on the embedder's implementation. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Path is an output parameter to receive the path. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetAppDirectory(std::set<base::FilePath>* plugin_dirs) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath app_path; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &app_path)) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dirs->insert(AppendPluginsDir(app_path)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the directory where the launching executable resides on disk. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Path is an output parameter to receive the path. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetExeDirectory(std::set<base::FilePath>* plugin_dirs) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath exe_path; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_EXE, &exe_path)) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dirs->insert(AppendPluginsDir(exe_path)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the installed path for a registered app. 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool GetInstalledPath(const base::char16* app, base::FilePath* out) { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 reg_path(kRegistryApps); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reg_path.append(L"\\"); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reg_path.append(app); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::RegKey hkcu_key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 path; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As of Win7 AppPaths can also be registered in HKCU: http://goo.gl/UgFOf. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::GetVersion() >= base::win::VERSION_WIN7 && 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hkcu_key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out = base::FilePath(path); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::RegKey hklm_key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hklm_key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out = base::FilePath(path); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Search the registry at the given path and detect plugin directories. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetPluginsInRegistryDirectory( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HKEY root_key, 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& registry_folder, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<base::FilePath>* plugin_dirs) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::win::RegistryKeyIterator iter(root_key, registry_folder.c_str()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter.Valid(); ++iter) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the registry to gather plugin across the file system. 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 reg_path = registry_folder; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reg_path.append(L"\\"); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reg_path.append(iter.Name()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::RegKey key(root_key, reg_path.c_str(), KEY_READ); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 path; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dirs->insert(base::FilePath(path)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumerate through the registry key to find all installed FireFox paths. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FireFox 3 beta and version 2 can coexist. See bug: 1025003 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetFirefoxInstalledPaths(std::vector<base::FilePath>* out) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::RegistryKeyIterator it(HKEY_LOCAL_MACHINE, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kRegistryFirefoxInstalled); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; it.Valid(); ++it) { 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 full_path = base::string16(kRegistryFirefoxInstalled) + 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) L"\\" + it.Name() + L"\\Main"; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::RegKey key(HKEY_LOCAL_MACHINE, full_path.c_str(), KEY_READ); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 install_dir; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key.ReadValue(L"Install Directory", &install_dir) != ERROR_SUCCESS) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out->push_back(base::FilePath(install_dir)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get plugin directory locations from the Firefox install path. This is kind 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of a kludge, but it helps us locate the flash player for users that 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already have it for firefox. Not having to download yet-another-plugin 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is a good thing. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetFirefoxDirectory(std::set<base::FilePath>* plugin_dirs) { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath> paths; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFirefoxInstalledPaths(&paths); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < paths.size(); ++i) { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dirs->insert(AppendPluginsDir(paths[i])); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath firefox_app_data_plugin_path; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PathService::Get(base::DIR_APP_DATA, &firefox_app_data_plugin_path)) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firefox_app_data_plugin_path = 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) firefox_app_data_plugin_path.AppendASCII("Mozilla"); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dirs->insert(AppendPluginsDir(firefox_app_data_plugin_path)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hardcoded logic to detect Acrobat plugins locations. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetAcrobatDirectory(std::set<base::FilePath>* plugin_dirs) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetInstalledPath(kRegistryAcrobatReader, &path) && 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetInstalledPath(kRegistryAcrobat, &path)) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dirs->insert(path.Append(L"Browser")); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hardcoded logic to detect QuickTime plugin location. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetQuicktimeDirectory(std::set<base::FilePath>* plugin_dirs) { 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetInstalledPath(kRegistryQuickTime, &path)) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dirs->insert(AppendPluginsDir(path)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hardcoded logic to detect Windows Media Player plugin location. 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetWindowsMediaDirectory(std::set<base::FilePath>* plugin_dirs) { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetInstalledPath(kRegistryWindowsMedia, &path)) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dirs->insert(path); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hardcoded logic to detect Java plugin location. 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GetJavaDirectory(std::set<base::FilePath>* plugin_dirs) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the new NPAPI Java plugin 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. Open the main JRE key under HKLM 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::RegKey java_key(HKEY_LOCAL_MACHINE, kRegistryJava, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KEY_QUERY_VALUE); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. Read the current Java version 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 java_version; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (java_key.ReadValue(kRegistryBrowserJavaVersion, &java_version) != 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ERROR_SUCCESS) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_key.ReadValue(kRegistryCurrentJavaVersion, &java_version); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!java_version.empty()) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_key.OpenKey(java_version.c_str(), KEY_QUERY_VALUE); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3. Install path of the JRE binaries is specified in "JavaHome" 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value under the Java version key. 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 java_plugin_directory; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (java_key.ReadValue(kRegistryJavaHome, &java_plugin_directory) == 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ERROR_SUCCESS) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4. The new plugin resides under the 'bin/new_plugin' 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subdirectory. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!java_plugin_directory.empty()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_plugin_directory.append(L"\\bin\\new_plugin"); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5. We don't know the exact name of the DLL but it's in the form 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NP*.dll so just invoke LoadPlugins on this path. 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dirs->insert(base::FilePath(java_plugin_directory)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsValid32BitImage(const base::FilePath& path) { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::MemoryMappedFile plugin_image; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_image.InitializeAsImageSection(path)) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::PEImage image(plugin_image.data()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PIMAGE_NT_HEADERS nt_headers = image.GetNTHeaders(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (nt_headers->FileHeader.Machine == IMAGE_FILE_MACHINE_I386); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if the given plugins share at least one mime type. This is used 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to differentiate newer versions of a plugin vs two plugins which happen to 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// have the same filename. 223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool HaveSharedMimeType(const WebPluginInfo& plugin1, 224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebPluginInfo& plugin2) { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < plugin1.mime_types.size(); ++i) { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < plugin2.mime_types.size(); ++j) { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (plugin1.mime_types[i].mime_type == plugin2.mime_types[j].mime_type) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Compares Windows style version strings (i.e. 1,2,3,4). Returns true if b's 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// version is newer than a's, or false if it's equal or older. 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsNewerVersion(const base::string16& a, const base::string16& b) { 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16> a_ver, b_ver; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(a, ',', &a_ver); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(b, ',', &b_ver); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (a_ver.size() == 1 && b_ver.size() == 1) { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(a, '.', &a_ver); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(b, '.', &b_ver); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (a_ver.size() != b_ver.size()) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < a_ver.size(); i++) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int cur_a, cur_b; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(a_ver[i], &cur_a); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringToInt(b_ver[i], &cur_b); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cur_a > cur_b) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cur_a < cur_b) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool PluginList::ReadWebPluginInfo(const base::FilePath& filename, 263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebPluginInfo* info) { 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // On windows, the way we get the mime types for the library is 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // to check the version information in the DLL itself. This 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // will be a string of the format: <type1>|<type2>|<type3>|... 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // For example: 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // video/quicktime|audio/aiff|image/jpeg 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<FileVersionInfo> version_info( 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FileVersionInfo::CreateFileVersionInfo(filename)); 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!version_info) { 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LOG_IF(ERROR, PluginList::DebugPluginLoading()) 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) << "Could not get version info for plugin " 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) << filename.value(); 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FileVersionInfoWin* version_info_win = 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static_cast<FileVersionInfoWin*>(version_info.get()); 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) info->name = version_info->product_name(); 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) info->desc = version_info->file_description(); 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) info->version = version_info->file_version(); 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) info->path = filename; 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(evan): Move the ParseMimeTypes code inline once Pepper is updated. 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!PluginList::ParseMimeTypes( 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::UTF16ToASCII(version_info_win->GetStringValue(L"MIMEType")), 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::UTF16ToASCII(version_info_win->GetStringValue(L"FileExtents")), 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) version_info_win->GetStringValue(L"FileOpenName"), 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &info->mime_types)) { 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LOG_IF(ERROR, PluginList::DebugPluginLoading()) 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) << "Plugin " << info->name << " has bad MIME types, skipping"; 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PluginList::GetPluginDirectories( 3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<base::FilePath>* plugin_dirs) { 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (PluginList::plugins_discovery_disabled_) 3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use a set for uniqueness, which we require, over order, which we do not. 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<base::FilePath> dirs; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load from the application-specific area 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAppDirectory(&dirs); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load from the executable area 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetExeDirectory(&dirs); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load Java 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetJavaDirectory(&dirs); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load firefox plugins too. This is mainly to try to locate 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a pre-installed Flash player. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFirefoxDirectory(&dirs); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Firefox hard-codes the paths of some popular plugins to ensure that 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the plugins are found. We are going to copy this as well. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAcrobatDirectory(&dirs); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQuicktimeDirectory(&dirs); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWindowsMediaDirectory(&dirs); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::set<base::FilePath>::iterator i = dirs.begin(); i != dirs.end(); ++i) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_dirs->push_back(*i); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginList::GetPluginsInDir( 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, std::vector<base::FilePath>* plugins) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIN32_FIND_DATA find_file_data; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HANDLE find_handle; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 dir = path.value(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FindFirstFile requires that you specify a wildcard for directories. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dir.append(L"\\NP*.DLL"); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_handle = FindFirstFile(dir.c_str(), &find_file_data); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (find_handle == INVALID_HANDLE_VALUE) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(find_file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath filename = path.Append(find_file_data.cFileName); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugins->push_back(filename); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (FindNextFile(find_handle, &find_file_data) != 0); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(GetLastError() == ERROR_NO_MORE_FILES); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FindClose(find_handle); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PluginList::GetPluginPathsFromRegistry( 3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<base::FilePath>* plugins) { 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (PluginList::plugins_discovery_disabled_) 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<base::FilePath> plugin_dirs; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPluginsInRegistryDirectory( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HKEY_CURRENT_USER, kRegistryMozillaPlugins, &plugin_dirs); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPluginsInRegistryDirectory( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HKEY_LOCAL_MACHINE, kRegistryMozillaPlugins, &plugin_dirs); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::set<base::FilePath>::iterator i = plugin_dirs.begin(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != plugin_dirs.end(); ++i) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugins->push_back(*i); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginList::ShouldLoadPluginUsingPluginList( 374ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const WebPluginInfo& info, 375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::vector<WebPluginInfo>* plugins) { 3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool should_check_version = true; 3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) { 3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::AutoLock lock(lock_); 3791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) should_check_version = 3801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::find(extra_plugin_paths_.begin(), extra_plugin_paths_.end(), 3811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) info.path) == extra_plugin_paths_.end(); 3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Version check for plugins that are not coming from |extra_plugin_paths_|. 3841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (should_check_version) { 3851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (size_t j = 0; j < plugins->size(); ++j) { 3861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::FilePath::StringType plugin1 = 3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::StringToLowerASCII((*plugins)[j].path.BaseName().value()); 3881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::FilePath::StringType plugin2 = 3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::StringToLowerASCII(info.path.BaseName().value()); 3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if ((plugin1 == plugin2 && HaveSharedMimeType((*plugins)[j], info)) || 3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (plugin1 == kJavaDeploy1 && plugin2 == kJavaDeploy2) || 3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (plugin1 == kJavaDeploy2 && plugin2 == kJavaDeploy1)) { 3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (IsNewerVersion(info.version, (*plugins)[j].version)) 3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; // We have loaded a plugin whose version is newer. 3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) plugins->erase(plugins->begin() + j); 3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The checks below only apply to NPAPI plugins. 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (info.type != WebPluginInfo::PLUGIN_TYPE_NPAPI) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::AutoLock lock(lock_); 4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If the plugin is in our internal list we should load it. 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < internal_plugins_.size(); ++i) { 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (info.path == internal_plugins_[i].path) 4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Troublemakers. 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType filename = 4166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::StringToLowerASCII(info.path.BaseName().value()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Depends on XPCOM. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == kMozillaActiveXPlugin) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable the Yahoo Application State plugin as it crashes the plugin 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process on return from NPObjectStub::OnInvoke. Please refer to 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://b/issue?id=1372124 for more information. 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == kYahooApplicationStatePlugin) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable the WangWang protocol handler plugin (npww.dll) as it crashes 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome during shutdown. Firefox also disables this plugin. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please refer to http://code.google.com/p/chromium/issues/detail?id=3953 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for more information. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == kWanWangProtocolHandlerPlugin) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only work with newer versions of the Java plugin which use NPAPI only 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and don't depend on XPCOM. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == kJavaPlugin1 || filename == kJavaPlugin2) { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath::StringType> ver; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString(info.version, '.', &ver); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int major, minor, update; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ver.size() == 4 && 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt(ver[0], &major) && 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt(ver[1], &minor) && 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringToInt(ver[2], &update)) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (major == 6 && minor == 0 && update < 120) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; // Java SE6 Update 11 or older. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special WMP handling: 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If both the new and old WMP plugins exist, only load the new one. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == kNewWMPPlugin) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; j < plugins->size(); ++j) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*plugins)[j].path.BaseName().value() == kOldWMPPlugin) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugins->erase(plugins->begin() + j); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (filename == kOldWMPPlugin) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; j < plugins->size(); ++j) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*plugins)[j].path.BaseName().value() == kNewWMPPlugin) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath plugin_path(info.path); 467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ARCH_CPU_X86_64) 468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The plugin in question could be a 32 bit plugin which we cannot load. 469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (IsValid32BitImage(base::MakeAbsoluteFilePath(plugin_path))) 470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else 472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The plugin in question could be a 64 bit plugin which we cannot load. 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!IsValid32BitImage(base::MakeAbsoluteFilePath(plugin_path))) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 479ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace content 480