// Create strings containing data we'll test with. We'll want long // strings to ensure they span multiple buffers while loading
let testTextData = "asd b\tlah\u1234w\u00a0r"; while (testTextData.length < minFileSize) {
testTextData = testTextData + testTextData;
}
let testASCIIData = "abcdef 123456\n"; while (testASCIIData.length < minFileSize) {
testASCIIData = testASCIIData + testASCIIData;
}
let testBinaryData = ""; for (let i = 0; i < 256; i++) {
testBinaryData += String.fromCharCode(i);
} while (testBinaryData.length < minFileSize) {
testBinaryData = testBinaryData + testBinaryData;
}
//Set up files for testing
let openerURL = SimpleTest.getTestFileURL("fileapi_chromeScript.js");
let opener = SpecialPowers.loadChromeScript(openerURL);
function convertToUTF16(s) {
let res = ""; for (let i = 0; i < s.length; ++i) {
c = s.charCodeAt(i);
res += String.fromCharCode(c & 255, c >>> 8);
} return res;
}
function convertToUTF8(s) { return unescape(encodeURIComponent(s));
}
function convertToDataURL(s) { return"data:application/octet-stream;base64," + btoa(s);
}
function loadEventHandler_string(
event,
resolve,
reader,
data,
dataLength,
testName
) {
is(event.target, reader, "Correct target.");
is(
event.target.readyState,
FileReader.DONE, "readyState in test " + testName
);
is(event.target.error, null, "no error in test " + testName);
is(event.target.result, data, "result in test " + testName);
is(event.lengthComputable, true, "lengthComputable in test " + testName);
is(event.loaded, dataLength, "loaded in test " + testName);
is(event.total, dataLength, "total in test " + testName);
resolve();
}
function loadEventHandler_arrayBuffer(event, resolve, reader, data, testName) {
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);
is(event.loaded, data.length, "loaded in test " + testName);
is(event.total, data.length, "total in test " + testName);
is(
event.target.result.byteLength,
data.length, "array buffer size in test " + testName
);
let u8v = new Uint8Array(event.target.result);
is(
String.fromCharCode.apply(String, u8v),
data, "array buffer contents in test " + testName
);
u8v = null;
if ("SpecialPowers" in self) {
SpecialPowers.gc();
is(
event.target.result.byteLength,
data.length, "array buffer size after gc in test " + testName
);
u8v = new Uint8Array(event.target.result);
is(
String.fromCharCode.apply(String, u8v),
data, "array buffer contents after gc in test " + testName
);
}
is(r.readyState, FileReader.LOADING, "correct loading text readyState");
is(onloadHasRun, false, "text loading must be async");
is(onloadStartHasRun, false, "text loadstart should fire async");
});
}
function test_readAsBinaryString(blob, text) { returnnew Promise(resolve => {
let onloadHasRun = false;
let onloadStartHasRun = false;
let r = new FileReader();
is(r.readyState, FileReader.EMPTY, "correct initial binary readyState");
r.addEventListener("load", function () {
onloadHasRun = true;
});
r.addEventListener("loadstart", function () {
onloadStartHasRun = true;
});
is(
r.readyState,
FileReader.LOADING, "correct loading arrayBuffer readyState"
);
is(onloadHasRun, false, "arrayBuffer loading must be async");
is(onloadStartHasRun, false, "arrayBuffer loadstart should fire sync");
});
}
// Test a variety of encodings, and make sure they work properly function test_readAsTextWithEncoding(blob, text, length, charset) { returnnew Promise(resolve => {
let r = new FileReader();
r.onload = event => {
loadEventHandler_string(
event,
resolve,
r,
text,
length, "readAsText-" + charset
);
};
r.readAsText(blob, charset);
});
}
// Test get result without reading function test_onlyResult() { returnnew Promise(resolve => {
let 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");
resolve();
});
}
function test_readAsDataURL(blob, text, length) { returnnew Promise(resolve => {
let r = new FileReader();
r.onload = event => {
loadEventHandler_string(event, resolve, r, text, length, "readAsDataURL");
};
r.readAsDataURL(blob);
});
}
// Test reusing a FileReader to read multiple times function test_readAsTextTwice(blob, text) { returnnew Promise(resolve => {
let r = new FileReader();
r.onload = event => {
loadEventHandler_string(
event,
() => {},
r,
text,
text.length, "readAsText-reused-once"
);
};
// Test reusing a FileReader to read multiple times function test_readAsBinaryStringTwice(blob, text) { returnnew Promise(resolve => {
let r = new FileReader();
r.onload = event => {
loadEventHandler_string(
event,
() => {},
r,
text,
text.length, "readAsBinaryString-reused-once"
);
};
// Test first reading as ArrayBuffer then read as something else (BinaryString) // and doesn't crash function test_readAsArrayBufferTwice2(blob, text) { returnnew Promise(resolve => {
let r = new FileReader();
r.onload = event => {
loadEventHandler_arrayBuffer(
event,
() => {},
r,
text, "readAsArrayBuffer-reused-once2"
);
};
function test_readAsDataURL_customLength(blob, text, length, numb) { returnnew Promise(resolve => {
is(length % 3, numb, "Want to test data with length %3 == " + numb);
let r = new FileReader();
r.onload = event => {
loadEventHandler_string(
event,
resolve,
r,
text,
length, "dataurl reading, %3 = " + numb
);
};
r.readAsDataURL(blob);
});
}
// Test abort() function test_abort(blob) { returnnew Promise(resolve => {
let abortHasRun = false;
let loadEndHasRun = false;
let r = new FileReader();
r.onabort = function (event) {
is(abortHasRun, false, "abort should only fire once");
is(loadEndHasRun, false, "loadend shouldn't have fired yet");
abortHasRun = true;
is(
event.target.readyState,
FileReader.DONE, "should be DONE while firing onabort"
);
is(
event.target.error.name, "AbortError", "error set to AbortError for aborted reads"
);
is(
event.target.result, null, "file data should be null on aborted reads"
);
};
r.onloadend = function (event) {
is(abortHasRun, true, "abort should fire before loadend");
is(loadEndHasRun, false, "loadend should only fire once");
loadEndHasRun = true;
is(
event.target.readyState,
FileReader.DONE, "should be DONE while firing onabort"
);
is(
event.target.error.name, "AbortError", "error set to AbortError for aborted reads"
);
is(
event.target.result, null, "file data should be null on aborted reads"
);
};
r.onload = function () {
ok(false, "load should not fire for aborted reads");
};
r.onerror = function () {
ok(false, "error should not fire for aborted reads");
};
r.onprogress = function () {
ok(false, "progress should not fire for aborted reads");
};
is(abortThrew, false, "abort() doesn't throw");
is(abortHasRun, false, "abort() is a no-op unless loading");
r.readAsText(blob);
r.abort();
is(abortHasRun, true, "abort should fire sync");
is(loadEndHasRun, true, "loadend should fire sync");
resolve();
});
}
// Test calling readAsX to cause abort() function test_abort_readAsX(blob, text) { returnnew Promise(resolve => {
let reuseAbortHasRun = false;
let r = new FileReader();
r.onabort = function (event) {
is(reuseAbortHasRun, false, "abort should only fire once");
reuseAbortHasRun = true;
is(
event.target.readyState,
FileReader.DONE, "should be DONE while firing onabort"
);
is(
event.target.error.name, "AbortError", "error set to AbortError for aborted reads"
);
is(
event.target.result, null, "file data should be null on aborted reads"
);
};
r.onload = function () {
ok(false, "load should fire for nested reads");
};
// Test reading from nonexistent files function test_nonExisting(blob) { returnnew Promise(resolve => {
let r = new FileReader();
r.onerror = function (event) {
is(
event.target.readyState,
FileReader.DONE, "should be DONE while firing onerror"
);
is(
event.target.error.name, "NotFoundError", "error set to NotFoundError for nonexistent files"
);
is(
event.target.result, null, "file data should be null on aborted reads"
);
resolve();
};
r.onload = function (event) {
is(false, "nonexistent file shouldn't load! (FIXME: bug 1122788)");
};
// Once this test passes, we should test that onerror gets called and // that the FileReader object is in the right state during that call.
is(
didThrow, false, "shouldn't throw when opening nonexistent file, should fire error instead"
);
});
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.