1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/indexedDB/test/file.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,215 @@ 1.4 +/** 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.7 + */ 1.8 + 1.9 +const DEFAULT_QUOTA = 50 * 1024 * 1024; 1.10 + 1.11 +var bufferCache = []; 1.12 +var utils = SpecialPowers.getDOMWindowUtils(window); 1.13 + 1.14 +if (!SpecialPowers.isMainProcess()) { 1.15 + window.runTest = function() { 1.16 + todo(false, "Test disabled in child processes, for now"); 1.17 + finishTest(); 1.18 + } 1.19 +} 1.20 + 1.21 +function getView(size) 1.22 +{ 1.23 + let buffer = new ArrayBuffer(size); 1.24 + let view = new Uint8Array(buffer); 1.25 + is(buffer.byteLength, size, "Correct byte length"); 1.26 + return view; 1.27 +} 1.28 + 1.29 +function getRandomView(size) 1.30 +{ 1.31 + let view = getView(size); 1.32 + for (let i = 0; i < size; i++) { 1.33 + view[i] = parseInt(Math.random() * 255) 1.34 + } 1.35 + return view; 1.36 +} 1.37 + 1.38 +function compareBuffers(buffer1, buffer2) 1.39 +{ 1.40 + if (buffer1.byteLength != buffer2.byteLength) { 1.41 + return false; 1.42 + } 1.43 + let view1 = new Uint8Array(buffer1); 1.44 + let view2 = new Uint8Array(buffer2); 1.45 + for (let i = 0; i < buffer1.byteLength; i++) { 1.46 + if (view1[i] != view2[i]) { 1.47 + return false; 1.48 + } 1.49 + } 1.50 + return true; 1.51 +} 1.52 + 1.53 +function getBlob(type, view) 1.54 +{ 1.55 + return SpecialPowers.unwrap(utils.getBlob([view], {type: type})); 1.56 +} 1.57 + 1.58 +function getFile(name, type, view) 1.59 +{ 1.60 + return SpecialPowers.unwrap(utils.getFile(name, [view], {type: type})); 1.61 +} 1.62 + 1.63 +function getRandomBlob(size) 1.64 +{ 1.65 + return getBlob("binary/random", getRandomView(size)); 1.66 +} 1.67 + 1.68 +function getRandomFile(name, size) 1.69 +{ 1.70 + return getFile(name, "binary/random", getRandomView(size)); 1.71 +} 1.72 + 1.73 +function getNullBlob(size) 1.74 +{ 1.75 + return getBlob("binary/null", getView(size)); 1.76 +} 1.77 + 1.78 +function getNullFile(name, size) 1.79 +{ 1.80 + return getFile(name, "binary/null", getView(size)); 1.81 +} 1.82 + 1.83 +function verifyBuffers(buffer1, buffer2) 1.84 +{ 1.85 + ok(compareBuffers(buffer1, buffer2), "Correct blob data"); 1.86 +} 1.87 + 1.88 +function verifyBlob(blob1, blob2, fileId, blobReadHandler) 1.89 +{ 1.90 + is(blob1 instanceof Components.interfaces.nsIDOMBlob, true, 1.91 + "Instance of nsIDOMBlob"); 1.92 + is(blob1 instanceof Components.interfaces.nsIDOMFile, 1.93 + blob2 instanceof Components.interfaces.nsIDOMFile, 1.94 + "Instance of nsIDOMFile"); 1.95 + is(blob1.size, blob2.size, "Correct size"); 1.96 + is(blob1.type, blob2.type, "Correct type"); 1.97 + if (blob2 instanceof Components.interfaces.nsIDOMFile) { 1.98 + is(blob1.name, blob2.name, "Correct name"); 1.99 + } 1.100 + is(utils.getFileId(blob1), fileId, "Correct file id"); 1.101 + 1.102 + let buffer1; 1.103 + let buffer2; 1.104 + 1.105 + for (let i = 0; i < bufferCache.length; i++) { 1.106 + if (bufferCache[i].blob == blob2) { 1.107 + buffer2 = bufferCache[i].buffer; 1.108 + break; 1.109 + } 1.110 + } 1.111 + 1.112 + if (!buffer2) { 1.113 + let reader = new FileReader(); 1.114 + reader.readAsArrayBuffer(blob2); 1.115 + reader.onload = function(event) { 1.116 + buffer2 = event.target.result; 1.117 + bufferCache.push({ blob: blob2, buffer: buffer2 }); 1.118 + if (buffer1) { 1.119 + verifyBuffers(buffer1, buffer2); 1.120 + if (blobReadHandler) { 1.121 + blobReadHandler(); 1.122 + } 1.123 + else { 1.124 + testGenerator.next(); 1.125 + } 1.126 + } 1.127 + } 1.128 + } 1.129 + 1.130 + let reader = new FileReader(); 1.131 + reader.readAsArrayBuffer(blob1); 1.132 + reader.onload = function(event) { 1.133 + buffer1 = event.target.result; 1.134 + if (buffer2) { 1.135 + verifyBuffers(buffer1, buffer2); 1.136 + if (blobReadHandler) { 1.137 + blobReadHandler(); 1.138 + } 1.139 + else { 1.140 + testGenerator.next(); 1.141 + } 1.142 + } 1.143 + } 1.144 +} 1.145 + 1.146 +function verifyBlobArray(blobs1, blobs2, expectedFileIds) 1.147 +{ 1.148 + is(blobs1 instanceof Array, true, "Got an array object"); 1.149 + is(blobs1.length, blobs2.length, "Correct length"); 1.150 + 1.151 + if (!blobs1.length) { 1.152 + return; 1.153 + } 1.154 + 1.155 + let verifiedCount = 0; 1.156 + 1.157 + function blobReadHandler() { 1.158 + if (++verifiedCount == blobs1.length) { 1.159 + testGenerator.next(); 1.160 + } 1.161 + else { 1.162 + verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount], 1.163 + expectedFileIds[verifiedCount], blobReadHandler); 1.164 + } 1.165 + } 1.166 + 1.167 + verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount], 1.168 + expectedFileIds[verifiedCount], blobReadHandler); 1.169 +} 1.170 + 1.171 +function grabFileUsageAndContinueHandler(usage, fileUsage) 1.172 +{ 1.173 + testGenerator.send(fileUsage); 1.174 +} 1.175 + 1.176 +function getUsage(usageHandler) 1.177 +{ 1.178 + let comp = SpecialPowers.wrap(Components); 1.179 + let quotaManager = comp.classes["@mozilla.org/dom/quota/manager;1"] 1.180 + .getService(comp.interfaces.nsIQuotaManager); 1.181 + 1.182 + // We need to pass a JS callback to getUsageForURI. However, that callback 1.183 + // takes an XPCOM URI object, which will cause us to throw when we wrap it 1.184 + // for the content compartment. So we need to define the function in a 1.185 + // privileged scope, which we do using a sandbox. 1.186 + var sysPrin = SpecialPowers.Services.scriptSecurityManager.getSystemPrincipal(); 1.187 + var sb = new SpecialPowers.Cu.Sandbox(sysPrin); 1.188 + sb.usageHandler = usageHandler; 1.189 + var cb = SpecialPowers.Cu.evalInSandbox((function(uri, usage, fileUsage) { 1.190 + usageHandler(usage, fileUsage); }).toSource(), sb); 1.191 + 1.192 + let uri = SpecialPowers.wrap(window).document.documentURIObject; 1.193 + quotaManager.getUsageForURI(uri, cb); 1.194 +} 1.195 + 1.196 +function getFileId(file) 1.197 +{ 1.198 + return utils.getFileId(file); 1.199 +} 1.200 + 1.201 +function hasFileInfo(name, id) 1.202 +{ 1.203 + return utils.getFileReferences(name, id); 1.204 +} 1.205 + 1.206 +function getFileRefCount(name, id) 1.207 +{ 1.208 + let count = {}; 1.209 + utils.getFileReferences(name, id, null, count); 1.210 + return count.value; 1.211 +} 1.212 + 1.213 +function getFileDBRefCount(name, id) 1.214 +{ 1.215 + let count = {}; 1.216 + utils.getFileReferences(name, id, null, {}, count); 1.217 + return count.value; 1.218 +}