OLD | NEW |
1 if (self.importScripts) { | 1 if (self.importScripts) { |
2 importScripts('../resources/fetch-test-helpers.js'); | 2 importScripts('../resources/fetch-test-helpers.js'); |
3 } | 3 } |
4 | 4 |
5 function arrayBufferToString(buffer) { | 5 function arrayBufferToString(buffer) { |
6 return new Promise(function(resolve) { | 6 return new Promise(function(resolve) { |
7 var reader = new FileReader(); | 7 var reader = new FileReader(); |
8 reader.onload = function() { | 8 reader.onload = function() { |
9 resolve(reader.result); | 9 resolve(reader.result); |
10 }; | 10 }; |
11 reader.readAsText(new Blob([buffer])); | 11 reader.readAsText(new Blob([buffer])); |
12 }); | 12 }); |
13 } | 13 } |
14 | 14 |
15 function readStream(reader, values) { | 15 function readStream(reader, values) { |
16 while (reader.state === 'readable') { | 16 reader.read().then(function(r) { |
17 values.push(reader.read()); | 17 if (!r.done) { |
18 } | 18 values.push(r.value); |
19 if (reader.state === 'waiting') { | |
20 return reader.ready.then(function() { | |
21 readStream(reader, values); | 19 readStream(reader, values); |
22 }); | 20 } |
23 } | 21 }); |
24 return reader.closed; | 22 return reader.closed; |
25 } | 23 } |
26 | 24 |
27 sequential_promise_test(function(test) { | 25 sequential_promise_test(function(test) { |
28 var response; | |
29 var reader; | |
30 return fetch('/fetch/resources/doctype.html') | |
31 .then(function(resp) { | |
32 response = resp; | |
33 reader = resp.body.getReader(); | |
34 return reader.ready; | |
35 }) | |
36 .then(function() { | |
37 if (reader.state !== 'readable') { | |
38 return Promise.reject(TypeError('stream state get wrong')); | |
39 } else { | |
40 reader.releaseLock(); | |
41 return response.text(); | |
42 } | |
43 }) | |
44 .then(function(text) { | |
45 assert_equals(text, '<!DOCTYPE html>\n', 'response.body'); | |
46 }) | |
47 }, 'FetchTextAfterStreamGetReadableTest'); | |
48 | |
49 sequential_promise_test(function(test) { | |
50 return fetch('/fetch/resources/doctype.html') | 26 return fetch('/fetch/resources/doctype.html') |
51 .then(function(response) { | 27 .then(function(response) { |
52 // Accessing the body property makes the stream start working. | 28 // Accessing the body property makes the stream start working. |
53 var stream = response.body; | 29 var stream = response.body; |
54 return response.text(); | 30 return response.text(); |
55 }) | 31 }) |
56 .then(function(text) { | 32 .then(function(text) { |
57 assert_equals(text, '<!DOCTYPE html>\n'); | 33 assert_equals(text, '<!DOCTYPE html>\n'); |
58 }) | 34 }) |
59 }, 'FetchTextAfterAccessingStreamTest'); | 35 }, 'FetchTextAfterAccessingStreamTest'); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 assert_equals(text, '<!DOCTYPE html>\n'); | 120 assert_equals(text, '<!DOCTYPE html>\n'); |
145 }) | 121 }) |
146 }, 'TextTest'); | 122 }, 'TextTest'); |
147 | 123 |
148 sequential_promise_test(function(test) { | 124 sequential_promise_test(function(test) { |
149 var expectedText = ''; | 125 var expectedText = ''; |
150 for (var i = 0; i < 100; ++i) | 126 for (var i = 0; i < 100; ++i) |
151 expectedText += i; | 127 expectedText += i; |
152 | 128 |
153 var values = []; | 129 var values = []; |
154 function partialReadResponse(response, read_count) { | 130 function partialReadResponse(reader, read_count) { |
155 var reader = response.body.getReader(); | 131 return Promise.resolve().then(function() { |
156 function read(resolve, reject) { | 132 var promise = Promise.resolve(); |
157 while (reader.state === 'readable') { | 133 for (var i = 0; i < read_count; ++i) { |
158 values.push(reader.read()); | 134 promise = reader.read().then(function(r) { |
159 if (values.length > read_count) { | 135 if (!r.done) { |
160 reader.releaseLock(); | 136 values.push(r.value); |
161 resolve(); | 137 } |
162 return; | 138 }); |
163 } | 139 } |
164 } | 140 return promise; |
165 if (reader.state === 'closed') { | 141 }); |
166 reader.releaseLock(); | |
167 resolve(); | |
168 return; | |
169 } | |
170 reader.ready.then(function() { | |
171 read(resolve, reject); | |
172 }).catch(reject); | |
173 } | |
174 return new Promise(read); | |
175 } | 142 } |
176 var response; | 143 var response; |
| 144 var reader; |
177 return fetch('/fetch/resources/progressive.php') | 145 return fetch('/fetch/resources/progressive.php') |
178 .then(function(res) { | 146 .then(function(res) { |
179 response = res; | 147 response = res; |
180 return partialReadResponse(response, 10); | 148 reader = response.body.getReader(); |
| 149 return partialReadResponse(reader, 10); |
181 }) | 150 }) |
182 .then(function() { | 151 .then(function() { |
| 152 return response.text().then(unreached_fulfillment(test), function() { |
| 153 // response.text() should fail because we have a reader. |
| 154 }); |
| 155 }) |
| 156 .then(function() { |
| 157 reader.releaseLock(); |
183 return Promise.all( | 158 return Promise.all( |
184 values.map(arrayBufferToString).concat(response.text())); | 159 values.map(arrayBufferToString).concat(response.text())); |
185 }) | 160 }) |
186 .then(function(strings) { | 161 .then(function(strings) { |
187 var string = String.prototype.concat.apply('', strings); | 162 var string = String.prototype.concat.apply('', strings); |
188 assert_equals(string, expectedText); | 163 assert_equals(string, expectedText); |
189 }) | 164 }) |
190 }, 'PartiallyReadFromStreamAndReadTextTest'); | 165 }, 'PartiallyReadFromStreamAndReadTextTest'); |
191 | 166 |
192 sequential_promise_test_done(); | 167 sequential_promise_test_done(); |
193 done(); | 168 done(); |
OLD | NEW |