|
1 /** |
|
2 * Any copyright is dedicated to the Public Domain. |
|
3 * http://creativecommons.org/publicdomain/zero/1.0/ |
|
4 */ |
|
5 |
|
6 const { 'classes': Cc, 'interfaces': Ci, 'utils': Cu } = Components; |
|
7 |
|
8 const DOMException = Ci.nsIDOMDOMException; |
|
9 |
|
10 function is(a, b, msg) { |
|
11 dump("is(" + a + ", " + b + ", \"" + msg + "\")"); |
|
12 do_check_eq(a, b, Components.stack.caller); |
|
13 } |
|
14 |
|
15 function ok(cond, msg) { |
|
16 dump("ok(" + cond + ", \"" + msg + "\")"); |
|
17 do_check_true(!!cond, Components.stack.caller); |
|
18 } |
|
19 |
|
20 function isnot(a, b, msg) { |
|
21 dump("isnot(" + a + ", " + b + ", \"" + msg + "\")"); |
|
22 do_check_neq(a, b, Components.stack.caller); |
|
23 } |
|
24 |
|
25 function executeSoon(fun) { |
|
26 do_execute_soon(fun); |
|
27 } |
|
28 |
|
29 function todo(condition, name, diag) { |
|
30 dump("TODO: ", diag); |
|
31 } |
|
32 |
|
33 function info(name, message) { |
|
34 do_print(name); |
|
35 } |
|
36 |
|
37 function run_test() { |
|
38 runTest(); |
|
39 }; |
|
40 |
|
41 if (!this.runTest) { |
|
42 this.runTest = function() |
|
43 { |
|
44 // XPCShell does not get a profile by default. |
|
45 do_get_profile(); |
|
46 |
|
47 enableExperimental(); |
|
48 |
|
49 Cu.importGlobalProperties(["indexedDB"]); |
|
50 |
|
51 do_test_pending(); |
|
52 testGenerator.next(); |
|
53 } |
|
54 } |
|
55 |
|
56 function finishTest() |
|
57 { |
|
58 resetExperimental(); |
|
59 SpecialPowers.notifyObserversInParentProcess(null, "disk-space-watcher", |
|
60 "free"); |
|
61 |
|
62 do_execute_soon(function(){ |
|
63 testGenerator.close(); |
|
64 do_test_finished(); |
|
65 }) |
|
66 } |
|
67 |
|
68 function grabEventAndContinueHandler(event) |
|
69 { |
|
70 testGenerator.send(event); |
|
71 } |
|
72 |
|
73 function continueToNextStep() |
|
74 { |
|
75 do_execute_soon(function() { |
|
76 testGenerator.next(); |
|
77 }); |
|
78 } |
|
79 |
|
80 function errorHandler(event) |
|
81 { |
|
82 dump("indexedDB error: " + event.target.error.name); |
|
83 do_check_true(false); |
|
84 finishTest(); |
|
85 } |
|
86 |
|
87 function unexpectedSuccessHandler() |
|
88 { |
|
89 do_check_true(false); |
|
90 finishTest(); |
|
91 } |
|
92 |
|
93 function expectedErrorHandler(name) |
|
94 { |
|
95 return function(event) { |
|
96 do_check_eq(event.type, "error"); |
|
97 do_check_eq(event.target.error.name, name); |
|
98 event.preventDefault(); |
|
99 grabEventAndContinueHandler(event); |
|
100 }; |
|
101 } |
|
102 |
|
103 function ExpectError(name) |
|
104 { |
|
105 this._name = name; |
|
106 } |
|
107 ExpectError.prototype = { |
|
108 handleEvent: function(event) |
|
109 { |
|
110 do_check_eq(event.type, "error"); |
|
111 do_check_eq(this._name, event.target.error.name); |
|
112 event.preventDefault(); |
|
113 grabEventAndContinueHandler(event); |
|
114 } |
|
115 }; |
|
116 |
|
117 function continueToNextStepSync() |
|
118 { |
|
119 testGenerator.next(); |
|
120 } |
|
121 |
|
122 function compareKeys(k1, k2) { |
|
123 let t = typeof k1; |
|
124 if (t != typeof k2) |
|
125 return false; |
|
126 |
|
127 if (t !== "object") |
|
128 return k1 === k2; |
|
129 |
|
130 if (k1 instanceof Date) { |
|
131 return (k2 instanceof Date) && |
|
132 k1.getTime() === k2.getTime(); |
|
133 } |
|
134 |
|
135 if (k1 instanceof Array) { |
|
136 if (!(k2 instanceof Array) || |
|
137 k1.length != k2.length) |
|
138 return false; |
|
139 |
|
140 for (let i = 0; i < k1.length; ++i) { |
|
141 if (!compareKeys(k1[i], k2[i])) |
|
142 return false; |
|
143 } |
|
144 |
|
145 return true; |
|
146 } |
|
147 |
|
148 return false; |
|
149 } |
|
150 |
|
151 function addPermission(permission, url) |
|
152 { |
|
153 throw "addPermission"; |
|
154 } |
|
155 |
|
156 function removePermission(permission, url) |
|
157 { |
|
158 throw "removePermission"; |
|
159 } |
|
160 |
|
161 function setQuota(quota) |
|
162 { |
|
163 throw "setQuota"; |
|
164 } |
|
165 |
|
166 function allowIndexedDB(url) |
|
167 { |
|
168 throw "allowIndexedDB"; |
|
169 } |
|
170 |
|
171 function disallowIndexedDB(url) |
|
172 { |
|
173 throw "disallowIndexedDB"; |
|
174 } |
|
175 |
|
176 function allowUnlimitedQuota(url) |
|
177 { |
|
178 throw "allowUnlimitedQuota"; |
|
179 } |
|
180 |
|
181 function disallowUnlimitedQuota(url) |
|
182 { |
|
183 throw "disallowUnlimitedQuota"; |
|
184 } |
|
185 |
|
186 function enableExperimental() |
|
187 { |
|
188 SpecialPowers.setBoolPref("dom.indexedDB.experimental", true); |
|
189 } |
|
190 |
|
191 function resetExperimental() |
|
192 { |
|
193 SpecialPowers.clearUserPref("dom.indexedDB.experimental"); |
|
194 } |
|
195 |
|
196 function gc() |
|
197 { |
|
198 Components.utils.forceGC(); |
|
199 Components.utils.forceCC(); |
|
200 } |
|
201 |
|
202 function scheduleGC() |
|
203 { |
|
204 SpecialPowers.exactGC(null, continueToNextStep); |
|
205 } |
|
206 |
|
207 function setTimeout(fun, timeout) { |
|
208 let timer = Components.classes["@mozilla.org/timer;1"] |
|
209 .createInstance(Components.interfaces.nsITimer); |
|
210 var event = { |
|
211 notify: function (timer) { |
|
212 fun(); |
|
213 } |
|
214 }; |
|
215 timer.initWithCallback(event, timeout, |
|
216 Components.interfaces.nsITimer.TYPE_ONE_SHOT); |
|
217 return timer; |
|
218 } |
|
219 |
|
220 var SpecialPowers = { |
|
221 isMainProcess: function() { |
|
222 return Components.classes["@mozilla.org/xre/app-info;1"] |
|
223 .getService(Components.interfaces.nsIXULRuntime) |
|
224 .processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; |
|
225 }, |
|
226 notifyObservers: function(subject, topic, data) { |
|
227 var obsvc = Cc['@mozilla.org/observer-service;1'] |
|
228 .getService(Ci.nsIObserverService); |
|
229 obsvc.notifyObservers(subject, topic, data); |
|
230 }, |
|
231 notifyObserversInParentProcess: function(subject, topic, data) { |
|
232 if (subject) { |
|
233 throw new Error("Can't send subject to another process!"); |
|
234 } |
|
235 return this.notifyObservers(subject, topic, data); |
|
236 }, |
|
237 getBoolPref: function(prefName) { |
|
238 return this._getPrefs().getBoolPref(prefName); |
|
239 }, |
|
240 setBoolPref: function(prefName, value) { |
|
241 this._getPrefs().setBoolPref(prefName, value); |
|
242 }, |
|
243 setIntPref: function(prefName, value) { |
|
244 this._getPrefs().setIntPref(prefName, value); |
|
245 }, |
|
246 clearUserPref: function(prefName) { |
|
247 this._getPrefs().clearUserPref(prefName); |
|
248 }, |
|
249 // Copied (and slightly adjusted) from specialpowersAPI.js |
|
250 exactGC: function(win, callback) { |
|
251 let count = 0; |
|
252 |
|
253 function doPreciseGCandCC() { |
|
254 function scheduledGCCallback() { |
|
255 Components.utils.forceCC(); |
|
256 |
|
257 if (++count < 2) { |
|
258 doPreciseGCandCC(); |
|
259 } else { |
|
260 callback(); |
|
261 } |
|
262 } |
|
263 |
|
264 Components.utils.schedulePreciseGC(scheduledGCCallback); |
|
265 } |
|
266 |
|
267 doPreciseGCandCC(); |
|
268 }, |
|
269 |
|
270 _getPrefs: function() { |
|
271 var prefService = |
|
272 Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService); |
|
273 return prefService.getBranch(null); |
|
274 } |
|
275 }; |