diff -r 000000000000 -r 6474c204b198 dom/indexedDB/test/file.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/indexedDB/test/file.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,215 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const DEFAULT_QUOTA = 50 * 1024 * 1024; + +var bufferCache = []; +var utils = SpecialPowers.getDOMWindowUtils(window); + +if (!SpecialPowers.isMainProcess()) { + window.runTest = function() { + todo(false, "Test disabled in child processes, for now"); + finishTest(); + } +} + +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 = new Uint8Array(buffer1); + let view2 = 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 SpecialPowers.unwrap(utils.getBlob([view], {type: type})); +} + +function getFile(name, type, view) +{ + return SpecialPowers.unwrap(utils.getFile(name, [view], {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)); +} + +function verifyBuffers(buffer1, buffer2) +{ + ok(compareBuffers(buffer1, buffer2), "Correct blob data"); +} + +function verifyBlob(blob1, blob2, fileId, blobReadHandler) +{ + is(blob1 instanceof Components.interfaces.nsIDOMBlob, true, + "Instance of nsIDOMBlob"); + is(blob1 instanceof Components.interfaces.nsIDOMFile, + blob2 instanceof Components.interfaces.nsIDOMFile, + "Instance of nsIDOMFile"); + is(blob1.size, blob2.size, "Correct size"); + is(blob1.type, blob2.type, "Correct type"); + if (blob2 instanceof Components.interfaces.nsIDOMFile) { + 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 grabFileUsageAndContinueHandler(usage, fileUsage) +{ + testGenerator.send(fileUsage); +} + +function getUsage(usageHandler) +{ + let comp = SpecialPowers.wrap(Components); + let quotaManager = comp.classes["@mozilla.org/dom/quota/manager;1"] + .getService(comp.interfaces.nsIQuotaManager); + + // We need to pass a JS callback to getUsageForURI. However, that callback + // takes an XPCOM URI object, which will cause us to throw when we wrap it + // for the content compartment. So we need to define the function in a + // privileged scope, which we do using a sandbox. + var sysPrin = SpecialPowers.Services.scriptSecurityManager.getSystemPrincipal(); + var sb = new SpecialPowers.Cu.Sandbox(sysPrin); + sb.usageHandler = usageHandler; + var cb = SpecialPowers.Cu.evalInSandbox((function(uri, usage, fileUsage) { + usageHandler(usage, fileUsage); }).toSource(), sb); + + let uri = SpecialPowers.wrap(window).document.documentURIObject; + quotaManager.getUsageForURI(uri, cb); +} + +function getFileId(file) +{ + return utils.getFileId(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; +}