Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 <!DOCTYPE html>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id=821630
5 -->
6 <head>
7 <title>Test for Bug 821630 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=821630">Mozilla Bug 821630</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;version=1.7">
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 return function(s) {
37 if (s) {
38 ok(false, "in on Failure! - " + s);
39 } else {
40 ok(false, "in on Failure!");
41 }
42 }
43 }
45 let mozSettings = window.navigator.mozSettings;
46 let req;
48 let storedBlob = new Blob([""], {"type": "text/xml"});
50 function checkBlob(blob) {
51 try {
52 let url = URL.createObjectURL(blob);
53 ok(true, "Valid blob");
54 } catch (e) {
55 ok(false, "Valid blob");
56 }
57 }
59 let steps = [
60 function() {
61 let lock = mozSettings.createLock();
62 req = lock.clear();
63 req.onsuccess = next;
64 req.onerror = onFailure("Deleting database");
65 },
66 function() {
67 function obs(e) {
68 checkBlob(e.settingValue);
69 mozSettings.removeObserver("test1", obs);
70 next();
71 }
72 mozSettings.addObserver("test1", obs);
73 next();
74 },
75 function() {
76 // next is called by the observer above
77 let req = mozSettings.createLock().set({"test1": storedBlob});
78 req.onerror = onFailure("Saving blob");
79 },
80 function() {
81 let req = mozSettings.createLock().get("test1");
82 req.onsuccess = function(event) {
83 checkBlob(event.target.result["test1"]);
84 next();
85 };
86 req.onerror = onFailure("Getting blob");
87 },
88 function() {
89 let req = mozSettings.createLock().set({"test2": [1, 2, storedBlob, 4]});
90 req.onsuccess = next;
91 req.onerror = onFailure("Saving array");
92 },
93 function() {
94 let req = mozSettings.createLock().get("test2");
95 req.onsuccess = function(event) {
96 let val = event.target.result["test2"];
97 ok(Array.isArray(val), "Result is an array");
98 ok(val[0] == 1 && val[1] == 2 && val[3] == 4, "Primitives are preserved");
99 checkBlob(val[2]);
100 next();
101 };
102 req.onerror = onFailure("Getting array");
103 },
104 function() {
105 let req = mozSettings.createLock().set({"test3": {foo: "bar", baz: {number: 1, arr: [storedBlob]}}});
106 req.onsuccess = next();
107 req.onerror = onFailure("Saving object");
108 },
109 function() {
110 let req = mozSettings.createLock().get("test3");
111 req.onsuccess = function(event) {
112 let val = event.target.result["test3"];
113 ok(typeof(val) == "object", "Result is an object");
114 ok("foo" in val && typeof(val.foo) == "string", "String property preserved");
115 ok("baz" in val && typeof(val.baz) == "object", "Object property preserved");
116 let baz = val.baz;
117 ok("number" in baz && baz.number == 1, "Primite inside object preserved");
118 ok("arr" in baz && Array.isArray(baz.arr), "Array inside object is preserved");
119 checkBlob(baz.arr[0]);
120 next();
121 };
122 req.onerror = onFailure("Getting object");
123 },
124 function() {
125 let req = mozSettings.createLock().clear();
126 req.onsuccess = function() {
127 next();
128 };
129 req.onerror = onFailure("Deleting database");
130 },
131 function () {
132 ok(true, "all done!\n");
133 SimpleTest.finish();
134 }
135 ];
137 function next() {
138 try {
139 let step = steps.shift();
140 if (step) {
141 step();
142 }
143 } catch(ex) {
144 ok(false, "Caught exception", ex);
145 }
146 }
148 SimpleTest.waitForExplicitFinish();
149 addLoadEvent(next);
150 </script>
151 </pre>
152 </body>
153 </html>