OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/scheduler/test/fake_web_task_runner.h" | 5 #include "platform/scheduler/test/fake_web_task_runner.h" |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
13 #include "wtf/RefCounted.h" | 13 #include "wtf/RefCounted.h" |
14 | 14 |
15 namespace blink { | 15 namespace blink { |
16 namespace scheduler { | 16 namespace scheduler { |
17 | 17 |
18 class FakeWebTaskRunner::Data : public WTF::ThreadSafeRefCounted<Data> { | 18 class FakeWebTaskRunner::Data : public WTF::ThreadSafeRefCounted<Data> { |
19 public: | 19 public: |
20 Data() : time_(0.0) {} | 20 Data() : time_(0.0) {} |
21 | 21 |
22 void PostTask(const base::Closure& task, base::TimeDelta delay) { | 22 void PostTask(base::OnceClosure task, base::TimeDelta delay) { |
23 task_queue_.push_back(std::make_pair(task, time_ + delay.InSecondsF())); | 23 task_queue_.push_back( |
| 24 std::make_pair(std::move(task), time_ + delay.InSecondsF())); |
24 } | 25 } |
25 | 26 |
26 using QueueItem = std::pair<base::Closure, double>; | 27 using QueueItem = std::pair<base::OnceClosure, double>; |
27 std::deque<QueueItem>::iterator FindRunnableTask() { | 28 std::deque<QueueItem>::iterator FindRunnableTask() { |
28 // TODO(tkent): This should return an item which has the minimum |second|. | 29 // TODO(tkent): This should return an item which has the minimum |second|. |
29 return std::find_if( | 30 return std::find_if( |
30 task_queue_.begin(), task_queue_.end(), | 31 task_queue_.begin(), task_queue_.end(), |
31 [&](const QueueItem& item) { return item.second <= time_; }); | 32 [&](const QueueItem& item) { return item.second <= time_; }); |
32 } | 33 } |
33 | 34 |
34 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 35 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
35 std::deque<QueueItem> task_queue_; | 36 std::deque<QueueItem> task_queue_; |
36 double time_; | 37 double time_; |
37 | 38 |
38 private: | 39 private: |
39 ~Data() {} | 40 ~Data() {} |
40 | 41 |
41 friend ThreadSafeRefCounted<Data>; | 42 friend ThreadSafeRefCounted<Data>; |
42 DISALLOW_COPY_AND_ASSIGN(Data); | 43 DISALLOW_COPY_AND_ASSIGN(Data); |
43 }; | 44 }; |
44 | 45 |
45 class FakeWebTaskRunner::BaseTaskRunner : public base::SingleThreadTaskRunner { | 46 class FakeWebTaskRunner::BaseTaskRunner : public base::SingleThreadTaskRunner { |
46 public: | 47 public: |
47 explicit BaseTaskRunner(PassRefPtr<Data> data) : data_(std::move(data)) {} | 48 explicit BaseTaskRunner(PassRefPtr<Data> data) : data_(std::move(data)) {} |
48 | 49 |
49 bool PostDelayedTask(const tracked_objects::Location& from_here, | 50 bool PostDelayedTask(const tracked_objects::Location& from_here, |
50 base::Closure task, | 51 base::OnceClosure task, |
51 base::TimeDelta delay) override { | 52 base::TimeDelta delay) override { |
52 data_->PostTask(std::move(task), delay); | 53 data_->PostTask(std::move(task), delay); |
53 return true; | 54 return true; |
54 } | 55 } |
55 | 56 |
56 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 57 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
57 base::Closure task, | 58 base::OnceClosure task, |
58 base::TimeDelta delay) override { | 59 base::TimeDelta delay) override { |
59 data_->PostTask(std::move(task), delay); | 60 data_->PostTask(std::move(task), delay); |
60 return true; | 61 return true; |
61 } | 62 } |
62 | 63 |
63 bool RunsTasksOnCurrentThread() const { return true; } | 64 bool RunsTasksOnCurrentThread() const { return true; } |
64 | 65 |
65 private: | 66 private: |
66 RefPtr<Data> data_; | 67 RefPtr<Data> data_; |
67 }; | 68 }; |
68 | 69 |
69 FakeWebTaskRunner::FakeWebTaskRunner() | 70 FakeWebTaskRunner::FakeWebTaskRunner() |
70 : data_(adoptRef(new Data)), base_task_runner_(new BaseTaskRunner(data_)) {} | 71 : data_(adoptRef(new Data)), base_task_runner_(new BaseTaskRunner(data_)) {} |
71 | 72 |
72 FakeWebTaskRunner::FakeWebTaskRunner( | 73 FakeWebTaskRunner::FakeWebTaskRunner( |
73 PassRefPtr<Data> data, | 74 PassRefPtr<Data> data, |
74 scoped_refptr<BaseTaskRunner> base_task_runner) | 75 scoped_refptr<BaseTaskRunner> base_task_runner) |
75 : data_(std::move(data)), base_task_runner_(std::move(base_task_runner)) {} | 76 : data_(std::move(data)), base_task_runner_(std::move(base_task_runner)) {} |
76 | 77 |
77 FakeWebTaskRunner::~FakeWebTaskRunner() { | 78 FakeWebTaskRunner::~FakeWebTaskRunner() { |
78 } | 79 } |
79 | 80 |
80 void FakeWebTaskRunner::setTime(double new_time) { | 81 void FakeWebTaskRunner::setTime(double new_time) { |
81 data_->time_ = new_time; | 82 data_->time_ = new_time; |
82 } | 83 } |
83 | 84 |
84 void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&, | 85 void FakeWebTaskRunner::postDelayedTask(const WebTraceLocation&, |
85 base::Closure closure, | 86 base::OnceClosure closure, |
86 double delay_ms) { | 87 double delay_ms) { |
87 data_->PostTask(std::move(closure), | 88 data_->PostTask(std::move(closure), |
88 base::TimeDelta::FromMillisecondsD(delay_ms)); | 89 base::TimeDelta::FromMillisecondsD(delay_ms)); |
89 } | 90 } |
90 | 91 |
91 bool FakeWebTaskRunner::runsTasksOnCurrentThread() { | 92 bool FakeWebTaskRunner::runsTasksOnCurrentThread() { |
92 return true; | 93 return true; |
93 } | 94 } |
94 | 95 |
95 double FakeWebTaskRunner::virtualTimeSeconds() const { | 96 double FakeWebTaskRunner::virtualTimeSeconds() const { |
96 return data_->time_; | 97 return data_->time_; |
97 } | 98 } |
98 | 99 |
99 double FakeWebTaskRunner::monotonicallyIncreasingVirtualTimeSeconds() const { | 100 double FakeWebTaskRunner::monotonicallyIncreasingVirtualTimeSeconds() const { |
100 return data_->time_; | 101 return data_->time_; |
101 } | 102 } |
102 | 103 |
103 SingleThreadTaskRunner* FakeWebTaskRunner::toSingleThreadTaskRunner() { | 104 SingleThreadTaskRunner* FakeWebTaskRunner::toSingleThreadTaskRunner() { |
104 return base_task_runner_.get(); | 105 return base_task_runner_.get(); |
105 } | 106 } |
106 | 107 |
107 void FakeWebTaskRunner::runUntilIdle() { | 108 void FakeWebTaskRunner::runUntilIdle() { |
108 while (!data_->task_queue_.empty()) { | 109 while (!data_->task_queue_.empty()) { |
109 // Move the task to run into a local variable in case it touches the | 110 // Move the task to run into a local variable in case it touches the |
110 // task queue by posting a new task. | 111 // task queue by posting a new task. |
111 base::Closure task = std::move(data_->task_queue_.front()).first; | 112 base::OnceClosure task = std::move(data_->task_queue_.front()).first; |
112 data_->task_queue_.pop_front(); | 113 data_->task_queue_.pop_front(); |
113 std::move(task).Run(); | 114 std::move(task).Run(); |
114 } | 115 } |
115 } | 116 } |
116 | 117 |
117 void FakeWebTaskRunner::advanceTimeAndRun(double delta_seconds) { | 118 void FakeWebTaskRunner::advanceTimeAndRun(double delta_seconds) { |
118 data_->time_ += delta_seconds; | 119 data_->time_ += delta_seconds; |
119 for (auto it = data_->FindRunnableTask(); it != data_->task_queue_.end(); | 120 for (auto it = data_->FindRunnableTask(); it != data_->task_queue_.end(); |
120 it = data_->FindRunnableTask()) { | 121 it = data_->FindRunnableTask()) { |
121 base::Closure task = std::move(*it).first; | 122 base::OnceClosure task = std::move(*it).first; |
122 data_->task_queue_.erase(it); | 123 data_->task_queue_.erase(it); |
123 task.Run(); | 124 std::move(task).Run(); |
124 } | 125 } |
125 } | 126 } |
126 | 127 |
127 std::deque<std::pair<base::Closure, double>> | 128 std::deque<std::pair<base::OnceClosure, double>> |
128 FakeWebTaskRunner::takePendingTasksForTesting() { | 129 FakeWebTaskRunner::takePendingTasksForTesting() { |
129 return std::move(data_->task_queue_); | 130 return std::move(data_->task_queue_); |
130 } | 131 } |
131 | 132 |
132 } // namespace scheduler | 133 } // namespace scheduler |
133 } // namespace blink | 134 } // namespace blink |
OLD | NEW |