1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/embedding/components/webbrowserpersist/src/nsWebBrowserPersist.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,231 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- 1.5 + * 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#ifndef nsWebBrowserPersist_h__ 1.11 +#define nsWebBrowserPersist_h__ 1.12 + 1.13 +#include "nsCOMPtr.h" 1.14 +#include "nsWeakReference.h" 1.15 + 1.16 +#include "nsIInterfaceRequestor.h" 1.17 +#include "nsIMIMEService.h" 1.18 +#include "nsIStreamListener.h" 1.19 +#include "nsIOutputStream.h" 1.20 +#include "nsIInputStream.h" 1.21 +#include "nsIChannel.h" 1.22 +#include "nsIStyleSheet.h" 1.23 +#include "nsIDocumentEncoder.h" 1.24 +#include "nsITransport.h" 1.25 +#include "nsIProgressEventSink.h" 1.26 +#include "nsIFile.h" 1.27 +#include "nsIWebProgressListener2.h" 1.28 + 1.29 +#include "nsClassHashtable.h" 1.30 +#include "nsHashKeys.h" 1.31 +#include "nsTArray.h" 1.32 + 1.33 +#include "nsCWebBrowserPersist.h" 1.34 + 1.35 +class nsEncoderNodeFixup; 1.36 +class nsIStorageStream; 1.37 + 1.38 +struct CleanupData; 1.39 +struct DocData; 1.40 +struct OutputData; 1.41 +struct UploadData; 1.42 +struct URIData; 1.43 + 1.44 +class nsWebBrowserPersist : public nsIInterfaceRequestor, 1.45 + public nsIWebBrowserPersist, 1.46 + public nsIStreamListener, 1.47 + public nsIProgressEventSink, 1.48 + public nsSupportsWeakReference 1.49 +{ 1.50 + friend class nsEncoderNodeFixup; 1.51 + 1.52 +// Public members 1.53 +public: 1.54 + nsWebBrowserPersist(); 1.55 + 1.56 + NS_DECL_ISUPPORTS 1.57 + NS_DECL_NSIINTERFACEREQUESTOR 1.58 + NS_DECL_NSICANCELABLE 1.59 + NS_DECL_NSIWEBBROWSERPERSIST 1.60 + NS_DECL_NSIREQUESTOBSERVER 1.61 + NS_DECL_NSISTREAMLISTENER 1.62 + NS_DECL_NSIPROGRESSEVENTSINK 1.63 + 1.64 +// Protected members 1.65 +protected: 1.66 + virtual ~nsWebBrowserPersist(); 1.67 + nsresult CloneNodeWithFixedUpAttributes( 1.68 + nsIDOMNode *aNodeIn, bool *aSerializeCloneKids, nsIDOMNode **aNodeOut); 1.69 + nsresult SaveURIInternal( 1.70 + nsIURI *aURI, nsISupports *aCacheKey, nsIURI *aReferrer, 1.71 + nsIInputStream *aPostData, const char *aExtraHeaders, nsIURI *aFile, 1.72 + bool aCalcFileExt, bool aIsPrivate); 1.73 + nsresult SaveChannelInternal( 1.74 + nsIChannel *aChannel, nsIURI *aFile, bool aCalcFileExt); 1.75 + nsresult SaveDocumentInternal( 1.76 + nsIDOMDocument *aDocument, nsIURI *aFile, nsIURI *aDataPath); 1.77 + nsresult SaveDocuments(); 1.78 + nsresult GetDocEncoderContentType( 1.79 + nsIDOMDocument *aDocument, const char16_t *aContentType, 1.80 + char16_t **aRealContentType); 1.81 + nsresult GetExtensionForContentType( 1.82 + const char16_t *aContentType, char16_t **aExt); 1.83 + nsresult GetDocumentExtension(nsIDOMDocument *aDocument, char16_t **aExt); 1.84 + 1.85 +// Private members 1.86 +private: 1.87 + void Cleanup(); 1.88 + void CleanupLocalFiles(); 1.89 + nsresult GetValidURIFromObject(nsISupports *aObject, nsIURI **aURI) const; 1.90 + nsresult GetLocalFileFromURI(nsIURI *aURI, nsIFile **aLocalFile) const; 1.91 + nsresult AppendPathToURI(nsIURI *aURI, const nsAString & aPath) const; 1.92 + nsresult MakeAndStoreLocalFilenameInURIMap( 1.93 + nsIURI *aURI, bool aNeedsPersisting, URIData **aData); 1.94 + nsresult MakeOutputStream( 1.95 + nsIURI *aFile, nsIOutputStream **aOutputStream); 1.96 + nsresult MakeOutputStreamFromFile( 1.97 + nsIFile *aFile, nsIOutputStream **aOutputStream); 1.98 + nsresult MakeOutputStreamFromURI(nsIURI *aURI, nsIOutputStream **aOutStream); 1.99 + nsresult CreateChannelFromURI(nsIURI *aURI, nsIChannel **aChannel); 1.100 + nsresult StartUpload(nsIStorageStream *aOutStream, nsIURI *aDestinationURI, 1.101 + const nsACString &aContentType); 1.102 + nsresult StartUpload(nsIInputStream *aInputStream, nsIURI *aDestinationURI, 1.103 + const nsACString &aContentType); 1.104 + nsresult CalculateAndAppendFileExt(nsIURI *aURI, nsIChannel *aChannel, 1.105 + nsIURI *aOriginalURIWithExtension); 1.106 + nsresult CalculateUniqueFilename(nsIURI *aURI); 1.107 + nsresult MakeFilenameFromURI( 1.108 + nsIURI *aURI, nsString &aFilename); 1.109 + nsresult StoreURI( 1.110 + const char *aURI, 1.111 + bool aNeedsPersisting = true, 1.112 + URIData **aData = nullptr); 1.113 + nsresult StoreURI( 1.114 + nsIURI *aURI, 1.115 + bool aNeedsPersisting = true, 1.116 + URIData **aData = nullptr); 1.117 + nsresult StoreURIAttributeNS( 1.118 + nsIDOMNode *aNode, const char *aNamespaceURI, const char *aAttribute, 1.119 + bool aNeedsPersisting = true, 1.120 + URIData **aData = nullptr); 1.121 + nsresult StoreURIAttribute( 1.122 + nsIDOMNode *aNode, const char *aAttribute, 1.123 + bool aNeedsPersisting = true, 1.124 + URIData **aData = nullptr) 1.125 + { 1.126 + return StoreURIAttributeNS(aNode, "", aAttribute, aNeedsPersisting, aData); 1.127 + } 1.128 + bool DocumentEncoderExists(const char16_t *aContentType); 1.129 + 1.130 + nsresult GetNodeToFixup(nsIDOMNode *aNodeIn, nsIDOMNode **aNodeOut); 1.131 + nsresult FixupURI(nsAString &aURI); 1.132 + nsresult FixupNodeAttributeNS(nsIDOMNode *aNode, const char *aNamespaceURI, const char *aAttribute); 1.133 + nsresult FixupNodeAttribute(nsIDOMNode *aNode, const char *aAttribute) 1.134 + { 1.135 + return FixupNodeAttributeNS(aNode, "", aAttribute); 1.136 + } 1.137 + nsresult FixupAnchor(nsIDOMNode *aNode); 1.138 + nsresult FixupXMLStyleSheetLink(nsIDOMProcessingInstruction *aPI, const nsAString &aHref); 1.139 + nsresult GetXMLStyleSheetLink(nsIDOMProcessingInstruction *aPI, nsAString &aHref); 1.140 + 1.141 + nsresult StoreAndFixupStyleSheet(nsIStyleSheet *aStyleSheet); 1.142 + nsresult SaveDocumentWithFixup( 1.143 + nsIDOMDocument *pDocument, nsIDocumentEncoderNodeFixup *pFixup, 1.144 + nsIURI *aFile, bool aReplaceExisting, const nsACString &aFormatType, 1.145 + const nsCString &aSaveCharset, uint32_t aFlags); 1.146 + nsresult SaveSubframeContent( 1.147 + nsIDOMDocument *aFrameContent, URIData *aData); 1.148 + nsresult SetDocumentBase(nsIDOMDocument *aDocument, nsIURI *aBaseURI); 1.149 + nsresult SendErrorStatusChange( 1.150 + bool aIsReadError, nsresult aResult, nsIRequest *aRequest, nsIURI *aURI); 1.151 + nsresult OnWalkDOMNode(nsIDOMNode *aNode); 1.152 + 1.153 + nsresult FixRedirectedChannelEntry(nsIChannel *aNewChannel); 1.154 + 1.155 + void EndDownload(nsresult aResult = NS_OK); 1.156 + nsresult SaveGatheredURIs(nsIURI *aFileAsURI); 1.157 + bool SerializeNextFile(); 1.158 + void CalcTotalProgress(); 1.159 + 1.160 + void SetApplyConversionIfNeeded(nsIChannel *aChannel); 1.161 + 1.162 + // Hash table enumerators 1.163 + static PLDHashOperator EnumPersistURIs( 1.164 + const nsACString &aKey, URIData *aData, void* aClosure); 1.165 + static PLDHashOperator EnumCleanupOutputMap( 1.166 + nsISupports *aKey, OutputData *aData, void* aClosure); 1.167 + static PLDHashOperator EnumCleanupUploadList( 1.168 + nsISupports *aKey, UploadData *aData, void* aClosure); 1.169 + static PLDHashOperator EnumCalcProgress( 1.170 + nsISupports *aKey, OutputData *aData, void* aClosure); 1.171 + static PLDHashOperator EnumCalcUploadProgress( 1.172 + nsISupports *aKey, UploadData *aData, void* aClosure); 1.173 + static PLDHashOperator EnumFixRedirect( 1.174 + nsISupports *aKey, OutputData *aData, void* aClosure); 1.175 + static PLDHashOperator EnumCountURIsToPersist( 1.176 + const nsACString &aKey, URIData *aData, void* aClosure); 1.177 + 1.178 + nsCOMPtr<nsIURI> mCurrentDataPath; 1.179 + bool mCurrentDataPathIsRelative; 1.180 + nsCString mCurrentRelativePathToData; 1.181 + nsCOMPtr<nsIURI> mCurrentBaseURI; 1.182 + nsCString mCurrentCharset; 1.183 + nsCOMPtr<nsIURI> mTargetBaseURI; 1.184 + uint32_t mCurrentThingsToPersist; 1.185 + 1.186 + nsCOMPtr<nsIMIMEService> mMIMEService; 1.187 + nsCOMPtr<nsIURI> mURI; 1.188 + nsCOMPtr<nsIWebProgressListener> mProgressListener; 1.189 + /** 1.190 + * Progress listener for 64-bit values; this is the same object as 1.191 + * mProgressListener, but is a member to avoid having to qi it for each 1.192 + * progress notification. 1.193 + */ 1.194 + nsCOMPtr<nsIWebProgressListener2> mProgressListener2; 1.195 + nsCOMPtr<nsIProgressEventSink> mEventSink; 1.196 + nsClassHashtable<nsISupportsHashKey, OutputData> mOutputMap; 1.197 + nsClassHashtable<nsISupportsHashKey, UploadData> mUploadList; 1.198 + nsClassHashtable<nsCStringHashKey, URIData> mURIMap; 1.199 + nsTArray<DocData*> mDocList; 1.200 + nsTArray<CleanupData*> mCleanupList; 1.201 + nsTArray<nsCString> mFilenameList; 1.202 + bool mFirstAndOnlyUse; 1.203 + bool mCancel; 1.204 + bool mJustStartedLoading; 1.205 + bool mCompleted; 1.206 + bool mStartSaving; 1.207 + bool mReplaceExisting; 1.208 + bool mSerializingOutput; 1.209 + bool mIsPrivate; 1.210 + uint32_t mPersistFlags; 1.211 + nsresult mPersistResult; 1.212 + int64_t mTotalCurrentProgress; 1.213 + int64_t mTotalMaxProgress; 1.214 + int16_t mWrapColumn; 1.215 + uint32_t mEncodingFlags; 1.216 + nsString mContentType; 1.217 +}; 1.218 + 1.219 +// Helper class does node fixup during persistence 1.220 +class nsEncoderNodeFixup : public nsIDocumentEncoderNodeFixup 1.221 +{ 1.222 +public: 1.223 + nsEncoderNodeFixup(); 1.224 + 1.225 + NS_DECL_ISUPPORTS 1.226 + NS_IMETHOD FixupNode(nsIDOMNode *aNode, bool *aSerializeCloneKids, nsIDOMNode **aOutNode); 1.227 + 1.228 + nsWebBrowserPersist *mWebBrowserPersist; 1.229 + 1.230 +protected: 1.231 + virtual ~nsEncoderNodeFixup(); 1.232 +}; 1.233 + 1.234 +#endif