OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/base/events/event_dispatcher.h" | 5 #include "ui/base/events/event_dispatcher.h" |
6 | 6 |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 | 8 |
9 namespace ui { | 9 namespace ui { |
10 | 10 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 parent.AddPostTargetHandler(&h8); | 195 parent.AddPostTargetHandler(&h8); |
196 | 196 |
197 h5.set_expect_post_target(true); | 197 h5.set_expect_post_target(true); |
198 h6.set_expect_post_target(true); | 198 h6.set_expect_post_target(true); |
199 h7.set_expect_post_target(true); | 199 h7.set_expect_post_target(true); |
200 h8.set_expect_post_target(true); | 200 h8.set_expect_post_target(true); |
201 | 201 |
202 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), | 202 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), |
203 gfx::Point(3, 4), 0); | 203 gfx::Point(3, 4), 0); |
204 Event::DispatcherApi event_mod(&mouse); | 204 Event::DispatcherApi event_mod(&mouse); |
205 int result = dispatcher.ProcessEvent(&child, &mouse); | 205 dispatcher.ProcessEvent(&child, &mouse); |
206 EXPECT_FALSE(result & ER_CONSUMED); | 206 EXPECT_FALSE(mouse.stopped_propagation()); |
207 EXPECT_FALSE(result & ER_HANDLED); | 207 EXPECT_FALSE(mouse.handled()); |
208 | 208 |
209 int expected[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; | 209 int expected[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; |
210 EXPECT_EQ( | 210 EXPECT_EQ( |
211 std::vector<int>(expected, expected + sizeof(expected) / sizeof(int)), | 211 std::vector<int>(expected, expected + sizeof(expected) / sizeof(int)), |
212 child.handler_list()); | 212 child.handler_list()); |
213 | 213 |
214 child.Reset(); | 214 child.Reset(); |
215 event_mod.set_phase(EP_PREDISPATCH); | 215 event_mod.set_phase(EP_PREDISPATCH); |
216 event_mod.set_result(ER_UNHANDLED); | 216 event_mod.set_result(ER_UNHANDLED); |
217 | 217 |
218 h1.set_event_result(ER_HANDLED); | 218 h1.set_event_result(ER_HANDLED); |
219 result = dispatcher.ProcessEvent(&child, &mouse); | 219 dispatcher.ProcessEvent(&child, &mouse); |
220 EXPECT_EQ(result, mouse.result()); | |
221 EXPECT_EQ(EP_POSTDISPATCH, mouse.phase()); | 220 EXPECT_EQ(EP_POSTDISPATCH, mouse.phase()); |
222 EXPECT_FALSE(result & ER_CONSUMED); | 221 EXPECT_FALSE(mouse.stopped_propagation()); |
223 EXPECT_TRUE(result & ER_HANDLED); | 222 EXPECT_TRUE(mouse.handled()); |
224 EXPECT_EQ( | 223 EXPECT_EQ( |
225 std::vector<int>(expected, expected + sizeof(expected) / sizeof(int)), | 224 std::vector<int>(expected, expected + sizeof(expected) / sizeof(int)), |
226 child.handler_list()); | 225 child.handler_list()); |
227 | 226 |
228 child.Reset(); | 227 child.Reset(); |
229 event_mod.set_phase(EP_PREDISPATCH); | 228 event_mod.set_phase(EP_PREDISPATCH); |
230 event_mod.set_result(ER_UNHANDLED); | 229 event_mod.set_result(ER_UNHANDLED); |
231 | 230 |
232 int nexpected[] = { 1, 2, 3, 4, 5 }; | 231 int nexpected[] = { 1, 2, 3, 4, 5 }; |
233 h5.set_event_result(ER_CONSUMED); | 232 h5.set_event_result(ER_CONSUMED); |
234 result = dispatcher.ProcessEvent(&child, &mouse); | 233 dispatcher.ProcessEvent(&child, &mouse); |
235 EXPECT_EQ(result, mouse.result()); | |
236 EXPECT_EQ(EP_POSTDISPATCH, mouse.phase()); | 234 EXPECT_EQ(EP_POSTDISPATCH, mouse.phase()); |
237 EXPECT_TRUE(result & ER_CONSUMED); | 235 EXPECT_TRUE(mouse.stopped_propagation()); |
238 EXPECT_TRUE(result & ER_HANDLED); | 236 EXPECT_TRUE(mouse.handled()); |
239 EXPECT_EQ( | 237 EXPECT_EQ( |
240 std::vector<int>(nexpected, nexpected + sizeof(nexpected) / sizeof(int)), | 238 std::vector<int>(nexpected, nexpected + sizeof(nexpected) / sizeof(int)), |
241 child.handler_list()); | 239 child.handler_list()); |
242 | 240 |
243 child.Reset(); | 241 child.Reset(); |
244 event_mod.set_phase(EP_PREDISPATCH); | 242 event_mod.set_phase(EP_PREDISPATCH); |
245 event_mod.set_result(ER_UNHANDLED); | 243 event_mod.set_result(ER_UNHANDLED); |
246 | 244 |
247 int exp[] = { 1 }; | 245 int exp[] = { 1 }; |
248 h1.set_event_result(ER_CONSUMED); | 246 h1.set_event_result(ER_CONSUMED); |
249 result = dispatcher.ProcessEvent(&child, &mouse); | 247 dispatcher.ProcessEvent(&child, &mouse); |
250 EXPECT_EQ(EP_POSTDISPATCH, mouse.phase()); | 248 EXPECT_EQ(EP_POSTDISPATCH, mouse.phase()); |
251 EXPECT_EQ(result, mouse.result()); | 249 EXPECT_TRUE(mouse.stopped_propagation()); |
252 EXPECT_TRUE(result & ER_CONSUMED); | 250 EXPECT_TRUE(mouse.handled()); |
253 EXPECT_FALSE(result & ER_HANDLED); | |
254 EXPECT_EQ( | 251 EXPECT_EQ( |
255 std::vector<int>(exp, exp + sizeof(exp) / sizeof(int)), | 252 std::vector<int>(exp, exp + sizeof(exp) / sizeof(int)), |
256 child.handler_list()); | 253 child.handler_list()); |
257 } | 254 } |
258 | 255 |
259 // Tests that the event-phases are correct. | 256 // Tests that the event-phases are correct. |
260 TEST(EventDispatcherTest, EventDispatchPhase) { | 257 TEST(EventDispatcherTest, EventDispatchPhase) { |
261 TestEventDispatcher dispatcher; | 258 TestEventDispatcher dispatcher; |
262 TestTarget target; | 259 TestTarget target; |
263 | 260 |
264 TestEventHandler handler(11); | 261 TestEventHandler handler(11); |
265 | 262 |
266 target.AddPreTargetHandler(&handler); | 263 target.AddPreTargetHandler(&handler); |
267 target.AddPostTargetHandler(&handler); | 264 target.AddPostTargetHandler(&handler); |
268 handler.set_expect_pre_target(true); | 265 handler.set_expect_pre_target(true); |
269 handler.set_expect_post_target(true); | 266 handler.set_expect_post_target(true); |
270 | 267 |
271 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), | 268 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), |
272 gfx::Point(3, 4), 0); | 269 gfx::Point(3, 4), 0); |
273 Event::DispatcherApi event_mod(&mouse); | 270 Event::DispatcherApi event_mod(&mouse); |
274 int result = dispatcher.ProcessEvent(&target, &mouse); | 271 dispatcher.ProcessEvent(&target, &mouse); |
275 EXPECT_EQ(ER_UNHANDLED, result); | 272 EXPECT_EQ(ER_UNHANDLED, mouse.result()); |
276 | 273 |
277 int handlers[] = { 11, 11 }; | 274 int handlers[] = { 11, 11 }; |
278 EXPECT_EQ( | 275 EXPECT_EQ( |
279 std::vector<int>(handlers, handlers + sizeof(handlers) / sizeof(int)), | 276 std::vector<int>(handlers, handlers + sizeof(handlers) / sizeof(int)), |
280 target.handler_list()); | 277 target.handler_list()); |
281 } | 278 } |
282 | 279 |
283 // Tests that if the dispatcher is destroyed in the middle of pre or post-target | 280 // Tests that if the dispatcher is destroyed in the middle of pre or post-target |
284 // dispatching events, it doesn't cause a crash. | 281 // dispatching events, it doesn't cause a crash. |
285 TEST(EventDispatcherTest, EventDispatcherDestroyTarget) { | 282 TEST(EventDispatcherTest, EventDispatcherDestroyTarget) { |
(...skipping 10 matching lines...) Expand all Loading... |
296 | 293 |
297 h1.set_expect_pre_target(true); | 294 h1.set_expect_pre_target(true); |
298 handler.set_expect_pre_target(true); | 295 handler.set_expect_pre_target(true); |
299 // |h2| should not receive any events at all since |handler| will have | 296 // |h2| should not receive any events at all since |handler| will have |
300 // destroyed the dispatcher. | 297 // destroyed the dispatcher. |
301 h2.set_expect_pre_target(false); | 298 h2.set_expect_pre_target(false); |
302 | 299 |
303 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), | 300 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), |
304 gfx::Point(3, 4), 0); | 301 gfx::Point(3, 4), 0); |
305 Event::DispatcherApi event_mod(&mouse); | 302 Event::DispatcherApi event_mod(&mouse); |
306 int result = dispatcher->ProcessEvent(&target, &mouse); | 303 dispatcher->ProcessEvent(&target, &mouse); |
307 EXPECT_EQ(ER_CONSUMED, result); | 304 EXPECT_EQ(ER_CONSUMED, mouse.result()); |
308 EXPECT_EQ(2U, target.handler_list().size()); | 305 EXPECT_EQ(2U, target.handler_list().size()); |
309 EXPECT_EQ(1, target.handler_list()[0]); | 306 EXPECT_EQ(1, target.handler_list()[0]); |
310 EXPECT_EQ(5, target.handler_list()[1]); | 307 EXPECT_EQ(5, target.handler_list()[1]); |
311 } | 308 } |
312 | 309 |
313 // Now test for post-target. | 310 // Now test for post-target. |
314 { | 311 { |
315 TestEventDispatcher* dispatcher = new TestEventDispatcher(); | 312 TestEventDispatcher* dispatcher = new TestEventDispatcher(); |
316 TestTarget target; | 313 TestTarget target; |
317 EventHandlerDestroyDispatcher handler(dispatcher, 5); | 314 EventHandlerDestroyDispatcher handler(dispatcher, 5); |
318 TestEventHandler h1(1), h2(2); | 315 TestEventHandler h1(1), h2(2); |
319 | 316 |
320 target.AddPostTargetHandler(&h1); | 317 target.AddPostTargetHandler(&h1); |
321 target.AddPostTargetHandler(&handler); | 318 target.AddPostTargetHandler(&handler); |
322 target.AddPostTargetHandler(&h2); | 319 target.AddPostTargetHandler(&h2); |
323 | 320 |
324 h1.set_expect_post_target(true); | 321 h1.set_expect_post_target(true); |
325 handler.set_expect_post_target(true); | 322 handler.set_expect_post_target(true); |
326 // |h2| should not receive any events at all since |handler| will have | 323 // |h2| should not receive any events at all since |handler| will have |
327 // destroyed the dispatcher. | 324 // destroyed the dispatcher. |
328 h2.set_expect_post_target(false); | 325 h2.set_expect_post_target(false); |
329 | 326 |
330 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), | 327 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), |
331 gfx::Point(3, 4), 0); | 328 gfx::Point(3, 4), 0); |
332 Event::DispatcherApi event_mod(&mouse); | 329 Event::DispatcherApi event_mod(&mouse); |
333 int result = dispatcher->ProcessEvent(&target, &mouse); | 330 dispatcher->ProcessEvent(&target, &mouse); |
334 EXPECT_EQ(ER_CONSUMED, result); | 331 EXPECT_EQ(ER_CONSUMED, mouse.result()); |
335 EXPECT_EQ(2U, target.handler_list().size()); | 332 EXPECT_EQ(2U, target.handler_list().size()); |
336 EXPECT_EQ(1, target.handler_list()[0]); | 333 EXPECT_EQ(1, target.handler_list()[0]); |
337 EXPECT_EQ(5, target.handler_list()[1]); | 334 EXPECT_EQ(5, target.handler_list()[1]); |
338 } | 335 } |
339 } | 336 } |
340 | 337 |
341 // Tests that a target becoming invalid in the middle of pre- or post-target | 338 // Tests that a target becoming invalid in the middle of pre- or post-target |
342 // event processing aborts processing. | 339 // event processing aborts processing. |
343 TEST(EventDispatcherTest, EventDispatcherInvalidateTarget) { | 340 TEST(EventDispatcherTest, EventDispatcherInvalidateTarget) { |
344 TestEventDispatcher dispatcher; | 341 TestEventDispatcher dispatcher; |
345 TestTarget target; | 342 TestTarget target; |
346 TestEventHandler h1(1); | 343 TestEventHandler h1(1); |
347 InvalidateTargetEventHandler invalidate_handler(2); | 344 InvalidateTargetEventHandler invalidate_handler(2); |
348 TestEventHandler h3(3); | 345 TestEventHandler h3(3); |
349 | 346 |
350 target.AddPreTargetHandler(&h1); | 347 target.AddPreTargetHandler(&h1); |
351 target.AddPreTargetHandler(&invalidate_handler); | 348 target.AddPreTargetHandler(&invalidate_handler); |
352 target.AddPreTargetHandler(&h3); | 349 target.AddPreTargetHandler(&h3); |
353 | 350 |
354 h1.set_expect_pre_target(true); | 351 h1.set_expect_pre_target(true); |
355 invalidate_handler.set_expect_pre_target(true); | 352 invalidate_handler.set_expect_pre_target(true); |
356 // |h3| should not receive events as the target will be invalidated. | 353 // |h3| should not receive events as the target will be invalidated. |
357 h3.set_expect_pre_target(false); | 354 h3.set_expect_pre_target(false); |
358 | 355 |
359 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), gfx::Point(3, 4), 0); | 356 MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(3, 4), gfx::Point(3, 4), 0); |
360 int result = dispatcher.ProcessEvent(&target, &mouse); | 357 dispatcher.ProcessEvent(&target, &mouse); |
361 EXPECT_FALSE(target.valid()); | 358 EXPECT_FALSE(target.valid()); |
362 EXPECT_EQ(ER_CONSUMED, result); | 359 EXPECT_TRUE(mouse.stopped_propagation()); |
363 EXPECT_EQ(2U, target.handler_list().size()); | 360 EXPECT_EQ(2U, target.handler_list().size()); |
364 EXPECT_EQ(1, target.handler_list()[0]); | 361 EXPECT_EQ(1, target.handler_list()[0]); |
365 EXPECT_EQ(2, target.handler_list()[1]); | 362 EXPECT_EQ(2, target.handler_list()[1]); |
366 } | 363 } |
367 | 364 |
368 } // namespace ui | 365 } // namespace ui |
OLD | NEW |