| 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.default_prevented()); |
| 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.default_prevented()); |
| 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.default_prevented()); |
| 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.default_prevented()); |
| 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 |