зеркало из https://github.com/mozilla/gecko-dev.git
Bug 632255 - Implemented readAsArrayBuffer() for FileReader. r=sicking,bent a=LandingQueue
This commit is contained in:
Родитель
bad3d69b34
Коммит
4cab7cce39
|
@ -41,9 +41,11 @@ interface nsIDOMEventListener;
|
||||||
interface nsIDOMBlob;
|
interface nsIDOMBlob;
|
||||||
interface nsIDOMFileError;
|
interface nsIDOMFileError;
|
||||||
|
|
||||||
[scriptable, uuid(f186170f-f07c-4f0b-9e3c-08f7dd496e74)]
|
[scriptable, uuid(3d77e784-1459-4206-b8a2-0855d826f569)]
|
||||||
interface nsIDOMFileReader : nsISupports
|
interface nsIDOMFileReader : nsISupports
|
||||||
{
|
{
|
||||||
|
[implicit_jscontext]
|
||||||
|
void readAsArrayBuffer(in nsIDOMBlob filedata);
|
||||||
void readAsBinaryString(in nsIDOMBlob filedata);
|
void readAsBinaryString(in nsIDOMBlob filedata);
|
||||||
void readAsText(in nsIDOMBlob filedata, [optional] in DOMString encoding);
|
void readAsText(in nsIDOMBlob filedata, [optional] in DOMString encoding);
|
||||||
void readAsDataURL(in nsIDOMBlob file);
|
void readAsDataURL(in nsIDOMBlob file);
|
||||||
|
@ -55,7 +57,8 @@ interface nsIDOMFileReader : nsISupports
|
||||||
const unsigned short DONE = 2;
|
const unsigned short DONE = 2;
|
||||||
readonly attribute unsigned short readyState;
|
readonly attribute unsigned short readyState;
|
||||||
|
|
||||||
readonly attribute DOMString result;
|
[implicit_jscontext]
|
||||||
|
readonly attribute jsval result;
|
||||||
readonly attribute nsIDOMFileError error;
|
readonly attribute nsIDOMFileError error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,9 @@
|
||||||
#include "nsLayoutStatics.h"
|
#include "nsLayoutStatics.h"
|
||||||
#include "nsIScriptObjectPrincipal.h"
|
#include "nsIScriptObjectPrincipal.h"
|
||||||
#include "nsFileDataProtocolHandler.h"
|
#include "nsFileDataProtocolHandler.h"
|
||||||
|
#include "xpcprivate.h"
|
||||||
|
#include "xpcquickstubs.h"
|
||||||
|
#include "jstypedarray.h"
|
||||||
|
|
||||||
#define LOAD_STR "load"
|
#define LOAD_STR "load"
|
||||||
#define ERROR_STR "error"
|
#define ERROR_STR "error"
|
||||||
|
@ -93,6 +96,7 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(nsDOMFileReader)
|
||||||
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsDOMFileReader,
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsDOMFileReader,
|
||||||
nsXHREventTarget)
|
nsXHREventTarget)
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mFile)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mFile)
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mProgressNotifier)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mProgressNotifier)
|
||||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mPrincipal)
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mPrincipal)
|
||||||
|
@ -101,12 +105,21 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||||
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsDOMFileReader,
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsDOMFileReader,
|
||||||
nsXHREventTarget)
|
nsXHREventTarget)
|
||||||
|
tmp->UnrootResultArrayBuffer();
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mFile)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mFile)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mProgressNotifier)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mProgressNotifier)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mPrincipal)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mPrincipal)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mChannel)
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mChannel)
|
||||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||||
|
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(nsDOMFileReader,
|
||||||
|
nsXHREventTarget)
|
||||||
|
if(tmp->mResultArrayBuffer) {
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRACE_JS_CALLBACK(tmp->mResultArrayBuffer,
|
||||||
|
"mResultArrayBuffer")
|
||||||
|
}
|
||||||
|
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
||||||
|
|
||||||
DOMCI_DATA(FileReader, nsDOMFileReader)
|
DOMCI_DATA(FileReader, nsDOMFileReader)
|
||||||
|
|
||||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMFileReader)
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMFileReader)
|
||||||
|
@ -123,6 +136,19 @@ NS_INTERFACE_MAP_END_INHERITING(nsXHREventTarget)
|
||||||
NS_IMPL_ADDREF_INHERITED(nsDOMFileReader, nsXHREventTarget)
|
NS_IMPL_ADDREF_INHERITED(nsDOMFileReader, nsXHREventTarget)
|
||||||
NS_IMPL_RELEASE_INHERITED(nsDOMFileReader, nsXHREventTarget)
|
NS_IMPL_RELEASE_INHERITED(nsDOMFileReader, nsXHREventTarget)
|
||||||
|
|
||||||
|
//array buffer holder root/unroot
|
||||||
|
void
|
||||||
|
nsDOMFileReader::RootResultArrayBuffer()
|
||||||
|
{
|
||||||
|
NS_HOLD_JS_OBJECTS(this, nsDOMFileReader);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsDOMFileReader::UnrootResultArrayBuffer()
|
||||||
|
{
|
||||||
|
NS_DROP_JS_OBJECTS(this, nsDOMFileReader);
|
||||||
|
}
|
||||||
|
|
||||||
//nsICharsetDetectionObserver
|
//nsICharsetDetectionObserver
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -137,16 +163,20 @@ nsDOMFileReader::Notify(const char *aCharset, nsDetectionConfident aConf)
|
||||||
nsDOMFileReader::nsDOMFileReader()
|
nsDOMFileReader::nsDOMFileReader()
|
||||||
: mFileData(nsnull),
|
: mFileData(nsnull),
|
||||||
mDataLen(0), mDataFormat(FILE_AS_BINARY),
|
mDataLen(0), mDataFormat(FILE_AS_BINARY),
|
||||||
|
mResultArrayBuffer(nsnull),
|
||||||
mReadyState(nsIDOMFileReader::EMPTY),
|
mReadyState(nsIDOMFileReader::EMPTY),
|
||||||
mProgressEventWasDelayed(PR_FALSE),
|
mProgressEventWasDelayed(PR_FALSE),
|
||||||
mTimerIsActive(PR_FALSE),
|
mTimerIsActive(PR_FALSE),
|
||||||
mReadTotal(0), mReadTransferred(0)
|
mReadTotal(0), mReadTransferred(0)
|
||||||
{
|
{
|
||||||
nsLayoutStatics::AddRef();
|
nsLayoutStatics::AddRef();
|
||||||
|
SetDOMStringToNull(mResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsDOMFileReader::~nsDOMFileReader()
|
nsDOMFileReader::~nsDOMFileReader()
|
||||||
{
|
{
|
||||||
|
UnrootResultArrayBuffer();
|
||||||
|
|
||||||
if (mListenerManager)
|
if (mListenerManager)
|
||||||
mListenerManager->Disconnect();
|
mListenerManager->Disconnect();
|
||||||
|
|
||||||
|
@ -235,9 +265,21 @@ nsDOMFileReader::GetReadyState(PRUint16 *aReadyState)
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDOMFileReader::GetResult(nsAString& aResult)
|
nsDOMFileReader::GetResult(JSContext* aCx, jsval* aResult)
|
||||||
{
|
{
|
||||||
aResult = mResult;
|
if (mDataFormat == FILE_AS_ARRAYBUFFER) {
|
||||||
|
if (mReadyState == nsIDOMFileReader::DONE) {
|
||||||
|
*aResult = OBJECT_TO_JSVAL(mResultArrayBuffer);
|
||||||
|
} else {
|
||||||
|
*aResult = JSVAL_NULL;
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsString tmpResult = mResult;
|
||||||
|
if (!xpc_qsStringToJsval(aCx, tmpResult, aResult)) {
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,23 +290,29 @@ nsDOMFileReader::GetError(nsIDOMFileError** aError)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsDOMFileReader::ReadAsArrayBuffer(nsIDOMBlob* aFile, JSContext* aCx)
|
||||||
|
{
|
||||||
|
return ReadFileContent(aCx, aFile, EmptyString(), FILE_AS_ARRAYBUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDOMFileReader::ReadAsBinaryString(nsIDOMBlob* aFile)
|
nsDOMFileReader::ReadAsBinaryString(nsIDOMBlob* aFile)
|
||||||
{
|
{
|
||||||
return ReadFileContent(aFile, EmptyString(), FILE_AS_BINARY);
|
return ReadFileContent(nsnull, aFile, EmptyString(), FILE_AS_BINARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDOMFileReader::ReadAsText(nsIDOMBlob* aFile,
|
nsDOMFileReader::ReadAsText(nsIDOMBlob* aFile,
|
||||||
const nsAString &aCharset)
|
const nsAString &aCharset)
|
||||||
{
|
{
|
||||||
return ReadFileContent(aFile, aCharset, FILE_AS_TEXT);
|
return ReadFileContent(nsnull, aFile, aCharset, FILE_AS_TEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsDOMFileReader::ReadAsDataURL(nsIDOMBlob* aFile)
|
nsDOMFileReader::ReadAsDataURL(nsIDOMBlob* aFile)
|
||||||
{
|
{
|
||||||
return ReadFileContent(aFile, EmptyString(), FILE_AS_DATAURL);
|
return ReadFileContent(nsnull, aFile, EmptyString(), FILE_AS_DATAURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -282,6 +330,7 @@ nsDOMFileReader::Abort()
|
||||||
|
|
||||||
//Revert status, result and readystate attributes
|
//Revert status, result and readystate attributes
|
||||||
SetDOMStringToNull(mResult);
|
SetDOMStringToNull(mResult);
|
||||||
|
mResultArrayBuffer = nsnull;
|
||||||
mReadyState = nsIDOMFileReader::DONE;
|
mReadyState = nsIDOMFileReader::DONE;
|
||||||
mError = new nsDOMFileError(nsIDOMFileError::ABORT_ERR);
|
mError = new nsDOMFileError(nsIDOMFileError::ABORT_ERR);
|
||||||
|
|
||||||
|
@ -384,6 +433,14 @@ nsDOMFileReader::OnDataAvailable(nsIRequest *aRequest,
|
||||||
&bytesRead);
|
&bytesRead);
|
||||||
NS_ASSERTION(bytesRead == aCount, "failed to read data");
|
NS_ASSERTION(bytesRead == aCount, "failed to read data");
|
||||||
}
|
}
|
||||||
|
else if (mDataFormat == FILE_AS_ARRAYBUFFER) {
|
||||||
|
js::ArrayBuffer* abuf = js::ArrayBuffer::fromJSObject(mResultArrayBuffer);
|
||||||
|
NS_ASSERTION(abuf, "What happened?");
|
||||||
|
|
||||||
|
PRUint32 bytesRead = 0;
|
||||||
|
aInputStream->Read((char*)abuf->data + aOffset, aCount, &bytesRead);
|
||||||
|
NS_ASSERTION(bytesRead == aCount, "failed to read data");
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
//Update memory buffer to reflect the contents of the file
|
//Update memory buffer to reflect the contents of the file
|
||||||
mFileData = (char *)PR_Realloc(mFileData, aOffset + aCount);
|
mFileData = (char *)PR_Realloc(mFileData, aOffset + aCount);
|
||||||
|
@ -439,6 +496,8 @@ nsDOMFileReader::OnStopRequest(nsIRequest *aRequest,
|
||||||
|
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
switch (mDataFormat) {
|
switch (mDataFormat) {
|
||||||
|
case FILE_AS_ARRAYBUFFER:
|
||||||
|
break; //Already accumulated mResultArrayBuffer
|
||||||
case FILE_AS_BINARY:
|
case FILE_AS_BINARY:
|
||||||
break; //Already accumulated mResult
|
break; //Already accumulated mResult
|
||||||
case FILE_AS_TEXT:
|
case FILE_AS_TEXT:
|
||||||
|
@ -468,7 +527,8 @@ nsDOMFileReader::OnStopRequest(nsIRequest *aRequest,
|
||||||
// Helper methods
|
// Helper methods
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsDOMFileReader::ReadFileContent(nsIDOMBlob* aFile,
|
nsDOMFileReader::ReadFileContent(JSContext* aCx,
|
||||||
|
nsIDOMBlob* aFile,
|
||||||
const nsAString &aCharset,
|
const nsAString &aCharset,
|
||||||
eDataFormat aDataFormat)
|
eDataFormat aDataFormat)
|
||||||
{
|
{
|
||||||
|
@ -513,6 +573,15 @@ nsDOMFileReader::ReadFileContent(nsIDOMBlob* aFile,
|
||||||
//FileReader should be in loading state here
|
//FileReader should be in loading state here
|
||||||
mReadyState = nsIDOMFileReader::LOADING;
|
mReadyState = nsIDOMFileReader::LOADING;
|
||||||
DispatchProgressEvent(NS_LITERAL_STRING(LOADSTART_STR));
|
DispatchProgressEvent(NS_LITERAL_STRING(LOADSTART_STR));
|
||||||
|
|
||||||
|
if (mDataFormat == FILE_AS_ARRAYBUFFER) {
|
||||||
|
mResultArrayBuffer = js_CreateArrayBuffer(aCx, mReadTotal);
|
||||||
|
if (!mResultArrayBuffer) {
|
||||||
|
NS_WARNING("Failed to create JS array buffer");
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
RootResultArrayBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,8 @@ public:
|
||||||
NS_DECL_ISUPPORTS_INHERITED
|
NS_DECL_ISUPPORTS_INHERITED
|
||||||
|
|
||||||
NS_DECL_NSIDOMFILEREADER
|
NS_DECL_NSIDOMFILEREADER
|
||||||
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMFileReader, nsXHREventTarget)
|
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(nsDOMFileReader,
|
||||||
|
nsXHREventTarget)
|
||||||
|
|
||||||
NS_FORWARD_NSIXMLHTTPREQUESTEVENTTARGET(nsXHREventTarget::);
|
NS_FORWARD_NSIXMLHTTPREQUESTEVENTTARGET(nsXHREventTarget::);
|
||||||
|
|
||||||
|
@ -109,15 +110,19 @@ public:
|
||||||
void DispatchProgressEvent(const nsAString& aType);
|
void DispatchProgressEvent(const nsAString& aType);
|
||||||
|
|
||||||
nsresult Init();
|
nsresult Init();
|
||||||
|
|
||||||
|
void RootResultArrayBuffer();
|
||||||
|
void UnrootResultArrayBuffer();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum eDataFormat {
|
enum eDataFormat {
|
||||||
|
FILE_AS_ARRAYBUFFER,
|
||||||
FILE_AS_BINARY,
|
FILE_AS_BINARY,
|
||||||
FILE_AS_TEXT,
|
FILE_AS_TEXT,
|
||||||
FILE_AS_DATAURL
|
FILE_AS_DATAURL
|
||||||
};
|
};
|
||||||
|
|
||||||
nsresult ReadFileContent(nsIDOMBlob *aFile, const nsAString &aCharset, eDataFormat aDataFormat);
|
nsresult ReadFileContent(JSContext* aCx, nsIDOMBlob *aFile, const nsAString &aCharset, eDataFormat aDataFormat);
|
||||||
nsresult GetAsText(const nsACString &aCharset,
|
nsresult GetAsText(const nsACString &aCharset,
|
||||||
const char *aFileData, PRUint32 aDataLen, nsAString &aResult);
|
const char *aFileData, PRUint32 aDataLen, nsAString &aResult);
|
||||||
nsresult GetAsDataURL(nsIDOMBlob *aFile, const char *aFileData, PRUint32 aDataLen, nsAString &aResult);
|
nsresult GetAsDataURL(nsIDOMBlob *aFile, const char *aFileData, PRUint32 aDataLen, nsAString &aResult);
|
||||||
|
@ -139,6 +144,8 @@ protected:
|
||||||
|
|
||||||
eDataFormat mDataFormat;
|
eDataFormat mDataFormat;
|
||||||
|
|
||||||
|
JSObject* mResultArrayBuffer;
|
||||||
|
|
||||||
nsString mResult;
|
nsString mResult;
|
||||||
PRUint16 mReadyState;
|
PRUint16 mReadyState;
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,18 @@ is(onloadHasRunBinary, false, "binary loading must be async");
|
||||||
is(onloadStartHasRunBinary, true, "binary loadstart should fire sync");
|
is(onloadStartHasRunBinary, true, "binary loadstart should fire sync");
|
||||||
expectedTestCount++;
|
expectedTestCount++;
|
||||||
|
|
||||||
|
var onloadHasRunArrayBuffer = false;
|
||||||
|
var onloadStartHasRunArrayBuffer = false;
|
||||||
|
r = new FileReader();
|
||||||
|
is(r.readyState, FileReader.EMPTY, "correct initial arrayBuffer readyState");
|
||||||
|
r.addEventListener("load", function() { onloadHasRunArrayBuffer = true }, false);
|
||||||
|
r.addEventListener("loadstart", function() { onloadStartHasRunArrayBuffer = true }, false);
|
||||||
|
r.readAsArrayBuffer(binaryFile);
|
||||||
|
r.onload = getLoadHandlerForArrayBuffer(testBinaryData, testBinaryData.length, "array buffer reading");
|
||||||
|
is(r.readyState, FileReader.LOADING, "correct loading arrayBuffer readyState");
|
||||||
|
is(onloadHasRunArrayBuffer, false, "arrayBuffer loading must be async");
|
||||||
|
is(onloadStartHasRunArrayBuffer, true, "arrayBuffer loadstart should fire sync");
|
||||||
|
expectedTestCount++;
|
||||||
|
|
||||||
// Test a variety of encodings, and make sure they work properly
|
// Test a variety of encodings, and make sure they work properly
|
||||||
r = new FileReader();
|
r = new FileReader();
|
||||||
|
@ -124,6 +136,14 @@ r.onload = getLoadHandler(testTextData,
|
||||||
"utf16 reading");
|
"utf16 reading");
|
||||||
expectedTestCount++;
|
expectedTestCount++;
|
||||||
|
|
||||||
|
// Test get result without reading
|
||||||
|
r = new FileReader();
|
||||||
|
is(r.readyState, FileReader.EMPTY,
|
||||||
|
"readyState in test reader get result without reading");
|
||||||
|
is(r.error, null,
|
||||||
|
"no error in test reader get result without reading");
|
||||||
|
is(r.result, null,
|
||||||
|
"result in test reader get result without reading");
|
||||||
|
|
||||||
// Test loading an empty file works (and doesn't crash!)
|
// Test loading an empty file works (and doesn't crash!)
|
||||||
var emptyFile = createFileWithData("");
|
var emptyFile = createFileWithData("");
|
||||||
|
@ -148,12 +168,16 @@ r.onload = getLoadHandler("", 0, "empty binary string reading");
|
||||||
r.readAsBinaryString(emptyFile);
|
r.readAsBinaryString(emptyFile);
|
||||||
expectedTestCount++;
|
expectedTestCount++;
|
||||||
|
|
||||||
|
r = new FileReader();
|
||||||
|
r.onload = getLoadHandlerForArrayBuffer("", 0, "empty array buffer reading");
|
||||||
|
r.readAsArrayBuffer(emptyFile);
|
||||||
|
expectedTestCount++;
|
||||||
|
|
||||||
r = new FileReader();
|
r = new FileReader();
|
||||||
r.onload = getLoadHandler(convertToDataURL(""), 0, "empt binary string reading");
|
r.onload = getLoadHandler(convertToDataURL(""), 0, "empt binary string reading");
|
||||||
r.readAsDataURL(emptyFile);
|
r.readAsDataURL(emptyFile);
|
||||||
expectedTestCount++;
|
expectedTestCount++;
|
||||||
|
|
||||||
|
|
||||||
// Test reusing a FileReader to read multiple times
|
// Test reusing a FileReader to read multiple times
|
||||||
r = new FileReader();
|
r = new FileReader();
|
||||||
r.onload = getLoadHandler(testASCIIData,
|
r.onload = getLoadHandler(testASCIIData,
|
||||||
|
@ -203,6 +227,39 @@ r.addEventListener("load", makeAnotherReadListener3, false);
|
||||||
r.readAsDataURL(binaryFile);
|
r.readAsDataURL(binaryFile);
|
||||||
expectedTestCount += 2;
|
expectedTestCount += 2;
|
||||||
|
|
||||||
|
r = new FileReader();
|
||||||
|
r.onload = getLoadHandlerForArrayBuffer(testBinaryData,
|
||||||
|
testBinaryData.length,
|
||||||
|
"to-be-reused reading arrayBuffer")
|
||||||
|
var makeAnotherReadListener4 = function(event) {
|
||||||
|
r = event.target;
|
||||||
|
r.removeEventListener("load", makeAnotherReadListener4, false);
|
||||||
|
r.onload = getLoadHandlerForArrayBuffer(testBinaryData,
|
||||||
|
testBinaryData.length,
|
||||||
|
"reused reading arrayBuffer");
|
||||||
|
r.readAsArrayBuffer(binaryFile);
|
||||||
|
};
|
||||||
|
r.addEventListener("load", makeAnotherReadListener4, false);
|
||||||
|
r.readAsArrayBuffer(binaryFile);
|
||||||
|
expectedTestCount += 2;
|
||||||
|
|
||||||
|
// Test first reading as ArrayBuffer then read as something else
|
||||||
|
// (BinaryString) and doesn't crash
|
||||||
|
r = new FileReader();
|
||||||
|
r.onload = getLoadHandlerForArrayBuffer(testBinaryData,
|
||||||
|
testBinaryData.length,
|
||||||
|
"to-be-reused reading arrayBuffer")
|
||||||
|
var makeAnotherReadListener5 = function(event) {
|
||||||
|
r = event.target;
|
||||||
|
r.removeEventListener("load", makeAnotherReadListener5, false);
|
||||||
|
r.onload = getLoadHandler(testBinaryData,
|
||||||
|
testBinaryData.length,
|
||||||
|
"reused reading binary string");
|
||||||
|
r.readAsBinaryString(binaryFile);
|
||||||
|
};
|
||||||
|
r.addEventListener("load", makeAnotherReadListener5, false);
|
||||||
|
r.readAsArrayBuffer(binaryFile);
|
||||||
|
expectedTestCount += 2;
|
||||||
|
|
||||||
//Test data-URI encoding on differing file sizes
|
//Test data-URI encoding on differing file sizes
|
||||||
dataurldata = testBinaryData.substr(0, testBinaryData.length -
|
dataurldata = testBinaryData.substr(0, testBinaryData.length -
|
||||||
|
@ -322,9 +379,30 @@ function getLoadHandler(expectedResult, expectedLength, testName) {
|
||||||
is(event.lengthComputable, true,
|
is(event.lengthComputable, true,
|
||||||
"lengthComputable in test " + testName);
|
"lengthComputable in test " + testName);
|
||||||
is(event.loaded, expectedLength,
|
is(event.loaded, expectedLength,
|
||||||
"lengthComputable in test " + testName);
|
"loaded in test " + testName);
|
||||||
is(event.total, expectedLength,
|
is(event.total, expectedLength,
|
||||||
|
"total in test " + testName);
|
||||||
|
testHasRun();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLoadHandlerForArrayBuffer(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.lengthComputable, true,
|
||||||
"lengthComputable in test " + testName);
|
"lengthComputable in test " + testName);
|
||||||
|
is(event.loaded, expectedLength,
|
||||||
|
"loaded in test " + testName);
|
||||||
|
is(event.total, expectedLength,
|
||||||
|
"total in test " + testName);
|
||||||
|
is(event.target.result.byteLength, expectedLength,
|
||||||
|
"array buffer size in test " + testName);
|
||||||
|
var u8v = new Uint8Array(event.target.result);
|
||||||
|
is(String.fromCharCode.apply(String, u8v), expectedResult,
|
||||||
|
"array buffer contents in test " + testName);
|
||||||
testHasRun();
|
testHasRun();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче