author | Jonas Sicking <jonas@sicking.cc> |
Wed, 13 Oct 2010 16:25:33 -0700 (2010-10-13) | |
changeset 55459 | 1b3947ed93c6ee9b1c5cbfcfb057ea4d8d915ce2 |
parent 55458 | 0c9ae492cf5f51c9d16e7e224bf42f4b7a45e2c6 |
child 55460 | 3c762301b7194a643c2e1eadb69ff93d2a0f7b3d |
push id | 16267 |
push user | sicking@mozilla.com |
push date | Wed, 13 Oct 2010 23:26:39 +0000 (2010-10-13) |
treeherder | mozilla-central@1b3947ed93c6 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | khuey, biesi, beltzner |
bugs | 575946 |
milestone | 2.0b8pre |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/content/base/public/nsDOMFile.h +++ b/content/base/public/nsDOMFile.h @@ -44,76 +44,136 @@ #include "nsIDOMFileList.h" #include "nsIDOMFileError.h" #include "nsIInputStream.h" #include "nsCOMArray.h" #include "nsCOMPtr.h" #include "mozilla/AutoRestore.h" #include "nsString.h" #include "nsIXMLHttpRequest.h" +#include "prmem.h" +#include "nsAutoPtr.h" class nsIFile; class nsIInputStream; +class nsIClassInfo; class nsDOMFile : public nsIDOMFile, public nsIXHRSendable, public nsICharsetDetectionObserver { public: NS_DECL_ISUPPORTS + NS_DECL_NSIDOMBLOB NS_DECL_NSIDOMFILE NS_DECL_NSIXHRSENDABLE nsDOMFile(nsIFile *aFile, const nsAString& aContentType) : mFile(aFile), - mContentType(aContentType) + mContentType(aContentType), + mIsFullFile(true) {} nsDOMFile(nsIFile *aFile) - : mFile(aFile) + : mFile(aFile), + mIsFullFile(true) {} + nsDOMFile(const nsDOMFile* aOther, PRUint64 aStart, PRUint64 aLength, + const nsAString& aContentType) + : mFile(aOther->mFile), + mStart(aOther->mIsFullFile ? aStart : + (aOther->mStart + aStart)), + mLength(aLength), + mContentType(aContentType), + mIsFullFile(false) + { + NS_ASSERTION(mFile, "must have file"); + // Ensure non-null mContentType + mContentType.SetIsVoid(PR_FALSE); + } + virtual ~nsDOMFile() {} // from nsICharsetDetectionObserver NS_IMETHOD Notify(const char *aCharset, nsDetectionConfident aConf); -private: +protected: nsCOMPtr<nsIFile> mFile; + + // start and length in + PRUint64 mStart; + PRUint64 mLength; + nsString mContentType; + + bool mIsFullFile; + + // Used during charset detection nsCString mCharset; - nsresult GuessCharset(nsIInputStream *aStream, nsACString &aCharset); nsresult ConvertStream(nsIInputStream *aStream, const char *aCharset, nsAString &aResult); }; class nsDOMMemoryFile : public nsDOMFile { public: nsDOMMemoryFile(void *aMemoryBuffer, PRUint64 aLength, const nsAString& aName, const nsAString& aContentType) : nsDOMFile(nsnull, aContentType), - mInternalData(aMemoryBuffer), mLength(aLength), mName(aName) - { } + mDataOwner(new DataOwner(aMemoryBuffer)), + mName(aName) + { + mStart = 0; + mLength = aLength; + } - ~nsDOMMemoryFile(); + nsDOMMemoryFile(const nsDOMMemoryFile* aOther, PRUint64 aStart, + PRUint64 aLength, const nsAString& aContentType) + : nsDOMFile(nsnull, aContentType), + mDataOwner(aOther->mDataOwner) + { + NS_ASSERTION(mDataOwner && mDataOwner->mData, "must have data"); + + mIsFullFile = false; + mStart = aOther->mStart + aStart; + mLength = aLength; + + // Ensure non-null mContentType + mContentType.SetIsVoid(PR_FALSE); + } NS_IMETHOD GetName(nsAString&); NS_IMETHOD GetSize(PRUint64*); NS_IMETHOD GetInternalStream(nsIInputStream**); - NS_IMETHOD GetMozFullPath(nsAString&); NS_IMETHOD GetMozFullPathInternal(nsAString&); + NS_IMETHOD Slice(PRUint64 aStart, PRUint64 aLength, + const nsAString& aContentType, nsIDOMBlob **aBlob); protected: - void* mInternalData; - PRUint64 mLength; + class DataOwner { + public: + NS_INLINE_DECL_REFCOUNTING(DataOwner) + DataOwner(void* aMemoryBuffer) + : mData(aMemoryBuffer) + { + } + ~DataOwner() { + PR_Free(mData); + } + void* mData; + }; + + // Used when backed by a memory store + nsRefPtr<DataOwner> mDataOwner; + nsString mName; }; class nsDOMFileList : public nsIDOMFileList { public: NS_DECL_ISUPPORTS NS_DECL_NSIDOMFILELIST @@ -158,17 +218,17 @@ public: nsDOMFileError(PRUint16 aErrorCode) : mCode(aErrorCode) {} private: PRUint16 mCode; }; class NS_STACK_CLASS nsDOMFileInternalUrlHolder { public: - nsDOMFileInternalUrlHolder(nsIDOMFile* aFile, nsIPrincipal* aPrincipal + nsDOMFileInternalUrlHolder(nsIDOMBlob* aFile, nsIPrincipal* aPrincipal MOZILLA_GUARD_OBJECT_NOTIFIER_PARAM); ~nsDOMFileInternalUrlHolder(); nsAutoString mUrl; private: MOZILLA_DECL_USE_GUARD_OBJECT_NOTIFIER }; #endif
--- a/content/base/public/nsIDOMFile.idl +++ b/content/base/public/nsIDOMFile.idl @@ -36,32 +36,43 @@ * ***** END LICENSE BLOCK ***** */ #include "domstubs.idl" interface nsIDOMFileError; interface nsIInputStream; interface nsIURI; interface nsIPrincipal; +interface nsIDOMBlob; -[scriptable, uuid(414e5d40-c831-4b28-acdc-8ff02d1a317d)] -interface nsIDOMFile : nsISupports +[scriptable, uuid(5822776a-049c-4de7-adb6-dd9efc39d082)] +interface nsIDOMBlob : nsISupports { - //fileName and fileSize are now deprecated attributes - readonly attribute DOMString fileName; - readonly attribute unsigned long long fileSize; - - readonly attribute DOMString name; - readonly attribute DOMString mozFullPath; readonly attribute unsigned long long size; readonly attribute DOMString type; - DOMString getAsText(in DOMString encoding); // raises(FileException) on retrieval - DOMString getAsDataURL(); // raises(FileException) on retrieval - DOMString getAsBinary(); // raises(FileException) on retrieval + nsIDOMBlob slice(in unsigned long long start, + in unsigned long long length, + [optional] in DOMString contentType); [noscript] readonly attribute nsIInputStream internalStream; // The caller is responsible for releasing the internalUrl from the // moz-filedata: protocol handler [noscript] DOMString getInternalUrl(in nsIPrincipal principal); +}; + +[scriptable, uuid(ae1405b0-e411-481e-9606-b29ec7982687)] +interface nsIDOMFile : nsIDOMBlob +{ + readonly attribute DOMString name; + readonly attribute DOMString mozFullPath; + // This performs no security checks! [noscript] readonly attribute DOMString mozFullPathInternal; + + // These are all deprecated and not in spec. Will be removed in a future + // release + readonly attribute DOMString fileName; + readonly attribute unsigned long long fileSize; + DOMString getAsText(in DOMString encoding); // raises(FileException) on retrieval + DOMString getAsDataURL(); // raises(FileException) on retrieval + DOMString getAsBinary(); // raises(FileException) on retrieval };
--- a/content/base/public/nsIDOMFileReader.idl +++ b/content/base/public/nsIDOMFileReader.idl @@ -33,25 +33,25 @@ * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "nsIDOMEventTarget.idl" interface nsIDOMEventListener; -interface nsIDOMFile; +interface nsIDOMBlob; interface nsIDOMFileError; -[scriptable, uuid(5db0ce80-de44-40c0-a346-e28aac4aa978)] +[scriptable, uuid(71c32f16-ea5d-415e-9303-0db981c17bed)] interface nsIDOMFileReader : nsISupports { - void readAsBinaryString(in nsIDOMFile filedata); - void readAsText(in nsIDOMFile filedata, [optional] in DOMString encoding); - void readAsDataURL(in nsIDOMFile file); + void readAsBinaryString(in nsIDOMBlob filedata); + void readAsText(in nsIDOMBlob filedata, [optional] in DOMString encoding); + void readAsDataURL(in nsIDOMBlob file); void abort(); const unsigned short EMPTY = 0; const unsigned short LOADING = 1; const unsigned short DONE = 2; readonly attribute unsigned short readyState;
--- a/content/base/src/nsDOMFile.cpp +++ b/content/base/src/nsDOMFile.cpp @@ -57,30 +57,36 @@ #include "nsISeekableStream.h" #include "nsIUnicharInputStream.h" #include "nsIUnicodeDecoder.h" #include "nsNetCID.h" #include "nsNetUtil.h" #include "nsIUUIDGenerator.h" #include "nsFileDataProtocolHandler.h" #include "nsStringStream.h" +#include "CheckedInt.h" #include "plbase64.h" #include "prmem.h" +using namespace mozilla; + // nsDOMFile implementation DOMCI_DATA(File, nsDOMFile) +DOMCI_DATA(Blob, nsDOMFile) NS_INTERFACE_MAP_BEGIN(nsDOMFile) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMFile) - NS_INTERFACE_MAP_ENTRY(nsIDOMFile) + NS_INTERFACE_MAP_ENTRY(nsIDOMBlob) + NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIDOMFile, mIsFullFile) NS_INTERFACE_MAP_ENTRY(nsIXHRSendable) NS_INTERFACE_MAP_ENTRY(nsICharsetDetectionObserver) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(File) + NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(File, mIsFullFile) + NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(Blob, !mIsFullFile) NS_INTERFACE_MAP_END NS_IMPL_ADDREF(nsDOMFile) NS_IMPL_RELEASE(nsDOMFile) static nsresult DOMFileResult(nsresult rv) { @@ -105,55 +111,63 @@ NS_IMETHODIMP nsDOMFile::GetFileSize(PRUint64 *aFileSize) { return GetSize(aFileSize); } NS_IMETHODIMP nsDOMFile::GetName(nsAString &aFileName) { + NS_ASSERTION(mIsFullFile, "Should only be called on files"); return mFile->GetLeafName(aFileName); } NS_IMETHODIMP nsDOMFile::GetMozFullPath(nsAString &aFileName) { + NS_ASSERTION(mIsFullFile, "Should only be called on files"); if (nsContentUtils::IsCallerTrustedForCapability("UniversalFileRead")) { return GetMozFullPathInternal(aFileName); } aFileName.Truncate(); return NS_OK; } NS_IMETHODIMP nsDOMFile::GetMozFullPathInternal(nsAString &aFilename) { + NS_ASSERTION(mIsFullFile, "Should only be called on files"); return mFile->GetPath(aFilename); } NS_IMETHODIMP nsDOMFile::GetSize(PRUint64 *aFileSize) { - PRInt64 fileSize; - nsresult rv = mFile->GetFileSize(&fileSize); - NS_ENSURE_SUCCESS(rv, rv); - - if (fileSize < 0) { - return NS_ERROR_FAILURE; + if (mIsFullFile) { + PRInt64 fileSize; + nsresult rv = mFile->GetFileSize(&fileSize); + NS_ENSURE_SUCCESS(rv, rv); + + if (fileSize < 0) { + return NS_ERROR_FAILURE; + } + + *aFileSize = fileSize; } - - *aFileSize = fileSize; + else { + *aFileSize = mLength; + } return NS_OK; } NS_IMETHODIMP nsDOMFile::GetType(nsAString &aType) { - if (!mContentType.Length()) { + if (mContentType.IsEmpty() && mFile && mIsFullFile) { nsresult rv; nsCOMPtr<nsIMIMEService> mimeService = do_GetService(NS_MIMESERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString mimeType; rv = mimeService->GetTypeFromFile(mFile, mimeType); if (NS_FAILED(rv)) { @@ -164,22 +178,59 @@ nsDOMFile::GetType(nsAString &aType) AppendUTF8toUTF16(mimeType, mContentType); } aType = mContentType; return NS_OK; } +// Makes sure that aStart and aStart + aLength is less then or equal to aSize +void +ClampToSize(PRUint64 aSize, PRUint64& aStart, PRUint64& aLength) +{ + if (aStart > aSize) { + aStart = aLength = 0; + } + CheckedUint64 endOffset = aStart; + endOffset += aLength; + if (!endOffset.valid() || endOffset.value() > aSize) { + aLength = aSize - aStart; + } +} + +NS_IMETHODIMP +nsDOMFile::Slice(PRUint64 aStart, PRUint64 aLength, + const nsAString& aContentType, nsIDOMBlob **aBlob) +{ + *aBlob = nsnull; + + // Truncate aLength and aStart so that we stay within this file. + PRUint64 thisLength; + nsresult rv = GetSize(&thisLength); + NS_ENSURE_SUCCESS(rv, rv); + ClampToSize(thisLength, aStart, aLength); + + // Create the new file + NS_ADDREF(*aBlob = new nsDOMFile(this, aStart, aLength, aContentType)); + + return NS_OK; +} + NS_IMETHODIMP nsDOMFile::GetInternalStream(nsIInputStream **aStream) { - return NS_NewLocalFileInputStream(aStream, mFile, -1, -1, - nsIFileInputStream::CLOSE_ON_EOF | - nsIFileInputStream::REOPEN_ON_REWIND); + return mIsFullFile ? + NS_NewLocalFileInputStream(aStream, mFile, -1, -1, + nsIFileInputStream::CLOSE_ON_EOF | + nsIFileInputStream::REOPEN_ON_REWIND) : + NS_NewPartialLocalFileInputStream(aStream, mFile, mStart, mLength, + -1, -1, + nsIFileInputStream::CLOSE_ON_EOF | + nsIFileInputStream::REOPEN_ON_REWIND); } NS_IMETHODIMP nsDOMFile::GetInternalUrl(nsIPrincipal* aPrincipal, nsAString& aURL) { NS_ENSURE_STATE(aPrincipal); nsresult rv; @@ -476,57 +527,64 @@ nsDOMFile::ConvertStream(nsIInputStream aResult.Append(result); rv = unicharStream->ReadString(8192, result, &numChars); } return rv; } // nsDOMMemoryFile Implementation -nsDOMMemoryFile::~nsDOMMemoryFile() -{ - PR_Free(mInternalData); -} - NS_IMETHODIMP nsDOMMemoryFile::GetName(nsAString &aFileName) { + NS_ASSERTION(mIsFullFile, "Should only be called on files"); aFileName = mName; return NS_OK; } NS_IMETHODIMP nsDOMMemoryFile::GetSize(PRUint64 *aFileSize) { *aFileSize = mLength; return NS_OK; } NS_IMETHODIMP +nsDOMMemoryFile::Slice(PRUint64 aStart, PRUint64 aLength, + const nsAString& aContentType, nsIDOMBlob **aBlob) +{ + *aBlob = nsnull; + + // Truncate aLength and aStart so that we stay within this file. + ClampToSize(mLength, aStart, aLength); + + // Create the new file + NS_ADDREF(*aBlob = new nsDOMMemoryFile(this, aStart, aLength, aContentType)); + + return NS_OK; +} + +NS_IMETHODIMP nsDOMMemoryFile::GetInternalStream(nsIInputStream **aStream) { if (mLength > PR_INT32_MAX) return NS_ERROR_FAILURE; - PRInt32 l = mLength; - - return NS_NewByteInputStream(aStream, (const char*)mInternalData, l); -} - -NS_IMETHODIMP -nsDOMMemoryFile::GetMozFullPath(nsAString &aFileName) -{ - aFileName.Truncate(); - return NS_OK; + return NS_NewByteInputStream(aStream, + static_cast<const char*>(mDataOwner->mData) + + mStart, + (PRInt32)mLength); } NS_IMETHODIMP nsDOMMemoryFile::GetMozFullPathInternal(nsAString &aFilename) { - return GetName(aFilename); + NS_ASSERTION(mIsFullFile, "Should only be called on files"); + aFilename.Truncate(); + return NS_OK; } // nsDOMFileList implementation DOMCI_DATA(FileList, nsDOMFileList) NS_INTERFACE_MAP_BEGIN(nsDOMFileList) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMFileList) @@ -568,17 +626,17 @@ NS_IMPL_RELEASE(nsDOMFileError) NS_IMETHODIMP nsDOMFileError::GetCode(PRUint16* aCode) { *aCode = mCode; return NS_OK; } -nsDOMFileInternalUrlHolder::nsDOMFileInternalUrlHolder(nsIDOMFile* aFile, +nsDOMFileInternalUrlHolder::nsDOMFileInternalUrlHolder(nsIDOMBlob* aFile, nsIPrincipal* aPrincipal MOZILLA_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL) { MOZILLA_GUARD_OBJECT_NOTIFIER_INIT; aFile->GetInternalUrl(aPrincipal, mUrl); } nsDOMFileInternalUrlHolder::~nsDOMFileInternalUrlHolder() { if (!mUrl.IsEmpty()) {
--- a/content/base/src/nsDOMFileReader.cpp +++ b/content/base/src/nsDOMFileReader.cpp @@ -259,30 +259,30 @@ nsDOMFileReader::GetResult(nsAString& aR NS_IMETHODIMP nsDOMFileReader::GetError(nsIDOMFileError** aError) { NS_IF_ADDREF(*aError = mError); return NS_OK; } NS_IMETHODIMP -nsDOMFileReader::ReadAsBinaryString(nsIDOMFile* aFile) +nsDOMFileReader::ReadAsBinaryString(nsIDOMBlob* aFile) { return ReadFileContent(aFile, EmptyString(), FILE_AS_BINARY); } NS_IMETHODIMP -nsDOMFileReader::ReadAsText(nsIDOMFile* aFile, +nsDOMFileReader::ReadAsText(nsIDOMBlob* aFile, const nsAString &aCharset) { return ReadFileContent(aFile, aCharset, FILE_AS_TEXT); } NS_IMETHODIMP -nsDOMFileReader::ReadAsDataURL(nsIDOMFile* aFile) +nsDOMFileReader::ReadAsDataURL(nsIDOMBlob* aFile) { return ReadFileContent(aFile, EmptyString(), FILE_AS_DATAURL); } NS_IMETHODIMP nsDOMFileReader::Abort() { if (mReadyState != nsIDOMFileReader::LOADING) @@ -478,17 +478,17 @@ nsDOMFileReader::OnStopRequest(nsIReques DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR)); return NS_OK; } // Helper methods nsresult -nsDOMFileReader::ReadFileContent(nsIDOMFile* aFile, +nsDOMFileReader::ReadFileContent(nsIDOMBlob* aFile, const nsAString &aCharset, eDataFormat aDataFormat) { nsresult rv; NS_ENSURE_TRUE(aFile, NS_ERROR_NULL_POINTER); //Implicit abort to clear any other activity going on Abort(); @@ -604,17 +604,17 @@ nsDOMFileReader::GetAsText(const nsACStr NS_ENSURE_SUCCESS(rv, rv); rv = ConvertStream(aFileData, aDataLen, charset.get(), aResult); return NS_OK; } nsresult -nsDOMFileReader::GetAsDataURL(nsIDOMFile *aFile, +nsDOMFileReader::GetAsDataURL(nsIDOMBlob *aFile, const char *aFileData, PRUint32 aDataLen, nsAString& aResult) { aResult.AssignLiteral("data:"); nsresult rv; nsString contentType;
--- a/content/base/src/nsDOMFileReader.h +++ b/content/base/src/nsDOMFileReader.h @@ -112,33 +112,33 @@ public: protected: enum eDataFormat { FILE_AS_BINARY, FILE_AS_TEXT, FILE_AS_DATAURL }; - nsresult ReadFileContent(nsIDOMFile *aFile, const nsAString &aCharset, eDataFormat aDataFormat); + nsresult ReadFileContent(nsIDOMBlob *aFile, const nsAString &aCharset, eDataFormat aDataFormat); nsresult GetAsText(const nsACString &aCharset, const char *aFileData, PRUint32 aDataLen, nsAString &aResult); - nsresult GetAsDataURL(nsIDOMFile *aFile, const char *aFileData, PRUint32 aDataLen, nsAString &aResult); + nsresult GetAsDataURL(nsIDOMBlob *aFile, const char *aFileData, PRUint32 aDataLen, nsAString &aResult); nsresult GuessCharset(const char *aFileData, PRUint32 aDataLen, nsACString &aCharset); nsresult ConvertStream(const char *aFileData, PRUint32 aDataLen, const char *aCharset, nsAString &aResult); void DispatchError(nsresult rv); void StartProgressEventTimer(); void FreeFileData() { PR_Free(mFileData); mFileData = nsnull; mDataLen = 0; } char *mFileData; - nsCOMPtr<nsIDOMFile> mFile; + nsCOMPtr<nsIDOMBlob> mFile; nsCString mCharset; PRUint32 mDataLen; eDataFormat mDataFormat; nsString mResult; PRUint16 mReadyState;
--- a/content/base/src/nsFileDataProtocolHandler.cpp +++ b/content/base/src/nsFileDataProtocolHandler.cpp @@ -50,25 +50,25 @@ #include "nsIProgrammingLanguage.h" static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID); // ----------------------------------------------------------------------- // Hash table struct FileDataInfo { - nsCOMPtr<nsIDOMFile> mFile; + nsCOMPtr<nsIDOMBlob> mFile; nsCOMPtr<nsIPrincipal> mPrincipal; }; static nsClassHashtable<nsCStringHashKey, FileDataInfo>* gFileDataTable; void nsFileDataProtocolHandler::AddFileDataEntry(nsACString& aUri, - nsIDOMFile* aFile, + nsIDOMBlob* aFile, nsIPrincipal* aPrincipal) { if (!gFileDataTable) { gFileDataTable = new nsClassHashtable<nsCStringHashKey, FileDataInfo>; gFileDataTable->Init(); } FileDataInfo* info = new FileDataInfo;
--- a/content/base/src/nsFileDataProtocolHandler.h +++ b/content/base/src/nsFileDataProtocolHandler.h @@ -36,34 +36,34 @@ #ifndef nsFileDataProtocolHandler_h___ #define nsFileDataProtocolHandler_h___ #include "nsIProtocolHandler.h" #define FILEDATA_SCHEME "moz-filedata" -class nsIDOMFile; +class nsIDOMBlob; class nsIPrincipal; class nsFileDataProtocolHandler : public nsIProtocolHandler { public: NS_DECL_ISUPPORTS // nsIProtocolHandler methods: NS_DECL_NSIPROTOCOLHANDLER // nsFileDataProtocolHandler methods: nsFileDataProtocolHandler() {} virtual ~nsFileDataProtocolHandler() {} // Methods for managing uri->file mapping static void AddFileDataEntry(nsACString& aUri, - nsIDOMFile* aFile, + nsIDOMBlob* aFile, nsIPrincipal* aPrincipal); static void RemoveFileDataEntry(nsACString& aUri); }; #define NS_FILEDATAPROTOCOLHANDLER_CID \ { 0xb43964aa, 0xa078, 0x44b2, \ { 0xb0, 0x6b, 0xfd, 0x4d, 0x1b, 0x17, 0x2e, 0x66 } }
--- a/content/base/src/nsFormData.cpp +++ b/content/base/src/nsFormData.cpp @@ -80,21 +80,21 @@ nsFormData::AddNameValuePair(const nsASt data->stringValue = aValue; data->valueIsFile = PR_FALSE; return NS_OK; } nsresult nsFormData::AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile) + nsIDOMBlob* aBlob) { FormDataTuple* data = mFormData.AppendElement(); data->name = aName; - data->fileValue = aFile; + data->fileValue = aBlob; data->valueIsFile = PR_TRUE; return NS_OK; } // ------------------------------------------------------------------------- // nsIDOMFormData @@ -109,19 +109,19 @@ nsFormData::Append(const nsAString& aNam dataType == nsIDataType::VTYPE_INTERFACE_IS) { nsCOMPtr<nsISupports> supports; nsID *iid; rv = aValue->GetAsInterface(&iid, getter_AddRefs(supports)); NS_ENSURE_SUCCESS(rv, rv); nsMemory::Free(iid); - nsCOMPtr<nsIDOMFile> domFile = do_QueryInterface(supports); - if (domFile) { - return AddNameFilePair(aName, domFile); + nsCOMPtr<nsIDOMBlob> domBlob = do_QueryInterface(supports); + if (domBlob) { + return AddNameFilePair(aName, domBlob); } } PRUnichar* stringData = nsnull; PRUint32 stringLen = 0; rv = aValue->GetAsWStringWithSize(&stringLen, &stringData); NS_ENSURE_SUCCESS(rv, rv);
--- a/content/base/src/nsFormData.h +++ b/content/base/src/nsFormData.h @@ -58,25 +58,25 @@ public: NS_DECL_NSIXHRSENDABLE // nsFormSubmission virtual nsresult GetEncodedSubmission(nsIURI* aURI, nsIInputStream** aPostDataStream); virtual nsresult AddNameValuePair(const nsAString& aName, const nsAString& aValue); virtual nsresult AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile); + nsIDOMBlob* aBlob); NS_IMETHOD Initialize(nsISupports* aOwner, JSContext* aCx, JSObject* aObj, PRUint32 aArgc, jsval* aArgv); private: struct FormDataTuple { nsString name; nsString stringValue; - nsCOMPtr<nsIDOMFile> fileValue; + nsCOMPtr<nsIDOMBlob> fileValue; PRBool valueIsFile; }; nsTArray<FormDataTuple> mFormData; }; #endif // nsFormData_h__
--- a/content/base/test/Makefile.in +++ b/content/base/test/Makefile.in @@ -143,16 +143,17 @@ include $(topsrcdir)/config/rules.mk file_bug326337_multipart.txt \ file_bug326337_multipart.txt^headers^ \ test_bug333198.html \ test_bug402150.html \ test_bug402150.html^headers^ \ test_bug401662.html \ test_bug403852.html \ test_fileapi.html \ + test_fileapi_slice.html \ test_bug403868.xml \ test_bug405182.html \ test_bug403841.html \ test_bug409380.html \ test_bug410229.html \ test_bug413974.html \ test_bug415860.html \ test_bug414190.html \
new file mode 100644 --- /dev/null +++ b/content/base/test/test_fileapi_slice.html @@ -0,0 +1,405 @@ +<!DOCTYPE HTML> +<html> +<head> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=575946 +--> + <title>Test for Bug 575946</title> + <script type="text/javascript" src="/MochiKit/packed.js"></script> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +</head> + +<body> +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=575946">Mozilla Bug 575946</a> +<p id="display"> + <canvas id=canvas width=1000 height=1000 hidden></canvas> + <canvas id=testcanvas hidden></canvas> + <input id="fileList" type="file"></input> +</p> +<div id="content" style="display: none"> +</div> + +<pre id="test"> +<script class="testbody" type="text/javascript"> +var fileNum = 1; +var testRanCounter = 0; +var expectedTestCount = 0; +SimpleTest.waitForExplicitFinish(); + +// Create files containing data we'll test with. We'll want long +// strings to ensure they span multiple buffers while loading + +// Create a decent-sized image +cx = $("canvas").getContext('2d'); +var s = cx.canvas.width; +var grad = cx.createLinearGradient(0, 0, s-1, s-1); +for (i = 0; i < 0.95; i += .1) { + grad.addColorStop(i, "white"); + grad.addColorStop(i + .05, "black"); +} +grad.addColorStop(1, "white"); +cx.fillStyle = grad; +cx.fillRect(0, 0, s-1, s-1); +cx.fillStyle = "rgba(200, 0, 0, 0.9)"; +cx.fillRect(.1 * s, .1 * s, .7 * s, .7 * s); +cx.strokeStyle = "rgba(0, 0, 130, 0.5)"; +cx.lineWidth = .14 * s; +cx.beginPath(); +cx.arc(.6 * s, .6 * s, .3 * s, 0, Math.PI*2, true); +cx.stroke(); +cx.closePath(); +cx.fillStyle = "rgb(0, 255, 0)"; +cx.beginPath(); +cx.arc(.1 * s, .8 * s, .1 * s, 0, Math.PI*2, true); +cx.fill(); +cx.closePath(); + + +var fileData = + atob(cx.canvas.toDataURL("image/png").substring("data:text/png;base64,".length + 1)); +var memFile = cx.canvas.mozGetAsFile("image/png"); +var fileFile = createFileWithData(fileData); +var size = fileData.length; + +// This might fail if we dramatically improve the png encoder. If that happens +// please increase the complexity or size of the image generated above to ensure +// that we're testing with files that are large enough. +ok(size > 65536, "test data sufficiently large"); + + +// Test that basic properties work +function testBasics(file, size, type) { + is(file.type, type, "mozGetAsFile type"); + is(file.size, size, "file is correct size"); + ok(file instanceof File, "file is a File"); + ok(file instanceof Blob, "file is also a Blob"); + + var slice = file.slice(0, size); + is(slice.type, "", "full-size type"); + is(slice.size, size, "full-size size"); + ok(slice instanceof Blob, "slice is a Blob"); + ok(!(slice instanceof File), "slice is not a File"); + + slice = file.slice(0, 1234); + is(slice.type, "", "sized type"); + is(slice.size, 1234, "sized size"); + ok(slice instanceof Blob, "slice is a Blob"); + ok(!(slice instanceof File), "slice is not a File"); + + slice = file.slice(size-500, 1000); + is(slice.type, "", "end-sized type"); + is(slice.size, 500, "end-sized size"); + + slice = file.slice(size+500, 1000); + is(slice.type, "", "sized type"); + is(slice.size, 0, "sized size"); + + slice = file.slice(0, 0); + is(slice.type, "", "sized type"); + is(slice.size, 0, "sized size"); + + slice = file.slice(1000, 0); + is(slice.type, "", "sized type"); + is(slice.size, 0, "sized size"); + + slice = file.slice(0, size, "foo/bar"); + is(slice.type, "foo/bar", "full-size foo/bar type"); + is(slice.size, size, "full-size foo/bar size"); + + slice = file.slice(0, 5432, "foo/bar"); + is(slice.type, "foo/bar", "sized foo/bar type"); + is(slice.size, 5432, "sized foo/bar size"); + + is(slice.slice(0, 10).type, "", "slice-slice type"); + is(slice.slice(0, 10).size, 10, "slice-slice size"); + is(slice.slice(0, 10, "hello/world").type, "hello/world", "slice-slice hello/world type"); + is(slice.slice(0, 10, "hello/world").size, 10, "slice-slice hello/world type"); +} + +testBasics(memFile, size, "image/png"); +testBasics(fileFile, size, ""); + + +// Test reading various slices + +// Full file +testFile(memFile, fileData, "mem file"); +testFile(fileFile, fileData, "file file"); + +// Simple slice +testFile(memFile.slice(0, 33000), fileData.substr(0, 33000), "mem file slice"); +testFile(fileFile.slice(0, 33000), fileData.substr(0, 33000), "file file slice"); + +// Simple slice not starting at beginning +testFile(memFile.slice(1000, 33000), fileData.substr(1000, 33000), "mem file slice starting at non-zero"); +testFile(fileFile.slice(1000, 33000), fileData.substr(1000, 33000), "file file slice starting at non-zero"); + +// Slice of slice +var memSlice = memFile.slice(0, 40000); +var fileSlice = fileFile.slice(0, 40000); +testFile(memSlice.slice(5000, 37000), fileData.substr(5000, 35000), "mem file slice slice"); +testFile(fileSlice.slice(5000, 37000), fileData.substr(5000, 35000), "file file slice slice"); + +// ...of slice of slice +memSlice = memSlice.slice(5000, 37000).slice(400, 300); +fileSlice = fileSlice.slice(5000, 37000).slice(400, 300); +gc(); +testFile(memSlice, fileData.substr(5400, 300), "mem file slice slice slice"); +testFile(fileSlice, fileData.substr(5400, 300), "file file slice slice slice"); + +// empty slice +testFile(memFile.slice(4711, 0), "", "mem file empty slice"); +testFile(fileFile.slice(4711, 0), "", "file file empty slice"); +testFile(memFile.slice(0, 0), "", "mem file empty slice"); +testFile(fileFile.slice(0, 0), "", "file file empty slice"); + +// slice at end +testFile(memFile.slice(size-1000, 1000), fileData.substr(size-1000, 1000), "mem file slice at end"); +testFile(fileFile.slice(size-1000, 1000), fileData.substr(size-1000, 1000), "file file slice at end"); + +// slice across end +testFile(memFile.slice(size-500, 1000), fileData.substr(size-500, 500), "mem file slice across end"); +testFile(fileFile.slice(size-500, 1000), fileData.substr(size-500, 500), "file file slice across end"); + +// slice past end +testFile(memFile.slice(size, 1000), "", "mem file slice past end"); +testFile(fileFile.slice(size, 1000), "", "file file slice past end"); +testFile(memFile.slice(size + 1000, 1000), "", "mem file slice past end"); +testFile(fileFile.slice(size + 1000, 1000), "", "file file slice past end"); + + +// Try loading directly from slice into an image +var testBinaryData = ""; +for (var i = 0; i < 256; i++) { + testBinaryData += String.fromCharCode(i); +} +while (testBinaryData.length < 20000) { + testBinaryData += testBinaryData; +} +function imageLoadHandler(event) { + var origcanvas = $("canvas"); + var testcanvas = $("testcanvas"); + var image = event.target; + is(image.naturalWidth, origcanvas.width, "width correct"); + is(image.naturalHeight, origcanvas.height, "height correct"); + + testcanvas.width = origcanvas.width; + testcanvas.height = origcanvas.height; + testcanvas.getContext("2d").drawImage(image, 0, 0); + is(testcanvas.toDataURL("image/png"), origcanvas.toDataURL("image/png"), + "correct image data"); + + testHasRun(); +} + +// image in the middle +var imgfile = createFileWithData(testBinaryData + fileData + testBinaryData); +is(imgfile.size, size + testBinaryData.length * 2, "correct file size"); +var img = new Image; +img.src = createBlobURL(imgfile.slice(testBinaryData.length, size)); +img.onload = imageLoadHandler; +expectedTestCount++; + +// image at start +var imgfile = createFileWithData(fileData + testBinaryData); +is(imgfile.size, size + testBinaryData.length, "correct file size"); +var img = new Image; +img.src = createBlobURL(imgfile.slice(0, size)); +img.onload = imageLoadHandler; +expectedTestCount++; + +// image at end +var imgfile = createFileWithData(testBinaryData + fileData); +is(imgfile.size, size + testBinaryData.length, "correct file size"); +var img = new Image; +img.src = createBlobURL(imgfile.slice(testBinaryData.length, size)); +img.onload = imageLoadHandler; +expectedTestCount++; + +// image past end +var imgfile = createFileWithData(testBinaryData + fileData); +is(imgfile.size, size + testBinaryData.length, "correct file size"); +var img = new Image; +img.src = createBlobURL(imgfile.slice(testBinaryData.length, size + 1000)); +img.onload = imageLoadHandler; +expectedTestCount++; + + +// Utility functions +function testFile(file, contents, test) { + // Load file using FileReader + var r = new FileReader(); + r.onload = getFileReaderLoadHandler(contents, contents.length, "FileReader.readAsBinaryString of " + test); + r.readAsBinaryString(file); + expectedTestCount++; + + // Load file using createBlobURL and XMLHttpRequest + var xhr = new XMLHttpRequest; + xhr.open("GET", createBlobURL(file)); + xhr.onload = getXHRLoadHandler(contents, contents.length, false, + "XMLHttpRequest load of " + test); + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.send(); + expectedTestCount++; + + // Send file to server using FormData and XMLHttpRequest + xhr = new XMLHttpRequest(); + xhr.onload = function(event) { + checkMPSubmission(JSON.parse(event.target.responseText), + [{ name: "hello", value: "world"}, + { name: "myfile", + value: contents, + fileName: file.name || "", + contentType: file.type || "application/octet-stream" }]); + testHasRun(); + } + xhr.open("POST", "../../html/content/test/form_submit_server.sjs"); + var fd = new FormData; + fd.append("hello", "world"); + fd.append("myfile", file); + xhr.send(fd); + expectedTestCount++; + + // Send file to server using plain XMLHttpRequest + var xhr = new XMLHttpRequest; + xhr.open("POST", "file_XHRSendData.sjs"); + xhr.onload = function (event) { + is(event.target.getResponseHeader("Result-Content-Type"), + file.type ? file.type : null, + "request content-type in XMLHttpRequest send of " + test); + is(event.target.getResponseHeader("Result-Content-Length"), + file.size, + "request content-length in XMLHttpRequest send of " + test); + }; + xhr.addEventListener("load", + getXHRLoadHandler(contents, contents.length, true, + "XMLHttpRequest send of " + test), + false); + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.send(file); + expectedTestCount++; +} + +function getFileReaderLoadHandler(expectedResult, expectedLength, testName) { + return function (event) { + is(event.target.readyState, FileReader.DONE, + "readyState in test " + testName); + is(event.target.error, null, + "no error in test " + testName); + is(event.target.result, expectedResult, + "result in test " + testName); + is(event.lengthComputable, true, + "lengthComputable in test " + testName); + is(event.loaded, expectedLength, + "lengthComputable in test " + testName); + is(event.total, expectedLength, + "lengthComputable in test " + testName); + testHasRun(); + } +} + +function getXHRLoadHandler(expectedResult, expectedLength, statusWorking, testName) { + return function (event) { + is(event.target.readyState, 4, + "readyState in test " + testName); + if (statusWorking) { + is(event.target.status, 200, + "no error in test " + testName); + } + else { + todo(event.target.status, 200, + "no error in test " + testName); + } + is(convertXHRBinary(event.target.responseText), expectedResult, + "result in test " + testName); + is(event.lengthComputable, true, + "lengthComputable in test " + testName); + is(event.loaded, expectedLength, + "lengthComputable in test " + testName); + is(event.total, expectedLength, + "lengthComputable in test " + testName); + + testHasRun(); + } +} + +function convertXHRBinary(s) { + var res = ""; + for (var i = 0; i < s.length; ++i) { + res += String.fromCharCode(s.charCodeAt(i) & 255); + } + return res; +} + +function testHasRun() { + //alert(testRanCounter); + ++testRanCounter; + if (testRanCounter == expectedTestCount) { + SimpleTest.finish(); + } +} + +function createFileWithData(fileData) { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties); + var testFile = dirSvc.get("ProfD", Components.interfaces.nsIFile); + testFile.append("fileAPItestfile2-" + fileNum); + fileNum++; + var outStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); + outStream.init(testFile, 0x02 | 0x08 | 0x20, // write, create, truncate + 0666, 0); + outStream.write(fileData, fileData.length); + outStream.close(); + + var fileList = document.getElementById('fileList'); + fileList.value = testFile.path; + + return fileList.files[0]; +} + +function gc() { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIDOMWindowUtils) + .garbageCollect(); +} + +function checkMPSubmission(sub, expected) { + function getPropCount(o) { + var x, l = 0; + for (x in o) ++l; + return l; + } + + is(sub.length, expected.length, + "Correct number of items"); + var i; + for (i = 0; i < expected.length; ++i) { + if (!("fileName" in expected[i])) { + is(sub[i].headers["Content-Disposition"], + "form-data; name=\"" + expected[i].name + "\"", + "Correct name"); + is (getPropCount(sub[i].headers), 1, + "Wrong number of headers"); + } + else { + is(sub[i].headers["Content-Disposition"], + "form-data; name=\"" + expected[i].name + "\"; filename=\"" + + expected[i].fileName + "\"", + "Correct name"); + is(sub[i].headers["Content-Type"], + expected[i].contentType, + "Correct content type"); + is (getPropCount(sub[i].headers), 2, + "Wrong number of headers"); + } + is(sub[i].body, + expected[i].value, + "Correct value"); + } +} + +</script> +</pre> +</body> </html>
--- a/content/html/content/public/nsFormSubmission.h +++ b/content/html/content/public/nsFormSubmission.h @@ -47,17 +47,17 @@ class nsGenericHTMLElement; class nsILinkHandler; class nsIContent; class nsIFormControl; class nsIDOMHTMLElement; class nsIDocShell; class nsIRequest; class nsISaveAsCharset; class nsIMultiplexInputStream; -class nsIDOMFile; +class nsIDOMBlob; /** * Class for form submissions; encompasses the function to call to submit as * well as the form submission name/value pairs */ class nsFormSubmission { public: @@ -74,20 +74,20 @@ public: */ virtual nsresult AddNameValuePair(const nsAString& aName, const nsAString& aValue) = 0; /** * Submit a name/file pair * * @param aName the name of the parameter - * @param aFile the file to submit + * @param aBlob the file to submit */ virtual nsresult AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile) = 0; + nsIDOMBlob* aBlob) = 0; /** * Reports whether the instance supports AddIsindex(). * * @return true if supported. */ virtual PRBool SupportsIsindexSubmission() { @@ -183,17 +183,17 @@ public: */ nsFSMultipartFormData(const nsACString& aCharset, nsIContent* aOriginatingElement); ~nsFSMultipartFormData(); virtual nsresult AddNameValuePair(const nsAString& aName, const nsAString& aValue); virtual nsresult AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile); + nsIDOMBlob* aBlob); virtual nsresult GetEncodedSubmission(nsIURI* aURI, nsIInputStream** aPostDataStream); void GetContentType(nsACString& aContentType) { aContentType = NS_LITERAL_CSTRING("multipart/form-data; boundary=") + mBoundary; }
--- a/content/html/content/src/nsFormSubmission.cpp +++ b/content/html/content/src/nsFormSubmission.cpp @@ -104,17 +104,17 @@ public: mDocument(aDocument), mWarnedFileControl(PR_FALSE) { } virtual nsresult AddNameValuePair(const nsAString& aName, const nsAString& aValue); virtual nsresult AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile); + nsIDOMBlob* aBlob); virtual nsresult GetEncodedSubmission(nsIURI* aURI, nsIInputStream** aPostDataStream); virtual PRBool SupportsIsindexSubmission() { return PR_TRUE; } @@ -190,26 +190,27 @@ nsFSURLEncoded::AddIsindex(const nsAStri mQueryString += NS_LITERAL_CSTRING("&isindex=") + convValue; } return NS_OK; } nsresult nsFSURLEncoded::AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile) + nsIDOMBlob* aBlob) { if (!mWarnedFileControl) { SendJSWarning(mDocument, "ForgotFileEnctypeWarning", nsnull, 0); mWarnedFileControl = PR_TRUE; } nsAutoString filename; - if (aFile) { - aFile->GetName(filename); + nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob); + if (file) { + file->GetName(filename); } return AddNameValuePair(aName, filename); } static void HandleMailtoSubject(nsCString& aPath) { @@ -463,48 +464,51 @@ nsFSMultipartFormData::AddNameValuePair( + nameStr + NS_LITERAL_CSTRING("\"" CRLF CRLF) + valueStr + NS_LITERAL_CSTRING(CRLF); return NS_OK; } nsresult nsFSMultipartFormData::AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile) + nsIDOMBlob* aBlob) { // Encode the control name nsCAutoString nameStr; nsresult rv = EncodeVal(aName, nameStr); NS_ENSURE_SUCCESS(rv, rv); nsCString filenameStr; nsAutoString contentType; nsCOMPtr<nsIInputStream> fileStream; - if (aFile) { + if (aBlob) { // Get and encode the filename nsAutoString filename; - rv = aFile->GetName(filename); - NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob); + if (file) { + rv = file->GetName(filename); + NS_ENSURE_SUCCESS(rv, rv); + } nsCAutoString encodedFileName; rv = EncodeVal(filename, encodedFileName); NS_ENSURE_SUCCESS(rv, rv); filenameStr.Adopt(nsLinebreakConverter:: ConvertLineBreaks(encodedFileName.get(), nsLinebreakConverter::eLinebreakAny, nsLinebreakConverter::eLinebreakNet)); // Get content type - rv = aFile->GetType(contentType); + rv = aBlob->GetType(contentType); if (NS_FAILED(rv) || contentType.IsEmpty()) { contentType.AssignLiteral("application/octet-stream"); } // Get input stream - rv = aFile->GetInternalStream(getter_AddRefs(fileStream)); + rv = aBlob->GetInternalStream(getter_AddRefs(fileStream)); NS_ENSURE_SUCCESS(rv, rv); if (fileStream) { // Create buffered stream (for efficiency) nsCOMPtr<nsIInputStream> bufferedStream; rv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream), fileStream, 8192); NS_ENSURE_SUCCESS(rv, rv); @@ -595,17 +599,17 @@ public: nsFSTextPlain(const nsACString& aCharset, nsIContent* aOriginatingElement) : nsEncodingFormSubmission(aCharset, aOriginatingElement) { } virtual nsresult AddNameValuePair(const nsAString& aName, const nsAString& aValue); virtual nsresult AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile); + nsIDOMBlob* aBlob); virtual nsresult GetEncodedSubmission(nsIURI* aURI, nsIInputStream** aPostDataStream); private: nsString mBody; }; nsresult @@ -618,21 +622,22 @@ nsFSTextPlain::AddNameValuePair(const ns mBody.Append(aName + NS_LITERAL_STRING("=") + aValue + NS_LITERAL_STRING(CRLF)); return NS_OK; } nsresult nsFSTextPlain::AddNameFilePair(const nsAString& aName, - nsIDOMFile* aFile) + nsIDOMBlob* aBlob) { nsAutoString filename; - if (aFile) { - aFile->GetName(filename); + nsCOMPtr<nsIDOMFile> file = do_QueryInterface(aBlob); + if (file) { + file->GetName(filename); } AddNameValuePair(aName, filename); return NS_OK; } nsresult nsFSTextPlain::GetEncodedSubmission(nsIURI* aURI,
--- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -1317,16 +1317,18 @@ static nsDOMClassInfoData sClassInfoData NS_DEFINE_CLASSINFO_DATA(CommandEvent, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(OfflineResourceList, nsOfflineResourceListSH, ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(FileList, nsFileListSH, ARRAY_SCRIPTABLE_FLAGS) + NS_DEFINE_CLASSINFO_DATA(Blob, nsDOMGenericSH, + DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(File, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(FileException, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(FileError, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(FileReader, nsEventTargetSH, EVENTTARGET_SCRIPTABLE_FLAGS) @@ -3825,17 +3827,22 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_BEGIN(FileList, nsIDOMFileList) DOM_CLASSINFO_MAP_ENTRY(nsIDOMFileList) DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(FileError, nsIDOMFileError) DOM_CLASSINFO_MAP_ENTRY(nsIDOMFileError) DOM_CLASSINFO_MAP_END + DOM_CLASSINFO_MAP_BEGIN(Blob, nsIDOMBlob) + DOM_CLASSINFO_MAP_ENTRY(nsIDOMBlob) + DOM_CLASSINFO_MAP_END + DOM_CLASSINFO_MAP_BEGIN(File, nsIDOMFile) + DOM_CLASSINFO_MAP_ENTRY(nsIDOMBlob) DOM_CLASSINFO_MAP_ENTRY(nsIDOMFile) DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(FileException, nsIDOMFileException) DOM_CLASSINFO_MAP_ENTRY(nsIDOMFileException) DOM_CLASSINFO_MAP_ENTRY(nsIException) DOM_CLASSINFO_MAP_END
--- a/dom/base/nsDOMClassInfoClasses.h +++ b/dom/base/nsDOMClassInfoClasses.h @@ -397,16 +397,17 @@ DOMCI_CLASS(ClientRectList) DOMCI_CLASS(SVGForeignObjectElement) #endif DOMCI_CLASS(XULCommandEvent) DOMCI_CLASS(CommandEvent) DOMCI_CLASS(OfflineResourceList) DOMCI_CLASS(FileList) +DOMCI_CLASS(Blob) DOMCI_CLASS(File) DOMCI_CLASS(FileException) DOMCI_CLASS(FileError) DOMCI_CLASS(FileReader) // DOM modal content window class, almost identical to Window DOMCI_CLASS(ModalContentWindow) DOMCI_CLASS(InnerModalContentWindow)
--- a/dom/base/nsDOMClassInfoID.h +++ b/dom/base/nsDOMClassInfoID.h @@ -160,15 +160,26 @@ NS_GetDOMClassInfoInstance(nsDOMClassInf aIID.Equals(NS_GET_IID(nsXPCClassInfo))) { \ foundInterface = NS_GetDOMClassInfoInstance(eDOMClassInfo_##_class##_id); \ if (!foundInterface) { \ *aInstancePtr = nsnull; \ return NS_ERROR_OUT_OF_MEMORY; \ } \ } else +#define NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(_class, condition) \ + if ((condition) && \ + (aIID.Equals(NS_GET_IID(nsIClassInfo)) || \ + aIID.Equals(NS_GET_IID(nsXPCClassInfo)))) { \ + foundInterface = NS_GetDOMClassInfoInstance(eDOMClassInfo_##_class##_id); \ + if (!foundInterface) { \ + *aInstancePtr = nsnull; \ + return NS_ERROR_OUT_OF_MEMORY; \ + } \ + } else + #else // See nsIDOMClassInfo.h #endif // _IMPL_NS_LAYOUT #endif // nsDOMClassInfoID_h__
--- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -3059,25 +3059,25 @@ nsGlobalWindow::GetApplicationCache(nsID } NS_IF_ADDREF(*aApplicationCache = mApplicationCache); return NS_OK; } NS_IMETHODIMP -nsGlobalWindow::CreateBlobURL(nsIDOMFile* aFile, nsAString& aURL) -{ - FORWARD_TO_INNER(CreateBlobURL, (aFile, aURL), NS_ERROR_UNEXPECTED); +nsGlobalWindow::CreateBlobURL(nsIDOMBlob* aBlob, nsAString& aURL) +{ + FORWARD_TO_INNER(CreateBlobURL, (aBlob, aURL), NS_ERROR_UNEXPECTED); NS_ENSURE_STATE(mDoc); - NS_ENSURE_ARG_POINTER(aFile); - - nsresult rv = aFile->GetInternalUrl(mDoc->NodePrincipal(), aURL); + NS_ENSURE_ARG_POINTER(aBlob); + + nsresult rv = aBlob->GetInternalUrl(mDoc->NodePrincipal(), aURL); NS_ENSURE_SUCCESS(rv, rv); mDoc->RegisterFileDataUri(NS_LossyConvertUTF16toASCII(aURL)); return NS_OK; } NS_IMETHODIMP
--- a/dom/indexedDB/IDBEvents.cpp +++ b/dom/indexedDB/IDBEvents.cpp @@ -46,26 +46,16 @@ #include "nsContentUtils.h" #include "nsDOMClassInfo.h" #include "nsJSON.h" #include "nsThreadUtils.h" #include "IDBRequest.h" #include "IDBTransaction.h" -#define NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO_CONDITIONAL(_class, _condition) \ - if ((_condition) && (aIID.Equals(NS_GET_IID(nsIClassInfo)) || \ - aIID.Equals(NS_GET_IID(nsXPCClassInfo)))) { \ - foundInterface = NS_GetDOMClassInfoInstance(eDOMClassInfo_##_class##_id); \ - if (!foundInterface) { \ - *aInstancePtr = nsnull; \ - return NS_ERROR_OUT_OF_MEMORY; \ - } \ - } else - USING_INDEXEDDB_NAMESPACE namespace { template<class Class> inline nsIDOMEvent* idomevent_cast(Class* aClassPtr)
--- a/dom/interfaces/base/nsIDOMWindow2.idl +++ b/dom/interfaces/base/nsIDOMWindow2.idl @@ -33,19 +33,19 @@ * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "nsIDOMWindow.idl" interface nsIDOMOfflineResourceList; -interface nsIDOMFile; +interface nsIDOMBlob; -[scriptable, uuid(63239526-27b0-44ff-be4e-ee1c8ee2212e)] +[scriptable, uuid(efff0d88-3b94-4375-bdeb-676a847ecd7d)] interface nsIDOMWindow2 : nsIDOMWindow { /** * Get the window root for this window. This is useful for hooking * up event listeners to this window and every other window nested * in the window root. */ [noscript] readonly attribute nsIDOMEventTarget windowRoot; @@ -54,11 +54,11 @@ interface nsIDOMWindow2 : nsIDOMWindow * Get the application cache object for this window. */ readonly attribute nsIDOMOfflineResourceList applicationCache; /** * Create and revoke blob urls. createBlobURL will always return a new URL * with the lifetime of the current Document. */ - DOMString createBlobURL(in nsIDOMFile file); + DOMString createBlobURL(in nsIDOMBlob blob); void revokeBlobURL(in DOMString URL); };
--- a/netwerk/base/public/nsIFileStreams.idl +++ b/netwerk/base/public/nsIFileStreams.idl @@ -98,8 +98,39 @@ interface nsIFileOutputStream : nsIOutpu * @param perm file mode bits listed in prio.h or -1 to * use the default permissions (0664) * @param behaviorFlags flags specifying various behaviors of the class * (currently none supported) */ void init(in nsIFile file, in long ioFlags, in long perm, in long behaviorFlags); }; + +/** + * An input stream that allows you to read from a slice of a file. + */ +[scriptable, uuid(3ce03a2f-97f7-4375-b6bb-1788a60cad3b)] +interface nsIPartialFileInputStream : nsISupports +{ + /** + * Initialize with a file and new start/end positions. Both start and + * start+length must be smaller than the size of the file. Not doing so + * will lead to undefined behavior. + * You must initialize the stream, and only initialize it once, before it + * can be used. + * + * @param file file to read from (must QI to nsILocalFile) + * @param start start offset of slice to read. Must be smaller + * than the size of the file. + * @param length length of slice to read. Must be small enough that + * start+length is smaller than the size of the file. + * @param ioFlags file open flags listed in prio.h (see + * PR_Open documentation) or -1 to open the + * file in default mode (PR_RDONLY). + * @param perm file mode bits listed in prio.h or -1 to + * use the default value (0) + * @param behaviorFlags flags specifying various behaviors of the class + * (see enumerations in nsIFileInputStream) + */ + void init(in nsIFile file, in unsigned long long start, + in unsigned long long length, + in long ioFlags, in long perm, in long behaviorFlags); +};
--- a/netwerk/base/public/nsNetUtil.h +++ b/netwerk/base/public/nsNetUtil.h @@ -956,16 +956,36 @@ NS_NewLocalFileInputStream(nsIInputStrea rv = in->Init(file, ioFlags, perm, behaviorFlags); if (NS_SUCCEEDED(rv)) NS_ADDREF(*result = in); // cannot use nsCOMPtr::swap } return rv; } inline nsresult +NS_NewPartialLocalFileInputStream(nsIInputStream **result, + nsIFile *file, + PRUint64 offset, + PRUint64 length, + PRInt32 ioFlags = -1, + PRInt32 perm = -1, + PRInt32 behaviorFlags = 0) +{ + nsresult rv; + nsCOMPtr<nsIPartialFileInputStream> in = + do_CreateInstance(NS_PARTIALLOCALFILEINPUTSTREAM_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv)) { + rv = in->Init(file, offset, length, ioFlags, perm, behaviorFlags); + if (NS_SUCCEEDED(rv)) + rv = CallQueryInterface(in, result); + } + return rv; +} + +inline nsresult NS_NewLocalFileOutputStream(nsIOutputStream **result, nsIFile *file, PRInt32 ioFlags = -1, PRInt32 perm = -1, PRInt32 behaviorFlags = 0) { nsresult rv; nsCOMPtr<nsIFileOutputStream> out =
--- a/netwerk/base/src/nsFileStreams.cpp +++ b/netwerk/base/src/nsFileStreams.cpp @@ -168,17 +168,17 @@ nsFileStream::SetEOF() #endif return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // nsFileInputStream -NS_IMPL_ISUPPORTS_INHERITED3(nsFileInputStream, +NS_IMPL_ISUPPORTS_INHERITED3(nsFileInputStream, nsFileStream, nsIInputStream, nsIFileInputStream, nsILineInputStream) nsresult nsFileInputStream::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) { @@ -326,16 +326,20 @@ nsFileInputStream::ReadLine(nsACString& NS_IMETHODIMP nsFileInputStream::ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, PRUint32 aCount, PRUint32* aResult) { // ReadSegments is not implemented because it would be inefficient when // the writer does not consume all data. If you want to call ReadSegments, // wrap a BufferedInputStream around the file stream. That will call // Read(). + + // If this is ever implemented you might need to modify + // nsPartialFileInputStream::ReadSegments + return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsFileInputStream::IsNonBlocking(PRBool *aNonBlocking) { *aNonBlocking = PR_FALSE; return NS_OK; @@ -355,16 +359,125 @@ nsFileInputStream::Seek(PRInt32 aWhence, return NS_BASE_STREAM_CLOSED; } } return nsFileStream::Seek(aWhence, aOffset); } //////////////////////////////////////////////////////////////////////////////// +// nsPartialFileInputStream + +// Don't forward to nsFileInputStream as we don't want to QI to +// nsIFileInputStream +NS_IMPL_ISUPPORTS_INHERITED3(nsPartialFileInputStream, + nsFileStream, + nsIInputStream, + nsIPartialFileInputStream, + nsILineInputStream) + +nsresult +nsPartialFileInputStream::Create(nsISupports *aOuter, REFNSIID aIID, + void **aResult) +{ + NS_ENSURE_NO_AGGREGATION(aOuter); + + nsPartialFileInputStream* stream = new nsPartialFileInputStream(); + + NS_ADDREF(stream); + nsresult rv = stream->QueryInterface(aIID, aResult); + NS_RELEASE(stream); + return rv; +} + +NS_IMETHODIMP +nsPartialFileInputStream::Init(nsIFile* aFile, PRUint64 aStart, + PRUint64 aLength, PRInt32 aIOFlags, + PRInt32 aPerm, PRInt32 aBehaviorFlags) +{ + mStart = aStart; + mLength = aLength; + mPosition = 0; + + nsresult rv = nsFileInputStream::Init(aFile, aIOFlags, aPerm, + aBehaviorFlags); + NS_ENSURE_SUCCESS(rv, rv); + + return nsFileInputStream::Seek(NS_SEEK_SET, mStart); +} + +NS_IMETHODIMP +nsPartialFileInputStream::Tell(PRInt64 *aResult) +{ + PRInt64 tell; + nsresult rv = nsFileInputStream::Tell(&tell); + if (NS_SUCCEEDED(rv)) { + *aResult = tell - mStart; + } + return rv; +} + +NS_IMETHODIMP +nsPartialFileInputStream::Available(PRUint32* aResult) +{ + PRUint32 available; + nsresult rv = nsFileInputStream::Available(&available); + if (NS_SUCCEEDED(rv)) { + *aResult = TruncateSize(available); + } + return rv; +} + +NS_IMETHODIMP +nsPartialFileInputStream::Read(char* aBuf, PRUint32 aCount, PRUint32* aResult) +{ + PRUint32 readsize = TruncateSize(aCount); + if (readsize == 0 && mBehaviorFlags & CLOSE_ON_EOF) { + Close(); + *aResult = 0; + return NS_OK; + } + + nsresult rv = nsFileInputStream::Read(aBuf, readsize, aResult); + if (NS_SUCCEEDED(rv)) { + mPosition += readsize; + } + return rv; +} + +NS_IMETHODIMP +nsPartialFileInputStream::Seek(PRInt32 aWhence, PRInt64 aOffset) +{ + PRInt64 offset; + switch (aWhence) { + case NS_SEEK_SET: + offset = mStart + aOffset; + break; + case NS_SEEK_CUR: + offset = mStart + mPosition + aOffset; + break; + case NS_SEEK_END: + offset = mStart + mLength + aOffset; + break; + default: + return NS_ERROR_ILLEGAL_VALUE; + } + + if (offset < (PRInt64)mStart || offset > (PRInt64)(mStart + mLength)) { + return NS_ERROR_INVALID_ARG; + } + + nsresult rv = nsFileInputStream::Seek(NS_SEEK_SET, offset); + if (NS_SUCCEEDED(rv)) { + mPosition = offset - mStart; + } + return rv; +} + +//////////////////////////////////////////////////////////////////////////////// // nsFileOutputStream NS_IMPL_ISUPPORTS_INHERITED2(nsFileOutputStream, nsFileStream, nsIOutputStream, nsIFileOutputStream) nsresult
--- a/netwerk/base/src/nsFileStreams.h +++ b/netwerk/base/src/nsFileStreams.h @@ -132,16 +132,43 @@ protected: /** * Reopen the file (for OPEN_ON_READ only!) */ nsresult Reopen() { return Open(mFile, mIOFlags, mPerm); } }; //////////////////////////////////////////////////////////////////////////////// +class nsPartialFileInputStream : public nsFileInputStream, + public nsIPartialFileInputStream +{ +public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_NSIPARTIALFILEINPUTSTREAM + + NS_IMETHOD Tell(PRInt64 *aResult); + NS_IMETHOD Available(PRUint32 *aResult); + NS_IMETHOD Read(char* aBuf, PRUint32 aCount, PRUint32* aResult); + NS_IMETHOD Seek(PRInt32 aWhence, PRInt64 aOffset); + + static nsresult + Create(nsISupports *aOuter, REFNSIID aIID, void **aResult); + +private: + PRUint32 TruncateSize(PRUint32 aSize) { + return (PRUint32)PR_MIN(mLength - mPosition, (PRUint64)aSize); + } + + PRUint64 mStart; + PRUint64 mLength; + PRUint64 mPosition; +}; + +//////////////////////////////////////////////////////////////////////////////// + class nsFileOutputStream : public nsFileStream, public nsIFileOutputStream { public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSIOUTPUTSTREAM NS_DECL_NSIFILEOUTPUTSTREAM
--- a/netwerk/build/nsNetCID.h +++ b/netwerk/build/nsNetCID.h @@ -398,16 +398,28 @@ #define NS_LOCALFILEOUTPUTSTREAM_CID \ { /* c272fee0-c7e9-11d3-8cda-0060b0fc14a3 */ \ 0xc272fee0, \ 0xc7e9, \ 0x11d3, \ {0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \ } +#define NS_PARTIALLOCALFILEINPUTSTREAM_CLASSNAME \ + "nsPartialFileInputStream" +#define NS_PARTIALLOCALFILEINPUTSTREAM_CONTRACTID \ + "@mozilla.org/network/partial-file-input-stream;1" +#define NS_PARTIALLOCALFILEINPUTSTREAM_CID \ +{ /* 8738afd6-162a-418d-a99b-75b3a6b10a56 */ \ + 0x8738afd6, \ + 0x162a, \ + 0x418d, \ + {0xa9, 0x9b, 0x75, 0xb3, 0xa6, 0xb1, 0x0a, 0x56} \ +} + #define NS_BUFFEREDINPUTSTREAM_CLASSNAME \ "nsBufferedInputStream" #define NS_BUFFEREDINPUTSTREAM_CONTRACTID \ "@mozilla.org/network/buffered-input-stream;1" #define NS_BUFFEREDINPUTSTREAM_CID \ { /* 9226888e-da08-11d3-8cda-0060b0fc14a3 */ \ 0x9226888e, \ 0xda08, \
--- a/netwerk/build/nsNetModule.cpp +++ b/netwerk/build/nsNetModule.cpp @@ -629,16 +629,17 @@ NS_DEFINE_NAMED_CID(NS_UNICHARSTREAMLOAD NS_DEFINE_NAMED_CID(NS_DOWNLOADER_CID); NS_DEFINE_NAMED_CID(NS_SYNCSTREAMLISTENER_CID); NS_DEFINE_NAMED_CID(NS_REQUESTOBSERVERPROXY_CID); NS_DEFINE_NAMED_CID(NS_SIMPLESTREAMLISTENER_CID); NS_DEFINE_NAMED_CID(NS_STREAMLISTENERTEE_CID); NS_DEFINE_NAMED_CID(NS_LOADGROUP_CID); NS_DEFINE_NAMED_CID(NS_LOCALFILEINPUTSTREAM_CID); NS_DEFINE_NAMED_CID(NS_LOCALFILEOUTPUTSTREAM_CID); +NS_DEFINE_NAMED_CID(NS_PARTIALLOCALFILEINPUTSTREAM_CID); NS_DEFINE_NAMED_CID(NS_SAFELOCALFILEOUTPUTSTREAM_CID); NS_DEFINE_NAMED_CID(NS_URICHECKER_CID); NS_DEFINE_NAMED_CID(NS_INCREMENTALDOWNLOAD_CID); NS_DEFINE_NAMED_CID(NS_STDURLPARSER_CID); NS_DEFINE_NAMED_CID(NS_NOAUTHURLPARSER_CID); NS_DEFINE_NAMED_CID(NS_AUTHURLPARSER_CID); NS_DEFINE_NAMED_CID(NS_STANDARDURL_CID); NS_DEFINE_NAMED_CID(NS_BUFFEREDINPUTSTREAM_CID); @@ -749,16 +750,17 @@ static const mozilla::Module::CIDEntry k { &kNS_DOWNLOADER_CID, false, NULL, nsDownloaderConstructor }, { &kNS_SYNCSTREAMLISTENER_CID, false, NULL, nsSyncStreamListenerConstructor }, { &kNS_REQUESTOBSERVERPROXY_CID, false, NULL, nsRequestObserverProxyConstructor }, { &kNS_SIMPLESTREAMLISTENER_CID, false, NULL, nsSimpleStreamListenerConstructor }, { &kNS_STREAMLISTENERTEE_CID, false, NULL, nsStreamListenerTeeConstructor }, { &kNS_LOADGROUP_CID, false, NULL, nsLoadGroupConstructor }, { &kNS_LOCALFILEINPUTSTREAM_CID, false, NULL, nsFileInputStream::Create }, { &kNS_LOCALFILEOUTPUTSTREAM_CID, false, NULL, nsFileOutputStream::Create }, + { &kNS_PARTIALLOCALFILEINPUTSTREAM_CID, false, NULL, nsPartialFileInputStream::Create }, { &kNS_SAFELOCALFILEOUTPUTSTREAM_CID, false, NULL, nsSafeFileOutputStreamConstructor }, { &kNS_URICHECKER_CID, false, NULL, nsURICheckerConstructor }, { &kNS_INCREMENTALDOWNLOAD_CID, false, NULL, net_NewIncrementalDownload }, { &kNS_STDURLPARSER_CID, false, NULL, nsStdURLParserConstructor }, { &kNS_NOAUTHURLPARSER_CID, false, NULL, nsNoAuthURLParserConstructor }, { &kNS_AUTHURLPARSER_CID, false, NULL, nsAuthURLParserConstructor }, { &kNS_STANDARDURL_CID, false, NULL, nsStandardURLConstructor }, { &kNS_BUFFEREDINPUTSTREAM_CID, false, NULL, nsBufferedInputStream::Create }, @@ -871,16 +873,17 @@ static const mozilla::Module::ContractID { NS_DOWNLOADER_CONTRACTID, &kNS_DOWNLOADER_CID }, { NS_SYNCSTREAMLISTENER_CONTRACTID, &kNS_SYNCSTREAMLISTENER_CID }, { NS_REQUESTOBSERVERPROXY_CONTRACTID, &kNS_REQUESTOBSERVERPROXY_CID }, { NS_SIMPLESTREAMLISTENER_CONTRACTID, &kNS_SIMPLESTREAMLISTENER_CID }, { NS_STREAMLISTENERTEE_CONTRACTID, &kNS_STREAMLISTENERTEE_CID }, { NS_LOADGROUP_CONTRACTID, &kNS_LOADGROUP_CID }, { NS_LOCALFILEINPUTSTREAM_CONTRACTID, &kNS_LOCALFILEINPUTSTREAM_CID }, { NS_LOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_LOCALFILEOUTPUTSTREAM_CID }, + { NS_PARTIALLOCALFILEINPUTSTREAM_CONTRACTID, &kNS_PARTIALLOCALFILEINPUTSTREAM_CID }, { NS_SAFELOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_SAFELOCALFILEOUTPUTSTREAM_CID }, { NS_URICHECKER_CONTRACT_ID, &kNS_URICHECKER_CID }, { NS_INCREMENTALDOWNLOAD_CONTRACTID, &kNS_INCREMENTALDOWNLOAD_CID }, { NS_STDURLPARSER_CONTRACTID, &kNS_STDURLPARSER_CID }, { NS_NOAUTHURLPARSER_CONTRACTID, &kNS_NOAUTHURLPARSER_CID }, { NS_AUTHURLPARSER_CONTRACTID, &kNS_AUTHURLPARSER_CID }, { NS_STANDARDURL_CONTRACTID, &kNS_STANDARDURL_CID }, { NS_BUFFEREDINPUTSTREAM_CONTRACTID, &kNS_BUFFEREDINPUTSTREAM_CID },
new file mode 100644 index 0000000000000000000000000000000000000000..e0c5d3d6a1b305a48e1bffbcbe7405bc8b611bb7 GIT binary patch literal 102591 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%0Dk2=G7>9R&AbLCJ!!P0#Z%9wDT?$O5i`kt_*ZQ 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%0A;1M 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 Qo`~=qvv(yn;>ooC0}bz&*Z=?k
new file mode 100644 --- /dev/null +++ b/netwerk/test/unit/test_file_partial_inputstream.js @@ -0,0 +1,556 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Mats Palmgren. + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Mats Palmgren <mats.palmgren@bredband.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// Test nsIPartialFileInputStream +// NOTE! These tests often use do_check_true(a == b) rather than +// do_check_eq(a, b) to avoid outputting characters which confuse +// the console + +const Cc = Components.classes; +const Ci = Components.interfaces; +const CC = Components.Constructor; +const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", + "nsIBinaryInputStream", + "setInputStream"); +const PR_RDONLY = 0x1; // see prio.h + +// We need the profile directory so the test harness will clean up our test +// files. +do_get_profile(); + +var binary_test_file_name = "data/image.png"; +var text_test_file_name = "test_file_partial_inputstream.js"; +// This is a global variable since if it's passed as an argument stack traces +// become unreadable. +var test_file_data; + +function run_test() +{ + if ("@mozilla.org/windows-registry-key;1" in Components.classes) { + do_check_eq("file creation fails randomly", "file creation fails randomly"); + return; + } + // Binary tests + let binaryFile = do_get_file(binary_test_file_name); + let size = binaryFile.fileSize; + // Want to make sure we're working with a large enough file + dump("**** binary file size is: " + size + " ****\n"); + do_check_true(size > 65536); + + let binaryStream = new BinaryInputStream(new_file_input_stream(binaryFile)); + test_file_data = ""; + while ((avail = binaryStream.available()) > 0) { + test_file_data += binaryStream.readBytes(avail); + } + do_check_eq(test_file_data.length, size); + binaryStream.close(); + + test_binary_portion(0, 10); + test_binary_portion(0, 20000); + test_binary_portion(0, size); + test_binary_portion(20000, 10); + test_binary_portion(20000, 20000); + test_binary_portion(20000, size-20000); + test_binary_portion(size-10, 10); + test_binary_portion(size-20000, 20000); + test_binary_portion(0, 0); + test_binary_portion(20000, 0); + test_binary_portion(size-1, 1); + + + // Text-file tests + let textFile = do_get_file(binary_test_file_name); + size = textFile.fileSize; + // Want to make sure we're working with a large enough file + dump("**** text file size is: " + size + " ****\n"); + do_check_true(size > 7000); + + let textStream = new BinaryInputStream(new_file_input_stream(textFile)); + test_file_data = ""; + while ((avail = textStream.available()) > 0) + test_file_data += textStream.readBytes(avail); + do_check_eq(test_file_data.length, size); + textStream.close(); + + test_text_portion(0, 100); + test_text_portion(0, size); + test_text_portion(5000, 1000); + test_text_portion(size-10, 10); + test_text_portion(size-5000, 5000); + test_text_portion(10, 0); + test_text_portion(size-1, 1); + + // Test auto-closing files + // Test behavior when *not* autoclosing + let tempFile = create_temp_file("01234567890123456789"); + let tempInputStream = new_partial_file_input_stream(tempFile, 5, 10); + tempInputStream.QueryInterface(Ci.nsILineInputStream); + do_check_eq(read_line_stream(tempInputStream)[1], "5678901234"); + try { + // This fails on some platforms + tempFile.remove(false); + } + catch (ex) { + } + tempInputStream.QueryInterface(Ci.nsISeekableStream); + tempInputStream.seek(SET, 1); + do_check_eq(read_line_stream(tempInputStream)[1], "678901234"); + + // Test removing the file when autoclosing + tempFile = create_temp_file("01234567890123456789"); + tempInputStream = new_partial_file_input_stream(tempFile, 5, 10, + Ci.nsIFileInputStream.CLOSE_ON_EOF | + Ci.nsIFileInputStream.REOPEN_ON_REWIND); + tempInputStream.QueryInterface(Ci.nsILineInputStream); + do_check_eq(read_line_stream(tempInputStream)[1], "5678901234"); + tempFile.remove(false); + tempInputStream.QueryInterface(Ci.nsISeekableStream); + try { + // The seek should reopen the file, which should fail. + tempInputStream.seek(SET, 1); + do_check_true(false); + } + catch (ex) { + } + + // Test editing the file when autoclosing + tempFile = create_temp_file("01234567890123456789"); + tempInputStream = new_partial_file_input_stream(tempFile, 5, 10, + Ci.nsIFileInputStream.CLOSE_ON_EOF | + Ci.nsIFileInputStream.REOPEN_ON_REWIND); + tempInputStream.QueryInterface(Ci.nsILineInputStream); + do_check_eq(read_line_stream(tempInputStream)[1], "5678901234"); + let ostream = Cc["@mozilla.org/network/file-output-stream;1"]. + createInstance(Ci.nsIFileOutputStream); + ostream.init(tempFile, 0x02 | 0x08 | 0x20, // write, create, truncate + 0666, 0); + let newData = "abcdefghijklmnopqrstuvwxyz"; + ostream.write(newData, newData.length); + ostream.close(); + tempInputStream.QueryInterface(Ci.nsISeekableStream); + tempInputStream.seek(SET, 1); + do_check_eq(read_line_stream(tempInputStream)[1], newData.substr(6,9)); + + // Test auto-delete and auto-close together + tempFile = create_temp_file("01234567890123456789"); + tempInputStream = new_partial_file_input_stream(tempFile, 5, 10, + Ci.nsIFileInputStream.CLOSE_ON_EOF | + Ci.nsIFileInputStream.DELETE_ON_CLOSE); + tempInputStream.QueryInterface(Ci.nsILineInputStream); + do_check_eq(read_line_stream(tempInputStream)[1], "5678901234"); + do_check_false(tempFile.exists()); +} + +function test_binary_portion(start, length) { + let subFile = create_temp_file(test_file_data.substr(start, length)); + do_check_eq(subFile.fileSize, length); + + let streamTests = [ + test_4k_read, + test_max_read, + test_seek, + test_seek_then_read, + ]; + + for each(test in streamTests) { + let fileStream = new_file_input_stream(subFile); + let partialStream = new_partial_file_input_stream(do_get_file(binary_test_file_name), + start, length); + test(fileStream, partialStream, length); + fileStream.close(); + partialStream.close(); + } +} + +function test_4k_read(fileStreamA, fileStreamB) { + fileStreamA.QueryInterface(Ci.nsISeekableStream); + fileStreamB.QueryInterface(Ci.nsISeekableStream); + let streamA = new BinaryInputStream(fileStreamA); + let streamB = new BinaryInputStream(fileStreamB); + + while(1) { + do_check_eq(fileStreamA.tell(), fileStreamB.tell()); + + let availA = streamA.available(); + let availB = streamB.available(); + do_check_eq(availA, availB); + if (availA == 0) + return; + + let readSize = availA > 4096 ? 4096 : availA; + + do_check_true(streamA.readBytes(readSize) == + streamB.readBytes(readSize)); + } +} + +function test_max_read(fileStreamA, fileStreamB) { + fileStreamA.QueryInterface(Ci.nsISeekableStream); + fileStreamB.QueryInterface(Ci.nsISeekableStream); + let streamA = new BinaryInputStream(fileStreamA); + let streamB = new BinaryInputStream(fileStreamB); + + while(1) { + do_check_eq(fileStreamA.tell(), fileStreamB.tell()); + + let availA = streamA.available(); + let availB = streamB.available(); + do_check_eq(availA, availB); + if (availA == 0) + return; + + do_check_true(streamA.readBytes(availA) == + streamB.readBytes(availB)); + } +} + +const SET = Ci.nsISeekableStream.NS_SEEK_SET; +const CUR = Ci.nsISeekableStream.NS_SEEK_CUR; +const END = Ci.nsISeekableStream.NS_SEEK_END; +function test_seek(dummy, partialFileStream, size) { + // We can't test the "real" filestream here as our existing file streams + // are very broken and allows searching past the end of the file. + + partialFileStream.QueryInterface(Ci.nsISeekableStream); + + tests = [ + [SET, 0], + [SET, 5], + [SET, 1000], + [SET, size-10], + [SET, size-5], + [SET, size-1], + [SET, size], + [SET, size+10], + [SET, 0], + [CUR, 5], + [CUR, -5], + [SET, 5000], + [CUR, -100], + [CUR, 200], + [CUR, -5000], + [CUR, 5000], + [CUR, size * 2], + [SET, 1], + [CUR, -1], + [CUR, -1], + [CUR, -1], + [CUR, -1], + [CUR, -1], + [SET, size-1], + [CUR, 1], + [CUR, 1], + [CUR, 1], + [CUR, 1], + [CUR, 1], + [END, 0], + [END, -1], + [END, -5], + [END, -1000], + [END, -size+10], + [END, -size+5], + [END, -size+1], + [END, -size], + [END, -size-10], + [END, 10], + [CUR, 10], + [CUR, 10], + [CUR, 100], + [CUR, 1000], + [END, -1000], + [CUR, 100], + [CUR, 900], + [CUR, 100], + [CUR, 100], + ]; + + let pos = 0; + for each(test in tests) { + let didThrow = false; + try { + partialFileStream.seek(test[0], test[1]); + } + catch (ex) { + didThrow = true; + } + + let newPos = test[0] == SET ? test[1] : + test[0] == CUR ? pos + test[1] : + size + test[1]; + if (newPos > size || newPos < 0) { + do_check_true(didThrow); + } + else { + do_check_false(didThrow); + pos = newPos; + } + + do_check_eq(partialFileStream.tell(), pos); + do_check_eq(partialFileStream.available(), size - pos); + } +} + +function test_seek_then_read(fileStreamA, fileStreamB, size) { + // For now we only test seeking inside the file since our existing file + // streams behave very strange when seeking to past the end of the file. + if (size < 20000) { + return; + } + + fileStreamA.QueryInterface(Ci.nsISeekableStream); + fileStreamB.QueryInterface(Ci.nsISeekableStream); + let streamA = new BinaryInputStream(fileStreamA); + let streamB = new BinaryInputStream(fileStreamB); + + let read = {}; + + tests = [ + [SET, 0], + [read, 1000], + [read, 1000], + [SET, 5], + [read, 1000], + [read, 5000], + [CUR, 100], + [read, 1000], + [read, 5000], + [CUR, -100], + [read, 1000], + [CUR, -100], + [read, 5000], + [END, -10], + [read, 10], + [END, -100], + [read, 101], + [CUR, -100], + [read, 10], + [SET, 0], + [read, 20000], + [read, 1], + [read, 100], + ]; + + for each(test in tests) { + if (test[0] === read) { + + let didThrowA = false; + let didThrowB = false; + + let bytesA, bytesB; + try { + bytesA = streamA.readBytes(test[1]); + } + catch (ex) { + didThrowA = true; + } + try { + bytesB = streamB.readBytes(test[1]); + } + catch (ex) { + didThrowB = true; + } + + do_check_eq(didThrowA, didThrowB); + do_check_true(bytesA == bytesB); + } + else { + fileStreamA.seek(test[0], test[1]); + fileStreamB.seek(test[0], test[1]); + } + do_check_eq(fileStreamA.tell(), fileStreamB.tell()); + do_check_eq(fileStreamA.available(), fileStreamB.available()); + } +} + +function test_text_portion(start, length) { + let subFile = create_temp_file(test_file_data.substr(start, length)); + do_check_eq(subFile.fileSize, length); + + let streamTests = [ + test_readline, + test_seek_then_readline, + ]; + + for each(test in streamTests) { + let fileStream = new_file_input_stream(subFile) + .QueryInterface(Ci.nsILineInputStream); + let partialStream = new_partial_file_input_stream(do_get_file(binary_test_file_name), + start, length) + .QueryInterface(Ci.nsILineInputStream); + test(fileStream, partialStream, length); + fileStream.close(); + partialStream.close(); + } +} + +function test_readline(fileStreamA, fileStreamB) +{ + let moreA = true, moreB; + while(moreA) { + let lineA, lineB; + [moreA, lineA] = read_line_stream(fileStreamA); + [moreB, lineB] = read_line_stream(fileStreamB); + do_check_eq(moreA, moreB); + do_check_true(lineA.value == lineB.value); + } +} + +function test_seek_then_readline(fileStreamA, fileStreamB, size) { + // For now we only test seeking inside the file since our existing file + // streams behave very strange when seeking to past the end of the file. + if (size < 100) { + return; + } + + fileStreamA.QueryInterface(Ci.nsISeekableStream); + fileStreamB.QueryInterface(Ci.nsISeekableStream); + + let read = {}; + + tests = [ + [SET, 0], + [read, 5], + [read, 5], + [SET, 5], + [read, 5], + [read, 15], + [CUR, 100], + [read, 5], + [read, 15], + [CUR, -100], + [read, 5], + [CUR, -100], + [read, 25], + [END, -10], + [read, 1], + [END, -50], + [read, 30], + [read, 1], + [read, 1], + [CUR, -100], + [read, 1], + [SET, 0], + [read, 10000], + [read, 1], + [read, 1], + [SET, 0], + [read, 1], + ]; + + for each(test in tests) { + if (test[0] === read) { + + for (let i = 0; i < test[1]; ++i) { + let didThrowA = false; + let didThrowB = false; + + let lineA, lineB, moreA, moreB; + try { + [moreA, lineA] = read_line_stream(fileStreamA); + } + catch (ex) { + didThrowA = true; + } + try { + [moreB, lineB] = read_line_stream(fileStreamB); + } + catch (ex) { + didThrowB = true; + } + + do_check_eq(didThrowA, didThrowB); + do_check_eq(moreA, moreB); + do_check_true(lineA == lineB); + do_check_eq(fileStreamA.tell(), fileStreamB.tell()); + do_check_eq(fileStreamA.available(), fileStreamB.available()); + if (!moreA) + break; + } + } + else { + if (!(test[0] == CUR && (test[1] > fileStreamA.available() || + test[1] < -fileStreamA.tell()))) { + fileStreamA.seek(test[0], test[1]); + fileStreamB.seek(test[0], test[1]); + do_check_eq(fileStreamA.tell(), fileStreamB.tell()); + do_check_eq(fileStreamA.available(), fileStreamB.available()); + } + } + } +} + +function read_line_stream(stream) { + let line = {}; + let more = stream.readLine(line); + return [more, line.value]; +} + +function new_file_input_stream(file) { + var stream = + Cc["@mozilla.org/network/file-input-stream;1"] + .createInstance(Ci.nsIFileInputStream); + stream.init(file, PR_RDONLY, 0, 0); + return stream.QueryInterface(Ci.nsIInputStream); +} + +function new_partial_file_input_stream(file, start, length, flags) { + var stream = + Cc["@mozilla.org/network/partial-file-input-stream;1"] + .createInstance(Ci.nsIPartialFileInputStream); + stream.init(file, start, length, PR_RDONLY, 0, flags || 0); + return stream.QueryInterface(Ci.nsIInputStream); +} + +function create_temp_file(data) { + let file = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties). + get("ProfD", Ci.nsIFile); + file.append("fileinputstream-test-file.tmp"); + file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0666); + + let ostream = Cc["@mozilla.org/network/file-output-stream;1"]. + createInstance(Ci.nsIFileOutputStream); + //ostream.init(file, 0x02 | 0x08 | 0x20, // write, create, truncate + // 0666, 0); + ostream.init(file, -1, -1, 0); + ostream.write(data, data.length); + ostream.close(); + + dump("**** created temporary file " + file.path + " with size " + + file.fileSize + " ****\n"); + + return file; +}