OLD | NEW |
| (Empty) |
1 window.jsTestIsAsync = true; | |
2 | |
3 description('Test passing ArrayBuffers and ArrayBufferViews in messages.'); | |
4 window.testsComplete = 0; | |
5 | |
6 function classCompare(testName, got, sent) { | |
7 var classString = Object.prototype.toString; | |
8 var gotClass = classString.call(got); | |
9 var sentClass = classString.call(sent); | |
10 if (gotClass !== sentClass) { | |
11 testFailed(testName + ": class " + sentClass + " became " + gotClass); | |
12 return false; | |
13 } else { | |
14 testPassed(testName + ": classes are " + sentClass); | |
15 return true; | |
16 } | |
17 } | |
18 | |
19 function bufferCompare(testName, got, sent) { | |
20 if (!classCompare(testName, got, sent)) { | |
21 return false; | |
22 } | |
23 if (got.byteLength !== sent.byteLength) { | |
24 testFailed(testName + ": expected byteLength " + sent.byteLength + " byt
es, got " + got.byteLength); | |
25 return false; | |
26 } else { | |
27 testPassed(testName + ": buffer lengths are " + sent.byteLength); | |
28 } | |
29 var gotReader = new Uint8Array(got); | |
30 var sentReader = new Uint8Array(sent); | |
31 for (var i = 0; i < sent.byteLength; ++i) { | |
32 if (gotReader[i] !== sentReader[i]) { | |
33 testFailed(testName + ": buffers differ starting at byte " + i); | |
34 return false; | |
35 } | |
36 } | |
37 testPassed(testName + ": buffers have the same contents"); | |
38 return true; | |
39 } | |
40 | |
41 function viewCompare(testName, got, sent) { | |
42 if (!classCompare(testName, got, sent)) { | |
43 return false; | |
44 } | |
45 if (!bufferCompare(testName, got.buffer, sent.buffer)) { | |
46 return false; | |
47 } | |
48 if (got.byteOffset !== sent.byteOffset) { | |
49 testFailed(testName + ": offset " + sent.byteOffset + " became " + got.b
yteOffset); | |
50 return false; | |
51 } else { | |
52 testPassed(testName + ": offset is " + sent.byteOffset); | |
53 } | |
54 if (got.byteLength !== sent.byteLength) { | |
55 testFailed(testName + ": length " + sent.byteLength + " became " + got.b
yteLength); | |
56 return false; | |
57 } else { | |
58 testPassed(testName + ": length is " + sent.byteLength); | |
59 } | |
60 return true; | |
61 } | |
62 | |
63 function typedArrayCompare(testName, got, sent) { | |
64 if (!viewCompare(testName, got, sent)) { | |
65 return false; | |
66 } | |
67 if (got.BYTES_PER_ELEMENT !== sent.BYTES_PER_ELEMENT) { | |
68 // Sanity checking. | |
69 testFailed(testName + ": expected BYTES_PER_ELEMENT " + sent.BYTES_PER_E
LEMENT + ", saw " + got.BYTES_PER_ELEMENT); | |
70 return false; | |
71 } | |
72 return true; | |
73 } | |
74 | |
75 function dataViewCompare(testName, got, sent) { | |
76 return viewCompare(testName, got, sent); | |
77 } | |
78 | |
79 function dataViewCompare2(testName, got, sent) { | |
80 for (var i = 0; i < 2; ++i) { | |
81 if (!dataViewCompare(testName, got[i], sent[i])) { | |
82 return false; | |
83 } | |
84 } | |
85 if (got[0].buffer !== got[1].buffer) { | |
86 testFailed(testName + ": expected the same ArrayBuffer for both views"); | |
87 return false; | |
88 } | |
89 return true; | |
90 } | |
91 function dataViewCompare3(testName, got, sent) { | |
92 for (var i = 0; i < 3; i += 2) { | |
93 if (!dataViewCompare(testName, got[i], sent[i])) { | |
94 return false; | |
95 } | |
96 } | |
97 if (got[1].x !== sent[1].x || got[1].y !== sent[1].y) { | |
98 testFailed(testName + ": {x:1, y:1} was not transferred properly"); | |
99 return false; | |
100 } | |
101 if (got[0].buffer !== got[2].buffer) { | |
102 testFailed(testName + ": expected the same ArrayBuffer for both views"); | |
103 return false; | |
104 } | |
105 return false; | |
106 } | |
107 | |
108 | |
109 function createBuffer(length) { | |
110 var buffer = new ArrayBuffer(length); | |
111 var view = new Uint8Array(buffer); | |
112 for (var i = 0; i < length; ++i) { | |
113 view[i] = i + 1; | |
114 } | |
115 return buffer; | |
116 } | |
117 | |
118 function createTypedArray(typedArrayType, length) { | |
119 var view = new typedArrayType(length); | |
120 for (var i = 0; i < length; ++i) { | |
121 view[i] = i + 1; | |
122 } | |
123 return view; | |
124 } | |
125 | |
126 function createTypedArrayOverBuffer(typedArrayType, typedArrayElementSize, lengt
h, subStart, subLength) { | |
127 var buffer = new ArrayBuffer(length * typedArrayElementSize); | |
128 if (subStart === undefined) { | |
129 subStart = 0; | |
130 subLength = length; | |
131 } | |
132 return new typedArrayType(buffer, subStart * typedArrayElementSize, subLengt
h); | |
133 } | |
134 | |
135 var basicBufferTypes = [ | |
136 ["Int32", Int32Array, 4], | |
137 ["Uint32", Uint32Array, 4], | |
138 ["Int8", Int8Array, 1], | |
139 ["Uint8", Uint8Array, 1], | |
140 ["Uint8Clamped", Uint8ClampedArray, 1], | |
141 ["Int16", Int16Array, 2], | |
142 ["Uint16", Uint16Array, 2], | |
143 ["Float32", Float32Array, 4], | |
144 ["Float64", Float64Array, 8] | |
145 ]; | |
146 | |
147 var arrayBuffer1 = createBuffer(1); | |
148 | |
149 var testList = [ | |
150 ['ArrayBuffer0', new ArrayBuffer(0), bufferCompare], | |
151 ['ArrayBuffer1', createBuffer(1), bufferCompare], | |
152 ['ArrayBuffer128', createBuffer(128), bufferCompare], | |
153 ['DataView0', new DataView(new ArrayBuffer(0)), dataViewCompare], | |
154 ['DataView1', new DataView(createBuffer(1)), dataViewCompare], | |
155 ['DataView1-dup', [new DataView(arrayBuffer1), new DataView(arrayBuffer1)],
dataViewCompare2], | |
156 ['DataView1-dup2', [new DataView(arrayBuffer1), {x:1, y:1}, new DataView(arr
ayBuffer1)], dataViewCompare3], | |
157 ['DataView128', new DataView(createBuffer(128)), dataViewCompare], | |
158 ['DataView1_offset_at_end', new DataView(createBuffer(1), 1, 0), dataViewCom
pare], | |
159 ['DataView128_offset_at_end', new DataView(createBuffer(128), 128, 0), dataV
iewCompare], | |
160 ['DataView128_offset_slice_length_0', new DataView(createBuffer(128), 64, 0)
, dataViewCompare], | |
161 ['DataView128_offset_slice_length_1', new DataView(createBuffer(128), 64, 1)
, dataViewCompare], | |
162 ['DataView128_offset_slice_length_16', new DataView(createBuffer(128), 64, 1
6), dataViewCompare], | |
163 ['DataView128_offset_slice_unaligned', new DataView(createBuffer(128), 63, 1
5), dataViewCompare] | |
164 ]; | |
165 | |
166 testList = testList.concat(basicBufferTypes.map(function(t) | |
167 {return [t[0] + "_0", createTypedArray(t[1], 0), typedArrayCompare];})); | |
168 testList = testList.concat(basicBufferTypes.map(function(t) | |
169 {return [t[0] + "_1", createTypedArray(t[1], 1), typedArrayCompare];})); | |
170 testList = testList.concat(basicBufferTypes.map(function(t) | |
171 {return [t[0] + "_128", createTypedArray(t[1], 128), typedArrayCompare];})); | |
172 testList = testList.concat(basicBufferTypes.map(function(t) | |
173 {return [t[0] + "_0_buffer", createTypedArrayOverBuffer(t[1], t[2], 0), type
dArrayCompare];})); | |
174 testList = testList.concat(basicBufferTypes.map(function(t) | |
175 {return [t[0] + "_1_buffer", createTypedArrayOverBuffer(t[1], t[2], 1), type
dArrayCompare];})); | |
176 testList = testList.concat(basicBufferTypes.map(function(t) | |
177 {return [t[0] + "_128_buffer", createTypedArrayOverBuffer(t[1], t[2], 128),
typedArrayCompare];})); | |
178 testList = testList.concat(basicBufferTypes.map(function(t) | |
179 {return [t[0] + "_1_buffer_offset_at_end", createTypedArrayOverBuffer(t[1],
t[2], 1, 1, 0), typedArrayCompare];})); | |
180 testList = testList.concat(basicBufferTypes.map(function(t) | |
181 {return [t[0] + "_128_buffer_offset_at_end", createTypedArrayOverBuffer(t[1]
, t[2], 128, 128, 0), typedArrayCompare];})); | |
182 testList = testList.concat(basicBufferTypes.map(function(t) | |
183 {return [t[0] + "_128_buffer_offset_slice_length_0", createTypedArrayOverBuf
fer(t[1], t[2], 128, 64, 0), typedArrayCompare];})); | |
184 testList = testList.concat(basicBufferTypes.map(function(t) | |
185 {return [t[0] + "_128_buffer_offset_slice_length_1", createTypedArrayOverBuf
fer(t[1], t[2], 128, 64, 1), typedArrayCompare];})); | |
186 testList = testList.concat(basicBufferTypes.map(function(t) | |
187 {return [t[0] + "_128_buffer_offset_slice_length_16", createTypedArrayOverBu
ffer(t[1], t[2], 128, 64, 16), typedArrayCompare];})); | |
188 | |
189 function doneTest() { | |
190 if (++window.testsComplete == testList.length) { | |
191 finishJSTest(); | |
192 } | |
193 } | |
194 | |
195 function windowHandleMessage(e) { | |
196 var currentTest = testList[e.data.testNum]; | |
197 var expectedResult = currentTest[1]; | |
198 try { | |
199 currentTest[2](currentTest[0], e.data.testData, expectedResult); | |
200 } catch(e) { | |
201 testFailed(currentTest[0] + ": unexpected exception " + e); | |
202 } | |
203 doneTest(); | |
204 } | |
205 window.addEventListener('message', windowHandleMessage); | |
206 | |
207 for (var t = 0; t < testList.length; ++t) { | |
208 var currentTest = testList[t]; | |
209 var message = {testNum: t, testData: currentTest[1]}; | |
210 try { | |
211 window.postMessage(message, '*'); | |
212 } catch(e) { | |
213 testFailed(currentTest[0], ": unexpected postMessage exception " + e); | |
214 doneTest(); | |
215 } | |
216 } | |
OLD | NEW |