/** * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ var builder = new MozBlobBuilder(); var manager = null; 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 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, buffer) { builder.append(buffer); return builder.getBlob(type); } function getFile(name, type, buffer) { builder.append(buffer); return builder.getFile(name, type); } function getRandomBlob(size) { return getBlob("binary/random", getRandomBuffer(size)); } function getRandomFile(name, size) { return getFile(name, "binary/random", getRandomBuffer(size)); } function getNullBlob(size) { return getBlob("binary/null", getBuffer(size)); } function getNullFile(name, size) { return getFile(name, "binary/null", getBuffer(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) { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); if (!manager) { manager = Components.classes["@mozilla.org/dom/indexeddb/manager;1"] .getService(Components.interfaces.nsIIndexedDatabaseManager); } let uri = SpecialPowers.getDocumentURIObject(window.document); let callback = { onUsageResult: function(uri, usage, fileUsage) { usageHandler(usage, fileUsage); } }; manager.getUsageForURI(uri, callback); } function getUsageSync() { let usage; getUsage(function(aUsage, aFileUsage) { usage = aUsage; }); netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); let thread = Components.classes["@mozilla.org/thread-manager;1"] .getService(Components.interfaces.nsIThreadManager) .currentThread; while (!usage) { thread.processNextEvent(true); } return usage; } function scheduleGC() { SpecialPowers.exactGC(window, continueToNextStep); } function hasFileInfo(name, id) { return utils.getFileReferences(name, id); } function getFileRefCount(name, id) { let count = {}; utils.getFileReferences(name, id, count); return count.value; } function getFileDBRefCount(name, id) { let count = {}; utils.getFileReferences(name, id, {}, count); return count.value; }