• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_PUBLIC_BROWSER_PLUGIN_SERVICE_H_
6 #define CONTENT_PUBLIC_BROWSER_PLUGIN_SERVICE_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/callback.h"
12 #include "base/strings/string16.h"
13 #include "content/common/content_export.h"
14 
15 class GURL;
16 
17 namespace base {
18 class FilePath;
19 }
20 
21 namespace content {
22 
23 class BrowserContext;
24 class PluginProcessHost;
25 class PluginServiceFilter;
26 class ResourceContext;
27 struct PepperPluginInfo;
28 struct WebPluginInfo;
29 
30 // This must be created on the main thread but it's only called on the IO/file
31 // thread. This is an asynchronous wrapper around the PluginList interface for
32 // querying plugin information. This must be used instead of that to avoid
33 // doing expensive disk operations on the IO/UI threads.
34 class PluginService {
35  public:
36   typedef base::Callback<void(const std::vector<WebPluginInfo>&)>
37       GetPluginsCallback;
38 
39   // Returns the PluginService singleton.
40   CONTENT_EXPORT static PluginService* GetInstance();
41 
42   // Tells all the renderer processes associated with the given browser context
43   // to throw away their cache of the plugin list, and optionally also reload
44   // all the pages with plugins. If |browser_context| is NULL, purges the cache
45   // in all renderers.
46   // NOTE: can only be called on the UI thread.
47   CONTENT_EXPORT static void PurgePluginListCache(
48       BrowserContext* browser_context,
49       bool reload_pages);
50 
~PluginService()51   virtual ~PluginService() {}
52 
53   // Must be called on the instance to finish initialization.
54   virtual void Init() = 0;
55 
56   // Starts watching for changes in the list of installed plug-ins.
57   virtual void StartWatchingPlugins() = 0;
58 
59   // Gets the plugin in the list of plugins that matches the given url and mime
60   // type. Returns true if the data is frome a stale plugin list, false if it
61   // is up to date. This can be called from any thread.
62   virtual bool GetPluginInfoArray(
63       const GURL& url,
64       const std::string& mime_type,
65       bool allow_wildcard,
66       std::vector<WebPluginInfo>* info,
67       std::vector<std::string>* actual_mime_types) = 0;
68 
69   // Gets plugin info for an individual plugin and filters the plugins using
70   // the |context| and renderer IDs. This will report whether the data is stale
71   // via |is_stale| and returns whether or not the plugin can be found.
72   virtual bool GetPluginInfo(int render_process_id,
73                              int render_frame_id,
74                              ResourceContext* context,
75                              const GURL& url,
76                              const GURL& page_url,
77                              const std::string& mime_type,
78                              bool allow_wildcard,
79                              bool* is_stale,
80                              WebPluginInfo* info,
81                              std::string* actual_mime_type) = 0;
82 
83   // Get plugin info by plugin path (including disabled plugins). Returns true
84   // if the plugin is found and WebPluginInfo has been filled in |info|. This
85   // will use cached data in the plugin list.
86   virtual bool GetPluginInfoByPath(const base::FilePath& plugin_path,
87                                    WebPluginInfo* info) = 0;
88 
89   // Returns the display name for the plugin identified by the given path. If
90   // the path doesn't identify a plugin, or the plugin has no display name,
91   // this will attempt to generate a display name from the path.
92   virtual base::string16 GetPluginDisplayNameByPath(
93       const base::FilePath& plugin_path) = 0;
94 
95   // Asynchronously loads plugins if necessary and then calls back to the
96   // provided function on the calling MessageLoop on completion.
97   virtual void GetPlugins(const GetPluginsCallback& callback) = 0;
98 
99   // Returns information about a pepper plugin if it exists, otherwise NULL.
100   // The caller does not own the pointer, and it's not guaranteed to live past
101   // the call stack.
102   virtual PepperPluginInfo* GetRegisteredPpapiPluginInfo(
103       const base::FilePath& plugin_path) = 0;
104 
105   virtual void SetFilter(PluginServiceFilter* filter) = 0;
106   virtual PluginServiceFilter* GetFilter() = 0;
107 
108   // If the plugin with the given path is running, cleanly shuts it down.
109   virtual void ForcePluginShutdown(const base::FilePath& plugin_path) = 0;
110 
111   // Used to monitor plug-in stability. An unstable plug-in is one that has
112   // crashed more than a set number of times in a set time period.
113   virtual bool IsPluginUnstable(const base::FilePath& plugin_path) = 0;
114 
115   // Cause the plugin list to refresh next time they are accessed, regardless
116   // of whether they are already loaded.
117   virtual void RefreshPlugins() = 0;
118 
119   // Add/Remove an extra plugin to load when we actually do the loading.  Must
120   // be called before the plugins have been loaded.
121   virtual void AddExtraPluginPath(const base::FilePath& path) = 0;
122   virtual void RemoveExtraPluginPath(const base::FilePath& path) = 0;
123 
124   // Same as above, but specifies a directory in which to search for plugins.
125   virtual void AddExtraPluginDir(const base::FilePath& path) = 0;
126 
127   // Register an internal plugin with the specified plugin information.
128   // An internal plugin must be registered before it can
129   // be loaded using PluginList::LoadPlugin().
130   // If |add_at_beginning| is true the plugin will be added earlier in
131   // the list so that it can override the MIME types of older registrations.
132   virtual void RegisterInternalPlugin(const WebPluginInfo& info,
133                                       bool add_at_beginning) = 0;
134 
135   // Removes a specified internal plugin from the list. The search will match
136   // on the path from the version info previously registered.
137   virtual void UnregisterInternalPlugin(const base::FilePath& path) = 0;
138 
139   // Gets a list of all the registered internal plugins.
140   virtual void GetInternalPlugins(std::vector<WebPluginInfo>* plugins) = 0;
141 
142   // Returns true iff NPAPI plugins are supported on the current platform.
143   // This can be called from any thread.
144   virtual bool NPAPIPluginsSupported() = 0;
145 
146   // This is equivalent to specifying kDisablePluginsDiscovery, but is useful
147   // for unittests.
148   virtual void DisablePluginsDiscoveryForTesting() = 0;
149 
150 #if defined(OS_MACOSX)
151   // Called when the application is made active so that modal plugin windows can
152   // be made forward too.
153   virtual void AppActivated() = 0;
154 #elif defined(OS_WIN)
155   // Returns the name and version of a plugin HWND. If the HWND isn't a valid
156   // plugin, returns false.
157   // This can be called from any thread.
158   virtual bool GetPluginInfoFromWindow(HWND window,
159                                        base::string16* plugin_name,
160                                        base::string16* plugin_version) = 0;
161 #endif
162 
163   // Returns true iff PPAPI "dev channel" methods are supported.
164   virtual bool PpapiDevChannelSupported(BrowserContext* browser_context,
165                                         const GURL& document_url) = 0;
166 };
167 
168 }  // namespace content
169 
170 #endif  // CONTENT_PUBLIC_BROWSER_PLUGIN_SERVICE_H_
171