| 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 |