1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/browser/startup_task_runner.h"
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/bind.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/location.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/message_loop/message_loop.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace content {
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)StartupTaskRunner::StartupTaskRunner(
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool browser_may_start_asynchronously,
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::Callback<void(int)> const startup_complete_callback,
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_refptr<base::SingleThreadTaskRunner> proxy)
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : asynchronous_startup_(browser_may_start_asynchronously),
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      startup_complete_callback_(startup_complete_callback),
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      proxy_(proxy) {}
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void StartupTaskRunner::AddTask(StartupTask& callback) {
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  task_list_.push_back(callback);
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void StartupTaskRunner::StartRunningTasks() {
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DCHECK(proxy_);
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int result = 0;
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (asynchronous_startup_ && !task_list_.empty()) {
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::Closure next_task =
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&StartupTaskRunner::WrappedTask, this);
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    proxy_->PostNonNestableTask(FROM_HERE, next_task);
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    for (std::list<StartupTask>::iterator it = task_list_.begin();
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)         it != task_list_.end();
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)         it++) {
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      result = it->Run();
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      if (result > 0) {
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        break;
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      }
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!startup_complete_callback_.is_null()) {
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      startup_complete_callback_.Run(result);
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void StartupTaskRunner::WrappedTask() {
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int result = task_list_.front().Run();
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  task_list_.pop_front();
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (result > 0 || task_list_.empty()) {
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (!startup_complete_callback_.is_null()) {
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      startup_complete_callback_.Run(result);
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else {
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::Closure next_task =
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&StartupTaskRunner::WrappedTask, this);
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    proxy_->PostNonNestableTask(FROM_HERE, next_task);
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)StartupTaskRunner::~StartupTaskRunner() {}
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace content
64