diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 05:02:24 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 05:02:24 +0000 |
commit | 9353037bd4eb771874fe3567929b81a726a005df (patch) | |
tree | 889683165b9120767eb519b5ab51c1ff81062b7c /ui | |
parent | 57aee0e1a6556241144b31c82b09cfcbf0ca9f2f (diff) | |
download | chromium_src-9353037bd4eb771874fe3567929b81a726a005df.zip chromium_src-9353037bd4eb771874fe3567929b81a726a005df.tar.gz chromium_src-9353037bd4eb771874fe3567929b81a726a005df.tar.bz2 |
events: Add some test.
Add a test to verify that the event-handlers are called in
the right order.
BUG=none
Review URL: https://chromiumcodereview.appspot.com/10912168
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@155663 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/base/events/event.h | 6 | ||||
-rw-r--r-- | ui/base/events/event_constants.h | 6 | ||||
-rw-r--r-- | ui/base/events/event_dispatcher.h | 6 | ||||
-rw-r--r-- | ui/base/events/event_dispatcher_unittest.cc | 185 | ||||
-rw-r--r-- | ui/base/events/event_handler.h | 6 | ||||
-rw-r--r-- | ui/base/events/event_target.h | 6 | ||||
-rw-r--r-- | ui/ui_unittests.gypi | 1 |
7 files changed, 201 insertions, 15 deletions
diff --git a/ui/base/events/event.h b/ui/base/events/event.h index d2cec15..a370c391 100644 --- a/ui/base/events/event.h +++ b/ui/base/events/event.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_BASE_EVENTS_EVENT_CONSTANTS_EVENT_H_ -#define UI_BASE_EVENTS_EVENT_CONSTANTS_EVENT_H_ +#ifndef UI_BASE_EVENTS_EVENT_H_ +#define UI_BASE_EVENTS_EVENT_H_ #include "base/basictypes.h" #include "base/compiler_specific.h" @@ -620,4 +620,4 @@ class UI_EXPORT GestureEvent : public LocatedEvent { } // namespace ui -#endif // UI_BASE_EVENTS_EVENT_CONSTANTS_EVENT_H_ +#endif // UI_BASE_EVENTS_EVENT_H_ diff --git a/ui/base/events/event_constants.h b/ui/base/events/event_constants.h index e213bf8..91d0be5 100644 --- a/ui/base/events/event_constants.h +++ b/ui/base/events/event_constants.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_H_ -#define UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_H_ +#ifndef UI_BASE_EVENTS_EVENT_CONSTANTS_H_ +#define UI_BASE_EVENTS_EVENT_CONSTANTS_H_ #include "base/event_types.h" #include "ui/base/keycodes/keyboard_codes.h" @@ -228,4 +228,4 @@ UI_EXPORT bool IsMouseEventFromTouch(UINT message); } // namespace ui -#endif // UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_H_ +#endif // UI_BASE_EVENTS_EVENT_CONSTANTS_H_ diff --git a/ui/base/events/event_dispatcher.h b/ui/base/events/event_dispatcher.h index 976a124..8e475be 100644 --- a/ui/base/events/event_dispatcher.h +++ b/ui/base/events/event_dispatcher.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_DISPATCHER_H_ -#define UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_DISPATCHER_H_ +#ifndef UI_BASE_EVENTS_EVENT_DISPATCHER_H_ +#define UI_BASE_EVENTS_EVENT_DISPATCHER_H_ #include "ui/base/events/event.h" #include "ui/base/events/event_constants.h" @@ -111,4 +111,4 @@ class UI_EXPORT EventDispatcher { } // namespace ui -#endif // UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_DISPATCHER_H_ +#endif // UI_BASE_EVENTS_EVENT_DISPATCHER_H_ diff --git a/ui/base/events/event_dispatcher_unittest.cc b/ui/base/events/event_dispatcher_unittest.cc new file mode 100644 index 0000000..9230cb5 --- /dev/null +++ b/ui/base/events/event_dispatcher_unittest.cc @@ -0,0 +1,185 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/base/events/event_dispatcher.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace ui { + +namespace { + +class TestEventDispatcher : public EventDispatcher { + public: + TestEventDispatcher() {} + virtual ~TestEventDispatcher() {} + + private: + // Overridden from EventDispatcher: + virtual bool CanDispatchToTarget(EventTarget* target) OVERRIDE { + return true; + } + + virtual void ProcessPreTargetList(EventHandlerList* list) OVERRIDE { + } + + virtual void ProcessPostTargetList(EventHandlerList* list) OVERRIDE { + } + + DISALLOW_COPY_AND_ASSIGN(TestEventDispatcher); +}; + +class TestTarget : public EventTarget { + public: + TestTarget() : parent_(NULL) {} + virtual ~TestTarget() {} + + void set_parent(TestTarget* parent) { parent_ = parent; } + + void AddHandlerId(int id) { + handler_list_.push_back(id); + } + + const std::vector<int>& handler_list() const { return handler_list_; } + + void Reset() { + handler_list_.clear(); + } + + private: + // Overridden from EventTarget: + virtual bool CanAcceptEvents() OVERRIDE { + return true; + } + + virtual EventTarget* GetParentTarget() OVERRIDE { + return parent_; + } + + TestTarget* parent_; + std::vector<int> handler_list_; + + DISALLOW_COPY_AND_ASSIGN(TestTarget); +}; + +class TestEventHandler : public EventHandler { + public: + TestEventHandler(int id) + : id_(id), + event_result_(ER_UNHANDLED) { + } + + virtual ~TestEventHandler() {} + + void ReceivedEventForTarget(EventTarget* target) { + static_cast<TestTarget*>(target)->AddHandlerId(id_); + } + + void set_event_result(EventResult result) { event_result_ = result; } + + private: + // Overridden from EventHandler: + virtual EventResult OnKeyEvent(KeyEvent* event) OVERRIDE { + ReceivedEventForTarget(event->target()); + return event_result_; + } + + virtual EventResult OnMouseEvent(MouseEvent* event) OVERRIDE { + ReceivedEventForTarget(event->target()); + return event_result_; + } + + virtual EventResult OnScrollEvent(ScrollEvent* event) OVERRIDE { + ReceivedEventForTarget(event->target()); + return event_result_; + } + + virtual TouchStatus OnTouchEvent(TouchEvent* event) OVERRIDE { + ReceivedEventForTarget(event->target()); + return ui::TOUCH_STATUS_UNKNOWN; + } + + virtual EventResult OnGestureEvent(GestureEvent* event) OVERRIDE { + ReceivedEventForTarget(event->target()); + return event_result_; + } + + int id_; + EventResult event_result_; + + DISALLOW_COPY_AND_ASSIGN(TestEventHandler); +}; + +} // namespace + +TEST(EventDispatcherTest, EventDispatchOrder) { + TestEventDispatcher dispatcher; + TestTarget parent, child; + TestEventHandler h1(1), h2(2), h3(3), h4(4); + TestEventHandler h5(5), h6(6), h7(7), h8(8); + + child.set_parent(&parent); + + parent.AddPreTargetHandler(&h1); + parent.AddPreTargetHandler(&h2); + + child.AddPreTargetHandler(&h3); + child.AddPreTargetHandler(&h4); + + child.AddPostTargetHandler(&h5); + child.AddPostTargetHandler(&h6); + + parent.AddPostTargetHandler(&h7); + parent.AddPostTargetHandler(&h8); + + ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), + gfx::Point(3, 4), 0); + int result = dispatcher.ProcessEvent(&child, &mouse); + EXPECT_FALSE(result & ER_CONSUMED); + EXPECT_FALSE(result & ER_HANDLED); + + // Note that the pre-handlers for the target itself (i.e. |child|) will not + // receive these events. This is for compatibility reasons for how + // event-filters behave in aura. The desired behaviour is that the + // pre-handlers for the target will receive the events before the target. + // http://crbug.com/147523 + int expected[] = { 1, 2, 5, 6, 7, 8 }; + EXPECT_EQ( + std::vector<int>(expected, expected + sizeof(expected) / sizeof(int)), + child.handler_list()); + + child.Reset(); + + h1.set_event_result(ER_HANDLED); + result = dispatcher.ProcessEvent(&child, &mouse); + EXPECT_FALSE(result & ER_CONSUMED); + EXPECT_TRUE(result & ER_HANDLED); + EXPECT_EQ( + std::vector<int>(expected, expected + sizeof(expected) / sizeof(int)), + child.handler_list()); + + child.Reset(); + + int nexpected[] = { 1, 2, 5 }; + h5.set_event_result(ER_CONSUMED); + result = dispatcher.ProcessEvent(&child, &mouse); + EXPECT_TRUE(result & ER_CONSUMED); + EXPECT_TRUE(result & ER_HANDLED); + EXPECT_EQ( + std::vector<int>(nexpected, nexpected + sizeof(nexpected) / sizeof(int)), + child.handler_list()); + + child.Reset(); + + int exp[] = { 1 }; + h1.set_event_result(ER_CONSUMED); + result = dispatcher.ProcessEvent(&child, &mouse); + EXPECT_TRUE(result & ER_CONSUMED); + EXPECT_FALSE(result & ER_HANDLED); + EXPECT_EQ( + std::vector<int>(exp, exp + sizeof(exp) / sizeof(int)), + child.handler_list()); +} + +} // namespace ui diff --git a/ui/base/events/event_handler.h b/ui/base/events/event_handler.h index 4d881dd..3e2e9c52 100644 --- a/ui/base/events/event_handler.h +++ b/ui/base/events/event_handler.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_HANDLER_H_ -#define UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_HANDLER_H_ +#ifndef UI_BASE_EVENTS_EVENT_HANDLER_H_ +#define UI_BASE_EVENTS_EVENT_HANDLER_H_ #include <vector> @@ -41,4 +41,4 @@ typedef std::vector<EventHandler*> EventHandlerList; } // namespace ui -#endif // UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_HANDLER_H_ +#endif // UI_BASE_EVENTS_EVENT_HANDLER_H_ diff --git a/ui/base/events/event_target.h b/ui/base/events/event_target.h index 0c914b7..22962d4 100644 --- a/ui/base/events/event_target.h +++ b/ui/base/events/event_target.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_TARGET_H_ -#define UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_TARGET_H_ +#ifndef UI_BASE_EVENTS_EVENT_TARGET_H_ +#define UI_BASE_EVENTS_EVENT_TARGET_H_ #include "base/compiler_specific.h" #include "ui/base/events/event_handler.h" @@ -72,4 +72,4 @@ class UI_EXPORT EventTarget : public EventHandler { } // namespace ui -#endif // UI_BASE_EVENTS_EVENT_CONSTANTS_EVENTS_EVENT_TARGET_H_ +#endif // UI_BASE_EVENTS_EVENT_TARGET_H_ diff --git a/ui/ui_unittests.gypi b/ui/ui_unittests.gypi index 0d569f4..83fb7e3 100644 --- a/ui/ui_unittests.gypi +++ b/ui/ui_unittests.gypi @@ -74,6 +74,7 @@ 'base/cocoa/events_mac_unittest.mm', 'base/cocoa/focus_tracker_unittest.mm', 'base/dialogs/select_file_dialog_win_unittest.cc', + 'base/events/event_dispatcher_unittest.cc', 'base/events/event_unittest.cc', 'base/gtk/gtk_expanded_container_unittest.cc', 'base/gtk/gtk_im_context_util_unittest.cc', |