blob: 55a4d12c4ffc8fafdef79cb68f6143151ec280c0 [file] [log] [blame]
[email protected]3b48dbc2012-01-06 16:34:171// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]e67385f2011-12-21 06:00:565#include "content/browser/plugin_service_impl.h"
initial.commit09911bf2008-07-26 23:55:296
avib7348942015-12-25 20:57:107#include <stddef.h>
8
fdoray9292e0722017-05-13 03:47:519#include <utility>
10
[email protected]d33e7cc2011-09-23 01:43:5611#include "base/bind.h"
[email protected]d48f1e0c2009-02-12 20:57:5412#include "base/command_line.h"
[email protected]7b3ee8b2011-04-01 18:48:1913#include "base/compiler_specific.h"
[email protected]57999812013-02-24 05:40:5214#include "base/files/file_path.h"
skyostil95082a62015-06-05 19:53:0715#include "base/location.h"
fdoray5e1706c32016-09-08 12:57:0916#include "base/logging.h"
asvitkine30330812016-08-30 04:01:0817#include "base/metrics/histogram_macros.h"
[email protected]348fbaac2013-06-11 06:31:5118#include "base/strings/string_util.h"
[email protected]74ebfb12013-06-07 20:48:0019#include "base/strings/utf_string_conversions.h"
[email protected]7f070d42011-03-09 20:25:3220#include "base/synchronization/waitable_event.h"
fdoray9292e0722017-05-13 03:47:5121#include "base/task_runner_util.h"
fdoraycc22a38d2017-04-27 06:56:3922#include "base/task_scheduler/post_task.h"
[email protected]34b99632011-01-01 01:01:0623#include "base/threading/thread.h"
avib7348942015-12-25 20:57:1024#include "build/build_config.h"
[email protected]a01efd22011-03-01 00:38:3225#include "content/browser/ppapi_plugin_process_host.h"
[email protected]f3b1a082011-11-18 00:34:3026#include "content/browser/renderer_host/render_process_host_impl.h"
[email protected]b3c41c0b2012-03-06 15:48:3227#include "content/browser/renderer_host/render_view_host_impl.h"
wfh1a90e032015-04-14 17:10:1728#include "content/common/content_switches_internal.h"
[email protected]dac6a5a2013-07-25 05:06:4829#include "content/common/pepper_plugin_list.h"
[email protected]29e2fb42013-07-19 01:13:4730#include "content/common/plugin_list.h"
[email protected]38b592902011-04-16 02:08:4231#include "content/common/view_messages.h"
[email protected]c38831a12011-10-28 12:44:4932#include "content/public/browser/browser_thread.h"
[email protected]87f3c082011-10-19 18:07:4433#include "content/public/browser/content_browser_client.h"
[email protected]31f376c2012-03-13 16:43:0934#include "content/public/browser/plugin_service_filter.h"
Raymes Khoury978652c2017-11-27 06:28:3735#include "content/public/browser/render_frame_host.h"
[email protected]ce967862012-02-09 22:47:0536#include "content/public/browser/resource_context.h"
Raymes Khoury978652c2017-11-27 06:28:3737#include "content/public/browser/web_contents.h"
[email protected]73270292013-08-09 03:48:0738#include "content/public/common/content_constants.h"
[email protected]c08950d22011-10-13 22:20:2939#include "content/public/common/content_switches.h"
[email protected]bd5d6cf2011-12-01 00:39:1240#include "content/public/common/process_type.h"
[email protected]d7bd3e52013-07-21 04:29:2041#include "content/public/common/webplugininfo.h"
Raymes Khoury978652c2017-11-27 06:28:3742#include "services/metrics/public/cpp/ukm_builders.h"
[email protected]191eb3f72010-12-21 06:27:5043
[email protected]130757672012-10-24 00:26:1944namespace content {
[email protected]d33e7cc2011-09-23 01:43:5645namespace {
46
[email protected]fd8d8d6c2013-02-28 02:48:3347// This enum is used to collect Flash usage data.
48enum FlashUsage {
[email protected]fd8d8d6c2013-02-28 02:48:3349 // Number of browser processes that have started at least one PPAPI Flash
50 // process during their lifetime.
pimane8c57ea2016-04-06 01:19:3651 START_PPAPI_FLASH_AT_LEAST_ONCE = 1,
[email protected]fd8d8d6c2013-02-28 02:48:3352 // Total number of browser processes.
53 TOTAL_BROWSER_PROCESSES,
54 FLASH_USAGE_ENUM_COUNT
55};
56
[email protected]49125952011-09-27 18:05:1557// Callback set on the PluginList to assert that plugin loading happens on the
58// correct thread.
fdoray5e1706c32016-09-08 12:57:0959void WillLoadPluginsCallback(base::SequenceChecker* sequence_checker) {
60 DCHECK(sequence_checker->CalledOnValidSequence());
[email protected]a79912252012-05-16 11:52:1961}
[email protected]d33e7cc2011-09-23 01:43:5662
Steven Holteba045f12017-12-14 21:30:1963} // namespace
64
65// static
66void PluginServiceImpl::RecordBrokerUsage(int render_process_id,
67 int render_frame_id) {
Raymes Khoury978652c2017-11-27 06:28:3768 ukm::UkmRecorder* recorder = ukm::UkmRecorder::Get();
69 ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
70 WebContents* web_contents = WebContents::FromRenderFrameHost(
71 RenderFrameHost::FromID(render_process_id, render_frame_id));
72 if (web_contents) {
73 recorder->UpdateSourceURL(source_id, web_contents->GetLastCommittedURL());
74 ukm::builders::Pepper_Broker(source_id).Record(recorder);
75 }
76}
77
[email protected]3a5180ae2011-12-21 02:39:3878// static
79PluginService* PluginService::GetInstance() {
[email protected]e67385f2011-12-21 06:00:5680 return PluginServiceImpl::GetInstance();
[email protected]3a5180ae2011-12-21 02:39:3881}
82
83void PluginService::PurgePluginListCache(BrowserContext* browser_context,
84 bool reload_pages) {
85 for (RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
86 !it.IsAtEnd(); it.Advance()) {
87 RenderProcessHost* host = it.GetCurrentValue();
88 if (!browser_context || host->GetBrowserContext() == browser_context)
rockota2db0da2016-10-18 17:39:1189 host->GetRendererInterface()->PurgePluginListCache(reload_pages);
[email protected]3a5180ae2011-12-21 02:39:3890 }
91}
92
initial.commit09911bf2008-07-26 23:55:2993// static
[email protected]e67385f2011-12-21 06:00:5694PluginServiceImpl* PluginServiceImpl::GetInstance() {
olli.raula36aa8be2015-09-10 11:14:2295 return base::Singleton<PluginServiceImpl>::get();
initial.commit09911bf2008-07-26 23:55:2996}
97
Ivan Kotenkov2c0d2bb32017-11-01 15:41:2898PluginServiceImpl::PluginServiceImpl() : filter_(nullptr) {
fdoray5e1706c32016-09-08 12:57:0999 plugin_list_sequence_checker_.DetachFromSequence();
100
[email protected]fd8d8d6c2013-02-28 02:48:33101 // Collect the total number of browser processes (which create
102 // PluginServiceImpl objects, to be precise). The number is used to normalize
103 // the number of processes which start at least one NPAPI/PPAPI Flash process.
104 static bool counted = false;
105 if (!counted) {
106 counted = true;
107 UMA_HISTOGRAM_ENUMERATION("Plugin.FlashUsage", TOTAL_BROWSER_PROCESSES,
108 FLASH_USAGE_ENUM_COUNT);
109 }
[email protected]ee066172011-11-10 23:20:05110}
111
[email protected]e67385f2011-12-21 06:00:56112PluginServiceImpl::~PluginServiceImpl() {
[email protected]ee066172011-11-10 23:20:05113}
114
[email protected]e67385f2011-12-21 06:00:56115void PluginServiceImpl::Init() {
fdoraycc22a38d2017-04-27 06:56:39116 plugin_list_task_runner_ = base::CreateSequencedTaskRunnerWithTraits(
fdoray27b0b2a2017-05-04 19:52:08117 {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
118 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
[email protected]29e2fb42013-07-19 01:13:47119 PluginList::Singleton()->set_will_load_plugins_callback(
fdoray5e1706c32016-09-08 12:57:09120 base::Bind(&WillLoadPluginsCallback, &plugin_list_sequence_checker_));
[email protected]49125952011-09-27 18:05:15121
[email protected]4e0616e2010-05-28 14:55:53122 RegisterPepperPlugins();
initial.commit09911bf2008-07-26 23:55:29123}
124
[email protected]e67385f2011-12-21 06:00:56125PpapiPluginProcessHost* PluginServiceImpl::FindPpapiPluginProcess(
[email protected]2dec8ec2013-02-07 19:20:34126 const base::FilePath& plugin_path,
Tom Sepez8db30ad2018-03-01 21:38:54127 const base::FilePath& profile_data_directory,
128 const base::Optional<url::Origin>& origin_lock) {
[email protected]4967f792012-01-20 22:14:40129 for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) {
[email protected]dd9a0952012-05-31 20:11:31130 if (iter->plugin_path() == plugin_path &&
Tom Sepez8db30ad2018-03-01 21:38:54131 iter->profile_data_directory() == profile_data_directory &&
132 (!iter->origin_lock() || iter->origin_lock() == origin_lock)) {
[email protected]4967f792012-01-20 22:14:40133 return *iter;
[email protected]dd9a0952012-05-31 20:11:31134 }
[email protected]a08ebea2011-02-13 17:50:20135 }
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28136 return nullptr;
[email protected]a08ebea2011-02-13 17:50:20137}
138
[email protected]e67385f2011-12-21 06:00:56139PpapiPluginProcessHost* PluginServiceImpl::FindPpapiBrokerProcess(
[email protected]2dec8ec2013-02-07 19:20:34140 const base::FilePath& broker_path) {
[email protected]4967f792012-01-20 22:14:40141 for (PpapiBrokerProcessHostIterator iter; !iter.Done(); ++iter) {
142 if (iter->plugin_path() == broker_path)
143 return *iter;
[email protected]eb415bf0e2011-04-14 02:45:42144 }
145
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28146 return nullptr;
[email protected]eb415bf0e2011-04-14 02:45:42147}
148
[email protected]e67385f2011-12-21 06:00:56149PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiPluginProcess(
[email protected]6be31d202013-02-01 18:20:54150 int render_process_id,
[email protected]2dec8ec2013-02-07 19:20:34151 const base::FilePath& plugin_path,
Tom Sepez8db30ad2018-03-01 21:38:54152 const base::FilePath& profile_data_directory,
153 const base::Optional<url::Origin>& origin_lock) {
mostynb4c27d042015-03-18 21:47:47154 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]a08ebea2011-02-13 17:50:20155
[email protected]132bca82013-12-10 09:14:47156 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path)) {
157 VLOG(1) << "Unable to load ppapi plugin: " << plugin_path.MaybeAsASCII();
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28158 return nullptr;
[email protected]132bca82013-12-10 09:14:47159 }
[email protected]6be31d202013-02-01 18:20:54160
[email protected]eb415bf0e2011-04-14 02:45:42161 // Validate that the plugin is actually registered.
[email protected]130757672012-10-24 00:26:19162 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path);
[email protected]132bca82013-12-10 09:14:47163 if (!info) {
164 VLOG(1) << "Unable to find ppapi plugin registration for: "
165 << plugin_path.MaybeAsASCII();
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28166 return nullptr;
[email protected]132bca82013-12-10 09:14:47167 }
[email protected]a08ebea2011-02-13 17:50:20168
Tom Sepez8db30ad2018-03-01 21:38:54169 PpapiPluginProcessHost* plugin_host =
170 FindPpapiPluginProcess(plugin_path, profile_data_directory, origin_lock);
171 if (plugin_host)
172 return plugin_host;
173
[email protected]fd8d8d6c2013-02-28 02:48:33174 // Record when PPAPI Flash process is started for the first time.
175 static bool counted = false;
176 if (!counted && info->name == kFlashPluginName) {
177 counted = true;
178 UMA_HISTOGRAM_ENUMERATION("Plugin.FlashUsage",
179 START_PPAPI_FLASH_AT_LEAST_ONCE,
180 FLASH_USAGE_ENUM_COUNT);
181 }
182
[email protected]a08ebea2011-02-13 17:50:20183 // This plugin isn't loaded by any plugin process, so create a new process.
[email protected]132bca82013-12-10 09:14:47184 plugin_host = PpapiPluginProcessHost::CreatePluginHost(
Tom Sepez8db30ad2018-03-01 21:38:54185 *info, profile_data_directory, origin_lock);
[email protected]132bca82013-12-10 09:14:47186 if (!plugin_host) {
187 VLOG(1) << "Unable to create ppapi plugin process for: "
188 << plugin_path.MaybeAsASCII();
189 }
190
191 return plugin_host;
[email protected]a08ebea2011-02-13 17:50:20192}
193
[email protected]e67385f2011-12-21 06:00:56194PpapiPluginProcessHost* PluginServiceImpl::FindOrStartPpapiBrokerProcess(
[email protected]6be31d202013-02-01 18:20:54195 int render_process_id,
[email protected]2dec8ec2013-02-07 19:20:34196 const base::FilePath& plugin_path) {
mostynb4c27d042015-03-18 21:47:47197 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]eb415bf0e2011-04-14 02:45:42198
[email protected]6be31d202013-02-01 18:20:54199 if (filter_ && !filter_->CanLoadPlugin(render_process_id, plugin_path))
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28200 return nullptr;
[email protected]6be31d202013-02-01 18:20:54201
[email protected]a50432d2011-09-30 16:32:14202 PpapiPluginProcessHost* plugin_host = FindPpapiBrokerProcess(plugin_path);
[email protected]eb415bf0e2011-04-14 02:45:42203 if (plugin_host)
204 return plugin_host;
205
206 // Validate that the plugin is actually registered.
[email protected]130757672012-10-24 00:26:19207 PepperPluginInfo* info = GetRegisteredPpapiPluginInfo(plugin_path);
[email protected]eb415bf0e2011-04-14 02:45:42208 if (!info)
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28209 return nullptr;
[email protected]eb415bf0e2011-04-14 02:45:42210
211 // TODO(ddorwin): Uncomment once out of process is supported.
212 // DCHECK(info->is_out_of_process);
213
214 // This broker isn't loaded by any broker process, so create a new process.
[email protected]a50432d2011-09-30 16:32:14215 return PpapiPluginProcessHost::CreateBrokerHost(*info);
[email protected]eb415bf0e2011-04-14 02:45:42216}
217
[email protected]e67385f2011-12-21 06:00:56218void PluginServiceImpl::OpenChannelToPpapiPlugin(
[email protected]6be31d202013-02-01 18:20:54219 int render_process_id,
[email protected]2dec8ec2013-02-07 19:20:34220 const base::FilePath& plugin_path,
221 const base::FilePath& profile_data_directory,
Tom Sepez8db30ad2018-03-01 21:38:54222 const base::Optional<url::Origin>& origin_lock,
[email protected]a50432d2011-09-30 16:32:14223 PpapiPluginProcessHost::PluginClient* client) {
[email protected]d259a8e2011-05-18 22:31:09224 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess(
Tom Sepez8db30ad2018-03-01 21:38:54225 render_process_id, plugin_path, profile_data_directory, origin_lock);
[email protected]1bf0fb22012-04-12 21:44:16226 if (plugin_host) {
[email protected]a08ebea2011-02-13 17:50:20227 plugin_host->OpenChannelToPlugin(client);
[email protected]1bf0fb22012-04-12 21:44:16228 } else {
229 // Send error.
[email protected]108fd342013-01-04 20:46:54230 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0);
[email protected]1bf0fb22012-04-12 21:44:16231 }
[email protected]a08ebea2011-02-13 17:50:20232}
233
[email protected]e67385f2011-12-21 06:00:56234void PluginServiceImpl::OpenChannelToPpapiBroker(
[email protected]6be31d202013-02-01 18:20:54235 int render_process_id,
Raymes Khoury978652c2017-11-27 06:28:37236 int render_frame_id,
[email protected]2dec8ec2013-02-07 19:20:34237 const base::FilePath& path,
[email protected]a50432d2011-09-30 16:32:14238 PpapiPluginProcessHost::BrokerClient* client) {
Steven Holteba045f12017-12-14 21:30:19239 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
240 base::BindOnce(&PluginServiceImpl::RecordBrokerUsage,
241 render_process_id, render_frame_id));
Raymes Khoury978652c2017-11-27 06:28:37242
[email protected]6be31d202013-02-01 18:20:54243 PpapiPluginProcessHost* plugin_host = FindOrStartPpapiBrokerProcess(
244 render_process_id, path);
[email protected]1bf0fb22012-04-12 21:44:16245 if (plugin_host) {
[email protected]a50432d2011-09-30 16:32:14246 plugin_host->OpenChannelToPlugin(client);
[email protected]1bf0fb22012-04-12 21:44:16247 } else {
248 // Send error.
[email protected]108fd342013-01-04 20:46:54249 client->OnPpapiChannelOpened(IPC::ChannelHandle(), base::kNullProcessId, 0);
[email protected]1bf0fb22012-04-12 21:44:16250 }
[email protected]eb415bf0e2011-04-14 02:45:42251}
252
[email protected]e67385f2011-12-21 06:00:56253bool PluginServiceImpl::GetPluginInfoArray(
[email protected]51b63f62011-10-05 18:55:42254 const GURL& url,
255 const std::string& mime_type,
256 bool allow_wildcard,
[email protected]d7bd3e52013-07-21 04:29:20257 std::vector<WebPluginInfo>* plugins,
[email protected]51b63f62011-10-05 18:55:42258 std::vector<std::string>* actual_mime_types) {
259 bool use_stale = false;
[email protected]29e2fb42013-07-19 01:13:47260 PluginList::Singleton()->GetPluginInfoArray(
pimane8c57ea2016-04-06 01:19:36261 url, mime_type, allow_wildcard, &use_stale, plugins, actual_mime_types);
[email protected]51b63f62011-10-05 18:55:42262 return use_stale;
263}
264
[email protected]e67385f2011-12-21 06:00:56265bool PluginServiceImpl::GetPluginInfo(int render_process_id,
[email protected]60eca4eb2013-12-06 00:02:16266 int render_frame_id,
[email protected]130757672012-10-24 00:26:19267 ResourceContext* context,
[email protected]e67385f2011-12-21 06:00:56268 const GURL& url,
tommyclif2a1e9f2016-10-06 18:34:36269 const url::Origin& main_frame_origin,
[email protected]e67385f2011-12-21 06:00:56270 const std::string& mime_type,
271 bool allow_wildcard,
272 bool* is_stale,
[email protected]d7bd3e52013-07-21 04:29:20273 WebPluginInfo* info,
[email protected]e67385f2011-12-21 06:00:56274 std::string* actual_mime_type) {
[email protected]d7bd3e52013-07-21 04:29:20275 std::vector<WebPluginInfo> plugins;
[email protected]68598072011-07-29 08:21:28276 std::vector<std::string> mime_types;
[email protected]88ca4912011-10-12 14:00:43277 bool stale = GetPluginInfoArray(
278 url, mime_type, allow_wildcard, &plugins, &mime_types);
279 if (is_stale)
280 *is_stale = stale;
[email protected]dfba8762011-09-02 12:49:54281
[email protected]68598072011-07-29 08:21:28282 for (size_t i = 0; i < plugins.size(); ++i) {
tommyclif2a1e9f2016-10-06 18:34:36283 if (!filter_ ||
284 filter_->IsPluginAvailable(render_process_id, render_frame_id, context,
285 url, main_frame_origin, &plugins[i])) {
[email protected]68598072011-07-29 08:21:28286 *info = plugins[i];
287 if (actual_mime_type)
288 *actual_mime_type = mime_types[i];
289 return true;
290 }
291 }
292 return false;
[email protected]6fdd4182010-10-14 23:59:26293}
294
[email protected]2dec8ec2013-02-07 19:20:34295bool PluginServiceImpl::GetPluginInfoByPath(const base::FilePath& plugin_path,
[email protected]d7bd3e52013-07-21 04:29:20296 WebPluginInfo* info) {
297 std::vector<WebPluginInfo> plugins;
[email protected]29e2fb42013-07-19 01:13:47298 PluginList::Singleton()->GetPluginsNoRefresh(&plugins);
[email protected]88ca4912011-10-12 14:00:43299
[email protected]d7bd3e52013-07-21 04:29:20300 for (std::vector<WebPluginInfo>::iterator it = plugins.begin();
[email protected]88ca4912011-10-12 14:00:43301 it != plugins.end();
302 ++it) {
303 if (it->path == plugin_path) {
304 *info = *it;
305 return true;
306 }
307 }
308
309 return false;
310}
311
[email protected]fcf75d42013-12-03 20:11:26312base::string16 PluginServiceImpl::GetPluginDisplayNameByPath(
[email protected]2dec8ec2013-02-07 19:20:34313 const base::FilePath& path) {
[email protected]fcf75d42013-12-03 20:11:26314 base::string16 plugin_name = path.LossyDisplayName();
[email protected]d7bd3e52013-07-21 04:29:20315 WebPluginInfo info;
[email protected]8be45842012-04-13 19:49:29316 if (PluginService::GetInstance()->GetPluginInfoByPath(path, &info) &&
317 !info.name.empty()) {
318 plugin_name = info.name;
319#if defined(OS_MACOSX)
320 // Many plugins on the Mac have .plugin in the actual name, which looks
321 // terrible, so look for that and strip it off if present.
322 const std::string kPluginExtension = ".plugin";
brettwa7ff1b292015-07-16 17:49:29323 if (base::EndsWith(plugin_name, base::ASCIIToUTF16(kPluginExtension),
324 base::CompareCase::SENSITIVE))
[email protected]8be45842012-04-13 19:49:29325 plugin_name.erase(plugin_name.length() - kPluginExtension.length());
326#endif // OS_MACOSX
327 }
328 return plugin_name;
329}
330
fdoray9292e0722017-05-13 03:47:51331void PluginServiceImpl::GetPlugins(GetPluginsCallback callback) {
332 base::PostTaskAndReplyWithResult(
333 plugin_list_task_runner_.get(), FROM_HERE, base::BindOnce([]() {
334 std::vector<WebPluginInfo> plugins;
335 PluginList::Singleton()->GetPlugins(&plugins);
336 return plugins;
337 }),
338 std::move(callback));
[email protected]dfba8762011-09-02 12:49:54339}
340
[email protected]e67385f2011-12-21 06:00:56341void PluginServiceImpl::RegisterPepperPlugins() {
[email protected]dac6a5a2013-07-25 05:06:48342 ComputePepperPluginList(&ppapi_plugins_);
[email protected]a08ebea2011-02-13 17:50:20343 for (size_t i = 0; i < ppapi_plugins_.size(); ++i) {
[email protected]c6f3dea2012-01-14 02:23:11344 RegisterInternalPlugin(ppapi_plugins_[i].ToWebPluginInfo(), true);
[email protected]4e0616e2010-05-28 14:55:53345 }
346}
[email protected]634d23d2011-01-19 10:38:19347
[email protected]eb415bf0e2011-04-14 02:45:42348// There should generally be very few plugins so a brute-force search is fine.
[email protected]130757672012-10-24 00:26:19349PepperPluginInfo* PluginServiceImpl::GetRegisteredPpapiPluginInfo(
[email protected]2dec8ec2013-02-07 19:20:34350 const base::FilePath& plugin_path) {
[email protected]3627aa3f2013-09-17 22:32:51351 for (size_t i = 0; i < ppapi_plugins_.size(); ++i) {
thestig76ee1f42016-07-08 18:54:00352 if (ppapi_plugins_[i].path == plugin_path)
353 return &ppapi_plugins_[i];
[email protected]eb415bf0e2011-04-14 02:45:42354 }
[email protected]076117592011-08-17 03:16:41355 // We did not find the plugin in our list. But wait! the plugin can also
356 // be a latecomer, as it happens with pepper flash. This information
357 // can be obtained from the PluginList singleton and we can use it to
358 // construct it and add it to the list. This same deal needs to be done
359 // in the renderer side in PepperPluginRegistry.
[email protected]d7bd3e52013-07-21 04:29:20360 WebPluginInfo webplugin_info;
[email protected]88ca4912011-10-12 14:00:43361 if (!GetPluginInfoByPath(plugin_path, &webplugin_info))
thestig76ee1f42016-07-08 18:54:00362 return nullptr;
[email protected]130757672012-10-24 00:26:19363 PepperPluginInfo new_pepper_info;
[email protected]076117592011-08-17 03:16:41364 if (!MakePepperPluginInfo(webplugin_info, &new_pepper_info))
thestig76ee1f42016-07-08 18:54:00365 return nullptr;
[email protected]076117592011-08-17 03:16:41366 ppapi_plugins_.push_back(new_pepper_info);
thestig76ee1f42016-07-08 18:54:00367 return &ppapi_plugins_.back();
[email protected]eb415bf0e2011-04-14 02:45:42368}
369
[email protected]130757672012-10-24 00:26:19370void PluginServiceImpl::SetFilter(PluginServiceFilter* filter) {
[email protected]3a5180ae2011-12-21 02:39:38371 filter_ = filter;
372}
373
[email protected]130757672012-10-24 00:26:19374PluginServiceFilter* PluginServiceImpl::GetFilter() {
[email protected]3a5180ae2011-12-21 02:39:38375 return filter_;
376}
377
[email protected]47214d882012-02-29 06:28:48378static const unsigned int kMaxCrashesPerInterval = 3;
379static const unsigned int kCrashesInterval = 120;
380
[email protected]2dec8ec2013-02-07 19:20:34381void PluginServiceImpl::RegisterPluginCrash(const base::FilePath& path) {
mostynb4c27d042015-03-18 21:47:47382 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]2dec8ec2013-02-07 19:20:34383 std::map<base::FilePath, std::vector<base::Time> >::iterator i =
[email protected]47214d882012-02-29 06:28:48384 crash_times_.find(path);
385 if (i == crash_times_.end()) {
386 crash_times_[path] = std::vector<base::Time>();
387 i = crash_times_.find(path);
388 }
389 if (i->second.size() == kMaxCrashesPerInterval) {
390 i->second.erase(i->second.begin());
391 }
392 base::Time time = base::Time::Now();
393 i->second.push_back(time);
394}
395
[email protected]2dec8ec2013-02-07 19:20:34396bool PluginServiceImpl::IsPluginUnstable(const base::FilePath& path) {
mostynb4c27d042015-03-18 21:47:47397 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]2dec8ec2013-02-07 19:20:34398 std::map<base::FilePath, std::vector<base::Time> >::const_iterator i =
[email protected]47214d882012-02-29 06:28:48399 crash_times_.find(path);
400 if (i == crash_times_.end()) {
401 return false;
402 }
403 if (i->second.size() != kMaxCrashesPerInterval) {
404 return false;
405 }
406 base::TimeDelta delta = base::Time::Now() - i->second[0];
[email protected]d8c70062013-04-24 00:22:34407 return delta.InSeconds() <= kCrashesInterval;
[email protected]47214d882012-02-29 06:28:48408}
409
[email protected]e67385f2011-12-21 06:00:56410void PluginServiceImpl::RefreshPlugins() {
[email protected]29e2fb42013-07-19 01:13:47411 PluginList::Singleton()->RefreshPlugins();
[email protected]f520b5b2011-11-08 02:42:14412}
413
[email protected]8f3372122013-07-18 04:34:14414void PluginServiceImpl::RegisterInternalPlugin(
[email protected]d7bd3e52013-07-21 04:29:20415 const WebPluginInfo& info,
[email protected]8f3372122013-07-18 04:34:14416 bool add_at_beginning) {
[email protected]29e2fb42013-07-19 01:13:47417 PluginList::Singleton()->RegisterInternalPlugin(info, add_at_beginning);
[email protected]f520b5b2011-11-08 02:42:14418}
419
[email protected]2dec8ec2013-02-07 19:20:34420void PluginServiceImpl::UnregisterInternalPlugin(const base::FilePath& path) {
[email protected]29e2fb42013-07-19 01:13:47421 PluginList::Singleton()->UnregisterInternalPlugin(path);
[email protected]f520b5b2011-11-08 02:42:14422}
423
[email protected]8f3372122013-07-18 04:34:14424void PluginServiceImpl::GetInternalPlugins(
[email protected]d7bd3e52013-07-21 04:29:20425 std::vector<WebPluginInfo>* plugins) {
[email protected]29e2fb42013-07-19 01:13:47426 PluginList::Singleton()->GetInternalPlugins(plugins);
[email protected]8f3372122013-07-18 04:34:14427}
428
[email protected]aec5ed52014-06-20 07:51:42429bool PluginServiceImpl::PpapiDevChannelSupported(
430 BrowserContext* browser_context,
431 const GURL& document_url) {
wfh6be06282015-07-20 18:04:02432 return GetContentClient()->browser()->IsPluginAllowedToUseDevChannelAPIs(
433 browser_context, document_url);
[email protected]8ddc6b7c2013-12-12 20:42:06434}
435
[email protected]130757672012-10-24 00:26:19436} // namespace content