blob: 9ee6c43367d3ff04bacc5960cf02536ce25dd524 [file] [log] [blame]
[email protected]3b48dbc2012-01-06 16:34:171// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]a0421732011-02-23 03:55:402// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This class responds to requests from renderers for the list of plugins, and
6// also a proxy object for plugin instances.
7
[email protected]e67385f2011-12-21 06:00:568#ifndef CONTENT_BROWSER_PLUGIN_SERVICE_IMPL_H_
9#define CONTENT_BROWSER_PLUGIN_SERVICE_IMPL_H_
[email protected]a0421732011-02-23 03:55:4010
[email protected]47214d882012-02-29 06:28:4811#include <map>
[email protected]7dba43dc2011-11-10 01:57:5812#include <set>
[email protected]47214d882012-02-29 06:28:4813#include <vector>
[email protected]a0421732011-02-23 03:55:4014
15#include "base/basictypes.h"
[email protected]bdd6deb2011-12-21 03:03:2416#include "base/compiler_specific.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/scoped_vector.h"
18#include "base/memory/singleton.h"
[email protected]a0421732011-02-23 03:55:4019#include "base/synchronization/waitable_event_watcher.h"
[email protected]a33fa9d2012-05-16 14:47:4920#include "base/threading/sequenced_worker_pool.h"
[email protected]47214d882012-02-29 06:28:4821#include "base/time.h"
[email protected]a0421732011-02-23 03:55:4022#include "build/build_config.h"
[email protected]a0421732011-02-23 03:55:4023#include "content/browser/plugin_process_host.h"
24#include "content/browser/ppapi_plugin_process_host.h"
[email protected]8d128d62011-09-13 22:11:5725#include "content/common/content_export.h"
[email protected]3a5180ae2011-12-21 02:39:3826#include "content/public/browser/plugin_service.h"
[email protected]a0421732011-02-23 03:55:4027#include "googleurl/src/gurl.h"
28#include "ipc/ipc_channel_handle.h"
[email protected]a0421732011-02-23 03:55:4029
30#if defined(OS_WIN)
[email protected]3b63f8f42011-03-28 01:54:1531#include "base/memory/scoped_ptr.h"
[email protected]a0421732011-02-23 03:55:4032#include "base/win/registry.h"
33#endif
34
[email protected]52348b22012-11-07 10:19:3435#if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID)
[email protected]493c8002011-04-14 16:56:0136#include "base/files/file_path_watcher.h"
[email protected]a0421732011-02-23 03:55:4037#endif
38
[email protected]d33e7cc2011-09-23 01:43:5639namespace base {
40class MessageLoopProxy;
41}
42
[email protected]d33e7cc2011-09-23 01:43:5643namespace webkit {
44namespace npapi {
[email protected]d33e7cc2011-09-23 01:43:5645class PluginList;
46}
47}
48
[email protected]130757672012-10-24 00:26:1949namespace content {
50class BrowserContext;
51class PluginDirWatcherDelegate;
52class PluginLoaderPosix;
53class PluginServiceFilter;
54class ResourceContext;
55struct PepperPluginInfo;
56
[email protected]209f2ae2012-03-13 01:28:0857// base::Bind() has limited arity, and the filter-related methods tend to
58// surpass that limit.
59struct PluginServiceFilterParams {
60 int render_process_id;
61 int render_view_id;
62 GURL page_url;
[email protected]130757672012-10-24 00:26:1963 ResourceContext* resource_context;
[email protected]209f2ae2012-03-13 01:28:0864};
65
[email protected]e67385f2011-12-21 06:00:5666class CONTENT_EXPORT PluginServiceImpl
[email protected]329be052013-02-04 18:14:2867 : NON_EXPORTED_BASE(public PluginService) {
[email protected]a0421732011-02-23 03:55:4068 public:
[email protected]e67385f2011-12-21 06:00:5669 // Returns the PluginServiceImpl singleton.
70 static PluginServiceImpl* GetInstance();
[email protected]a0421732011-02-23 03:55:4071
[email protected]130757672012-10-24 00:26:1972 // PluginService implementation:
[email protected]3a5180ae2011-12-21 02:39:3873 virtual void Init() OVERRIDE;
74 virtual void StartWatchingPlugins() OVERRIDE;
[email protected]3a5180ae2011-12-21 02:39:3875 virtual bool GetPluginInfoArray(
76 const GURL& url,
77 const std::string& mime_type,
78 bool allow_wildcard,
79 std::vector<webkit::WebPluginInfo>* info,
80 std::vector<std::string>* actual_mime_types) OVERRIDE;
81 virtual bool GetPluginInfo(int render_process_id,
82 int render_view_id,
[email protected]130757672012-10-24 00:26:1983 ResourceContext* context,
[email protected]3a5180ae2011-12-21 02:39:3884 const GURL& url,
85 const GURL& page_url,
86 const std::string& mime_type,
87 bool allow_wildcard,
88 bool* is_stale,
89 webkit::WebPluginInfo* info,
90 std::string* actual_mime_type) OVERRIDE;
[email protected]2dec8ec2013-02-07 19:20:3491 virtual bool GetPluginInfoByPath(const base::FilePath& plugin_path,
[email protected]3a5180ae2011-12-21 02:39:3892 webkit::WebPluginInfo* info) OVERRIDE;
[email protected]2dec8ec2013-02-07 19:20:3493 virtual string16 GetPluginDisplayNameByPath(
94 const base::FilePath& path) OVERRIDE;
[email protected]3a5180ae2011-12-21 02:39:3895 virtual void GetPlugins(const GetPluginsCallback& callback) OVERRIDE;
[email protected]130757672012-10-24 00:26:1996 virtual PepperPluginInfo* GetRegisteredPpapiPluginInfo(
[email protected]2dec8ec2013-02-07 19:20:3497 const base::FilePath& plugin_path) OVERRIDE;
[email protected]130757672012-10-24 00:26:1998 virtual void SetFilter(PluginServiceFilter* filter) OVERRIDE;
99 virtual PluginServiceFilter* GetFilter() OVERRIDE;
[email protected]2dec8ec2013-02-07 19:20:34100 virtual void ForcePluginShutdown(const base::FilePath& plugin_path) OVERRIDE;
101 virtual bool IsPluginUnstable(const base::FilePath& plugin_path) OVERRIDE;
[email protected]3a5180ae2011-12-21 02:39:38102 virtual void RefreshPlugins() OVERRIDE;
[email protected]2dec8ec2013-02-07 19:20:34103 virtual void AddExtraPluginPath(const base::FilePath& path) OVERRIDE;
104 virtual void AddExtraPluginDir(const base::FilePath& path) OVERRIDE;
105 virtual void RemoveExtraPluginPath(const base::FilePath& path) OVERRIDE;
106 virtual void UnregisterInternalPlugin(const base::FilePath& path) OVERRIDE;
[email protected]3a5180ae2011-12-21 02:39:38107 virtual void RegisterInternalPlugin(
[email protected]c6f3dea2012-01-14 02:23:11108 const webkit::WebPluginInfo& info, bool add_at_beginning) OVERRIDE;
[email protected]57aece22012-10-10 22:10:27109 virtual void GetInternalPlugins(
110 std::vector<webkit::WebPluginInfo>* plugins) OVERRIDE;
[email protected]3a5180ae2011-12-21 02:39:38111 virtual webkit::npapi::PluginList* GetPluginList() OVERRIDE;
[email protected]e67385f2011-12-21 06:00:56112 virtual void SetPluginListForTesting(
113 webkit::npapi::PluginList* plugin_list) OVERRIDE;
[email protected]5904cb42012-09-24 15:05:20114#if defined(OS_MACOSX)
115 virtual void AppActivated() OVERRIDE;
116#endif
[email protected]dfba8762011-09-02 12:49:54117
[email protected]a0421732011-02-23 03:55:40118 // Returns the plugin process host corresponding to the plugin process that
119 // has been started by this service. This will start a process to host the
120 // 'plugin_path' if needed. If the process fails to start, the return value
121 // is NULL. Must be called on the IO thread.
122 PluginProcessHost* FindOrStartNpapiPluginProcess(
[email protected]2dec8ec2013-02-07 19:20:34123 int render_process_id, const base::FilePath& plugin_path);
[email protected]a0421732011-02-23 03:55:40124 PpapiPluginProcessHost* FindOrStartPpapiPluginProcess(
[email protected]6be31d202013-02-01 18:20:54125 int render_process_id,
[email protected]2dec8ec2013-02-07 19:20:34126 const base::FilePath& plugin_path,
127 const base::FilePath& profile_data_directory,
[email protected]a50432d2011-09-30 16:32:14128 PpapiPluginProcessHost::PluginClient* client);
129 PpapiPluginProcessHost* FindOrStartPpapiBrokerProcess(
[email protected]2dec8ec2013-02-07 19:20:34130 int render_process_id, const base::FilePath& plugin_path);
[email protected]a0421732011-02-23 03:55:40131
132 // Opens a channel to a plugin process for the given mime type, starting
133 // a new plugin process if necessary. This must be called on the IO thread
134 // or else a deadlock can occur.
135 void OpenChannelToNpapiPlugin(int render_process_id,
136 int render_view_id,
137 const GURL& url,
[email protected]dfba8762011-09-02 12:49:54138 const GURL& page_url,
[email protected]a0421732011-02-23 03:55:40139 const std::string& mime_type,
140 PluginProcessHost::Client* client);
[email protected]6be31d202013-02-01 18:20:54141 void OpenChannelToPpapiPlugin(int render_process_id,
[email protected]2dec8ec2013-02-07 19:20:34142 const base::FilePath& plugin_path,
143 const base::FilePath& profile_data_directory,
[email protected]a50432d2011-09-30 16:32:14144 PpapiPluginProcessHost::PluginClient* client);
[email protected]6be31d202013-02-01 18:20:54145 void OpenChannelToPpapiBroker(int render_process_id,
[email protected]2dec8ec2013-02-07 19:20:34146 const base::FilePath& path,
[email protected]a50432d2011-09-30 16:32:14147 PpapiPluginProcessHost::BrokerClient* client);
[email protected]a0421732011-02-23 03:55:40148
[email protected]4befe7592011-09-14 22:49:09149 // Cancels opening a channel to a NPAPI plugin.
150 void CancelOpenChannelToNpapiPlugin(PluginProcessHost::Client* client);
151
[email protected]47214d882012-02-29 06:28:48152 // Used to monitor plug-in stability.
[email protected]2dec8ec2013-02-07 19:20:34153 void RegisterPluginCrash(const base::FilePath& plugin_path);
[email protected]47214d882012-02-29 06:28:48154
[email protected]a0421732011-02-23 03:55:40155 private:
[email protected]e67385f2011-12-21 06:00:56156 friend struct DefaultSingletonTraits<PluginServiceImpl>;
[email protected]a0421732011-02-23 03:55:40157
[email protected]e67385f2011-12-21 06:00:56158 // Creates the PluginServiceImpl object, but doesn't actually build the plugin
[email protected]a0421732011-02-23 03:55:40159 // list yet. It's generated lazily.
[email protected]e67385f2011-12-21 06:00:56160 PluginServiceImpl();
161 virtual ~PluginServiceImpl();
[email protected]a0421732011-02-23 03:55:40162
[email protected]329be052013-02-04 18:14:28163 void OnWaitableEventSignaled(base::WaitableEvent* waitable_event);
[email protected]a0421732011-02-23 03:55:40164
[email protected]b6a2f8de2012-01-31 17:28:49165 // Returns the plugin process host corresponding to the plugin process that
166 // has been started by this service. Returns NULL if no process has been
167 // started.
[email protected]2dec8ec2013-02-07 19:20:34168 PluginProcessHost* FindNpapiPluginProcess(const base::FilePath& plugin_path);
[email protected]dd9a0952012-05-31 20:11:31169 PpapiPluginProcessHost* FindPpapiPluginProcess(
[email protected]2dec8ec2013-02-07 19:20:34170 const base::FilePath& plugin_path,
171 const base::FilePath& profile_data_directory);
172 PpapiPluginProcessHost* FindPpapiBrokerProcess(
173 const base::FilePath& broker_path);
[email protected]b6a2f8de2012-01-31 17:28:49174
[email protected]a0421732011-02-23 03:55:40175 void RegisterPepperPlugins();
176
[email protected]a33fa9d2012-05-16 14:47:49177 // Run on the blocking pool to load the plugins synchronously.
[email protected]d33e7cc2011-09-23 01:43:56178 void GetPluginsInternal(base::MessageLoopProxy* target_loop,
179 const GetPluginsCallback& callback);
180
[email protected]88ca4912011-10-12 14:00:43181 // Binding directly to GetAllowedPluginForOpenChannelToPlugin() isn't possible
182 // because more arity is needed <http://crbug.com/98542>. This just forwards.
183 void ForwardGetAllowedPluginForOpenChannelToPlugin(
[email protected]209f2ae2012-03-13 01:28:08184 const PluginServiceFilterParams& params,
[email protected]88ca4912011-10-12 14:00:43185 const GURL& url,
186 const std::string& mime_type,
187 PluginProcessHost::Client* client,
188 const std::vector<webkit::WebPluginInfo>&);
[email protected]a0421732011-02-23 03:55:40189 // Helper so we can do the plugin lookup on the FILE thread.
190 void GetAllowedPluginForOpenChannelToPlugin(
191 int render_process_id,
192 int render_view_id,
193 const GURL& url,
[email protected]dfba8762011-09-02 12:49:54194 const GURL& page_url,
[email protected]a0421732011-02-23 03:55:40195 const std::string& mime_type,
[email protected]87c4be42011-09-16 01:10:59196 PluginProcessHost::Client* client,
[email protected]130757672012-10-24 00:26:19197 ResourceContext* resource_context);
[email protected]a0421732011-02-23 03:55:40198
199 // Helper so we can finish opening the channel after looking up the
200 // plugin.
[email protected]6be31d202013-02-01 18:20:54201 void FinishOpenChannelToPlugin(int render_process_id,
[email protected]2dec8ec2013-02-07 19:20:34202 const base::FilePath& plugin_path,
[email protected]07b71c82013-01-08 19:07:31203 PluginProcessHost::Client* client);
[email protected]a0421732011-02-23 03:55:40204
[email protected]52348b22012-11-07 10:19:34205#if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID)
[email protected]a0421732011-02-23 03:55:40206 // Registers a new FilePathWatcher for a given path.
[email protected]6665571f2013-01-15 07:59:52207 static void RegisterFilePathWatcher(base::FilePathWatcher* watcher,
[email protected]2dec8ec2013-02-07 19:20:34208 const base::FilePath& path);
[email protected]a0421732011-02-23 03:55:40209#endif
210
[email protected]ee066172011-11-10 23:20:05211 // The plugin list instance.
212 webkit::npapi::PluginList* plugin_list_;
213
[email protected]a0421732011-02-23 03:55:40214#if defined(OS_WIN)
215 // Registry keys for getting notifications when new plugins are installed.
216 base::win::RegKey hkcu_key_;
217 base::win::RegKey hklm_key_;
218 scoped_ptr<base::WaitableEvent> hkcu_event_;
219 scoped_ptr<base::WaitableEvent> hklm_event_;
220 base::WaitableEventWatcher hkcu_watcher_;
221 base::WaitableEventWatcher hklm_watcher_;
222#endif
223
[email protected]52348b22012-11-07 10:19:34224#if defined(OS_POSIX) && !defined(OS_OPENBSD) && !defined(OS_ANDROID)
[email protected]6665571f2013-01-15 07:59:52225 ScopedVector<base::FilePathWatcher> file_watchers_;
[email protected]a0421732011-02-23 03:55:40226#endif
227
[email protected]130757672012-10-24 00:26:19228 std::vector<PepperPluginInfo> ppapi_plugins_;
[email protected]a0421732011-02-23 03:55:40229
[email protected]dfba8762011-09-02 12:49:54230 // Weak pointer; outlives us.
[email protected]130757672012-10-24 00:26:19231 PluginServiceFilter* filter_;
[email protected]a0421732011-02-23 03:55:40232
[email protected]4befe7592011-09-14 22:49:09233 std::set<PluginProcessHost::Client*> pending_plugin_clients_;
234
[email protected]a33fa9d2012-05-16 14:47:49235 // Used to sequentialize loading plug-ins from disk.
236 base::SequencedWorkerPool::SequenceToken plugin_list_token_;
[email protected]1b517202012-12-19 17:16:10237
[email protected]d4af1e72011-10-21 17:45:43238#if defined(OS_POSIX)
239 scoped_refptr<PluginLoaderPosix> plugin_loader_;
240#endif
241
[email protected]47214d882012-02-29 06:28:48242 // Used to detect if a given plug-in is crashing over and over.
[email protected]2dec8ec2013-02-07 19:20:34243 std::map<base::FilePath, std::vector<base::Time> > crash_times_;
[email protected]47214d882012-02-29 06:28:48244
[email protected]e67385f2011-12-21 06:00:56245 DISALLOW_COPY_AND_ASSIGN(PluginServiceImpl);
[email protected]a0421732011-02-23 03:55:40246};
247
[email protected]130757672012-10-24 00:26:19248} // namespace content
249
[email protected]e67385f2011-12-21 06:00:56250#endif // CONTENT_BROWSER_PLUGIN_SERVICE_IMPL_H_