|
1 <!DOCTYPE html> |
|
2 <html> |
|
3 <!-- |
|
4 https://bugzilla.mozilla.org/show_bug.cgi?id=674720 |
|
5 --> |
|
6 <head> |
|
7 <title>Test for Bug 674720 WebContacts</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> |
|
13 |
|
14 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=674720">Mozilla Bug 674720</a> |
|
15 <p id="display"></p> |
|
16 <div id="content" style="display: none"> |
|
17 |
|
18 </div> |
|
19 <pre id="test"> |
|
20 <script type="text/javascript;version=1.8" src="http://mochi.test:8888/tests/dom/contacts/tests/shared.js"></script> |
|
21 <script class="testbody" type="text/javascript"> |
|
22 "use strict"; |
|
23 |
|
24 var utils = SpecialPowers.getDOMWindowUtils(window); |
|
25 |
|
26 function getView(size) |
|
27 { |
|
28 var buffer = new ArrayBuffer(size); |
|
29 var view = new Uint8Array(buffer); |
|
30 is(buffer.byteLength, size, "Correct byte length"); |
|
31 return view; |
|
32 } |
|
33 |
|
34 function getRandomView(size) |
|
35 { |
|
36 var view = getView(size); |
|
37 for (var i = 0; i < size; i++) { |
|
38 view[i] = parseInt(Math.random() * 255) |
|
39 } |
|
40 return view; |
|
41 } |
|
42 |
|
43 function getBlob(type, view) |
|
44 { |
|
45 return SpecialPowers.unwrap(utils.getBlob([view], {type: type})); |
|
46 } |
|
47 |
|
48 function getRandomBlob(size) |
|
49 { |
|
50 return getBlob("binary/random", getRandomView(size)); |
|
51 } |
|
52 |
|
53 function compareBuffers(buffer1, buffer2) |
|
54 { |
|
55 if (buffer1.byteLength != buffer2.byteLength) { |
|
56 return false; |
|
57 } |
|
58 var view1 = new Uint8Array(buffer1); |
|
59 var view2 = new Uint8Array(buffer2); |
|
60 for (var i = 0; i < buffer1.byteLength; i++) { |
|
61 if (view1[i] != view2[i]) { |
|
62 return false; |
|
63 } |
|
64 } |
|
65 return true; |
|
66 } |
|
67 |
|
68 function verifyBuffers(buffer1, buffer2, isLast) |
|
69 { |
|
70 ok(compareBuffers(buffer1, buffer2), "Correct blob data"); |
|
71 if (isLast) |
|
72 next(); |
|
73 } |
|
74 |
|
75 var randomBlob = getRandomBlob(1024); |
|
76 var randomBlob2 = getRandomBlob(1024); |
|
77 |
|
78 var properties1 = { |
|
79 name: ["xTestname1"], |
|
80 givenName: ["xTestname1"], |
|
81 photo: [randomBlob] |
|
82 }; |
|
83 |
|
84 var properties2 = { |
|
85 name: ["yTestname2"], |
|
86 givenName: ["yTestname2"], |
|
87 photo: [randomBlob, randomBlob2] |
|
88 }; |
|
89 |
|
90 var sample_id1; |
|
91 var createResult1; |
|
92 var findResult1; |
|
93 |
|
94 function verifyBlob(blob1, blob2, isLast) |
|
95 { |
|
96 is(blob1 instanceof SpecialPowers.Ci.nsIDOMBlob, true, |
|
97 "blob1 is an instance of nsIDOMBlob"); |
|
98 is(blob2 instanceof SpecialPowers.Ci.nsIDOMBlob, true, |
|
99 "blob2 is an instance of nsIDOMBlob"); |
|
100 isnot(blob1 instanceof SpecialPowers.Ci.nsIDOMFile, true, |
|
101 "blob1 is an instance of nsIDOMFile"); |
|
102 isnot(blob2 instanceof SpecialPowers.Ci.nsIDOMFile, true, |
|
103 "blob2 is an instance of nsIDOMFile"); |
|
104 ise(blob1.size, blob2.size, "Same size"); |
|
105 ise(blob1.type, blob2.type, "Same type"); |
|
106 |
|
107 var buffer1; |
|
108 var buffer2; |
|
109 |
|
110 var reader1 = new FileReader(); |
|
111 reader1.readAsArrayBuffer(blob2); |
|
112 reader1.onload = function(event) { |
|
113 buffer2 = event.target.result; |
|
114 if (buffer1) { |
|
115 verifyBuffers(buffer1, buffer2, isLast); |
|
116 } |
|
117 } |
|
118 |
|
119 var reader2 = new FileReader(); |
|
120 reader2.readAsArrayBuffer(blob1); |
|
121 reader2.onload = function(event) { |
|
122 buffer1 = event.target.result; |
|
123 if (buffer2) { |
|
124 verifyBuffers(buffer1, buffer2, isLast); |
|
125 } |
|
126 } |
|
127 } |
|
128 |
|
129 function verifyBlobArray(blobs1, blobs2) |
|
130 { |
|
131 is(blobs1 instanceof Array, true, "blobs1 is an array object"); |
|
132 is(blobs2 instanceof Array, true, "blobs2 is an array object"); |
|
133 ise(blobs1.length, blobs2.length, "Same length"); |
|
134 |
|
135 if (!blobs1.length) { |
|
136 next(); |
|
137 return; |
|
138 } |
|
139 |
|
140 for (var i = 0; i < blobs1.length; i++) { |
|
141 verifyBlob(blobs1[i], blobs2[i], i == blobs1.length - 1); |
|
142 } |
|
143 } |
|
144 |
|
145 var req; |
|
146 |
|
147 var steps = [ |
|
148 function () { |
|
149 ok(true, "Deleting database"); |
|
150 req = mozContacts.clear(); |
|
151 req.onsuccess = function () { |
|
152 ok(true, "Deleted the database"); |
|
153 next(); |
|
154 }; |
|
155 req.onerror = onFailure; |
|
156 }, |
|
157 function () { |
|
158 ok(true, "Adding contact with photo"); |
|
159 createResult1 = new mozContact(properties1); |
|
160 req = navigator.mozContacts.save(createResult1); |
|
161 req.onsuccess = function () { |
|
162 ok(createResult1.id, "The contact now has an ID."); |
|
163 sample_id1 = createResult1.id; |
|
164 next(); |
|
165 }; |
|
166 req.onerror = onFailure; |
|
167 }, |
|
168 function () { |
|
169 ok(true, "Retrieving by substring"); |
|
170 var options = {filterBy: ["givenName"], |
|
171 filterOp: "startsWith", |
|
172 filterValue: properties1.givenName[0].substring(0,3)}; |
|
173 req = mozContacts.find(options); |
|
174 req.onsuccess = function () { |
|
175 ok(req.result.length == 1, "Found exactly 1 contact."); |
|
176 findResult1 = req.result[0]; |
|
177 ok(findResult1.id == sample_id1, "Same ID"); |
|
178 verifyBlobArray(findResult1.photo, properties1.photo); |
|
179 }; |
|
180 req.onerror = onFailure; |
|
181 }, |
|
182 function () { |
|
183 ok(true, "Adding contact with 2 photos"); |
|
184 createResult1 = new mozContact(properties2); |
|
185 req = navigator.mozContacts.save(createResult1); |
|
186 req.onsuccess = function () { |
|
187 ok(createResult1.id, "The contact now has an ID."); |
|
188 sample_id1 = createResult1.id; |
|
189 next(); |
|
190 }; |
|
191 req.onerror = onFailure; |
|
192 }, |
|
193 function () { |
|
194 ok(true, "Retrieving by substring"); |
|
195 var options = {filterBy: ["givenName"], |
|
196 filterOp: "startsWith", |
|
197 filterValue: properties2.givenName[0].substring(0,3)}; |
|
198 req = mozContacts.find(options); |
|
199 req.onsuccess = function () { |
|
200 ok(req.result.length == 1, "Found exactly 1 contact."); |
|
201 findResult1 = req.result[0]; |
|
202 ok(findResult1.id == sample_id1, "Same ID"); |
|
203 verifyBlobArray(findResult1.photo, properties2.photo); |
|
204 }; |
|
205 req.onerror = onFailure; |
|
206 }, |
|
207 function () { |
|
208 ok(true, "Deleting database"); |
|
209 req = mozContacts.clear() |
|
210 req.onsuccess = function () { |
|
211 ok(true, "Deleted the database"); |
|
212 next(); |
|
213 } |
|
214 req.onerror = onFailure; |
|
215 }, |
|
216 function () { |
|
217 ok(true, "all done!\n"); |
|
218 |
|
219 SimpleTest.finish(); |
|
220 } |
|
221 ]; |
|
222 |
|
223 start_tests(); |
|
224 </script> |
|
225 </pre> |
|
226 </body> |
|
227 </html> |