Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc |
index e42fee10c09e0aa1542725e07936804dca855cc6..2a4f441b9b126813610fce556c2496a1b9cabf42 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc |
@@ -230,10 +230,9 @@ void TaskQueueManager::MaybeScheduleImmediateWorkLocked( |
void TaskQueueManager::MaybeScheduleDelayedWork( |
const tracked_objects::Location& from_here, |
- base::TimeTicks now, |
- base::TimeDelta delay) { |
+ LazyNow* lazy_now, |
+ base::TimeTicks run_time) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
- DCHECK_GE(delay, base::TimeDelta()); |
{ |
base::AutoLock lock(any_thread_lock_); |
@@ -248,11 +247,16 @@ void TaskQueueManager::MaybeScheduleDelayedWork( |
} |
// De-duplicate DoWork posts. |
- base::TimeTicks run_time = now + delay; |
if (next_scheduled_delayed_do_work_time_ <= run_time && |
!next_scheduled_delayed_do_work_time_.is_null()) |
return; |
+ cancelable_delayed_do_work_closure_.Reset(delayed_do_work_closure_); |
+ |
+ base::TimeDelta delay = |
+ std::max(base::TimeDelta(), run_time - lazy_now->Now()); |
+ next_scheduled_delayed_do_work_time_ = lazy_now->Now() + delay; |
+ |
TRACE_EVENT1(disabled_by_default_tracing_category_, |
"TaskQueueManager::MaybeScheduleDelayedWork::PostDelayedTask", |
"delay_ms", delay.InMillisecondsF()); |
@@ -263,6 +267,15 @@ void TaskQueueManager::MaybeScheduleDelayedWork( |
from_here, cancelable_delayed_do_work_closure_.callback(), delay); |
} |
+void TaskQueueManager::CancelDelayedWork(base::TimeTicks run_time) { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ if (next_scheduled_delayed_do_work_time_ != run_time) |
+ return; |
+ |
+ cancelable_delayed_do_work_closure_.Cancel(); |
+ next_scheduled_delayed_do_work_time_ = base::TimeTicks(); |
+} |
+ |
void TaskQueueManager::DoWork(bool delayed) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
TRACE_EVENT1(tracing_category_, "TaskQueueManager::DoWork", "delayed", |