|
1 /** |
|
2 * Any copyright is dedicated to the Public Domain. |
|
3 * http://creativecommons.org/publicdomain/zero/1.0/ |
|
4 */ |
|
5 |
|
6 const DEFAULT_QUOTA = 50 * 1024 * 1024; |
|
7 |
|
8 var bufferCache = []; |
|
9 var utils = SpecialPowers.getDOMWindowUtils(window); |
|
10 |
|
11 if (!SpecialPowers.isMainProcess()) { |
|
12 window.runTest = function() { |
|
13 todo(false, "Test disabled in child processes, for now"); |
|
14 finishTest(); |
|
15 } |
|
16 } |
|
17 |
|
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 } |
|
25 |
|
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 } |
|
34 |
|
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 } |
|
49 |
|
50 function getBlob(type, view) |
|
51 { |
|
52 return SpecialPowers.unwrap(utils.getBlob([view], {type: type})); |
|
53 } |
|
54 |
|
55 function getFile(name, type, view) |
|
56 { |
|
57 return SpecialPowers.unwrap(utils.getFile(name, [view], {type: type})); |
|
58 } |
|
59 |
|
60 function getRandomBlob(size) |
|
61 { |
|
62 return getBlob("binary/random", getRandomView(size)); |
|
63 } |
|
64 |
|
65 function getRandomFile(name, size) |
|
66 { |
|
67 return getFile(name, "binary/random", getRandomView(size)); |
|
68 } |
|
69 |
|
70 function getNullBlob(size) |
|
71 { |
|
72 return getBlob("binary/null", getView(size)); |
|
73 } |
|
74 |
|
75 function getNullFile(name, size) |
|
76 { |
|
77 return getFile(name, "binary/null", getView(size)); |
|
78 } |
|
79 |
|
80 function verifyBuffers(buffer1, buffer2) |
|
81 { |
|
82 ok(compareBuffers(buffer1, buffer2), "Correct blob data"); |
|
83 } |
|
84 |
|
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"); |
|
98 |
|
99 let buffer1; |
|
100 let buffer2; |
|
101 |
|
102 for (let i = 0; i < bufferCache.length; i++) { |
|
103 if (bufferCache[i].blob == blob2) { |
|
104 buffer2 = bufferCache[i].buffer; |
|
105 break; |
|
106 } |
|
107 } |
|
108 |
|
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 } |
|
126 |
|
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 } |
|
142 |
|
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"); |
|
147 |
|
148 if (!blobs1.length) { |
|
149 return; |
|
150 } |
|
151 |
|
152 let verifiedCount = 0; |
|
153 |
|
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 } |
|
163 |
|
164 verifyBlob(blobs1[verifiedCount], blobs2[verifiedCount], |
|
165 expectedFileIds[verifiedCount], blobReadHandler); |
|
166 } |
|
167 |
|
168 function grabFileUsageAndContinueHandler(usage, fileUsage) |
|
169 { |
|
170 testGenerator.send(fileUsage); |
|
171 } |
|
172 |
|
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); |
|
178 |
|
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); |
|
188 |
|
189 let uri = SpecialPowers.wrap(window).document.documentURIObject; |
|
190 quotaManager.getUsageForURI(uri, cb); |
|
191 } |
|
192 |
|
193 function getFileId(file) |
|
194 { |
|
195 return utils.getFileId(file); |
|
196 } |
|
197 |
|
198 function hasFileInfo(name, id) |
|
199 { |
|
200 return utils.getFileReferences(name, id); |
|
201 } |
|
202 |
|
203 function getFileRefCount(name, id) |
|
204 { |
|
205 let count = {}; |
|
206 utils.getFileReferences(name, id, null, count); |
|
207 return count.value; |
|
208 } |
|
209 |
|
210 function getFileDBRefCount(name, id) |
|
211 { |
|
212 let count = {}; |
|
213 utils.getFileReferences(name, id, null, {}, count); |
|
214 return count.value; |
|
215 } |