Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 <!DOCTYPE html>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id={678695}
5 -->
6 <head>
7 <title>Test for Bug {678695} Settings API</title>
8 <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
9 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
11 </head>
12 <body>
14 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id={678695}">Mozilla Bug {678695}</a>
15 <p id="display"></p>
16 <div id="content" style="display: none">
18 </div>
19 <pre id="test">
20 <script class="testbody" type="text/javascript">
22 "use strict";
24 if (SpecialPowers.isMainProcess()) {
25 SpecialPowers.Cu.import("resource://gre/modules/SettingsChangeNotifier.jsm");
26 }
28 SpecialPowers.addPermission("settings-read", true, document);
29 SpecialPowers.addPermission("settings-write", true, document);
31 function onUnwantedSuccess() {
32 ok(false, "onUnwantedSuccess: shouldn't get here");
33 }
35 function onFailure() {
36 ok(false, "in on Failure!");
37 }
39 const wifi = {"net3g.apn": "internet.mnc012.mcc345.gprs"};
40 const wifi2 = {"net3g.apn": "internet.mnc012.mcc345.test"};
41 var wifi3 = {"net3g.apn2": "internet.mnc012.mcc345.test3"};
42 var wifiEnabled = {"wifi.enabled": true};
43 var wifiDisabled = {"wifi.enabled": false};
44 var screenBright = {"screen.brightness": 0.7};
45 var screenBright2 = {"screen.brightness": 0.1};
46 var wifiNetworks0 = { "wifi.networks[0]": { ssid: "myfreenetwork", mac: "01:23:45:67:89:ab", passwd: "secret"}};
47 var wifiNetworks1 = { "wifi.networks[1]": { ssid: "myfreenetwork2", mac: "01:23:45:67:89:ab", passwd: "secret2"}};
49 var combination = {
50 "wifi.enabled": false,
51 "screen.brightness": 0.7,
52 "wifi.networks[0]": { ssid: "myfreenetwork", mac: "01:23:45:67:89:ab", passwd: "secret" },
53 "test.test": true,
54 "net3g.apn2": "internet.mnc012.mcc345.gprs"
55 }
57 function equals(o1, o2) {
58 var k1 = Object.keys(o1).sort();
59 var k2 = Object.keys(o2).sort();
60 if (k1.length != k2.length) return false;
61 return k1.zip(k2, function(keyPair) {
62 if(typeof o1[keyPair[0]] == typeof o2[keyPair[1]] == "object"){
63 return equals(o1[keyPair[0]], o2[keyPair[1]])
64 } else {
65 return o1[keyPair[0]] == o2[keyPair[1]];
66 }
67 }).all();
68 };
70 function observer1(setting) {
71 is(setting.settingName, "screen.brightness", "Same settingName");
72 is(setting.settingValue, "0.7", "Same settingvalue");
73 };
75 function observer2(setting) {
76 is(setting.settingName, "screen.brightness", "Same settingName");
77 is(setting.settingValue, "0.7", "Same settingvalue");
78 };
80 function observerWithNext(setting) {
81 is(setting.settingName, "screen.brightness", "Same settingName");
82 is(setting.settingValue, "0.7", "Same settingvalue");
83 next();
84 };
86 function onsettingschangeWithNext(event) {
87 is(event.settingName, "screen.brightness", "Same settingName");
88 is(event.settingValue, "0.7", "Same settingvalue");
89 next();
90 };
92 function check(o1, o2) {
93 is(JSON.stringify(o1), JSON.stringify(o2), "same");
94 }
96 var req, req2, req3, req4, req5, req6;
97 var index = 0;
99 var mozSettings = navigator.mozSettings;
101 var steps = [
102 function () {
103 ok(true, "Deleting database");
104 var lock = mozSettings.createLock();
105 req = lock.clear();
106 req.onsuccess = function () {
107 ok(true, "Deleted the database");
108 next();
109 };
110 },
111 function () {
112 ok(true, "Setting wifi");
113 var lock = mozSettings.createLock();
114 req = lock.set(wifi);
115 req.onsuccess = function () {
116 ok(true, "set done");
117 }
118 req.onerror = onFailure;
120 var lock2 = mozSettings.createLock();
121 req2 = lock2.get("net3g.apn");
122 req2.onsuccess = function () {
123 is(Object.keys(req2.result).length, 1, "length 1");
124 check(wifi, req2.result);
125 ok(true, "Get net3g.apn Done");
126 next();
127 };
128 req2.onerror = onFailure;
129 },
130 function () {
131 ok(true, "Change wifi1");
132 var lock = mozSettings.createLock();
133 req = lock.set(wifi2);
134 req.onsuccess = function () {
135 ok(true, "Set Done");
136 };
137 req.onerror = onFailure;
138 ok(true, "Get changed net3g.apn");
139 req2 = lock.get("net3g.apn");
140 req2.onsuccess = function () {
141 is(Object.keys(req2.result).length, 1, "length 1");
142 check(wifi2, req2.result);
143 ok(true, "Get net3g.apn Done");
144 next();
145 };
146 req2.onerror = onFailure;
147 },
148 function () {
149 ok(true, "Set Combination");
150 var lock = mozSettings.createLock();
151 req3 = lock.set(combination);
152 req3.onsuccess = function () {
153 ok(true, "set done");
154 req4 = lock.get("net3g.apn2");
155 req4.onsuccess = function() {
156 ok(true, "Done");
157 check(combination["net3g.apn2"], req4.result["net3g.apn2"]);
158 next();
159 }
160 }
161 req3.onerror = onFailure;
162 },
163 function() {
164 var lock = mozSettings.createLock();
165 req4 = lock.get("net3g.apn2");
166 req4.onsuccess = function() {
167 ok(true, "Done");
168 check(combination["net3g.apn2"], req4.result["net3g.apn2"]);
169 next();
170 }
171 req4.onerror = onFailure;
172 },
173 function() {
174 ok(true, "Get unknown key");
175 var lock = mozSettings.createLock();
176 req = lock.get("abc.def");
177 req.onsuccess = function() {
178 is(req.result["abc.def"], undefined, "no result");
179 next();
180 };
181 req.onerror = onFailure;
182 },
183 function() {
184 ok(true, "adding onsettingchange");
185 navigator.mozSettings.onsettingchange = onsettingschangeWithNext;
186 var lock = mozSettings.createLock();
187 req2 = lock.get("screen.brightness");
188 req2.onsuccess = function() {
189 ok(true, "end adding onsettingchange");
190 next();
191 };
192 req2.onerror = onFailure;
193 },
194 function() {
195 ok(true, "Test onsettingchange");
196 var lock = mozSettings.createLock();
197 req = lock.set(screenBright);
198 req.onsuccess = function () {
199 ok(true, "set done, observer has to call next");
200 }
201 req.onerror = onFailure;
202 },
203 function() {
204 ok(true, "delete onsettingschange");
205 var lock = mozSettings.createLock();
206 navigator.mozSettings.onsettingchange = null;
207 req = lock.set(screenBright);
208 req.onsuccess = function () {
209 ok(true, "set done");
210 next();
211 }
212 req.onerror = onFailure;
213 },
214 function () {
215 ok(true, "Waiting for all set callbacks");
216 var lock = mozSettings.createLock();
217 req = lock.get("screen.brightness");
218 req.onsuccess = function() {
219 ok(true, "Done");
220 next();
221 }
222 req.onerror = onFailure;
223 },
224 function() {
225 ok(true, "adding Observers 1");
226 navigator.mozSettings.addObserver("screen.brightness", observer1);
227 navigator.mozSettings.addObserver("screen.brightness", observer1);
228 navigator.mozSettings.addObserver("screen.brightness", observer2);
229 navigator.mozSettings.addObserver("screen.brightness", observerWithNext);
230 var lock = mozSettings.createLock();
231 req2 = lock.get("screen.brightness");
232 req2.onsuccess = function() {
233 ok(true, "set observeSetting done!");
234 next();
235 };
236 req2.onerror = onFailure;
237 },
238 function() {
239 ok(true, "test observers");
240 var lock = mozSettings.createLock();
241 req = lock.set(screenBright);
242 req.onsuccess = function () {
243 ok(true, "set done");
244 }
245 req.onerror = onFailure;
246 },
247 function() {
248 ok(true, "removing Event Listener");
249 var lock = mozSettings.createLock();
250 req = lock.set(screenBright);
251 req.onsuccess = function () {
252 ok(true, "set done");
253 navigator.mozSettings.removeObserver("screen.brightness", observer2);
254 navigator.mozSettings.removeObserver("screen.brightness", observer1);
255 }
256 req.onerror = onFailure;
257 },
258 function() {
259 ok(true, "test Event Listener");
260 var lock = mozSettings.createLock();
261 req = lock.set(screenBright);
262 req.onsuccess = function () {
263 ok(true, "set done");
264 }
265 req.onerror = onFailure;
266 },
267 function() {
268 ok(true, "removing Event Listener");
269 var lock = mozSettings.createLock();
270 navigator.mozSettings.removeObserver("screen.brightness", observerWithNext);
271 req = lock.set(screenBright);
272 req.onsuccess = function () {
273 ok(true, "set done");
274 navigator.mozSettings.removeObserver("screen.brightness", observer2);
275 navigator.mozSettings.removeObserver("screen.brightness", observer1);
276 next();
277 }
278 req.onerror = onFailure;
279 },
280 function() {
281 ok(true, "removing Event Listener");
282 var lock = mozSettings.createLock();
283 req = lock.get("screen.brightness");
284 req.onsuccess = function () {
285 ok(true, "get done");
286 next();
287 }
288 req.onerror = onFailure;
289 },
290 function () {
291 ok(true, "Nested test");
292 var lock = mozSettings.createLock();
293 req = lock.get("screen.brightness");
294 req.onsuccess = function () {
295 req3 = lock.set({"screen.brightness": req.result["screen.brightness"] + 1})
296 req3.onsuccess = function () {
297 req4 = lock.get("screen.brightness");
298 req4.onsuccess = function() {
299 is(req4.result["screen.brightness"], 1.7, "same Value");
300 }
301 req4.onerror = onFailure;
302 }
303 req3.onerror = onFailure;
304 };
305 req.onerror = onFailure;
307 req2 = lock.get("screen.brightness");
308 req2.onsuccess = function () {
309 is(req2.result["screen.brightness"], 0.7, "same Value");
310 }
311 req2.onerror = onFailure;
313 var lock2 = mozSettings.createLock();
314 req5 = lock2.get("screen.brightness");
315 req5.onsuccess = function () {
316 is(req5.result["screen.brightness"], 1.7, "same Value");
317 next();
318 }
319 req5.onerror = onFailure;
320 },
321 function () {
322 ok(true, "Deleting database");
323 var lock = mozSettings.createLock();
324 req = lock.clear();
325 req.onsuccess = function () {
326 ok(true, "Deleted the database");
327 };
328 req.onerror = onFailure;
329 req2 = lock.set(wifi);
330 req2.onsuccess = function () {
331 ok(true, "set done");
332 }
333 req2.onerror = onFailure;
335 ok(true, "Get all settings");
336 var lock2 = mozSettings.createLock();
337 req = lock2.get("*");
338 req.onsuccess = function () {
339 is(Object.keys(req.result).length, 1, "length 1");
340 check(wifi, req.result);
341 ok(true, JSON.stringify(req.result));
342 ok(true, "Get all settings Done");
343 };
344 req.onerror = onFailure;
346 req2 = lock2.get("net3g.apn");
347 req2.onsuccess = function () {
348 is(Object.keys(req2.result).length, 1, "length 1");
349 check(wifi, req2.result);
350 ok(true, "Get net3g.apn Done");
351 next();
352 };
353 req2.onerror = onFailure;
354 },
355 function () {
356 ok(true, "Change wifi1");
357 var lock = mozSettings.createLock();
358 req = lock.set(wifi2);
359 req.onsuccess = function () {
360 ok(true, "Set Done");
361 };
362 req.onerror = onFailure;
364 ok(true, "Get changed net3g.apn");
365 req2 = lock.get("net3g.apn");
366 req2.onsuccess = function () {
367 is(Object.keys(req2.result).length, 1, "length 1");
368 check(wifi2, req2.result);
369 ok(true, "Get net3g.apn Done");
370 next();
371 };
372 req2.onerror = onFailure;
373 },
374 function () {
375 ok(true, "Test locking");
376 var lock = mozSettings.createLock();
377 var lock2 = mozSettings.createLock();
378 req = lock.set(wifiEnabled);
379 req.onsuccess = function () {
380 ok(true, "Test Locking Done");
381 };
382 req.onerror = onFailure;
384 req2 = lock2.set(wifiDisabled);
385 req2.onsuccess = function () {
386 ok(true, "Set Done");
387 next();
388 };
389 req2.onerror = onFailure;
390 },
391 function () {
392 ok(true, "Test locking result");
393 var lock = mozSettings.createLock();
394 req = lock.get("wifi.enabled");
395 req.onsuccess = function() {
396 check(req.result, wifiDisabled);
397 ok(true, "Test1 locking result done");
398 next();
399 }
400 req.onerror = onFailure;
401 },
402 function () {
403 ok(true, "Test locking heavy");
404 for (var i=0; i<30; i++) {
405 // only new locks!
406 var lock = mozSettings.createLock();
407 var obj = {};
408 obj["wifi.enabled" + i] = true;
409 req = lock.set( obj );
410 req.onsuccess = function () {
411 ok(true, "Set1 Done");
412 };
413 req.onerror = onFailure;
414 };
415 {
416 var lock2 = mozSettings.createLock();
417 req2 = lock2.get("*");
418 req2.onsuccess = function () {
419 is(Object.keys(req2.result).length, 32, "length 12");
420 ok(true, JSON.stringify(req2.result));
421 ok(true, "Get all settings Done");
422 };
423 req2.onerror = onFailure;
424 }
425 var lock2 = mozSettings.createLock();
426 var obj = {};
427 obj["wifi.enabled" + 30] = true;
428 req3 = lock2.set( obj );
429 req3.onsuccess = function () {
430 ok(true, "Set12 Done");
431 };
432 req3.onerror = onFailure;
434 var lock3 = mozSettings.createLock();
435 // with one lock
436 for (var i = 0; i < 30; i++) {
437 req4 = lock3.get("wifi.enabled" + i);
438 var testObj = {};
439 testObj["wifi.enabled" + i] = true;
440 req4.onsuccess = function () {
441 check(this.request.result, this.testObj);
442 ok(true, "Get1 Done");
443 }.bind({testObj: testObj, request: req4});
444 req4.onerror = onFailure;
445 }
447 ok(true, "start next2!");
448 var lock4 = mozSettings.createLock();
449 for (var i=0; i<30; i++) {
450 var obj = {};
451 obj["wifi.enabled" + i] = false;
452 req4 = lock4.set( obj );
453 req4.onsuccess = function () {
454 ok(true, "Set2 Done");
455 };
456 req4.onerror = onFailure;
457 }
458 var lock5 = mozSettings.createLock();
459 for (var i=0; i<30; i++) {
460 req5 = lock5.get("wifi.enabled" + i);
461 var testObj = {};
462 testObj["wifi.enabled" + i] = false;
463 req5.onsuccess = function () {
464 check(this.request.result, this.testObj);
465 ok(true, "Get2 Done");
466 }.bind({testObj: testObj, request: req5});
467 req5.onerror = onFailure;
468 }
470 var lock5 = mozSettings.createLock();
471 req6 = lock5.clear();
472 req6.onsuccess = function () {
473 ok(true, "Deleted the database");
474 next();
475 };
476 req6.onerror = onFailure;
477 },
478 function () {
479 ok(true, "reverse Test locking");
480 var lock2 = mozSettings.createLock();
481 var lock = mozSettings.createLock();
483 req = lock.set(wifiEnabled);
484 req.onsuccess = function () {
485 ok(true, "Test Locking Done");
486 next();
487 };
488 req.onerror = onFailure;
490 req2 = lock2.set(wifiDisabled);
491 req2.onsuccess = function () {
492 ok(true, "Set Done");
493 };
494 req2.onerror = onFailure;
495 },
496 function () {
497 ok(true, "Test locking result");
498 var lock = mozSettings.createLock();
500 req = lock.get("wifi.enabled");
501 req.onsuccess = function() {
502 check(req.result, wifiEnabled);
503 ok(true, "Test2 locking result done");
504 }
505 req.onerror = onFailure;
507 req2 = lock.clear();
508 req2.onsuccess = function () {
509 ok(true, "Deleted the database");
510 };
511 req2.onerror = onFailure;
513 req3 = lock.set(wifi);
514 req3.onsuccess = function () {
515 ok(true, "set done");
516 next();
517 }
518 req3.onerror = onFailure;
520 },
521 function () {
522 ok(true, "Get all settings");
523 var lock = mozSettings.createLock();
524 req = lock.get("*");
525 req.onsuccess = function () {
526 is(Object.keys(req.result).length, 1, "length 1");
527 check(wifi, req.result);
528 ok(true, "Get all settings Done");
529 next();
530 };
531 req.onerror = onFailure;
532 },
533 function () {
534 ok(true, "Get net3g.apn");
535 var lock = mozSettings.createLock();
536 req = lock.get("net3g.apn");
537 req.onsuccess = function () {
538 is(Object.keys(req.result).length, 1, "length 1");
539 check(wifi, req.result);
540 ok(true, "Get net3g.apn Done");
541 next();
542 };
543 req.onerror = onFailure;
544 },
545 function () {
546 ok(true, "Change wifi2");
547 var lock = mozSettings.createLock();
548 req = lock.set(wifi2);
549 req.onsuccess = function () {
550 ok(true, "Set Done");
551 next();
552 };
553 req.onerror = onFailure;
554 },
555 function () {
556 ok(true, "Get net3g.apn");
557 var lock = mozSettings.createLock();
558 req = lock.get("net3g.apn");
559 req.onsuccess = function () {
560 is(Object.keys(req.result).length, 1, "length 1");
561 check(wifi2, req.result);
562 ok(true, "Get net3g.apn Done");
563 next();
564 };
565 req.onerror = onFailure;
566 },
567 function () {
568 ok(true, "Add wifi.enabled");
569 var lock = mozSettings.createLock();
570 req = lock.set(wifiEnabled);
571 req.onsuccess = function () {
572 ok(true, "Set Done");
573 next();
574 };
575 req.onerror = onFailure;
576 },
577 function () {
578 ok(true, "Get Wifi Enabled");
579 var lock = mozSettings.createLock();
580 req = lock.get("wifi.enabled");
581 req.onsuccess = function () {
582 is(Object.keys(req.result).length, 1, "length 1");
583 check(wifiEnabled, req.result);
584 ok(true, "Get wifi.enabledDone");
585 next();
586 };
587 req.onerror = onFailure;
588 },
589 function () {
590 ok(true, "Get all");
591 var lock = mozSettings.createLock();
592 req = lock.get("*");
593 req.onsuccess = function () {
594 is(Object.keys(req.result).length, 2, "length 2");
595 check(wifiEnabled["wifi.enabled"], req.result["wifi.enabled"]);
596 check(wifi2["net3g.apn"], req.result["net3g.apn"]);
597 ok(true, "Get all Done");
598 next();
599 };
600 req.onerror = onFailure;
601 },
602 function () {
603 ok(true, "Add wifiNetworks");
604 var lock = mozSettings.createLock();
605 req = lock.set(wifiNetworks0);
606 req.onsuccess = function () {
607 ok(true, "Set Done");
608 };
609 req.onerror = onFailure;
611 req2 = lock.set(wifiNetworks1);
612 req2.onsuccess = function () {
613 ok(true, "Set Done");
614 next();
615 };
616 req2.onerror = onFailure;
617 },
618 function () {
619 ok(true, "Get Wifi Networks");
620 var lock = mozSettings.createLock();
621 req = lock.get("wifi.networks[0]");
622 req.onsuccess = function () {
623 is(Object.keys(req.result).length, 1, "length 1");
624 check(wifiNetworks0, req.result);
625 ok(true, "Get wifi.networks[0]");
626 next();
627 };
628 req.onerror = onFailure;
629 },
630 function() {
631 ok(true, "Clear DB, multiple locks");
632 var lock4 = mozSettings.createLock();
633 var lock3 = mozSettings.createLock();
634 var lock2 = mozSettings.createLock();
635 var lock = mozSettings.createLock();
636 var lock6 = mozSettings.createLock();
637 var lock7 = mozSettings.createLock();
638 req = lock.clear();
639 req.onsuccess = function () {
640 ok(true, "Deleted the database");
641 next();
642 };
643 req.onerror = onFailure;
644 },
645 function () {
646 ok(true, "Add wifiNetworks");
647 var lock = mozSettings.createLock();
648 req = lock.set(wifiNetworks0);
649 req.onsuccess = function () {
650 ok(true, "Set Done");
651 next();
652 };
653 req.onerror = onFailure;
654 },
655 function () {
656 ok(true, "Test set after lock closed");
657 var lockx = mozSettings.createLock();
658 var cb = function() {
659 var reqx = null;
660 try {
661 reqx = lockx.set(wifiNetworks0);
662 ok(false, "should have thrown");
663 } catch (ex) {
664 ok(reqx == null, "request is still null");
665 ok(true, "Caught Exception");
666 next();
667 }
668 }
669 SimpleTest.executeSoon(cb);
670 },
671 function() {
672 ok(true, "Clear DB");
673 var lock = mozSettings.createLock();
674 req = lock.clear();
675 req.onsuccess = function () {
676 ok(true, "Deleted the database");
677 next();
678 };
679 req.onerror = onFailure;
680 },
681 function() {
682 ok(true, "Set with multiple arguments");
683 var lock = mozSettings.createLock();
684 req = lock.set(combination);
685 req.onsuccess = function () {
686 ok(true, "Set Done");
687 next();
688 };
689 req.onerror = onFailure;
690 },
691 function() {
692 ok(true, "request argument from multiple set");
693 var lock = mozSettings.createLock();
694 req = lock.get("screen.brightness");
695 req.onsuccess = function () {
696 check(req.result["screen.brightness"], 0.7, "get done");
697 next();
698 }
699 req.onerror = onFailure;
700 },
701 function() {
702 ok(true, "Test closed attribute on a valid lock");
703 var lock = mozSettings.createLock();
704 is(lock.closed, false, "closed attribute is false on creation");
705 req = lock.get("screen.brightness");
706 req.onsuccess = function () {
707 is(lock.closed, false, "closed attribute is false on success callback");
708 next();
709 }
710 req.onerror = onFailure;
711 },
712 function () {
713 ok(true, "Test closed attribute on invalid lock");
714 var lockx = mozSettings.createLock();
715 var cb = function() {
716 var reqx = null;
717 try {
718 reqx = lockx.set(wifiNetworks0);
719 ok(false, "should have thrown");
720 } catch (ex) {
721 is(lockx.closed, true, "closed attribute is true");
722 ok(true, "Caught Exception");
723 next();
724 }
725 }
726 SimpleTest.executeSoon(cb);
727 },
728 function() {
729 ok(true, "Clear DB");
730 var lock = mozSettings.createLock();
731 req = lock.clear();
732 req.onsuccess = function () {
733 ok(true, "Deleted the database");
734 next();
735 };
736 req.onerror = onFailure;
737 },
738 function() {
739 ok(true, "Set object value");
740 var lock = mozSettings.createLock();
741 req = lock.set({"setting-obj": {foo: {bar: 23}}});
742 req.onsuccess = function() {
743 req2 = lock.get("setting-obj");
744 req2.onsuccess = function(event) {
745 var result = event.target.result["setting-obj"];
746 ok(result, "Got valid result");
747 ok(typeof result == "object", "Result is object");
748 ok("foo" in result && "bar" in result.foo, "Result has properties");
749 ok(result.foo.bar == 23, "Result properties are set");
750 next();
751 };
752 };
753 },
754 function() {
755 ok(true, "Clear DB");
756 var lock = mozSettings.createLock();
757 req = lock.clear();
758 req.onsuccess = function () {
759 ok(true, "Deleted the database");
760 next();
761 };
762 req.onerror = onFailure;
763 },
764 function () {
765 ok(true, "all done!\n");
766 SimpleTest.finish();
767 }
768 ];
770 function next() {
771 ok(true, "Begin!");
772 if (index >= steps.length) {
773 ok(false, "Shouldn't get here!");
774 return;
775 }
776 try {
777 steps[index]();
778 } catch(ex) {
779 ok(false, "Caught exception", ex);
780 }
781 index += 1;
782 }
784 SimpleTest.waitForExplicitFinish();
785 addLoadEvent(next);
786 </script>
787 </pre>
788 </body>
789 </html>