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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/ReadableStreamDataConsumerHandleTest.cpp

Issue 1539803002: [Fetch API] Fix a memory leak with a Response constructed with a ReadableStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@response-constructed-with-stream
Patch Set: Created 5 years 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
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 "modules/fetch/ReadableStreamDataConsumerHandle.h" 6 #include "modules/fetch/ReadableStreamDataConsumerHandle.h"
7 7
8 #include "bindings/core/v8/ReadableStreamOperations.h"
8 #include "bindings/core/v8/ScriptState.h" 9 #include "bindings/core/v8/ScriptState.h"
9 #include "bindings/core/v8/V8BindingMacros.h" 10 #include "bindings/core/v8/V8BindingMacros.h"
11 #include "bindings/core/v8/V8GCController.h"
10 #include "core/dom/Document.h" 12 #include "core/dom/Document.h"
11 #include "core/testing/DummyPageHolder.h" 13 #include "core/testing/DummyPageHolder.h"
12 #include "modules/fetch/DataConsumerHandleTestUtil.h" 14 #include "modules/fetch/DataConsumerHandleTestUtil.h"
13 #include "platform/heap/Handle.h" 15 #include "platform/heap/Handle.h"
14 #include "platform/testing/UnitTestHelpers.h" 16 #include "platform/testing/UnitTestHelpers.h"
15 #include "public/platform/WebDataConsumerHandle.h" 17 #include "public/platform/WebDataConsumerHandle.h"
16 #include "testing/gmock/include/gmock/gmock.h" 18 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
18 #include <v8.h> 20 #include <v8.h>
19 21
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 { 74 {
73 v8::TryCatch block(isolate()); 75 v8::TryCatch block(isolate());
74 v8::MaybeLocal<v8::Value> r = eval(s); 76 v8::MaybeLocal<v8::Value> r = eval(s);
75 if (block.HasCaught()) { 77 if (block.HasCaught()) {
76 ADD_FAILURE() << toCoreString(block.Exception()->ToString(isolate()) ).utf8().data(); 78 ADD_FAILURE() << toCoreString(block.Exception()->ToString(isolate()) ).utf8().data();
77 block.ReThrow(); 79 block.ReThrow();
78 } 80 }
79 return r; 81 return r;
80 } 82 }
81 83
84 PassOwnPtr<ReadableStreamDataConsumerHandle> createHandle(ScriptValue stream )
85 {
86 NonThrowableExceptionState es;
87 ScriptValue reader = ReadableStreamOperations::getReader(scriptState(), stream.v8Value(), es);
88 ASSERT(!reader.isEmpty());
89 ASSERT(reader.v8Value()->IsObject());
90 return ReadableStreamDataConsumerHandle::create(scriptState(), reader.v8 Value().As<v8::Object>());
91 }
92
93 void gc() { V8GCController::collectAllGarbageForTesting(isolate()); }
94
82 private: 95 private:
83 OwnPtr<DummyPageHolder> m_page; 96 OwnPtr<DummyPageHolder> m_page;
84 }; 97 };
85 98
86 TEST_F(ReadableStreamDataConsumerHandleTest, Create) 99 TEST_F(ReadableStreamDataConsumerHandleTest, Create)
87 { 100 {
88 ScriptState::Scope scope(scriptState()); 101 ScriptState::Scope scope(scriptState());
89 ScriptValue stream(scriptState(), evalWithPrintingError("new ReadableStream" )); 102 ScriptValue stream(scriptState(), evalWithPrintingError("new ReadableStream" ));
90 ASSERT_FALSE(stream.isEmpty()); 103 ASSERT_FALSE(stream.isEmpty());
91 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 104 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
92 ASSERT_TRUE(handle); 105 ASSERT_TRUE(handle);
93 MockClient* client = MockClient::create(); 106 MockClient* client = MockClient::create();
94 Checkpoint checkpoint; 107 Checkpoint checkpoint;
95 108
96 InSequence s; 109 InSequence s;
97 EXPECT_CALL(checkpoint, Call(1)); 110 EXPECT_CALL(checkpoint, Call(1));
98 EXPECT_CALL(*client, didGetReadable()); 111 EXPECT_CALL(*client, didGetReadable());
99 EXPECT_CALL(checkpoint, Call(2)); 112 EXPECT_CALL(checkpoint, Call(2));
100 113
101 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client ); 114 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client );
102 ASSERT_TRUE(reader); 115 ASSERT_TRUE(reader);
103 checkpoint.Call(1); 116 checkpoint.Call(1);
104 testing::runPendingTasks(); 117 testing::runPendingTasks();
105 checkpoint.Call(2); 118 checkpoint.Call(2);
106 } 119 }
107 120
108 TEST_F(ReadableStreamDataConsumerHandleTest, EmptyStream) 121 TEST_F(ReadableStreamDataConsumerHandleTest, EmptyStream)
109 { 122 {
110 ScriptState::Scope scope(scriptState()); 123 ScriptState::Scope scope(scriptState());
111 ScriptValue stream(scriptState(), evalWithPrintingError( 124 ScriptValue stream(scriptState(), evalWithPrintingError(
112 "new ReadableStream({start: c => c.close()})")); 125 "new ReadableStream({start: c => c.close()})"));
113 ASSERT_FALSE(stream.isEmpty()); 126 ASSERT_FALSE(stream.isEmpty());
114 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 127 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
115 ASSERT_TRUE(handle); 128 ASSERT_TRUE(handle);
116 MockClient* client = MockClient::create(); 129 MockClient* client = MockClient::create();
117 Checkpoint checkpoint; 130 Checkpoint checkpoint;
118 131
119 InSequence s; 132 InSequence s;
120 EXPECT_CALL(checkpoint, Call(1)); 133 EXPECT_CALL(checkpoint, Call(1));
121 EXPECT_CALL(*client, didGetReadable()); 134 EXPECT_CALL(*client, didGetReadable());
122 EXPECT_CALL(checkpoint, Call(2)); 135 EXPECT_CALL(checkpoint, Call(2));
123 EXPECT_CALL(*client, didGetReadable()); 136 EXPECT_CALL(*client, didGetReadable());
124 EXPECT_CALL(checkpoint, Call(3)); 137 EXPECT_CALL(checkpoint, Call(3));
(...skipping 10 matching lines...) Expand all
135 checkpoint.Call(3); 148 checkpoint.Call(3);
136 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readBytes)); 149 EXPECT_EQ(kDone, reader->read(&c, 1, kNone, &readBytes));
137 } 150 }
138 151
139 TEST_F(ReadableStreamDataConsumerHandleTest, ErroredStream) 152 TEST_F(ReadableStreamDataConsumerHandleTest, ErroredStream)
140 { 153 {
141 ScriptState::Scope scope(scriptState()); 154 ScriptState::Scope scope(scriptState());
142 ScriptValue stream(scriptState(), evalWithPrintingError( 155 ScriptValue stream(scriptState(), evalWithPrintingError(
143 "new ReadableStream({start: c => c.error()})")); 156 "new ReadableStream({start: c => c.error()})"));
144 ASSERT_FALSE(stream.isEmpty()); 157 ASSERT_FALSE(stream.isEmpty());
145 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 158 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
146 ASSERT_TRUE(handle); 159 ASSERT_TRUE(handle);
147 MockClient* client = MockClient::create(); 160 MockClient* client = MockClient::create();
148 Checkpoint checkpoint; 161 Checkpoint checkpoint;
149 162
150 InSequence s; 163 InSequence s;
151 EXPECT_CALL(checkpoint, Call(1)); 164 EXPECT_CALL(checkpoint, Call(1));
152 EXPECT_CALL(*client, didGetReadable()); 165 EXPECT_CALL(*client, didGetReadable());
153 EXPECT_CALL(checkpoint, Call(2)); 166 EXPECT_CALL(checkpoint, Call(2));
154 EXPECT_CALL(*client, didGetReadable()); 167 EXPECT_CALL(*client, didGetReadable());
155 EXPECT_CALL(checkpoint, Call(3)); 168 EXPECT_CALL(checkpoint, Call(3));
(...skipping 15 matching lines...) Expand all
171 { 184 {
172 ScriptState::Scope scope(scriptState()); 185 ScriptState::Scope scope(scriptState());
173 ScriptValue stream(scriptState(), evalWithPrintingError( 186 ScriptValue stream(scriptState(), evalWithPrintingError(
174 "var controller;" 187 "var controller;"
175 "var stream = new ReadableStream({start: c => controller = c});" 188 "var stream = new ReadableStream({start: c => controller = c});"
176 "controller.enqueue(new Uint8Array([0x43, 0x44, 0x45, 0x46]));" 189 "controller.enqueue(new Uint8Array([0x43, 0x44, 0x45, 0x46]));"
177 "controller.enqueue(new Uint8Array([0x47, 0x48, 0x49, 0x4a]));" 190 "controller.enqueue(new Uint8Array([0x47, 0x48, 0x49, 0x4a]));"
178 "controller.close();" 191 "controller.close();"
179 "stream")); 192 "stream"));
180 ASSERT_FALSE(stream.isEmpty()); 193 ASSERT_FALSE(stream.isEmpty());
181 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 194 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
182 ASSERT_TRUE(handle); 195 ASSERT_TRUE(handle);
183 MockClient* client = MockClient::create(); 196 MockClient* client = MockClient::create();
184 Checkpoint checkpoint; 197 Checkpoint checkpoint;
185 198
186 InSequence s; 199 InSequence s;
187 EXPECT_CALL(checkpoint, Call(1)); 200 EXPECT_CALL(checkpoint, Call(1));
188 EXPECT_CALL(*client, didGetReadable()); 201 EXPECT_CALL(*client, didGetReadable());
189 EXPECT_CALL(checkpoint, Call(2)); 202 EXPECT_CALL(checkpoint, Call(2));
190 EXPECT_CALL(*client, didGetReadable()); 203 EXPECT_CALL(*client, didGetReadable());
191 EXPECT_CALL(checkpoint, Call(3)); 204 EXPECT_CALL(checkpoint, Call(3));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 { 246 {
234 ScriptState::Scope scope(scriptState()); 247 ScriptState::Scope scope(scriptState());
235 ScriptValue stream(scriptState(), evalWithPrintingError( 248 ScriptValue stream(scriptState(), evalWithPrintingError(
236 "var controller;" 249 "var controller;"
237 "var stream = new ReadableStream({start: c => controller = c});" 250 "var stream = new ReadableStream({start: c => controller = c});"
238 "controller.enqueue(new Uint8Array([0x43, 0x44, 0x45, 0x46]));" 251 "controller.enqueue(new Uint8Array([0x43, 0x44, 0x45, 0x46]));"
239 "controller.enqueue(new Uint8Array([0x47, 0x48, 0x49, 0x4a]));" 252 "controller.enqueue(new Uint8Array([0x47, 0x48, 0x49, 0x4a]));"
240 "controller.close();" 253 "controller.close();"
241 "stream")); 254 "stream"));
242 ASSERT_FALSE(stream.isEmpty()); 255 ASSERT_FALSE(stream.isEmpty());
243 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 256 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
244 ASSERT_TRUE(handle); 257 ASSERT_TRUE(handle);
245 MockClient* client = MockClient::create(); 258 MockClient* client = MockClient::create();
246 Checkpoint checkpoint; 259 Checkpoint checkpoint;
247 260
248 InSequence s; 261 InSequence s;
249 EXPECT_CALL(checkpoint, Call(1)); 262 EXPECT_CALL(checkpoint, Call(1));
250 EXPECT_CALL(*client, didGetReadable()); 263 EXPECT_CALL(*client, didGetReadable());
251 EXPECT_CALL(checkpoint, Call(2)); 264 EXPECT_CALL(checkpoint, Call(2));
252 EXPECT_CALL(*client, didGetReadable()); 265 EXPECT_CALL(*client, didGetReadable());
253 EXPECT_CALL(checkpoint, Call(3)); 266 EXPECT_CALL(checkpoint, Call(3));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 EXPECT_EQ(0x48, static_cast<const char*>(buffer)[1]); 308 EXPECT_EQ(0x48, static_cast<const char*>(buffer)[1]);
296 EXPECT_EQ(0x49, static_cast<const char*>(buffer)[2]); 309 EXPECT_EQ(0x49, static_cast<const char*>(buffer)[2]);
297 EXPECT_EQ(0x4a, static_cast<const char*>(buffer)[3]); 310 EXPECT_EQ(0x4a, static_cast<const char*>(buffer)[3]);
298 EXPECT_EQ(kOk, reader->endRead(4)); 311 EXPECT_EQ(kOk, reader->endRead(4));
299 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); 312 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
300 testing::runPendingTasks(); 313 testing::runPendingTasks();
301 checkpoint.Call(5); 314 checkpoint.Call(5);
302 EXPECT_EQ(kDone, reader->beginRead(&buffer, kNone, &available)); 315 EXPECT_EQ(kDone, reader->beginRead(&buffer, kNone, &available));
303 } 316 }
304 317
305 TEST_F(ReadableStreamDataConsumerHandleTest, LockedStream) 318 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueUndefined)
306 { 319 {
307 ScriptState::Scope scope(scriptState()); 320 ScriptState::Scope scope(scriptState());
308 ScriptValue stream(scriptState(), evalWithPrintingError( 321 ScriptValue stream(scriptState(), evalWithPrintingError(
309 "var stream = new ReadableStream;" 322 "var controller;"
310 "stream.getReader();" 323 "var stream = new ReadableStream({start: c => controller = c});"
324 "controller.enqueue(undefined);"
325 "controller.close();"
311 "stream")); 326 "stream"));
312 ASSERT_FALSE(stream.isEmpty()); 327 ASSERT_FALSE(stream.isEmpty());
313 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 328 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
314 ASSERT_TRUE(handle); 329 ASSERT_TRUE(handle);
315 MockClient* client = MockClient::create(); 330 MockClient* client = MockClient::create();
316 Checkpoint checkpoint; 331 Checkpoint checkpoint;
317 332
318 InSequence s; 333 InSequence s;
319 EXPECT_CALL(checkpoint, Call(1)); 334 EXPECT_CALL(checkpoint, Call(1));
320 EXPECT_CALL(*client, didGetReadable()); 335 EXPECT_CALL(*client, didGetReadable());
321 EXPECT_CALL(checkpoint, Call(2)); 336 EXPECT_CALL(checkpoint, Call(2));
337 EXPECT_CALL(*client, didGetReadable());
338 EXPECT_CALL(checkpoint, Call(3));
322 339
323 char c; 340 const void* buffer;
324 size_t readBytes; 341 size_t available;
325 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client ); 342 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client );
326 ASSERT_TRUE(reader); 343 ASSERT_TRUE(reader);
327 checkpoint.Call(1); 344 checkpoint.Call(1);
328 testing::runPendingTasks(); 345 testing::runPendingTasks();
329 checkpoint.Call(2); 346 checkpoint.Call(2);
330 EXPECT_EQ(kUnexpectedError, reader->read(&c, 1, kNone, &readBytes)); 347 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
348 testing::runPendingTasks();
349 checkpoint.Call(3);
350 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
331 } 351 }
332 352
333 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueUndefined) 353 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueNull)
334 { 354 {
335 ScriptState::Scope scope(scriptState()); 355 ScriptState::Scope scope(scriptState());
336 ScriptValue stream(scriptState(), evalWithPrintingError( 356 ScriptValue stream(scriptState(), evalWithPrintingError(
337 "var controller;" 357 "var controller;"
338 "var stream = new ReadableStream({start: c => controller = c});" 358 "var stream = new ReadableStream({start: c => controller = c});"
339 "controller.enqueue(undefined);" 359 "controller.enqueue(null);"
340 "controller.close();" 360 "controller.close();"
341 "stream")); 361 "stream"));
342 ASSERT_FALSE(stream.isEmpty()); 362 ASSERT_FALSE(stream.isEmpty());
343 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 363 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
344 ASSERT_TRUE(handle); 364 ASSERT_TRUE(handle);
345 MockClient* client = MockClient::create(); 365 MockClient* client = MockClient::create();
346 Checkpoint checkpoint; 366 Checkpoint checkpoint;
347 367
348 InSequence s; 368 InSequence s;
349 EXPECT_CALL(checkpoint, Call(1)); 369 EXPECT_CALL(checkpoint, Call(1));
350 EXPECT_CALL(*client, didGetReadable()); 370 EXPECT_CALL(*client, didGetReadable());
351 EXPECT_CALL(checkpoint, Call(2)); 371 EXPECT_CALL(checkpoint, Call(2));
352 EXPECT_CALL(*client, didGetReadable()); 372 EXPECT_CALL(*client, didGetReadable());
353 EXPECT_CALL(checkpoint, Call(3)); 373 EXPECT_CALL(checkpoint, Call(3));
354 374
355 const void* buffer; 375 const void* buffer;
356 size_t available; 376 size_t available;
357 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client ); 377 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client );
358 ASSERT_TRUE(reader); 378 ASSERT_TRUE(reader);
359 checkpoint.Call(1); 379 checkpoint.Call(1);
360 testing::runPendingTasks(); 380 testing::runPendingTasks();
361 checkpoint.Call(2); 381 checkpoint.Call(2);
362 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); 382 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
363 testing::runPendingTasks(); 383 testing::runPendingTasks();
364 checkpoint.Call(3); 384 checkpoint.Call(3);
365 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available)); 385 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
366 } 386 }
367 387
368 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueNull) 388 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueString)
369 { 389 {
370 ScriptState::Scope scope(scriptState()); 390 ScriptState::Scope scope(scriptState());
371 ScriptValue stream(scriptState(), evalWithPrintingError( 391 ScriptValue stream(scriptState(), evalWithPrintingError(
372 "var controller;" 392 "var controller;"
373 "var stream = new ReadableStream({start: c => controller = c});" 393 "var stream = new ReadableStream({start: c => controller = c});"
374 "controller.enqueue(null);" 394 "controller.enqueue('hello');"
375 "controller.close();" 395 "controller.close();"
376 "stream")); 396 "stream"));
377 ASSERT_FALSE(stream.isEmpty()); 397 ASSERT_FALSE(stream.isEmpty());
378 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value()); 398 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
379 ASSERT_TRUE(handle); 399 ASSERT_TRUE(handle);
380 MockClient* client = MockClient::create(); 400 MockClient* client = MockClient::create();
381 Checkpoint checkpoint; 401 Checkpoint checkpoint;
382 402
383 InSequence s; 403 InSequence s;
384 EXPECT_CALL(checkpoint, Call(1)); 404 EXPECT_CALL(checkpoint, Call(1));
385 EXPECT_CALL(*client, didGetReadable()); 405 EXPECT_CALL(*client, didGetReadable());
386 EXPECT_CALL(checkpoint, Call(2)); 406 EXPECT_CALL(checkpoint, Call(2));
387 EXPECT_CALL(*client, didGetReadable()); 407 EXPECT_CALL(*client, didGetReadable());
388 EXPECT_CALL(checkpoint, Call(3)); 408 EXPECT_CALL(checkpoint, Call(3));
389 409
390 const void* buffer; 410 const void* buffer;
391 size_t available; 411 size_t available;
392 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client ); 412 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client );
393 ASSERT_TRUE(reader); 413 ASSERT_TRUE(reader);
394 checkpoint.Call(1); 414 checkpoint.Call(1);
395 testing::runPendingTasks(); 415 testing::runPendingTasks();
396 checkpoint.Call(2); 416 checkpoint.Call(2);
397 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); 417 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
398 testing::runPendingTasks(); 418 testing::runPendingTasks();
399 checkpoint.Call(3); 419 checkpoint.Call(3);
400 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available)); 420 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
401 } 421 }
402 422
403 TEST_F(ReadableStreamDataConsumerHandleTest, EnqueueString) 423 TEST_F(ReadableStreamDataConsumerHandleTest, StreamReaderShouldBeWeak)
404 { 424 {
405 ScriptState::Scope scope(scriptState()); 425 OwnPtr<FetchDataConsumerHandle::Reader> reader;
406 ScriptValue stream(scriptState(), evalWithPrintingError(
407 "var controller;"
408 "var stream = new ReadableStream({start: c => controller = c});"
409 "controller.enqueue('hello');"
410 "controller.close();"
411 "stream"));
412 ASSERT_FALSE(stream.isEmpty());
413 OwnPtr<ReadableStreamDataConsumerHandle> handle = ReadableStreamDataConsumer Handle::create(scriptState(), stream.v8Value());
414 ASSERT_TRUE(handle);
415 MockClient* client = MockClient::create();
416 Checkpoint checkpoint; 426 Checkpoint checkpoint;
427 Persistent<MockClient> client = MockClient::create();
428 ScriptValue stream;
417 429
418 InSequence s; 430 InSequence s;
419 EXPECT_CALL(checkpoint, Call(1)); 431 EXPECT_CALL(checkpoint, Call(1));
420 EXPECT_CALL(*client, didGetReadable()); 432 EXPECT_CALL(*client, didGetReadable());
421 EXPECT_CALL(checkpoint, Call(2)); 433 EXPECT_CALL(checkpoint, Call(2));
434 EXPECT_CALL(checkpoint, Call(3));
422 EXPECT_CALL(*client, didGetReadable()); 435 EXPECT_CALL(*client, didGetReadable());
436 EXPECT_CALL(checkpoint, Call(4));
437
438 {
439 // We need this scope to collect local handles.
440 ScriptState::Scope scope(scriptState());
441 stream = ScriptValue(scriptState(), evalWithPrintingError("new ReadableS tream()"));
442 ASSERT_FALSE(stream.isEmpty());
443 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
444 ASSERT_TRUE(handle);
445
446 reader = handle->obtainReader(client);
447 ASSERT_TRUE(reader);
448 }
449
450 checkpoint.Call(1);
451 testing::runPendingTasks();
452 checkpoint.Call(2);
453 stream.clear();
454 gc();
455 checkpoint.Call(3);
456 testing::runPendingTasks();
457
458 checkpoint.Call(4);
459 const void* buffer;
460 size_t available;
461 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
462 }
463
464 TEST_F(ReadableStreamDataConsumerHandleTest, StreamReaderShouldBeWeakWhenReading )
465 {
466 OwnPtr<FetchDataConsumerHandle::Reader> reader;
467 Checkpoint checkpoint;
468 Persistent<MockClient> client = MockClient::create();
469 ScriptValue stream;
470
471 InSequence s;
472 EXPECT_CALL(checkpoint, Call(1));
473 EXPECT_CALL(*client, didGetReadable());
474 EXPECT_CALL(checkpoint, Call(2));
423 EXPECT_CALL(checkpoint, Call(3)); 475 EXPECT_CALL(checkpoint, Call(3));
476 EXPECT_CALL(checkpoint, Call(4));
477 EXPECT_CALL(*client, didGetReadable());
478 EXPECT_CALL(checkpoint, Call(5));
479
480 {
481 // We need this scope to collect local handles.
482 ScriptState::Scope scope(scriptState());
483 stream = ScriptValue(scriptState(), evalWithPrintingError("new ReadableS tream()"));
484 ASSERT_FALSE(stream.isEmpty());
485 OwnPtr<ReadableStreamDataConsumerHandle> handle = createHandle(stream);
486 ASSERT_TRUE(handle);
487
488 reader = handle->obtainReader(client);
489 ASSERT_TRUE(reader);
490 }
424 491
425 const void* buffer; 492 const void* buffer;
426 size_t available; 493 size_t available;
427 OwnPtr<FetchDataConsumerHandle::Reader> reader = handle->obtainReader(client );
428 ASSERT_TRUE(reader);
429 checkpoint.Call(1); 494 checkpoint.Call(1);
430 testing::runPendingTasks(); 495 testing::runPendingTasks();
431 checkpoint.Call(2); 496 checkpoint.Call(2);
432 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available)); 497 EXPECT_EQ(kShouldWait, reader->beginRead(&buffer, kNone, &available));
498
433 testing::runPendingTasks(); 499 testing::runPendingTasks();
434 checkpoint.Call(3); 500 checkpoint.Call(3);
501 stream.clear();
502 gc();
503 checkpoint.Call(4);
504 testing::runPendingTasks();
505
506 checkpoint.Call(5);
435 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available)); 507 EXPECT_EQ(kUnexpectedError, reader->beginRead(&buffer, kNone, &available));
436 } 508 }
437 509
438 } // namespace 510 } // namespace
439 511
440 } // namespace blink 512 } // namespace blink
441 513
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698