Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index fbc814d5c4dc70b3b1100c70f39d15e239127d5b..ad584964d7d187ad9dd956bbd262cb38d63da30e 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -12,14 +12,13 @@ |
#include "base/run_loop.h" |
#include "base/strings/utf_string_conversions.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/aura/test/event_generator.h" |
-#include "ui/aura/window.h" |
#include "ui/base/hit_test.h" |
#include "ui/compositor/layer_animation_observer.h" |
#include "ui/compositor/scoped_animation_duration_scale_mode.h" |
#include "ui/compositor/scoped_layer_animation_settings.h" |
#include "ui/events/event_processor.h" |
#include "ui/events/event_utils.h" |
+#include "ui/events/test/event_generator.h" |
#include "ui/gfx/native_widget_types.h" |
#include "ui/gfx/point.h" |
#include "ui/views/bubble/bubble_delegate.h" |
@@ -40,10 +39,21 @@ |
namespace views { |
namespace test { |
-// A view that keeps track of the events it receives, but consumes no events. |
+// A view that keeps track of the events it receives, optionally consuming them. |
class EventCountView : public View { |
public: |
- EventCountView() {} |
+ // Whether to call SetHandled() on events as they are received. For some event |
+ // types, this will allow EventCountView to receives future events in the |
+ // event sequence, such as a drag. |
+ enum HandleMode { |
+ PROPAGATE_EVENTS, |
+ CONSUME_EVENTS |
+ }; |
+ |
+ EventCountView() |
+ : last_flags_(0), |
+ handle_mode_(PROPAGATE_EVENTS) {} |
+ |
virtual ~EventCountView() {} |
int GetEventCount(ui::EventType type) { |
@@ -54,27 +64,47 @@ class EventCountView : public View { |
event_count_.clear(); |
} |
+ int last_flags() const { |
+ return last_flags_; |
+ } |
+ |
+ void set_handle_mode(HandleMode handle_mode) { |
+ handle_mode_ = handle_mode; |
+ } |
+ |
protected: |
+ // Overridden from View: |
+ virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE { |
+ // MouseMove events are not re-dispatched from the RootView. |
+ ++event_count_[ui::ET_MOUSE_MOVED]; |
+ last_flags_ = 0; |
+ } |
+ |
// Overridden from ui::EventHandler: |
virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { |
- RecordEvent(*event); |
+ RecordEvent(event); |
} |
virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { |
- RecordEvent(*event); |
+ RecordEvent(event); |
} |
virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { |
- RecordEvent(*event); |
+ RecordEvent(event); |
} |
virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
- RecordEvent(*event); |
+ RecordEvent(event); |
} |
private: |
- void RecordEvent(const ui::Event& event) { |
- ++event_count_[event.type()]; |
+ void RecordEvent(ui::Event* event) { |
+ ++event_count_[event->type()]; |
+ last_flags_ = event->flags(); |
+ if (handle_mode_ == CONSUME_EVENTS) |
+ event->SetHandled(); |
} |
std::map<ui::EventType, int> event_count_; |
+ int last_flags_; |
+ HandleMode handle_mode_; |
DISALLOW_COPY_AND_ASSIGN(EventCountView); |
}; |
@@ -1525,7 +1555,7 @@ TEST_F(WidgetTest, MouseEventDispatchWhileTouchIsDown) { |
MousePressEventConsumer consumer; |
event_count_view->AddPostTargetHandler(&consumer); |
- aura::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); |
+ ui::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); |
generator.PressTouch(); |
generator.ClickLeftButton(); |
@@ -1645,7 +1675,7 @@ TEST_F(WidgetTest, WidgetDeleted_InOnMousePressed) { |
widget->SetSize(gfx::Size(100, 100)); |
widget->Show(); |
- aura::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); |
+ ui::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); |
WidgetDeletionObserver deletion_observer(widget); |
generator.ClickLeftButton(); |
@@ -1665,7 +1695,7 @@ TEST_F(WidgetTest, WidgetDeleted_InDispatchGestureEvent) { |
widget->SetSize(gfx::Size(100, 100)); |
widget->Show(); |
- aura::test::EventGenerator generator(GetContext()); |
+ ui::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); |
WidgetDeletionObserver deletion_observer(widget); |
generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint()); |
@@ -2177,7 +2207,6 @@ TEST_F(WidgetTest, FullscreenStatePropagated) { |
IsNativeWindowVisible(top_level_widget.GetNativeWindow())); |
top_level_widget.CloseNow(); |
} |
- |
#if !defined(OS_CHROMEOS) |
{ |
Widget top_level_widget; |
@@ -2191,7 +2220,6 @@ TEST_F(WidgetTest, FullscreenStatePropagated) { |
} |
#endif |
} |
- |
#if defined(OS_WIN) |
// Provides functionality to test widget activation via an activation flag |
@@ -2499,5 +2527,74 @@ TEST_F(WidgetTest, IsActiveFromDestroy) { |
} |
#endif // !defined(OS_CHROMEOS) |
+// Tests that events propagate through from the dispatcher with the correct |
+// event type, and that the different platforms behave the same. |
+TEST_F(WidgetTest, MouseEventTypesViaGenerator) { |
+ EventCountView* view = new EventCountView; |
+ view->set_handle_mode(EventCountView::CONSUME_EVENTS); |
+ view->SetBounds(10, 10, 50, 40); |
+ |
+ Widget* widget = CreateTopLevelFramelessPlatformWidget(); |
+ widget->GetRootView()->AddChildView(view); |
+ |
+ widget->SetBounds(gfx::Rect(0, 0, 100, 80)); |
+ widget->Show(); |
+ |
+ ui::test::EventGenerator generator(GetContext(), widget->GetNativeWindow()); |
+ generator.set_current_location(gfx::Point(20, 20)); |
+ |
+ generator.ClickLeftButton(); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_PRESSED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_RELEASED)); |
+ EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags()); |
+ |
+ generator.PressRightButton(); |
+ EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_PRESSED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_RELEASED)); |
+ EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, view->last_flags()); |
+ |
+ generator.ReleaseRightButton(); |
+ EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_PRESSED)); |
+ EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_RELEASED)); |
+ EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, view->last_flags()); |
+ |
+ // Test mouse move events. |
+ EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_MOVED)); |
+ EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_ENTERED)); |
+ |
+ // Move the mouse within the view (20, 20) -> (30, 30). |
+ generator.MoveMouseTo(gfx::Point(30, 30)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_MOVED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED)); |
+ EXPECT_EQ(ui::EF_NONE, view->last_flags()); |
+ |
+ // Move it again - entered count shouldn't change. |
+ generator.MoveMouseTo(gfx::Point(31, 31)); |
+ EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_MOVED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED)); |
+ EXPECT_EQ(0, view->GetEventCount(ui::ET_MOUSE_EXITED)); |
+ |
+ // Move it off the view. |
+ generator.MoveMouseTo(gfx::Point(5, 5)); |
+ EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_MOVED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_ENTERED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_EXITED)); |
+ |
+ // Move it back on. |
+ generator.MoveMouseTo(gfx::Point(20, 20)); |
+ EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_MOVED)); |
+ EXPECT_EQ(2, view->GetEventCount(ui::ET_MOUSE_ENTERED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_EXITED)); |
+ |
+ // Drargging. Cover HasCapture() and NativeWidgetPrivate::IsMouseButtonDown(). |
+ generator.DragMouseTo(gfx::Point(40, 40)); |
+ EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_PRESSED)); |
+ EXPECT_EQ(3, view->GetEventCount(ui::ET_MOUSE_RELEASED)); |
+ EXPECT_EQ(1, view->GetEventCount(ui::ET_MOUSE_DRAGGED)); |
+ EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, view->last_flags()); |
+ |
+ widget->CloseNow(); |
+} |
+ |
} // namespace test |
} // namespace views |