Index: Source/platform/scroll/ScrollbarStateTransitionAnimatorTest.cpp |
diff --git a/Source/platform/scroll/ScrollbarStateTransitionAnimatorTest.cpp b/Source/platform/scroll/ScrollbarStateTransitionAnimatorTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1abe3fa1492e21a1a5b3cacb74a0b4490c55f99e |
--- /dev/null |
+++ b/Source/platform/scroll/ScrollbarStateTransitionAnimatorTest.cpp |
@@ -0,0 +1,174 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "config.h" |
+ |
+#include "platform/scroll/ScrollbarStateTransitionAnimator.h" |
+ |
+#include "platform/HostWindow.h" |
+#include "platform/Logging.h" |
+#include "platform/geometry/FloatPoint.h" |
+#include "platform/geometry/IntRect.h" |
+#include "platform/scroll/ScrollableArea.h" |
+#include "platform/scroll/ScrollbarThemeOverlayMock.h" |
+#include "public/platform/WebScreenInfo.h" |
+#include <gmock/gmock.h> |
+#include <gtest/gtest.h> |
+ |
+using testing::AtLeast; |
+using testing::Return; |
+using testing::_; |
+ |
+namespace blink { |
+ |
+class MockScrollbarStateTransitionAnimator : public ScrollbarStateTransitionAnimator { |
+public: |
+ MockScrollbarStateTransitionAnimator(ScrollableArea* scrollableArea) |
+ : ScrollbarStateTransitionAnimator(scrollableArea) |
+ { |
+ } |
+ |
+ void reset() |
+ { |
+ m_data.reset(); |
+ m_mockCurrentTime = 0; |
+ stopAnimationTimerIfNeeded(); |
+ } |
+ |
+ void setCurrentTime(double time) |
+ { |
+ m_mockCurrentTime = time; |
+ } |
+ virtual double currentTime() const OVERRIDE |
+ { |
+ return m_mockCurrentTime; |
+ } |
+ |
+private: |
+ double m_mockCurrentTime; |
+}; |
+ |
+class MockHostWindow : public HostWindow { |
+public: |
+ MOCK_METHOD1(invalidateContentsAndRootView, void(const IntRect&)); |
+ MOCK_METHOD1(invalidateContentsForSlowScroll, void(const IntRect&)); |
+ MOCK_CONST_METHOD1(rootViewToScreen, IntRect(const IntRect&)); |
+ MOCK_CONST_METHOD0(screenInfo, WebScreenInfo()); |
+ MOCK_METHOD0(scheduleAnimation, void()); |
+}; |
+ |
+class MockScrollableAreaForAnimator : public ScrollableArea { |
+public: |
+ MockScrollableAreaForAnimator(bool enabled) |
+ : m_scrollbarAnimatorEnabled(enabled) |
+ { |
+ } |
+ |
+ virtual bool hasOverlayScrollbars() const OVERRIDE |
+ { |
+ return m_scrollbarAnimatorEnabled; |
+ } |
+ |
+ virtual HostWindow* hostWindow() const OVERRIDE |
+ { |
+ return m_hostWindow; |
+ } |
+ |
+ MOCK_CONST_METHOD0(isActive, bool()); |
+ MOCK_CONST_METHOD1(scrollSize, int(ScrollbarOrientation)); |
+ MOCK_METHOD2(invalidateScrollbar, void(Scrollbar*, const IntRect&)); |
+ MOCK_CONST_METHOD0(isScrollCornerVisible, bool()); |
+ MOCK_CONST_METHOD0(scrollCornerRect, IntRect()); |
+ MOCK_METHOD1(setScrollOffset, void(const IntPoint&)); |
+ MOCK_METHOD2(invalidateScrollbarRect, void(Scrollbar*, const IntRect&)); |
+ MOCK_METHOD1(invalidateScrollCornerRect, void(const IntRect&)); |
+ MOCK_METHOD1(setScrollOffsetFromAnimation, void(const IntPoint&)); |
+ MOCK_CONST_METHOD0(enclosingScrollableArea, ScrollableArea*()); |
+ MOCK_CONST_METHOD0(minimumScrollPosition, IntPoint()); |
+ MOCK_CONST_METHOD0(maximumScrollPosition, IntPoint()); |
+ MOCK_CONST_METHOD1(visibleContentRect, IntRect(IncludeScrollbarsInRect)); |
+ MOCK_CONST_METHOD0(contentsSize, IntSize()); |
+ MOCK_CONST_METHOD0(overhangAmount, IntSize()); |
+ MOCK_CONST_METHOD0(scrollbarsCanBeActive, bool()); |
+ MOCK_CONST_METHOD0(scrollableAreaBoundingBox, IntRect()); |
+ MOCK_CONST_METHOD0(scrollPosition, IntPoint()); |
+ MOCK_CONST_METHOD0(shouldPlaceVerticalScrollbarOnLeft, bool()); |
+ MOCK_CONST_METHOD1(userInputScrollable, bool(ScrollbarOrientation)); |
+ MOCK_CONST_METHOD0(visibleHeight, int()); |
+ MOCK_CONST_METHOD0(visibleWidth, int()); |
+ |
+private: |
+ MockHostWindow* m_hostWindow; |
+ bool m_scrollbarAnimatorEnabled; |
+}; |
+ |
+TEST(ScrollbarStateTransitionAnimatorEnabled, Enabled) |
+{ |
+ MockScrollableAreaForAnimator scrollableArea(true); |
+ MockScrollbarStateTransitionAnimator scrollbarAnimator(&scrollableArea); |
+ |
+ scrollbarAnimator.reset(); |
+ scrollbarAnimator.setCurrentTime(1.0); |
+ scrollbarAnimator.mouseEnteredScrollbar(0); |
+ scrollbarAnimator.setCurrentTime(1.1); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_TRUE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ EXPECT_NE(0.f, scrollbarAnimator.stateTransitionProgress()); |
+ EXPECT_EQ(blink::WebThemeEngine::StateNormal, scrollbarAnimator.stateTransitionStartState()); |
+ EXPECT_EQ(blink::WebThemeEngine::StateHover, scrollbarAnimator.stateTransitionEndState()); |
+ scrollbarAnimator.setCurrentTime(2.0); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ scrollbarAnimator.reset(); |
+ scrollbarAnimator.setCurrentTime(1.0); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ scrollbarAnimator.mouseExitedScrollbar(0); |
+ scrollbarAnimator.setCurrentTime(1.1); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_TRUE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ EXPECT_NE(0.f, scrollbarAnimator.stateTransitionProgress()); |
+ EXPECT_EQ(blink::WebThemeEngine::StateHover, scrollbarAnimator.stateTransitionStartState()); |
+ EXPECT_EQ(blink::WebThemeEngine::StateNormal, scrollbarAnimator.stateTransitionEndState()); |
+ scrollbarAnimator.setCurrentTime(2.0); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ scrollbarAnimator.reset(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+} |
+ |
+TEST(ScrollbarStateTransitionAnimatorEnabled, Disabled) |
+{ |
+ MockScrollableAreaForAnimator scrollableArea(false); |
+ MockScrollbarStateTransitionAnimator scrollbarAnimator(&scrollableArea); |
+ |
+ scrollbarAnimator.reset(); |
+ scrollbarAnimator.setCurrentTime(1.0); |
+ scrollbarAnimator.mouseEnteredScrollbar(0); |
+ scrollbarAnimator.setCurrentTime(1.1); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ EXPECT_EQ(0.f, scrollbarAnimator.stateTransitionProgress()); |
+ EXPECT_NE(blink::WebThemeEngine::StateNormal, scrollbarAnimator.stateTransitionStartState()); |
+ EXPECT_NE(blink::WebThemeEngine::StateHover, scrollbarAnimator.stateTransitionEndState()); |
+ scrollbarAnimator.setCurrentTime(2.0); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ scrollbarAnimator.reset(); |
+ scrollbarAnimator.setCurrentTime(1.0); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ scrollbarAnimator.mouseExitedScrollbar(0); |
+ scrollbarAnimator.setCurrentTime(1.1); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ EXPECT_EQ(0.f, scrollbarAnimator.stateTransitionProgress()); |
+ EXPECT_NE(blink::WebThemeEngine::StateHover, scrollbarAnimator.stateTransitionStartState()); |
+ EXPECT_NE(blink::WebThemeEngine::StateNormal, scrollbarAnimator.stateTransitionEndState()); |
+ scrollbarAnimator.setCurrentTime(2.0); |
+ scrollbarAnimator.serviceAnimations(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+ scrollbarAnimator.reset(); |
+ EXPECT_FALSE(scrollbarAnimator.isDuringStateTransitionAnimation()); |
+} |
+ |
+} // namespace blink |