OLD | NEW |
(Empty) | |
| 1 if (self.importScripts) { |
| 2 importScripts('/fetch/resources/fetch-test-helpers.js'); |
| 3 } |
| 4 |
| 5 function read_until_end(reader) { |
| 6 var chunks = []; |
| 7 function rec(resolve, reject) { |
| 8 while (reader.state === 'readable') { |
| 9 chunks.push(reader.read()); |
| 10 } |
| 11 if (reader.state === 'closed') { |
| 12 resolve(chunks); |
| 13 return; |
| 14 } |
| 15 if (reader.state === 'errored') { |
| 16 resolve(reader.closed); |
| 17 } |
| 18 reader.ready.then(function() { |
| 19 rec(resolve, reject); |
| 20 }).catch(reject); |
| 21 } |
| 22 return new Promise(rec); |
| 23 } |
| 24 |
| 25 promise_test(function(t) { |
| 26 return fetch('/fetch/resources/doctype.html').then(function(res) { |
| 27 var stream = res.body; |
| 28 var reader = stream.getReader(); |
| 29 assert_true(reader.isActive); |
| 30 assert_throws({name: 'TypeError'}, function() { stream.getReader() }); |
| 31 reader.releaseLock(); |
| 32 var another = stream.getReader(); |
| 33 assert_not_equals(another, reader); |
| 34 assert_false(reader.isActive); |
| 35 assert_true(another.isActive); |
| 36 }); |
| 37 }, 'ExclusiveStreamReader acquisition / releasing'); |
| 38 |
| 39 promise_test(function(t) { |
| 40 function wait_until_readable(reader) { |
| 41 return reader.ready.then(function() { |
| 42 if (reader.state === 'waiting') { |
| 43 return wait_until_readable(reader); |
| 44 } |
| 45 if (reader.state === 'readable') { |
| 46 return undefined; |
| 47 } |
| 48 return Promise.reject(new Error('state = ' + reader.state)); |
| 49 }); |
| 50 } |
| 51 var stream; |
| 52 var reader; |
| 53 return fetch('/fetch/resources/doctype.html').then(function(res) { |
| 54 stream = res.body; |
| 55 reader = stream.getReader(); |
| 56 return wait_until_readable(reader); |
| 57 }).then(function() { |
| 58 assert_equals(reader.state, 'readable'); |
| 59 assert_equals(stream.state, 'waiting'); |
| 60 reader.releaseLock(); |
| 61 assert_equals(reader.state, 'closed'); |
| 62 assert_equals(stream.state, 'readable'); |
| 63 var another = stream.getReader(); |
| 64 assert_equals(reader.state, 'closed'); |
| 65 assert_equals(stream.state, 'waiting'); |
| 66 assert_equals(another.state, 'readable'); |
| 67 }); |
| 68 }, 'ExclusiveStreamReader state masking'); |
| 69 |
| 70 promise_test(function(t) { |
| 71 return fetch('/fetch/resources/doctype.html').then(function(res) { |
| 72 var reader = res.body.getReader(); |
| 73 return read_until_end(reader); |
| 74 }).then(function(chunks) { |
| 75 var size = 0; |
| 76 for (var chunk of chunks) { |
| 77 size += chunk.byteLength; |
| 78 } |
| 79 var buffer = new Uint8Array(size); |
| 80 var offset = 0; |
| 81 for (var chunk of chunks) { |
| 82 buffer.set(new Uint8Array(chunk), offset); |
| 83 offset += chunk.byteLength; |
| 84 } |
| 85 return new TextDecoder().decode(buffer); |
| 86 }).then(function(string) { |
| 87 assert_equals(string, '<!DOCTYPE html>\n'); |
| 88 }); |
| 89 }, 'read contents with ExclusiveStreamReader'); |
| 90 |
| 91 done(); |
OLD | NEW |