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 |