OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/streams/ExclusiveStreamReader.h" | 6 #include "core/streams/ReadableStreamReader.h" |
7 | 7 |
8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
10 #include "bindings/core/v8/ToV8.h" | 10 #include "bindings/core/v8/ToV8.h" |
11 #include "bindings/core/v8/V8ThrowException.h" | 11 #include "bindings/core/v8/V8ThrowException.h" |
12 #include "core/dom/DOMException.h" | 12 #include "core/dom/DOMException.h" |
13 #include "core/dom/Document.h" | 13 #include "core/dom/Document.h" |
14 #include "core/dom/ExceptionCode.h" | 14 #include "core/dom/ExceptionCode.h" |
15 #include "core/streams/ReadableStream.h" | 15 #include "core/streams/ReadableStream.h" |
16 #include "core/streams/ReadableStreamImpl.h" | 16 #include "core/streams/ReadableStreamImpl.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 void pullSource() override { } | 57 void pullSource() override { } |
58 ScriptPromise cancelSource(ScriptState* scriptState, ScriptValue reason) { r
eturn ScriptPromise::cast(scriptState, reason); } | 58 ScriptPromise cancelSource(ScriptState* scriptState, ScriptValue reason) { r
eturn ScriptPromise::cast(scriptState, reason); } |
59 DEFINE_INLINE_VIRTUAL_TRACE() { UnderlyingSource::trace(visitor); } | 59 DEFINE_INLINE_VIRTUAL_TRACE() { UnderlyingSource::trace(visitor); } |
60 }; | 60 }; |
61 | 61 |
62 class PermissiveStrategy final : public StringStream::Strategy { | 62 class PermissiveStrategy final : public StringStream::Strategy { |
63 public: | 63 public: |
64 bool shouldApplyBackpressure(size_t, ReadableStream*) override { return fals
e; } | 64 bool shouldApplyBackpressure(size_t, ReadableStream*) override { return fals
e; } |
65 }; | 65 }; |
66 | 66 |
67 class ExclusiveStreamReaderTest : public ::testing::Test { | 67 class ReadableStreamReaderTest : public ::testing::Test { |
68 public: | 68 public: |
69 ExclusiveStreamReaderTest() | 69 ReadableStreamReaderTest() |
70 : m_page(DummyPageHolder::create(IntSize(1, 1))) | 70 : m_page(DummyPageHolder::create(IntSize(1, 1))) |
71 , m_scope(scriptState()) | 71 , m_scope(scriptState()) |
72 , m_exceptionState(ExceptionState::ConstructionContext, "property", "int
erface", scriptState()->context()->Global(), isolate()) | 72 , m_exceptionState(ExceptionState::ConstructionContext, "property", "int
erface", scriptState()->context()->Global(), isolate()) |
73 , m_stream(new StringStream(scriptState()->executionContext(), new NoopU
nderlyingSource, new PermissiveStrategy)) | 73 , m_stream(new StringStream(scriptState()->executionContext(), new NoopU
nderlyingSource, new PermissiveStrategy)) |
74 { | 74 { |
75 m_stream->didSourceStart(); | 75 m_stream->didSourceStart(); |
76 } | 76 } |
77 | 77 |
78 ~ExclusiveStreamReaderTest() | 78 ~ReadableStreamReaderTest() |
79 { | 79 { |
80 // We need to call |error| in order to make | 80 // We need to call |error| in order to make |
81 // ActiveDOMObject::hasPendingActivity return false. | 81 // ActiveDOMObject::hasPendingActivity return false. |
82 m_stream->error(DOMException::create(AbortError, "done")); | 82 m_stream->error(DOMException::create(AbortError, "done")); |
83 } | 83 } |
84 | 84 |
85 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } | 85 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume
nt().frame()); } |
86 v8::Isolate* isolate() { return scriptState()->isolate(); } | 86 v8::Isolate* isolate() { return scriptState()->isolate(); } |
87 | 87 |
88 v8::Handle<v8::Function> createCaptor(String* value) | 88 v8::Handle<v8::Function> createCaptor(String* value) |
89 { | 89 { |
90 return StringCapturingFunction::createFunction(scriptState(), value); | 90 return StringCapturingFunction::createFunction(scriptState(), value); |
91 } | 91 } |
92 | 92 |
93 OwnPtr<DummyPageHolder> m_page; | 93 OwnPtr<DummyPageHolder> m_page; |
94 ScriptState::Scope m_scope; | 94 ScriptState::Scope m_scope; |
95 ExceptionState m_exceptionState; | 95 ExceptionState m_exceptionState; |
96 Persistent<StringStream> m_stream; | 96 Persistent<StringStream> m_stream; |
97 }; | 97 }; |
98 | 98 |
99 TEST_F(ExclusiveStreamReaderTest, Construct) | 99 TEST_F(ReadableStreamReaderTest, Construct) |
100 { | 100 { |
101 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 101 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
102 EXPECT_TRUE(reader->isActive()); | 102 EXPECT_TRUE(reader->isActive()); |
103 } | 103 } |
104 | 104 |
105 TEST_F(ExclusiveStreamReaderTest, Release) | 105 TEST_F(ReadableStreamReaderTest, Release) |
106 { | 106 { |
107 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 107 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
108 EXPECT_TRUE(reader->isActive()); | 108 EXPECT_TRUE(reader->isActive()); |
109 reader->releaseLock(); | 109 reader->releaseLock(); |
110 EXPECT_FALSE(reader->isActive()); | 110 EXPECT_FALSE(reader->isActive()); |
111 | 111 |
112 ExclusiveStreamReader* another = new ExclusiveStreamReader(m_stream); | 112 ReadableStreamReader* another = new ReadableStreamReader(m_stream); |
113 EXPECT_TRUE(another->isActive()); | 113 EXPECT_TRUE(another->isActive()); |
114 EXPECT_FALSE(reader->isActive()); | 114 EXPECT_FALSE(reader->isActive()); |
115 reader->releaseLock(); | 115 reader->releaseLock(); |
116 EXPECT_TRUE(another->isActive()); | 116 EXPECT_TRUE(another->isActive()); |
117 EXPECT_FALSE(reader->isActive()); | 117 EXPECT_FALSE(reader->isActive()); |
118 } | 118 } |
119 | 119 |
120 TEST_F(ExclusiveStreamReaderTest, MaskState) | 120 TEST_F(ReadableStreamReaderTest, MaskState) |
121 { | 121 { |
122 m_stream->enqueue("hello"); | 122 m_stream->enqueue("hello"); |
123 EXPECT_EQ("readable", m_stream->stateString()); | 123 EXPECT_EQ("readable", m_stream->stateString()); |
124 | 124 |
125 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 125 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
126 EXPECT_EQ("waiting", m_stream->stateString()); | 126 EXPECT_EQ("waiting", m_stream->stateString()); |
127 EXPECT_EQ("readable", reader->state()); | 127 EXPECT_EQ("readable", reader->state()); |
128 | 128 |
129 reader->releaseLock(); | 129 reader->releaseLock(); |
130 EXPECT_EQ("readable", m_stream->stateString()); | 130 EXPECT_EQ("readable", m_stream->stateString()); |
131 EXPECT_EQ("closed", reader->state()); | 131 EXPECT_EQ("closed", reader->state()); |
132 | 132 |
133 ExclusiveStreamReader* another = new ExclusiveStreamReader(m_stream); | 133 ReadableStreamReader* another = new ReadableStreamReader(m_stream); |
134 EXPECT_EQ("waiting", m_stream->stateString()); | 134 EXPECT_EQ("waiting", m_stream->stateString()); |
135 EXPECT_EQ("closed", reader->state()); | 135 EXPECT_EQ("closed", reader->state()); |
136 EXPECT_EQ("readable", another->state()); | 136 EXPECT_EQ("readable", another->state()); |
137 } | 137 } |
138 | 138 |
139 TEST_F(ExclusiveStreamReaderTest, MaskReady) | 139 TEST_F(ReadableStreamReaderTest, MaskReady) |
140 { | 140 { |
141 m_stream->enqueue("hello"); | 141 m_stream->enqueue("hello"); |
142 isolate()->RunMicrotasks(); | 142 isolate()->RunMicrotasks(); |
143 | 143 |
144 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 144 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
145 { | 145 { |
146 String s1, s2; | 146 String s1, s2; |
147 reader->ready(scriptState()).then(createCaptor(&s1)); | 147 reader->ready(scriptState()).then(createCaptor(&s1)); |
148 m_stream->ready(scriptState()).then(createCaptor(&s2)); | 148 m_stream->ready(scriptState()).then(createCaptor(&s2)); |
149 isolate()->RunMicrotasks(); | 149 isolate()->RunMicrotasks(); |
150 EXPECT_EQ("undefined", s1); | 150 EXPECT_EQ("undefined", s1); |
151 EXPECT_TRUE(s2.isNull()); | 151 EXPECT_TRUE(s2.isNull()); |
152 | 152 |
153 reader->releaseLock(); | 153 reader->releaseLock(); |
154 isolate()->RunMicrotasks(); | 154 isolate()->RunMicrotasks(); |
155 EXPECT_EQ("undefined", s2); | 155 EXPECT_EQ("undefined", s2); |
156 } | 156 } |
157 | 157 |
158 { | 158 { |
159 String s1, s2; | 159 String s1, s2; |
160 reader->ready(scriptState()).then(createCaptor(&s1)); | 160 reader->ready(scriptState()).then(createCaptor(&s1)); |
161 m_stream->ready(scriptState()).then(createCaptor(&s2)); | 161 m_stream->ready(scriptState()).then(createCaptor(&s2)); |
162 isolate()->RunMicrotasks(); | 162 isolate()->RunMicrotasks(); |
163 EXPECT_EQ("undefined", s1); | 163 EXPECT_EQ("undefined", s1); |
164 EXPECT_EQ("undefined", s2); | 164 EXPECT_EQ("undefined", s2); |
165 } | 165 } |
166 | 166 |
167 ExclusiveStreamReader* another = new ExclusiveStreamReader(m_stream); | 167 ReadableStreamReader* another = new ReadableStreamReader(m_stream); |
168 { | 168 { |
169 String s1, s2, s3; | 169 String s1, s2, s3; |
170 reader->ready(scriptState()).then(createCaptor(&s1)); | 170 reader->ready(scriptState()).then(createCaptor(&s1)); |
171 m_stream->ready(scriptState()).then(createCaptor(&s2)); | 171 m_stream->ready(scriptState()).then(createCaptor(&s2)); |
172 another->ready(scriptState()).then(createCaptor(&s3)); | 172 another->ready(scriptState()).then(createCaptor(&s3)); |
173 isolate()->RunMicrotasks(); | 173 isolate()->RunMicrotasks(); |
174 EXPECT_EQ("undefined", s1); | 174 EXPECT_EQ("undefined", s1); |
175 EXPECT_TRUE(s2.isNull()); | 175 EXPECT_TRUE(s2.isNull()); |
176 EXPECT_EQ("undefined", s3); | 176 EXPECT_EQ("undefined", s3); |
177 | 177 |
178 // We need to call here to ensure all promises having captors are | 178 // We need to call here to ensure all promises having captors are |
179 // resolved or rejected. | 179 // resolved or rejected. |
180 m_stream->error(DOMException::create(AbortError, "done")); | 180 m_stream->error(DOMException::create(AbortError, "done")); |
181 isolate()->RunMicrotasks(); | 181 isolate()->RunMicrotasks(); |
182 } | 182 } |
183 } | 183 } |
184 | 184 |
185 TEST_F(ExclusiveStreamReaderTest, ReaderRead) | 185 TEST_F(ReadableStreamReaderTest, ReaderRead) |
186 { | 186 { |
187 m_stream->enqueue("hello"); | 187 m_stream->enqueue("hello"); |
188 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 188 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
189 | 189 |
190 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 190 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
191 ScriptValue value = reader->read(scriptState(), m_exceptionState); | 191 ScriptValue value = reader->read(scriptState(), m_exceptionState); |
192 | 192 |
193 EXPECT_FALSE(m_exceptionState.hadException()); | 193 EXPECT_FALSE(m_exceptionState.hadException()); |
194 String stringValue; | 194 String stringValue; |
195 EXPECT_TRUE(value.toString(stringValue)); | 195 EXPECT_TRUE(value.toString(stringValue)); |
196 EXPECT_EQ("hello", stringValue); | 196 EXPECT_EQ("hello", stringValue); |
197 } | 197 } |
198 | 198 |
199 TEST_F(ExclusiveStreamReaderTest, StreamReadShouldFailWhenLocked) | 199 TEST_F(ReadableStreamReaderTest, StreamReadShouldFailWhenLocked) |
200 { | 200 { |
201 m_stream->enqueue("hello"); | 201 m_stream->enqueue("hello"); |
202 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 202 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
203 EXPECT_TRUE(reader->isActive()); | 203 EXPECT_TRUE(reader->isActive()); |
204 | 204 |
205 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 205 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
206 m_stream->read(scriptState(), m_exceptionState); | 206 m_stream->read(scriptState(), m_exceptionState); |
207 | 207 |
208 EXPECT_TRUE(m_exceptionState.hadException()); | 208 EXPECT_TRUE(m_exceptionState.hadException()); |
209 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 209 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
210 } | 210 } |
211 | 211 |
212 TEST_F(ExclusiveStreamReaderTest, ReaderReadShouldFailWhenNotLocked) | 212 TEST_F(ReadableStreamReaderTest, ReaderReadShouldFailWhenNotLocked) |
213 { | 213 { |
214 m_stream->enqueue("hello"); | 214 m_stream->enqueue("hello"); |
215 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 215 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
216 reader->releaseLock(); | 216 reader->releaseLock(); |
217 EXPECT_FALSE(reader->isActive()); | 217 EXPECT_FALSE(reader->isActive()); |
218 | 218 |
219 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 219 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
220 reader->read(scriptState(), m_exceptionState); | 220 reader->read(scriptState(), m_exceptionState); |
221 | 221 |
222 EXPECT_TRUE(m_exceptionState.hadException()); | 222 EXPECT_TRUE(m_exceptionState.hadException()); |
223 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); | 223 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal()); |
224 } | 224 } |
225 | 225 |
226 TEST_F(ExclusiveStreamReaderTest, ClosedReader) | 226 TEST_F(ReadableStreamReaderTest, ClosedReader) |
227 { | 227 { |
228 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 228 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
229 | 229 |
230 m_stream->close(); | 230 m_stream->close(); |
231 | 231 |
232 EXPECT_EQ("closed", m_stream->stateString()); | 232 EXPECT_EQ("closed", m_stream->stateString()); |
233 EXPECT_EQ("closed", reader->state()); | 233 EXPECT_EQ("closed", reader->state()); |
234 EXPECT_FALSE(reader->isActive()); | 234 EXPECT_FALSE(reader->isActive()); |
235 | 235 |
236 String onClosedFulfilled, onClosedRejected; | 236 String onClosedFulfilled, onClosedRejected; |
237 String onReadyFulfilled, onReadyRejected; | 237 String onReadyFulfilled, onReadyRejected; |
238 isolate()->RunMicrotasks(); | 238 isolate()->RunMicrotasks(); |
239 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); | 239 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); |
240 reader->ready(scriptState()).then(createCaptor(&onReadyFulfilled), createCap
tor(&onReadyRejected)); | 240 reader->ready(scriptState()).then(createCaptor(&onReadyFulfilled), createCap
tor(&onReadyRejected)); |
241 EXPECT_TRUE(onClosedFulfilled.isNull()); | 241 EXPECT_TRUE(onClosedFulfilled.isNull()); |
242 EXPECT_TRUE(onClosedRejected.isNull()); | 242 EXPECT_TRUE(onClosedRejected.isNull()); |
243 EXPECT_TRUE(onReadyFulfilled.isNull()); | 243 EXPECT_TRUE(onReadyFulfilled.isNull()); |
244 EXPECT_TRUE(onReadyRejected.isNull()); | 244 EXPECT_TRUE(onReadyRejected.isNull()); |
245 | 245 |
246 isolate()->RunMicrotasks(); | 246 isolate()->RunMicrotasks(); |
247 EXPECT_EQ("undefined", onClosedFulfilled); | 247 EXPECT_EQ("undefined", onClosedFulfilled); |
248 EXPECT_TRUE(onClosedRejected.isNull()); | 248 EXPECT_TRUE(onClosedRejected.isNull()); |
249 EXPECT_EQ("undefined", onReadyFulfilled); | 249 EXPECT_EQ("undefined", onReadyFulfilled); |
250 EXPECT_TRUE(onReadyRejected.isNull()); | 250 EXPECT_TRUE(onReadyRejected.isNull()); |
251 } | 251 } |
252 | 252 |
253 TEST_F(ExclusiveStreamReaderTest, ErroredReader) | 253 TEST_F(ReadableStreamReaderTest, ErroredReader) |
254 { | 254 { |
255 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 255 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
256 | 256 |
257 m_stream->error(DOMException::create(SyntaxError, "some error")); | 257 m_stream->error(DOMException::create(SyntaxError, "some error")); |
258 | 258 |
259 EXPECT_EQ("errored", m_stream->stateString()); | 259 EXPECT_EQ("errored", m_stream->stateString()); |
260 EXPECT_EQ("errored", reader->state()); | 260 EXPECT_EQ("errored", reader->state()); |
261 EXPECT_FALSE(reader->isActive()); | 261 EXPECT_FALSE(reader->isActive()); |
262 | 262 |
263 String onClosedFulfilled, onClosedRejected; | 263 String onClosedFulfilled, onClosedRejected; |
264 String onReadyFulfilled, onReadyRejected; | 264 String onReadyFulfilled, onReadyRejected; |
265 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); | 265 reader->closed(scriptState()).then(createCaptor(&onClosedFulfilled), createC
aptor(&onClosedRejected)); |
266 reader->ready(scriptState()).then(createCaptor(&onReadyFulfilled), createCap
tor(&onReadyRejected)); | 266 reader->ready(scriptState()).then(createCaptor(&onReadyFulfilled), createCap
tor(&onReadyRejected)); |
267 EXPECT_TRUE(onClosedFulfilled.isNull()); | 267 EXPECT_TRUE(onClosedFulfilled.isNull()); |
268 EXPECT_TRUE(onClosedRejected.isNull()); | 268 EXPECT_TRUE(onClosedRejected.isNull()); |
269 EXPECT_TRUE(onReadyFulfilled.isNull()); | 269 EXPECT_TRUE(onReadyFulfilled.isNull()); |
270 EXPECT_TRUE(onReadyRejected.isNull()); | 270 EXPECT_TRUE(onReadyRejected.isNull()); |
271 | 271 |
272 isolate()->RunMicrotasks(); | 272 isolate()->RunMicrotasks(); |
273 EXPECT_TRUE(onClosedFulfilled.isNull()); | 273 EXPECT_TRUE(onClosedFulfilled.isNull()); |
274 EXPECT_EQ("SyntaxError: some error", onClosedRejected); | 274 EXPECT_EQ("SyntaxError: some error", onClosedRejected); |
275 EXPECT_EQ("undefined", onReadyFulfilled); | 275 EXPECT_EQ("undefined", onReadyFulfilled); |
276 EXPECT_TRUE(onReadyRejected.isNull()); | 276 EXPECT_TRUE(onReadyRejected.isNull()); |
277 } | 277 } |
278 | 278 |
279 TEST_F(ExclusiveStreamReaderTest, ReadyPromiseShouldNotBeResolvedWhenLocked) | 279 TEST_F(ReadableStreamReaderTest, ReadyPromiseShouldNotBeResolvedWhenLocked) |
280 { | 280 { |
281 String s; | 281 String s; |
282 ScriptPromise ready = m_stream->ready(scriptState()); | 282 ScriptPromise ready = m_stream->ready(scriptState()); |
283 ready.then(createCaptor(&s)); | 283 ready.then(createCaptor(&s)); |
284 isolate()->RunMicrotasks(); | 284 isolate()->RunMicrotasks(); |
285 EXPECT_TRUE(s.isNull()); | 285 EXPECT_TRUE(s.isNull()); |
286 | 286 |
287 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 287 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
288 EXPECT_TRUE(reader->isActive()); | 288 EXPECT_TRUE(reader->isActive()); |
289 EXPECT_NE(ready, m_stream->ready(scriptState())); | 289 EXPECT_NE(ready, m_stream->ready(scriptState())); |
290 | 290 |
291 isolate()->RunMicrotasks(); | 291 isolate()->RunMicrotasks(); |
292 EXPECT_TRUE(s.isNull()); | 292 EXPECT_TRUE(s.isNull()); |
293 | 293 |
294 // We need to call here to ensure all promises having captors are resolved | 294 // We need to call here to ensure all promises having captors are resolved |
295 // or rejected. | 295 // or rejected. |
296 m_stream->error(DOMException::create(AbortError, "done")); | 296 m_stream->error(DOMException::create(AbortError, "done")); |
297 isolate()->RunMicrotasks(); | 297 isolate()->RunMicrotasks(); |
298 } | 298 } |
299 | 299 |
300 TEST_F(ExclusiveStreamReaderTest, ReaderShouldBeReleasedWhenClosed) | 300 TEST_F(ReadableStreamReaderTest, ReaderShouldBeReleasedWhenClosed) |
301 { | 301 { |
302 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 302 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
303 EXPECT_TRUE(reader->isActive()); | 303 EXPECT_TRUE(reader->isActive()); |
304 m_stream->close(); | 304 m_stream->close(); |
305 EXPECT_FALSE(reader->isActive()); | 305 EXPECT_FALSE(reader->isActive()); |
306 } | 306 } |
307 | 307 |
308 TEST_F(ExclusiveStreamReaderTest, ReaderShouldBeReleasedWhenCanceled) | 308 TEST_F(ReadableStreamReaderTest, ReaderShouldBeReleasedWhenCanceled) |
309 { | 309 { |
310 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 310 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
311 EXPECT_TRUE(reader->isActive()); | 311 EXPECT_TRUE(reader->isActive()); |
312 reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isola
te()))); | 312 reader->cancel(scriptState(), ScriptValue(scriptState(), v8::Undefined(isola
te()))); |
313 EXPECT_FALSE(reader->isActive()); | 313 EXPECT_FALSE(reader->isActive()); |
314 } | 314 } |
315 | 315 |
316 TEST_F(ExclusiveStreamReaderTest, ReaderShouldBeReleasedWhenErrored) | 316 TEST_F(ReadableStreamReaderTest, ReaderShouldBeReleasedWhenErrored) |
317 { | 317 { |
318 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 318 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
319 EXPECT_TRUE(reader->isActive()); | 319 EXPECT_TRUE(reader->isActive()); |
320 m_stream->error(DOMException::create(SyntaxError, "some error")); | 320 m_stream->error(DOMException::create(SyntaxError, "some error")); |
321 EXPECT_FALSE(reader->isActive()); | 321 EXPECT_FALSE(reader->isActive()); |
322 } | 322 } |
323 | 323 |
324 TEST_F(ExclusiveStreamReaderTest, StreamCancelShouldFailWhenLocked) | 324 TEST_F(ReadableStreamReaderTest, StreamCancelShouldFailWhenLocked) |
325 { | 325 { |
326 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 326 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
327 EXPECT_TRUE(reader->isActive()); | 327 EXPECT_TRUE(reader->isActive()); |
328 ScriptPromise p = m_stream->cancel(scriptState(), ScriptValue(scriptState(),
v8::Undefined(isolate()))); | 328 ScriptPromise p = m_stream->cancel(scriptState(), ScriptValue(scriptState(),
v8::Undefined(isolate()))); |
329 EXPECT_EQ(ReadableStream::Waiting, m_stream->stateInternal()); | 329 EXPECT_EQ(ReadableStream::Waiting, m_stream->stateInternal()); |
330 String onFulfilled, onRejected; | 330 String onFulfilled, onRejected; |
331 p.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); | 331 p.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
332 | 332 |
333 EXPECT_TRUE(onFulfilled.isNull()); | 333 EXPECT_TRUE(onFulfilled.isNull()); |
334 EXPECT_TRUE(onRejected.isNull()); | 334 EXPECT_TRUE(onRejected.isNull()); |
335 isolate()->RunMicrotasks(); | 335 isolate()->RunMicrotasks(); |
336 EXPECT_TRUE(onFulfilled.isNull()); | 336 EXPECT_TRUE(onFulfilled.isNull()); |
337 EXPECT_EQ("TypeError: this stream is locked to an ExclusiveStreamReader", on
Rejected); | 337 EXPECT_EQ("TypeError: this stream is locked to a ReadableStreamReader", onRe
jected); |
338 } | 338 } |
339 | 339 |
340 TEST_F(ExclusiveStreamReaderTest, ReaderCancelShouldNotWorkWhenNotActive) | 340 TEST_F(ReadableStreamReaderTest, ReaderCancelShouldNotWorkWhenNotActive) |
341 { | 341 { |
342 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 342 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
343 reader->releaseLock(); | 343 reader->releaseLock(); |
344 EXPECT_FALSE(reader->isActive()); | 344 EXPECT_FALSE(reader->isActive()); |
345 | 345 |
346 ScriptPromise p = reader->cancel(scriptState(), ScriptValue(scriptState(), v
8::Undefined(isolate()))); | 346 ScriptPromise p = reader->cancel(scriptState(), ScriptValue(scriptState(), v
8::Undefined(isolate()))); |
347 EXPECT_EQ(ReadableStream::Waiting, m_stream->stateInternal()); | 347 EXPECT_EQ(ReadableStream::Waiting, m_stream->stateInternal()); |
348 String onFulfilled, onRejected; | 348 String onFulfilled, onRejected; |
349 p.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); | 349 p.then(createCaptor(&onFulfilled), createCaptor(&onRejected)); |
350 | 350 |
351 EXPECT_TRUE(onFulfilled.isNull()); | 351 EXPECT_TRUE(onFulfilled.isNull()); |
352 EXPECT_TRUE(onRejected.isNull()); | 352 EXPECT_TRUE(onRejected.isNull()); |
353 isolate()->RunMicrotasks(); | 353 isolate()->RunMicrotasks(); |
354 EXPECT_EQ("undefined", onFulfilled); | 354 EXPECT_EQ("undefined", onFulfilled); |
355 EXPECT_TRUE(onRejected.isNull()); | 355 EXPECT_TRUE(onRejected.isNull()); |
356 } | 356 } |
357 | 357 |
358 TEST_F(ExclusiveStreamReaderTest, ReadyShouldNotBeResolvedWhileLocked) | 358 TEST_F(ReadableStreamReaderTest, ReadyShouldNotBeResolvedWhileLocked) |
359 { | 359 { |
360 String onFulfilled; | 360 String onFulfilled; |
361 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled)); | 361 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled)); |
362 | 362 |
363 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 363 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
364 | 364 |
365 m_stream->enqueue("hello"); | 365 m_stream->enqueue("hello"); |
366 m_stream->enqueue("world"); | 366 m_stream->enqueue("world"); |
367 | 367 |
368 ASSERT_EQ("readable", reader->state()); | 368 ASSERT_EQ("readable", reader->state()); |
369 reader->read(scriptState(), m_exceptionState); | 369 reader->read(scriptState(), m_exceptionState); |
370 ASSERT_EQ("readable", reader->state()); | 370 ASSERT_EQ("readable", reader->state()); |
371 reader->read(scriptState(), m_exceptionState); | 371 reader->read(scriptState(), m_exceptionState); |
372 ASSERT_EQ("waiting", reader->state()); | 372 ASSERT_EQ("waiting", reader->state()); |
373 | 373 |
374 isolate()->RunMicrotasks(); | 374 isolate()->RunMicrotasks(); |
375 EXPECT_TRUE(onFulfilled.isNull()); | 375 EXPECT_TRUE(onFulfilled.isNull()); |
376 | 376 |
377 // We need to call here to ensure all promises having captors are resolved | 377 // We need to call here to ensure all promises having captors are resolved |
378 // or rejected. | 378 // or rejected. |
379 m_stream->error(DOMException::create(AbortError, "done")); | 379 m_stream->error(DOMException::create(AbortError, "done")); |
380 isolate()->RunMicrotasks(); | 380 isolate()->RunMicrotasks(); |
381 } | 381 } |
382 | 382 |
383 TEST_F(ExclusiveStreamReaderTest, ReadyShouldNotBeResolvedWhenReleasedIfNotReady
) | 383 TEST_F(ReadableStreamReaderTest, ReadyShouldNotBeResolvedWhenReleasedIfNotReady) |
384 { | 384 { |
385 String onFulfilled; | 385 String onFulfilled; |
386 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled)); | 386 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled)); |
387 | 387 |
388 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 388 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
389 | 389 |
390 m_stream->enqueue("hello"); | 390 m_stream->enqueue("hello"); |
391 m_stream->enqueue("world"); | 391 m_stream->enqueue("world"); |
392 | 392 |
393 ASSERT_EQ("readable", reader->state()); | 393 ASSERT_EQ("readable", reader->state()); |
394 reader->read(scriptState(), m_exceptionState); | 394 reader->read(scriptState(), m_exceptionState); |
395 ASSERT_EQ("readable", reader->state()); | 395 ASSERT_EQ("readable", reader->state()); |
396 reader->read(scriptState(), m_exceptionState); | 396 reader->read(scriptState(), m_exceptionState); |
397 ASSERT_EQ("waiting", reader->state()); | 397 ASSERT_EQ("waiting", reader->state()); |
398 | 398 |
399 reader->releaseLock(); | 399 reader->releaseLock(); |
400 | 400 |
401 isolate()->RunMicrotasks(); | 401 isolate()->RunMicrotasks(); |
402 EXPECT_TRUE(onFulfilled.isNull()); | 402 EXPECT_TRUE(onFulfilled.isNull()); |
403 | 403 |
404 // We need to call here to ensure all promises having captors are resolved | 404 // We need to call here to ensure all promises having captors are resolved |
405 // or rejected. | 405 // or rejected. |
406 m_stream->error(DOMException::create(AbortError, "done")); | 406 m_stream->error(DOMException::create(AbortError, "done")); |
407 isolate()->RunMicrotasks(); | 407 isolate()->RunMicrotasks(); |
408 } | 408 } |
409 | 409 |
410 TEST_F(ExclusiveStreamReaderTest, ReadyShouldBeResolvedWhenReleasedIfReady) | 410 TEST_F(ReadableStreamReaderTest, ReadyShouldBeResolvedWhenReleasedIfReady) |
411 { | 411 { |
412 String onFulfilled; | 412 String onFulfilled; |
413 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled)); | 413 m_stream->ready(scriptState()).then(createCaptor(&onFulfilled)); |
414 | 414 |
415 ExclusiveStreamReader* reader = new ExclusiveStreamReader(m_stream); | 415 ReadableStreamReader* reader = new ReadableStreamReader(m_stream); |
416 | 416 |
417 m_stream->enqueue("hello"); | 417 m_stream->enqueue("hello"); |
418 m_stream->enqueue("world"); | 418 m_stream->enqueue("world"); |
419 | 419 |
420 ASSERT_EQ("readable", reader->state()); | 420 ASSERT_EQ("readable", reader->state()); |
421 reader->read(scriptState(), m_exceptionState); | 421 reader->read(scriptState(), m_exceptionState); |
422 ASSERT_EQ("readable", reader->state()); | 422 ASSERT_EQ("readable", reader->state()); |
423 | 423 |
424 isolate()->RunMicrotasks(); | 424 isolate()->RunMicrotasks(); |
425 reader->releaseLock(); | 425 reader->releaseLock(); |
426 EXPECT_TRUE(onFulfilled.isNull()); | 426 EXPECT_TRUE(onFulfilled.isNull()); |
427 | 427 |
428 isolate()->RunMicrotasks(); | 428 isolate()->RunMicrotasks(); |
429 EXPECT_EQ("undefined", onFulfilled); | 429 EXPECT_EQ("undefined", onFulfilled); |
430 } | 430 } |
431 | 431 |
432 } // namespace | 432 } // namespace |
433 | 433 |
434 } // namespace blink | 434 } // namespace blink |
OLD | NEW |