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