1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/viz/test/fake_external_begin_frame_source.h"
6
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "base/single_thread_task_runner.h"
10 #include "base/threading/thread_task_runner_handle.h"
11 #include "base/time/time.h"
12 #include "components/viz/test/begin_frame_args_test.h"
13
14 namespace viz {
15
FakeExternalBeginFrameSource(double refresh_rate,bool tick_automatically)16 FakeExternalBeginFrameSource::FakeExternalBeginFrameSource(
17 double refresh_rate,
18 bool tick_automatically)
19 : BeginFrameSource(kNotRestartableId),
20 tick_automatically_(tick_automatically),
21 milliseconds_per_frame_(1000.0 / refresh_rate) {
22 DETACH_FROM_SEQUENCE(sequence_checker_);
23 }
24
~FakeExternalBeginFrameSource()25 FakeExternalBeginFrameSource::~FakeExternalBeginFrameSource() {
26 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
27 }
28
SetPaused(bool paused)29 void FakeExternalBeginFrameSource::SetPaused(bool paused) {
30 if (paused != paused_) {
31 paused_ = paused;
32 std::set<BeginFrameObserver*> observers(observers_);
33 for (auto* obs : observers)
34 obs->OnBeginFrameSourcePausedChanged(paused_);
35 }
36 }
37
AddObserver(BeginFrameObserver * obs)38 void FakeExternalBeginFrameSource::AddObserver(BeginFrameObserver* obs) {
39 DCHECK(obs);
40 DCHECK(observers_.find(obs) == observers_.end());
41
42 bool observers_was_empty = observers_.empty();
43 observers_.insert(obs);
44 obs->OnBeginFrameSourcePausedChanged(paused_);
45 if (observers_was_empty && tick_automatically_) {
46 PostTestOnBeginFrame();
47 } else if (current_args_.IsValid()) {
48 const BeginFrameArgs& last_args = obs->LastUsedBeginFrameArgs();
49 if (!last_args.IsValid() ||
50 last_args.frame_time < current_args_.frame_time) {
51 current_args_.type = BeginFrameArgs::MISSED;
52 obs->OnBeginFrame(current_args_);
53 }
54 }
55 if (client_)
56 client_->OnAddObserver(obs);
57 }
58
RemoveObserver(BeginFrameObserver * obs)59 void FakeExternalBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) {
60 DCHECK(obs);
61 DCHECK(observers_.find(obs) != observers_.end());
62
63 observers_.erase(obs);
64 if (observers_.empty())
65 begin_frame_task_.Cancel();
66 if (client_)
67 client_->OnRemoveObserver(obs);
68 }
69
DidFinishFrame(BeginFrameObserver * obs)70 void FakeExternalBeginFrameSource::DidFinishFrame(BeginFrameObserver* obs) {}
71
IsThrottled() const72 bool FakeExternalBeginFrameSource::IsThrottled() const {
73 return true;
74 }
75
CreateBeginFrameArgs(BeginFrameArgs::CreationLocation location,const base::TickClock * now_src)76 BeginFrameArgs FakeExternalBeginFrameSource::CreateBeginFrameArgs(
77 BeginFrameArgs::CreationLocation location,
78 const base::TickClock* now_src) {
79 return CreateBeginFrameArgsForTesting(location, source_id(),
80 next_begin_frame_number_++, now_src);
81 }
82
CreateBeginFrameArgs(BeginFrameArgs::CreationLocation location)83 BeginFrameArgs FakeExternalBeginFrameSource::CreateBeginFrameArgs(
84 BeginFrameArgs::CreationLocation location) {
85 return CreateBeginFrameArgsForTesting(location, source_id(),
86 next_begin_frame_number_++);
87 }
88
TestOnBeginFrame(const BeginFrameArgs & args)89 void FakeExternalBeginFrameSource::TestOnBeginFrame(
90 const BeginFrameArgs& args) {
91 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
92 current_args_ = args;
93 std::set<BeginFrameObserver*> observers(observers_);
94 for (auto* obs : observers)
95 obs->OnBeginFrame(current_args_);
96 if (tick_automatically_)
97 PostTestOnBeginFrame();
98 }
99
PostTestOnBeginFrame()100 void FakeExternalBeginFrameSource::PostTestOnBeginFrame() {
101 begin_frame_task_.Reset(
102 base::BindOnce(&FakeExternalBeginFrameSource::TestOnBeginFrame,
103 weak_ptr_factory_.GetWeakPtr(),
104 CreateBeginFrameArgs(BEGINFRAME_FROM_HERE)));
105 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
106 FROM_HERE, begin_frame_task_.callback(),
107 base::TimeDelta::FromMilliseconds(milliseconds_per_frame_));
108 next_begin_frame_number_++;
109 }
110
111 } // namespace viz
112