Wed, 31 Dec 2014 06:55:50 +0100
Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2
1 /**
2 * Any copyright is dedicated to the Public Domain.
3 * http://creativecommons.org/publicdomain/zero/1.0/
4 */
6 const DEFAULT_QUOTA = 50 * 1024 * 1024;
8 var bufferCache = [];
9 var utils = SpecialPowers.getDOMWindowUtils(window);
11 if (!SpecialPowers.isMainProcess()) {
12 window.runTest = function() {
13 todo(false, "Test disabled in child processes, for now");
14 finishTest();
15 }
16 }
18 function getView(size)
19 {
20 let buffer = new ArrayBuffer(size);
21 let view = new Uint8Array(buffer);
22 is(buffer.byteLength, size, "Correct byte length");
23 return view;
24 }
26 function getRandomView(size)
27 {
28 let view = getView(size);
29 for (let i = 0; i < size; i++) {
30 view[i] = parseInt(Math.random() * 255)
31 }
32 return view;
33 }
35 function compareBuffers(buffer1, buffer2)
36 {
37 if (buffer1.byteLength != buffer2.byteLength) {
38 return false;
39 }
40 let view1 = new Uint8Array(buffer1);
41 let view2 = new Uint8Array(buffer2);
42 for (let i = 0; i < buffer1.byteLength; i++) {
43 if (view1[i] != view2[i]) {
44 return false;
45 }
46 }
47 return true;
48 }
50 function getBlob(type, view)
51 {
52 return SpecialPowers.unwrap(utils.getBlob([view], {type: type}));
53 }
55 function getFile(name, type, view)
56 {
57 return SpecialPowers.unwrap(utils.getFile(name, [view], {type: type}));
58 }
60 function getRandomBlob(size)
61 {
62 return getBlob("binary/random", getRandomView(size));
63 }
65 function getRandomFile(name, size)
66 {
67 return getFile(name, "binary/random", getRandomView(size));
68 }
70 function getNullBlob(size)
71 {
72 return getBlob("binary/null", getView(size));
73 }
75 function getNullFile(name, size)
76 {
77 return getFile(name, "binary/null", getView(size));
78 }
80 function verifyBuffers(buffer1, buffer2)
81 {
82 ok(compareBuffers(buffer1, buffer2), "Correct blob data");
83 }
85 function verifyBlob(blob1, blob2, fileId, blobReadHandler)
86 {
87 is(blob1 instanceof Components.interfaces.nsIDOMBlob, true,
88 "Instance of nsIDOMBlob");
89 is(blob1 instanceof Components.interfaces.nsIDOMFile,
90 blob2 instanceof Components.interfaces.nsIDOMFile,
91 "Instance of nsIDOMFile");
92 is(blob1.size, blob2.size, "Correct size");
93 is(blob1.type, blob2.type, "Correct type");
94 if (blob2 instanceof Components.interfaces.nsIDOMFile) {
95 is(blob1.name, blob2.name, "Correct name");
96 }
97 is(utils.getFileId(blob1), fileId, "Correct file id");
99 let buffer1;
100 let buffer2;
102 for (let i = 0; i < bufferCache.length; i++) {
103 if (bufferCache[i].blob == blob2) {
104 buffer2 = bufferCache[i].buffer;
105 break;
106 }
107 }
109 if (!buffer2) {
110 let reader = new FileReader();
111 reader.readAsArrayBuffer(blob2);
112 reader.onload = function(event) {
113 buffer2 = event.target.result;
114 bufferCache.push({ blob: blob2, buffer: buffer2 });
115 if (buffer1) {
116 verifyBuffers(buffer1, buffer2);
117 if (blobReadHandler) {
118 blobReadHandler();
119 }
120 else {
121 testGenerator.next();
122 }
123 }
124 }
125 }
127 let reader = new FileReader();
128 reader.readAsArrayBuffer(blob1);
129 reader.onload = function(event) {
130 buffer1 = event.target.result;
131 if (buffer2) {
132 verifyBuffers(buffer1, buffer2);
133 if (blobReadHandler) {
134 blobReadHandler();
135 }
136 else {
137 testGenerator.next();
138 }
139 }
140 }
141 }
143 function verifyBlobArray(blobs1, blobs2, expectedFileIds)
144 {
145 is(blobs1 instanceof Array, true, "Got an array object");
146 is(blobs1.length, blobs2.length, "Correct length");
148 if (!blobs1.length) {
149 return;
150 }
152 let verifiedCount = 0;
154 function blobReadHandler() {
155 if (++verifiedCount == blobs1.length) {
156 testGenerator.next();
157 }
158 else {
159 verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount],
160 expectedFileIds[verifiedCount], blobReadHandler);
161 }
162 }
164 verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount],
165 expectedFileIds[verifiedCount], blobReadHandler);
166 }
168 function grabFileUsageAndContinueHandler(usage, fileUsage)
169 {
170 testGenerator.send(fileUsage);
171 }
173 function getUsage(usageHandler)
174 {
175 let comp = SpecialPowers.wrap(Components);
176 let quotaManager = comp.classes["@mozilla.org/dom/quota/manager;1"]
177 .getService(comp.interfaces.nsIQuotaManager);
179 // We need to pass a JS callback to getUsageForURI. However, that callback
180 // takes an XPCOM URI object, which will cause us to throw when we wrap it
181 // for the content compartment. So we need to define the function in a
182 // privileged scope, which we do using a sandbox.
183 var sysPrin = SpecialPowers.Services.scriptSecurityManager.getSystemPrincipal();
184 var sb = new SpecialPowers.Cu.Sandbox(sysPrin);
185 sb.usageHandler = usageHandler;
186 var cb = SpecialPowers.Cu.evalInSandbox((function(uri, usage, fileUsage) {
187 usageHandler(usage, fileUsage); }).toSource(), sb);
189 let uri = SpecialPowers.wrap(window).document.documentURIObject;
190 quotaManager.getUsageForURI(uri, cb);
191 }
193 function getFileId(file)
194 {
195 return utils.getFileId(file);
196 }
198 function hasFileInfo(name, id)
199 {
200 return utils.getFileReferences(name, id);
201 }
203 function getFileRefCount(name, id)
204 {
205 let count = {};
206 utils.getFileReferences(name, id, null, count);
207 return count.value;
208 }
210 function getFileDBRefCount(name, id)
211 {
212 let count = {};
213 utils.getFileReferences(name, id, null, {}, count);
214 return count.value;
215 }