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=806374
5 -->
6 <head>
7 <title>Test for Bug 806374 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 // A simple data URI that will be converted to a blob.
49 let dataURI = "data:text/html;charset=utf-8,%3C!DOCTYPE html>%3Cbody style='background:black;";
51 function checkBlob(blob) {
52 try {
53 let url = URL.createObjectURL(blob);
54 ok(true, "Valid blob");
55 } catch (e) {
56 ok(false, "Valid blob");
57 }
58 }
60 let steps = [
61 function() {
62 let lock = mozSettings.createLock();
63 req = lock.clear();
64 req.onsuccess = next;
65 req.onerror = onFailure("Deleting database");
66 },
67 function() {
68 function obs(e) {
69 checkBlob(e.settingValue);
70 mozSettings.removeObserver("test1", obs);
71 next();
72 }
73 mozSettings.addObserver("test1", obs);
74 next();
75 },
76 function() {
77 // next is called by the observer above
78 let req = mozSettings.createLock().set({"test1": dataURI});
79 req.onerror = onFailure("Saving blob");
80 },
81 function() {
82 let req = mozSettings.createLock().get("test1");
83 req.onsuccess = function(event) {
84 checkBlob(event.target.result["test1"]);
85 next();
86 };
87 req.onerror = onFailure("Getting blob");
88 },
89 function() {
90 let req = mozSettings.createLock().set({"test2": [1, 2, dataURI, 4]});
91 req.onsuccess = next;
92 req.onerror = onFailure("Saving array");
93 },
94 function() {
95 let req = mozSettings.createLock().get("test2");
96 req.onsuccess = function(event) {
97 let val = event.target.result["test2"];
98 ok(Array.isArray(val), "Result is an array");
99 ok(val[0] == 1 && val[1] == 2 && val[3] == 4, "Primitives are preserved");
100 checkBlob(val[2]);
101 next();
102 };
103 req.onerror = onFailure("Getting array");
104 },
105 function() {
106 let req = mozSettings.createLock().set({"test3": {foo: "bar", baz: {number: 1, arr: [dataURI]}}});
107 req.onsuccess = next();
108 req.onerror = onFailure("Saving object");
109 },
110 function() {
111 let req = mozSettings.createLock().get("test3");
112 req.onsuccess = function(event) {
113 let val = event.target.result["test3"];
114 ok(typeof(val) == "object", "Result is an object");
115 ok("foo" in val && typeof(val.foo) == "string", "String property preserved");
116 ok("baz" in val && typeof(val.baz) == "object", "Object property preserved");
117 let baz = val.baz;
118 ok("number" in baz && baz.number == 1, "Primite inside object preserved");
119 ok("arr" in baz && Array.isArray(baz.arr), "Array inside object is preserved");
120 checkBlob(baz.arr[0]);
121 next();
122 };
123 req.onerror = onFailure("Getting object");
124 },
125 function() {
126 let req = mozSettings.createLock().clear();
127 req.onsuccess = function() {
128 next();
129 };
130 req.onerror = onFailure("Deleting database");
131 },
132 function () {
133 ok(true, "all done!\n");
134 SimpleTest.finish();
135 }
136 ];
138 function next() {
139 try {
140 let step = steps.shift();
141 if (step) {
142 step();
143 }
144 } catch(ex) {
145 ok(false, "Caught exception", ex);
146 }
147 }
149 SimpleTest.waitForExplicitFinish();
150 addLoadEvent(next);
151 </script>
152 </pre>
153 </body>
154 </html>