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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp
diff --git a/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp b/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp
index 50b8d2411182ec175d37d118dc4f1c7589ecd02a..12c2f298ede542afb758eef971326a66d5445a1a 100644
--- a/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp
+++ b/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp
@@ -97,6 +97,7 @@ public:
virtual void createLoader(ThreadableLoaderClient*, CrossOriginRequestPolicy) = 0;
virtual void startLoader(const ResourceRequest&) = 0;
virtual void cancelLoader() = 0;
+ virtual void cancelAndClearLoader() = 0;
virtual void clearLoader() = 0;
virtual Checkpoint& checkpoint() = 0;
virtual void callCheckpoint(int) = 0;
@@ -126,7 +127,12 @@ public:
}
void cancelLoader() override { m_loader->cancel(); }
- void clearLoader() override { m_loader.reset(); }
+ void cancelAndClearLoader() override
+ {
+ m_loader->cancel();
+ m_loader = nullptr;
+ }
+ void clearLoader() override { m_loader = nullptr; }
Checkpoint& checkpoint() override { return m_checkpoint; }
void callCheckpoint(int n) override { m_checkpoint.Call(n); }
@@ -140,7 +146,10 @@ public:
void onTearDown() override
{
- m_loader.reset();
+ if (m_loader) {
+ m_loader->cancel();
+ m_loader = nullptr;
+ }
}
private:
@@ -189,6 +198,14 @@ public:
m_loader->cancel();
}
+ void cancelAndClearLoader() override
+ {
+ DCHECK(m_workerThread);
+ DCHECK(m_workerThread->isCurrentThread());
+ m_loader->cancel();
+ m_loader = nullptr;
+ }
+
// Must be called on the worker thread.
void clearLoader() override
{
@@ -341,6 +358,7 @@ public:
}
void cancelLoader() { m_helper->cancelLoader(); }
+ void cancelAndClearLoader() { m_helper->cancelAndClearLoader(); }
void clearLoader() { m_helper->clearLoader(); }
Checkpoint& checkpoint() { return m_helper->checkpoint(); }
void callCheckpoint(int n) { m_helper->callCheckpoint(n); }
@@ -455,14 +473,15 @@ TEST_P(ThreadableLoaderTest, CancelAfterStart)
serveRequests();
}
-TEST_P(ThreadableLoaderTest, ClearAfterStart)
+TEST_P(ThreadableLoaderTest, CancelAndClearAfterStart)
{
InSequence s;
EXPECT_CALL(checkpoint(), Call(1));
createLoader();
callCheckpoint(1);
- EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &ThreadableLoaderTest::clearLoader));
+ EXPECT_CALL(checkpoint(), Call(2)).WillOnce(InvokeWithoutArgs(this, &ThreadableLoaderTest::cancelAndClearLoader));
+ EXPECT_CALL(*client(), didFail(Truly(isCancellation)));
EXPECT_CALL(checkpoint(), Call(3));
startLoader(successURL());
@@ -487,7 +506,7 @@ TEST_P(ThreadableLoaderTest, CancelInDidReceiveResponse)
serveRequests();
}
-TEST_P(ThreadableLoaderTest, ClearInDidReceiveResponse)
+TEST_P(ThreadableLoaderTest, CancelAndClearInDidReceiveResponse)
{
InSequence s;
EXPECT_CALL(checkpoint(), Call(1));
@@ -495,7 +514,8 @@ TEST_P(ThreadableLoaderTest, ClearInDidReceiveResponse)
callCheckpoint(1);
EXPECT_CALL(checkpoint(), Call(2));
- EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)).WillOnce(InvokeWithoutArgs(this, &ThreadableLoaderTest::clearLoader));
+ EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _)).WillOnce(InvokeWithoutArgs(this, &ThreadableLoaderTest::cancelAndClearLoader));
+ EXPECT_CALL(*client(), didFail(Truly(isCancellation)));
startLoader(successURL());
callCheckpoint(2);
@@ -519,7 +539,7 @@ TEST_P(ThreadableLoaderTest, CancelInDidReceiveData)
serveRequests();
}
-TEST_P(ThreadableLoaderTest, ClearInDidReceiveData)
+TEST_P(ThreadableLoaderTest, CancelAndClearInDidReceiveData)
{
InSequence s;
EXPECT_CALL(checkpoint(), Call(1));
@@ -528,7 +548,8 @@ TEST_P(ThreadableLoaderTest, ClearInDidReceiveData)
EXPECT_CALL(checkpoint(), Call(2));
EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _));
- EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this, &ThreadableLoaderTest::clearLoader));
+ EXPECT_CALL(*client(), didReceiveData(_, _)).WillOnce(InvokeWithoutArgs(this, &ThreadableLoaderTest::cancelAndClearLoader));
+ EXPECT_CALL(*client(), didFail(Truly(isCancellation)));
startLoader(successURL());
callCheckpoint(2);
@@ -545,6 +566,9 @@ TEST_P(ThreadableLoaderTest, DidFinishLoading)
EXPECT_CALL(checkpoint(), Call(2));
EXPECT_CALL(*client(), didReceiveResponseMock(_, _, _));
EXPECT_CALL(*client(), didReceiveData(StrEq("fox"), 4));
+ // We expect didReceiveResourceTiming() calls in DocumentThreadableLoader;
+ // it's used to connect DocumentThreadableLoader to WorkerThreadableLoader,
+ // not to ThreadableLoaderClient.
EXPECT_CALL(*client(), didReceiveResourceTiming(_));
EXPECT_CALL(*client(), didFinishLoading(_, _));

Powered by Google App Engine
This is Rietveld 408576698