OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/scroll/ScrollableArea.h" | 5 #include "platform/scroll/ScrollableArea.h" |
6 | 6 |
7 #include "platform/graphics/Color.h" | 7 #include "platform/graphics/Color.h" |
8 #include "platform/graphics/GraphicsLayer.h" | 8 #include "platform/graphics/GraphicsLayer.h" |
9 #include "platform/scroll/ScrollbarTheme.h" | 9 #include "platform/scroll/ScrollbarTheme.h" |
10 #include "platform/scroll/ScrollbarThemeMock.h" | 10 #include "platform/scroll/ScrollbarThemeMock.h" |
11 #include "platform/testing/FakeGraphicsLayer.h" | 11 #include "platform/testing/FakeGraphicsLayer.h" |
12 #include "platform/testing/TestingPlatformSupport.h" | 12 #include "platform/testing/TestingPlatformSupport.h" |
13 #include "public/platform/Platform.h" | 13 #include "public/platform/Platform.h" |
14 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 namespace blink { | 17 namespace blink { |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 using testing::_; | 21 using testing::_; |
22 using testing::Return; | 22 using testing::Return; |
23 | 23 |
24 class MockScrollableArea : public GarbageCollectedFinalized<MockScrollableArea>,
public ScrollableArea { | 24 class MockScrollableArea : public GarbageCollectedFinalized<MockScrollableArea>,
public ScrollableArea { |
25 USING_GARBAGE_COLLECTED_MIXIN(MockScrollableArea); | 25 USING_GARBAGE_COLLECTED_MIXIN(MockScrollableArea); |
26 public: | 26 public: |
27 static RawPtr<MockScrollableArea> create(const IntPoint& maximumScrollPositi
on) | 27 static MockScrollableArea* create(const IntPoint& maximumScrollPosition) |
28 { | 28 { |
29 return new MockScrollableArea(maximumScrollPosition); | 29 return new MockScrollableArea(maximumScrollPosition); |
30 } | 30 } |
31 | 31 |
32 MOCK_CONST_METHOD0(visualRectForScrollbarParts, LayoutRect()); | 32 MOCK_CONST_METHOD0(visualRectForScrollbarParts, LayoutRect()); |
33 MOCK_CONST_METHOD0(isActive, bool()); | 33 MOCK_CONST_METHOD0(isActive, bool()); |
34 MOCK_CONST_METHOD1(scrollSize, int(ScrollbarOrientation)); | 34 MOCK_CONST_METHOD1(scrollSize, int(ScrollbarOrientation)); |
35 MOCK_CONST_METHOD0(isScrollCornerVisible, bool()); | 35 MOCK_CONST_METHOD0(isScrollCornerVisible, bool()); |
36 MOCK_CONST_METHOD0(scrollCornerRect, IntRect()); | 36 MOCK_CONST_METHOD0(scrollCornerRect, IntRect()); |
37 MOCK_CONST_METHOD0(horizontalScrollbar, Scrollbar*()); | 37 MOCK_CONST_METHOD0(horizontalScrollbar, Scrollbar*()); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 { | 90 { |
91 m_fakePlatform = nullptr; | 91 m_fakePlatform = nullptr; |
92 } | 92 } |
93 | 93 |
94 private: | 94 private: |
95 OwnPtr<TestingPlatformSupportWithMockScheduler> m_fakePlatform; | 95 OwnPtr<TestingPlatformSupportWithMockScheduler> m_fakePlatform; |
96 }; | 96 }; |
97 | 97 |
98 TEST_F(ScrollableAreaTest, ScrollAnimatorCurrentPositionShouldBeSync) | 98 TEST_F(ScrollableAreaTest, ScrollAnimatorCurrentPositionShouldBeSync) |
99 { | 99 { |
100 RawPtr<MockScrollableArea> scrollableArea = MockScrollableArea::create(IntPo
int(0, 100)); | 100 MockScrollableArea* scrollableArea = MockScrollableArea::create(IntPoint(0,
100)); |
101 scrollableArea->setScrollPosition(IntPoint(0, 10000), CompositorScroll); | 101 scrollableArea->setScrollPosition(IntPoint(0, 10000), CompositorScroll); |
102 EXPECT_EQ(100.0, scrollableArea->scrollAnimator().currentPosition().y()); | 102 EXPECT_EQ(100.0, scrollableArea->scrollAnimator().currentPosition().y()); |
103 } | 103 } |
104 | 104 |
105 namespace { | 105 namespace { |
106 | 106 |
107 class ScrollbarThemeWithMockInvalidation : public ScrollbarThemeMock { | 107 class ScrollbarThemeWithMockInvalidation : public ScrollbarThemeMock { |
108 public: | 108 public: |
109 MOCK_CONST_METHOD0(shouldRepaintAllPartsOnInvalidation, bool()); | 109 MOCK_CONST_METHOD0(shouldRepaintAllPartsOnInvalidation, bool()); |
110 MOCK_CONST_METHOD3(invalidateOnThumbPositionChange, ScrollbarPart(const Scro
llbarThemeClient&, float, float)); | 110 MOCK_CONST_METHOD3(invalidateOnThumbPositionChange, ScrollbarPart(const Scro
llbarThemeClient&, float, float)); |
111 }; | 111 }; |
112 | 112 |
113 } // namespace | 113 } // namespace |
114 | 114 |
115 TEST_F(ScrollableAreaTest, ScrollbarTrackAndThumbRepaint) | 115 TEST_F(ScrollableAreaTest, ScrollbarTrackAndThumbRepaint) |
116 { | 116 { |
117 ScrollbarThemeWithMockInvalidation theme; | 117 ScrollbarThemeWithMockInvalidation theme; |
118 RawPtr<MockScrollableArea> scrollableArea = MockScrollableArea::create(IntPo
int(0, 100)); | 118 MockScrollableArea* scrollableArea = MockScrollableArea::create(IntPoint(0,
100)); |
119 RawPtr<Scrollbar> scrollbar = Scrollbar::createForTesting(scrollableArea.get
(), HorizontalScrollbar, RegularScrollbar, &theme); | 119 Scrollbar* scrollbar = Scrollbar::createForTesting(scrollableArea, Horizonta
lScrollbar, RegularScrollbar, &theme); |
120 | 120 |
121 EXPECT_CALL(theme, shouldRepaintAllPartsOnInvalidation()).WillRepeatedly(Ret
urn(true)); | 121 EXPECT_CALL(theme, shouldRepaintAllPartsOnInvalidation()).WillRepeatedly(Ret
urn(true)); |
122 EXPECT_TRUE(scrollbar->trackNeedsRepaint()); | 122 EXPECT_TRUE(scrollbar->trackNeedsRepaint()); |
123 EXPECT_TRUE(scrollbar->thumbNeedsRepaint()); | 123 EXPECT_TRUE(scrollbar->thumbNeedsRepaint()); |
124 scrollbar->setNeedsPaintInvalidation(NoPart); | 124 scrollbar->setNeedsPaintInvalidation(NoPart); |
125 EXPECT_TRUE(scrollbar->trackNeedsRepaint()); | 125 EXPECT_TRUE(scrollbar->trackNeedsRepaint()); |
126 EXPECT_TRUE(scrollbar->thumbNeedsRepaint()); | 126 EXPECT_TRUE(scrollbar->thumbNeedsRepaint()); |
127 | 127 |
128 scrollbar->clearTrackNeedsRepaint(); | 128 scrollbar->clearTrackNeedsRepaint(); |
129 scrollbar->clearThumbNeedsRepaint(); | 129 scrollbar->clearThumbNeedsRepaint(); |
(...skipping 23 matching lines...) Expand all Loading... |
153 bool needsRepaint(const GraphicsLayer&) const { return true; } | 153 bool needsRepaint(const GraphicsLayer&) const { return true; } |
154 IntRect computeInterestRect(const GraphicsLayer*, const IntRect&) const { re
turn IntRect(); } | 154 IntRect computeInterestRect(const GraphicsLayer*, const IntRect&) const { re
turn IntRect(); } |
155 void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPain
tingPhase, const IntRect&) const override { } | 155 void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPain
tingPhase, const IntRect&) const override { } |
156 String debugName(const GraphicsLayer*) const override { return String(); } | 156 String debugName(const GraphicsLayer*) const override { return String(); } |
157 bool isTrackingPaintInvalidations() const override { return true; } | 157 bool isTrackingPaintInvalidations() const override { return true; } |
158 }; | 158 }; |
159 | 159 |
160 TEST_F(ScrollableAreaTest, ScrollbarGraphicsLayerInvalidation) | 160 TEST_F(ScrollableAreaTest, ScrollbarGraphicsLayerInvalidation) |
161 { | 161 { |
162 ScrollbarTheme::setMockScrollbarsEnabled(true); | 162 ScrollbarTheme::setMockScrollbarsEnabled(true); |
163 RawPtr<MockScrollableArea> scrollableArea = MockScrollableArea::create(IntPo
int(0, 100)); | 163 MockScrollableArea* scrollableArea = MockScrollableArea::create(IntPoint(0,
100)); |
164 MockGraphicsLayerClient graphicsLayerClient; | 164 MockGraphicsLayerClient graphicsLayerClient; |
165 FakeGraphicsLayer graphicsLayer(&graphicsLayerClient); | 165 FakeGraphicsLayer graphicsLayer(&graphicsLayerClient); |
166 graphicsLayer.setDrawsContent(true); | 166 graphicsLayer.setDrawsContent(true); |
167 graphicsLayer.setSize(FloatSize(111, 222)); | 167 graphicsLayer.setSize(FloatSize(111, 222)); |
168 | 168 |
169 EXPECT_CALL(*scrollableArea, layerForHorizontalScrollbar()).WillRepeatedly(R
eturn(&graphicsLayer)); | 169 EXPECT_CALL(*scrollableArea, layerForHorizontalScrollbar()).WillRepeatedly(R
eturn(&graphicsLayer)); |
170 | 170 |
171 RawPtr<Scrollbar> scrollbar = Scrollbar::create(scrollableArea.get(), Horizo
ntalScrollbar, RegularScrollbar, nullptr); | 171 Scrollbar* scrollbar = Scrollbar::create(scrollableArea, HorizontalScrollbar
, RegularScrollbar, nullptr); |
172 graphicsLayer.resetTrackedPaintInvalidations(); | 172 graphicsLayer.resetTrackedPaintInvalidations(); |
173 scrollbar->setNeedsPaintInvalidation(NoPart); | 173 scrollbar->setNeedsPaintInvalidation(NoPart); |
174 EXPECT_TRUE(graphicsLayer.hasTrackedPaintInvalidations()); | 174 EXPECT_TRUE(graphicsLayer.hasTrackedPaintInvalidations()); |
175 | 175 |
176 // Forced GC in order to finalize objects depending on the mock object. | 176 // Forced GC in order to finalize objects depending on the mock object. |
177 Heap::collectAllGarbage(); | 177 Heap::collectAllGarbage(); |
178 } | 178 } |
179 | 179 |
180 TEST_F(ScrollableAreaTest, InvalidatesNonCompositedScrollbarsWhenThumbMoves) | 180 TEST_F(ScrollableAreaTest, InvalidatesNonCompositedScrollbarsWhenThumbMoves) |
181 { | 181 { |
182 ScrollbarThemeWithMockInvalidation theme; | 182 ScrollbarThemeWithMockInvalidation theme; |
183 RawPtr<MockScrollableArea> scrollableArea = MockScrollableArea::create(IntPo
int(100, 100)); | 183 MockScrollableArea* scrollableArea = MockScrollableArea::create(IntPoint(100
, 100)); |
184 RawPtr<Scrollbar> horizontalScrollbar = Scrollbar::createForTesting(scrollab
leArea.get(), HorizontalScrollbar, RegularScrollbar, &theme); | 184 Scrollbar* horizontalScrollbar = Scrollbar::createForTesting(scrollableArea,
HorizontalScrollbar, RegularScrollbar, &theme); |
185 RawPtr<Scrollbar> verticalScrollbar = Scrollbar::createForTesting(scrollable
Area.get(), VerticalScrollbar, RegularScrollbar, &theme); | 185 Scrollbar* verticalScrollbar = Scrollbar::createForTesting(scrollableArea, V
erticalScrollbar, RegularScrollbar, &theme); |
186 EXPECT_CALL(*scrollableArea, horizontalScrollbar()).WillRepeatedly(Return(ho
rizontalScrollbar.get())); | 186 EXPECT_CALL(*scrollableArea, horizontalScrollbar()).WillRepeatedly(Return(ho
rizontalScrollbar)); |
187 EXPECT_CALL(*scrollableArea, verticalScrollbar()).WillRepeatedly(Return(vert
icalScrollbar.get())); | 187 EXPECT_CALL(*scrollableArea, verticalScrollbar()).WillRepeatedly(Return(vert
icalScrollbar)); |
188 | 188 |
189 // Regardless of whether the theme invalidates any parts, non-composited | 189 // Regardless of whether the theme invalidates any parts, non-composited |
190 // scrollbars have to be repainted if the thumb moves. | 190 // scrollbars have to be repainted if the thumb moves. |
191 EXPECT_CALL(*scrollableArea, layerForHorizontalScrollbar()).WillRepeatedly(R
eturn(nullptr)); | 191 EXPECT_CALL(*scrollableArea, layerForHorizontalScrollbar()).WillRepeatedly(R
eturn(nullptr)); |
192 EXPECT_CALL(*scrollableArea, layerForVerticalScrollbar()).WillRepeatedly(Ret
urn(nullptr)); | 192 EXPECT_CALL(*scrollableArea, layerForVerticalScrollbar()).WillRepeatedly(Ret
urn(nullptr)); |
193 ASSERT_FALSE(scrollableArea->hasLayerForVerticalScrollbar()); | 193 ASSERT_FALSE(scrollableArea->hasLayerForVerticalScrollbar()); |
194 ASSERT_FALSE(scrollableArea->hasLayerForHorizontalScrollbar()); | 194 ASSERT_FALSE(scrollableArea->hasLayerForHorizontalScrollbar()); |
195 EXPECT_CALL(theme, shouldRepaintAllPartsOnInvalidation()).WillRepeatedly(Ret
urn(false)); | 195 EXPECT_CALL(theme, shouldRepaintAllPartsOnInvalidation()).WillRepeatedly(Ret
urn(false)); |
196 EXPECT_CALL(theme, invalidateOnThumbPositionChange(_, _, _)).WillRepeatedly(
Return(NoPart)); | 196 EXPECT_CALL(theme, invalidateOnThumbPositionChange(_, _, _)).WillRepeatedly(
Return(NoPart)); |
197 | 197 |
198 // A scroll in each direction should only invalidate one scrollbar. | 198 // A scroll in each direction should only invalidate one scrollbar. |
199 scrollableArea->setScrollPosition(DoublePoint(0, 50), ProgrammaticScroll); | 199 scrollableArea->setScrollPosition(DoublePoint(0, 50), ProgrammaticScroll); |
200 EXPECT_FALSE(scrollableArea->horizontalScrollbarNeedsPaintInvalidation()); | 200 EXPECT_FALSE(scrollableArea->horizontalScrollbarNeedsPaintInvalidation()); |
201 EXPECT_TRUE(scrollableArea->verticalScrollbarNeedsPaintInvalidation()); | 201 EXPECT_TRUE(scrollableArea->verticalScrollbarNeedsPaintInvalidation()); |
202 scrollableArea->clearNeedsPaintInvalidationForScrollControls(); | 202 scrollableArea->clearNeedsPaintInvalidationForScrollControls(); |
203 scrollableArea->setScrollPosition(DoublePoint(50, 50), ProgrammaticScroll); | 203 scrollableArea->setScrollPosition(DoublePoint(50, 50), ProgrammaticScroll); |
204 EXPECT_TRUE(scrollableArea->horizontalScrollbarNeedsPaintInvalidation()); | 204 EXPECT_TRUE(scrollableArea->horizontalScrollbarNeedsPaintInvalidation()); |
205 EXPECT_FALSE(scrollableArea->verticalScrollbarNeedsPaintInvalidation()); | 205 EXPECT_FALSE(scrollableArea->verticalScrollbarNeedsPaintInvalidation()); |
206 scrollableArea->clearNeedsPaintInvalidationForScrollControls(); | 206 scrollableArea->clearNeedsPaintInvalidationForScrollControls(); |
207 | 207 |
208 // Forced GC in order to finalize objects depending on the mock object. | 208 // Forced GC in order to finalize objects depending on the mock object. |
209 Heap::collectAllGarbage(); | 209 Heap::collectAllGarbage(); |
210 } | 210 } |
211 | 211 |
212 TEST_F(ScrollableAreaTest, InvalidatesCompositedScrollbarsIfPartsNeedRepaint) | 212 TEST_F(ScrollableAreaTest, InvalidatesCompositedScrollbarsIfPartsNeedRepaint) |
213 { | 213 { |
214 ScrollbarThemeWithMockInvalidation theme; | 214 ScrollbarThemeWithMockInvalidation theme; |
215 RawPtr<MockScrollableArea> scrollableArea = MockScrollableArea::create(IntPo
int(100, 100)); | 215 MockScrollableArea* scrollableArea = MockScrollableArea::create(IntPoint(100
, 100)); |
216 RawPtr<Scrollbar> horizontalScrollbar = Scrollbar::createForTesting(scrollab
leArea.get(), HorizontalScrollbar, RegularScrollbar, &theme); | 216 Scrollbar* horizontalScrollbar = Scrollbar::createForTesting(scrollableArea,
HorizontalScrollbar, RegularScrollbar, &theme); |
217 horizontalScrollbar->clearTrackNeedsRepaint(); | 217 horizontalScrollbar->clearTrackNeedsRepaint(); |
218 horizontalScrollbar->clearThumbNeedsRepaint(); | 218 horizontalScrollbar->clearThumbNeedsRepaint(); |
219 RawPtr<Scrollbar> verticalScrollbar = Scrollbar::createForTesting(scrollable
Area.get(), VerticalScrollbar, RegularScrollbar, &theme); | 219 Scrollbar* verticalScrollbar = Scrollbar::createForTesting(scrollableArea, V
erticalScrollbar, RegularScrollbar, &theme); |
220 verticalScrollbar->clearTrackNeedsRepaint(); | 220 verticalScrollbar->clearTrackNeedsRepaint(); |
221 verticalScrollbar->clearThumbNeedsRepaint(); | 221 verticalScrollbar->clearThumbNeedsRepaint(); |
222 EXPECT_CALL(*scrollableArea, horizontalScrollbar()).WillRepeatedly(Return(ho
rizontalScrollbar.get())); | 222 EXPECT_CALL(*scrollableArea, horizontalScrollbar()).WillRepeatedly(Return(ho
rizontalScrollbar)); |
223 EXPECT_CALL(*scrollableArea, verticalScrollbar()).WillRepeatedly(Return(vert
icalScrollbar.get())); | 223 EXPECT_CALL(*scrollableArea, verticalScrollbar()).WillRepeatedly(Return(vert
icalScrollbar)); |
224 | 224 |
225 // Composited scrollbars only need repainting when parts become invalid | 225 // Composited scrollbars only need repainting when parts become invalid |
226 // (e.g. if the track changes appearance when the thumb reaches the end). | 226 // (e.g. if the track changes appearance when the thumb reaches the end). |
227 MockGraphicsLayerClient graphicsLayerClient; | 227 MockGraphicsLayerClient graphicsLayerClient; |
228 FakeGraphicsLayer layerForHorizontalScrollbar(&graphicsLayerClient); | 228 FakeGraphicsLayer layerForHorizontalScrollbar(&graphicsLayerClient); |
229 layerForHorizontalScrollbar.setDrawsContent(true); | 229 layerForHorizontalScrollbar.setDrawsContent(true); |
230 layerForHorizontalScrollbar.setSize(FloatSize(10, 10)); | 230 layerForHorizontalScrollbar.setSize(FloatSize(10, 10)); |
231 FakeGraphicsLayer layerForVerticalScrollbar(&graphicsLayerClient); | 231 FakeGraphicsLayer layerForVerticalScrollbar(&graphicsLayerClient); |
232 layerForVerticalScrollbar.setDrawsContent(true); | 232 layerForVerticalScrollbar.setDrawsContent(true); |
233 layerForVerticalScrollbar.setSize(FloatSize(10, 10)); | 233 layerForVerticalScrollbar.setSize(FloatSize(10, 10)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 EXPECT_FALSE(horizontalScrollbar->thumbNeedsRepaint()); | 270 EXPECT_FALSE(horizontalScrollbar->thumbNeedsRepaint()); |
271 EXPECT_FALSE(verticalScrollbar->trackNeedsRepaint()); | 271 EXPECT_FALSE(verticalScrollbar->trackNeedsRepaint()); |
272 EXPECT_FALSE(verticalScrollbar->thumbNeedsRepaint()); | 272 EXPECT_FALSE(verticalScrollbar->thumbNeedsRepaint()); |
273 | 273 |
274 // Forced GC in order to finalize objects depending on the mock object. | 274 // Forced GC in order to finalize objects depending on the mock object. |
275 Heap::collectAllGarbage(); | 275 Heap::collectAllGarbage(); |
276 } | 276 } |
277 | 277 |
278 TEST_F(ScrollableAreaTest, RecalculatesScrollbarOverlayIfBackgroundChanges) | 278 TEST_F(ScrollableAreaTest, RecalculatesScrollbarOverlayIfBackgroundChanges) |
279 { | 279 { |
280 RawPtr<MockScrollableArea> scrollableArea = MockScrollableArea::create(IntPo
int(0, 100)); | 280 MockScrollableArea* scrollableArea = MockScrollableArea::create(IntPoint(0,
100)); |
281 | 281 |
282 EXPECT_EQ(ScrollbarOverlayStyleDefault, scrollableArea->getScrollbarOverlayS
tyle()); | 282 EXPECT_EQ(ScrollbarOverlayStyleDefault, scrollableArea->getScrollbarOverlayS
tyle()); |
283 scrollableArea->recalculateScrollbarOverlayStyle(Color(34, 85, 51)); | 283 scrollableArea->recalculateScrollbarOverlayStyle(Color(34, 85, 51)); |
284 EXPECT_EQ(ScrollbarOverlayStyleLight, scrollableArea->getScrollbarOverlaySty
le()); | 284 EXPECT_EQ(ScrollbarOverlayStyleLight, scrollableArea->getScrollbarOverlaySty
le()); |
285 scrollableArea->recalculateScrollbarOverlayStyle(Color(236, 143, 185)); | 285 scrollableArea->recalculateScrollbarOverlayStyle(Color(236, 143, 185)); |
286 EXPECT_EQ(ScrollbarOverlayStyleDefault, scrollableArea->getScrollbarOverlayS
tyle()); | 286 EXPECT_EQ(ScrollbarOverlayStyleDefault, scrollableArea->getScrollbarOverlayS
tyle()); |
287 } | 287 } |
288 | 288 |
289 } // namespace blink | 289 } // namespace blink |
OLD | NEW |