summaryrefslogtreecommitdiffstats
path: root/dom/webbrowserpersist/nsWebBrowserPersist.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webbrowserpersist/nsWebBrowserPersist.h')
-rw-r--r--dom/webbrowserpersist/nsWebBrowserPersist.h190
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