dom/plugins/base/nsPluginHost.h

changeset 0
6474c204b198
     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_

mercurial