| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/loader/ThreadableLoader.h" | 5 #include "core/loader/ThreadableLoader.h" |
| 6 | 6 |
| 7 #include "core/dom/CrossThreadTask.h" | 7 #include "core/dom/CrossThreadTask.h" |
| 8 #include "core/fetch/MemoryCache.h" | 8 #include "core/fetch/MemoryCache.h" |
| 9 #include "core/fetch/ResourceLoaderOptions.h" | 9 #include "core/fetch/ResourceLoaderOptions.h" |
| 10 #include "core/loader/DocumentThreadableLoader.h" | 10 #include "core/loader/DocumentThreadableLoader.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 WorkerThreadableLoaderTest | 90 WorkerThreadableLoaderTest |
| 91 }; | 91 }; |
| 92 | 92 |
| 93 class ThreadableLoaderTestHelper { | 93 class ThreadableLoaderTestHelper { |
| 94 public: | 94 public: |
| 95 virtual ~ThreadableLoaderTestHelper() { } | 95 virtual ~ThreadableLoaderTestHelper() { } |
| 96 | 96 |
| 97 virtual void createLoader(ThreadableLoaderClient*, CrossOriginRequestPolicy)
= 0; | 97 virtual void createLoader(ThreadableLoaderClient*, CrossOriginRequestPolicy)
= 0; |
| 98 virtual void startLoader(const ResourceRequest&) = 0; | 98 virtual void startLoader(const ResourceRequest&) = 0; |
| 99 virtual void cancelLoader() = 0; | 99 virtual void cancelLoader() = 0; |
| 100 virtual void cancelAndClearLoader() = 0; |
| 100 virtual void clearLoader() = 0; | 101 virtual void clearLoader() = 0; |
| 101 virtual Checkpoint& checkpoint() = 0; | 102 virtual Checkpoint& checkpoint() = 0; |
| 102 virtual void callCheckpoint(int) = 0; | 103 virtual void callCheckpoint(int) = 0; |
| 103 virtual void onSetUp() = 0; | 104 virtual void onSetUp() = 0; |
| 104 virtual void onServeRequests() = 0; | 105 virtual void onServeRequests() = 0; |
| 105 virtual void onTearDown() = 0; | 106 virtual void onTearDown() = 0; |
| 106 }; | 107 }; |
| 107 | 108 |
| 108 class DocumentThreadableLoaderTestHelper : public ThreadableLoaderTestHelper { | 109 class DocumentThreadableLoaderTestHelper : public ThreadableLoaderTestHelper { |
| 109 public: | 110 public: |
| 110 DocumentThreadableLoaderTestHelper() | 111 DocumentThreadableLoaderTestHelper() |
| 111 : m_dummyPageHolder(DummyPageHolder::create(IntSize(1, 1))) | 112 : m_dummyPageHolder(DummyPageHolder::create(IntSize(1, 1))) |
| 112 { | 113 { |
| 113 } | 114 } |
| 114 | 115 |
| 115 void createLoader(ThreadableLoaderClient* client, CrossOriginRequestPolicy c
rossOriginRequestPolicy) override | 116 void createLoader(ThreadableLoaderClient* client, CrossOriginRequestPolicy c
rossOriginRequestPolicy) override |
| 116 { | 117 { |
| 117 ThreadableLoaderOptions options; | 118 ThreadableLoaderOptions options; |
| 118 options.crossOriginRequestPolicy = crossOriginRequestPolicy; | 119 options.crossOriginRequestPolicy = crossOriginRequestPolicy; |
| 119 ResourceLoaderOptions resourceLoaderOptions; | 120 ResourceLoaderOptions resourceLoaderOptions; |
| 120 m_loader = DocumentThreadableLoader::create(document(), client, options,
resourceLoaderOptions); | 121 m_loader = DocumentThreadableLoader::create(document(), client, options,
resourceLoaderOptions); |
| 121 } | 122 } |
| 122 | 123 |
| 123 void startLoader(const ResourceRequest& request) override | 124 void startLoader(const ResourceRequest& request) override |
| 124 { | 125 { |
| 125 m_loader->start(request); | 126 m_loader->start(request); |
| 126 } | 127 } |
| 127 | 128 |
| 128 void cancelLoader() override { m_loader->cancel(); } | 129 void cancelLoader() override { m_loader->cancel(); } |
| 129 void clearLoader() override { m_loader.reset(); } | 130 void cancelAndClearLoader() override |
| 131 { |
| 132 m_loader->cancel(); |
| 133 m_loader = nullptr; |
| 134 } |
| 135 void clearLoader() override { m_loader = nullptr; } |
| 130 Checkpoint& checkpoint() override { return m_checkpoint; } | 136 Checkpoint& checkpoint() override { return m_checkpoint; } |
| 131 void callCheckpoint(int n) override { m_checkpoint.Call(n); } | 137 void callCheckpoint(int n) override { m_checkpoint.Call(n); } |
| 132 | 138 |
| 133 void onSetUp() override | 139 void onSetUp() override |
| 134 { | 140 { |
| 135 } | 141 } |
| 136 | 142 |
| 137 void onServeRequests() override | 143 void onServeRequests() override |
| 138 { | 144 { |
| 139 } | 145 } |
| 140 | 146 |
| 141 void onTearDown() override | 147 void onTearDown() override |
| 142 { | 148 { |
| 143 m_loader.reset(); | 149 if (m_loader) { |
| 150 m_loader->cancel(); |
| 151 m_loader = nullptr; |
| 152 } |
| 144 } | 153 } |
| 145 | 154 |
| 146 private: | 155 private: |
| 147 Document& document() { return m_dummyPageHolder->document(); } | 156 Document& document() { return m_dummyPageHolder->document(); } |
| 148 | 157 |
| 149 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; | 158 std::unique_ptr<DummyPageHolder> m_dummyPageHolder; |
| 150 Checkpoint m_checkpoint; | 159 Checkpoint m_checkpoint; |
| 151 std::unique_ptr<DocumentThreadableLoader> m_loader; | 160 std::unique_ptr<DocumentThreadableLoader> m_loader; |
| 152 }; | 161 }; |
| 153 | 162 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 182 } | 191 } |
| 183 | 192 |
| 184 // Must be called on the worker thread. | 193 // Must be called on the worker thread. |
| 185 void cancelLoader() override | 194 void cancelLoader() override |
| 186 { | 195 { |
| 187 ASSERT(m_workerThread); | 196 ASSERT(m_workerThread); |
| 188 ASSERT(m_workerThread->isCurrentThread()); | 197 ASSERT(m_workerThread->isCurrentThread()); |
| 189 m_loader->cancel(); | 198 m_loader->cancel(); |
| 190 } | 199 } |
| 191 | 200 |
| 201 void cancelAndClearLoader() override |
| 202 { |
| 203 DCHECK(m_workerThread); |
| 204 DCHECK(m_workerThread->isCurrentThread()); |
| 205 m_loader->cancel(); |
| 206 m_loader = nullptr; |
| 207 } |
| 208 |
| 192 // Must be called on the worker thread. | 209 // Must be called on the worker thread. |
| 193 void clearLoader() override | 210 void clearLoader() override |
| 194 { | 211 { |
| 195 ASSERT(m_workerThread); | 212 ASSERT(m_workerThread); |
| 196 ASSERT(m_workerThread->isCurrentThread()); | 213 ASSERT(m_workerThread->isCurrentThread()); |
| 197 m_loader.reset(); | 214 m_loader.reset(); |
| 198 } | 215 } |
| 199 | 216 |
| 200 Checkpoint& checkpoint() override | 217 Checkpoint& checkpoint() override |
| 201 { | 218 { |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 } | 351 } |
| 335 | 352 |
| 336 void startLoader(const KURL& url) | 353 void startLoader(const KURL& url) |
| 337 { | 354 { |
| 338 ResourceRequest request(url); | 355 ResourceRequest request(url); |
| 339 request.setRequestContext(WebURLRequest::RequestContextObject); | 356 request.setRequestContext(WebURLRequest::RequestContextObject); |
| 340 m_helper->startLoader(request); | 357 m_helper->startLoader(request); |
| 341 } | 358 } |
| 342 | 359 |
| 343 void cancelLoader() { m_helper->cancelLoader(); } | 360 void cancelLoader() { m_helper->cancelLoader(); } |
| 361 void cancelAndClearLoader() { m_helper->cancelAndClearLoader(); } |
| 344 void clearLoader() { m_helper->clearLoader(); } | 362 void clearLoader() { m_helper->clearLoader(); } |
| 345 Checkpoint& checkpoint() { return m_helper->checkpoint(); } | 363 Checkpoint& checkpoint() { return m_helper->checkpoint(); } |
| 346 void callCheckpoint(int n) { m_helper->callCheckpoint(n); } | 364 void callCheckpoint(int n) { m_helper->callCheckpoint(n); } |
| 347 | 365 |
| 348 void serveRequests() | 366 void serveRequests() |
| 349 { | 367 { |
| 350 m_helper->onServeRequests(); | 368 m_helper->onServeRequests(); |
| 351 Platform::current()->getURLLoaderMockFactory()->serveAsynchronousRequest
s(); | 369 Platform::current()->getURLLoaderMockFactory()->serveAsynchronousRequest
s(); |
| 352 } | 370 } |
| 353 | 371 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &Threada
bleLoaderTest::cancelLoader)); | 466 EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &Threada
bleLoaderTest::cancelLoader)); |
| 449 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); | 467 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); |
| 450 EXPECT_CALL(checkpoint(), Call(3)); | 468 EXPECT_CALL(checkpoint(), Call(3)); |
| 451 | 469 |
| 452 startLoader(successURL()); | 470 startLoader(successURL()); |
| 453 callCheckpoint(2); | 471 callCheckpoint(2); |
| 454 callCheckpoint(3); | 472 callCheckpoint(3); |
| 455 serveRequests(); | 473 serveRequests(); |
| 456 } | 474 } |
| 457 | 475 |
| 458 TEST_P(ThreadableLoaderTest, ClearAfterStart) | 476 TEST_P(ThreadableLoaderTest, CancelAndClearAfterStart) |
| 459 { | 477 { |
| 460 InSequence s; | 478 InSequence s; |
| 461 EXPECT_CALL(checkpoint(), Call(1)); | 479 EXPECT_CALL(checkpoint(), Call(1)); |
| 462 createLoader(); | 480 createLoader(); |
| 463 callCheckpoint(1); | 481 callCheckpoint(1); |
| 464 | 482 |
| 465 EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &Threada
bleLoaderTest::clearLoader)); | 483 EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &Threada
bleLoaderTest::cancelAndClearLoader)); |
| 484 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); |
| 466 EXPECT_CALL(checkpoint(), Call(3)); | 485 EXPECT_CALL(checkpoint(), Call(3)); |
| 467 | 486 |
| 468 startLoader(successURL()); | 487 startLoader(successURL()); |
| 469 callCheckpoint(2); | 488 callCheckpoint(2); |
| 470 callCheckpoint(3); | 489 callCheckpoint(3); |
| 471 serveRequests(); | 490 serveRequests(); |
| 472 } | 491 } |
| 473 | 492 |
| 474 TEST_P(ThreadableLoaderTest, CancelInDidReceiveResponse) | 493 TEST_P(ThreadableLoaderTest, CancelInDidReceiveResponse) |
| 475 { | 494 { |
| 476 InSequence s; | 495 InSequence s; |
| 477 EXPECT_CALL(checkpoint(), Call(1)); | 496 EXPECT_CALL(checkpoint(), Call(1)); |
| 478 createLoader(); | 497 createLoader(); |
| 479 callCheckpoint(1); | 498 callCheckpoint(1); |
| 480 | 499 |
| 481 EXPECT_CALL(checkpoint(), Call(2)); | 500 EXPECT_CALL(checkpoint(), Call(2)); |
| 482 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)).WillOnce(InvokeWitho
utArgs(this, &ThreadableLoaderTest::cancelLoader)); | 501 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)).WillOnce(InvokeWitho
utArgs(this, &ThreadableLoaderTest::cancelLoader)); |
| 483 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); | 502 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); |
| 484 | 503 |
| 485 startLoader(successURL()); | 504 startLoader(successURL()); |
| 486 callCheckpoint(2); | 505 callCheckpoint(2); |
| 487 serveRequests(); | 506 serveRequests(); |
| 488 } | 507 } |
| 489 | 508 |
| 490 TEST_P(ThreadableLoaderTest, ClearInDidReceiveResponse) | 509 TEST_P(ThreadableLoaderTest, CancelAndClearInDidReceiveResponse) |
| 491 { | 510 { |
| 492 InSequence s; | 511 InSequence s; |
| 493 EXPECT_CALL(checkpoint(), Call(1)); | 512 EXPECT_CALL(checkpoint(), Call(1)); |
| 494 createLoader(); | 513 createLoader(); |
| 495 callCheckpoint(1); | 514 callCheckpoint(1); |
| 496 | 515 |
| 497 EXPECT_CALL(checkpoint(), Call(2)); | 516 EXPECT_CALL(checkpoint(), Call(2)); |
| 498 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)).WillOnce(InvokeWitho
utArgs(this, &ThreadableLoaderTest::clearLoader)); | 517 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)).WillOnce(InvokeWitho
utArgs(this, &ThreadableLoaderTest::cancelAndClearLoader)); |
| 518 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); |
| 499 | 519 |
| 500 startLoader(successURL()); | 520 startLoader(successURL()); |
| 501 callCheckpoint(2); | 521 callCheckpoint(2); |
| 502 serveRequests(); | 522 serveRequests(); |
| 503 } | 523 } |
| 504 | 524 |
| 505 TEST_P(ThreadableLoaderTest, CancelInDidReceiveData) | 525 TEST_P(ThreadableLoaderTest, CancelInDidReceiveData) |
| 506 { | 526 { |
| 507 InSequence s; | 527 InSequence s; |
| 508 EXPECT_CALL(checkpoint(), Call(1)); | 528 EXPECT_CALL(checkpoint(), Call(1)); |
| 509 createLoader(); | 529 createLoader(); |
| 510 callCheckpoint(1); | 530 callCheckpoint(1); |
| 511 | 531 |
| 512 EXPECT_CALL(checkpoint(), Call(2)); | 532 EXPECT_CALL(checkpoint(), Call(2)); |
| 513 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)); | 533 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)); |
| 514 EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this
, &ThreadableLoaderTest::cancelLoader)); | 534 EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this
, &ThreadableLoaderTest::cancelLoader)); |
| 515 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); | 535 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); |
| 516 | 536 |
| 517 startLoader(successURL()); | 537 startLoader(successURL()); |
| 518 callCheckpoint(2); | 538 callCheckpoint(2); |
| 519 serveRequests(); | 539 serveRequests(); |
| 520 } | 540 } |
| 521 | 541 |
| 522 TEST_P(ThreadableLoaderTest, ClearInDidReceiveData) | 542 TEST_P(ThreadableLoaderTest, CancelAndClearInDidReceiveData) |
| 523 { | 543 { |
| 524 InSequence s; | 544 InSequence s; |
| 525 EXPECT_CALL(checkpoint(), Call(1)); | 545 EXPECT_CALL(checkpoint(), Call(1)); |
| 526 createLoader(); | 546 createLoader(); |
| 527 callCheckpoint(1); | 547 callCheckpoint(1); |
| 528 | 548 |
| 529 EXPECT_CALL(checkpoint(), Call(2)); | 549 EXPECT_CALL(checkpoint(), Call(2)); |
| 530 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)); | 550 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)); |
| 531 EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this
, &ThreadableLoaderTest::clearLoader)); | 551 EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this
, &ThreadableLoaderTest::cancelAndClearLoader)); |
| 552 EXPECT_CALL(*client(), didFail(Truly(isCancellation))); |
| 532 | 553 |
| 533 startLoader(successURL()); | 554 startLoader(successURL()); |
| 534 callCheckpoint(2); | 555 callCheckpoint(2); |
| 535 serveRequests(); | 556 serveRequests(); |
| 536 } | 557 } |
| 537 | 558 |
| 538 TEST_P(ThreadableLoaderTest, DidFinishLoading) | 559 TEST_P(ThreadableLoaderTest, DidFinishLoading) |
| 539 { | 560 { |
| 540 InSequence s; | 561 InSequence s; |
| 541 EXPECT_CALL(checkpoint(), Call(1)); | 562 EXPECT_CALL(checkpoint(), Call(1)); |
| 542 createLoader(); | 563 createLoader(); |
| 543 callCheckpoint(1); | 564 callCheckpoint(1); |
| 544 | 565 |
| 545 EXPECT_CALL(checkpoint(), Call(2)); | 566 EXPECT_CALL(checkpoint(), Call(2)); |
| 546 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)); | 567 EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)); |
| 547 EXPECT_CALL(*client(), didReceiveData(StrEq("fox"), 4)); | 568 EXPECT_CALL(*client(), didReceiveData(StrEq("fox"), 4)); |
| 569 // We expect didReceiveResourceTiming() calls in DocumentThreadableLoader; |
| 570 // it's used to connect DocumentThreadableLoader to WorkerThreadableLoader, |
| 571 // not to ThreadableLoaderClient. |
| 548 EXPECT_CALL(*client(), didReceiveResourceTiming(_)); | 572 EXPECT_CALL(*client(), didReceiveResourceTiming(_)); |
| 549 EXPECT_CALL(*client(), didFinishLoading(_, _)); | 573 EXPECT_CALL(*client(), didFinishLoading(_, _)); |
| 550 | 574 |
| 551 startLoader(successURL()); | 575 startLoader(successURL()); |
| 552 callCheckpoint(2); | 576 callCheckpoint(2); |
| 553 serveRequests(); | 577 serveRequests(); |
| 554 } | 578 } |
| 555 | 579 |
| 556 TEST_P(ThreadableLoaderTest, CancelInDidFinishLoading) | 580 TEST_P(ThreadableLoaderTest, CancelInDidFinishLoading) |
| 557 { | 581 { |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 822 EXPECT_CALL(*client(), didFailRedirectCheck()).WillOnce(InvokeWithoutArgs(th
is, &ThreadableLoaderTest::clearLoader)); | 846 EXPECT_CALL(*client(), didFailRedirectCheck()).WillOnce(InvokeWithoutArgs(th
is, &ThreadableLoaderTest::clearLoader)); |
| 823 | 847 |
| 824 startLoader(redirectLoopURL()); | 848 startLoader(redirectLoopURL()); |
| 825 callCheckpoint(2); | 849 callCheckpoint(2); |
| 826 serveRequests(); | 850 serveRequests(); |
| 827 } | 851 } |
| 828 | 852 |
| 829 } // namespace | 853 } // namespace |
| 830 | 854 |
| 831 } // namespace blink | 855 } // namespace blink |
| OLD | NEW |