scrollbar_animator_mac_unittest.cc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. // Copyright 2021 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. #include "ui/native_theme/scrollbar_animator_mac.h"
  5. #include "base/logging.h"
  6. #include "base/test/task_environment.h"
  7. #include "base/time/time.h"
  8. #include "testing/gmock/include/gmock/gmock.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. using testing::Return;
  11. namespace ui {
  12. namespace {
  13. constexpr int kExpandedWidth = 32;
  14. constexpr int kUnexpandedWidth = 16;
  15. constexpr auto kTimeToFadeOut = base::Milliseconds(500);
  16. constexpr auto kAnimationTime = base::Milliseconds(250);
  17. class MockClient : public OverlayScrollbarAnimatorMac::Client {
  18. public:
  19. MOCK_CONST_METHOD0(IsMouseInScrollbarFrameRect, bool());
  20. MOCK_METHOD1(SetHidden, void(bool));
  21. MOCK_METHOD0(SetThumbNeedsDisplay, void());
  22. MOCK_METHOD0(SetTrackNeedsDisplay, void());
  23. };
  24. class MacScrollbarAnimatorTest : public ::testing::Test {
  25. public:
  26. MacScrollbarAnimatorTest()
  27. : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
  28. scrollbar_ = std::make_unique<OverlayScrollbarAnimatorMac>(
  29. &client_, kExpandedWidth, kUnexpandedWidth,
  30. task_environment_.GetMainThreadTaskRunner());
  31. }
  32. ~MacScrollbarAnimatorTest() override = default;
  33. base::test::TaskEnvironment task_environment_;
  34. MockClient client_;
  35. std::unique_ptr<OverlayScrollbarAnimatorMac> scrollbar_;
  36. };
  37. TEST_F(MacScrollbarAnimatorTest, DidScrollThenFadeOut) {
  38. // The scrollbar_ starts as invisible.
  39. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
  40. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  41. // Scroll with the mouse not in the track.
  42. EXPECT_CALL(client_, IsMouseInScrollbarFrameRect()).WillOnce(Return(false));
  43. EXPECT_CALL(client_, SetHidden(false));
  44. EXPECT_CALL(client_, SetThumbNeedsDisplay());
  45. scrollbar_->DidScroll();
  46. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  47. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  48. EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
  49. // Fast-forward until just before the timeout threshold is hit.
  50. EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
  51. task_environment_.FastForwardBy(kTimeToFadeOut);
  52. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  53. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  54. // Fast-forward through half of the fade-out animation.
  55. EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
  56. task_environment_.FastForwardBy(kAnimationTime / 2);
  57. EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
  58. EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
  59. EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
  60. // Fast-forward through past the end of the fade-out animation. The scrollbar_
  61. // should be hidden.
  62. EXPECT_CALL(client_, SetHidden(true));
  63. task_environment_.FastForwardBy(kAnimationTime);
  64. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
  65. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  66. }
  67. TEST_F(MacScrollbarAnimatorTest, DidScrollStartsInTrack) {
  68. // Scroll with the mouse in the track.
  69. EXPECT_CALL(client_, IsMouseInScrollbarFrameRect()).WillOnce(Return(true));
  70. EXPECT_CALL(client_, SetHidden(false));
  71. EXPECT_CALL(client_, SetThumbNeedsDisplay());
  72. EXPECT_CALL(client_, SetTrackNeedsDisplay());
  73. scrollbar_->DidScroll();
  74. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  75. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  76. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  77. // Fast-forward long past the fade-out animation would happen. Nothing should
  78. // happen.
  79. EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
  80. EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
  81. task_environment_.FastForwardBy(10 * kTimeToFadeOut);
  82. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  83. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  84. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  85. // Scroll again. Again, nothing should happen.
  86. scrollbar_->DidScroll();
  87. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  88. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  89. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  90. // Have the mouse leave the scrollbar_. Fast-forward not enough time for the
  91. // scrollbar_ to fade out, then have the mouse re-enter. Exit again. Still
  92. // nothing should happen.
  93. scrollbar_->MouseDidExit();
  94. task_environment_.FastForwardBy(kTimeToFadeOut / 2);
  95. scrollbar_->MouseDidEnter();
  96. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  97. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  98. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  99. scrollbar_->MouseDidExit();
  100. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  101. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  102. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  103. // Wait most of the fade-out timer's time. Nothing should happen in this
  104. // interval.
  105. task_environment_.FastForwardBy(3 * kTimeToFadeOut / 4);
  106. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  107. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  108. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  109. // Allow the fade-out animation to progress about halfway through.
  110. EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
  111. EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
  112. task_environment_.FastForwardBy(kTimeToFadeOut / 4 + kAnimationTime / 2);
  113. EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
  114. EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
  115. EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
  116. EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
  117. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  118. // Scroll, interrupting the fade-out animation.
  119. EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(1);
  120. EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(1);
  121. scrollbar_->DidScroll();
  122. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  123. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  124. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  125. // Wait most of the fade-out timer's time. Nothing should happen in this time.
  126. EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
  127. EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
  128. task_environment_.FastForwardBy(3 * kTimeToFadeOut / 4);
  129. // Allow the fade-out animation to progress halfway again.
  130. EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
  131. EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
  132. task_environment_.FastForwardBy(kTimeToFadeOut / 4 + kAnimationTime / 2);
  133. EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
  134. EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
  135. EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
  136. EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
  137. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  138. // And let it progress to completion. The scrollbar_ should hide itself.
  139. EXPECT_CALL(client_, SetHidden(true));
  140. task_environment_.FastForwardBy(kAnimationTime);
  141. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
  142. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  143. EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
  144. }
  145. TEST_F(MacScrollbarAnimatorTest, EnterTrack) {
  146. // First try to enter the track before showing the scrollbar_. Nothing should
  147. // happen.
  148. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
  149. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  150. scrollbar_->MouseDidEnter();
  151. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
  152. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  153. // Scroll with the mouse in the track.
  154. EXPECT_CALL(client_, IsMouseInScrollbarFrameRect()).WillOnce(Return(false));
  155. EXPECT_CALL(client_, SetHidden(false));
  156. EXPECT_CALL(client_, SetThumbNeedsDisplay());
  157. scrollbar_->DidScroll();
  158. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  159. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  160. EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
  161. // Have the mouse enter the scrollbar_ area.
  162. scrollbar_->MouseDidEnter();
  163. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  164. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  165. EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
  166. // Fast-forward part of the animation.
  167. EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
  168. EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
  169. task_environment_.FastForwardBy(kAnimationTime / 2);
  170. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  171. EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
  172. EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
  173. EXPECT_GT(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
  174. EXPECT_LT(scrollbar_->GetThumbWidth(), kExpandedWidth);
  175. // Fast-forward through the rest of the animation.
  176. task_environment_.FastForwardBy(kAnimationTime);
  177. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  178. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  179. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  180. // Fast-forward for a long time. Nothing should happen (no fade-out).
  181. EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
  182. EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
  183. task_environment_.FastForwardBy(10 * kTimeToFadeOut);
  184. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  185. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  186. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  187. // Move the mouse out and wait for the the fade-out should start.
  188. scrollbar_->MouseDidExit();
  189. task_environment_.FastForwardBy(kTimeToFadeOut);
  190. EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
  191. EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
  192. task_environment_.FastForwardBy(kAnimationTime / 2);
  193. EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
  194. EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
  195. EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
  196. EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
  197. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  198. // Re-enter. This will immediately return us to full opacity.
  199. EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(1);
  200. EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(1);
  201. scrollbar_->MouseDidEnter();
  202. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  203. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  204. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  205. // Wait for a long time. Nothing should happen.
  206. EXPECT_CALL(client_, SetThumbNeedsDisplay()).Times(0);
  207. EXPECT_CALL(client_, SetTrackNeedsDisplay()).Times(0);
  208. task_environment_.FastForwardBy(10 * kTimeToFadeOut);
  209. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 1.f);
  210. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 1.f);
  211. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  212. // Re-leave the track. Again nothing should happen.
  213. scrollbar_->MouseDidExit();
  214. // Fast-forward through the start of the fade-out.
  215. task_environment_.FastForwardBy(kTimeToFadeOut);
  216. EXPECT_CALL(client_, SetThumbNeedsDisplay()).WillRepeatedly(Return());
  217. EXPECT_CALL(client_, SetTrackNeedsDisplay()).WillRepeatedly(Return());
  218. task_environment_.FastForwardBy(kAnimationTime / 2);
  219. EXPECT_GT(scrollbar_->GetThumbAlpha(), 0.f);
  220. EXPECT_LT(scrollbar_->GetThumbAlpha(), 1.f);
  221. EXPECT_GT(scrollbar_->GetTrackAlpha(), 0.f);
  222. EXPECT_LT(scrollbar_->GetTrackAlpha(), 1.f);
  223. EXPECT_EQ(scrollbar_->GetThumbWidth(), kExpandedWidth);
  224. // Fast-forward until the fade-out completes.
  225. EXPECT_CALL(client_, SetHidden(true));
  226. task_environment_.FastForwardBy(kAnimationTime);
  227. EXPECT_EQ(scrollbar_->GetThumbAlpha(), 0.f);
  228. EXPECT_EQ(scrollbar_->GetTrackAlpha(), 0.f);
  229. EXPECT_EQ(scrollbar_->GetThumbWidth(), kUnexpandedWidth);
  230. }
  231. } // namespace
  232. } // namespace ui