michael@0: /** michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: const DEFAULT_QUOTA = 50 * 1024 * 1024; michael@0: michael@0: var bufferCache = []; michael@0: var utils = SpecialPowers.getDOMWindowUtils(window); michael@0: michael@0: if (!SpecialPowers.isMainProcess()) { michael@0: window.runTest = function() { michael@0: todo(false, "Test disabled in child processes, for now"); michael@0: finishTest(); michael@0: } michael@0: } michael@0: michael@0: function getView(size) michael@0: { michael@0: let buffer = new ArrayBuffer(size); michael@0: let view = new Uint8Array(buffer); michael@0: is(buffer.byteLength, size, "Correct byte length"); michael@0: return view; michael@0: } michael@0: michael@0: function getRandomView(size) michael@0: { michael@0: let view = getView(size); michael@0: for (let i = 0; i < size; i++) { michael@0: view[i] = parseInt(Math.random() * 255) michael@0: } michael@0: return view; michael@0: } michael@0: michael@0: function compareBuffers(buffer1, buffer2) michael@0: { michael@0: if (buffer1.byteLength != buffer2.byteLength) { michael@0: return false; michael@0: } michael@0: let view1 = new Uint8Array(buffer1); michael@0: let view2 = new Uint8Array(buffer2); michael@0: for (let i = 0; i < buffer1.byteLength; i++) { michael@0: if (view1[i] != view2[i]) { michael@0: return false; michael@0: } michael@0: } michael@0: return true; michael@0: } michael@0: michael@0: function getBlob(type, view) michael@0: { michael@0: return SpecialPowers.unwrap(utils.getBlob([view], {type: type})); michael@0: } michael@0: michael@0: function getFile(name, type, view) michael@0: { michael@0: return SpecialPowers.unwrap(utils.getFile(name, [view], {type: type})); michael@0: } michael@0: michael@0: function getRandomBlob(size) michael@0: { michael@0: return getBlob("binary/random", getRandomView(size)); michael@0: } michael@0: michael@0: function getRandomFile(name, size) michael@0: { michael@0: return getFile(name, "binary/random", getRandomView(size)); michael@0: } michael@0: michael@0: function getNullBlob(size) michael@0: { michael@0: return getBlob("binary/null", getView(size)); michael@0: } michael@0: michael@0: function getNullFile(name, size) michael@0: { michael@0: return getFile(name, "binary/null", getView(size)); michael@0: } michael@0: michael@0: function verifyBuffers(buffer1, buffer2) michael@0: { michael@0: ok(compareBuffers(buffer1, buffer2), "Correct blob data"); michael@0: } michael@0: michael@0: function verifyBlob(blob1, blob2, fileId, blobReadHandler) michael@0: { michael@0: is(blob1 instanceof Components.interfaces.nsIDOMBlob, true, michael@0: "Instance of nsIDOMBlob"); michael@0: is(blob1 instanceof Components.interfaces.nsIDOMFile, michael@0: blob2 instanceof Components.interfaces.nsIDOMFile, michael@0: "Instance of nsIDOMFile"); michael@0: is(blob1.size, blob2.size, "Correct size"); michael@0: is(blob1.type, blob2.type, "Correct type"); michael@0: if (blob2 instanceof Components.interfaces.nsIDOMFile) { michael@0: is(blob1.name, blob2.name, "Correct name"); michael@0: } michael@0: is(utils.getFileId(blob1), fileId, "Correct file id"); michael@0: michael@0: let buffer1; michael@0: let buffer2; michael@0: michael@0: for (let i = 0; i < bufferCache.length; i++) { michael@0: if (bufferCache[i].blob == blob2) { michael@0: buffer2 = bufferCache[i].buffer; michael@0: break; michael@0: } michael@0: } michael@0: michael@0: if (!buffer2) { michael@0: let reader = new FileReader(); michael@0: reader.readAsArrayBuffer(blob2); michael@0: reader.onload = function(event) { michael@0: buffer2 = event.target.result; michael@0: bufferCache.push({ blob: blob2, buffer: buffer2 }); michael@0: if (buffer1) { michael@0: verifyBuffers(buffer1, buffer2); michael@0: if (blobReadHandler) { michael@0: blobReadHandler(); michael@0: } michael@0: else { michael@0: testGenerator.next(); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: let reader = new FileReader(); michael@0: reader.readAsArrayBuffer(blob1); michael@0: reader.onload = function(event) { michael@0: buffer1 = event.target.result; michael@0: if (buffer2) { michael@0: verifyBuffers(buffer1, buffer2); michael@0: if (blobReadHandler) { michael@0: blobReadHandler(); michael@0: } michael@0: else { michael@0: testGenerator.next(); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: function verifyBlobArray(blobs1, blobs2, expectedFileIds) michael@0: { michael@0: is(blobs1 instanceof Array, true, "Got an array object"); michael@0: is(blobs1.length, blobs2.length, "Correct length"); michael@0: michael@0: if (!blobs1.length) { michael@0: return; michael@0: } michael@0: michael@0: let verifiedCount = 0; michael@0: michael@0: function blobReadHandler() { michael@0: if (++verifiedCount == blobs1.length) { michael@0: testGenerator.next(); michael@0: } michael@0: else { michael@0: verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount], michael@0: expectedFileIds[verifiedCount], blobReadHandler); michael@0: } michael@0: } michael@0: michael@0: verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount], michael@0: expectedFileIds[verifiedCount], blobReadHandler); michael@0: } michael@0: michael@0: function grabFileUsageAndContinueHandler(usage, fileUsage) michael@0: { michael@0: testGenerator.send(fileUsage); michael@0: } michael@0: michael@0: function getUsage(usageHandler) michael@0: { michael@0: let comp = SpecialPowers.wrap(Components); michael@0: let quotaManager = comp.classes["@mozilla.org/dom/quota/manager;1"] michael@0: .getService(comp.interfaces.nsIQuotaManager); michael@0: michael@0: // We need to pass a JS callback to getUsageForURI. However, that callback michael@0: // takes an XPCOM URI object, which will cause us to throw when we wrap it michael@0: // for the content compartment. So we need to define the function in a michael@0: // privileged scope, which we do using a sandbox. michael@0: var sysPrin = SpecialPowers.Services.scriptSecurityManager.getSystemPrincipal(); michael@0: var sb = new SpecialPowers.Cu.Sandbox(sysPrin); michael@0: sb.usageHandler = usageHandler; michael@0: var cb = SpecialPowers.Cu.evalInSandbox((function(uri, usage, fileUsage) { michael@0: usageHandler(usage, fileUsage); }).toSource(), sb); michael@0: michael@0: let uri = SpecialPowers.wrap(window).document.documentURIObject; michael@0: quotaManager.getUsageForURI(uri, cb); michael@0: } michael@0: michael@0: function getFileId(file) michael@0: { michael@0: return utils.getFileId(file); michael@0: } michael@0: michael@0: function hasFileInfo(name, id) michael@0: { michael@0: return utils.getFileReferences(name, id); michael@0: } michael@0: michael@0: function getFileRefCount(name, id) michael@0: { michael@0: let count = {}; michael@0: utils.getFileReferences(name, id, null, count); michael@0: return count.value; michael@0: } michael@0: michael@0: function getFileDBRefCount(name, id) michael@0: { michael@0: let count = {}; michael@0: utils.getFileReferences(name, id, null, {}, count); michael@0: return count.value; michael@0: }