Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(375)

Side by Side Diff: content/common/plugin_list.cc

Issue 19894003: Move webplugininfo.h to content/public. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "content/common/plugin_list.h" 5 #include "content/common/plugin_list.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/strings/string_split.h" 12 #include "base/strings/string_split.h"
13 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/strings/sys_string_conversions.h" 14 #include "base/strings/sys_string_conversions.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "net/base/mime_util.h" 16 #include "net/base/mime_util.h"
17 #include "url/gurl.h" 17 #include "url/gurl.h"
18 #include "webkit/plugins/plugin_switches.h" 18 #include "webkit/plugins/plugin_switches.h"
19 19
20 #if defined(OS_WIN) 20 #if defined(OS_WIN)
21 #include "content/common/plugin_constants_win.h" 21 #include "content/common/plugin_constants_win.h"
22 #endif 22 #endif
23 23
24 using webkit::WebPluginInfo;
25 using webkit::WebPluginMimeType;
26
27 namespace content { 24 namespace content {
28 25
29 namespace { 26 namespace {
30 27
31 const char kApplicationOctetStream[] = "application/octet-stream"; 28 const char kApplicationOctetStream[] = "application/octet-stream";
32 29
33 base::LazyInstance<PluginList> g_singleton = LAZY_INSTANCE_INITIALIZER; 30 base::LazyInstance<PluginList> g_singleton = LAZY_INSTANCE_INITIALIZER;
34 31
35 bool AllowMimeTypeMismatch(const std::string& orig_mime_type, 32 bool AllowMimeTypeMismatch(const std::string& orig_mime_type,
36 const std::string& actual_mime_type) { 33 const std::string& actual_mime_type) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 } 90 }
94 91
95 void PluginList::AddExtraPluginDir(const base::FilePath& plugin_dir) { 92 void PluginList::AddExtraPluginDir(const base::FilePath& plugin_dir) {
96 // Chrome OS only loads plugins from /opt/google/chrome/plugins. 93 // Chrome OS only loads plugins from /opt/google/chrome/plugins.
97 #if !defined(OS_CHROMEOS) 94 #if !defined(OS_CHROMEOS)
98 base::AutoLock lock(lock_); 95 base::AutoLock lock(lock_);
99 extra_plugin_dirs_.push_back(plugin_dir); 96 extra_plugin_dirs_.push_back(plugin_dir);
100 #endif 97 #endif
101 } 98 }
102 99
103 void PluginList::RegisterInternalPlugin(const webkit::WebPluginInfo& info, 100 void PluginList::RegisterInternalPlugin(const WebPluginInfo& info,
104 bool add_at_beginning) { 101 bool add_at_beginning) {
105 base::AutoLock lock(lock_); 102 base::AutoLock lock(lock_);
106 103
107 internal_plugins_.push_back(info); 104 internal_plugins_.push_back(info);
108 if (add_at_beginning) { 105 if (add_at_beginning) {
109 // Newer registrations go earlier in the list so they can override the MIME 106 // Newer registrations go earlier in the list so they can override the MIME
110 // types of older registrations. 107 // types of older registrations.
111 extra_plugin_paths_.insert(extra_plugin_paths_.begin(), info.path); 108 extra_plugin_paths_.insert(extra_plugin_paths_.begin(), info.path);
112 } else { 109 } else {
113 extra_plugin_paths_.push_back(info.path); 110 extra_plugin_paths_.push_back(info.path);
114 } 111 }
115 } 112 }
116 113
117 void PluginList::UnregisterInternalPlugin(const base::FilePath& path) { 114 void PluginList::UnregisterInternalPlugin(const base::FilePath& path) {
118 base::AutoLock lock(lock_); 115 base::AutoLock lock(lock_);
119 for (size_t i = 0; i < internal_plugins_.size(); i++) { 116 for (size_t i = 0; i < internal_plugins_.size(); i++) {
120 if (internal_plugins_[i].path == path) { 117 if (internal_plugins_[i].path == path) {
121 internal_plugins_.erase(internal_plugins_.begin() + i); 118 internal_plugins_.erase(internal_plugins_.begin() + i);
122 return; 119 return;
123 } 120 }
124 } 121 }
125 NOTREACHED(); 122 NOTREACHED();
126 } 123 }
127 124
128 void PluginList::GetInternalPlugins( 125 void PluginList::GetInternalPlugins(
129 std::vector<webkit::WebPluginInfo>* internal_plugins) { 126 std::vector<WebPluginInfo>* internal_plugins) {
130 base::AutoLock lock(lock_); 127 base::AutoLock lock(lock_);
131 128
132 for (std::vector<webkit::WebPluginInfo>::iterator it = 129 for (std::vector<WebPluginInfo>::iterator it = internal_plugins_.begin();
133 internal_plugins_.begin();
134 it != internal_plugins_.end(); 130 it != internal_plugins_.end();
135 ++it) { 131 ++it) {
136 internal_plugins->push_back(*it); 132 internal_plugins->push_back(*it);
137 } 133 }
138 } 134 }
139 135
140 bool PluginList::ReadPluginInfo(const base::FilePath& filename, 136 bool PluginList::ReadPluginInfo(const base::FilePath& filename,
141 webkit::WebPluginInfo* info) { 137 WebPluginInfo* info) {
142 { 138 {
143 base::AutoLock lock(lock_); 139 base::AutoLock lock(lock_);
144 for (size_t i = 0; i < internal_plugins_.size(); ++i) { 140 for (size_t i = 0; i < internal_plugins_.size(); ++i) {
145 if (filename == internal_plugins_[i].path) { 141 if (filename == internal_plugins_[i].path) {
146 *info = internal_plugins_[i]; 142 *info = internal_plugins_[i];
147 return true; 143 return true;
148 } 144 }
149 } 145 }
150 } 146 }
151 147
152 return PluginList::ReadWebPluginInfo(filename, info); 148 return PluginList::ReadWebPluginInfo(filename, info);
153 } 149 }
154 150
155 // static 151 // static
156 bool PluginList::ParseMimeTypes( 152 bool PluginList::ParseMimeTypes(
157 const std::string& mime_types_str, 153 const std::string& mime_types_str,
158 const std::string& file_extensions_str, 154 const std::string& file_extensions_str,
159 const base::string16& mime_type_descriptions_str, 155 const base::string16& mime_type_descriptions_str,
160 std::vector<webkit::WebPluginMimeType>* parsed_mime_types) { 156 std::vector<WebPluginMimeType>* parsed_mime_types) {
161 std::vector<std::string> mime_types, file_extensions; 157 std::vector<std::string> mime_types, file_extensions;
162 std::vector<base::string16> descriptions; 158 std::vector<base::string16> descriptions;
163 base::SplitString(mime_types_str, '|', &mime_types); 159 base::SplitString(mime_types_str, '|', &mime_types);
164 base::SplitString(file_extensions_str, '|', &file_extensions); 160 base::SplitString(file_extensions_str, '|', &file_extensions);
165 base::SplitString(mime_type_descriptions_str, '|', &descriptions); 161 base::SplitString(mime_type_descriptions_str, '|', &descriptions);
166 162
167 parsed_mime_types->clear(); 163 parsed_mime_types->clear();
168 164
169 if (mime_types.empty()) 165 if (mime_types.empty())
170 return false; 166 return false;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 199
204 void PluginList::LoadPlugins(bool include_npapi) { 200 void PluginList::LoadPlugins(bool include_npapi) {
205 { 201 {
206 base::AutoLock lock(lock_); 202 base::AutoLock lock(lock_);
207 if (loading_state_ == LOADING_STATE_UP_TO_DATE) 203 if (loading_state_ == LOADING_STATE_UP_TO_DATE)
208 return; 204 return;
209 205
210 loading_state_ = LOADING_STATE_REFRESHING; 206 loading_state_ = LOADING_STATE_REFRESHING;
211 } 207 }
212 208
213 std::vector<webkit::WebPluginInfo> new_plugins; 209 std::vector<WebPluginInfo> new_plugins;
214 base::Closure will_load_callback; 210 base::Closure will_load_callback;
215 { 211 {
216 base::AutoLock lock(lock_); 212 base::AutoLock lock(lock_);
217 will_load_callback = will_load_plugins_callback_; 213 will_load_callback = will_load_plugins_callback_;
218 } 214 }
219 if (!will_load_callback.is_null()) 215 if (!will_load_callback.is_null())
220 will_load_callback.Run(); 216 will_load_callback.Run();
221 217
222 std::vector<base::FilePath> plugin_paths; 218 std::vector<base::FilePath> plugin_paths;
223 GetPluginPathsToLoad(&plugin_paths, include_npapi); 219 GetPluginPathsToLoad(&plugin_paths, include_npapi);
224 220
225 for (std::vector<base::FilePath>::const_iterator it = plugin_paths.begin(); 221 for (std::vector<base::FilePath>::const_iterator it = plugin_paths.begin();
226 it != plugin_paths.end(); 222 it != plugin_paths.end();
227 ++it) { 223 ++it) {
228 WebPluginInfo plugin_info; 224 WebPluginInfo plugin_info;
229 LoadPluginIntoPluginList(*it, &new_plugins, &plugin_info); 225 LoadPluginIntoPluginList(*it, &new_plugins, &plugin_info);
230 } 226 }
231 227
232 base::AutoLock lock(lock_); 228 base::AutoLock lock(lock_);
233 plugins_list_.swap(new_plugins); 229 plugins_list_.swap(new_plugins);
234 230
235 // If we haven't been invalidated in the mean time, mark the plug-in list as 231 // If we haven't been invalidated in the mean time, mark the plug-in list as
236 // up-to-date. 232 // up-to-date.
237 if (loading_state_ != LOADING_STATE_NEEDS_REFRESH) 233 if (loading_state_ != LOADING_STATE_NEEDS_REFRESH)
238 loading_state_ = LOADING_STATE_UP_TO_DATE; 234 loading_state_ = LOADING_STATE_UP_TO_DATE;
239 } 235 }
240 236
241 bool PluginList::LoadPluginIntoPluginList( 237 bool PluginList::LoadPluginIntoPluginList(
242 const base::FilePath& path, 238 const base::FilePath& path,
243 std::vector<webkit::WebPluginInfo>* plugins, 239 std::vector<WebPluginInfo>* plugins,
244 WebPluginInfo* plugin_info) { 240 WebPluginInfo* plugin_info) {
245 LOG_IF(ERROR, PluginList::DebugPluginLoading()) 241 LOG_IF(ERROR, PluginList::DebugPluginLoading())
246 << "Loading plugin " << path.value(); 242 << "Loading plugin " << path.value();
247 if (!ReadPluginInfo(path, plugin_info)) 243 if (!ReadPluginInfo(path, plugin_info))
248 return false; 244 return false;
249 245
250 if (!ShouldLoadPluginUsingPluginList(*plugin_info, plugins)) 246 if (!ShouldLoadPluginUsingPluginList(*plugin_info, plugins))
251 return false; 247 return false;
252 248
253 #if defined(OS_WIN) && !defined(NDEBUG) 249 #if defined(OS_WIN) && !defined(NDEBUG)
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 GetPluginDirectories(&directories_to_scan); 294 GetPluginDirectories(&directories_to_scan);
299 for (size_t i = 0; i < directories_to_scan.size(); ++i) 295 for (size_t i = 0; i < directories_to_scan.size(); ++i)
300 GetPluginsInDir(directories_to_scan[i], plugin_paths); 296 GetPluginsInDir(directories_to_scan[i], plugin_paths);
301 297
302 #if defined(OS_WIN) 298 #if defined(OS_WIN)
303 GetPluginPathsFromRegistry(plugin_paths); 299 GetPluginPathsFromRegistry(plugin_paths);
304 #endif 300 #endif
305 } 301 }
306 } 302 }
307 303
308 void PluginList::SetPlugins(const std::vector<webkit::WebPluginInfo>& plugins) { 304 void PluginList::SetPlugins(const std::vector<WebPluginInfo>& plugins) {
309 base::AutoLock lock(lock_); 305 base::AutoLock lock(lock_);
310 306
311 DCHECK_NE(LOADING_STATE_REFRESHING, loading_state_); 307 DCHECK_NE(LOADING_STATE_REFRESHING, loading_state_);
312 loading_state_ = LOADING_STATE_UP_TO_DATE; 308 loading_state_ = LOADING_STATE_UP_TO_DATE;
313 309
314 plugins_list_.clear(); 310 plugins_list_.clear();
315 plugins_list_.insert(plugins_list_.end(), plugins.begin(), plugins.end()); 311 plugins_list_.insert(plugins_list_.end(), plugins.begin(), plugins.end());
316 } 312 }
317 313
318 void PluginList::set_will_load_plugins_callback(const base::Closure& callback) { 314 void PluginList::set_will_load_plugins_callback(const base::Closure& callback) {
319 base::AutoLock lock(lock_); 315 base::AutoLock lock(lock_);
320 will_load_plugins_callback_ = callback; 316 will_load_plugins_callback_ = callback;
321 } 317 }
322 318
323 void PluginList::GetPlugins(std::vector<WebPluginInfo>* plugins, 319 void PluginList::GetPlugins(std::vector<WebPluginInfo>* plugins,
324 bool include_npapi) { 320 bool include_npapi) {
325 LoadPlugins(include_npapi); 321 LoadPlugins(include_npapi);
326 base::AutoLock lock(lock_); 322 base::AutoLock lock(lock_);
327 plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end()); 323 plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end());
328 } 324 }
329 325
330 bool PluginList::GetPluginsNoRefresh( 326 bool PluginList::GetPluginsNoRefresh(std::vector<WebPluginInfo>* plugins) {
331 std::vector<webkit::WebPluginInfo>* plugins) {
332 base::AutoLock lock(lock_); 327 base::AutoLock lock(lock_);
333 plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end()); 328 plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end());
334 329
335 return loading_state_ == LOADING_STATE_UP_TO_DATE; 330 return loading_state_ == LOADING_STATE_UP_TO_DATE;
336 } 331 }
337 332
338 void PluginList::GetPluginInfoArray( 333 void PluginList::GetPluginInfoArray(
339 const GURL& url, 334 const GURL& url,
340 const std::string& mime_type, 335 const std::string& mime_type,
341 bool allow_wildcard, 336 bool allow_wildcard,
342 bool* use_stale, 337 bool* use_stale,
343 bool include_npapi, 338 bool include_npapi,
344 std::vector<webkit::WebPluginInfo>* info, 339 std::vector<WebPluginInfo>* info,
345 std::vector<std::string>* actual_mime_types) { 340 std::vector<std::string>* actual_mime_types) {
346 DCHECK(mime_type == StringToLowerASCII(mime_type)); 341 DCHECK(mime_type == StringToLowerASCII(mime_type));
347 DCHECK(info); 342 DCHECK(info);
348 343
349 if (!use_stale) 344 if (!use_stale)
350 LoadPlugins(include_npapi); 345 LoadPlugins(include_npapi);
351 base::AutoLock lock(lock_); 346 base::AutoLock lock(lock_);
352 if (use_stale) 347 if (use_stale)
353 *use_stale = (loading_state_ != LOADING_STATE_UP_TO_DATE); 348 *use_stale = (loading_state_ != LOADING_STATE_UP_TO_DATE);
354 info->clear(); 349 info->clear();
(...skipping 27 matching lines...) Expand all
382 AllowMimeTypeMismatch(mime_type, actual_mime_type)) { 377 AllowMimeTypeMismatch(mime_type, actual_mime_type)) {
383 info->push_back(plugins_list_[i]); 378 info->push_back(plugins_list_[i]);
384 if (actual_mime_types) 379 if (actual_mime_types)
385 actual_mime_types->push_back(actual_mime_type); 380 actual_mime_types->push_back(actual_mime_type);
386 } 381 }
387 } 382 }
388 } 383 }
389 } 384 }
390 } 385 }
391 386
392 bool PluginList::SupportsType(const webkit::WebPluginInfo& plugin, 387 bool PluginList::SupportsType(const WebPluginInfo& plugin,
393 const std::string& mime_type, 388 const std::string& mime_type,
394 bool allow_wildcard) { 389 bool allow_wildcard) {
395 // Webkit will ask for a plugin to handle empty mime types. 390 // Webkit will ask for a plugin to handle empty mime types.
396 if (mime_type.empty()) 391 if (mime_type.empty())
397 return false; 392 return false;
398 393
399 for (size_t i = 0; i < plugin.mime_types.size(); ++i) { 394 for (size_t i = 0; i < plugin.mime_types.size(); ++i) {
400 const webkit::WebPluginMimeType& mime_info = plugin.mime_types[i]; 395 const WebPluginMimeType& mime_info = plugin.mime_types[i];
401 if (net::MatchesMimeType(mime_info.mime_type, mime_type)) { 396 if (net::MatchesMimeType(mime_info.mime_type, mime_type)) {
402 if (!allow_wildcard && mime_info.mime_type == "*") 397 if (!allow_wildcard && mime_info.mime_type == "*")
403 continue; 398 continue;
404 return true; 399 return true;
405 } 400 }
406 } 401 }
407 return false; 402 return false;
408 } 403 }
409 404
410 bool PluginList::SupportsExtension(const webkit::WebPluginInfo& plugin, 405 bool PluginList::SupportsExtension(const WebPluginInfo& plugin,
411 const std::string& extension, 406 const std::string& extension,
412 std::string* actual_mime_type) { 407 std::string* actual_mime_type) {
413 for (size_t i = 0; i < plugin.mime_types.size(); ++i) { 408 for (size_t i = 0; i < plugin.mime_types.size(); ++i) {
414 const webkit::WebPluginMimeType& mime_type = plugin.mime_types[i]; 409 const WebPluginMimeType& mime_type = plugin.mime_types[i];
415 for (size_t j = 0; j < mime_type.file_extensions.size(); ++j) { 410 for (size_t j = 0; j < mime_type.file_extensions.size(); ++j) {
416 if (mime_type.file_extensions[j] == extension) { 411 if (mime_type.file_extensions[j] == extension) {
417 if (actual_mime_type) 412 if (actual_mime_type)
418 *actual_mime_type = mime_type.mime_type; 413 *actual_mime_type = mime_type.mime_type;
419 return true; 414 return true;
420 } 415 }
421 } 416 }
422 } 417 }
423 return false; 418 return false;
424 } 419 }
425 420
426 PluginList::~PluginList() { 421 PluginList::~PluginList() {
427 } 422 }
428 423
429 424
430 } // namespace content 425 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698