1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This class responds to requests from renderers for the list of plugins, and
// also a proxy object for plugin instances.
#ifndef CHROME_BROWSER_PLUGIN_SERVICE_H__
#define CHROME_BROWSER_PLUGIN_SERVICE_H__
#include <vector>
#include "base/basictypes.h"
#include "base/hash_tables.h"
#include "base/lock.h"
#include "chrome/browser/browser_process.h"
#include "webkit/glue/webplugin.h"
namespace IPC {
class Message;
}
class PluginProcessHost;
class URLRequestContext;
class ResourceDispatcherHost;
class ResourceMessageFilter;
// This can be called on the main thread and IO thread. However it must
// be created on the main thread.
class PluginService {
public:
// Returns the PluginService singleton.
static PluginService* GetInstance();
// Creates the PluginService object, but doesn't actually build the plugin
// list yet. It's generated lazily.
// Note: don't call these directly - use GetInstance() above. They are public
// so Singleton can access them.
PluginService();
~PluginService();
// Gets the list of available plugins.
void GetPlugins(bool refresh, std::vector<WebPluginInfo>* plugins);
// Load all the plugins that should be loaded for the lifetime of the browser
// (ie, with the LoadOnStartup flag set).
void LoadChromePlugins(ResourceDispatcherHost* resource_dispatcher_host);
// Sets/gets the data directory that Chrome plugins should use to store
// persistent data.
void SetChromePluginDataDir(const std::wstring& data_dir);
const std::wstring& GetChromePluginDataDir();
// Gets the browser's UI locale.
const std::wstring& GetUILocale();
// Returns the plugin process host corresponding to the plugin process that
// has been started by this service. Returns NULL if no process has been
// started.
PluginProcessHost* FindPluginProcess(const std::wstring& dll);
// Returns the plugin process host corresponding to the plugin process that
// has been started by this service. This will start a process to host the
// 'dll' if needed. If the process fails to start, the return value is NULL.
// Must be called on the IO thread.
PluginProcessHost* FindOrStartPluginProcess(const std::wstring& dll,
const std::string& clsid);
// Opens a channel to a plugin process for the given mime type, starting
// a new plugin process if necessary. This must be called on the IO thread
// or else a deadlock can occur.
void OpenChannelToPlugin(ResourceMessageFilter* renderer_msg_filter,
const GURL& url,
const std::string& mime_type,
const std::string& clsid,
const std::wstring& locale,
IPC::Message* reply_msg);
// A PluginProcessHost object calls this before its process is shut down.
void OnPluginProcessIsShuttingDown(PluginProcessHost* host);
// A PluginProcessHost object calls this after its process has exited. This
// call deletes the host instance.
void OnPluginProcessExited(PluginProcessHost* host);
bool HavePluginFor(const std::string& mime_type, bool allow_wildcard);
std::wstring GetPluginPath(const GURL& url,
const std::string& mime_type,
const std::string& clsid,
std::string* actual_mime_type);
// Get plugin info by matching full dll path.
bool GetPluginInfoByDllPath(const std::wstring& dll_path,
WebPluginInfo* info);
// Returns true if the plugin's mime-type supports a given mime-type.
// Checks for absolute matching and wildcards. mime-types should be in
// lower case.
bool SupportsMimeType(const std::wstring& plugin_mime_type,
const std::wstring& mime_type);
// The UI thread's message loop
MessageLoop* main_message_loop() { return main_message_loop_; }
ResourceDispatcherHost* resource_dispatcher_host() const {
return resource_dispatcher_host_;
}
// Initiates shutdown on all running PluginProcessHost instances.
// Can be invoked on the main thread.
void Shutdown();
private:
friend class PluginProcessHostIterator;
// Removes a host from the plugin_hosts collection
void RemoveHost(PluginProcessHost* host);
// Shutdown handler which executes in the context of the IO thread.
void OnShutdown();
// mapping between plugin dll path and PluginProcessHost
typedef base::hash_map<std::wstring, PluginProcessHost*> PluginMap;
PluginMap plugin_hosts_;
// The main thread's message loop.
MessageLoop* main_message_loop_;
// The IO thread's resource dispatcher host.
ResourceDispatcherHost* resource_dispatcher_host_;
// The data directory that Chrome plugins should use to store persistent data.
std::wstring chrome_plugin_data_dir_;
// The browser's UI locale.
const std::wstring ui_locale_;
// Need synchronization whenever we access the plugin_list singelton through
// webkit_glue since this class is called on the main and IO thread.
Lock lock_;
// Handles plugin process shutdown.
class ShutdownHandler :
public base::RefCountedThreadSafe<ShutdownHandler> {
public:
ShutdownHandler() {}
~ShutdownHandler() {}
// Initiates plugin process shutdown. Ensures that the actual shutdown
// happens on the io thread.
void InitiateShutdown();
private:
// Shutdown handler which runs on the io thread.
void OnShutdown();
DISALLOW_EVIL_CONSTRUCTORS(ShutdownHandler);
};
friend class ShutdownHandler;
scoped_refptr<ShutdownHandler> plugin_shutdown_handler_;
DISALLOW_EVIL_CONSTRUCTORS(PluginService);
};
// The PluginProcessHostIterator allows to iterate through all the
// PluginProcessHosts. Note that this should be done from the IO thread and that
// the iterator should not be kept around as it may be invalidated on
// subsequent event processing in the event loop.
class PluginProcessHostIterator {
public:
PluginProcessHostIterator();
PluginProcessHostIterator(const PluginProcessHostIterator& instance);
PluginProcessHostIterator& operator=(
const PluginProcessHostIterator& instance) {
iterator_ = instance.iterator_;
}
const PluginProcessHost* operator->() const {
return iterator_->second;
}
const PluginProcessHost* operator*() const {
return iterator_->second;
}
const PluginProcessHost* operator++() { // ++preincrement
++iterator_;
if (iterator_ == end_)
return NULL;
else
return iterator_->second;
}
const PluginProcessHost* operator++(int) { // postincrement++
const PluginProcessHost* r;
if (iterator_ == end_)
r = NULL;
else
r = iterator_->second;
iterator_++;
return r;
}
bool Done() {
return (iterator_ == end_);
}
private:
PluginService::PluginMap::const_iterator iterator_;
PluginService::PluginMap::const_iterator end_;
};
#endif // CHROME_BROWSER_PLUGIN_SERVICE_H__
|