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
3 // found in the LICENSE file.
4 
5 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLLBAR_TEST_SUITE_H_
6 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLLBAR_TEST_SUITE_H_
7 
8 #include <memory>
9 #include "base/single_thread_task_runner.h"
10 #include "testing/gmock/include/gmock/gmock.h"
11 #include "third_party/blink/public/platform/platform.h"
12 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
13 #include "third_party/blink/renderer/core/loader/empty_clients.h"
14 #include "third_party/blink/renderer/core/scroll/scrollable_area.h"
15 #include "third_party/blink/renderer/core/scroll/scrollbar.h"
16 #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h"
17 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
18 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
19 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
20 
21 namespace blink {
22 
23 class MockPlatformChromeClient : public EmptyChromeClient {
24  public:
MockPlatformChromeClient()25   MockPlatformChromeClient() : is_popup_(false) {}
26 
IsPopup()27   bool IsPopup() override { return is_popup_; }
28 
SetIsPopup(bool is_popup)29   void SetIsPopup(bool is_popup) { is_popup_ = is_popup; }
30 
WindowToViewportScalar(LocalFrame *,const float)31   float WindowToViewportScalar(LocalFrame*, const float) const override {
32     return 0;
33   }
34 
35  private:
36   bool is_popup_;
37 };
38 
39 class MockScrollableArea : public GarbageCollected<MockScrollableArea>,
40                            public ScrollableArea {
41  public:
Create()42   static MockScrollableArea* Create() {
43     return MakeGarbageCollected<MockScrollableArea>();
44   }
45 
Create(const ScrollOffset & maximum_scroll_offset)46   static MockScrollableArea* Create(const ScrollOffset& maximum_scroll_offset) {
47     MockScrollableArea* mock = Create();
48     mock->SetMaximumScrollOffset(maximum_scroll_offset);
49     return mock;
50   }
51 
MockScrollableArea()52   explicit MockScrollableArea()
53       : maximum_scroll_offset_(ScrollOffset(0, 100)),
54         chrome_client_(MakeGarbageCollected<MockPlatformChromeClient>()) {}
MockScrollableArea(const ScrollOffset & offset)55   explicit MockScrollableArea(const ScrollOffset& offset)
56       : maximum_scroll_offset_(offset),
57         chrome_client_(MakeGarbageCollected<MockPlatformChromeClient>()) {}
58 
59   MOCK_CONST_METHOD0(VisualRectForScrollbarParts, LayoutRect());
60   MOCK_CONST_METHOD0(IsActive, bool());
61   MOCK_CONST_METHOD0(IsThrottled, bool());
62   MOCK_CONST_METHOD1(ScrollSize, int(ScrollbarOrientation));
63   MOCK_CONST_METHOD0(IsScrollCornerVisible, bool());
64   MOCK_CONST_METHOD0(ScrollCornerRect, IntRect());
65   MOCK_CONST_METHOD0(EnclosingScrollableArea, ScrollableArea*());
66   MOCK_CONST_METHOD1(VisibleContentRect, IntRect(IncludeScrollbarsInRect));
67   MOCK_CONST_METHOD0(ContentsSize, IntSize());
68   MOCK_CONST_METHOD0(LayerForHorizontalScrollbar, cc::Layer*());
69   MOCK_CONST_METHOD0(LayerForVerticalScrollbar, cc::Layer*());
70   MOCK_CONST_METHOD0(HorizontalScrollbar, Scrollbar*());
71   MOCK_CONST_METHOD0(VerticalScrollbar, Scrollbar*());
72   MOCK_CONST_METHOD0(ScrollbarsHiddenIfOverlay, bool());
73   MOCK_METHOD0(ScheduleAnimation, bool());
74   MOCK_CONST_METHOD0(UsedColorScheme, mojom::blink::ColorScheme());
75 
UserInputScrollable(ScrollbarOrientation)76   bool UserInputScrollable(ScrollbarOrientation) const override { return true; }
ScrollbarsCanBeActive()77   bool ScrollbarsCanBeActive() const override { return true; }
ShouldPlaceVerticalScrollbarOnLeft()78   bool ShouldPlaceVerticalScrollbarOnLeft() const override { return false; }
UpdateScrollOffset(const ScrollOffset & offset,mojom::blink::ScrollType)79   void UpdateScrollOffset(const ScrollOffset& offset,
80                           mojom::blink::ScrollType) override {
81     scroll_offset_ = offset.ShrunkTo(maximum_scroll_offset_);
82   }
ScrollOffsetInt()83   IntSize ScrollOffsetInt() const override {
84     return FlooredIntSize(scroll_offset_);
85   }
MinimumScrollOffsetInt()86   IntSize MinimumScrollOffsetInt() const override { return IntSize(); }
MaximumScrollOffsetInt()87   IntSize MaximumScrollOffsetInt() const override {
88     return ExpandedIntSize(maximum_scroll_offset_);
89   }
VisibleHeight()90   int VisibleHeight() const override { return 768; }
VisibleWidth()91   int VisibleWidth() const override { return 1024; }
GetScrollElementId()92   CompositorElementId GetScrollElementId() const override {
93     return CompositorElementId();
94   }
ScrollAnimatorEnabled()95   bool ScrollAnimatorEnabled() const override { return true; }
PageStep(ScrollbarOrientation)96   int PageStep(ScrollbarOrientation) const override { return 0; }
ScrollControlWasSetNeedsPaintInvalidation()97   void ScrollControlWasSetNeedsPaintInvalidation() override {}
ConvertFromRootFrame(const IntPoint & point_in_root_frame)98   IntPoint ConvertFromRootFrame(const IntPoint& point_in_root_frame) const {
99     return point_in_root_frame;
100   }
ConvertFromContainingEmbeddedContentViewToScrollbar(const Scrollbar & scrollbar,const IntPoint & parent_point)101   IntPoint ConvertFromContainingEmbeddedContentViewToScrollbar(
102       const Scrollbar& scrollbar,
103       const IntPoint& parent_point) const {
104     return parent_point;
105   }
106 
GetTimerTaskRunner()107   scoped_refptr<base::SingleThreadTaskRunner> GetTimerTaskRunner() const final {
108     return blink::scheduler::GetSingleThreadTaskRunnerForTesting();
109   }
110 
GetChromeClient()111   ChromeClient* GetChromeClient() const override {
112     return chrome_client_.Get();
113   }
114 
SetIsPopup()115   void SetIsPopup() { chrome_client_->SetIsPopup(true); }
116 
GetPageScrollbarTheme()117   ScrollbarTheme& GetPageScrollbarTheme() const override {
118     return ScrollbarTheme::GetTheme();
119   }
120 
121   using ScrollableArea::ClearNeedsPaintInvalidationForScrollControls;
122   using ScrollableArea::HorizontalScrollbarNeedsPaintInvalidation;
123   using ScrollableArea::ShowNonMacOverlayScrollbars;
124   using ScrollableArea::VerticalScrollbarNeedsPaintInvalidation;
125 
Trace(Visitor * visitor)126   void Trace(Visitor* visitor) const override {
127     visitor->Trace(chrome_client_);
128     ScrollableArea::Trace(visitor);
129   }
130 
131  protected:
SetMaximumScrollOffset(const ScrollOffset & maximum_scroll_offset)132   void SetMaximumScrollOffset(const ScrollOffset& maximum_scroll_offset) {
133     maximum_scroll_offset_ = maximum_scroll_offset;
134   }
135 
136  private:
137   ScrollOffset scroll_offset_;
138   ScrollOffset maximum_scroll_offset_;
139   Member<MockPlatformChromeClient> chrome_client_;
140 };
141 
142 }  // namespace blink
143 
144 #endif
145