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