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 |