dom/plugins/base/nsPluginHost.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef nsPluginHost_h_
     7 #define nsPluginHost_h_
     9 #include "nsIPluginHost.h"
    10 #include "nsIObserver.h"
    11 #include "nsCOMPtr.h"
    12 #include "prlink.h"
    13 #include "prclist.h"
    14 #include "npapi.h"
    15 #include "nsIPluginTag.h"
    16 #include "nsPluginsDir.h"
    17 #include "nsPluginDirServiceProvider.h"
    18 #include "nsAutoPtr.h"
    19 #include "nsWeakPtr.h"
    20 #include "nsIPrompt.h"
    21 #include "nsWeakReference.h"
    22 #include "MainThreadUtils.h"
    23 #include "nsTArray.h"
    24 #include "nsTObserverArray.h"
    25 #include "nsITimer.h"
    26 #include "nsPluginTags.h"
    27 #include "nsPluginPlayPreviewInfo.h"
    28 #include "nsIEffectiveTLDService.h"
    29 #include "nsIIDNService.h"
    30 #include "nsCRT.h"
    32 class nsNPAPIPlugin;
    33 class nsIComponentManager;
    34 class nsIFile;
    35 class nsIChannel;
    36 class nsPluginNativeWindow;
    37 class nsObjectLoadingContent;
    38 class nsPluginInstanceOwner;
    39 class nsNPAPIPluginInstance;
    40 class nsNPAPIPluginStreamListener;
    41 class nsIPluginInstanceOwner;
    42 class nsIInputStream;
    43 class nsIStreamListener;
    45 class nsInvalidPluginTag : public nsISupports
    46 {
    47 public:
    48   nsInvalidPluginTag(const char* aFullPath, int64_t aLastModifiedTime = 0);
    49   virtual ~nsInvalidPluginTag();
    51   NS_DECL_ISUPPORTS
    53   nsCString   mFullPath;
    54   int64_t     mLastModifiedTime;
    55   bool        mSeen;
    57   nsRefPtr<nsInvalidPluginTag> mPrev;
    58   nsRefPtr<nsInvalidPluginTag> mNext;
    59 };
    61 class nsPluginHost : public nsIPluginHost,
    62                      public nsIObserver,
    63                      public nsITimerCallback,
    64                      public nsSupportsWeakReference
    65 {
    66 public:
    67   nsPluginHost();
    68   virtual ~nsPluginHost();
    70   static already_AddRefed<nsPluginHost> GetInst();
    72   NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
    74   NS_DECL_ISUPPORTS
    75   NS_DECL_NSIPLUGINHOST
    76   NS_DECL_NSIOBSERVER
    77   NS_DECL_NSITIMERCALLBACK
    79   nsresult Init();
    80   nsresult LoadPlugins();
    81   nsresult UnloadPlugins();
    83   nsresult SetUpPluginInstance(const char *aMimeType,
    84                                nsIURI *aURL,
    85                                nsPluginInstanceOwner *aOwner);
    86   bool PluginExistsForType(const char* aMimeType);
    88   nsresult IsPluginEnabledForExtension(const char* aExtension, const char* &aMimeType);
    90   void GetPlugins(nsTArray<nsRefPtr<nsPluginTag> >& aPluginArray);
    92   nsresult GetURL(nsISupports* pluginInst,
    93                   const char* url,
    94                   const char* target,
    95                   nsNPAPIPluginStreamListener* streamListener,
    96                   const char* altHost,
    97                   const char* referrer,
    98                   bool forceJSEnabled);
    99   nsresult PostURL(nsISupports* pluginInst,
   100                    const char* url,
   101                    uint32_t postDataLen,
   102                    const char* postData,
   103                    bool isFile,
   104                    const char* target,
   105                    nsNPAPIPluginStreamListener* streamListener,
   106                    const char* altHost,
   107                    const char* referrer,
   108                    bool forceJSEnabled,
   109                    uint32_t postHeadersLength,
   110                    const char* postHeaders);
   112   nsresult FindProxyForURL(const char* url, char* *result);
   113   nsresult UserAgent(const char **retstring);
   114   nsresult ParsePostBufferToFixHeaders(const char *inPostData, uint32_t inPostDataLen,
   115                                        char **outPostData, uint32_t *outPostDataLen);
   116   nsresult CreateTempFileToPost(const char *aPostDataURL, nsIFile **aTmpFile);
   117   nsresult NewPluginNativeWindow(nsPluginNativeWindow ** aPluginNativeWindow);
   119   void AddIdleTimeTarget(nsIPluginInstanceOwner* objectFrame, bool isVisible);
   120   void RemoveIdleTimeTarget(nsIPluginInstanceOwner* objectFrame);
   122   nsresult GetPluginName(nsNPAPIPluginInstance *aPluginInstance, const char** aPluginName);
   123   nsresult StopPluginInstance(nsNPAPIPluginInstance* aInstance);
   124   nsresult GetPluginTagForInstance(nsNPAPIPluginInstance *aPluginInstance, nsIPluginTag **aPluginTag);
   126   nsresult
   127   NewPluginURLStream(const nsString& aURL, 
   128                      nsNPAPIPluginInstance *aInstance, 
   129                      nsNPAPIPluginStreamListener *aListener,
   130                      nsIInputStream *aPostStream = nullptr,
   131                      const char *aHeadersData = nullptr, 
   132                      uint32_t aHeadersDataLen = 0);
   134   nsresult
   135   GetURLWithHeaders(nsNPAPIPluginInstance *pluginInst, 
   136                     const char* url, 
   137                     const char* target = nullptr,
   138                     nsNPAPIPluginStreamListener* streamListener = nullptr,
   139                     const char* altHost = nullptr,
   140                     const char* referrer = nullptr,
   141                     bool forceJSEnabled = false,
   142                     uint32_t getHeadersLength = 0, 
   143                     const char* getHeaders = nullptr);
   145   nsresult
   146   DoURLLoadSecurityCheck(nsNPAPIPluginInstance *aInstance,
   147                          const char* aURL);
   149   nsresult
   150   AddHeadersToChannel(const char *aHeadersData, uint32_t aHeadersDataLen, 
   151                       nsIChannel *aGenericChannel);
   153   static nsresult GetPluginTempDir(nsIFile **aDir);
   155   // Writes updated plugins settings to disk and unloads the plugin
   156   // if it is now disabled
   157   nsresult UpdatePluginInfo(nsPluginTag* aPluginTag);
   159   // Helper that checks if a type is whitelisted in plugin.allowed_types.
   160   // Always returns true if plugin.allowed_types is not set
   161   static bool IsTypeWhitelisted(const char *aType);
   163   // checks whether aTag is a "java" plugin tag (a tag for a plugin
   164   // that does Java)
   165   static bool IsJavaMIMEType(const char *aType);
   167   static nsresult PostPluginUnloadEvent(PRLibrary* aLibrary);
   169   void PluginCrashed(nsNPAPIPlugin* plugin,
   170                      const nsAString& pluginDumpID,
   171                      const nsAString& browserDumpID);
   173   nsNPAPIPluginInstance *FindInstance(const char *mimetype);
   174   nsNPAPIPluginInstance *FindOldestStoppedInstance();
   175   uint32_t StoppedInstanceCount();
   177   nsTArray< nsRefPtr<nsNPAPIPluginInstance> > *InstanceArray();
   179   void DestroyRunningInstances(nsPluginTag* aPluginTag);
   181   // Return the tag for |aLibrary| if found, nullptr if not.
   182   nsPluginTag* FindTagForLibrary(PRLibrary* aLibrary);
   184   // The last argument should be false if we already have an in-flight stream
   185   // and don't need to set up a new stream.
   186   nsresult InstantiatePluginInstance(const char *aMimeType, nsIURI* aURL,
   187                                      nsObjectLoadingContent *aContent,
   188                                      nsPluginInstanceOwner** aOwner);
   190   // Does not accept nullptr and should never fail.
   191   nsPluginTag* TagForPlugin(nsNPAPIPlugin* aPlugin);
   193   nsresult GetPlugin(const char *aMimeType, nsNPAPIPlugin** aPlugin);
   195   nsresult NewPluginStreamListener(nsIURI* aURL,
   196                                    nsNPAPIPluginInstance* aInstance,
   197                                    nsIStreamListener **aStreamListener);
   199 private:
   200   nsresult
   201   TrySetUpPluginInstance(const char *aMimeType, nsIURI *aURL, nsPluginInstanceOwner *aOwner);
   203   nsPluginTag*
   204   FindPreferredPlugin(const InfallibleTArray<nsPluginTag*>& matches);
   206   // Return an nsPluginTag for this type, if any.  If aCheckEnabled is
   207   // true, only enabled plugins will be returned.
   208   nsPluginTag*
   209   FindPluginForType(const char* aMimeType, bool aCheckEnabled);
   211   nsPluginTag*
   212   FindPluginEnabledForExtension(const char* aExtension, const char* &aMimeType);
   214   nsresult
   215   FindStoppedPluginForURL(nsIURI* aURL, nsIPluginInstanceOwner *aOwner);
   217   nsresult
   218   FindPlugins(bool aCreatePluginList, bool * aPluginsChanged);
   220   // Registers or unregisters the given mime type with the category manager
   221   // (performs no checks - see UpdateCategoryManager)
   222   enum nsRegisterType { ePluginRegister, ePluginUnregister };
   223   void RegisterWithCategoryManager(nsCString &aMimeType, nsRegisterType aType);
   225   nsresult
   226   ScanPluginsDirectory(nsIFile *pluginsDir,
   227                        bool aCreatePluginList,
   228                        bool *aPluginsChanged);
   230   nsresult
   231   ScanPluginsDirectoryList(nsISimpleEnumerator *dirEnum,
   232                            bool aCreatePluginList,
   233                            bool *aPluginsChanged);
   235   nsresult EnsurePluginLoaded(nsPluginTag* aPluginTag);
   237   bool IsRunningPlugin(nsPluginTag * aPluginTag);
   239   // Stores all plugins info into the registry
   240   nsresult WritePluginInfo();
   242   // Loads all cached plugins info into mCachedPlugins
   243   nsresult ReadPluginInfo();
   245   PRBool GhettoBlacklist(nsIFile *pluginFile);
   247   // Given a file path, returns the plugins info from our cache
   248   // and removes it from the cache.
   249   void RemoveCachedPluginsInfo(const char *filePath,
   250                                nsPluginTag **result);
   252   // Checks to see if a tag object is in our list of live tags.
   253   bool IsLiveTag(nsIPluginTag* tag);
   255   // Checks our list of live tags for an equivalent tag.
   256   nsPluginTag* HaveSamePlugin(const nsPluginTag * aPluginTag);
   258   // Returns the first plugin at |path|
   259   nsPluginTag* FirstPluginWithPath(const nsCString& path);
   261   nsresult EnsurePrivateDirServiceProvider();
   263   void OnPluginInstanceDestroyed(nsPluginTag* aPluginTag);
   265   nsRefPtr<nsPluginTag> mPlugins;
   266   nsRefPtr<nsPluginTag> mCachedPlugins;
   267   nsRefPtr<nsInvalidPluginTag> mInvalidPlugins;
   268   nsTArray< nsRefPtr<nsPluginPlayPreviewInfo> > mPlayPreviewMimeTypes;
   269   bool mPluginsLoaded;
   271   // set by pref plugin.override_internal_types
   272   bool mOverrideInternalTypes;
   274   // set by pref plugin.disable
   275   bool mPluginsDisabled;
   276   // set by pref plugins.click_to_play
   277   bool mPluginsClickToPlay;
   279   // Any instances in this array will have valid plugin objects via GetPlugin().
   280   // When removing an instance it might not die - be sure to null out it's plugin.
   281   nsTArray< nsRefPtr<nsNPAPIPluginInstance> > mInstances;
   283   nsCOMPtr<nsIFile> mPluginRegFile;
   284 #ifdef XP_WIN
   285   nsRefPtr<nsPluginDirServiceProvider> mPrivateDirServiceProvider;
   286 #endif
   288   nsCOMPtr<nsIEffectiveTLDService> mTLDService;
   289   nsCOMPtr<nsIIDNService> mIDNService;
   291   // Helpers for ClearSiteData and SiteHasData.
   292   nsresult NormalizeHostname(nsCString& host);
   293   nsresult EnumerateSiteData(const nsACString& domain,
   294                              const InfallibleTArray<nsCString>& sites,
   295                              InfallibleTArray<nsCString>& result,
   296                              bool firstMatchOnly);
   298   nsWeakPtr mCurrentDocument; // weak reference, we use it to id document only
   300   static nsIFile *sPluginTempDir;
   302   // We need to hold a global ptr to ourselves because we register for
   303   // two different CIDs for some reason...
   304   static nsPluginHost* sInst;
   305 };
   307 class MOZ_STACK_CLASS PluginDestructionGuard : protected PRCList
   308 {
   309 public:
   310   PluginDestructionGuard(nsNPAPIPluginInstance *aInstance);
   312   PluginDestructionGuard(NPP npp);
   314   ~PluginDestructionGuard();
   316   static bool DelayDestroy(nsNPAPIPluginInstance *aInstance);
   318 protected:
   319   void Init()
   320   {
   321     NS_ASSERTION(NS_IsMainThread(), "Should be on the main thread");
   323     mDelayedDestroy = false;
   325     PR_INIT_CLIST(this);
   326     PR_INSERT_BEFORE(this, &sListHead);
   327   }
   329   nsRefPtr<nsNPAPIPluginInstance> mInstance;
   330   bool mDelayedDestroy;
   332   static PRCList sListHead;
   333 };
   335 #endif // nsPluginHost_h_

mercurial