OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/plugins/npapi/plugin_list.h" | 5 #include "webkit/plugins/npapi/plugin_list.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 const char16 kRegistryFirefoxInstalled[] = | 36 const char16 kRegistryFirefoxInstalled[] = |
37 L"SOFTWARE\\Mozilla\\Mozilla Firefox"; | 37 L"SOFTWARE\\Mozilla\\Mozilla Firefox"; |
38 const char16 kRegistryJava[] = | 38 const char16 kRegistryJava[] = |
39 L"Software\\JavaSoft\\Java Runtime Environment"; | 39 L"Software\\JavaSoft\\Java Runtime Environment"; |
40 const char16 kRegistryBrowserJavaVersion[] = L"BrowserJavaVersion"; | 40 const char16 kRegistryBrowserJavaVersion[] = L"BrowserJavaVersion"; |
41 const char16 kRegistryCurrentJavaVersion[] = L"CurrentVersion"; | 41 const char16 kRegistryCurrentJavaVersion[] = L"CurrentVersion"; |
42 const char16 kRegistryJavaHome[] = L"JavaHome"; | 42 const char16 kRegistryJavaHome[] = L"JavaHome"; |
43 const char16 kJavaDeploy1[] = L"npdeploytk.dll"; | 43 const char16 kJavaDeploy1[] = L"npdeploytk.dll"; |
44 const char16 kJavaDeploy2[] = L"npdeployjava1.dll"; | 44 const char16 kJavaDeploy2[] = L"npdeployjava1.dll"; |
45 | 45 |
46 FilePath AppendPluginsDir(const FilePath& path) { | 46 base::FilePath AppendPluginsDir(const base::FilePath& path) { |
47 return path.AppendASCII("plugins"); | 47 return path.AppendASCII("plugins"); |
48 } | 48 } |
49 | 49 |
50 // Gets the directory where the application data and libraries exist. This | 50 // Gets the directory where the application data and libraries exist. This |
51 // may be a versioned subdirectory, or it may be the same directory as the | 51 // may be a versioned subdirectory, or it may be the same directory as the |
52 // GetExeDirectory(), depending on the embedder's implementation. | 52 // GetExeDirectory(), depending on the embedder's implementation. |
53 // Path is an output parameter to receive the path. | 53 // Path is an output parameter to receive the path. |
54 void GetAppDirectory(std::set<FilePath>* plugin_dirs) { | 54 void GetAppDirectory(std::set<base::FilePath>* plugin_dirs) { |
55 FilePath app_path; | 55 base::FilePath app_path; |
56 if (!PathService::Get(base::DIR_MODULE, &app_path)) | 56 if (!PathService::Get(base::DIR_MODULE, &app_path)) |
57 return; | 57 return; |
58 plugin_dirs->insert(AppendPluginsDir(app_path)); | 58 plugin_dirs->insert(AppendPluginsDir(app_path)); |
59 } | 59 } |
60 | 60 |
61 // Gets the directory where the launching executable resides on disk. | 61 // Gets the directory where the launching executable resides on disk. |
62 // Path is an output parameter to receive the path. | 62 // Path is an output parameter to receive the path. |
63 void GetExeDirectory(std::set<FilePath>* plugin_dirs) { | 63 void GetExeDirectory(std::set<base::FilePath>* plugin_dirs) { |
64 FilePath exe_path; | 64 base::FilePath exe_path; |
65 if (!PathService::Get(base::DIR_EXE, &exe_path)) | 65 if (!PathService::Get(base::DIR_EXE, &exe_path)) |
66 return; | 66 return; |
67 plugin_dirs->insert(AppendPluginsDir(exe_path)); | 67 plugin_dirs->insert(AppendPluginsDir(exe_path)); |
68 } | 68 } |
69 | 69 |
70 // Gets the installed path for a registered app. | 70 // Gets the installed path for a registered app. |
71 bool GetInstalledPath(const char16* app, FilePath* out) { | 71 bool GetInstalledPath(const char16* app, base::FilePath* out) { |
72 string16 reg_path(kRegistryApps); | 72 string16 reg_path(kRegistryApps); |
73 reg_path.append(L"\\"); | 73 reg_path.append(L"\\"); |
74 reg_path.append(app); | 74 reg_path.append(app); |
75 | 75 |
76 base::win::RegKey hkcu_key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ); | 76 base::win::RegKey hkcu_key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ); |
77 string16 path; | 77 string16 path; |
78 // As of Win7 AppPaths can also be registered in HKCU: http://goo.gl/UgFOf. | 78 // As of Win7 AppPaths can also be registered in HKCU: http://goo.gl/UgFOf. |
79 if (base::win::GetVersion() >= base::win::VERSION_WIN7 && | 79 if (base::win::GetVersion() >= base::win::VERSION_WIN7 && |
80 hkcu_key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) { | 80 hkcu_key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) { |
81 *out = FilePath(path); | 81 *out = base::FilePath(path); |
82 return true; | 82 return true; |
83 } else { | 83 } else { |
84 base::win::RegKey hklm_key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ); | 84 base::win::RegKey hklm_key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ); |
85 if (hklm_key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) { | 85 if (hklm_key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) { |
86 *out = FilePath(path); | 86 *out = base::FilePath(path); |
87 return true; | 87 return true; |
88 } | 88 } |
89 } | 89 } |
90 | 90 |
91 return false; | 91 return false; |
92 } | 92 } |
93 | 93 |
94 // Search the registry at the given path and detect plugin directories. | 94 // Search the registry at the given path and detect plugin directories. |
95 void GetPluginsInRegistryDirectory( | 95 void GetPluginsInRegistryDirectory( |
96 HKEY root_key, | 96 HKEY root_key, |
97 const string16& registry_folder, | 97 const string16& registry_folder, |
98 std::set<FilePath>* plugin_dirs) { | 98 std::set<base::FilePath>* plugin_dirs) { |
99 for (base::win::RegistryKeyIterator iter(root_key, registry_folder.c_str()); | 99 for (base::win::RegistryKeyIterator iter(root_key, registry_folder.c_str()); |
100 iter.Valid(); ++iter) { | 100 iter.Valid(); ++iter) { |
101 // Use the registry to gather plugin across the file system. | 101 // Use the registry to gather plugin across the file system. |
102 string16 reg_path = registry_folder; | 102 string16 reg_path = registry_folder; |
103 reg_path.append(L"\\"); | 103 reg_path.append(L"\\"); |
104 reg_path.append(iter.Name()); | 104 reg_path.append(iter.Name()); |
105 base::win::RegKey key(root_key, reg_path.c_str(), KEY_READ); | 105 base::win::RegKey key(root_key, reg_path.c_str(), KEY_READ); |
106 | 106 |
107 string16 path; | 107 string16 path; |
108 if (key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) | 108 if (key.ReadValue(kRegistryPath, &path) == ERROR_SUCCESS) |
109 plugin_dirs->insert(FilePath(path)); | 109 plugin_dirs->insert(base::FilePath(path)); |
110 } | 110 } |
111 } | 111 } |
112 | 112 |
113 // Enumerate through the registry key to find all installed FireFox paths. | 113 // Enumerate through the registry key to find all installed FireFox paths. |
114 // FireFox 3 beta and version 2 can coexist. See bug: 1025003 | 114 // FireFox 3 beta and version 2 can coexist. See bug: 1025003 |
115 void GetFirefoxInstalledPaths(std::vector<FilePath>* out) { | 115 void GetFirefoxInstalledPaths(std::vector<base::FilePath>* out) { |
116 base::win::RegistryKeyIterator it(HKEY_LOCAL_MACHINE, | 116 base::win::RegistryKeyIterator it(HKEY_LOCAL_MACHINE, |
117 kRegistryFirefoxInstalled); | 117 kRegistryFirefoxInstalled); |
118 for (; it.Valid(); ++it) { | 118 for (; it.Valid(); ++it) { |
119 string16 full_path = string16(kRegistryFirefoxInstalled) + L"\\" + | 119 string16 full_path = string16(kRegistryFirefoxInstalled) + L"\\" + |
120 it.Name() + L"\\Main"; | 120 it.Name() + L"\\Main"; |
121 base::win::RegKey key(HKEY_LOCAL_MACHINE, full_path.c_str(), KEY_READ); | 121 base::win::RegKey key(HKEY_LOCAL_MACHINE, full_path.c_str(), KEY_READ); |
122 string16 install_dir; | 122 string16 install_dir; |
123 if (key.ReadValue(L"Install Directory", &install_dir) != ERROR_SUCCESS) | 123 if (key.ReadValue(L"Install Directory", &install_dir) != ERROR_SUCCESS) |
124 continue; | 124 continue; |
125 out->push_back(FilePath(install_dir)); | 125 out->push_back(base::FilePath(install_dir)); |
126 } | 126 } |
127 } | 127 } |
128 | 128 |
129 // Get plugin directory locations from the Firefox install path. This is kind | 129 // Get plugin directory locations from the Firefox install path. This is kind |
130 // of a kludge, but it helps us locate the flash player for users that | 130 // of a kludge, but it helps us locate the flash player for users that |
131 // already have it for firefox. Not having to download yet-another-plugin | 131 // already have it for firefox. Not having to download yet-another-plugin |
132 // is a good thing. | 132 // is a good thing. |
133 void GetFirefoxDirectory(std::set<FilePath>* plugin_dirs) { | 133 void GetFirefoxDirectory(std::set<base::FilePath>* plugin_dirs) { |
134 std::vector<FilePath> paths; | 134 std::vector<base::FilePath> paths; |
135 GetFirefoxInstalledPaths(&paths); | 135 GetFirefoxInstalledPaths(&paths); |
136 for (unsigned int i = 0; i < paths.size(); ++i) { | 136 for (unsigned int i = 0; i < paths.size(); ++i) { |
137 plugin_dirs->insert(AppendPluginsDir(paths[i])); | 137 plugin_dirs->insert(AppendPluginsDir(paths[i])); |
138 } | 138 } |
139 | 139 |
140 FilePath firefox_app_data_plugin_path; | 140 base::FilePath firefox_app_data_plugin_path; |
141 if (PathService::Get(base::DIR_APP_DATA, &firefox_app_data_plugin_path)) { | 141 if (PathService::Get(base::DIR_APP_DATA, &firefox_app_data_plugin_path)) { |
142 firefox_app_data_plugin_path = | 142 firefox_app_data_plugin_path = |
143 firefox_app_data_plugin_path.AppendASCII("Mozilla"); | 143 firefox_app_data_plugin_path.AppendASCII("Mozilla"); |
144 plugin_dirs->insert(AppendPluginsDir(firefox_app_data_plugin_path)); | 144 plugin_dirs->insert(AppendPluginsDir(firefox_app_data_plugin_path)); |
145 } | 145 } |
146 } | 146 } |
147 | 147 |
148 // Hardcoded logic to detect Acrobat plugins locations. | 148 // Hardcoded logic to detect Acrobat plugins locations. |
149 void GetAcrobatDirectory(std::set<FilePath>* plugin_dirs) { | 149 void GetAcrobatDirectory(std::set<base::FilePath>* plugin_dirs) { |
150 FilePath path; | 150 base::FilePath path; |
151 if (!GetInstalledPath(kRegistryAcrobatReader, &path) && | 151 if (!GetInstalledPath(kRegistryAcrobatReader, &path) && |
152 !GetInstalledPath(kRegistryAcrobat, &path)) { | 152 !GetInstalledPath(kRegistryAcrobat, &path)) { |
153 return; | 153 return; |
154 } | 154 } |
155 | 155 |
156 plugin_dirs->insert(path.Append(L"Browser")); | 156 plugin_dirs->insert(path.Append(L"Browser")); |
157 } | 157 } |
158 | 158 |
159 // Hardcoded logic to detect QuickTime plugin location. | 159 // Hardcoded logic to detect QuickTime plugin location. |
160 void GetQuicktimeDirectory(std::set<FilePath>* plugin_dirs) { | 160 void GetQuicktimeDirectory(std::set<base::FilePath>* plugin_dirs) { |
161 FilePath path; | 161 base::FilePath path; |
162 if (GetInstalledPath(kRegistryQuickTime, &path)) | 162 if (GetInstalledPath(kRegistryQuickTime, &path)) |
163 plugin_dirs->insert(AppendPluginsDir(path)); | 163 plugin_dirs->insert(AppendPluginsDir(path)); |
164 } | 164 } |
165 | 165 |
166 // Hardcoded logic to detect Windows Media Player plugin location. | 166 // Hardcoded logic to detect Windows Media Player plugin location. |
167 void GetWindowsMediaDirectory(std::set<FilePath>* plugin_dirs) { | 167 void GetWindowsMediaDirectory(std::set<base::FilePath>* plugin_dirs) { |
168 FilePath path; | 168 base::FilePath path; |
169 if (GetInstalledPath(kRegistryWindowsMedia, &path)) | 169 if (GetInstalledPath(kRegistryWindowsMedia, &path)) |
170 plugin_dirs->insert(path); | 170 plugin_dirs->insert(path); |
171 } | 171 } |
172 | 172 |
173 // Hardcoded logic to detect Java plugin location. | 173 // Hardcoded logic to detect Java plugin location. |
174 void GetJavaDirectory(std::set<FilePath>* plugin_dirs) { | 174 void GetJavaDirectory(std::set<base::FilePath>* plugin_dirs) { |
175 // Load the new NPAPI Java plugin | 175 // Load the new NPAPI Java plugin |
176 // 1. Open the main JRE key under HKLM | 176 // 1. Open the main JRE key under HKLM |
177 base::win::RegKey java_key(HKEY_LOCAL_MACHINE, kRegistryJava, | 177 base::win::RegKey java_key(HKEY_LOCAL_MACHINE, kRegistryJava, |
178 KEY_QUERY_VALUE); | 178 KEY_QUERY_VALUE); |
179 | 179 |
180 // 2. Read the current Java version | 180 // 2. Read the current Java version |
181 string16 java_version; | 181 string16 java_version; |
182 if (java_key.ReadValue(kRegistryBrowserJavaVersion, &java_version) != | 182 if (java_key.ReadValue(kRegistryBrowserJavaVersion, &java_version) != |
183 ERROR_SUCCESS) { | 183 ERROR_SUCCESS) { |
184 java_key.ReadValue(kRegistryCurrentJavaVersion, &java_version); | 184 java_key.ReadValue(kRegistryCurrentJavaVersion, &java_version); |
185 } | 185 } |
186 | 186 |
187 if (!java_version.empty()) { | 187 if (!java_version.empty()) { |
188 java_key.OpenKey(java_version.c_str(), KEY_QUERY_VALUE); | 188 java_key.OpenKey(java_version.c_str(), KEY_QUERY_VALUE); |
189 | 189 |
190 // 3. Install path of the JRE binaries is specified in "JavaHome" | 190 // 3. Install path of the JRE binaries is specified in "JavaHome" |
191 // value under the Java version key. | 191 // value under the Java version key. |
192 string16 java_plugin_directory; | 192 string16 java_plugin_directory; |
193 if (java_key.ReadValue(kRegistryJavaHome, &java_plugin_directory) == | 193 if (java_key.ReadValue(kRegistryJavaHome, &java_plugin_directory) == |
194 ERROR_SUCCESS) { | 194 ERROR_SUCCESS) { |
195 // 4. The new plugin resides under the 'bin/new_plugin' | 195 // 4. The new plugin resides under the 'bin/new_plugin' |
196 // subdirectory. | 196 // subdirectory. |
197 DCHECK(!java_plugin_directory.empty()); | 197 DCHECK(!java_plugin_directory.empty()); |
198 java_plugin_directory.append(L"\\bin\\new_plugin"); | 198 java_plugin_directory.append(L"\\bin\\new_plugin"); |
199 | 199 |
200 // 5. We don't know the exact name of the DLL but it's in the form | 200 // 5. We don't know the exact name of the DLL but it's in the form |
201 // NP*.dll so just invoke LoadPlugins on this path. | 201 // NP*.dll so just invoke LoadPlugins on this path. |
202 plugin_dirs->insert(FilePath(java_plugin_directory)); | 202 plugin_dirs->insert(base::FilePath(java_plugin_directory)); |
203 } | 203 } |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 bool IsValid32BitImage(const FilePath& path) { | 207 bool IsValid32BitImage(const base::FilePath& path) { |
208 file_util::MemoryMappedFile plugin_image; | 208 file_util::MemoryMappedFile plugin_image; |
209 | 209 |
210 if (!plugin_image.InitializeAsImageSection(path)) | 210 if (!plugin_image.InitializeAsImageSection(path)) |
211 return false; | 211 return false; |
212 | 212 |
213 base::win::PEImage image(plugin_image.data()); | 213 base::win::PEImage image(plugin_image.data()); |
214 | 214 |
215 PIMAGE_NT_HEADERS nt_headers = image.GetNTHeaders(); | 215 PIMAGE_NT_HEADERS nt_headers = image.GetNTHeaders(); |
216 return (nt_headers->FileHeader.Machine == IMAGE_FILE_MACHINE_I386); | 216 return (nt_headers->FileHeader.Machine == IMAGE_FILE_MACHINE_I386); |
217 } | 217 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 } // namespace | 259 } // namespace |
260 | 260 |
261 namespace webkit { | 261 namespace webkit { |
262 namespace npapi { | 262 namespace npapi { |
263 | 263 |
264 void PluginList::PlatformInit() { | 264 void PluginList::PlatformInit() { |
265 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 265 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
266 dont_load_new_wmp_ = command_line.HasSwitch(switches::kUseOldWMPPlugin); | 266 dont_load_new_wmp_ = command_line.HasSwitch(switches::kUseOldWMPPlugin); |
267 } | 267 } |
268 | 268 |
269 void PluginList::GetPluginDirectories(std::vector<FilePath>* plugin_dirs) { | 269 void PluginList::GetPluginDirectories(std::vector<base::FilePath>* plugin_dirs)
{ |
270 // We use a set for uniqueness, which we require, over order, which we do not. | 270 // We use a set for uniqueness, which we require, over order, which we do not. |
271 std::set<FilePath> dirs; | 271 std::set<base::FilePath> dirs; |
272 | 272 |
273 // Load from the application-specific area | 273 // Load from the application-specific area |
274 GetAppDirectory(&dirs); | 274 GetAppDirectory(&dirs); |
275 | 275 |
276 // Load from the executable area | 276 // Load from the executable area |
277 GetExeDirectory(&dirs); | 277 GetExeDirectory(&dirs); |
278 | 278 |
279 // Load Java | 279 // Load Java |
280 GetJavaDirectory(&dirs); | 280 GetJavaDirectory(&dirs); |
281 | 281 |
282 // Load firefox plugins too. This is mainly to try to locate | 282 // Load firefox plugins too. This is mainly to try to locate |
283 // a pre-installed Flash player. | 283 // a pre-installed Flash player. |
284 GetFirefoxDirectory(&dirs); | 284 GetFirefoxDirectory(&dirs); |
285 | 285 |
286 // Firefox hard-codes the paths of some popular plugins to ensure that | 286 // Firefox hard-codes the paths of some popular plugins to ensure that |
287 // the plugins are found. We are going to copy this as well. | 287 // the plugins are found. We are going to copy this as well. |
288 GetAcrobatDirectory(&dirs); | 288 GetAcrobatDirectory(&dirs); |
289 GetQuicktimeDirectory(&dirs); | 289 GetQuicktimeDirectory(&dirs); |
290 GetWindowsMediaDirectory(&dirs); | 290 GetWindowsMediaDirectory(&dirs); |
291 | 291 |
292 for (std::set<FilePath>::iterator i = dirs.begin(); i != dirs.end(); ++i) | 292 for (std::set<base::FilePath>::iterator i = dirs.begin(); i != dirs.end(); ++i
) |
293 plugin_dirs->push_back(*i); | 293 plugin_dirs->push_back(*i); |
294 } | 294 } |
295 | 295 |
296 void PluginList::GetPluginsInDir( | 296 void PluginList::GetPluginsInDir( |
297 const FilePath& path, std::vector<FilePath>* plugins) { | 297 const base::FilePath& path, std::vector<base::FilePath>* plugins) { |
298 WIN32_FIND_DATA find_file_data; | 298 WIN32_FIND_DATA find_file_data; |
299 HANDLE find_handle; | 299 HANDLE find_handle; |
300 | 300 |
301 string16 dir = path.value(); | 301 string16 dir = path.value(); |
302 // FindFirstFile requires that you specify a wildcard for directories. | 302 // FindFirstFile requires that you specify a wildcard for directories. |
303 dir.append(L"\\NP*.DLL"); | 303 dir.append(L"\\NP*.DLL"); |
304 | 304 |
305 find_handle = FindFirstFile(dir.c_str(), &find_file_data); | 305 find_handle = FindFirstFile(dir.c_str(), &find_file_data); |
306 if (find_handle == INVALID_HANDLE_VALUE) | 306 if (find_handle == INVALID_HANDLE_VALUE) |
307 return; | 307 return; |
308 | 308 |
309 do { | 309 do { |
310 if (!(find_file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { | 310 if (!(find_file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { |
311 FilePath filename = path.Append(find_file_data.cFileName); | 311 base::FilePath filename = path.Append(find_file_data.cFileName); |
312 plugins->push_back(filename); | 312 plugins->push_back(filename); |
313 } | 313 } |
314 } while (FindNextFile(find_handle, &find_file_data) != 0); | 314 } while (FindNextFile(find_handle, &find_file_data) != 0); |
315 | 315 |
316 DCHECK(GetLastError() == ERROR_NO_MORE_FILES); | 316 DCHECK(GetLastError() == ERROR_NO_MORE_FILES); |
317 FindClose(find_handle); | 317 FindClose(find_handle); |
318 } | 318 } |
319 | 319 |
320 void PluginList::GetPluginPathsFromRegistry(std::vector<FilePath>* plugins) { | 320 void PluginList::GetPluginPathsFromRegistry(std::vector<base::FilePath>* plugins
) { |
321 std::set<FilePath> plugin_dirs; | 321 std::set<base::FilePath> plugin_dirs; |
322 | 322 |
323 GetPluginsInRegistryDirectory( | 323 GetPluginsInRegistryDirectory( |
324 HKEY_CURRENT_USER, kRegistryMozillaPlugins, &plugin_dirs); | 324 HKEY_CURRENT_USER, kRegistryMozillaPlugins, &plugin_dirs); |
325 GetPluginsInRegistryDirectory( | 325 GetPluginsInRegistryDirectory( |
326 HKEY_LOCAL_MACHINE, kRegistryMozillaPlugins, &plugin_dirs); | 326 HKEY_LOCAL_MACHINE, kRegistryMozillaPlugins, &plugin_dirs); |
327 | 327 |
328 for (std::set<FilePath>::iterator i = plugin_dirs.begin(); | 328 for (std::set<base::FilePath>::iterator i = plugin_dirs.begin(); |
329 i != plugin_dirs.end(); ++i) { | 329 i != plugin_dirs.end(); ++i) { |
330 plugins->push_back(*i); | 330 plugins->push_back(*i); |
331 } | 331 } |
332 } | 332 } |
333 | 333 |
334 bool PluginList::ShouldLoadPluginUsingPluginList( | 334 bool PluginList::ShouldLoadPluginUsingPluginList( |
335 const webkit::WebPluginInfo& info, | 335 const webkit::WebPluginInfo& info, |
336 std::vector<webkit::WebPluginInfo>* plugins) { | 336 std::vector<webkit::WebPluginInfo>* plugins) { |
337 // Version check | 337 // Version check |
338 for (size_t j = 0; j < plugins->size(); ++j) { | 338 for (size_t j = 0; j < plugins->size(); ++j) { |
339 FilePath::StringType plugin1 = | 339 base::FilePath::StringType plugin1 = |
340 StringToLowerASCII((*plugins)[j].path.BaseName().value()); | 340 StringToLowerASCII((*plugins)[j].path.BaseName().value()); |
341 FilePath::StringType plugin2 = | 341 base::FilePath::StringType plugin2 = |
342 StringToLowerASCII(info.path.BaseName().value()); | 342 StringToLowerASCII(info.path.BaseName().value()); |
343 if ((plugin1 == plugin2 && HaveSharedMimeType((*plugins)[j], info)) || | 343 if ((plugin1 == plugin2 && HaveSharedMimeType((*plugins)[j], info)) || |
344 (plugin1 == kJavaDeploy1 && plugin2 == kJavaDeploy2) || | 344 (plugin1 == kJavaDeploy1 && plugin2 == kJavaDeploy2) || |
345 (plugin1 == kJavaDeploy2 && plugin2 == kJavaDeploy1)) { | 345 (plugin1 == kJavaDeploy2 && plugin2 == kJavaDeploy1)) { |
346 if (!IsNewerVersion((*plugins)[j].version, info.version)) | 346 if (!IsNewerVersion((*plugins)[j].version, info.version)) |
347 return false; // We have loaded a plugin whose version is newer. | 347 return false; // We have loaded a plugin whose version is newer. |
348 plugins->erase(plugins->begin() + j); | 348 plugins->erase(plugins->begin() + j); |
349 break; | 349 break; |
350 } | 350 } |
351 } | 351 } |
352 | 352 |
353 // The checks below only apply to NPAPI plugins. | 353 // The checks below only apply to NPAPI plugins. |
354 if (info.type != WebPluginInfo::PLUGIN_TYPE_NPAPI) | 354 if (info.type != WebPluginInfo::PLUGIN_TYPE_NPAPI) |
355 return true; | 355 return true; |
356 | 356 |
357 // If the plugin is in our internal list we should load it. | 357 // If the plugin is in our internal list we should load it. |
358 for (size_t i = 0; i < internal_plugins_.size(); ++i) { | 358 for (size_t i = 0; i < internal_plugins_.size(); ++i) { |
359 if (info.path == internal_plugins_[i].info.path) | 359 if (info.path == internal_plugins_[i].info.path) |
360 return true; | 360 return true; |
361 } | 361 } |
362 | 362 |
363 // Troublemakers. | 363 // Troublemakers. |
364 FilePath::StringType filename = | 364 base::FilePath::StringType filename = |
365 StringToLowerASCII(info.path.BaseName().value()); | 365 StringToLowerASCII(info.path.BaseName().value()); |
366 // Depends on XPCOM. | 366 // Depends on XPCOM. |
367 if (filename == kMozillaActiveXPlugin) | 367 if (filename == kMozillaActiveXPlugin) |
368 return false; | 368 return false; |
369 | 369 |
370 // Disable the Yahoo Application State plugin as it crashes the plugin | 370 // Disable the Yahoo Application State plugin as it crashes the plugin |
371 // process on return from NPObjectStub::OnInvoke. Please refer to | 371 // process on return from NPObjectStub::OnInvoke. Please refer to |
372 // http://b/issue?id=1372124 for more information. | 372 // http://b/issue?id=1372124 for more information. |
373 if (filename == kYahooApplicationStatePlugin) | 373 if (filename == kYahooApplicationStatePlugin) |
374 return false; | 374 return false; |
375 | 375 |
376 // Disable the WangWang protocol handler plugin (npww.dll) as it crashes | 376 // Disable the WangWang protocol handler plugin (npww.dll) as it crashes |
377 // chrome during shutdown. Firefox also disables this plugin. | 377 // chrome during shutdown. Firefox also disables this plugin. |
378 // Please refer to http://code.google.com/p/chromium/issues/detail?id=3953 | 378 // Please refer to http://code.google.com/p/chromium/issues/detail?id=3953 |
379 // for more information. | 379 // for more information. |
380 if (filename == kWanWangProtocolHandlerPlugin) | 380 if (filename == kWanWangProtocolHandlerPlugin) |
381 return false; | 381 return false; |
382 | 382 |
383 // We only work with newer versions of the Java plugin which use NPAPI only | 383 // We only work with newer versions of the Java plugin which use NPAPI only |
384 // and don't depend on XPCOM. | 384 // and don't depend on XPCOM. |
385 if (filename == kJavaPlugin1 || filename == kJavaPlugin2) { | 385 if (filename == kJavaPlugin1 || filename == kJavaPlugin2) { |
386 std::vector<FilePath::StringType> ver; | 386 std::vector<base::FilePath::StringType> ver; |
387 base::SplitString(info.version, '.', &ver); | 387 base::SplitString(info.version, '.', &ver); |
388 int major, minor, update; | 388 int major, minor, update; |
389 if (ver.size() == 4 && | 389 if (ver.size() == 4 && |
390 base::StringToInt(ver[0], &major) && | 390 base::StringToInt(ver[0], &major) && |
391 base::StringToInt(ver[1], &minor) && | 391 base::StringToInt(ver[1], &minor) && |
392 base::StringToInt(ver[2], &update)) { | 392 base::StringToInt(ver[2], &update)) { |
393 if (major == 6 && minor == 0 && update < 120) | 393 if (major == 6 && minor == 0 && update < 120) |
394 return false; // Java SE6 Update 11 or older. | 394 return false; // Java SE6 Update 11 or older. |
395 } | 395 } |
396 } | 396 } |
(...skipping 13 matching lines...) Expand all Loading... |
410 | 410 |
411 } else if (filename == kOldWMPPlugin) { | 411 } else if (filename == kOldWMPPlugin) { |
412 for (size_t j = 0; j < plugins->size(); ++j) { | 412 for (size_t j = 0; j < plugins->size(); ++j) { |
413 if ((*plugins)[j].path.BaseName().value() == kNewWMPPlugin) | 413 if ((*plugins)[j].path.BaseName().value() == kNewWMPPlugin) |
414 return false; | 414 return false; |
415 } | 415 } |
416 } | 416 } |
417 | 417 |
418 #if !defined(ARCH_CPU_X86_64) | 418 #if !defined(ARCH_CPU_X86_64) |
419 // The plugin in question could be a 64 bit plugin which we cannot load. | 419 // The plugin in question could be a 64 bit plugin which we cannot load. |
420 FilePath plugin_path(info.path); | 420 base::FilePath plugin_path(info.path); |
421 file_util::AbsolutePath(&plugin_path); | 421 file_util::AbsolutePath(&plugin_path); |
422 if (!IsValid32BitImage(plugin_path)) | 422 if (!IsValid32BitImage(plugin_path)) |
423 return false; | 423 return false; |
424 #endif | 424 #endif |
425 return true; | 425 return true; |
426 } | 426 } |
427 | 427 |
428 } // namespace npapi | 428 } // namespace npapi |
429 } // namespace webkit | 429 } // namespace webkit |
OLD | NEW |