diff options
Diffstat (limited to 'dom/webbrowserpersist/nsWebBrowserPersist.h')
-rw-r--r-- | dom/webbrowserpersist/nsWebBrowserPersist.h | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/dom/webbrowserpersist/nsWebBrowserPersist.h b/dom/webbrowserpersist/nsWebBrowserPersist.h new file mode 100644 index 0000000000..a5b3a590a1 --- /dev/null +++ b/dom/webbrowserpersist/nsWebBrowserPersist.h @@ -0,0 +1,190 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsWebBrowserPersist_h__ +#define nsWebBrowserPersist_h__ + +#include "nsCOMPtr.h" +#include "nsWeakReference.h" + +#include "nsIInterfaceRequestor.h" +#include "nsIMIMEService.h" +#include "nsIStreamListener.h" +#include "nsIOutputStream.h" +#include "nsIInputStream.h" +#include "nsIChannel.h" +#include "nsIProgressEventSink.h" +#include "nsIFile.h" +#include "nsIThreadRetargetableStreamListener.h" +#include "nsIWebProgressListener2.h" +#include "nsIWebBrowserPersist.h" +#include "nsIWebBrowserPersistDocument.h" + +#include "mozilla/MozPromise.h" +#include "mozilla/Mutex.h" +#include "mozilla/UniquePtr.h" +#include "nsClassHashtable.h" +#include "nsHashKeys.h" +#include "nsTArray.h" + +class nsIStorageStream; +class nsIWebBrowserPersistDocument; + +using ClosePromise = mozilla::MozPromise<nsresult, nsresult, true>; + +class nsWebBrowserPersist final : public nsIInterfaceRequestor, + public nsIWebBrowserPersist, + public nsIThreadRetargetableStreamListener, + public nsIProgressEventSink, + public nsSupportsWeakReference { + friend class nsEncoderNodeFixup; + + // Public members + public: + nsWebBrowserPersist(); + + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_NSIINTERFACEREQUESTOR + NS_DECL_NSICANCELABLE + NS_DECL_NSIWEBBROWSERPERSIST + NS_DECL_NSIREQUESTOBSERVER + NS_DECL_NSISTREAMLISTENER + NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER + NS_DECL_NSIPROGRESSEVENTSINK + + // Private members + private: + virtual ~nsWebBrowserPersist(); + nsresult SaveURIInternal(nsIURI* aURI, nsIPrincipal* aTriggeringPrincipal, + nsContentPolicyType aContentPolicyType, + uint32_t aCacheKey, nsIReferrerInfo* aReferrerInfo, + nsICookieJarSettings* aCookieJarSettings, + nsIInputStream* aPostData, const char* aExtraHeaders, + nsIURI* aFile, bool aCalcFileExt, bool aIsPrivate); + nsresult SaveChannelInternal(nsIChannel* aChannel, nsIURI* aFile, + bool aCalcFileExt); + nsresult SaveDocumentInternal(nsIWebBrowserPersistDocument* aDocument, + nsIURI* aFile, nsIURI* aDataPath); + nsresult SaveDocuments(); + void FinishSaveDocumentInternal(nsIURI* aFile, nsIFile* aDataPath); + nsresult GetExtensionForContentType(const char16_t* aContentType, + char16_t** aExt); + + struct CleanupData; + struct DocData; + struct OutputData; + struct UploadData; + struct URIData; + struct WalkData; + + class OnWalk; + class OnRemoteWalk; + class OnWrite; + class FlatURIMap; + friend class OnWalk; + friend class OnWrite; + + nsresult SaveDocumentDeferred(mozilla::UniquePtr<WalkData>&& aData); + void Cleanup(); + void CleanupLocalFiles(); + nsresult GetValidURIFromObject(nsISupports* aObject, nsIURI** aURI) const; + static nsresult GetLocalFileFromURI(nsIURI* aURI, nsIFile** aLocalFile); + static nsresult AppendPathToURI(nsIURI* aURI, const nsAString& aPath, + nsCOMPtr<nsIURI>& aOutURI); + nsresult MakeAndStoreLocalFilenameInURIMap( + nsIURI* aURI, nsIWebBrowserPersistDocument* aDoc, + nsContentPolicyType aContentPolicyType, bool aNeedsPersisting, + URIData** aData); + nsresult MakeOutputStream(nsIURI* aFile, nsIOutputStream** aOutputStream); + nsresult MakeOutputStreamFromFile(nsIFile* aFile, + nsIOutputStream** aOutputStream); + nsresult MakeOutputStreamFromURI(nsIURI* aURI, nsIOutputStream** aOutStream); + nsresult CreateChannelFromURI(nsIURI* aURI, nsIChannel** aChannel); + nsresult StartUpload(nsIStorageStream* aOutStream, nsIURI* aDestinationURI, + const nsACString& aContentType); + nsresult StartUpload(nsIInputStream* aInputStream, nsIURI* aDestinationURI, + const nsACString& aContentType); + nsresult CalculateAndAppendFileExt(nsIURI* aURI, nsIChannel* aChannel, + nsIURI* aOriginalURIWithExtension, + nsCOMPtr<nsIURI>& aOutURI); + nsresult CalculateUniqueFilename(nsIURI* aURI, nsCOMPtr<nsIURI>& aOutURI); + nsresult MakeFilenameFromURI(nsIURI* aURI, nsString& aFilename); + nsresult StoreURI(const nsACString& aURI, nsIWebBrowserPersistDocument* aDoc, + nsContentPolicyType aContentPolicyType, + bool aNeedsPersisting = true, URIData** aData = nullptr); + nsresult StoreURI(nsIURI* aURI, nsIWebBrowserPersistDocument* aDoc, + nsContentPolicyType aContentPolicyType, + bool aNeedsPersisting = true, URIData** aData = nullptr); + bool DocumentEncoderExists(const char* aContentType); + + nsresult SaveSubframeContent(nsIWebBrowserPersistDocument* aFrameContent, + nsIWebBrowserPersistDocument* aParentDocument, + const nsCString& aURISpec, URIData* aData); + nsresult SendErrorStatusChange(bool aIsReadError, nsresult aResult, + nsIRequest* aRequest, nsIURI* aURI); + + nsresult FixRedirectedChannelEntry(nsIChannel* aNewChannel); + + void FinishDownload(); + void EndDownload(nsresult aResult); + void EndDownloadInternal(nsresult aResult); + void SerializeNextFile(); + void CalcTotalProgress(); + + void SetApplyConversionIfNeeded(nsIChannel* aChannel); + + nsCOMPtr<nsIURI> mCurrentDataPath; + bool mCurrentDataPathIsRelative; + nsCString mCurrentRelativePathToData; + nsCOMPtr<nsIURI> mCurrentBaseURI; + nsCString mCurrentCharset; + nsCOMPtr<nsIURI> mTargetBaseURI; + uint32_t mCurrentThingsToPersist; + + nsCOMPtr<nsIMIMEService> mMIMEService; + nsCOMPtr<nsIURI> mURI; + nsCOMPtr<nsIWebProgressListener> mProgressListener; + /** + * Progress listener for 64-bit values; this is the same object as + * mProgressListener, but is a member to avoid having to qi it for each + * progress notification. + */ + nsCOMPtr<nsIWebProgressListener2> mProgressListener2; + nsCOMPtr<nsIProgressEventSink> mEventSink; + mozilla::Mutex mOutputMapMutex MOZ_UNANNOTATED; + nsClassHashtable<nsISupportsHashKey, OutputData> mOutputMap; + nsClassHashtable<nsISupportsHashKey, UploadData> mUploadList; + nsCOMPtr<nsISerialEventTarget> mBackgroundQueue; + nsTArray<RefPtr<ClosePromise>> mFileClosePromises; + nsClassHashtable<nsCStringHashKey, URIData> mURIMap; + nsCOMPtr<nsIWebBrowserPersistURIMap> mFlatURIMap; + nsTArray<mozilla::UniquePtr<WalkData>> mWalkStack; + nsTArray<DocData*> mDocList; + nsTArray<CleanupData*> mCleanupList; + nsTArray<nsCString> mFilenameList; + bool mFirstAndOnlyUse; + bool mSavingDocument; + // mCancel is used from both the main thread, and (inside OnDataAvailable) + // from a background thread. + mozilla::Atomic<bool> mCancel; + bool mEndCalled; + bool mCompleted; + bool mStartSaving; + bool mReplaceExisting; + bool mSerializingOutput; + bool mIsPrivate; + // mPersistFlags can be modified on the main thread, and can be read from + // a background thread when OnDataAvailable calls MakeOutputStreamFromFile. + mozilla::Atomic<uint32_t> mPersistFlags; + nsresult mPersistResult; + int64_t mTotalCurrentProgress; + int64_t mTotalMaxProgress; + int16_t mWrapColumn; + uint32_t mEncodingFlags; + nsString mContentType; +}; + +#endif |