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