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

Unified 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: -> event_generator_delegate_mac.mm, comment fixes Created 6 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
« ui/events/test/event_generator.cc ('K') | « ui/views/widget/native_widget_mac.mm ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« ui/events/test/event_generator.cc ('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