Index: third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp |
diff --git a/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp b/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp |
index 022a649a53e2ac5b9ca23fb21a2ef320fc8faba3..bcff0c113ae43105fedd67c95a1ce46c39108309 100644 |
--- a/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp |
+++ b/third_party/WebKit/Source/platform/WebTaskRunnerTest.cpp |
@@ -18,6 +18,23 @@ void getIsActive(bool* isActive, TaskHandle* handle) { |
*isActive = handle->isActive(); |
} |
+class CancellationTestHelper { |
+ public: |
+ CancellationTestHelper() : m_weakPtrFactory(this) {} |
+ |
+ WeakPtr<CancellationTestHelper> createWeakPtr() { |
+ return m_weakPtrFactory.createWeakPtr(); |
+ } |
+ |
+ void revokeWeakPtrs() { m_weakPtrFactory.revokeAll(); } |
+ void incrementCounter() { ++m_counter; } |
+ int counter() const { return m_counter; } |
+ |
+ private: |
+ int m_counter = 0; |
+ WeakPtrFactory<CancellationTestHelper> m_weakPtrFactory; |
+}; |
+ |
} // namespace |
TEST(WebTaskRunnerTest, PostCancellableTaskTest) { |
@@ -99,4 +116,38 @@ TEST(WebTaskRunnerTest, PostCancellableTaskTest) { |
EXPECT_FALSE(handle.isActive()); |
} |
+TEST(WebTaskRunnerTest, CancellationCheckerTest) { |
+ scheduler::FakeWebTaskRunner taskRunner; |
+ |
+ int count = 0; |
+ TaskHandle handle = taskRunner.postCancellableTask( |
+ BLINK_FROM_HERE, WTF::bind(&increment, WTF::unretained(&count))); |
+ EXPECT_EQ(0, count); |
+ |
+ // TaskHandle::isActive should detect the deletion of posted task. |
+ auto queue = taskRunner.takePendingTasksForTesting(); |
+ ASSERT_EQ(1u, queue.size()); |
+ EXPECT_FALSE(queue[0].IsCancelled()); |
+ EXPECT_TRUE(handle.isActive()); |
+ queue.clear(); |
+ EXPECT_FALSE(handle.isActive()); |
+ EXPECT_EQ(0, count); |
+ |
+ count = 0; |
+ CancellationTestHelper helper; |
+ handle = taskRunner.postCancellableTask( |
+ BLINK_FROM_HERE, WTF::bind(&CancellationTestHelper::incrementCounter, |
+ helper.createWeakPtr())); |
+ EXPECT_EQ(0, helper.counter()); |
+ |
+ // The cancellation of the posted task should be propagated to TaskHandle. |
+ queue = taskRunner.takePendingTasksForTesting(); |
+ ASSERT_EQ(1u, queue.size()); |
+ EXPECT_FALSE(queue[0].IsCancelled()); |
+ EXPECT_TRUE(handle.isActive()); |
+ helper.revokeWeakPtrs(); |
+ EXPECT_TRUE(queue[0].IsCancelled()); |
+ EXPECT_FALSE(handle.isActive()); |
+} |
+ |
} // namespace blink |