15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/safe_browsing/incident_reporting/delayed_callback_runner.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/location.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace safe_browsing {
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DelayedCallbackRunner::DelayedCallbackRunner(
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::TimeDelta delay,
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const scoped_refptr<base::TaskRunner>& task_runner)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : task_runner_(task_runner),
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      next_callback_(callbacks_.end()),
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      timer_(FROM_HERE, delay, this, &DelayedCallbackRunner::OnTimer) {
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DelayedCallbackRunner::~DelayedCallbackRunner() {
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DelayedCallbackRunner::RegisterCallback(const base::Closure& callback) {
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  callbacks_.push_back(callback);
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DelayedCallbackRunner::Start() {
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Nothing to do if the runner is already running or nothing has been added.
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (next_callback_ != callbacks_.end() || callbacks_.empty())
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Prime the system with the first callback.
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  next_callback_ = callbacks_.begin();
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Point the starter pistol in the air and pull the trigger.
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  timer_.Reset();
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DelayedCallbackRunner::OnTimer() {
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Run the next callback on the task runner.
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  task_runner_->PostTask(FROM_HERE, *next_callback_);
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Remove this callback and get ready for the next if there is one.
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  next_callback_ = callbacks_.erase(next_callback_);
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (next_callback_ != callbacks_.end())
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    timer_.Reset();
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace safe_browsing
52