[email protected] | c6f3dea | 2012-01-14 02:23:11 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
license.bot | bf09a50 | 2008-08-24 00:55:55 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 4 | |
Lei Zhang | d8c5318 | 2019-02-06 22:24:39 | [diff] [blame] | 5 | #include "content/browser/plugin_list.h" |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 6 | |
avi | a9aa7a8 | 2015-12-25 03:06:31 | [diff] [blame] | 7 | #include <stddef.h> |
| 8 | |
[email protected] | cec1b8d | 2010-03-24 00:21:34 | [diff] [blame] | 9 | #include <algorithm> |
| 10 | |
[email protected] | 3c0c0bf5 | 2010-06-25 06:05:09 | [diff] [blame] | 11 | #include "base/command_line.h" |
[email protected] | 1953711 | 2009-01-21 19:38:14 | [diff] [blame] | 12 | #include "base/lazy_instance.h" |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 13 | #include "base/logging.h" |
Zhuoyu Qian | 39a909a | 2018-10-16 03:48:52 | [diff] [blame] | 14 | #include "base/stl_util.h" |
[email protected] | d778e042 | 2013-03-06 18:10:22 | [diff] [blame] | 15 | #include "base/strings/string_split.h" |
[email protected] | f63582d | 2013-06-11 22:52:54 | [diff] [blame] | 16 | #include "base/strings/string_util.h" |
[email protected] | 13ac5353 | 2013-03-30 00:27:00 | [diff] [blame] | 17 | #include "base/strings/sys_string_conversions.h" |
[email protected] | 90626587 | 2013-06-07 22:40:45 | [diff] [blame] | 18 | #include "base/strings/utf_string_conversions.h" |
avi | a9aa7a8 | 2015-12-25 03:06:31 | [diff] [blame] | 19 | #include "build/build_config.h" |
[email protected] | 1bbbc49 | 2013-08-09 00:36:15 | [diff] [blame] | 20 | #include "content/public/common/content_switches.h" |
[email protected] | b734450 | 2009-01-12 19:43:44 | [diff] [blame] | 21 | #include "net/base/mime_util.h" |
[email protected] | ad67777 | 2013-06-29 14:18:38 | [diff] [blame] | 22 | #include "url/gurl.h" |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 23 | |
[email protected] | 29e2fb4 | 2013-07-19 01:13:47 | [diff] [blame] | 24 | namespace content { |
| 25 | |
| 26 | namespace { |
[email protected] | 0b30017 | 2012-09-27 16:11:52 | [diff] [blame] | 27 | |
scottmg | 5e65e3a | 2017-03-08 08:48:46 | [diff] [blame] | 28 | base::LazyInstance<PluginList>::DestructorAtExit g_singleton = |
| 29 | LAZY_INSTANCE_INITIALIZER; |
[email protected] | 123a0496 | 2011-11-03 15:43:01 | [diff] [blame] | 30 | |
Lei Zhang | a2eb1878 | 2018-08-15 18:09:21 | [diff] [blame] | 31 | // Returns true if the plugin supports |mime_type|. |mime_type| should be all |
| 32 | // lower case. |
| 33 | bool SupportsType(const WebPluginInfo& plugin, |
| 34 | const std::string& mime_type, |
| 35 | bool allow_wildcard) { |
| 36 | // Webkit will ask for a plugin to handle empty mime types. |
| 37 | if (mime_type.empty()) |
| 38 | return false; |
| 39 | |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 40 | for (const WebPluginMimeType& mime_info : plugin.mime_types) { |
Lei Zhang | a2eb1878 | 2018-08-15 18:09:21 | [diff] [blame] | 41 | if (net::MatchesMimeType(mime_info.mime_type, mime_type)) { |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 42 | if (allow_wildcard || mime_info.mime_type != "*") |
| 43 | return true; |
Lei Zhang | a2eb1878 | 2018-08-15 18:09:21 | [diff] [blame] | 44 | } |
| 45 | } |
| 46 | return false; |
| 47 | } |
| 48 | |
| 49 | // Returns true if the given plugin supports a given file extension. |
| 50 | // |extension| should be all lower case. |actual_mime_type| will be set to the |
| 51 | // MIME type if found. The MIME type which corresponds to the extension is |
| 52 | // optionally returned back. |
| 53 | bool SupportsExtension(const WebPluginInfo& plugin, |
| 54 | const std::string& extension, |
| 55 | std::string* actual_mime_type) { |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 56 | for (const WebPluginMimeType& mime_type : plugin.mime_types) { |
| 57 | for (const std::string& file_extension : mime_type.file_extensions) { |
| 58 | if (file_extension == extension) { |
Lei Zhang | a2eb1878 | 2018-08-15 18:09:21 | [diff] [blame] | 59 | *actual_mime_type = mime_type.mime_type; |
| 60 | return true; |
| 61 | } |
| 62 | } |
| 63 | } |
| 64 | return false; |
| 65 | } |
| 66 | |
[email protected] | 3b91edbe | 2012-09-27 22:49:23 | [diff] [blame] | 67 | } // namespace |
[email protected] | 123a0496 | 2011-11-03 15:43:01 | [diff] [blame] | 68 | |
[email protected] | 1953711 | 2009-01-21 19:38:14 | [diff] [blame] | 69 | // static |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 70 | PluginList* PluginList::Singleton() { |
[email protected] | 35fa6a2 | 2009-08-15 00:04:01 | [diff] [blame] | 71 | return g_singleton.Pointer(); |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 72 | } |
| 73 | |
[email protected] | 4e59e81 | 2010-04-06 20:51:16 | [diff] [blame] | 74 | void PluginList::RefreshPlugins() { |
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 75 | base::AutoLock lock(lock_); |
[email protected] | a33fa9d | 2012-05-16 14:47:49 | [diff] [blame] | 76 | loading_state_ = LOADING_STATE_NEEDS_REFRESH; |
[email protected] | 367230c5 | 2009-02-21 01:44:30 | [diff] [blame] | 77 | } |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 78 | |
[email protected] | d7bd3e5 | 2013-07-21 04:29:20 | [diff] [blame] | 79 | void PluginList::RegisterInternalPlugin(const WebPluginInfo& info, |
[email protected] | c6f3dea | 2012-01-14 02:23:11 | [diff] [blame] | 80 | bool add_at_beginning) { |
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 81 | base::AutoLock lock(lock_); |
[email protected] | 8ca37f4 | 2011-11-02 16:03:41 | [diff] [blame] | 82 | |
[email protected] | fee3a98 | 2013-07-18 18:12:48 | [diff] [blame] | 83 | internal_plugins_.push_back(info); |
[email protected] | 8ca37f4 | 2011-11-02 16:03:41 | [diff] [blame] | 84 | if (add_at_beginning) { |
| 85 | // Newer registrations go earlier in the list so they can override the MIME |
| 86 | // types of older registrations. |
[email protected] | c6f3dea | 2012-01-14 02:23:11 | [diff] [blame] | 87 | extra_plugin_paths_.insert(extra_plugin_paths_.begin(), info.path); |
[email protected] | 8ca37f4 | 2011-11-02 16:03:41 | [diff] [blame] | 88 | } else { |
[email protected] | c6f3dea | 2012-01-14 02:23:11 | [diff] [blame] | 89 | extra_plugin_paths_.push_back(info.path); |
[email protected] | 8ca37f4 | 2011-11-02 16:03:41 | [diff] [blame] | 90 | } |
[email protected] | f99c73ad | 2011-01-11 00:43:44 | [diff] [blame] | 91 | } |
| 92 | |
[email protected] | a3ef483 | 2013-02-02 05:12:33 | [diff] [blame] | 93 | void PluginList::UnregisterInternalPlugin(const base::FilePath& path) { |
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 94 | base::AutoLock lock(lock_); |
[email protected] | 797d9a6 | 2013-09-13 23:36:07 | [diff] [blame] | 95 | bool found = false; |
[email protected] | 00c3961 | 2010-03-06 02:53:28 | [diff] [blame] | 96 | for (size_t i = 0; i < internal_plugins_.size(); i++) { |
[email protected] | fee3a98 | 2013-07-18 18:12:48 | [diff] [blame] | 97 | if (internal_plugins_[i].path == path) { |
[email protected] | 00c3961 | 2010-03-06 02:53:28 | [diff] [blame] | 98 | internal_plugins_.erase(internal_plugins_.begin() + i); |
[email protected] | 797d9a6 | 2013-09-13 23:36:07 | [diff] [blame] | 99 | found = true; |
| 100 | break; |
[email protected] | 00c3961 | 2010-03-06 02:53:28 | [diff] [blame] | 101 | } |
| 102 | } |
[email protected] | 797d9a6 | 2013-09-13 23:36:07 | [diff] [blame] | 103 | DCHECK(found); |
| 104 | RemoveExtraPluginPathLocked(path); |
[email protected] | 00c3961 | 2010-03-06 02:53:28 | [diff] [blame] | 105 | } |
| 106 | |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 107 | void PluginList::GetInternalPlugins( |
[email protected] | d7bd3e5 | 2013-07-21 04:29:20 | [diff] [blame] | 108 | std::vector<WebPluginInfo>* internal_plugins) { |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 109 | base::AutoLock lock(lock_); |
| 110 | |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 111 | for (const auto& plugin : internal_plugins_) |
| 112 | internal_plugins->push_back(plugin); |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 113 | } |
| 114 | |
[email protected] | a3ef483 | 2013-02-02 05:12:33 | [diff] [blame] | 115 | bool PluginList::ReadPluginInfo(const base::FilePath& filename, |
[email protected] | d7bd3e5 | 2013-07-21 04:29:20 | [diff] [blame] | 116 | WebPluginInfo* info) { |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 117 | base::AutoLock lock(lock_); |
| 118 | for (const auto& plugin : internal_plugins_) { |
| 119 | if (filename == plugin.path) { |
| 120 | *info = plugin; |
| 121 | return true; |
[email protected] | 8ff2609 | 2009-01-29 01:53:24 | [diff] [blame] | 122 | } |
| 123 | } |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 124 | return false; |
[email protected] | 8ff2609 | 2009-01-29 01:53:24 | [diff] [blame] | 125 | } |
| 126 | |
Lei Zhang | d8c5318 | 2019-02-06 22:24:39 | [diff] [blame] | 127 | PluginList::PluginList() : loading_state_(LOADING_STATE_NEEDS_REFRESH) {} |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 128 | |
[email protected] | aa7f880 | 2014-01-27 16:56:32 | [diff] [blame] | 129 | bool PluginList::PrepareForPluginLoading() { |
| 130 | base::AutoLock lock(lock_); |
| 131 | if (loading_state_ == LOADING_STATE_UP_TO_DATE) |
| 132 | return false; |
[email protected] | a33fa9d | 2012-05-16 14:47:49 | [diff] [blame] | 133 | |
[email protected] | aa7f880 | 2014-01-27 16:56:32 | [diff] [blame] | 134 | loading_state_ = LOADING_STATE_REFRESHING; |
| 135 | return true; |
| 136 | } |
| 137 | |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 138 | void PluginList::LoadPlugins() { |
[email protected] | aa7f880 | 2014-01-27 16:56:32 | [diff] [blame] | 139 | if (!PrepareForPluginLoading()) |
| 140 | return; |
[email protected] | a466a0c | 2010-10-02 00:42:39 | [diff] [blame] | 141 | |
[email protected] | d7bd3e5 | 2013-07-21 04:29:20 | [diff] [blame] | 142 | std::vector<WebPluginInfo> new_plugins; |
Lei Zhang | c213e12 | 2019-02-07 00:17:02 | [diff] [blame] | 143 | base::OnceClosure will_load_callback; |
[email protected] | 9a60ccb | 2013-07-19 22:23:36 | [diff] [blame] | 144 | { |
| 145 | base::AutoLock lock(lock_); |
| 146 | will_load_callback = will_load_plugins_callback_; |
| 147 | } |
Lei Zhang | c213e12 | 2019-02-07 00:17:02 | [diff] [blame] | 148 | if (will_load_callback) |
Tommy Nyquist | 4b749d0 | 2018-03-20 21:46:29 | [diff] [blame] | 149 | std::move(will_load_callback).Run(); |
[email protected] | 9a60ccb | 2013-07-19 22:23:36 | [diff] [blame] | 150 | |
| 151 | std::vector<base::FilePath> plugin_paths; |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 152 | GetPluginPathsToLoad(&plugin_paths); |
[email protected] | 9a60ccb | 2013-07-19 22:23:36 | [diff] [blame] | 153 | |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 154 | for (const base::FilePath& path : plugin_paths) { |
[email protected] | 9a60ccb | 2013-07-19 22:23:36 | [diff] [blame] | 155 | WebPluginInfo plugin_info; |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 156 | LoadPluginIntoPluginList(path, &new_plugins, &plugin_info); |
[email protected] | 9a60ccb | 2013-07-19 22:23:36 | [diff] [blame] | 157 | } |
[email protected] | 1134a00 | 2010-10-08 08:03:14 | [diff] [blame] | 158 | |
[email protected] | aa7f880 | 2014-01-27 16:56:32 | [diff] [blame] | 159 | SetPlugins(new_plugins); |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 160 | } |
| 161 | |
Lei Zhang | d8c5318 | 2019-02-06 22:24:39 | [diff] [blame] | 162 | bool PluginList::LoadPluginIntoPluginList(const base::FilePath& path, |
| 163 | std::vector<WebPluginInfo>* plugins, |
| 164 | WebPluginInfo* plugin_info) { |
[email protected] | fee3a98 | 2013-07-18 18:12:48 | [diff] [blame] | 165 | if (!ReadPluginInfo(path, plugin_info)) |
[email protected] | 68b63bc | 2012-08-20 22:14:03 | [diff] [blame] | 166 | return false; |
| 167 | |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 168 | // TODO(piman): Do we still need this after NPAPI removal? |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 169 | for (const content::WebPluginMimeType& mime_type : plugin_info->mime_types) { |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 170 | // TODO: don't load global handlers for now. |
| 171 | // WebKit hands to the Plugin before it tries |
| 172 | // to handle mimeTypes on its own. |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 173 | if (mime_type.mime_type == "*") |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 174 | return false; |
[email protected] | 68b63bc | 2012-08-20 22:14:03 | [diff] [blame] | 175 | } |
| 176 | plugins->push_back(*plugin_info); |
| 177 | return true; |
| 178 | } |
| 179 | |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 180 | void PluginList::GetPluginPathsToLoad( |
| 181 | std::vector<base::FilePath>* plugin_paths) { |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 182 | // Don't want to hold the lock while loading new plugins, so we don't block |
| 183 | // other methods if they're called on other threads. |
[email protected] | a3ef483 | 2013-02-02 05:12:33 | [diff] [blame] | 184 | std::vector<base::FilePath> extra_plugin_paths; |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 185 | { |
| 186 | base::AutoLock lock(lock_); |
| 187 | extra_plugin_paths = extra_plugin_paths_; |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 188 | } |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 189 | |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 190 | for (const base::FilePath& path : extra_plugin_paths) { |
Jan Wilken Dörrie | 531be7ca | 2019-06-07 10:05:57 | [diff] [blame] | 191 | if (base::Contains(*plugin_paths, path)) |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 192 | continue; |
[email protected] | d4af1e7 | 2011-10-21 17:45:43 | [diff] [blame] | 193 | plugin_paths->push_back(path); |
| 194 | } |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 195 | } |
| 196 | |
[email protected] | d7bd3e5 | 2013-07-21 04:29:20 | [diff] [blame] | 197 | void PluginList::SetPlugins(const std::vector<WebPluginInfo>& plugins) { |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 198 | base::AutoLock lock(lock_); |
| 199 | |
tommycli | e86b298 | 2015-03-16 20:16:45 | [diff] [blame] | 200 | // If we haven't been invalidated in the mean time, mark the plugin list as |
thakis | 3e861de | 2016-06-14 14:24:01 | [diff] [blame] | 201 | // up to date. |
[email protected] | aa7f880 | 2014-01-27 16:56:32 | [diff] [blame] | 202 | if (loading_state_ != LOADING_STATE_NEEDS_REFRESH) |
| 203 | loading_state_ = LOADING_STATE_UP_TO_DATE; |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 204 | |
[email protected] | aa7f880 | 2014-01-27 16:56:32 | [diff] [blame] | 205 | plugins_list_ = plugins; |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 206 | } |
| 207 | |
Lei Zhang | c213e12 | 2019-02-07 00:17:02 | [diff] [blame] | 208 | void PluginList::set_will_load_plugins_callback( |
| 209 | const base::RepeatingClosure& callback) { |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 210 | base::AutoLock lock(lock_); |
| 211 | will_load_plugins_callback_ = callback; |
| 212 | } |
| 213 | |
piman | e8c57ea | 2016-04-06 01:19:36 | [diff] [blame] | 214 | void PluginList::GetPlugins(std::vector<WebPluginInfo>* plugins) { |
| 215 | LoadPlugins(); |
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 216 | base::AutoLock lock(lock_); |
[email protected] | 68b63bc | 2012-08-20 22:14:03 | [diff] [blame] | 217 | plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end()); |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 218 | } |
| 219 | |
[email protected] | d7bd3e5 | 2013-07-21 04:29:20 | [diff] [blame] | 220 | bool PluginList::GetPluginsNoRefresh(std::vector<WebPluginInfo>* plugins) { |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 221 | base::AutoLock lock(lock_); |
[email protected] | 68b63bc | 2012-08-20 22:14:03 | [diff] [blame] | 222 | plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end()); |
| 223 | |
[email protected] | 480c7cc | 2012-06-29 17:38:44 | [diff] [blame] | 224 | return loading_state_ == LOADING_STATE_UP_TO_DATE; |
[email protected] | 4912595 | 2011-09-27 18:05:15 | [diff] [blame] | 225 | } |
| 226 | |
Lei Zhang | c923379e | 2019-02-07 18:13:08 | [diff] [blame] | 227 | bool PluginList::GetPluginInfoArray( |
[email protected] | 9bcdced7 | 2010-12-07 20:51:36 | [diff] [blame] | 228 | const GURL& url, |
| 229 | const std::string& mime_type, |
| 230 | bool allow_wildcard, |
[email protected] | d7bd3e5 | 2013-07-21 04:29:20 | [diff] [blame] | 231 | std::vector<WebPluginInfo>* info, |
[email protected] | 9bcdced7 | 2010-12-07 20:51:36 | [diff] [blame] | 232 | std::vector<std::string>* actual_mime_types) { |
brettw | 8e2106d | 2015-08-11 19:30:22 | [diff] [blame] | 233 | DCHECK(mime_type == base::ToLowerASCII(mime_type)); |
[email protected] | 20a793e | 2010-10-12 06:50:08 | [diff] [blame] | 234 | DCHECK(info); |
| 235 | |
[email protected] | 20305ec | 2011-01-21 04:55:52 | [diff] [blame] | 236 | base::AutoLock lock(lock_); |
Lei Zhang | c923379e | 2019-02-07 18:13:08 | [diff] [blame] | 237 | bool is_stale = loading_state_ != LOADING_STATE_UP_TO_DATE; |
[email protected] | f4d43cb | 2013-10-28 20:53:07 | [diff] [blame] | 238 | info->clear(); |
[email protected] | 20a793e | 2010-10-12 06:50:08 | [diff] [blame] | 239 | if (actual_mime_types) |
| 240 | actual_mime_types->clear(); |
| 241 | |
[email protected] | a3ef483 | 2013-02-02 05:12:33 | [diff] [blame] | 242 | std::set<base::FilePath> visited_plugins; |
[email protected] | 20a793e | 2010-10-12 06:50:08 | [diff] [blame] | 243 | |
[email protected] | dfba876 | 2011-09-02 12:49:54 | [diff] [blame] | 244 | // Add in plugins by mime type. |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 245 | for (const WebPluginInfo& plugin : plugins_list_) { |
| 246 | if (SupportsType(plugin, mime_type, allow_wildcard)) { |
| 247 | const base::FilePath& path = plugin.path; |
[email protected] | 68b63bc | 2012-08-20 22:14:03 | [diff] [blame] | 248 | if (visited_plugins.insert(path).second) { |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 249 | info->push_back(plugin); |
[email protected] | 68b63bc | 2012-08-20 22:14:03 | [diff] [blame] | 250 | if (actual_mime_types) |
| 251 | actual_mime_types->push_back(mime_type); |
[email protected] | 20a793e | 2010-10-12 06:50:08 | [diff] [blame] | 252 | } |
| 253 | } |
| 254 | } |
| 255 | |
[email protected] | dfba876 | 2011-09-02 12:49:54 | [diff] [blame] | 256 | // Add in plugins by url. |
tommycli | e86b298 | 2015-03-16 20:16:45 | [diff] [blame] | 257 | // We do not permit URL-sniff based plugin MIME type overrides aside from |
[email protected] | cafe0d0 | 2013-07-23 15:16:20 | [diff] [blame] | 258 | // the case where the "type" was initially missing. |
| 259 | // We collected stats to determine this approach isn't a major compat issue, |
| 260 | // and we defend against content confusion attacks in various cases, such |
tommycli | e86b298 | 2015-03-16 20:16:45 | [diff] [blame] | 261 | // as when the user doesn't have the Flash plugin enabled. |
[email protected] | 20a793e | 2010-10-12 06:50:08 | [diff] [blame] | 262 | std::string path = url.path(); |
| 263 | std::string::size_type last_dot = path.rfind('.'); |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 264 | if (last_dot == std::string::npos || !mime_type.empty()) |
Lei Zhang | c923379e | 2019-02-07 18:13:08 | [diff] [blame] | 265 | return is_stale; |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 266 | |
| 267 | std::string extension = |
| 268 | base::ToLowerASCII(base::StringPiece(path).substr(last_dot + 1)); |
| 269 | std::string actual_mime_type; |
| 270 | for (const WebPluginInfo& plugin : plugins_list_) { |
| 271 | if (SupportsExtension(plugin, extension, &actual_mime_type)) { |
| 272 | base::FilePath plugin_path = plugin.path; |
| 273 | if (visited_plugins.insert(plugin_path).second) { |
| 274 | info->push_back(plugin); |
| 275 | if (actual_mime_types) |
| 276 | actual_mime_types->push_back(actual_mime_type); |
[email protected] | 20a793e | 2010-10-12 06:50:08 | [diff] [blame] | 277 | } |
| 278 | } |
| 279 | } |
Lei Zhang | c923379e | 2019-02-07 18:13:08 | [diff] [blame] | 280 | return is_stale; |
[email protected] | 20a793e | 2010-10-12 06:50:08 | [diff] [blame] | 281 | } |
| 282 | |
[email protected] | 797d9a6 | 2013-09-13 23:36:07 | [diff] [blame] | 283 | void PluginList::RemoveExtraPluginPathLocked( |
| 284 | const base::FilePath& plugin_path) { |
| 285 | lock_.AssertAcquired(); |
Lei Zhang | d8c5318 | 2019-02-06 22:24:39 | [diff] [blame] | 286 | std::vector<base::FilePath>::iterator it = std::find( |
| 287 | extra_plugin_paths_.begin(), extra_plugin_paths_.end(), plugin_path); |
[email protected] | 797d9a6 | 2013-09-13 23:36:07 | [diff] [blame] | 288 | if (it != extra_plugin_paths_.end()) |
| 289 | extra_plugin_paths_.erase(it); |
| 290 | } |
| 291 | |
Lei Zhang | 41da8785 | 2019-02-07 00:45:30 | [diff] [blame] | 292 | PluginList::~PluginList() = default; |
initial.commit | f5b16fe | 2008-07-27 00:20:51 | [diff] [blame] | 293 | |
[email protected] | 29e2fb4 | 2013-07-19 01:13:47 | [diff] [blame] | 294 | } // namespace content |