2018-11-30 22:52:05 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
2001-11-01 14:51:20 +03:00
|
|
|
*
|
2012-05-21 15:12:37 +04:00
|
|
|
* 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/. */
|
2001-11-01 14:51:20 +03:00
|
|
|
|
|
|
|
#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 "nsIDocumentEncoder.h"
|
|
|
|
#include "nsITransport.h"
|
|
|
|
#include "nsIProgressEventSink.h"
|
2012-06-06 06:08:30 +04:00
|
|
|
#include "nsIFile.h"
|
2018-11-09 17:48:11 +03:00
|
|
|
#include "nsIContentPolicy.h"
|
2005-04-06 03:24:23 +04:00
|
|
|
#include "nsIWebProgressListener2.h"
|
2018-08-07 04:10:31 +03:00
|
|
|
#include "nsIWebBrowserPersist.h"
|
2015-08-06 00:25:39 +03:00
|
|
|
#include "nsIWebBrowserPersistDocument.h"
|
2001-11-01 14:51:20 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
#include "mozilla/UniquePtr.h"
|
2014-03-17 21:21:26 +04:00
|
|
|
#include "nsClassHashtable.h"
|
|
|
|
#include "nsHashKeys.h"
|
2009-01-22 07:15:34 +03:00
|
|
|
#include "nsTArray.h"
|
2001-11-01 14:51:20 +03:00
|
|
|
|
2002-02-25 21:47:47 +03:00
|
|
|
class nsIStorageStream;
|
2015-08-06 00:25:39 +03:00
|
|
|
class nsIWebBrowserPersistDocument;
|
2002-02-25 21:47:47 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
class nsWebBrowserPersist final : public nsIInterfaceRequestor,
|
|
|
|
public nsIWebBrowserPersist,
|
|
|
|
public nsIStreamListener,
|
|
|
|
public nsIProgressEventSink,
|
|
|
|
public nsSupportsWeakReference {
|
2001-11-01 14:51:20 +03:00
|
|
|
friend class nsEncoderNodeFixup;
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2001-11-01 14:51:20 +03:00
|
|
|
// Public members
|
|
|
|
public:
|
|
|
|
nsWebBrowserPersist();
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2001-11-01 14:51:20 +03:00
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
NS_DECL_NSIINTERFACEREQUESTOR
|
2005-04-10 16:37:36 +04:00
|
|
|
NS_DECL_NSICANCELABLE
|
2001-11-01 14:51:20 +03:00
|
|
|
NS_DECL_NSIWEBBROWSERPERSIST
|
|
|
|
NS_DECL_NSIREQUESTOBSERVER
|
|
|
|
NS_DECL_NSISTREAMLISTENER
|
|
|
|
NS_DECL_NSIPROGRESSEVENTSINK
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
// Private members
|
|
|
|
private:
|
2001-11-01 14:51:20 +03:00
|
|
|
virtual ~nsWebBrowserPersist();
|
2018-06-22 17:41:39 +03:00
|
|
|
nsresult SaveURIInternal(nsIURI *aURI, nsIPrincipal *aTriggeringPrincipal,
|
2018-11-09 17:48:11 +03:00
|
|
|
nsContentPolicyType aContentPolicyType,
|
2018-06-22 17:41:39 +03:00
|
|
|
uint32_t aCacheKey, nsIURI *aReferrer,
|
2014-11-18 16:47:14 +03:00
|
|
|
uint32_t aReferrerPolicy, nsIInputStream *aPostData,
|
|
|
|
const char *aExtraHeaders, nsIURI *aFile,
|
2012-10-04 23:07:51 +04:00
|
|
|
bool aCalcFileExt, bool aIsPrivate);
|
2011-09-29 10:19:26 +04:00
|
|
|
nsresult SaveChannelInternal(nsIChannel *aChannel, nsIURI *aFile,
|
|
|
|
bool aCalcFileExt);
|
2015-08-06 00:25:39 +03:00
|
|
|
nsresult SaveDocumentInternal(nsIWebBrowserPersistDocument *aDocument,
|
|
|
|
nsIURI *aFile, nsIURI *aDataPath);
|
2001-11-01 14:51:20 +03:00
|
|
|
nsresult SaveDocuments();
|
2015-08-06 00:25:39 +03:00
|
|
|
void FinishSaveDocumentInternal(nsIURI *aFile, nsIFile *aDataPath);
|
2002-02-14 00:45:02 +03:00
|
|
|
nsresult GetExtensionForContentType(const char16_t *aContentType,
|
2014-01-04 19:02:17 +04:00
|
|
|
char16_t **aExt);
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
struct CleanupData;
|
|
|
|
struct DocData;
|
|
|
|
struct OutputData;
|
|
|
|
struct UploadData;
|
|
|
|
struct URIData;
|
|
|
|
struct WalkData;
|
2015-09-03 09:53:38 +03:00
|
|
|
struct URIFixupData;
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
class OnWalk;
|
|
|
|
class OnWrite;
|
|
|
|
class FlatURIMap;
|
|
|
|
friend class OnWalk;
|
|
|
|
friend class OnWrite;
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
nsresult SaveDocumentDeferred(mozilla::UniquePtr<WalkData> &&aData);
|
2003-05-30 15:42:25 +04:00
|
|
|
void Cleanup();
|
|
|
|
void CleanupLocalFiles();
|
2002-01-14 15:41:27 +03:00
|
|
|
nsresult GetValidURIFromObject(nsISupports *aObject, nsIURI **aURI) const;
|
2015-09-03 09:53:38 +03:00
|
|
|
static nsresult GetLocalFileFromURI(nsIURI *aURI, nsIFile **aLocalFile);
|
2018-02-26 22:43:45 +03:00
|
|
|
static nsresult AppendPathToURI(nsIURI *aURI, const nsAString &aPath,
|
|
|
|
nsCOMPtr<nsIURI> &aOutURI);
|
2001-11-01 14:51:20 +03:00
|
|
|
nsresult MakeAndStoreLocalFilenameInURIMap(
|
2018-11-09 17:48:11 +03:00
|
|
|
nsIURI *aURI, nsIWebBrowserPersistDocument *aDoc,
|
|
|
|
nsContentPolicyType aContentPolicyType, bool aNeedsPersisting,
|
|
|
|
URIData **aData);
|
2002-02-08 17:40:51 +03:00
|
|
|
nsresult MakeOutputStream(nsIURI *aFile, nsIOutputStream **aOutputStream);
|
2002-01-14 15:41:27 +03:00
|
|
|
nsresult MakeOutputStreamFromFile(nsIFile *aFile,
|
2012-06-06 06:08:30 +04:00
|
|
|
nsIOutputStream **aOutputStream);
|
2002-02-08 17:40:51 +03:00
|
|
|
nsresult MakeOutputStreamFromURI(nsIURI *aURI, nsIOutputStream **aOutStream);
|
|
|
|
nsresult CreateChannelFromURI(nsIURI *aURI, nsIChannel **aChannel);
|
2002-02-25 21:47:47 +03:00
|
|
|
nsresult StartUpload(nsIStorageStream *aOutStream, nsIURI *aDestinationURI,
|
2002-11-14 23:36:20 +03:00
|
|
|
const nsACString &aContentType);
|
2010-03-14 02:11:12 +03:00
|
|
|
nsresult StartUpload(nsIInputStream *aInputStream, nsIURI *aDestinationURI,
|
|
|
|
const nsACString &aContentType);
|
2002-02-28 17:12:57 +03:00
|
|
|
nsresult CalculateAndAppendFileExt(nsIURI *aURI, nsIChannel *aChannel,
|
2018-01-31 04:33:06 +03:00
|
|
|
nsIURI *aOriginalURIWithExtension,
|
|
|
|
nsCOMPtr<nsIURI> &aOutURI);
|
|
|
|
nsresult CalculateUniqueFilename(nsIURI *aURI, nsCOMPtr<nsIURI> &aOutURI);
|
2001-11-01 14:51:20 +03:00
|
|
|
nsresult MakeFilenameFromURI(nsIURI *aURI, nsString &aFilename);
|
2018-07-06 19:27:17 +03:00
|
|
|
nsresult StoreURI(const char *aURI, nsIWebBrowserPersistDocument *aDoc,
|
2018-11-09 17:48:11 +03:00
|
|
|
nsContentPolicyType aContentPolicyType,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aNeedsPersisting = true, URIData **aData = nullptr);
|
2018-07-06 19:27:17 +03:00
|
|
|
nsresult StoreURI(nsIURI *aURI, nsIWebBrowserPersistDocument *aDoc,
|
2018-11-09 17:48:11 +03:00
|
|
|
nsContentPolicyType aContentPolicyType,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aNeedsPersisting = true, URIData **aData = nullptr);
|
2015-08-06 00:25:39 +03:00
|
|
|
bool DocumentEncoderExists(const char *aContentType);
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
nsresult SaveSubframeContent(nsIWebBrowserPersistDocument *aFrameContent,
|
2018-07-06 19:27:17 +03:00
|
|
|
nsIWebBrowserPersistDocument *aParentDocument,
|
2015-08-06 00:25:39 +03:00
|
|
|
const nsCString &aURISpec, URIData *aData);
|
2011-09-29 10:19:26 +04:00
|
|
|
nsresult SendErrorStatusChange(bool aIsReadError, nsresult aResult,
|
|
|
|
nsIRequest *aRequest, nsIURI *aURI);
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2001-11-01 14:51:20 +03:00
|
|
|
nsresult FixRedirectedChannelEntry(nsIChannel *aNewChannel);
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
void EndDownload(nsresult aResult);
|
|
|
|
void FinishDownload();
|
|
|
|
void SerializeNextFile();
|
2001-11-01 14:51:20 +03:00
|
|
|
void CalcTotalProgress();
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2004-10-10 08:03:34 +04:00
|
|
|
void SetApplyConversionIfNeeded(nsIChannel *aChannel);
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2002-01-14 15:41:27 +03:00
|
|
|
nsCOMPtr<nsIURI> mCurrentDataPath;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mCurrentDataPathIsRelative;
|
2001-11-01 14:51:20 +03:00
|
|
|
nsCString mCurrentRelativePathToData;
|
|
|
|
nsCOMPtr<nsIURI> mCurrentBaseURI;
|
2003-08-08 05:00:30 +04:00
|
|
|
nsCString mCurrentCharset;
|
2002-03-14 17:16:27 +03:00
|
|
|
nsCOMPtr<nsIURI> mTargetBaseURI;
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t mCurrentThingsToPersist;
|
2018-11-30 13:46:48 +03:00
|
|
|
|
2001-11-01 14:51:20 +03:00
|
|
|
nsCOMPtr<nsIMIMEService> mMIMEService;
|
|
|
|
nsCOMPtr<nsIURI> mURI;
|
|
|
|
nsCOMPtr<nsIWebProgressListener> mProgressListener;
|
2005-04-06 03:24:23 +04:00
|
|
|
/**
|
|
|
|
* 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;
|
2005-10-15 21:27:52 +04:00
|
|
|
nsCOMPtr<nsIProgressEventSink> mEventSink;
|
2014-03-17 21:21:26 +04:00
|
|
|
nsClassHashtable<nsISupportsHashKey, OutputData> mOutputMap;
|
2014-03-17 21:21:26 +04:00
|
|
|
nsClassHashtable<nsISupportsHashKey, UploadData> mUploadList;
|
2014-04-02 16:56:06 +04:00
|
|
|
nsClassHashtable<nsCStringHashKey, URIData> mURIMap;
|
2015-08-06 00:25:39 +03:00
|
|
|
nsCOMPtr<nsIWebBrowserPersistURIMap> mFlatURIMap;
|
|
|
|
nsTArray<mozilla::UniquePtr<WalkData>> mWalkStack;
|
2009-02-25 18:25:08 +03:00
|
|
|
nsTArray<DocData *> mDocList;
|
|
|
|
nsTArray<CleanupData *> mCleanupList;
|
2009-01-22 07:15:34 +03:00
|
|
|
nsTArray<nsCString> mFilenameList;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mFirstAndOnlyUse;
|
2015-08-06 00:25:39 +03:00
|
|
|
bool mSavingDocument;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool mCancel;
|
|
|
|
bool mCompleted;
|
|
|
|
bool mStartSaving;
|
|
|
|
bool mReplaceExisting;
|
|
|
|
bool mSerializingOutput;
|
2012-10-04 23:07:51 +04:00
|
|
|
bool mIsPrivate;
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t mPersistFlags;
|
2012-08-06 16:02:31 +04:00
|
|
|
nsresult mPersistResult;
|
2012-08-22 19:56:38 +04:00
|
|
|
int64_t mTotalCurrentProgress;
|
|
|
|
int64_t mTotalMaxProgress;
|
|
|
|
int16_t mWrapColumn;
|
|
|
|
uint32_t mEncodingFlags;
|
2002-01-14 15:41:27 +03:00
|
|
|
nsString mContentType;
|
2001-11-01 14:51:20 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|