1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/events/event.h"
9 #include "ui/events/event_target_iterator.h"
10 #include "ui/events/event_targeter.h"
11 #include "ui/events/event_utils.h"
12 #include "ui/events/test/events_test_utils.h"
13 #include "ui/events/test/test_event_handler.h"
14 #include "ui/events/test/test_event_processor.h"
15 #include "ui/events/test/test_event_target.h"
16 #include "ui/events/test/test_event_targeter.h"
18 typedef std::vector
<std::string
> HandlerSequenceRecorder
;
23 class EventProcessorTest
: public testing::Test
{
25 EventProcessorTest() {}
26 ~EventProcessorTest() override
{}
30 void SetUp() override
{
31 processor_
.SetRoot(make_scoped_ptr(new TestEventTarget()));
33 root()->SetEventTargeter(
34 make_scoped_ptr(new TestEventTargeter(root(), false)));
37 TestEventTarget
* root() {
38 return static_cast<TestEventTarget
*>(processor_
.GetRootTarget());
41 TestEventProcessor
* processor() {
45 void DispatchEvent(Event
* event
) {
46 processor_
.OnEventFromSource(event
);
49 void SetTarget(TestEventTarget
* target
) {
50 static_cast<TestEventTargeter
*>(root()->GetEventTargeter())
55 TestEventProcessor processor_
;
57 DISALLOW_COPY_AND_ASSIGN(EventProcessorTest
);
60 TEST_F(EventProcessorTest
, Basic
) {
61 scoped_ptr
<TestEventTarget
> child(new TestEventTarget());
62 child
->SetEventTargeter(
63 make_scoped_ptr(new TestEventTargeter(child
.get(), false)));
64 SetTarget(child
.get());
65 root()->AddChild(child
.Pass());
67 MouseEvent
mouse(ET_MOUSE_MOVED
, gfx::Point(10, 10), gfx::Point(10, 10),
68 EventTimeForNow(), EF_NONE
, EF_NONE
);
69 DispatchEvent(&mouse
);
70 EXPECT_TRUE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
71 EXPECT_FALSE(root()->DidReceiveEvent(ET_MOUSE_MOVED
));
74 root()->RemoveChild(root()->child_at(0));
75 DispatchEvent(&mouse
);
76 EXPECT_TRUE(root()->DidReceiveEvent(ET_MOUSE_MOVED
));
79 // ReDispatchEventHandler is used to receive mouse events and forward them
80 // to a specified EventProcessor. Verifies that the event has the correct
81 // target and phase both before and after the nested event processing. Also
82 // verifies that the location of the event remains the same after it has
83 // been processed by the second EventProcessor.
84 class ReDispatchEventHandler
: public TestEventHandler
{
86 ReDispatchEventHandler(EventProcessor
* processor
, EventTarget
* target
)
87 : processor_(processor
), expected_target_(target
) {}
88 ~ReDispatchEventHandler() override
{}
91 void OnMouseEvent(MouseEvent
* event
) override
{
92 TestEventHandler::OnMouseEvent(event
);
94 EXPECT_EQ(expected_target_
, event
->target());
95 EXPECT_EQ(EP_TARGET
, event
->phase());
97 gfx::Point
location(event
->location());
98 EventDispatchDetails details
= processor_
->OnEventFromSource(event
);
99 EXPECT_FALSE(details
.dispatcher_destroyed
);
100 EXPECT_FALSE(details
.target_destroyed
);
102 // The nested event-processing should not have mutated the target,
103 // phase, or location of |event|.
104 EXPECT_EQ(expected_target_
, event
->target());
105 EXPECT_EQ(EP_TARGET
, event
->phase());
106 EXPECT_EQ(location
, event
->location());
110 EventProcessor
* processor_
;
111 EventTarget
* expected_target_
;
113 DISALLOW_COPY_AND_ASSIGN(ReDispatchEventHandler
);
116 // Verifies that the phase and target information of an event is not mutated
117 // as a result of sending the event to an event processor while it is still
118 // being processed by another event processor.
119 TEST_F(EventProcessorTest
, NestedEventProcessing
) {
120 // Add one child to the default event processor used in this test suite.
121 scoped_ptr
<TestEventTarget
> child(new TestEventTarget());
122 SetTarget(child
.get());
123 root()->AddChild(child
.Pass());
125 // Define a second root target and child.
126 scoped_ptr
<EventTarget
> second_root_scoped(new TestEventTarget());
127 TestEventTarget
* second_root
=
128 static_cast<TestEventTarget
*>(second_root_scoped
.get());
129 scoped_ptr
<TestEventTarget
> second_child(new TestEventTarget());
130 second_root
->SetEventTargeter(
131 make_scoped_ptr(new TestEventTargeter(second_child
.get(), false)));
132 second_root
->AddChild(second_child
.Pass());
134 // Define a second event processor which owns the second root.
135 scoped_ptr
<TestEventProcessor
> second_processor(new TestEventProcessor());
136 second_processor
->SetRoot(second_root_scoped
.Pass());
138 // Indicate that an event which is dispatched to the child target owned by the
139 // first event processor should be handled by |target_handler| instead.
140 scoped_ptr
<TestEventHandler
> target_handler(
141 new ReDispatchEventHandler(second_processor
.get(), root()->child_at(0)));
142 root()->child_at(0)->set_target_handler(target_handler
.get());
144 // Dispatch a mouse event to the tree of event targets owned by the first
145 // event processor, checking in ReDispatchEventHandler that the phase and
146 // target information of the event is correct.
147 MouseEvent
mouse(ET_MOUSE_MOVED
, gfx::Point(10, 10), gfx::Point(10, 10),
148 EventTimeForNow(), EF_NONE
, EF_NONE
);
149 DispatchEvent(&mouse
);
151 // Verify also that |mouse| was seen by the child nodes contained in both
152 // event processors and that the event was not handled.
153 EXPECT_TRUE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
154 EXPECT_TRUE(second_root
->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
155 EXPECT_FALSE(mouse
.handled());
156 second_root
->child_at(0)->ResetReceivedEvents();
157 root()->child_at(0)->ResetReceivedEvents();
159 // Indicate that the child of the second root should handle events, and
160 // dispatch another mouse event to verify that it is marked as handled.
161 second_root
->child_at(0)->set_mark_events_as_handled(true);
162 MouseEvent
mouse2(ET_MOUSE_MOVED
, gfx::Point(10, 10), gfx::Point(10, 10),
163 EventTimeForNow(), EF_NONE
, EF_NONE
);
164 DispatchEvent(&mouse2
);
165 EXPECT_TRUE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
166 EXPECT_TRUE(second_root
->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
167 EXPECT_TRUE(mouse2
.handled());
170 // Verifies that OnEventProcessingFinished() is called when an event
172 TEST_F(EventProcessorTest
, OnEventProcessingFinished
) {
173 scoped_ptr
<TestEventTarget
> child(new TestEventTarget());
174 child
->set_mark_events_as_handled(true);
175 SetTarget(child
.get());
176 root()->AddChild(child
.Pass());
178 // Dispatch a mouse event. We expect the event to be seen by the target,
179 // handled, and we expect OnEventProcessingFinished() to be invoked once.
180 MouseEvent
mouse(ET_MOUSE_MOVED
, gfx::Point(10, 10), gfx::Point(10, 10),
181 EventTimeForNow(), EF_NONE
, EF_NONE
);
182 DispatchEvent(&mouse
);
183 EXPECT_TRUE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
184 EXPECT_FALSE(root()->DidReceiveEvent(ET_MOUSE_MOVED
));
185 EXPECT_TRUE(mouse
.handled());
186 EXPECT_EQ(1, processor()->num_times_processing_finished());
189 // Verifies that OnEventProcessingStarted() has been called when starting to
190 // process an event, and that processing does not take place if
191 // OnEventProcessingStarted() marks the event as handled. Also verifies that
192 // OnEventProcessingFinished() is also called in either case.
193 TEST_F(EventProcessorTest
, OnEventProcessingStarted
) {
194 scoped_ptr
<TestEventTarget
> child(new TestEventTarget());
195 SetTarget(child
.get());
196 root()->AddChild(child
.Pass());
198 // Dispatch a mouse event. We expect the event to be seen by the target,
199 // OnEventProcessingStarted() should be called once, and
200 // OnEventProcessingFinished() should be called once. The event should
202 MouseEvent
mouse(ET_MOUSE_MOVED
, gfx::Point(10, 10), gfx::Point(10, 10),
203 EventTimeForNow(), EF_NONE
, EF_NONE
);
204 DispatchEvent(&mouse
);
205 EXPECT_TRUE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
206 EXPECT_FALSE(root()->DidReceiveEvent(ET_MOUSE_MOVED
));
207 EXPECT_FALSE(mouse
.handled());
208 EXPECT_EQ(1, processor()->num_times_processing_started());
209 EXPECT_EQ(1, processor()->num_times_processing_finished());
210 processor()->Reset();
211 root()->ResetReceivedEvents();
212 root()->child_at(0)->ResetReceivedEvents();
214 // Dispatch another mouse event, but with OnEventProcessingStarted() marking
215 // the event as handled to prevent processing. We expect the event to not be
216 // seen by the target this time, but OnEventProcessingStarted() and
217 // OnEventProcessingFinished() should both still be called once.
218 processor()->set_should_processing_occur(false);
219 MouseEvent
mouse2(ET_MOUSE_MOVED
, gfx::Point(10, 10), gfx::Point(10, 10),
220 EventTimeForNow(), EF_NONE
, EF_NONE
);
221 DispatchEvent(&mouse2
);
222 EXPECT_FALSE(root()->child_at(0)->DidReceiveEvent(ET_MOUSE_MOVED
));
223 EXPECT_FALSE(root()->DidReceiveEvent(ET_MOUSE_MOVED
));
224 EXPECT_TRUE(mouse2
.handled());
225 EXPECT_EQ(1, processor()->num_times_processing_started());
226 EXPECT_EQ(1, processor()->num_times_processing_finished());
229 // Tests that unhandled events are correctly dispatched to the next-best
230 // target as decided by the TestEventTargeter.
231 TEST_F(EventProcessorTest
, DispatchToNextBestTarget
) {
232 scoped_ptr
<TestEventTarget
> child(new TestEventTarget());
233 scoped_ptr
<TestEventTarget
> grandchild(new TestEventTarget());
235 // Install a TestEventTargeter which permits bubbling.
236 root()->SetEventTargeter(
237 make_scoped_ptr(new TestEventTargeter(grandchild
.get(), true)));
238 child
->AddChild(grandchild
.Pass());
239 root()->AddChild(child
.Pass());
241 ASSERT_EQ(1u, root()->child_count());
242 ASSERT_EQ(1u, root()->child_at(0)->child_count());
243 ASSERT_EQ(0u, root()->child_at(0)->child_at(0)->child_count());
245 TestEventTarget
* child_r
= root()->child_at(0);
246 TestEventTarget
* grandchild_r
= child_r
->child_at(0);
248 // When the root has a TestEventTargeter installed which permits bubbling,
249 // events targeted at the grandchild target should be dispatched to all three
251 KeyEvent
key_event(ET_KEY_PRESSED
, VKEY_ESCAPE
, EF_NONE
);
252 DispatchEvent(&key_event
);
253 EXPECT_TRUE(root()->DidReceiveEvent(ET_KEY_PRESSED
));
254 EXPECT_TRUE(child_r
->DidReceiveEvent(ET_KEY_PRESSED
));
255 EXPECT_TRUE(grandchild_r
->DidReceiveEvent(ET_KEY_PRESSED
));
256 root()->ResetReceivedEvents();
257 child_r
->ResetReceivedEvents();
258 grandchild_r
->ResetReceivedEvents();
260 // Add a pre-target handler on the child of the root that will mark the event
261 // as handled. No targets in the hierarchy should receive the event.
262 TestEventHandler handler
;
263 child_r
->AddPreTargetHandler(&handler
);
264 key_event
= KeyEvent(ET_KEY_PRESSED
, VKEY_ESCAPE
, EF_NONE
);
265 DispatchEvent(&key_event
);
266 EXPECT_FALSE(root()->DidReceiveEvent(ET_KEY_PRESSED
));
267 EXPECT_FALSE(child_r
->DidReceiveEvent(ET_KEY_PRESSED
));
268 EXPECT_FALSE(grandchild_r
->DidReceiveEvent(ET_KEY_PRESSED
));
269 EXPECT_EQ(1, handler
.num_key_events());
272 // Add a post-target handler on the child of the root that will mark the event
273 // as handled. Only the grandchild (the initial target) should receive the
275 child_r
->RemovePreTargetHandler(&handler
);
276 child_r
->AddPostTargetHandler(&handler
);
277 key_event
= KeyEvent(ET_KEY_PRESSED
, VKEY_ESCAPE
, EF_NONE
);
278 DispatchEvent(&key_event
);
279 EXPECT_FALSE(root()->DidReceiveEvent(ET_KEY_PRESSED
));
280 EXPECT_FALSE(child_r
->DidReceiveEvent(ET_KEY_PRESSED
));
281 EXPECT_TRUE(grandchild_r
->DidReceiveEvent(ET_KEY_PRESSED
));
282 EXPECT_EQ(1, handler
.num_key_events());
284 grandchild_r
->ResetReceivedEvents();
285 child_r
->RemovePostTargetHandler(&handler
);
287 // Mark the event as handled when it reaches the EP_TARGET phase of
288 // dispatch at the child of the root. The child and grandchild
289 // targets should both receive the event, but the root should not.
290 child_r
->set_mark_events_as_handled(true);
291 key_event
= KeyEvent(ET_KEY_PRESSED
, VKEY_ESCAPE
, EF_NONE
);
292 DispatchEvent(&key_event
);
293 EXPECT_FALSE(root()->DidReceiveEvent(ET_KEY_PRESSED
));
294 EXPECT_TRUE(child_r
->DidReceiveEvent(ET_KEY_PRESSED
));
295 EXPECT_TRUE(grandchild_r
->DidReceiveEvent(ET_KEY_PRESSED
));
296 root()->ResetReceivedEvents();
297 child_r
->ResetReceivedEvents();
298 grandchild_r
->ResetReceivedEvents();
299 child_r
->set_mark_events_as_handled(false);
302 // Tests that unhandled events are seen by the correct sequence of
303 // targets, pre-target handlers, and post-target handlers when
304 // a TestEventTargeter is installed on the root target which permits bubbling.
305 TEST_F(EventProcessorTest
, HandlerSequence
) {
306 scoped_ptr
<TestEventTarget
> child(new TestEventTarget());
307 scoped_ptr
<TestEventTarget
> grandchild(new TestEventTarget());
309 // Install a TestEventTargeter which permits bubbling.
310 root()->SetEventTargeter(
311 make_scoped_ptr(new TestEventTargeter(grandchild
.get(), true)));
312 child
->AddChild(grandchild
.Pass());
313 root()->AddChild(child
.Pass());
315 ASSERT_EQ(1u, root()->child_count());
316 ASSERT_EQ(1u, root()->child_at(0)->child_count());
317 ASSERT_EQ(0u, root()->child_at(0)->child_at(0)->child_count());
319 TestEventTarget
* child_r
= root()->child_at(0);
320 TestEventTarget
* grandchild_r
= child_r
->child_at(0);
322 HandlerSequenceRecorder recorder
;
323 root()->set_target_name("R");
324 root()->set_recorder(&recorder
);
325 child_r
->set_target_name("C");
326 child_r
->set_recorder(&recorder
);
327 grandchild_r
->set_target_name("G");
328 grandchild_r
->set_recorder(&recorder
);
330 TestEventHandler pre_root
;
331 pre_root
.set_handler_name("PreR");
332 pre_root
.set_recorder(&recorder
);
333 root()->AddPreTargetHandler(&pre_root
);
335 TestEventHandler pre_child
;
336 pre_child
.set_handler_name("PreC");
337 pre_child
.set_recorder(&recorder
);
338 child_r
->AddPreTargetHandler(&pre_child
);
340 TestEventHandler pre_grandchild
;
341 pre_grandchild
.set_handler_name("PreG");
342 pre_grandchild
.set_recorder(&recorder
);
343 grandchild_r
->AddPreTargetHandler(&pre_grandchild
);
345 TestEventHandler post_root
;
346 post_root
.set_handler_name("PostR");
347 post_root
.set_recorder(&recorder
);
348 root()->AddPostTargetHandler(&post_root
);
350 TestEventHandler post_child
;
351 post_child
.set_handler_name("PostC");
352 post_child
.set_recorder(&recorder
);
353 child_r
->AddPostTargetHandler(&post_child
);
355 TestEventHandler post_grandchild
;
356 post_grandchild
.set_handler_name("PostG");
357 post_grandchild
.set_recorder(&recorder
);
358 grandchild_r
->AddPostTargetHandler(&post_grandchild
);
360 MouseEvent
mouse(ET_MOUSE_MOVED
, gfx::Point(10, 10), gfx::Point(10, 10),
361 EventTimeForNow(), EF_NONE
, EF_NONE
);
362 DispatchEvent(&mouse
);
364 std::string expected
[] = { "PreR", "PreC", "PreG", "G", "PostG", "PostC",
365 "PostR", "PreR", "PreC", "C", "PostC", "PostR", "PreR", "R", "PostR" };
366 EXPECT_EQ(std::vector
<std::string
>(
367 expected
, expected
+ arraysize(expected
)), recorder
);