tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

nsWebBrowserPersist.h (7615B)


      1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 *
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef nsWebBrowserPersist_h__
      8 #define nsWebBrowserPersist_h__
      9 
     10 #include "mozilla/MozPromise.h"
     11 #include "mozilla/Mutex.h"
     12 #include "mozilla/UniquePtr.h"
     13 #include "nsCOMPtr.h"
     14 #include "nsClassHashtable.h"
     15 #include "nsHashKeys.h"
     16 #include "nsIChannel.h"
     17 #include "nsIFile.h"
     18 #include "nsIInputStream.h"
     19 #include "nsIInterfaceRequestor.h"
     20 #include "nsIMIMEService.h"
     21 #include "nsIOutputStream.h"
     22 #include "nsIProgressEventSink.h"
     23 #include "nsIStreamListener.h"
     24 #include "nsIThreadRetargetableStreamListener.h"
     25 #include "nsIWebBrowserPersist.h"
     26 #include "nsIWebBrowserPersistDocument.h"
     27 #include "nsIWebProgressListener2.h"
     28 #include "nsTArray.h"
     29 #include "nsWeakReference.h"
     30 
     31 class nsIStorageStream;
     32 class nsIWebBrowserPersistDocument;
     33 
     34 using ClosePromise = mozilla::MozPromise<nsresult, nsresult, true>;
     35 
     36 class nsWebBrowserPersist final : public nsIInterfaceRequestor,
     37                                  public nsIWebBrowserPersist,
     38                                  public nsIThreadRetargetableStreamListener,
     39                                  public nsIProgressEventSink,
     40                                  public nsSupportsWeakReference {
     41  friend class nsEncoderNodeFixup;
     42 
     43  // Public members
     44 public:
     45  nsWebBrowserPersist();
     46 
     47  NS_DECL_THREADSAFE_ISUPPORTS
     48  NS_DECL_NSIINTERFACEREQUESTOR
     49  NS_DECL_NSICANCELABLE
     50  NS_DECL_NSIWEBBROWSERPERSIST
     51  NS_DECL_NSIREQUESTOBSERVER
     52  NS_DECL_NSISTREAMLISTENER
     53  NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER
     54  NS_DECL_NSIPROGRESSEVENTSINK
     55 
     56  // Private members
     57 private:
     58  virtual ~nsWebBrowserPersist();
     59  nsresult SaveURIInternal(nsIURI* aURI, nsIPrincipal* aTriggeringPrincipal,
     60                           nsContentPolicyType aContentPolicyType,
     61                           uint32_t aCacheKey, nsIReferrerInfo* aReferrerInfo,
     62                           nsICookieJarSettings* aCookieJarSettings,
     63                           nsIInputStream* aPostData, const char* aExtraHeaders,
     64                           nsIURI* aFile, bool aCalcFileExt, bool aIsPrivate);
     65  nsresult SaveChannelInternal(nsIChannel* aChannel, nsIURI* aFile,
     66                               bool aCalcFileExt);
     67  nsresult SaveDocumentInternal(nsIWebBrowserPersistDocument* aDocument,
     68                                nsIURI* aFile, nsIURI* aDataPath);
     69  nsresult SaveDocuments();
     70  void FinishSaveDocumentInternal(nsIURI* aFile, nsIFile* aDataPath);
     71  nsresult GetExtensionForContentType(const char16_t* aContentType,
     72                                      char16_t** aExt);
     73 
     74  struct CleanupData;
     75  struct DocData;
     76  struct OutputData;
     77  struct UploadData;
     78  struct URIData;
     79  struct WalkData;
     80 
     81  class OnWalk;
     82  class OnRemoteWalk;
     83  class OnWrite;
     84  class FlatURIMap;
     85  friend class OnWalk;
     86  friend class OnWrite;
     87 
     88  nsresult SaveDocumentDeferred(mozilla::UniquePtr<WalkData>&& aData);
     89  void Cleanup();
     90  void CleanupLocalFiles();
     91  nsresult GetValidURIFromObject(nsISupports* aObject, nsIURI** aURI) const;
     92  static nsresult GetLocalFileFromURI(nsIURI* aURI, nsIFile** aLocalFile);
     93  static nsresult AppendPathToURI(nsIURI* aURI, const nsAString& aPath,
     94                                  nsCOMPtr<nsIURI>& aOutURI);
     95  nsresult MakeAndStoreLocalFilenameInURIMap(
     96      nsIURI* aURI, nsIWebBrowserPersistDocument* aDoc,
     97      nsContentPolicyType aContentPolicyType, bool aNeedsPersisting,
     98      URIData** aData);
     99  nsresult MakeOutputStream(nsIURI* aFile, nsIOutputStream** aOutputStream);
    100  nsresult MakeOutputStreamFromFile(nsIFile* aFile,
    101                                    nsIOutputStream** aOutputStream);
    102  nsresult MakeOutputStreamFromURI(nsIURI* aURI, nsIOutputStream** aOutStream);
    103  nsresult CreateChannelFromURI(nsIURI* aURI, nsIChannel** aChannel);
    104  nsresult StartUpload(nsIStorageStream* aOutStream, nsIURI* aDestinationURI,
    105                       const nsACString& aContentType);
    106  nsresult StartUpload(nsIInputStream* aInputStream, nsIURI* aDestinationURI,
    107                       const nsACString& aContentType);
    108  nsresult CalculateAndAppendFileExt(nsIURI* aURI, nsIChannel* aChannel,
    109                                     nsIURI* aOriginalURIWithExtension,
    110                                     nsCOMPtr<nsIURI>& aOutURI);
    111  nsresult CalculateUniqueFilename(nsIURI* aURI, nsCOMPtr<nsIURI>& aOutURI);
    112  nsresult MakeFilenameFromURI(nsIURI* aURI, nsString& aFilename);
    113  nsresult StoreURI(const nsACString& aURI, nsIWebBrowserPersistDocument* aDoc,
    114                    nsContentPolicyType aContentPolicyType,
    115                    bool aNeedsPersisting = true, URIData** aData = nullptr);
    116  nsresult StoreURI(nsIURI* aURI, nsIWebBrowserPersistDocument* aDoc,
    117                    nsContentPolicyType aContentPolicyType,
    118                    bool aNeedsPersisting = true, URIData** aData = nullptr);
    119  bool DocumentEncoderExists(const char* aContentType);
    120 
    121  nsresult SaveSubframeContent(nsIWebBrowserPersistDocument* aFrameContent,
    122                               nsIWebBrowserPersistDocument* aParentDocument,
    123                               const nsCString& aURISpec, URIData* aData);
    124  nsresult SendErrorStatusChange(bool aIsReadError, nsresult aResult,
    125                                 nsIRequest* aRequest, nsIURI* aURI);
    126 
    127  nsresult FixRedirectedChannelEntry(nsIChannel* aNewChannel);
    128 
    129  void FinishDownload();
    130  void EndDownload(nsresult aResult);
    131  void EndDownloadInternal(nsresult aResult);
    132  void SerializeNextFile();
    133  void CalcTotalProgress();
    134 
    135  void SetApplyConversionIfNeeded(nsIChannel* aChannel);
    136 
    137  nsCOMPtr<nsIURI> mCurrentDataPath;
    138  bool mCurrentDataPathIsRelative;
    139  nsCString mCurrentRelativePathToData;
    140  nsCOMPtr<nsIURI> mCurrentBaseURI;
    141  nsCString mCurrentCharset;
    142  nsCOMPtr<nsIURI> mTargetBaseURI;
    143  uint32_t mCurrentThingsToPersist;
    144 
    145  nsCOMPtr<nsIMIMEService> mMIMEService;
    146  nsCOMPtr<nsIURI> mURI;
    147  nsCOMPtr<nsIWebProgressListener> mProgressListener;
    148  /**
    149   * Progress listener for 64-bit values; this is the same object as
    150   * mProgressListener, but is a member to avoid having to qi it for each
    151   * progress notification.
    152   */
    153  nsCOMPtr<nsIWebProgressListener2> mProgressListener2;
    154  nsCOMPtr<nsIProgressEventSink> mEventSink;
    155  mozilla::Mutex mOutputMapMutex MOZ_UNANNOTATED;
    156  nsClassHashtable<nsISupportsHashKey, OutputData> mOutputMap;
    157  nsClassHashtable<nsISupportsHashKey, UploadData> mUploadList;
    158  nsCOMPtr<nsISerialEventTarget> mBackgroundQueue;
    159  nsTArray<RefPtr<ClosePromise>> mFileClosePromises;
    160  nsClassHashtable<nsCStringHashKey, URIData> mURIMap;
    161  nsCOMPtr<nsIWebBrowserPersistURIMap> mFlatURIMap;
    162  nsTArray<mozilla::UniquePtr<WalkData>> mWalkStack;
    163  nsTArray<DocData*> mDocList;
    164  nsTArray<CleanupData*> mCleanupList;
    165  nsTArray<nsCString> mFilenameList;
    166  bool mFirstAndOnlyUse;
    167  bool mSavingDocument;
    168  // mCancel is used from both the main thread, and (inside OnDataAvailable)
    169  // from a background thread.
    170  mozilla::Atomic<bool> mCancel;
    171  bool mEndCalled;
    172  bool mCompleted;
    173  bool mStartSaving;
    174  bool mReplaceExisting;
    175  bool mSerializingOutput;
    176  bool mIsPrivate;
    177  // mPersistFlags can be modified on the main thread, and can be read from
    178  // a background thread when OnDataAvailable calls MakeOutputStreamFromFile.
    179  mozilla::Atomic<uint32_t> mPersistFlags;
    180  nsresult mPersistResult;
    181  int64_t mTotalCurrentProgress;
    182  int64_t mTotalMaxProgress;
    183  int16_t mWrapColumn;
    184  uint32_t mEncodingFlags;
    185  nsString mContentType;
    186 };
    187 
    188 #endif