summaryrefslogtreecommitdiffstats
path: root/dom/indexedDB/test/file.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/indexedDB/test/file.js')
-rw-r--r--dom/indexedDB/test/file.js266
1 files changed, 266 insertions, 0 deletions
diff --git a/dom/indexedDB/test/file.js b/dom/indexedDB/test/file.js
new file mode 100644
index 000000000..a0287cbe0
--- /dev/null
+++ b/dom/indexedDB/test/file.js
@@ -0,0 +1,266 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var bufferCache = [];
+var utils = SpecialPowers.getDOMWindowUtils(window);
+
+function getBuffer(size)
+{
+ let buffer = new ArrayBuffer(size);
+ is(buffer.byteLength, size, "Correct byte length");
+ return buffer;
+}
+
+function getRandomBuffer(size)
+{
+ let buffer = getBuffer(size);
+ let view = new Uint8Array(buffer);
+ for (let i = 0; i < size; i++) {
+ view[i] = parseInt(Math.random() * 255)
+ }
+ return buffer;
+}
+
+function getView(size)
+{
+ let buffer = new ArrayBuffer(size);
+ let view = new Uint8Array(buffer);
+ is(buffer.byteLength, size, "Correct byte length");
+ return view;
+}
+
+function getRandomView(size)
+{
+ let view = getView(size);
+ for (let i = 0; i < size; i++) {
+ view[i] = parseInt(Math.random() * 255)
+ }
+ return view;
+}
+
+function compareBuffers(buffer1, buffer2)
+{
+ if (buffer1.byteLength != buffer2.byteLength) {
+ return false;
+ }
+ let view1 = buffer1 instanceof Uint8Array ? buffer1 : new Uint8Array(buffer1);
+ let view2 = buffer2 instanceof Uint8Array ? buffer2 : new Uint8Array(buffer2);
+ for (let i = 0; i < buffer1.byteLength; i++) {
+ if (view1[i] != view2[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function getBlob(type, view)
+{
+ return new Blob([view], {type: type});
+}
+
+function getFile(name, type, view)
+{
+ return new File([view], name, {type: type});
+}
+
+function getRandomBlob(size)
+{
+ return getBlob("binary/random", getRandomView(size));
+}
+
+function getRandomFile(name, size)
+{
+ return getFile(name, "binary/random", getRandomView(size));
+}
+
+function getNullBlob(size)
+{
+ return getBlob("binary/null", getView(size));
+}
+
+function getNullFile(name, size)
+{
+ return getFile(name, "binary/null", getView(size));
+}
+
+// This needs to be async to make it available on workers too.
+function getWasmBinary(text)
+{
+ let binary = getWasmBinarySync(text);
+ SimpleTest.executeSoon(function() {
+ testGenerator.send(binary);
+ });
+}
+
+function getWasmModule(binary)
+{
+ let module = new WebAssembly.Module(binary);
+ return module;
+}
+
+function verifyBuffers(buffer1, buffer2)
+{
+ ok(compareBuffers(buffer1, buffer2), "Correct buffer data");
+}
+
+function verifyBlob(blob1, blob2, fileId, blobReadHandler)
+{
+ is(blob1 instanceof Components.interfaces.nsIDOMBlob, true,
+ "Instance of nsIDOMBlob");
+ is(blob1 instanceof File, blob2 instanceof File,
+ "Instance of DOM File");
+ is(blob1.size, blob2.size, "Correct size");
+ is(blob1.type, blob2.type, "Correct type");
+ if (blob2 instanceof File) {
+ is(blob1.name, blob2.name, "Correct name");
+ }
+ is(utils.getFileId(blob1), fileId, "Correct file id");
+
+ let buffer1;
+ let buffer2;
+
+ for (let i = 0; i < bufferCache.length; i++) {
+ if (bufferCache[i].blob == blob2) {
+ buffer2 = bufferCache[i].buffer;
+ break;
+ }
+ }
+
+ if (!buffer2) {
+ let reader = new FileReader();
+ reader.readAsArrayBuffer(blob2);
+ reader.onload = function(event) {
+ buffer2 = event.target.result;
+ bufferCache.push({ blob: blob2, buffer: buffer2 });
+ if (buffer1) {
+ verifyBuffers(buffer1, buffer2);
+ if (blobReadHandler) {
+ blobReadHandler();
+ }
+ else {
+ testGenerator.next();
+ }
+ }
+ }
+ }
+
+ let reader = new FileReader();
+ reader.readAsArrayBuffer(blob1);
+ reader.onload = function(event) {
+ buffer1 = event.target.result;
+ if (buffer2) {
+ verifyBuffers(buffer1, buffer2);
+ if (blobReadHandler) {
+ blobReadHandler();
+ }
+ else {
+ testGenerator.next();
+ }
+ }
+ }
+}
+
+function verifyBlobArray(blobs1, blobs2, expectedFileIds)
+{
+ is(blobs1 instanceof Array, true, "Got an array object");
+ is(blobs1.length, blobs2.length, "Correct length");
+
+ if (!blobs1.length) {
+ return;
+ }
+
+ let verifiedCount = 0;
+
+ function blobReadHandler() {
+ if (++verifiedCount == blobs1.length) {
+ testGenerator.next();
+ }
+ else {
+ verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount],
+ expectedFileIds[verifiedCount], blobReadHandler);
+ }
+ }
+
+ verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount],
+ expectedFileIds[verifiedCount], blobReadHandler);
+}
+
+function verifyMutableFile(mutableFile1, file2)
+{
+ ok(mutableFile1 instanceof IDBMutableFile, "Instance of IDBMutableFile");
+ is(mutableFile1.name, file2.name, "Correct name");
+ is(mutableFile1.type, file2.type, "Correct type");
+ continueToNextStep();
+}
+
+function verifyView(view1, view2)
+{
+ is(view1.byteLength, view2.byteLength, "Correct byteLength");
+ verifyBuffers(view1, view2);
+ continueToNextStep();
+}
+
+function verifyWasmModule(module1, module2)
+{
+ let getGlobalForObject = SpecialPowers.Cu.getGlobalForObject;
+ let testingFunctions = SpecialPowers.Cu.getJSTestingFunctions();
+ let wasmExtractCode = SpecialPowers.unwrap(testingFunctions.wasmExtractCode);
+ let exp1 = wasmExtractCode(module1);
+ let exp2 = wasmExtractCode(module2);
+ let code1 = exp1.code;
+ let code2 = exp2.code;
+ ok(code1 instanceof getGlobalForObject(code1).Uint8Array, "Instance of Uint8Array");
+ ok(code2 instanceof getGlobalForObject(code1).Uint8Array, "Instance of Uint8Array");
+ ok(code1.length == code2.length, "Correct length");
+ verifyBuffers(code1, code2);
+ continueToNextStep();
+}
+
+function grabFileUsageAndContinueHandler(request)
+{
+ testGenerator.send(request.result.fileUsage);
+}
+
+function getCurrentUsage(usageHandler)
+{
+ let qms = SpecialPowers.Services.qms;
+ let principal = SpecialPowers.wrap(document).nodePrincipal;
+ let cb = SpecialPowers.wrapCallback(usageHandler);
+ qms.getUsageForPrincipal(principal, cb);
+}
+
+function getFileId(file)
+{
+ return utils.getFileId(file);
+}
+
+function getFilePath(file)
+{
+ return utils.getFilePath(file);
+}
+
+function hasFileInfo(name, id)
+{
+ return utils.getFileReferences(name, id);
+}
+
+function getFileRefCount(name, id)
+{
+ let count = {};
+ utils.getFileReferences(name, id, null, count);
+ return count.value;
+}
+
+function getFileDBRefCount(name, id)
+{
+ let count = {};
+ utils.getFileReferences(name, id, null, {}, count);
+ return count.value;
+}
+
+function flushPendingFileDeletions()
+{
+ utils.flushPendingFileDeletions();
+}