Index: cc/test/ordered_simple_task_runner.cc |
diff --git a/cc/test/ordered_simple_task_runner.cc b/cc/test/ordered_simple_task_runner.cc |
index 9dc4bbcd2dacb680d586699576a632e286aab037..161704fc45897fe97f643db91b94b3639b4c1936 100644 |
--- a/cc/test/ordered_simple_task_runner.cc |
+++ b/cc/test/ordered_simple_task_runner.cc |
@@ -137,6 +137,8 @@ bool OrderedSimpleTaskRunner::HasPendingTasks() const { |
} |
base::TimeTicks OrderedSimpleTaskRunner::NextTaskTime() { |
+ RemoveCancelledTasks(); |
+ |
if (pending_tasks_.size() <= 0) { |
return AbsoluteMaxNow(); |
} |
@@ -146,6 +148,7 @@ base::TimeTicks OrderedSimpleTaskRunner::NextTaskTime() { |
base::TimeDelta OrderedSimpleTaskRunner::DelayToNextTaskTime() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ RemoveCancelledTasks(); |
if (pending_tasks_.size() <= 0) { |
return AbsoluteMaxNow() - base::TimeTicks(); |
@@ -198,6 +201,11 @@ bool OrderedSimpleTaskRunner::RunTasksWhile( |
} |
while (pending_tasks_.size() > 0) { |
+ // Skip canceled tasks. |
+ if (pending_tasks_.begin()->task.IsCancelled()) { |
+ pending_tasks_.erase(pending_tasks_.begin()); |
+ continue; |
+ } |
// Check if we should continue to run pending tasks. |
bool condition_success = true; |
for (std::vector<base::Callback<bool(void)>>::iterator it = |
@@ -344,4 +352,15 @@ bool OrderedSimpleTaskRunner::AdvanceNowCallback() { |
return true; |
} |
+void OrderedSimpleTaskRunner::RemoveCancelledTasks() { |
+ std::set<TestOrderablePendingTask>::iterator it = pending_tasks_.begin(); |
+ while (it != pending_tasks_.end()) { |
+ if (it->task.IsCancelled()) { |
+ it = pending_tasks_.erase(it); |
+ } else { |
+ it++; |
+ } |
+ } |
+} |
+ |
} // namespace cc |