| 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 "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |