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

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: 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 side-by-side diff with in-line comments
Download patch
Index: ui/views/widget/widget_unittest.cc
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index d6ab0999907222712e62710af4b09f4ff9137650..a30f1cae0cd20fb7a01b19d1e3925edbc01044e7 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -12,8 +12,6 @@
#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/scoped_animation_duration_scale_mode.h"
#include "ui/compositor/scoped_layer_animation_settings.h"
@@ -24,6 +22,7 @@
#include "ui/views/bubble/bubble_delegate.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/test/test_views_delegate.h"
+#include "ui/views/test/widget_event_generator.h"
#include "ui/views/test/widget_test.h"
#include "ui/views/views_delegate.h"
#include "ui/views/widget/native_widget_delegate.h"
@@ -39,10 +38,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) {
@@ -53,27 +63,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);
};
@@ -1522,7 +1552,7 @@ TEST_F(WidgetTest, WidgetDeleted_InOnMousePressed) {
widget->SetSize(gfx::Size(100, 100));
widget->Show();
- aura::test::EventGenerator generator(GetContext(), widget->GetNativeWindow());
+ test::WidgetEventGenerator generator(GetContext(), widget);
WidgetDeletionObserver deletion_observer(widget);
generator.ClickLeftButton();
@@ -1542,7 +1572,7 @@ TEST_F(WidgetTest, WidgetDeleted_InDispatchGestureEvent) {
widget->SetSize(gfx::Size(100, 100));
widget->Show();
- aura::test::EventGenerator generator(GetContext());
+ test::WidgetEventGenerator generator(GetContext());
WidgetDeletionObserver deletion_observer(widget);
generator.GestureTapAt(widget->GetWindowBoundsInScreen().CenterPoint());
@@ -2002,7 +2032,6 @@ TEST_F(WidgetTest, FullscreenStatePropagated) {
IsNativeWindowVisible(top_level_widget.GetNativeWindow()));
top_level_widget.CloseNow();
}
-
#if !defined(OS_CHROMEOS)
{
Widget top_level_widget;
@@ -2016,7 +2045,6 @@ TEST_F(WidgetTest, FullscreenStatePropagated) {
}
#endif
}
-
#if defined(OS_WIN)
// Provides functionality to test widget activation via an activation flag
@@ -2276,5 +2304,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();
+
+ test::WidgetEventGenerator generator(widget);
+ 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/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