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

Side by Side Diff: third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp

Issue 2146403004: ThreadableLoader::cancel should be called before loader destruction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@onheap-threadable-loader-client-wrapper
Patch Set: fix Created 4 years, 5 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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698