Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1185)

Unified Diff: ui/views/controls/scroll_view_unittest.cc

Issue 2192443003: MacViews: Fix scrolling when clicking on the views::ScrollView scroll track (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: static const Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/scroll_view.h ('k') | ui/views/controls/scrollbar/base_scroll_bar.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/controls/scroll_view_unittest.cc
diff --git a/ui/views/controls/scroll_view_unittest.cc b/ui/views/controls/scroll_view_unittest.cc
index d90784ca906d5d57097fece67c4518275f0ea19c..b18ebe7647c0215e468a89c7e0dd23d7372b2940 100644
--- a/ui/views/controls/scroll_view_unittest.cc
+++ b/ui/views/controls/scroll_view_unittest.cc
@@ -7,14 +7,54 @@
#include "base/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/views/border.h"
+#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h"
+#include "ui/views/controls/scrollbar/native_scroll_bar.h"
+#include "ui/views/controls/scrollbar/native_scroll_bar_views.h"
#include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
#include "ui/views/test/test_views.h"
+#include "ui/views/test/widget_test.h"
#if defined(OS_MACOSX)
#include "ui/base/test/scoped_preferred_scroller_style_mac.h"
#endif
+enum ScrollBarOrientation { HORIZONTAL, VERTICAL };
+
namespace views {
+namespace test {
+
+class ScrollViewTestApi {
+ public:
+ explicit ScrollViewTestApi(ScrollView* scroll_view)
+ : scroll_view_(scroll_view) {}
+
+ BaseScrollBar* GetBaseScrollBar(ScrollBarOrientation orientation) {
+ ScrollBar* scroll_bar = orientation == VERTICAL ? scroll_view_->vert_sb_
+ : scroll_view_->horiz_sb_;
+ if (scroll_bar->GetClassName() == NativeScrollBar::kViewClassName) {
+ return static_cast<NativeScrollBarViews*>(
+ static_cast<NativeScrollBar*>(scroll_bar)->native_wrapper_);
+ }
+ return static_cast<BaseScrollBar*>(scroll_bar);
+ }
+
+ const base::Timer& GetScrollBarTimer(ScrollBarOrientation orientation) {
+ return GetBaseScrollBar(orientation)->repeater_.timer_for_testing();
+ }
+
+ BaseScrollBarThumb* GetScrollBarThumb(ScrollBarOrientation orientation) {
+ return GetBaseScrollBar(orientation)->thumb_;
+ }
+
+ View* corner_view() { return scroll_view_->corner_view_; }
+
+ private:
+ ScrollView* scroll_view_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScrollViewTestApi);
+};
+
+} // namespace test
namespace {
@@ -22,8 +62,6 @@ const int kWidth = 100;
const int kMinHeight = 50;
const int kMaxHeight = 100;
-enum ScrollBarOrientation { HORIZONTAL, VERTICAL };
-
// View implementation that allows setting the preferred size.
class CustomView : public View {
public:
@@ -67,8 +105,66 @@ void CheckScrollbarVisibility(const ScrollView& scroll_view,
}
}
+ui::MouseEvent TestLeftMouseAt(const gfx::Point& location, ui::EventType type) {
+ return ui::MouseEvent(type, location, location, base::TimeTicks(),
+ ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
+}
+
} // namespace
+using test::ScrollViewTestApi;
+
+// Test harness that includes a Widget to help test ui::Event handling.
+class WidgetScrollViewTest : public test::WidgetTest {
+ public:
+ static const int kDefaultHeight = 100;
+ static const int kDefaultWidth = 100;
+
+ WidgetScrollViewTest() {
+#if defined(OS_MACOSX)
+ // Disable scrollbar hiding (i.e. disable overlay scrollbars) by default.
+ scroller_style_.reset(new ui::test::ScopedPreferredScrollerStyle(false));
+#endif
+ }
+
+ // Adds a ScrollView with a contents view of the given |size| and does layout.
+ ScrollView* AddScrollViewWithContentSize(const gfx::Size& contents_size) {
+ const gfx::Rect default_bounds(50, 50, kDefaultWidth, kDefaultHeight);
+ widget_ = CreateTopLevelFramelessPlatformWidget();
+
+ ScrollView* scroll_view = new ScrollView();
+ View* contents = new View;
+ scroll_view->SetContents(contents);
+ contents->SetSize(contents_size);
+
+ widget_->SetBounds(default_bounds);
+ widget_->Show();
+
+ widget_->SetContentsView(scroll_view);
+ scroll_view->Layout();
+ return scroll_view;
+ }
+
+ // testing::Test:
+ void TearDown() override {
+ if (widget_)
+ widget_->CloseNow();
+ WidgetTest::TearDown();
+ }
+
+ private:
+ Widget* widget_ = nullptr;
+
+#if defined(OS_MACOSX)
+ std::unique_ptr<ui::test::ScopedPreferredScrollerStyle> scroller_style_;
+#endif
+
+ DISALLOW_COPY_AND_ASSIGN(WidgetScrollViewTest);
+};
+
+const int WidgetScrollViewTest::kDefaultHeight;
+const int WidgetScrollViewTest::kDefaultWidth;
+
// Verifies the viewport is sized to fit the available space.
TEST(ScrollViewTest, ViewportSizedToFit) {
ScrollView scroll_view;
@@ -436,7 +532,7 @@ TEST(ScrollViewTest, CornerViewVisibility) {
View* contents = new View;
scroll_view.SetContents(contents);
scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
- View* corner_view = scroll_view.corner_view_;
+ View* corner_view = ScrollViewTestApi(&scroll_view).corner_view();
// Corner view should be visible when both scrollbars are visible.
contents->SetBounds(0, 0, 200, 200);
@@ -532,4 +628,37 @@ TEST(ScrollViewTest, CocoaOverlayScrollBars) {
}
#endif
+// Test scrolling behavior when clicking on the scroll track.
+TEST_F(WidgetScrollViewTest, ScrollTrackScrolling) {
+ // Set up with a vertical scroller.
+ ScrollView* scroll_view =
+ AddScrollViewWithContentSize(gfx::Size(10, kDefaultHeight * 5));
+ ScrollViewTestApi test_api(scroll_view);
+ BaseScrollBar* scroll_bar = test_api.GetBaseScrollBar(VERTICAL);
+ View* thumb = test_api.GetScrollBarThumb(VERTICAL);
+
+ // Click in the middle of the track, ensuring it's below the thumb.
+ const gfx::Point location = scroll_bar->bounds().CenterPoint();
+ EXPECT_GT(location.y(), thumb->bounds().bottom());
+ ui::MouseEvent press(TestLeftMouseAt(location, ui::ET_MOUSE_PRESSED));
+ ui::MouseEvent release(TestLeftMouseAt(location, ui::ET_MOUSE_RELEASED));
+
+ const base::Timer& timer = test_api.GetScrollBarTimer(VERTICAL);
+ EXPECT_FALSE(timer.IsRunning());
+
+ EXPECT_EQ(0, scroll_view->GetVisibleRect().y());
+ scroll_bar->OnMouseEvent(&press);
+
+ // Clicking the scroll track should scroll one "page".
+ EXPECT_EQ(kDefaultHeight, scroll_view->GetVisibleRect().y());
+
+ // While the mouse is pressed, timer should trigger more scroll events.
+ EXPECT_TRUE(timer.IsRunning());
+
+ // Upon release timer should stop (and scroll position should remain).
+ scroll_bar->OnMouseEvent(&release);
+ EXPECT_FALSE(timer.IsRunning());
+ EXPECT_EQ(kDefaultHeight, scroll_view->GetVisibleRect().y());
+}
+
} // namespace views
« no previous file with comments | « ui/views/controls/scroll_view.h ('k') | ui/views/controls/scrollbar/base_scroll_bar.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698