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 #ifndef COMPONENTS_VIZ_TEST_FAKE_EXTERNAL_BEGIN_FRAME_SOURCE_H_
6 #define COMPONENTS_VIZ_TEST_FAKE_EXTERNAL_BEGIN_FRAME_SOURCE_H_
7 
8 #include <set>
9 
10 #include "base/cancelable_callback.h"
11 #include "base/memory/weak_ptr.h"
12 #include "base/sequence_checker.h"
13 #include "components/viz/common/frame_sinks/begin_frame_args.h"
14 #include "components/viz/common/frame_sinks/begin_frame_source.h"
15 
16 namespace base {
17 class TickClock;
18 }  // namespace base
19 
20 namespace viz {
21 
22 class FakeExternalBeginFrameSource : public BeginFrameSource {
23  public:
24   class Client {
25    public:
26     virtual void OnAddObserver(BeginFrameObserver* obs) = 0;
27     virtual void OnRemoveObserver(BeginFrameObserver* obs) = 0;
28   };
29 
30   explicit FakeExternalBeginFrameSource(double refresh_rate,
31                                         bool tick_automatically);
32   ~FakeExternalBeginFrameSource() override;
33 
SetClient(Client * client)34   void SetClient(Client* client) { client_ = client; }
35   void SetPaused(bool paused);
36 
37   // BeginFrameSource implementation.
38   void AddObserver(BeginFrameObserver* obs) override;
39   void RemoveObserver(BeginFrameObserver* obs) override;
40   void DidFinishFrame(BeginFrameObserver* obs) override;
41   bool IsThrottled() const override;
OnGpuNoLongerBusy()42   void OnGpuNoLongerBusy() override {}
43 
44   BeginFrameArgs CreateBeginFrameArgs(
45       BeginFrameArgs::CreationLocation location);
46   BeginFrameArgs CreateBeginFrameArgs(BeginFrameArgs::CreationLocation location,
47                                       const base::TickClock* now_src);
next_begin_frame_number()48   uint64_t next_begin_frame_number() const { return next_begin_frame_number_; }
49 
50   void TestOnBeginFrame(const BeginFrameArgs& args);
51 
num_observers()52   size_t num_observers() const { return observers_.size(); }
53 
54   using BeginFrameSource::RequestCallbackOnGpuAvailable;
55 
56  private:
57   void PostTestOnBeginFrame();
58 
59   const bool tick_automatically_;
60   const double milliseconds_per_frame_;
61   Client* client_ = nullptr;
62   bool paused_ = false;
63   BeginFrameArgs current_args_;
64   uint64_t next_begin_frame_number_ = BeginFrameArgs::kStartingFrameNumber;
65   std::set<BeginFrameObserver*> observers_;
66   base::CancelableOnceClosure begin_frame_task_;
67 
68   SEQUENCE_CHECKER(sequence_checker_);
69 
70   base::WeakPtrFactory<FakeExternalBeginFrameSource> weak_ptr_factory_{this};
71 };
72 
73 }  // namespace viz
74 
75 #endif  // COMPONENTS_VIZ_TEST_FAKE_EXTERNAL_BEGIN_FRAME_SOURCE_H_
76