1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/plugins/base/nsPluginHost.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,335 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef nsPluginHost_h_ 1.10 +#define nsPluginHost_h_ 1.11 + 1.12 +#include "nsIPluginHost.h" 1.13 +#include "nsIObserver.h" 1.14 +#include "nsCOMPtr.h" 1.15 +#include "prlink.h" 1.16 +#include "prclist.h" 1.17 +#include "npapi.h" 1.18 +#include "nsIPluginTag.h" 1.19 +#include "nsPluginsDir.h" 1.20 +#include "nsPluginDirServiceProvider.h" 1.21 +#include "nsAutoPtr.h" 1.22 +#include "nsWeakPtr.h" 1.23 +#include "nsIPrompt.h" 1.24 +#include "nsWeakReference.h" 1.25 +#include "MainThreadUtils.h" 1.26 +#include "nsTArray.h" 1.27 +#include "nsTObserverArray.h" 1.28 +#include "nsITimer.h" 1.29 +#include "nsPluginTags.h" 1.30 +#include "nsPluginPlayPreviewInfo.h" 1.31 +#include "nsIEffectiveTLDService.h" 1.32 +#include "nsIIDNService.h" 1.33 +#include "nsCRT.h" 1.34 + 1.35 +class nsNPAPIPlugin; 1.36 +class nsIComponentManager; 1.37 +class nsIFile; 1.38 +class nsIChannel; 1.39 +class nsPluginNativeWindow; 1.40 +class nsObjectLoadingContent; 1.41 +class nsPluginInstanceOwner; 1.42 +class nsNPAPIPluginInstance; 1.43 +class nsNPAPIPluginStreamListener; 1.44 +class nsIPluginInstanceOwner; 1.45 +class nsIInputStream; 1.46 +class nsIStreamListener; 1.47 + 1.48 +class nsInvalidPluginTag : public nsISupports 1.49 +{ 1.50 +public: 1.51 + nsInvalidPluginTag(const char* aFullPath, int64_t aLastModifiedTime = 0); 1.52 + virtual ~nsInvalidPluginTag(); 1.53 + 1.54 + NS_DECL_ISUPPORTS 1.55 + 1.56 + nsCString mFullPath; 1.57 + int64_t mLastModifiedTime; 1.58 + bool mSeen; 1.59 + 1.60 + nsRefPtr<nsInvalidPluginTag> mPrev; 1.61 + nsRefPtr<nsInvalidPluginTag> mNext; 1.62 +}; 1.63 + 1.64 +class nsPluginHost : public nsIPluginHost, 1.65 + public nsIObserver, 1.66 + public nsITimerCallback, 1.67 + public nsSupportsWeakReference 1.68 +{ 1.69 +public: 1.70 + nsPluginHost(); 1.71 + virtual ~nsPluginHost(); 1.72 + 1.73 + static already_AddRefed<nsPluginHost> GetInst(); 1.74 + 1.75 + NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW 1.76 + 1.77 + NS_DECL_ISUPPORTS 1.78 + NS_DECL_NSIPLUGINHOST 1.79 + NS_DECL_NSIOBSERVER 1.80 + NS_DECL_NSITIMERCALLBACK 1.81 + 1.82 + nsresult Init(); 1.83 + nsresult LoadPlugins(); 1.84 + nsresult UnloadPlugins(); 1.85 + 1.86 + nsresult SetUpPluginInstance(const char *aMimeType, 1.87 + nsIURI *aURL, 1.88 + nsPluginInstanceOwner *aOwner); 1.89 + bool PluginExistsForType(const char* aMimeType); 1.90 + 1.91 + nsresult IsPluginEnabledForExtension(const char* aExtension, const char* &aMimeType); 1.92 + 1.93 + void GetPlugins(nsTArray<nsRefPtr<nsPluginTag> >& aPluginArray); 1.94 + 1.95 + nsresult GetURL(nsISupports* pluginInst, 1.96 + const char* url, 1.97 + const char* target, 1.98 + nsNPAPIPluginStreamListener* streamListener, 1.99 + const char* altHost, 1.100 + const char* referrer, 1.101 + bool forceJSEnabled); 1.102 + nsresult PostURL(nsISupports* pluginInst, 1.103 + const char* url, 1.104 + uint32_t postDataLen, 1.105 + const char* postData, 1.106 + bool isFile, 1.107 + const char* target, 1.108 + nsNPAPIPluginStreamListener* streamListener, 1.109 + const char* altHost, 1.110 + const char* referrer, 1.111 + bool forceJSEnabled, 1.112 + uint32_t postHeadersLength, 1.113 + const char* postHeaders); 1.114 + 1.115 + nsresult FindProxyForURL(const char* url, char* *result); 1.116 + nsresult UserAgent(const char **retstring); 1.117 + nsresult ParsePostBufferToFixHeaders(const char *inPostData, uint32_t inPostDataLen, 1.118 + char **outPostData, uint32_t *outPostDataLen); 1.119 + nsresult CreateTempFileToPost(const char *aPostDataURL, nsIFile **aTmpFile); 1.120 + nsresult NewPluginNativeWindow(nsPluginNativeWindow ** aPluginNativeWindow); 1.121 + 1.122 + void AddIdleTimeTarget(nsIPluginInstanceOwner* objectFrame, bool isVisible); 1.123 + void RemoveIdleTimeTarget(nsIPluginInstanceOwner* objectFrame); 1.124 + 1.125 + nsresult GetPluginName(nsNPAPIPluginInstance *aPluginInstance, const char** aPluginName); 1.126 + nsresult StopPluginInstance(nsNPAPIPluginInstance* aInstance); 1.127 + nsresult GetPluginTagForInstance(nsNPAPIPluginInstance *aPluginInstance, nsIPluginTag **aPluginTag); 1.128 + 1.129 + nsresult 1.130 + NewPluginURLStream(const nsString& aURL, 1.131 + nsNPAPIPluginInstance *aInstance, 1.132 + nsNPAPIPluginStreamListener *aListener, 1.133 + nsIInputStream *aPostStream = nullptr, 1.134 + const char *aHeadersData = nullptr, 1.135 + uint32_t aHeadersDataLen = 0); 1.136 + 1.137 + nsresult 1.138 + GetURLWithHeaders(nsNPAPIPluginInstance *pluginInst, 1.139 + const char* url, 1.140 + const char* target = nullptr, 1.141 + nsNPAPIPluginStreamListener* streamListener = nullptr, 1.142 + const char* altHost = nullptr, 1.143 + const char* referrer = nullptr, 1.144 + bool forceJSEnabled = false, 1.145 + uint32_t getHeadersLength = 0, 1.146 + const char* getHeaders = nullptr); 1.147 + 1.148 + nsresult 1.149 + DoURLLoadSecurityCheck(nsNPAPIPluginInstance *aInstance, 1.150 + const char* aURL); 1.151 + 1.152 + nsresult 1.153 + AddHeadersToChannel(const char *aHeadersData, uint32_t aHeadersDataLen, 1.154 + nsIChannel *aGenericChannel); 1.155 + 1.156 + static nsresult GetPluginTempDir(nsIFile **aDir); 1.157 + 1.158 + // Writes updated plugins settings to disk and unloads the plugin 1.159 + // if it is now disabled 1.160 + nsresult UpdatePluginInfo(nsPluginTag* aPluginTag); 1.161 + 1.162 + // Helper that checks if a type is whitelisted in plugin.allowed_types. 1.163 + // Always returns true if plugin.allowed_types is not set 1.164 + static bool IsTypeWhitelisted(const char *aType); 1.165 + 1.166 + // checks whether aTag is a "java" plugin tag (a tag for a plugin 1.167 + // that does Java) 1.168 + static bool IsJavaMIMEType(const char *aType); 1.169 + 1.170 + static nsresult PostPluginUnloadEvent(PRLibrary* aLibrary); 1.171 + 1.172 + void PluginCrashed(nsNPAPIPlugin* plugin, 1.173 + const nsAString& pluginDumpID, 1.174 + const nsAString& browserDumpID); 1.175 + 1.176 + nsNPAPIPluginInstance *FindInstance(const char *mimetype); 1.177 + nsNPAPIPluginInstance *FindOldestStoppedInstance(); 1.178 + uint32_t StoppedInstanceCount(); 1.179 + 1.180 + nsTArray< nsRefPtr<nsNPAPIPluginInstance> > *InstanceArray(); 1.181 + 1.182 + void DestroyRunningInstances(nsPluginTag* aPluginTag); 1.183 + 1.184 + // Return the tag for |aLibrary| if found, nullptr if not. 1.185 + nsPluginTag* FindTagForLibrary(PRLibrary* aLibrary); 1.186 + 1.187 + // The last argument should be false if we already have an in-flight stream 1.188 + // and don't need to set up a new stream. 1.189 + nsresult InstantiatePluginInstance(const char *aMimeType, nsIURI* aURL, 1.190 + nsObjectLoadingContent *aContent, 1.191 + nsPluginInstanceOwner** aOwner); 1.192 + 1.193 + // Does not accept nullptr and should never fail. 1.194 + nsPluginTag* TagForPlugin(nsNPAPIPlugin* aPlugin); 1.195 + 1.196 + nsresult GetPlugin(const char *aMimeType, nsNPAPIPlugin** aPlugin); 1.197 + 1.198 + nsresult NewPluginStreamListener(nsIURI* aURL, 1.199 + nsNPAPIPluginInstance* aInstance, 1.200 + nsIStreamListener **aStreamListener); 1.201 + 1.202 +private: 1.203 + nsresult 1.204 + TrySetUpPluginInstance(const char *aMimeType, nsIURI *aURL, nsPluginInstanceOwner *aOwner); 1.205 + 1.206 + nsPluginTag* 1.207 + FindPreferredPlugin(const InfallibleTArray<nsPluginTag*>& matches); 1.208 + 1.209 + // Return an nsPluginTag for this type, if any. If aCheckEnabled is 1.210 + // true, only enabled plugins will be returned. 1.211 + nsPluginTag* 1.212 + FindPluginForType(const char* aMimeType, bool aCheckEnabled); 1.213 + 1.214 + nsPluginTag* 1.215 + FindPluginEnabledForExtension(const char* aExtension, const char* &aMimeType); 1.216 + 1.217 + nsresult 1.218 + FindStoppedPluginForURL(nsIURI* aURL, nsIPluginInstanceOwner *aOwner); 1.219 + 1.220 + nsresult 1.221 + FindPlugins(bool aCreatePluginList, bool * aPluginsChanged); 1.222 + 1.223 + // Registers or unregisters the given mime type with the category manager 1.224 + // (performs no checks - see UpdateCategoryManager) 1.225 + enum nsRegisterType { ePluginRegister, ePluginUnregister }; 1.226 + void RegisterWithCategoryManager(nsCString &aMimeType, nsRegisterType aType); 1.227 + 1.228 + nsresult 1.229 + ScanPluginsDirectory(nsIFile *pluginsDir, 1.230 + bool aCreatePluginList, 1.231 + bool *aPluginsChanged); 1.232 + 1.233 + nsresult 1.234 + ScanPluginsDirectoryList(nsISimpleEnumerator *dirEnum, 1.235 + bool aCreatePluginList, 1.236 + bool *aPluginsChanged); 1.237 + 1.238 + nsresult EnsurePluginLoaded(nsPluginTag* aPluginTag); 1.239 + 1.240 + bool IsRunningPlugin(nsPluginTag * aPluginTag); 1.241 + 1.242 + // Stores all plugins info into the registry 1.243 + nsresult WritePluginInfo(); 1.244 + 1.245 + // Loads all cached plugins info into mCachedPlugins 1.246 + nsresult ReadPluginInfo(); 1.247 + 1.248 + PRBool GhettoBlacklist(nsIFile *pluginFile); 1.249 + 1.250 + // Given a file path, returns the plugins info from our cache 1.251 + // and removes it from the cache. 1.252 + void RemoveCachedPluginsInfo(const char *filePath, 1.253 + nsPluginTag **result); 1.254 + 1.255 + // Checks to see if a tag object is in our list of live tags. 1.256 + bool IsLiveTag(nsIPluginTag* tag); 1.257 + 1.258 + // Checks our list of live tags for an equivalent tag. 1.259 + nsPluginTag* HaveSamePlugin(const nsPluginTag * aPluginTag); 1.260 + 1.261 + // Returns the first plugin at |path| 1.262 + nsPluginTag* FirstPluginWithPath(const nsCString& path); 1.263 + 1.264 + nsresult EnsurePrivateDirServiceProvider(); 1.265 + 1.266 + void OnPluginInstanceDestroyed(nsPluginTag* aPluginTag); 1.267 + 1.268 + nsRefPtr<nsPluginTag> mPlugins; 1.269 + nsRefPtr<nsPluginTag> mCachedPlugins; 1.270 + nsRefPtr<nsInvalidPluginTag> mInvalidPlugins; 1.271 + nsTArray< nsRefPtr<nsPluginPlayPreviewInfo> > mPlayPreviewMimeTypes; 1.272 + bool mPluginsLoaded; 1.273 + 1.274 + // set by pref plugin.override_internal_types 1.275 + bool mOverrideInternalTypes; 1.276 + 1.277 + // set by pref plugin.disable 1.278 + bool mPluginsDisabled; 1.279 + // set by pref plugins.click_to_play 1.280 + bool mPluginsClickToPlay; 1.281 + 1.282 + // Any instances in this array will have valid plugin objects via GetPlugin(). 1.283 + // When removing an instance it might not die - be sure to null out it's plugin. 1.284 + nsTArray< nsRefPtr<nsNPAPIPluginInstance> > mInstances; 1.285 + 1.286 + nsCOMPtr<nsIFile> mPluginRegFile; 1.287 +#ifdef XP_WIN 1.288 + nsRefPtr<nsPluginDirServiceProvider> mPrivateDirServiceProvider; 1.289 +#endif 1.290 + 1.291 + nsCOMPtr<nsIEffectiveTLDService> mTLDService; 1.292 + nsCOMPtr<nsIIDNService> mIDNService; 1.293 + 1.294 + // Helpers for ClearSiteData and SiteHasData. 1.295 + nsresult NormalizeHostname(nsCString& host); 1.296 + nsresult EnumerateSiteData(const nsACString& domain, 1.297 + const InfallibleTArray<nsCString>& sites, 1.298 + InfallibleTArray<nsCString>& result, 1.299 + bool firstMatchOnly); 1.300 + 1.301 + nsWeakPtr mCurrentDocument; // weak reference, we use it to id document only 1.302 + 1.303 + static nsIFile *sPluginTempDir; 1.304 + 1.305 + // We need to hold a global ptr to ourselves because we register for 1.306 + // two different CIDs for some reason... 1.307 + static nsPluginHost* sInst; 1.308 +}; 1.309 + 1.310 +class MOZ_STACK_CLASS PluginDestructionGuard : protected PRCList 1.311 +{ 1.312 +public: 1.313 + PluginDestructionGuard(nsNPAPIPluginInstance *aInstance); 1.314 + 1.315 + PluginDestructionGuard(NPP npp); 1.316 + 1.317 + ~PluginDestructionGuard(); 1.318 + 1.319 + static bool DelayDestroy(nsNPAPIPluginInstance *aInstance); 1.320 + 1.321 +protected: 1.322 + void Init() 1.323 + { 1.324 + NS_ASSERTION(NS_IsMainThread(), "Should be on the main thread"); 1.325 + 1.326 + mDelayedDestroy = false; 1.327 + 1.328 + PR_INIT_CLIST(this); 1.329 + PR_INSERT_BEFORE(this, &sListHead); 1.330 + } 1.331 + 1.332 + nsRefPtr<nsNPAPIPluginInstance> mInstance; 1.333 + bool mDelayedDestroy; 1.334 + 1.335 + static PRCList sListHead; 1.336 +}; 1.337 + 1.338 +#endif // nsPluginHost_h_