OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |