Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: third_party/WebKit/Source/core/streams/ReadableStreamReaderTest.cpp

Issue 2227403002: Remove blink::ReadableStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "core/streams/ReadableStreamReader.h"
6
7 #include "bindings/core/v8/ExceptionState.h"
8 #include "bindings/core/v8/ScriptState.h"
9 #include "bindings/core/v8/ToV8.h"
10 #include "bindings/core/v8/V8ThrowException.h"
11 #include "core/dom/DOMException.h"
12 #include "core/dom/Document.h"
13 #include "core/dom/ExceptionCode.h"
14 #include "core/streams/ReadableStream.h"
15 #include "core/streams/ReadableStreamImpl.h"
16 #include "core/streams/UnderlyingSource.h"
17 #include "core/testing/DummyPageHolder.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19 #include <memory>
20
21 namespace blink {
22
23 using StringStream = ReadableStreamImpl<ReadableStreamChunkTypeTraits<String>>;
24
25 namespace {
26
27 struct ReadResult {
28 ReadResult() : isDone(false), isSet(false) { }
29
30 String valueString;
31 bool isDone;
32 bool isSet;
33 };
34
35 class StringCapturingFunction final : public ScriptFunction {
36 public:
37 static v8::Local<v8::Function> createFunction(ScriptState* scriptState, Stri ng* value)
38 {
39 StringCapturingFunction* self = new StringCapturingFunction(scriptState, value);
40 return self->bindToV8Function();
41 }
42
43 private:
44 StringCapturingFunction(ScriptState* scriptState, String* value)
45 : ScriptFunction(scriptState)
46 , m_value(value)
47 {
48 }
49
50 ScriptValue call(ScriptValue value) override
51 {
52 ASSERT(!value.isEmpty());
53 *m_value = toCoreString(value.v8Value()->ToString(getScriptState()->cont ext()).ToLocalChecked());
54 return value;
55 }
56
57 String* m_value;
58 };
59
60 class ReadResultCapturingFunction final : public ScriptFunction {
61 public:
62 static v8::Local<v8::Function> createFunction(ScriptState* scriptState, Read Result* value)
63 {
64 ReadResultCapturingFunction* self = new ReadResultCapturingFunction(scri ptState, value);
65 return self->bindToV8Function();
66 }
67
68 private:
69 ReadResultCapturingFunction(ScriptState* scriptState, ReadResult* value)
70 : ScriptFunction(scriptState)
71 , m_result(value)
72 {
73 }
74
75 ScriptValue call(ScriptValue result) override
76 {
77 ASSERT(!result.isEmpty());
78 v8::Isolate* isolate = getScriptState()->isolate();
79 if (!result.isObject()) {
80 return result;
81 }
82 v8::Local<v8::Object> object = result.v8Value().As<v8::Object>();
83 v8::Local<v8::String> doneString = v8String(isolate, "done");
84 v8::Local<v8::String> valueString = v8String(isolate, "value");
85 v8::Local<v8::Context> context = getScriptState()->context();
86 v8::Maybe<bool> hasDone = object->Has(context, doneString);
87 v8::Maybe<bool> hasValue = object->Has(context, valueString);
88
89 if (hasDone.IsNothing() || !hasDone.FromJust() || hasValue.IsNothing() | | !hasValue.FromJust()) {
90 return result;
91 }
92
93 v8::Local<v8::Value> done;
94 v8::Local<v8::Value> value;
95
96 if (!object->Get(context, doneString).ToLocal(&done) || !object->Get(con text, valueString).ToLocal(&value) || !done->IsBoolean()) {
97 return result;
98 }
99
100 m_result->isSet = true;
101 m_result->isDone = done.As<v8::Boolean>()->Value();
102 m_result->valueString = toCoreString(value->ToString(getScriptState()->c ontext()).ToLocalChecked());
103 return result;
104 }
105
106 ReadResult* m_result;
107 };
108
109 class NoopUnderlyingSource final : public GarbageCollectedFinalized<NoopUnderlyi ngSource>, public UnderlyingSource {
110 USING_GARBAGE_COLLECTED_MIXIN(NoopUnderlyingSource);
111 public:
112 ~NoopUnderlyingSource() override { }
113
114 void pullSource() override { }
115 ScriptPromise cancelSource(ScriptState* scriptState, ScriptValue reason) { r eturn ScriptPromise::cast(scriptState, reason); }
116 DEFINE_INLINE_VIRTUAL_TRACE() { UnderlyingSource::trace(visitor); }
117 };
118
119 class PermissiveStrategy final : public StringStream::Strategy {
120 public:
121 bool shouldApplyBackpressure(size_t, ReadableStream*) override { return fals e; }
122 };
123
124 class ReadableStreamReaderTest : public ::testing::Test {
125 public:
126 ReadableStreamReaderTest()
127 : m_page(DummyPageHolder::create(IntSize(1, 1)))
128 , m_stream(new StringStream(new NoopUnderlyingSource, new PermissiveStra tegy))
129 {
130 m_stream->didSourceStart();
131 }
132
133 ~ReadableStreamReaderTest() override
134 {
135 // We need to call |error| in order to make
136 // ActiveDOMObject::hasPendingActivity return false.
137 m_stream->error(DOMException::create(AbortError, "done"));
138 }
139
140 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc ument().frame()); }
141 v8::Isolate* isolate() { return getScriptState()->isolate(); }
142 ExecutionContext* getExecutionContext() { return getScriptState()->getExecut ionContext(); }
143
144 v8::Local<v8::Function> createCaptor(String* value)
145 {
146 return StringCapturingFunction::createFunction(getScriptState(), value);
147 }
148
149 v8::Local<v8::Function> createResultCaptor(ReadResult* value)
150 {
151 return ReadResultCapturingFunction::createFunction(getScriptState(), val ue);
152 }
153
154 std::unique_ptr<DummyPageHolder> m_page;
155 Persistent<StringStream> m_stream;
156 };
157
158 TEST_F(ReadableStreamReaderTest, Construct)
159 {
160 ScriptState::Scope scope(getScriptState());
161 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
162 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
163 EXPECT_TRUE(reader->isActive());
164 EXPECT_FALSE(exceptionState.hadException());
165 }
166
167 TEST_F(ReadableStreamReaderTest, Release)
168 {
169 ScriptState::Scope scope(getScriptState());
170 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
171 String onFulfilled, onRejected;
172 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
173 EXPECT_TRUE(reader->isActive());
174
175 reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCapt or(&onRejected));
176 reader->releaseLock(exceptionState);
177 EXPECT_FALSE(reader->isActive());
178 EXPECT_FALSE(exceptionState.hadException());
179
180 EXPECT_TRUE(onFulfilled.isNull());
181 EXPECT_TRUE(onRejected.isNull());
182
183 v8::MicrotasksScope::PerformCheckpoint(isolate());
184 EXPECT_TRUE(onFulfilled.isNull());
185 EXPECT_EQ("AbortError: the reader is already released", onRejected);
186
187 ReadableStreamReader* another = new ReadableStreamReader(getExecutionContext (), m_stream);
188 EXPECT_TRUE(another->isActive());
189 EXPECT_FALSE(reader->isActive());
190 reader->releaseLock(exceptionState);
191 EXPECT_TRUE(another->isActive());
192 EXPECT_FALSE(reader->isActive());
193 EXPECT_FALSE(exceptionState.hadException());
194 }
195
196 TEST_F(ReadableStreamReaderTest, ReadAfterRelease)
197 {
198 ScriptState::Scope scope(getScriptState());
199 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
200 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
201 EXPECT_TRUE(reader->isActive());
202 reader->releaseLock(exceptionState);
203 EXPECT_FALSE(exceptionState.hadException());
204 EXPECT_FALSE(reader->isActive());
205
206 ReadResult result;
207 String onRejected;
208 reader->read(getScriptState()).then(createResultCaptor(&result), createCapto r(&onRejected));
209
210 EXPECT_FALSE(result.isSet);
211 EXPECT_TRUE(onRejected.isNull());
212 v8::MicrotasksScope::PerformCheckpoint(isolate());
213
214 EXPECT_FALSE(result.isSet);
215 EXPECT_EQ("TypeError: the reader is already released", onRejected);
216 EXPECT_FALSE(exceptionState.hadException());
217 }
218
219 TEST_F(ReadableStreamReaderTest, ReleaseShouldFailWhenCalledWhileReading)
220 {
221 ScriptState::Scope scope(getScriptState());
222 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
223 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
224 EXPECT_TRUE(reader->isActive());
225 reader->read(getScriptState());
226
227 reader->releaseLock(exceptionState);
228 EXPECT_TRUE(reader->isActive());
229 EXPECT_TRUE(exceptionState.hadException());
230 exceptionState.clearException();
231
232 m_stream->enqueue("hello");
233 reader->releaseLock(exceptionState);
234 EXPECT_FALSE(reader->isActive());
235 EXPECT_FALSE(exceptionState.hadException());
236 }
237
238 TEST_F(ReadableStreamReaderTest, EnqueueThenRead)
239 {
240 ScriptState::Scope scope(getScriptState());
241 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
242 m_stream->enqueue("hello");
243 m_stream->enqueue("world");
244 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
245 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
246
247 ReadResult result;
248 String onRejected;
249 reader->read(getScriptState()).then(createResultCaptor(&result), createCapto r(&onRejected));
250
251 EXPECT_FALSE(result.isSet);
252 EXPECT_TRUE(onRejected.isNull());
253
254 v8::MicrotasksScope::PerformCheckpoint(isolate());
255
256 EXPECT_TRUE(result.isSet);
257 EXPECT_FALSE(result.isDone);
258 EXPECT_EQ("hello", result.valueString);
259 EXPECT_TRUE(onRejected.isNull());
260
261 ReadResult result2;
262 String onRejected2;
263 reader->read(getScriptState()).then(createResultCaptor(&result2), createCapt or(&onRejected2));
264
265 EXPECT_FALSE(result2.isSet);
266 EXPECT_TRUE(onRejected2.isNull());
267
268 v8::MicrotasksScope::PerformCheckpoint(isolate());
269
270 EXPECT_TRUE(result2.isSet);
271 EXPECT_FALSE(result2.isDone);
272 EXPECT_EQ("world", result2.valueString);
273 EXPECT_TRUE(onRejected2.isNull());
274 EXPECT_FALSE(exceptionState.hadException());
275 }
276
277 TEST_F(ReadableStreamReaderTest, ReadThenEnqueue)
278 {
279 ScriptState::Scope scope(getScriptState());
280 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
281 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
282 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
283
284 ReadResult result, result2;
285 String onRejected, onRejected2;
286 reader->read(getScriptState()).then(createResultCaptor(&result), createCapto r(&onRejected));
287 reader->read(getScriptState()).then(createResultCaptor(&result2), createCapt or(&onRejected2));
288
289 EXPECT_FALSE(result.isSet);
290 EXPECT_TRUE(onRejected.isNull());
291 EXPECT_FALSE(result2.isSet);
292 EXPECT_TRUE(onRejected2.isNull());
293
294 v8::MicrotasksScope::PerformCheckpoint(isolate());
295
296 EXPECT_FALSE(result.isSet);
297 EXPECT_TRUE(onRejected.isNull());
298 EXPECT_FALSE(result2.isSet);
299 EXPECT_TRUE(onRejected2.isNull());
300
301 m_stream->enqueue("hello");
302 v8::MicrotasksScope::PerformCheckpoint(isolate());
303
304 EXPECT_TRUE(result.isSet);
305 EXPECT_FALSE(result.isDone);
306 EXPECT_EQ("hello", result.valueString);
307 EXPECT_TRUE(onRejected.isNull());
308 EXPECT_FALSE(result2.isSet);
309 EXPECT_TRUE(onRejected2.isNull());
310
311 m_stream->enqueue("world");
312 v8::MicrotasksScope::PerformCheckpoint(isolate());
313
314 EXPECT_TRUE(result2.isSet);
315 EXPECT_FALSE(result2.isDone);
316 EXPECT_EQ("world", result2.valueString);
317 EXPECT_TRUE(onRejected2.isNull());
318 EXPECT_FALSE(exceptionState.hadException());
319 }
320
321 TEST_F(ReadableStreamReaderTest, ClosedReader)
322 {
323 ScriptState::Scope scope(getScriptState());
324 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
325 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
326
327 m_stream->close();
328
329 EXPECT_TRUE(reader->isActive());
330
331 String onClosedFulfilled, onClosedRejected;
332 ReadResult result;
333 String onReadRejected;
334 v8::MicrotasksScope::PerformCheckpoint(isolate());
335 reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), crea teCaptor(&onClosedRejected));
336 reader->read(getScriptState()).then(createResultCaptor(&result), createCapto r(&onReadRejected));
337 EXPECT_TRUE(onClosedFulfilled.isNull());
338 EXPECT_TRUE(onClosedRejected.isNull());
339 EXPECT_FALSE(result.isSet);
340 EXPECT_TRUE(onReadRejected.isNull());
341
342 v8::MicrotasksScope::PerformCheckpoint(isolate());
343 EXPECT_EQ("undefined", onClosedFulfilled);
344 EXPECT_TRUE(onClosedRejected.isNull());
345 EXPECT_TRUE(result.isSet);
346 EXPECT_TRUE(result.isDone);
347 EXPECT_EQ("undefined", result.valueString);
348 EXPECT_TRUE(onReadRejected.isNull());
349 EXPECT_FALSE(exceptionState.hadException());
350 }
351
352 TEST_F(ReadableStreamReaderTest, ErroredReader)
353 {
354 ScriptState::Scope scope(getScriptState());
355 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
356 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
357
358 m_stream->error(DOMException::create(SyntaxError, "some error"));
359
360 EXPECT_EQ(ReadableStream::Errored, m_stream->stateInternal());
361 EXPECT_TRUE(reader->isActive());
362
363 String onClosedFulfilled, onClosedRejected;
364 String onReadFulfilled, onReadRejected;
365 v8::MicrotasksScope::PerformCheckpoint(isolate());
366 reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), crea teCaptor(&onClosedRejected));
367 reader->read(getScriptState()).then(createCaptor(&onReadFulfilled), createCa ptor(&onReadRejected));
368 EXPECT_TRUE(onClosedFulfilled.isNull());
369 EXPECT_TRUE(onClosedRejected.isNull());
370 EXPECT_TRUE(onReadFulfilled.isNull());
371 EXPECT_TRUE(onReadRejected.isNull());
372
373 v8::MicrotasksScope::PerformCheckpoint(isolate());
374 EXPECT_TRUE(onClosedFulfilled.isNull());
375 EXPECT_EQ("SyntaxError: some error", onClosedRejected);
376 EXPECT_TRUE(onReadFulfilled.isNull());
377 EXPECT_EQ("SyntaxError: some error", onReadRejected);
378 EXPECT_FALSE(exceptionState.hadException());
379 }
380
381 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenClosed)
382 {
383 ScriptState::Scope scope(getScriptState());
384 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
385 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
386 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
387
388 ReadResult result, result2;
389 String onRejected, onRejected2;
390 reader->read(getScriptState()).then(createResultCaptor(&result), createCapto r(&onRejected));
391 reader->read(getScriptState()).then(createResultCaptor(&result2), createCapt or(&onRejected2));
392
393 v8::MicrotasksScope::PerformCheckpoint(isolate());
394 EXPECT_FALSE(result.isSet);
395 EXPECT_TRUE(onRejected.isNull());
396 EXPECT_FALSE(result2.isSet);
397 EXPECT_TRUE(onRejected2.isNull());
398
399 m_stream->close();
400 EXPECT_FALSE(result.isSet);
401 EXPECT_TRUE(onRejected.isNull());
402 EXPECT_FALSE(result2.isSet);
403 EXPECT_TRUE(onRejected2.isNull());
404
405 v8::MicrotasksScope::PerformCheckpoint(isolate());
406
407 EXPECT_TRUE(result.isSet);
408 EXPECT_TRUE(result.isDone);
409 EXPECT_EQ("undefined", result.valueString);
410 EXPECT_TRUE(onRejected.isNull());
411
412 EXPECT_TRUE(result2.isSet);
413 EXPECT_TRUE(result2.isDone);
414 EXPECT_EQ("undefined", result2.valueString);
415 EXPECT_TRUE(onRejected2.isNull());
416 EXPECT_FALSE(exceptionState.hadException());
417 }
418
419 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeRejectedWhenErrored)
420 {
421 ScriptState::Scope scope(getScriptState());
422 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
423 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
424 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
425
426 String onFulfilled, onFulfilled2;
427 String onRejected, onRejected2;
428 reader->read(getScriptState()).then(createCaptor(&onFulfilled), createCaptor (&onRejected));
429 reader->read(getScriptState()).then(createCaptor(&onFulfilled2), createCapto r(&onRejected2));
430
431 v8::MicrotasksScope::PerformCheckpoint(isolate());
432 EXPECT_TRUE(onFulfilled.isNull());
433 EXPECT_TRUE(onRejected.isNull());
434 EXPECT_TRUE(onFulfilled2.isNull());
435 EXPECT_TRUE(onRejected2.isNull());
436
437 m_stream->error(DOMException::create(SyntaxError, "some error"));
438 EXPECT_TRUE(onFulfilled.isNull());
439 EXPECT_TRUE(onRejected.isNull());
440 EXPECT_TRUE(onFulfilled2.isNull());
441 EXPECT_TRUE(onRejected2.isNull());
442
443 v8::MicrotasksScope::PerformCheckpoint(isolate());
444
445 EXPECT_TRUE(onFulfilled.isNull());
446 EXPECT_EQ(onRejected, "SyntaxError: some error");
447 EXPECT_TRUE(onFulfilled2.isNull());
448 EXPECT_EQ(onRejected2, "SyntaxError: some error");
449 EXPECT_FALSE(exceptionState.hadException());
450 }
451
452 TEST_F(ReadableStreamReaderTest, PendingReadsShouldBeResolvedWhenCanceled)
453 {
454 ScriptState::Scope scope(getScriptState());
455 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
456 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
457 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
458
459 ReadResult result, result2;
460 String onRejected, onRejected2;
461 reader->read(getScriptState()).then(createResultCaptor(&result), createCapto r(&onRejected));
462 reader->read(getScriptState()).then(createResultCaptor(&result2), createCapt or(&onRejected2));
463
464 v8::MicrotasksScope::PerformCheckpoint(isolate());
465 EXPECT_FALSE(result.isSet);
466 EXPECT_TRUE(onRejected.isNull());
467 EXPECT_FALSE(result2.isSet);
468 EXPECT_TRUE(onRejected2.isNull());
469
470 reader->cancel(getScriptState(), ScriptValue(getScriptState(), v8::Undefined (isolate())));
471 EXPECT_TRUE(reader->isActive());
472 EXPECT_FALSE(result.isSet);
473 EXPECT_TRUE(onRejected.isNull());
474 EXPECT_FALSE(result2.isSet);
475 EXPECT_TRUE(onRejected2.isNull());
476
477 v8::MicrotasksScope::PerformCheckpoint(isolate());
478
479 EXPECT_TRUE(result.isSet);
480 EXPECT_TRUE(result.isDone);
481 EXPECT_EQ("undefined", result.valueString);
482 EXPECT_TRUE(onRejected.isNull());
483
484 EXPECT_TRUE(result2.isSet);
485 EXPECT_TRUE(result2.isDone);
486 EXPECT_EQ("undefined", result2.valueString);
487 EXPECT_TRUE(onRejected2.isNull());
488 EXPECT_FALSE(exceptionState.hadException());
489 }
490
491 TEST_F(ReadableStreamReaderTest, CancelShouldNotWorkWhenNotActive)
492 {
493 ScriptState::Scope scope(getScriptState());
494 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
495 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
496 reader->releaseLock(exceptionState);
497 EXPECT_FALSE(reader->isActive());
498
499 String onFulfilled, onRejected;
500 reader->cancel(getScriptState(), ScriptValue(getScriptState(), v8::Undefined (isolate()))).then(createCaptor(&onFulfilled), createCaptor(&onRejected));
501 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
502
503 EXPECT_TRUE(onFulfilled.isNull());
504 EXPECT_TRUE(onRejected.isNull());
505
506 v8::MicrotasksScope::PerformCheckpoint(isolate());
507
508 EXPECT_TRUE(onFulfilled.isNull());
509 EXPECT_EQ("TypeError: the reader is already released", onRejected);
510 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
511 EXPECT_FALSE(exceptionState.hadException());
512 }
513
514 TEST_F(ReadableStreamReaderTest, Cancel)
515 {
516 ScriptState::Scope scope(getScriptState());
517 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
518 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
519 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
520
521 String onClosedFulfilled, onClosedRejected;
522 String onCancelFulfilled, onCancelRejected;
523 reader->closed(getScriptState()).then(createCaptor(&onClosedFulfilled), crea teCaptor(&onClosedRejected));
524 reader->cancel(getScriptState(), ScriptValue(getScriptState(), v8::Undefined (isolate()))).then(createCaptor(&onCancelFulfilled), createCaptor(&onCancelRejec ted));
525
526 EXPECT_EQ(ReadableStream::Closed, m_stream->stateInternal());
527 EXPECT_TRUE(onClosedFulfilled.isNull());
528 EXPECT_TRUE(onClosedRejected.isNull());
529 EXPECT_TRUE(onCancelFulfilled.isNull());
530 EXPECT_TRUE(onCancelRejected.isNull());
531
532 v8::MicrotasksScope::PerformCheckpoint(isolate());
533 EXPECT_EQ("undefined", onClosedFulfilled);
534 EXPECT_TRUE(onClosedRejected.isNull());
535 EXPECT_EQ("undefined", onCancelFulfilled);
536 EXPECT_TRUE(onCancelRejected.isNull());
537 EXPECT_FALSE(exceptionState.hadException());
538 }
539
540 TEST_F(ReadableStreamReaderTest, Close)
541 {
542 ScriptState::Scope scope(getScriptState());
543 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
544 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
545 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
546
547 String onFulfilled, onRejected;
548 reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCapt or(&onRejected));
549
550 m_stream->close();
551
552 EXPECT_EQ(ReadableStream::Closed, m_stream->stateInternal());
553 EXPECT_TRUE(onFulfilled.isNull());
554 EXPECT_TRUE(onRejected.isNull());
555
556 v8::MicrotasksScope::PerformCheckpoint(isolate());
557 EXPECT_EQ("undefined", onFulfilled);
558 EXPECT_TRUE(onRejected.isNull());
559 EXPECT_FALSE(exceptionState.hadException());
560 }
561
562 TEST_F(ReadableStreamReaderTest, Error)
563 {
564 ScriptState::Scope scope(getScriptState());
565 ExceptionState exceptionState(ExceptionState::ConstructionContext, "property ", "interface", getScriptState()->context()->Global(), isolate());
566 ReadableStreamReader* reader = new ReadableStreamReader(getExecutionContext( ), m_stream);
567 EXPECT_EQ(ReadableStream::Readable, m_stream->stateInternal());
568
569 String onFulfilled, onRejected;
570 reader->closed(getScriptState()).then(createCaptor(&onFulfilled), createCapt or(&onRejected));
571
572 m_stream->error(DOMException::create(SyntaxError, "some error"));
573
574 EXPECT_EQ(ReadableStream::Errored, m_stream->stateInternal());
575 EXPECT_TRUE(onFulfilled.isNull());
576 EXPECT_TRUE(onRejected.isNull());
577
578 v8::MicrotasksScope::PerformCheckpoint(isolate());
579 EXPECT_TRUE(onFulfilled.isNull());
580 EXPECT_EQ("SyntaxError: some error", onRejected);
581 EXPECT_FALSE(exceptionState.hadException());
582 }
583
584 } // namespace
585
586 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698