OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/glue/plugins/plugin_list.h" | 5 #include "webkit/glue/plugins/plugin_list.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/time.h" | 10 #include "base/time.h" |
11 #include "net/base/mime_util.h" | 11 #include "net/base/mime_util.h" |
12 #include "webkit/default_plugin/plugin_main.h" | 12 #include "webkit/default_plugin/plugin_main.h" |
13 #include "webkit/glue/plugins/plugin_constants_win.h" | 13 #include "webkit/glue/plugins/plugin_constants_win.h" |
14 #include "webkit/glue/plugins/plugin_lib.h" | 14 #include "webkit/glue/plugins/plugin_lib.h" |
15 #include "webkit/glue/webkit_glue.h" | 15 #include "webkit/glue/webkit_glue.h" |
16 #include "googleurl/src/gurl.h" | 16 #include "googleurl/src/gurl.h" |
17 | 17 |
| 18 #define kNpGoogleNaClPlugin (FILE_PATH_LITERAL("npgooglenaclplugin")) |
| 19 |
18 namespace NPAPI { | 20 namespace NPAPI { |
19 | 21 |
20 base::LazyInstance<PluginList> g_singleton(base::LINKER_INITIALIZED); | 22 base::LazyInstance<PluginList> g_singleton(base::LINKER_INITIALIZED); |
21 | 23 |
22 // static | 24 // static |
23 PluginList* PluginList::Singleton() { | 25 PluginList* PluginList::Singleton() { |
24 return g_singleton.Pointer(); | 26 return g_singleton.Pointer(); |
25 } | 27 } |
26 | 28 |
27 bool PluginList::PluginsLoaded() { | 29 bool PluginList::PluginsLoaded() { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 mime_type.description.erase(ext); | 108 mime_type.description.erase(ext); |
107 } | 109 } |
108 } | 110 } |
109 | 111 |
110 info->mime_types.push_back(mime_type); | 112 info->mime_types.push_back(mime_type); |
111 } | 113 } |
112 | 114 |
113 return true; | 115 return true; |
114 } | 116 } |
115 | 117 |
116 PluginList::PluginList() : plugins_loaded_(false) { | 118 PluginList::PluginList() : plugins_loaded_(false), |
| 119 use_internal_nacl_(false) { |
117 PlatformInit(); | 120 PlatformInit(); |
118 | 121 |
119 #if defined(OS_WIN) | 122 #if defined(OS_WIN) |
120 const PluginVersionInfo default_plugin = { | 123 const PluginVersionInfo default_plugin = { |
121 FilePath(kDefaultPluginLibraryName), | 124 FilePath(kDefaultPluginLibraryName), |
122 L"Default Plug-in", | 125 L"Default Plug-in", |
123 L"Provides functionality for installing third-party plug-ins", | 126 L"Provides functionality for installing third-party plug-ins", |
124 L"1", | 127 L"1", |
125 L"*", | 128 L"*", |
126 L"", | 129 L"", |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 LoadPlugin(extra_plugin_paths[i], &new_plugins); | 164 LoadPlugin(extra_plugin_paths[i], &new_plugins); |
162 | 165 |
163 for (size_t i = 0; i < extra_plugin_dirs.size(); ++i) { | 166 for (size_t i = 0; i < extra_plugin_dirs.size(); ++i) { |
164 LoadPluginsFromDir(extra_plugin_dirs[i], &new_plugins); | 167 LoadPluginsFromDir(extra_plugin_dirs[i], &new_plugins); |
165 } | 168 } |
166 | 169 |
167 for (size_t i = 0; i < directories_to_scan.size(); ++i) { | 170 for (size_t i = 0; i < directories_to_scan.size(); ++i) { |
168 LoadPluginsFromDir(directories_to_scan[i], &new_plugins); | 171 LoadPluginsFromDir(directories_to_scan[i], &new_plugins); |
169 } | 172 } |
170 | 173 |
| 174 if (use_internal_nacl_) { |
| 175 LoadPlugin(FilePath(kNaClPluginLibraryName), &new_plugins); |
| 176 } |
| 177 |
171 if (webkit_glue::IsDefaultPluginEnabled()) | 178 if (webkit_glue::IsDefaultPluginEnabled()) |
172 LoadPlugin(FilePath(kDefaultPluginLibraryName), &new_plugins); | 179 LoadPlugin(FilePath(kDefaultPluginLibraryName), &new_plugins); |
173 | 180 |
174 base::TimeTicks end_time = base::TimeTicks::Now(); | 181 base::TimeTicks end_time = base::TimeTicks::Now(); |
175 base::TimeDelta elapsed = end_time - start_time; | 182 base::TimeDelta elapsed = end_time - start_time; |
176 DLOG(INFO) << "Loaded plugin list in " << elapsed.InMilliseconds() << " ms."; | 183 DLOG(INFO) << "Loaded plugin list in " << elapsed.InMilliseconds() << " ms."; |
177 | 184 |
178 AutoLock lock(lock_); | 185 AutoLock lock(lock_); |
179 plugins_ = new_plugins; | 186 plugins_ = new_plugins; |
180 plugins_loaded_ = true; | 187 plugins_loaded_ = true; |
(...skipping 21 matching lines...) Expand all Loading... |
202 // to handle mimeTypes on its own. | 209 // to handle mimeTypes on its own. |
203 const std::string &mime_type = plugin_info.mime_types[i].mime_type; | 210 const std::string &mime_type = plugin_info.mime_types[i].mime_type; |
204 if (mime_type == "*" ) | 211 if (mime_type == "*" ) |
205 return; | 212 return; |
206 } | 213 } |
207 } | 214 } |
208 | 215 |
209 plugins->push_back(plugin_info); | 216 plugins->push_back(plugin_info); |
210 } | 217 } |
211 | 218 |
| 219 bool PluginList::ShouldLoadPlugin(const WebPluginInfo& info, |
| 220 std::vector<WebPluginInfo>* plugins) { |
| 221 FilePath::StringType filename = |
| 222 StringToLowerASCII(info.path.BaseName().value()); |
| 223 |
| 224 // Don't load the external version of NaCl when we need to use |
| 225 // the internal one. |
| 226 if (use_internal_nacl_) { |
| 227 if (std::wstring::npos != filename.find(kNpGoogleNaClPlugin)) |
| 228 return false; |
| 229 } |
| 230 return PlatformShouldLoadPlugin(info, plugins); |
| 231 } |
| 232 |
212 bool PluginList::FindPlugin(const std::string& mime_type, | 233 bool PluginList::FindPlugin(const std::string& mime_type, |
213 bool allow_wildcard, | 234 bool allow_wildcard, |
214 WebPluginInfo* info) { | 235 WebPluginInfo* info) { |
215 DCHECK(mime_type == StringToLowerASCII(mime_type)); | 236 DCHECK(mime_type == StringToLowerASCII(mime_type)); |
216 | 237 |
217 LoadPlugins(false); | 238 LoadPlugins(false); |
218 AutoLock lock(lock_); | 239 AutoLock lock(lock_); |
219 for (size_t i = 0; i < plugins_.size(); ++i) { | 240 for (size_t i = 0; i < plugins_.size(); ++i) { |
220 if (SupportsType(plugins_[i], mime_type, allow_wildcard)) { | 241 if (SupportsType(plugins_[i], mime_type, allow_wildcard)) { |
221 *info = plugins_[i]; | 242 *info = plugins_[i]; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 } | 341 } |
321 } | 342 } |
322 | 343 |
323 return false; | 344 return false; |
324 } | 345 } |
325 | 346 |
326 void PluginList::Shutdown() { | 347 void PluginList::Shutdown() { |
327 // TODO | 348 // TODO |
328 } | 349 } |
329 | 350 |
| 351 // static |
| 352 void PluginList::UseInternalNaCl(PluginEntryPoints* entry_points) { |
| 353 // We access the singleton directly, and not through Singleton(), since |
| 354 // we don't want LoadPlugins() to be called. |
| 355 g_singleton.Pointer()->use_internal_nacl_ = true; |
| 356 |
| 357 const NPAPI::PluginVersionInfo nacl_plugin_info = { |
| 358 FilePath(kNaClPluginLibraryName), |
| 359 L"Native Client", |
| 360 L"Statically linked NaCl", |
| 361 L"1, 0, 0, 1", |
| 362 L"application/x-nacl-srpc", |
| 363 L"", |
| 364 L"", |
| 365 *entry_points |
| 366 }; |
| 367 |
| 368 Singleton()->RegisterInternalPlugin(nacl_plugin_info); |
| 369 } |
| 370 |
330 } // namespace NPAPI | 371 } // namespace NPAPI |
OLD | NEW |