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

Side by Side Diff: ui/views/widget/widget_unittest.cc

Issue 322893005: MacViews: Add WidgetEventGenerator to abstract platform-specific event generation for tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase on crrev/334573008 Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <algorithm> 5 #include <algorithm>
6 #include <set> 6 #include <set>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "ui/aura/test/event_generator.h"
16 #include "ui/aura/window.h"
17 #include "ui/base/hit_test.h" 15 #include "ui/base/hit_test.h"
18 #include "ui/compositor/scoped_animation_duration_scale_mode.h" 16 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
19 #include "ui/compositor/scoped_layer_animation_settings.h" 17 #include "ui/compositor/scoped_layer_animation_settings.h"
20 #include "ui/events/event_processor.h" 18 #include "ui/events/event_processor.h"
21 #include "ui/events/event_utils.h" 19 #include "ui/events/event_utils.h"
22 #include "ui/gfx/native_widget_types.h" 20 #include "ui/gfx/native_widget_types.h"
23 #include "ui/gfx/point.h" 21 #include "ui/gfx/point.h"
24 #include "ui/views/bubble/bubble_delegate.h" 22 #include "ui/views/bubble/bubble_delegate.h"
25 #include "ui/views/controls/textfield/textfield.h" 23 #include "ui/views/controls/textfield/textfield.h"
26 #include "ui/views/test/test_views_delegate.h" 24 #include "ui/views/test/test_views_delegate.h"
25 #include "ui/views/test/widget_event_generator.h"
27 #include "ui/views/test/widget_test.h" 26 #include "ui/views/test/widget_test.h"
28 #include "ui/views/views_delegate.h" 27 #include "ui/views/views_delegate.h"
29 #include "ui/views/widget/native_widget_delegate.h" 28 #include "ui/views/widget/native_widget_delegate.h"
30 #include "ui/views/widget/root_view.h" 29 #include "ui/views/widget/root_view.h"
31 #include "ui/views/widget/widget_deletion_observer.h" 30 #include "ui/views/widget/widget_deletion_observer.h"
32 #include "ui/views/window/dialog_delegate.h" 31 #include "ui/views/window/dialog_delegate.h"
33 #include "ui/views/window/native_frame_view.h" 32 #include "ui/views/window/native_frame_view.h"
34 33
35 #if defined(OS_WIN) 34 #if defined(OS_WIN)
36 #include "ui/views/win/hwnd_util.h" 35 #include "ui/views/win/hwnd_util.h"
37 #endif 36 #endif
38 37
39 namespace views { 38 namespace views {
40 namespace test { 39 namespace test {
41 40
42 // A view that keeps track of the events it receives, but consumes no events. 41 // A view that keeps track of the events it receives, optionally consuming them.
43 class EventCountView : public View { 42 class EventCountView : public View {
44 public: 43 public:
45 EventCountView() {} 44 // Whether to call SetHandled() on events as they are received. For some event
45 // types, this will allow EventCountView to receives future events in the
46 // event sequence, such as a drag.
47 enum HandleMode {
48 PROPAGATE_EVENTS,
49 CONSUME_EVENTS
50 };
51
52 EventCountView()
53 : last_flags_(0),
54 handle_mode_(PROPAGATE_EVENTS) {}
55
46 virtual ~EventCountView() {} 56 virtual ~EventCountView() {}
47 57
48 int GetEventCount(ui::EventType type) { 58 int GetEventCount(ui::EventType type) {
49 return event_count_[type]; 59 return event_count_[type];
50 } 60 }
51 61
52 void ResetCounts() { 62 void ResetCounts() {
53 event_count_.clear(); 63 event_count_.clear();
54 } 64 }
55 65
66 int last_flags() const {
67 return last_flags_;
68 }
69
70 void set_handle_mode(HandleMode handle_mode) {
71 handle_mode_ = handle_mode;
72 }
73
56 protected: 74 protected:
75 // Overridden from View:
76 virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE {
77 // MouseMove events are not re-dispatched from the RootView.
78 ++event_count_[ui::ET_MOUSE_MOVED];
79 last_flags_ = 0;
80 }
81
57 // Overridden from ui::EventHandler: 82 // Overridden from ui::EventHandler:
58 virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { 83 virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE {
59 RecordEvent(*event); 84 RecordEvent(event);
60 } 85 }
61 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 86 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
62 RecordEvent(*event); 87 RecordEvent(event);
63 } 88 }
64 virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 89 virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
65 RecordEvent(*event); 90 RecordEvent(event);
66 } 91 }
67 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 92 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
68 RecordEvent(*event); 93 RecordEvent(event);
69 } 94 }
70 95
71 private: 96 private:
72 void RecordEvent(const ui::Event& event) { 97 void RecordEvent(ui::Event* event) {
73 ++event_count_[event.type()]; 98 ++event_count_[event->type()];
99 last_flags_ = event->flags();
100 if (handle_mode_ == CONSUME_EVENTS)
101 event->SetHandled();
74 } 102 }
75 103
76 std::map<ui::EventType, int> event_count_; 104 std::map<ui::EventType, int> event_count_;
105 int last_flags_;
106 HandleMode handle_mode_;
77 107
78 DISALLOW_COPY_AND_ASSIGN(EventCountView); 108 DISALLOW_COPY_AND_ASSIGN(EventCountView);
79 }; 109 };
80 110
81 // A view that keeps track of the events it receives, and consumes all scroll 111 // A view that keeps track of the events it receives, and consumes all scroll
82 // gesture events and ui::ET_SCROLL events. 112 // gesture events and ui::ET_SCROLL events.
83 class ScrollableEventCountView : public EventCountView { 113 class ScrollableEventCountView : public EventCountView {
84 public: 114 public:
85 ScrollableEventCountView() {} 115 ScrollableEventCountView() {}
86 virtual ~ScrollableEventCountView() {} 116 virtual ~ScrollableEventCountView() {}
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after
1515 Widget* widget = new Widget; 1545 Widget* widget = new Widget;
1516 Widget::InitParams params = 1546 Widget::InitParams params =
1517 CreateParams(views::Widget::InitParams::TYPE_POPUP); 1547 CreateParams(views::Widget::InitParams::TYPE_POPUP);
1518 widget->Init(params); 1548 widget->Init(params);
1519 1549
1520 widget->SetContentsView(new CloseWidgetView(ui::ET_MOUSE_PRESSED)); 1550 widget->SetContentsView(new CloseWidgetView(ui::ET_MOUSE_PRESSED));
1521 1551
1522 widget->SetSize(gfx::Size(100, 100)); 1552 widget->SetSize(gfx::Size(100, 100));
1523 widget->Show(); 1553 widget->Show();
1524 1554
1525 aura::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); 1555 test::WidgetEventGenerator generator(GetContext(), widget);
1526 1556
1527 WidgetDeletionObserver deletion_observer(widget); 1557 WidgetDeletionObserver deletion_observer(widget);
1528 generator.ClickLeftButton(); 1558 generator.ClickLeftButton();
1529 EXPECT_FALSE(deletion_observer.IsWidgetAlive()); 1559 EXPECT_FALSE(deletion_observer.IsWidgetAlive());
1530 1560
1531 // Yay we did not crash! 1561 // Yay we did not crash!
1532 } 1562 }
1533 1563
1534 TEST_F(WidgetTest, WidgetDeleted_InDispatchGestureEvent) { 1564 TEST_F(WidgetTest, WidgetDeleted_InDispatchGestureEvent) {
1535 Widget* widget = new Widget; 1565 Widget* widget = new Widget;
1536 Widget::InitParams params = 1566 Widget::InitParams params =
1537 CreateParams(views::Widget::InitParams::TYPE_POPUP); 1567 CreateParams(views::Widget::InitParams::TYPE_POPUP);
1538 widget->Init(params); 1568 widget->Init(params);
1539 1569
1540 widget->SetContentsView(new CloseWidgetView(ui::ET_GESTURE_TAP_DOWN)); 1570 widget->SetContentsView(new CloseWidgetView(ui::ET_GESTURE_TAP_DOWN));
1541 1571
1542 widget->SetSize(gfx::Size(100, 100)); 1572 widget->SetSize(gfx::Size(100, 100));
1543 widget->Show(); 1573 widget->Show();
1544 1574
1545 aura::test::EventGenerator generator(GetContext()); 1575 test::WidgetEventGenerator generator(GetContext());
1546 1576
1547 WidgetDeletionObserver deletion_observer(widget); 1577 WidgetDeletionObserver deletion_observer(widget);
1548 generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint()); 1578 generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint());
1549 EXPECT_FALSE(deletion_observer.IsWidgetAlive()); 1579 EXPECT_FALSE(deletion_observer.IsWidgetAlive());
1550 1580
1551 // Yay we did not crash! 1581 // Yay we did not crash!
1552 } 1582 }
1553 1583
1554 // See description of RunGetNativeThemeFromDestructor() for details. 1584 // See description of RunGetNativeThemeFromDestructor() for details.
1555 class GetNativeThemeFromDestructorView : public WidgetDelegateView { 1585 class GetNativeThemeFromDestructorView : public WidgetDelegateView {
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
1995 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 2025 init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
1996 2026
1997 { 2027 {
1998 Widget top_level_widget; 2028 Widget top_level_widget;
1999 top_level_widget.Init(init_params); 2029 top_level_widget.Init(init_params);
2000 top_level_widget.SetFullscreen(true); 2030 top_level_widget.SetFullscreen(true);
2001 EXPECT_EQ(top_level_widget.IsVisible(), 2031 EXPECT_EQ(top_level_widget.IsVisible(),
2002 IsNativeWindowVisible(top_level_widget.GetNativeWindow())); 2032 IsNativeWindowVisible(top_level_widget.GetNativeWindow()));
2003 top_level_widget.CloseNow(); 2033 top_level_widget.CloseNow();
2004 } 2034 }
2005
2006 #if !defined(OS_CHROMEOS) 2035 #if !defined(OS_CHROMEOS)
2007 { 2036 {
2008 Widget top_level_widget; 2037 Widget top_level_widget;
2009 init_params.native_widget = 2038 init_params.native_widget =
2010 new PlatformDesktopNativeWidget(&top_level_widget); 2039 new PlatformDesktopNativeWidget(&top_level_widget);
2011 top_level_widget.Init(init_params); 2040 top_level_widget.Init(init_params);
2012 top_level_widget.SetFullscreen(true); 2041 top_level_widget.SetFullscreen(true);
2013 EXPECT_EQ(top_level_widget.IsVisible(), 2042 EXPECT_EQ(top_level_widget.IsVisible(),
2014 IsNativeWindowVisible(top_level_widget.GetNativeWindow())); 2043 IsNativeWindowVisible(top_level_widget.GetNativeWindow()));
2015 top_level_widget.CloseNow(); 2044 top_level_widget.CloseNow();
2016 } 2045 }
2017 #endif 2046 #endif
2018 } 2047 }
2019
2020 #if defined(OS_WIN) 2048 #if defined(OS_WIN)
2021 2049
2022 // Provides functionality to test widget activation via an activation flag 2050 // Provides functionality to test widget activation via an activation flag
2023 // which can be set by an accessor. 2051 // which can be set by an accessor.
2024 class ModalWindowTestWidgetDelegate : public WidgetDelegate { 2052 class ModalWindowTestWidgetDelegate : public WidgetDelegate {
2025 public: 2053 public:
2026 ModalWindowTestWidgetDelegate() 2054 ModalWindowTestWidgetDelegate()
2027 : widget_(NULL), 2055 : widget_(NULL),
2028 can_activate_(true) {} 2056 can_activate_(true) {}
2029 2057
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 2297 child_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2270 child_params.context = parent_widget.GetNativeView(); 2298 child_params.context = parent_widget.GetNativeView();
2271 child_widget.Init(child_params); 2299 child_widget.Init(child_params);
2272 child_widget.AddObserver(&observer); 2300 child_widget.AddObserver(&observer);
2273 child_widget.Show(); 2301 child_widget.Show();
2274 2302
2275 parent_widget.CloseNow(); 2303 parent_widget.CloseNow();
2276 } 2304 }
2277 #endif // !defined(OS_CHROMEOS) 2305 #endif // !defined(OS_CHROMEOS)
2278 2306
2307 // Tests that events propagate through from the dispatcher with the correct
2308 // event type, and that the different platforms behave the same.
2309 TEST_F(WidgetTest, MouseEventTypesViaGenerator) {
2310 EventCountView* view = new EventCountView;
2311 view->set_handle_mode(EventCountView::CONSUME_EVENTS);
2312 view->SetBounds(10, 10, 50, 40);
2313
2314 Widget* widget = CreateTopLevelFramelessPlatformWidget();
2315 widget->GetRootView()->AddChildView(view);
2316
2317 widget->SetBounds(gfx::Rect(0, 0, 100, 80));
2318 widget->Show();
2319
2320 test::WidgetEventGenerator generator(widget);
2321 generator.set_current_location(gfx::Point(20, 20));
2322
2323 generator.ClickLeftButton();
2324 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2325 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2326 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags());
2327
2328 generator.PressRightButton();
2329 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2330 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2331 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, view->last_flags());
2332
2333 generator.ReleaseRightButton();
2334 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2335 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2336 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, view->last_flags());
2337
2338 // Test mouse move events.
2339 EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_MOVED));
2340 EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2341
2342 // Move the mouse within the view (20, 20) -> (30, 30).
2343 generator.MoveMouseTo(gfx::Point(30, 30));
2344 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_MOVED));
2345 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2346 EXPECT_EQ(ui::EF_NONE, view->last_flags());
2347
2348 // Move it again - entered count shouldn't change.
2349 generator.MoveMouseTo(gfx::Point(31, 31));
2350 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_MOVED));
2351 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2352 EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_EXITED));
2353
2354 // Move it off the view.
2355 generator.MoveMouseTo(gfx::Point(5, 5));
2356 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_MOVED));
2357 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2358 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_EXITED));
2359
2360 // Move it back on.
2361 generator.MoveMouseTo(gfx::Point(20, 20));
2362 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_MOVED));
2363 EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_ENTERED));
2364 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_EXITED));
2365
2366 // Drargging. Cover HasCapture() and NativeWidgetPrivate::IsMouseButtonDown().
2367 generator.DragMouseTo(gfx::Point(40, 40));
2368 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_PRESSED));
2369 EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_RELEASED));
2370 EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_DRAGGED));
2371 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags());
2372
2373 widget->CloseNow();
2374 }
2375
2279 } // namespace test 2376 } // namespace test
2280 } // namespace views 2377 } // namespace views
OLDNEW
« ui/views/test/widget_event_generator_mac.mm ('K') | « ui/views/widget/native_widget_mac.mm ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698