| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "content/browser/renderer_host/input/gesture_event_filter.h" | 8 #include "content/browser/renderer_host/input/gesture_event_filter.h" |
| 9 #include "content/browser/renderer_host/input/immediate_input_router.h" | 9 #include "content/browser/renderer_host/input/immediate_input_router.h" |
| 10 #include "content/browser/renderer_host/input/input_router_client.h" | 10 #include "content/browser/renderer_host/input/input_router_client.h" |
| 11 #include "content/browser/renderer_host/input/input_router_unittest.h" |
| 12 #include "content/browser/renderer_host/input/mock_input_router_client.h" |
| 11 #include "content/common/content_constants_internal.h" | 13 #include "content/common/content_constants_internal.h" |
| 12 #include "content/common/edit_command.h" | 14 #include "content/common/edit_command.h" |
| 13 #include "content/common/input_messages.h" | 15 #include "content/common/input_messages.h" |
| 14 #include "content/common/view_messages.h" | 16 #include "content/common/view_messages.h" |
| 15 #include "content/public/test/mock_render_process_host.h" | 17 #include "content/public/test/mock_render_process_host.h" |
| 16 #include "content/public/test/test_browser_context.h" | 18 #include "content/public/test/test_browser_context.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #include "ui/base/keycodes/keyboard_codes.h" | 20 #include "ui/base/keycodes/keyboard_codes.h" |
| 19 | 21 |
| 20 #if defined(OS_WIN) || defined(USE_AURA) | 22 #if defined(OS_WIN) || defined(USE_AURA) |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 if (!equivalent) | 95 if (!equivalent) |
| 94 return false; | 96 return false; |
| 95 } | 97 } |
| 96 | 98 |
| 97 return true; | 99 return true; |
| 98 } | 100 } |
| 99 #endif // defined(OS_WIN) || defined(USE_AURA) | 101 #endif // defined(OS_WIN) || defined(USE_AURA) |
| 100 | 102 |
| 101 } // namespace | 103 } // namespace |
| 102 | 104 |
| 103 class MockInputRouterClient : public InputRouterClient { | 105 class ImmediateInputRouterTest : public InputRouterTest { |
| 104 public: | 106 public: |
| 105 MockInputRouterClient() | 107 ImmediateInputRouterTest() {} |
| 106 : input_router_(NULL), | 108 virtual ~ImmediateInputRouterTest() {} |
| 107 in_flight_event_count_(0), | 109 |
| 108 has_touch_handler_(false), | 110 protected: |
| 109 ack_count_(0), | 111 // InputRouterTest |
| 110 unexpected_event_ack_called_(false), | 112 virtual scoped_ptr<InputRouter> CreateInputRouter(RenderProcessHost* process, |
| 111 ack_state_(INPUT_EVENT_ACK_STATE_UNKNOWN), | 113 InputRouterClient* client, |
| 112 filter_state_(INPUT_EVENT_ACK_STATE_NOT_CONSUMED), | 114 InputAckHandler* handler, |
| 113 is_shortcut_(false), | 115 int routing_id) OVERRIDE { |
| 114 allow_send_key_event_(true), | 116 return scoped_ptr<InputRouter>( |
| 115 send_called_(false), | 117 new ImmediateInputRouter(process, client, handler, routing_id)); |
| 116 send_immediately_called_(false) { | |
| 117 } | |
| 118 virtual ~MockInputRouterClient() { | |
| 119 } | 118 } |
| 120 | 119 |
| 121 // InputRouterClient | 120 void SendInputEventACK(WebKit::WebInputEvent::Type type, |
| 122 virtual InputEventAckState FilterInputEvent( | |
| 123 const WebInputEvent& input_event, | |
| 124 const ui::LatencyInfo& latency_info) OVERRIDE { | |
| 125 return filter_state_; | |
| 126 } | |
| 127 | |
| 128 // Called each time a WebInputEvent IPC is sent. | |
| 129 virtual void IncrementInFlightEventCount() OVERRIDE { | |
| 130 ++in_flight_event_count_; | |
| 131 } | |
| 132 | |
| 133 // Called each time a WebInputEvent ACK IPC is received. | |
| 134 virtual void DecrementInFlightEventCount() OVERRIDE { | |
| 135 --in_flight_event_count_; | |
| 136 } | |
| 137 | |
| 138 // Called when the renderer notifies that it has touch event handlers. | |
| 139 virtual void OnHasTouchEventHandlers(bool has_handlers) OVERRIDE { | |
| 140 has_touch_handler_ = has_handlers; | |
| 141 } | |
| 142 | |
| 143 virtual bool OnSendKeyboardEvent( | |
| 144 const NativeWebKeyboardEvent& key_event, | |
| 145 const ui::LatencyInfo& latency_info, | |
| 146 bool* is_shortcut) OVERRIDE { | |
| 147 send_called_ = true; | |
| 148 sent_key_event_ = key_event; | |
| 149 *is_shortcut = is_shortcut_; | |
| 150 | |
| 151 return allow_send_key_event_; | |
| 152 } | |
| 153 | |
| 154 virtual bool OnSendWheelEvent( | |
| 155 const MouseWheelEventWithLatencyInfo& wheel_event) OVERRIDE { | |
| 156 send_called_ = true; | |
| 157 sent_wheel_event_ = wheel_event; | |
| 158 | |
| 159 return true; | |
| 160 } | |
| 161 | |
| 162 virtual bool OnSendMouseEvent( | |
| 163 const MouseEventWithLatencyInfo& mouse_event) OVERRIDE { | |
| 164 send_called_ = true; | |
| 165 sent_mouse_event_ = mouse_event; | |
| 166 | |
| 167 return true; | |
| 168 } | |
| 169 | |
| 170 virtual bool OnSendTouchEvent( | |
| 171 const TouchEventWithLatencyInfo& touch_event) OVERRIDE { | |
| 172 send_called_ = true; | |
| 173 sent_touch_event_ = touch_event; | |
| 174 | |
| 175 return true; | |
| 176 } | |
| 177 | |
| 178 virtual bool OnSendGestureEvent( | |
| 179 const GestureEventWithLatencyInfo& gesture_event) OVERRIDE { | |
| 180 send_called_ = true; | |
| 181 sent_gesture_event_ = gesture_event; | |
| 182 | |
| 183 return input_router_->ShouldForwardGestureEvent(gesture_event); | |
| 184 } | |
| 185 | |
| 186 virtual bool OnSendMouseEventImmediately( | |
| 187 const MouseEventWithLatencyInfo& mouse_event) OVERRIDE { | |
| 188 send_immediately_called_ = true; | |
| 189 immediately_sent_mouse_event_ = mouse_event; | |
| 190 | |
| 191 return true; | |
| 192 } | |
| 193 | |
| 194 virtual bool OnSendTouchEventImmediately( | |
| 195 const TouchEventWithLatencyInfo& touch_event) OVERRIDE { | |
| 196 send_immediately_called_ = true; | |
| 197 immediately_sent_touch_event_ = touch_event; | |
| 198 | |
| 199 return true; | |
| 200 } | |
| 201 | |
| 202 virtual bool OnSendGestureEventImmediately( | |
| 203 const GestureEventWithLatencyInfo& gesture_event) OVERRIDE { | |
| 204 send_immediately_called_ = true; | |
| 205 immediately_sent_gesture_event_ = gesture_event; | |
| 206 | |
| 207 return true; | |
| 208 } | |
| 209 | |
| 210 // Called upon event ack receipt from the renderer. | |
| 211 virtual void OnKeyboardEventAck(const NativeWebKeyboardEvent& event, | |
| 212 InputEventAckState ack_result) OVERRIDE { | |
| 213 VLOG(1) << __FUNCTION__ << " called!"; | |
| 214 acked_key_event_ = event; | |
| 215 RecordAckCalled(ack_result); | |
| 216 } | |
| 217 virtual void OnWheelEventAck(const WebMouseWheelEvent& event, | |
| 218 InputEventAckState ack_result) OVERRIDE { | |
| 219 VLOG(1) << __FUNCTION__ << " called!"; | |
| 220 acked_wheel_event_ = event; | |
| 221 RecordAckCalled(ack_result); | |
| 222 } | |
| 223 virtual void OnTouchEventAck(const TouchEventWithLatencyInfo& event, | |
| 224 InputEventAckState ack_result) OVERRIDE { | |
| 225 VLOG(1) << __FUNCTION__ << " called!"; | |
| 226 acked_touch_event_ = event; | |
| 227 RecordAckCalled(ack_result); | |
| 228 } | |
| 229 virtual void OnGestureEventAck(const WebGestureEvent& event, | |
| 230 InputEventAckState ack_result) OVERRIDE { | |
| 231 VLOG(1) << __FUNCTION__ << " called!"; | |
| 232 RecordAckCalled(ack_result); | |
| 233 } | |
| 234 virtual void OnUnexpectedEventAck(bool bad_message) OVERRIDE { | |
| 235 VLOG(1) << __FUNCTION__ << " called!"; | |
| 236 unexpected_event_ack_called_ = true; | |
| 237 } | |
| 238 | |
| 239 void ExpectSendCalled(bool called) { | |
| 240 EXPECT_EQ(called, send_called_); | |
| 241 send_called_ = false; | |
| 242 } | |
| 243 void ExpectSendImmediatelyCalled(bool called) { | |
| 244 EXPECT_EQ(called, send_immediately_called_); | |
| 245 send_immediately_called_ = false; | |
| 246 } | |
| 247 void ExpectAckCalled(int times) { | |
| 248 EXPECT_EQ(times, ack_count_); | |
| 249 ack_count_ = 0; | |
| 250 } | |
| 251 | |
| 252 void set_input_router(InputRouter* input_router) { | |
| 253 input_router_ = input_router; | |
| 254 } | |
| 255 bool has_touch_handler() const { return has_touch_handler_; } | |
| 256 InputEventAckState ack_state() const { return ack_state_; } | |
| 257 void set_filter_state(InputEventAckState filter_state) { | |
| 258 filter_state_ = filter_state; | |
| 259 } | |
| 260 bool unexpected_event_ack_called() const { | |
| 261 return unexpected_event_ack_called_; | |
| 262 } | |
| 263 const NativeWebKeyboardEvent& acked_keyboard_event() { | |
| 264 return acked_key_event_; | |
| 265 } | |
| 266 const WebMouseWheelEvent& acked_wheel_event() { | |
| 267 return acked_wheel_event_; | |
| 268 } | |
| 269 const TouchEventWithLatencyInfo& acked_touch_event() { | |
| 270 return acked_touch_event_; | |
| 271 } | |
| 272 void set_is_shortcut(bool is_shortcut) { | |
| 273 is_shortcut_ = is_shortcut; | |
| 274 } | |
| 275 void set_allow_send_key_event(bool allow) { | |
| 276 allow_send_key_event_ = allow; | |
| 277 } | |
| 278 const NativeWebKeyboardEvent& sent_key_event() { | |
| 279 return sent_key_event_; | |
| 280 } | |
| 281 const MouseWheelEventWithLatencyInfo& sent_wheel_event() { | |
| 282 return sent_wheel_event_; | |
| 283 } | |
| 284 const MouseEventWithLatencyInfo& sent_mouse_event() { | |
| 285 return sent_mouse_event_; | |
| 286 } | |
| 287 const GestureEventWithLatencyInfo& sent_gesture_event() { | |
| 288 return sent_gesture_event_; | |
| 289 } | |
| 290 const MouseEventWithLatencyInfo& immediately_sent_mouse_event() { | |
| 291 return immediately_sent_mouse_event_; | |
| 292 } | |
| 293 const TouchEventWithLatencyInfo& immediately_sent_touch_event() { | |
| 294 return immediately_sent_touch_event_; | |
| 295 } | |
| 296 const GestureEventWithLatencyInfo& immediately_sent_gesture_event() { | |
| 297 return immediately_sent_gesture_event_; | |
| 298 } | |
| 299 | |
| 300 private: | |
| 301 void RecordAckCalled(InputEventAckState ack_result) { | |
| 302 ++ack_count_; | |
| 303 ack_state_ = ack_result; | |
| 304 } | |
| 305 | |
| 306 InputRouter* input_router_; | |
| 307 int in_flight_event_count_; | |
| 308 bool has_touch_handler_; | |
| 309 | |
| 310 int ack_count_; | |
| 311 bool unexpected_event_ack_called_; | |
| 312 InputEventAckState ack_state_; | |
| 313 InputEventAckState filter_state_; | |
| 314 NativeWebKeyboardEvent acked_key_event_; | |
| 315 WebMouseWheelEvent acked_wheel_event_; | |
| 316 TouchEventWithLatencyInfo acked_touch_event_; | |
| 317 | |
| 318 bool is_shortcut_; | |
| 319 bool allow_send_key_event_; | |
| 320 bool send_called_; | |
| 321 NativeWebKeyboardEvent sent_key_event_; | |
| 322 MouseWheelEventWithLatencyInfo sent_wheel_event_; | |
| 323 MouseEventWithLatencyInfo sent_mouse_event_; | |
| 324 TouchEventWithLatencyInfo sent_touch_event_; | |
| 325 GestureEventWithLatencyInfo sent_gesture_event_; | |
| 326 | |
| 327 bool send_immediately_called_; | |
| 328 MouseEventWithLatencyInfo immediately_sent_mouse_event_; | |
| 329 TouchEventWithLatencyInfo immediately_sent_touch_event_; | |
| 330 GestureEventWithLatencyInfo immediately_sent_gesture_event_; | |
| 331 }; | |
| 332 | |
| 333 class ImmediateInputRouterTest : public testing::Test { | |
| 334 public: | |
| 335 ImmediateInputRouterTest() { | |
| 336 } | |
| 337 virtual ~ImmediateInputRouterTest() { | |
| 338 } | |
| 339 | |
| 340 protected: | |
| 341 // testing::Test | |
| 342 virtual void SetUp() { | |
| 343 browser_context_.reset(new TestBrowserContext()); | |
| 344 process_.reset(new MockRenderProcessHost(browser_context_.get())); | |
| 345 client_.reset(new MockInputRouterClient()); | |
| 346 input_router_.reset(new ImmediateInputRouter( | |
| 347 process_.get(), | |
| 348 client_.get(), | |
| 349 MSG_ROUTING_NONE)); | |
| 350 client_->set_input_router(input_router_.get()); | |
| 351 } | |
| 352 virtual void TearDown() { | |
| 353 // Process all pending tasks to avoid leaks. | |
| 354 base::MessageLoop::current()->RunUntilIdle(); | |
| 355 | |
| 356 input_router_.reset(); | |
| 357 client_.reset(); | |
| 358 process_.reset(); | |
| 359 browser_context_.reset(); | |
| 360 } | |
| 361 | |
| 362 void SendInputEventACK(WebInputEvent::Type type, | |
| 363 InputEventAckState ack_result) { | 121 InputEventAckState ack_result) { |
| 364 scoped_ptr<IPC::Message> response( | 122 scoped_ptr<IPC::Message> response( |
| 365 new InputHostMsg_HandleInputEvent_ACK(0, type, ack_result, | 123 new InputHostMsg_HandleInputEvent_ACK(0, type, ack_result, |
| 366 ui::LatencyInfo())); | 124 ui::LatencyInfo())); |
| 367 input_router_->OnMessageReceived(*response); | 125 input_router_->OnMessageReceived(*response); |
| 368 } | 126 } |
| 369 | 127 |
| 370 void SimulateKeyboardEvent(WebInputEvent::Type type) { | 128 ImmediateInputRouter* input_router() const { |
| 371 NativeWebKeyboardEvent key_event; | 129 return static_cast<ImmediateInputRouter*>(input_router_.get()); |
| 372 key_event.type = type; | |
| 373 key_event.windowsKeyCode = ui::VKEY_L; // non-null made up value. | |
| 374 input_router_->SendKeyboardEvent(key_event, ui::LatencyInfo()); | |
| 375 client_->ExpectSendCalled(true); | |
| 376 EXPECT_EQ(type, client_->sent_key_event().type); | |
| 377 EXPECT_EQ(key_event.windowsKeyCode, | |
| 378 client_->sent_key_event().windowsKeyCode); | |
| 379 } | |
| 380 | |
| 381 void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) { | |
| 382 WebMouseWheelEvent wheel_event; | |
| 383 wheel_event.type = WebInputEvent::MouseWheel; | |
| 384 wheel_event.deltaX = dX; | |
| 385 wheel_event.deltaY = dY; | |
| 386 wheel_event.modifiers = modifiers; | |
| 387 wheel_event.hasPreciseScrollingDeltas = precise; | |
| 388 input_router_->SendWheelEvent( | |
| 389 MouseWheelEventWithLatencyInfo(wheel_event, ui::LatencyInfo())); | |
| 390 client_->ExpectSendCalled(true); | |
| 391 EXPECT_EQ(wheel_event.type, client_->sent_wheel_event().event.type); | |
| 392 EXPECT_EQ(dX, client_->sent_wheel_event().event.deltaX); | |
| 393 } | |
| 394 | |
| 395 void SimulateMouseMove(int x, int y, int modifiers) { | |
| 396 WebMouseEvent mouse_event; | |
| 397 mouse_event.type = WebInputEvent::MouseMove; | |
| 398 mouse_event.x = mouse_event.windowX = x; | |
| 399 mouse_event.y = mouse_event.windowY = y; | |
| 400 mouse_event.modifiers = modifiers; | |
| 401 input_router_->SendMouseEvent( | |
| 402 MouseEventWithLatencyInfo(mouse_event, ui::LatencyInfo())); | |
| 403 client_->ExpectSendCalled(true); | |
| 404 client_->ExpectSendImmediatelyCalled(true); | |
| 405 EXPECT_EQ(mouse_event.type, client_->sent_mouse_event().event.type); | |
| 406 EXPECT_EQ(x, client_->sent_mouse_event().event.x); | |
| 407 EXPECT_EQ(mouse_event.type, | |
| 408 client_->immediately_sent_mouse_event().event.type); | |
| 409 EXPECT_EQ(x, client_->immediately_sent_mouse_event().event.x); | |
| 410 } | |
| 411 | |
| 412 void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) { | |
| 413 WebMouseWheelEvent wheel_event; | |
| 414 wheel_event.type = WebInputEvent::MouseWheel; | |
| 415 wheel_event.phase = phase; | |
| 416 input_router_->SendWheelEvent( | |
| 417 MouseWheelEventWithLatencyInfo(wheel_event, ui::LatencyInfo())); | |
| 418 client_->ExpectSendCalled(true); | |
| 419 EXPECT_EQ(wheel_event.type, client_->sent_wheel_event().event.type); | |
| 420 EXPECT_EQ(phase, client_->sent_wheel_event().event.phase); | |
| 421 } | |
| 422 | |
| 423 // Inject provided synthetic WebGestureEvent instance. | |
| 424 void SimulateGestureEventCore(WebInputEvent::Type type, | |
| 425 WebGestureEvent::SourceDevice sourceDevice, | |
| 426 WebGestureEvent* gesture_event) { | |
| 427 gesture_event->type = type; | |
| 428 gesture_event->sourceDevice = sourceDevice; | |
| 429 GestureEventWithLatencyInfo gesture_with_latency( | |
| 430 *gesture_event, ui::LatencyInfo()); | |
| 431 input_router_->SendGestureEvent(gesture_with_latency); | |
| 432 client_->ExpectSendCalled(true); | |
| 433 EXPECT_EQ(type, client_->sent_gesture_event().event.type); | |
| 434 EXPECT_EQ(sourceDevice, client_->sent_gesture_event().event.sourceDevice); | |
| 435 } | |
| 436 | |
| 437 // Inject simple synthetic WebGestureEvent instances. | |
| 438 void SimulateGestureEvent(WebInputEvent::Type type, | |
| 439 WebGestureEvent::SourceDevice sourceDevice) { | |
| 440 WebGestureEvent gesture_event; | |
| 441 SimulateGestureEventCore(type, sourceDevice, &gesture_event); | |
| 442 } | |
| 443 | |
| 444 void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) { | |
| 445 WebGestureEvent gesture_event; | |
| 446 gesture_event.data.scrollUpdate.deltaX = dX; | |
| 447 gesture_event.data.scrollUpdate.deltaY = dY; | |
| 448 gesture_event.modifiers = modifiers; | |
| 449 SimulateGestureEventCore(WebInputEvent::GestureScrollUpdate, | |
| 450 WebGestureEvent::Touchscreen, &gesture_event); | |
| 451 } | |
| 452 | |
| 453 void SimulateGesturePinchUpdateEvent(float scale, | |
| 454 float anchorX, | |
| 455 float anchorY, | |
| 456 int modifiers) { | |
| 457 WebGestureEvent gesture_event; | |
| 458 gesture_event.data.pinchUpdate.scale = scale; | |
| 459 gesture_event.x = anchorX; | |
| 460 gesture_event.y = anchorY; | |
| 461 gesture_event.modifiers = modifiers; | |
| 462 SimulateGestureEventCore(WebInputEvent::GesturePinchUpdate, | |
| 463 WebGestureEvent::Touchscreen, &gesture_event); | |
| 464 } | |
| 465 | |
| 466 // Inject synthetic GestureFlingStart events. | |
| 467 void SimulateGestureFlingStartEvent( | |
| 468 float velocityX, | |
| 469 float velocityY, | |
| 470 WebGestureEvent::SourceDevice sourceDevice) { | |
| 471 WebGestureEvent gesture_event; | |
| 472 gesture_event.data.flingStart.velocityX = velocityX; | |
| 473 gesture_event.data.flingStart.velocityY = velocityY; | |
| 474 SimulateGestureEventCore(WebInputEvent::GestureFlingStart, sourceDevice, | |
| 475 &gesture_event); | |
| 476 } | |
| 477 | |
| 478 // Set the timestamp for the touch-event. | |
| 479 void SetTouchTimestamp(base::TimeDelta timestamp) { | |
| 480 touch_event_.timeStampSeconds = timestamp.InSecondsF(); | |
| 481 } | |
| 482 | |
| 483 // Sends a touch event (irrespective of whether the page has a touch-event | |
| 484 // handler or not). | |
| 485 void SendTouchEvent() { | |
| 486 input_router_->SendTouchEvent( | |
| 487 TouchEventWithLatencyInfo(touch_event_, ui::LatencyInfo())); | |
| 488 | |
| 489 // Mark all the points as stationary. And remove the points that have been | |
| 490 // released. | |
| 491 int point = 0; | |
| 492 for (unsigned int i = 0; i < touch_event_.touchesLength; ++i) { | |
| 493 if (touch_event_.touches[i].state == WebTouchPoint::StateReleased) | |
| 494 continue; | |
| 495 | |
| 496 touch_event_.touches[point] = touch_event_.touches[i]; | |
| 497 touch_event_.touches[point].state = | |
| 498 WebTouchPoint::StateStationary; | |
| 499 ++point; | |
| 500 } | |
| 501 touch_event_.touchesLength = point; | |
| 502 touch_event_.type = WebInputEvent::Undefined; | |
| 503 } | |
| 504 | |
| 505 int PressTouchPoint(int x, int y) { | |
| 506 if (touch_event_.touchesLength == touch_event_.touchesLengthCap) | |
| 507 return -1; | |
| 508 WebTouchPoint& point = | |
| 509 touch_event_.touches[touch_event_.touchesLength]; | |
| 510 point.id = touch_event_.touchesLength; | |
| 511 point.position.x = point.screenPosition.x = x; | |
| 512 point.position.y = point.screenPosition.y = y; | |
| 513 point.state = WebTouchPoint::StatePressed; | |
| 514 point.radiusX = point.radiusY = 1.f; | |
| 515 ++touch_event_.touchesLength; | |
| 516 touch_event_.type = WebInputEvent::TouchStart; | |
| 517 return point.id; | |
| 518 } | |
| 519 | |
| 520 void MoveTouchPoint(int index, int x, int y) { | |
| 521 CHECK(index >= 0 && index < touch_event_.touchesLengthCap); | |
| 522 WebTouchPoint& point = touch_event_.touches[index]; | |
| 523 point.position.x = point.screenPosition.x = x; | |
| 524 point.position.y = point.screenPosition.y = y; | |
| 525 touch_event_.touches[index].state = WebTouchPoint::StateMoved; | |
| 526 touch_event_.type = WebInputEvent::TouchMove; | |
| 527 } | |
| 528 | |
| 529 void ReleaseTouchPoint(int index) { | |
| 530 CHECK(index >= 0 && index < touch_event_.touchesLengthCap); | |
| 531 touch_event_.touches[index].state = WebTouchPoint::StateReleased; | |
| 532 touch_event_.type = WebInputEvent::TouchEnd; | |
| 533 } | 130 } |
| 534 | 131 |
| 535 void set_debounce_interval_time_ms(int ms) { | 132 void set_debounce_interval_time_ms(int ms) { |
| 536 input_router_->gesture_event_filter()->debounce_interval_time_ms_ = ms; | 133 input_router()->gesture_event_filter()->debounce_interval_time_ms_ = ms; |
| 537 } | 134 } |
| 538 | 135 |
| 539 void set_maximum_tap_gap_time_ms(int delay_ms) { | 136 void set_maximum_tap_gap_time_ms(int delay_ms) { |
| 540 input_router_->gesture_event_filter()->maximum_tap_gap_time_ms_ = delay_ms; | 137 input_router()->gesture_event_filter()->maximum_tap_gap_time_ms_ = delay_ms; |
| 541 } | 138 } |
| 542 | 139 |
| 543 size_t TouchEventQueueSize() { | 140 size_t TouchEventQueueSize() { |
| 544 return touch_event_queue()->GetQueueSize(); | 141 return touch_event_queue()->GetQueueSize(); |
| 545 } | 142 } |
| 546 | 143 |
| 547 const WebTouchEvent& latest_event() const { | 144 const WebTouchEvent& latest_event() const { |
| 548 return touch_event_queue()->GetLatestEvent().event; | 145 return touch_event_queue()->GetLatestEvent().event; |
| 549 } | 146 } |
| 550 | 147 |
| 551 TouchEventQueue* touch_event_queue() const { | 148 TouchEventQueue* touch_event_queue() const { |
| 552 return input_router_->touch_event_queue(); | 149 return input_router()->touch_event_queue(); |
| 553 } | 150 } |
| 554 | 151 |
| 555 unsigned GestureEventLastQueueEventSize() { | 152 unsigned GestureEventLastQueueEventSize() { |
| 556 return gesture_event_filter()->coalesced_gesture_events_.size(); | 153 return gesture_event_filter()->coalesced_gesture_events_.size(); |
| 557 } | 154 } |
| 558 | 155 |
| 559 WebGestureEvent GestureEventSecondFromLastQueueEvent() { | 156 WebGestureEvent GestureEventSecondFromLastQueueEvent() { |
| 560 return gesture_event_filter()->coalesced_gesture_events_.at( | 157 return gesture_event_filter()->coalesced_gesture_events_.at( |
| 561 GestureEventLastQueueEventSize() - 2).event; | 158 GestureEventLastQueueEventSize() - 2).event; |
| 562 } | 159 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 583 | 180 |
| 584 bool FlingInProgress() { | 181 bool FlingInProgress() { |
| 585 return gesture_event_filter()->fling_in_progress_; | 182 return gesture_event_filter()->fling_in_progress_; |
| 586 } | 183 } |
| 587 | 184 |
| 588 bool WillIgnoreNextACK() { | 185 bool WillIgnoreNextACK() { |
| 589 return gesture_event_filter()->ignore_next_ack_; | 186 return gesture_event_filter()->ignore_next_ack_; |
| 590 } | 187 } |
| 591 | 188 |
| 592 GestureEventFilter* gesture_event_filter() const { | 189 GestureEventFilter* gesture_event_filter() const { |
| 593 return input_router_->gesture_event_filter(); | 190 return input_router()->gesture_event_filter(); |
| 594 } | 191 } |
| 595 | |
| 596 scoped_ptr<MockRenderProcessHost> process_; | |
| 597 scoped_ptr<MockInputRouterClient> client_; | |
| 598 scoped_ptr<ImmediateInputRouter> input_router_; | |
| 599 | |
| 600 private: | |
| 601 base::MessageLoopForUI message_loop_; | |
| 602 WebTouchEvent touch_event_; | |
| 603 | |
| 604 scoped_ptr<TestBrowserContext> browser_context_; | |
| 605 }; | 192 }; |
| 606 | 193 |
| 607 #if GTEST_HAS_PARAM_TEST | 194 #if GTEST_HAS_PARAM_TEST |
| 608 // This is for tests that are to be run for all source devices. | 195 // This is for tests that are to be run for all source devices. |
| 609 class ImmediateInputRouterWithSourceTest | 196 class ImmediateInputRouterWithSourceTest |
| 610 : public ImmediateInputRouterTest, | 197 : public ImmediateInputRouterTest, |
| 611 public testing::WithParamInterface<WebGestureEvent::SourceDevice> { | 198 public testing::WithParamInterface<WebGestureEvent::SourceDevice> { |
| 612 }; | 199 }; |
| 613 #endif // GTEST_HAS_PARAM_TEST | 200 #endif // GTEST_HAS_PARAM_TEST |
| 614 | 201 |
| 615 TEST_F(ImmediateInputRouterTest, CoalescesRangeSelection) { | 202 TEST_F(ImmediateInputRouterTest, CoalescesRangeSelection) { |
| 616 input_router_->SendInput( | 203 input_router_->SendInput(scoped_ptr<IPC::Message>( |
| 617 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))); | 204 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4)))); |
| 618 EXPECT_EQ(1u, process_->sink().message_count()); | 205 EXPECT_EQ(1u, process_->sink().message_count()); |
| 619 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( | 206 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( |
| 620 process_->sink().GetMessageAt(0), | 207 process_->sink().GetMessageAt(0), |
| 621 gfx::Point(1, 2), | 208 gfx::Point(1, 2), |
| 622 gfx::Point(3, 4)); | 209 gfx::Point(3, 4)); |
| 623 process_->sink().ClearMessages(); | 210 process_->sink().ClearMessages(); |
| 624 | 211 |
| 625 // Send two more messages without acking. | 212 // Send two more messages without acking. |
| 626 input_router_->SendInput( | 213 input_router_->SendInput(scoped_ptr<IPC::Message>( |
| 627 new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8))); | 214 new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8)))); |
| 628 EXPECT_EQ(0u, process_->sink().message_count()); | 215 EXPECT_EQ(0u, process_->sink().message_count()); |
| 629 | 216 |
| 630 input_router_->SendInput( | 217 input_router_->SendInput(scoped_ptr<IPC::Message>( |
| 631 new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12))); | 218 new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12)))); |
| 632 EXPECT_EQ(0u, process_->sink().message_count()); | 219 EXPECT_EQ(0u, process_->sink().message_count()); |
| 633 | 220 |
| 634 // Now ack the first message. | 221 // Now ack the first message. |
| 635 { | 222 { |
| 636 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); | 223 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); |
| 637 input_router_->OnMessageReceived(*response); | 224 input_router_->OnMessageReceived(*response); |
| 638 } | 225 } |
| 639 | 226 |
| 640 // Verify that the two messages are coalesced into one message. | 227 // Verify that the two messages are coalesced into one message. |
| 641 EXPECT_EQ(1u, process_->sink().message_count()); | 228 EXPECT_EQ(1u, process_->sink().message_count()); |
| 642 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( | 229 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( |
| 643 process_->sink().GetMessageAt(0), | 230 process_->sink().GetMessageAt(0), |
| 644 gfx::Point(9, 10), | 231 gfx::Point(9, 10), |
| 645 gfx::Point(11, 12)); | 232 gfx::Point(11, 12)); |
| 646 process_->sink().ClearMessages(); | 233 process_->sink().ClearMessages(); |
| 647 | 234 |
| 648 // Acking the coalesced msg should not send any more msg. | 235 // Acking the coalesced msg should not send any more msg. |
| 649 { | 236 { |
| 650 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); | 237 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); |
| 651 input_router_->OnMessageReceived(*response); | 238 input_router_->OnMessageReceived(*response); |
| 652 } | 239 } |
| 653 EXPECT_EQ(0u, process_->sink().message_count()); | 240 EXPECT_EQ(0u, process_->sink().message_count()); |
| 654 } | 241 } |
| 655 | 242 |
| 656 TEST_F(ImmediateInputRouterTest, CoalescesCaretMove) { | 243 TEST_F(ImmediateInputRouterTest, CoalescesCaretMove) { |
| 657 input_router_->SendInput(new InputMsg_MoveCaret(0, gfx::Point(1, 2))); | 244 input_router_->SendInput( |
| 245 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(1, 2)))); |
| 658 EXPECT_EQ(1u, process_->sink().message_count()); | 246 EXPECT_EQ(1u, process_->sink().message_count()); |
| 659 ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( | 247 ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( |
| 660 process_->sink().GetMessageAt(0), gfx::Point(1, 2)); | 248 process_->sink().GetMessageAt(0), gfx::Point(1, 2)); |
| 661 process_->sink().ClearMessages(); | 249 process_->sink().ClearMessages(); |
| 662 | 250 |
| 663 // Send two more messages without acking. | 251 // Send two more messages without acking. |
| 664 input_router_->SendInput(new InputMsg_MoveCaret(0, gfx::Point(5, 6))); | 252 input_router_->SendInput( |
| 253 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(5, 6)))); |
| 665 EXPECT_EQ(0u, process_->sink().message_count()); | 254 EXPECT_EQ(0u, process_->sink().message_count()); |
| 666 | 255 |
| 667 input_router_->SendInput(new InputMsg_MoveCaret(0, gfx::Point(9, 10))); | 256 input_router_->SendInput( |
| 257 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(9, 10)))); |
| 668 EXPECT_EQ(0u, process_->sink().message_count()); | 258 EXPECT_EQ(0u, process_->sink().message_count()); |
| 669 | 259 |
| 670 // Now ack the first message. | 260 // Now ack the first message. |
| 671 { | 261 { |
| 672 scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); | 262 scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); |
| 673 input_router_->OnMessageReceived(*response); | 263 input_router_->OnMessageReceived(*response); |
| 674 } | 264 } |
| 675 | 265 |
| 676 // Verify that the two messages are coalesced into one message. | 266 // Verify that the two messages are coalesced into one message. |
| 677 EXPECT_EQ(1u, process_->sink().message_count()); | 267 EXPECT_EQ(1u, process_->sink().message_count()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 690 TEST_F(ImmediateInputRouterTest, HandledInputEvent) { | 280 TEST_F(ImmediateInputRouterTest, HandledInputEvent) { |
| 691 client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED); | 281 client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 692 | 282 |
| 693 // Simulate a keyboard event. | 283 // Simulate a keyboard event. |
| 694 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 284 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 695 | 285 |
| 696 // Make sure no input event is sent to the renderer. | 286 // Make sure no input event is sent to the renderer. |
| 697 EXPECT_EQ(0u, process_->sink().message_count()); | 287 EXPECT_EQ(0u, process_->sink().message_count()); |
| 698 | 288 |
| 699 // OnKeyboardEventAck should be triggered without actual ack. | 289 // OnKeyboardEventAck should be triggered without actual ack. |
| 700 client_->ExpectAckCalled(1); | 290 ack_handler_->ExpectAckCalled(1); |
| 701 | 291 |
| 702 // As the event was acked already, keyboard event queue should be | 292 // As the event was acked already, keyboard event queue should be |
| 703 // empty. | 293 // empty. |
| 704 ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent()); | 294 ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent()); |
| 705 } | 295 } |
| 706 | 296 |
| 707 TEST_F(ImmediateInputRouterTest, ClientCanceledKeyboardEvent) { | 297 TEST_F(ImmediateInputRouterTest, ClientCanceledKeyboardEvent) { |
| 708 client_->set_allow_send_key_event(false); | 298 client_->set_allow_send_event(false); |
| 709 | 299 |
| 710 // Simulate a keyboard event. | 300 // Simulate a keyboard event. |
| 711 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 301 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 712 | 302 |
| 713 // Make sure no input event is sent to the renderer. | 303 // Make sure no input event is sent to the renderer. |
| 714 EXPECT_EQ(0u, process_->sink().message_count()); | 304 EXPECT_EQ(0u, process_->sink().message_count()); |
| 715 client_->ExpectAckCalled(0); | 305 ack_handler_->ExpectAckCalled(0); |
| 716 } | 306 } |
| 717 | 307 |
| 718 TEST_F(ImmediateInputRouterTest, ShortcutKeyboardEvent) { | 308 TEST_F(ImmediateInputRouterTest, ShortcutKeyboardEvent) { |
| 719 client_->set_is_shortcut(true); | 309 client_->set_is_shortcut(true); |
| 720 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 310 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 721 EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage( | 311 EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage( |
| 722 process_->sink().GetMessageAt(0))); | 312 process_->sink().GetMessageAt(0))); |
| 723 | 313 |
| 724 process_->sink().ClearMessages(); | 314 process_->sink().ClearMessages(); |
| 725 | 315 |
| 726 client_->set_is_shortcut(false); | 316 client_->set_is_shortcut(false); |
| 727 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 317 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 728 EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage( | 318 EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage( |
| 729 process_->sink().GetMessageAt(0))); | 319 process_->sink().GetMessageAt(0))); |
| 730 } | 320 } |
| 731 | 321 |
| 732 TEST_F(ImmediateInputRouterTest, NoncorrespondingKeyEvents) { | 322 TEST_F(ImmediateInputRouterTest, NoncorrespondingKeyEvents) { |
| 733 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 323 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 734 | 324 |
| 735 SendInputEventACK(WebInputEvent::KeyUp, | 325 SendInputEventACK(WebInputEvent::KeyUp, |
| 736 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 326 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 737 EXPECT_TRUE(client_->unexpected_event_ack_called()); | 327 EXPECT_TRUE(ack_handler_->unexpected_event_ack_called()); |
| 738 } | 328 } |
| 739 | 329 |
| 740 // Tests ported from RenderWidgetHostTest -------------------------------------- | 330 // Tests ported from RenderWidgetHostTest -------------------------------------- |
| 741 | 331 |
| 742 TEST_F(ImmediateInputRouterTest, HandleKeyEventsWeSent) { | 332 TEST_F(ImmediateInputRouterTest, HandleKeyEventsWeSent) { |
| 743 // Simulate a keyboard event. | 333 // Simulate a keyboard event. |
| 744 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 334 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 745 ASSERT_TRUE(input_router_->GetLastKeyboardEvent()); | 335 ASSERT_TRUE(input_router_->GetLastKeyboardEvent()); |
| 746 EXPECT_EQ(WebInputEvent::RawKeyDown, | 336 EXPECT_EQ(WebInputEvent::RawKeyDown, |
| 747 input_router_->GetLastKeyboardEvent()->type); | 337 input_router_->GetLastKeyboardEvent()->type); |
| 748 | 338 |
| 749 // Make sure we sent the input event to the renderer. | 339 // Make sure we sent the input event to the renderer. |
| 750 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 340 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 751 InputMsg_HandleInputEvent::ID)); | 341 InputMsg_HandleInputEvent::ID)); |
| 752 process_->sink().ClearMessages(); | 342 process_->sink().ClearMessages(); |
| 753 | 343 |
| 754 // Send the simulated response from the renderer back. | 344 // Send the simulated response from the renderer back. |
| 755 SendInputEventACK(WebInputEvent::RawKeyDown, | 345 SendInputEventACK(WebInputEvent::RawKeyDown, |
| 756 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 346 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 757 client_->ExpectAckCalled(1); | 347 ack_handler_->ExpectAckCalled(1); |
| 758 EXPECT_EQ(WebInputEvent::RawKeyDown, client_->acked_keyboard_event().type); | 348 EXPECT_EQ(WebInputEvent::RawKeyDown, |
| 349 ack_handler_->acked_keyboard_event().type); |
| 759 } | 350 } |
| 760 | 351 |
| 761 TEST_F(ImmediateInputRouterTest, IgnoreKeyEventsWeDidntSend) { | 352 TEST_F(ImmediateInputRouterTest, IgnoreKeyEventsWeDidntSend) { |
| 762 // Send a simulated, unrequested key response. We should ignore this. | 353 // Send a simulated, unrequested key response. We should ignore this. |
| 763 SendInputEventACK(WebInputEvent::RawKeyDown, | 354 SendInputEventACK(WebInputEvent::RawKeyDown, |
| 764 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 355 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 765 | 356 |
| 766 client_->ExpectAckCalled(0); | 357 ack_handler_->ExpectAckCalled(0); |
| 767 } | 358 } |
| 768 | 359 |
| 769 TEST_F(ImmediateInputRouterTest, CoalescesWheelEvents) { | 360 TEST_F(ImmediateInputRouterTest, CoalescesWheelEvents) { |
| 770 // Simulate wheel events. | 361 // Simulate wheel events. |
| 771 SimulateWheelEvent(0, -5, 0, false); // sent directly | 362 SimulateWheelEvent(0, -5, 0, false); // sent directly |
| 772 SimulateWheelEvent(0, -10, 0, false); // enqueued | 363 SimulateWheelEvent(0, -10, 0, false); // enqueued |
| 773 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event | 364 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event |
| 774 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers | 365 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers |
| 775 | 366 |
| 776 // Check that only the first event was sent. | 367 // Check that only the first event was sent. |
| 777 EXPECT_EQ(1U, process_->sink().message_count()); | 368 EXPECT_EQ(1U, process_->sink().message_count()); |
| 778 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 369 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 779 InputMsg_HandleInputEvent::ID)); | 370 InputMsg_HandleInputEvent::ID)); |
| 780 process_->sink().ClearMessages(); | 371 process_->sink().ClearMessages(); |
| 781 | 372 |
| 782 // Check that the ACK sends the second message via ImmediateInputForwarder | 373 // Check that the ACK sends the second message via ImmediateInputForwarder |
| 783 SendInputEventACK(WebInputEvent::MouseWheel, | 374 SendInputEventACK(WebInputEvent::MouseWheel, |
| 784 INPUT_EVENT_ACK_STATE_CONSUMED); | 375 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 785 // The coalesced events can queue up a delayed ack | 376 // The coalesced events can queue up a delayed ack |
| 786 // so that additional input events can be processed before | 377 // so that additional input events can be processed before |
| 787 // we turn off coalescing. | 378 // we turn off coalescing. |
| 788 base::MessageLoop::current()->RunUntilIdle(); | 379 base::MessageLoop::current()->RunUntilIdle(); |
| 789 client_->ExpectAckCalled(1); | 380 ack_handler_->ExpectAckCalled(1); |
| 790 EXPECT_EQ(1U, process_->sink().message_count()); | 381 EXPECT_EQ(1U, process_->sink().message_count()); |
| 791 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 382 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 792 InputMsg_HandleInputEvent::ID)); | 383 InputMsg_HandleInputEvent::ID)); |
| 793 process_->sink().ClearMessages(); | 384 process_->sink().ClearMessages(); |
| 794 | 385 |
| 795 // One more time. | 386 // One more time. |
| 796 SendInputEventACK(WebInputEvent::MouseWheel, | 387 SendInputEventACK(WebInputEvent::MouseWheel, |
| 797 INPUT_EVENT_ACK_STATE_CONSUMED); | 388 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 798 base::MessageLoop::current()->RunUntilIdle(); | 389 base::MessageLoop::current()->RunUntilIdle(); |
| 799 client_->ExpectAckCalled(1); | 390 ack_handler_->ExpectAckCalled(1); |
| 800 EXPECT_EQ(1U, process_->sink().message_count()); | 391 EXPECT_EQ(1U, process_->sink().message_count()); |
| 801 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 392 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 802 InputMsg_HandleInputEvent::ID)); | 393 InputMsg_HandleInputEvent::ID)); |
| 803 process_->sink().ClearMessages(); | 394 process_->sink().ClearMessages(); |
| 804 | 395 |
| 805 // After the final ack, the queue should be empty. | 396 // After the final ack, the queue should be empty. |
| 806 SendInputEventACK(WebInputEvent::MouseWheel, | 397 SendInputEventACK(WebInputEvent::MouseWheel, |
| 807 INPUT_EVENT_ACK_STATE_CONSUMED); | 398 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 808 base::MessageLoop::current()->RunUntilIdle(); | 399 base::MessageLoop::current()->RunUntilIdle(); |
| 809 client_->ExpectAckCalled(1); | 400 ack_handler_->ExpectAckCalled(1); |
| 810 EXPECT_EQ(0U, process_->sink().message_count()); | 401 EXPECT_EQ(0U, process_->sink().message_count()); |
| 811 | 402 |
| 812 // FIXME(kouhei): Below is testing gesture event filter. Maybe separate test? | 403 // FIXME(kouhei): Below is testing gesture event filter. Maybe separate test? |
| 813 { | 404 { |
| 814 WebGestureEvent gesture_event; | 405 WebGestureEvent gesture_event; |
| 815 gesture_event.type = WebInputEvent::GestureFlingStart; | 406 gesture_event.type = WebInputEvent::GestureFlingStart; |
| 816 gesture_event.sourceDevice = WebGestureEvent::Touchpad; | 407 gesture_event.sourceDevice = WebGestureEvent::Touchpad; |
| 817 gesture_event.data.flingStart.velocityX = 0.f; | 408 gesture_event.data.flingStart.velocityX = 0.f; |
| 818 gesture_event.data.flingStart.velocityY = 0.f; | 409 gesture_event.data.flingStart.velocityY = 0.f; |
| 819 EXPECT_FALSE(input_router_->ShouldForwardGestureEvent( | 410 EXPECT_FALSE(input_router_->ShouldForwardGestureEvent( |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 // Check that only the first event was sent. | 493 // Check that only the first event was sent. |
| 903 EXPECT_EQ(1U, process_->sink().message_count()); | 494 EXPECT_EQ(1U, process_->sink().message_count()); |
| 904 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 495 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 905 InputMsg_HandleInputEvent::ID)); | 496 InputMsg_HandleInputEvent::ID)); |
| 906 process_->sink().ClearMessages(); | 497 process_->sink().ClearMessages(); |
| 907 | 498 |
| 908 // Check that the ACK sends the second message. | 499 // Check that the ACK sends the second message. |
| 909 SendInputEventACK(WebInputEvent::GestureScrollBegin, | 500 SendInputEventACK(WebInputEvent::GestureScrollBegin, |
| 910 INPUT_EVENT_ACK_STATE_CONSUMED); | 501 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 911 base::MessageLoop::current()->RunUntilIdle(); | 502 base::MessageLoop::current()->RunUntilIdle(); |
| 912 client_->ExpectAckCalled(1); | 503 ack_handler_->ExpectAckCalled(1); |
| 913 EXPECT_EQ(1U, process_->sink().message_count()); | 504 EXPECT_EQ(1U, process_->sink().message_count()); |
| 914 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 505 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 915 InputMsg_HandleInputEvent::ID)); | 506 InputMsg_HandleInputEvent::ID)); |
| 916 process_->sink().ClearMessages(); | 507 process_->sink().ClearMessages(); |
| 917 | 508 |
| 918 // Ack for queued coalesced event. | 509 // Ack for queued coalesced event. |
| 919 SendInputEventACK(WebInputEvent::GestureScrollUpdate, | 510 SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
| 920 INPUT_EVENT_ACK_STATE_CONSUMED); | 511 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 921 base::MessageLoop::current()->RunUntilIdle(); | 512 base::MessageLoop::current()->RunUntilIdle(); |
| 922 client_->ExpectAckCalled(1); | 513 ack_handler_->ExpectAckCalled(1); |
| 923 EXPECT_EQ(1U, process_->sink().message_count()); | 514 EXPECT_EQ(1U, process_->sink().message_count()); |
| 924 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 515 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 925 InputMsg_HandleInputEvent::ID)); | 516 InputMsg_HandleInputEvent::ID)); |
| 926 process_->sink().ClearMessages(); | 517 process_->sink().ClearMessages(); |
| 927 | 518 |
| 928 // Ack for queued uncoalesced event. | 519 // Ack for queued uncoalesced event. |
| 929 SendInputEventACK(WebInputEvent::GestureScrollUpdate, | 520 SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
| 930 INPUT_EVENT_ACK_STATE_CONSUMED); | 521 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 931 base::MessageLoop::current()->RunUntilIdle(); | 522 base::MessageLoop::current()->RunUntilIdle(); |
| 932 client_->ExpectAckCalled(1); | 523 ack_handler_->ExpectAckCalled(1); |
| 933 EXPECT_EQ(1U, process_->sink().message_count()); | 524 EXPECT_EQ(1U, process_->sink().message_count()); |
| 934 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 525 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 935 InputMsg_HandleInputEvent::ID)); | 526 InputMsg_HandleInputEvent::ID)); |
| 936 process_->sink().ClearMessages(); | 527 process_->sink().ClearMessages(); |
| 937 | 528 |
| 938 // After the final ack, the queue should be empty. | 529 // After the final ack, the queue should be empty. |
| 939 SendInputEventACK(WebInputEvent::GestureScrollEnd, | 530 SendInputEventACK(WebInputEvent::GestureScrollEnd, |
| 940 INPUT_EVENT_ACK_STATE_CONSUMED); | 531 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 941 base::MessageLoop::current()->RunUntilIdle(); | 532 base::MessageLoop::current()->RunUntilIdle(); |
| 942 client_->ExpectAckCalled(1); | 533 ack_handler_->ExpectAckCalled(1); |
| 943 EXPECT_EQ(0U, process_->sink().message_count()); | 534 EXPECT_EQ(0U, process_->sink().message_count()); |
| 944 } | 535 } |
| 945 | 536 |
| 946 TEST_F(ImmediateInputRouterTest, CoalescesScrollAndPinchEvents) { | 537 TEST_F(ImmediateInputRouterTest, CoalescesScrollAndPinchEvents) { |
| 947 // Turn off debounce handling for test isolation. | 538 // Turn off debounce handling for test isolation. |
| 948 set_debounce_interval_time_ms(0); | 539 set_debounce_interval_time_ms(0); |
| 949 | 540 |
| 950 // Test coalescing of only GestureScrollUpdate events. | 541 // Test coalescing of only GestureScrollUpdate events. |
| 951 // Simulate gesture events. | 542 // Simulate gesture events. |
| 952 | 543 |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1185 EXPECT_EQ(0U, process_->sink().message_count()); | 776 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1186 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 777 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1187 | 778 |
| 1188 // GFC after previous GFS is dispatched and acked. | 779 // GFC after previous GFS is dispatched and acked. |
| 1189 process_->sink().ClearMessages(); | 780 process_->sink().ClearMessages(); |
| 1190 SimulateGestureFlingStartEvent(0, -10, source_device); | 781 SimulateGestureFlingStartEvent(0, -10, source_device); |
| 1191 EXPECT_TRUE(FlingInProgress()); | 782 EXPECT_TRUE(FlingInProgress()); |
| 1192 SendInputEventACK(WebInputEvent::GestureFlingStart, | 783 SendInputEventACK(WebInputEvent::GestureFlingStart, |
| 1193 INPUT_EVENT_ACK_STATE_CONSUMED); | 784 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1194 base::MessageLoop::current()->RunUntilIdle(); | 785 base::MessageLoop::current()->RunUntilIdle(); |
| 1195 client_->ExpectAckCalled(1); | 786 ack_handler_->ExpectAckCalled(1); |
| 1196 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | 787 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); |
| 1197 EXPECT_FALSE(FlingInProgress()); | 788 EXPECT_FALSE(FlingInProgress()); |
| 1198 EXPECT_EQ(2U, process_->sink().message_count()); | 789 EXPECT_EQ(2U, process_->sink().message_count()); |
| 1199 SendInputEventACK(WebInputEvent::GestureFlingCancel, | 790 SendInputEventACK(WebInputEvent::GestureFlingCancel, |
| 1200 INPUT_EVENT_ACK_STATE_CONSUMED); | 791 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1201 base::MessageLoop::current()->RunUntilIdle(); | 792 base::MessageLoop::current()->RunUntilIdle(); |
| 1202 client_->ExpectAckCalled(1); | 793 ack_handler_->ExpectAckCalled(1); |
| 1203 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 794 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1204 | 795 |
| 1205 // GFC before previous GFS is acked. | 796 // GFC before previous GFS is acked. |
| 1206 process_->sink().ClearMessages(); | 797 process_->sink().ClearMessages(); |
| 1207 SimulateGestureFlingStartEvent(0, -10, source_device); | 798 SimulateGestureFlingStartEvent(0, -10, source_device); |
| 1208 EXPECT_TRUE(FlingInProgress()); | 799 EXPECT_TRUE(FlingInProgress()); |
| 1209 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | 800 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); |
| 1210 EXPECT_FALSE(FlingInProgress()); | 801 EXPECT_FALSE(FlingInProgress()); |
| 1211 EXPECT_EQ(1U, process_->sink().message_count()); | 802 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1212 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | 803 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); |
| 1213 | 804 |
| 1214 // Advance state realistically. | 805 // Advance state realistically. |
| 1215 SendInputEventACK(WebInputEvent::GestureFlingStart, | 806 SendInputEventACK(WebInputEvent::GestureFlingStart, |
| 1216 INPUT_EVENT_ACK_STATE_CONSUMED); | 807 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1217 base::MessageLoop::current()->RunUntilIdle(); | 808 base::MessageLoop::current()->RunUntilIdle(); |
| 1218 SendInputEventACK(WebInputEvent::GestureFlingCancel, | 809 SendInputEventACK(WebInputEvent::GestureFlingCancel, |
| 1219 INPUT_EVENT_ACK_STATE_CONSUMED); | 810 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1220 base::MessageLoop::current()->RunUntilIdle(); | 811 base::MessageLoop::current()->RunUntilIdle(); |
| 1221 client_->ExpectAckCalled(2); | 812 ack_handler_->ExpectAckCalled(2); |
| 1222 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 813 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1223 | 814 |
| 1224 // GFS is added to the queue if another event is pending | 815 // GFS is added to the queue if another event is pending |
| 1225 process_->sink().ClearMessages(); | 816 process_->sink().ClearMessages(); |
| 1226 SimulateGestureScrollUpdateEvent(8, -7, 0); | 817 SimulateGestureScrollUpdateEvent(8, -7, 0); |
| 1227 SimulateGestureFlingStartEvent(0, -10, source_device); | 818 SimulateGestureFlingStartEvent(0, -10, source_device); |
| 1228 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | 819 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); |
| 1229 EXPECT_EQ(1U, process_->sink().message_count()); | 820 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1230 WebGestureEvent merged_event = GestureEventLastQueueEvent(); | 821 WebGestureEvent merged_event = GestureEventLastQueueEvent(); |
| 1231 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type); | 822 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type); |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1556 SendTouchEvent(); | 1147 SendTouchEvent(); |
| 1557 client_->ExpectSendImmediatelyCalled(false); | 1148 client_->ExpectSendImmediatelyCalled(false); |
| 1558 EXPECT_EQ(0U, process_->sink().message_count()); | 1149 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1559 | 1150 |
| 1560 EXPECT_EQ(2U, TouchEventQueueSize()); | 1151 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 1561 | 1152 |
| 1562 // Receive an ACK for the first touch-event. | 1153 // Receive an ACK for the first touch-event. |
| 1563 SendInputEventACK(WebInputEvent::TouchStart, | 1154 SendInputEventACK(WebInputEvent::TouchStart, |
| 1564 INPUT_EVENT_ACK_STATE_CONSUMED); | 1155 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1565 EXPECT_EQ(1U, TouchEventQueueSize()); | 1156 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1566 client_->ExpectAckCalled(1); | 1157 ack_handler_->ExpectAckCalled(1); |
| 1567 EXPECT_EQ(WebInputEvent::TouchStart, | 1158 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1568 client_->acked_touch_event().event.type); | 1159 ack_handler_->acked_touch_event().event.type); |
| 1569 EXPECT_EQ(1U, process_->sink().message_count()); | 1160 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1570 process_->sink().ClearMessages(); | 1161 process_->sink().ClearMessages(); |
| 1571 | 1162 |
| 1572 SendInputEventACK(WebInputEvent::TouchMove, | 1163 SendInputEventACK(WebInputEvent::TouchMove, |
| 1573 INPUT_EVENT_ACK_STATE_CONSUMED); | 1164 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1574 EXPECT_EQ(0U, TouchEventQueueSize()); | 1165 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1575 client_->ExpectAckCalled(1); | 1166 ack_handler_->ExpectAckCalled(1); |
| 1576 EXPECT_EQ(WebInputEvent::TouchMove, | 1167 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1577 client_->acked_touch_event().event.type); | 1168 ack_handler_->acked_touch_event().event.type); |
| 1578 EXPECT_EQ(0U, process_->sink().message_count()); | 1169 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1579 } | 1170 } |
| 1580 | 1171 |
| 1581 // Tests that the touch-queue is emptied if a page stops listening for touch | 1172 // Tests that the touch-queue is emptied if a page stops listening for touch |
| 1582 // events. | 1173 // events. |
| 1583 TEST_F(ImmediateInputRouterTest, TouchEventQueueFlush) { | 1174 TEST_F(ImmediateInputRouterTest, TouchEventQueueFlush) { |
| 1584 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); | 1175 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); |
| 1585 EXPECT_TRUE(client_->has_touch_handler()); | 1176 EXPECT_TRUE(client_->has_touch_handler()); |
| 1586 EXPECT_EQ(0U, process_->sink().message_count()); | 1177 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1587 EXPECT_EQ(0U, TouchEventQueueSize()); | 1178 EXPECT_EQ(0U, TouchEventQueueSize()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1608 } | 1199 } |
| 1609 EXPECT_EQ(0U, process_->sink().message_count()); | 1200 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1610 EXPECT_EQ(32U, TouchEventQueueSize()); | 1201 EXPECT_EQ(32U, TouchEventQueueSize()); |
| 1611 | 1202 |
| 1612 // Receive an ACK for the first touch-event. One of the queued touch-event | 1203 // Receive an ACK for the first touch-event. One of the queued touch-event |
| 1613 // should be forwarded. | 1204 // should be forwarded. |
| 1614 SendInputEventACK(WebInputEvent::TouchStart, | 1205 SendInputEventACK(WebInputEvent::TouchStart, |
| 1615 INPUT_EVENT_ACK_STATE_CONSUMED); | 1206 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1616 EXPECT_EQ(31U, TouchEventQueueSize()); | 1207 EXPECT_EQ(31U, TouchEventQueueSize()); |
| 1617 EXPECT_EQ(WebInputEvent::TouchStart, | 1208 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1618 client_->acked_touch_event().event.type); | 1209 ack_handler_->acked_touch_event().event.type); |
| 1619 client_->ExpectAckCalled(1); | 1210 ack_handler_->ExpectAckCalled(1); |
| 1620 EXPECT_EQ(1U, process_->sink().message_count()); | 1211 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1621 process_->sink().ClearMessages(); | 1212 process_->sink().ClearMessages(); |
| 1622 | 1213 |
| 1623 // The page stops listening for touch-events. The touch-event queue should now | 1214 // The page stops listening for touch-events. The touch-event queue should now |
| 1624 // be emptied, but none of the queued touch-events should be sent to the | 1215 // be emptied, but none of the queued touch-events should be sent to the |
| 1625 // renderer. | 1216 // renderer. |
| 1626 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false)); | 1217 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false)); |
| 1627 EXPECT_FALSE(client_->has_touch_handler()); | 1218 EXPECT_FALSE(client_->has_touch_handler()); |
| 1628 EXPECT_EQ(0U, process_->sink().message_count()); | 1219 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1629 EXPECT_EQ(0U, TouchEventQueueSize()); | 1220 EXPECT_EQ(0U, TouchEventQueueSize()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1656 EXPECT_EQ(0U, process_->sink().message_count()); | 1247 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1657 EXPECT_EQ(3U, TouchEventQueueSize()); | 1248 EXPECT_EQ(3U, TouchEventQueueSize()); |
| 1658 client_->ExpectSendImmediatelyCalled(false); | 1249 client_->ExpectSendImmediatelyCalled(false); |
| 1659 | 1250 |
| 1660 // ACK the press. | 1251 // ACK the press. |
| 1661 SendInputEventACK(WebInputEvent::TouchStart, | 1252 SendInputEventACK(WebInputEvent::TouchStart, |
| 1662 INPUT_EVENT_ACK_STATE_CONSUMED); | 1253 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1663 EXPECT_EQ(1U, process_->sink().message_count()); | 1254 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1664 EXPECT_EQ(2U, TouchEventQueueSize()); | 1255 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 1665 EXPECT_EQ(WebInputEvent::TouchStart, | 1256 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1666 client_->acked_touch_event().event.type); | 1257 ack_handler_->acked_touch_event().event.type); |
| 1667 client_->ExpectAckCalled(1); | 1258 ack_handler_->ExpectAckCalled(1); |
| 1668 process_->sink().ClearMessages(); | 1259 process_->sink().ClearMessages(); |
| 1669 | 1260 |
| 1670 // Coalesced touch-move events should be sent. | 1261 // Coalesced touch-move events should be sent. |
| 1671 client_->ExpectSendImmediatelyCalled(true); | 1262 client_->ExpectSendImmediatelyCalled(true); |
| 1672 EXPECT_EQ(WebInputEvent::TouchMove, | 1263 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1673 client_->immediately_sent_touch_event().event.type); | 1264 client_->immediately_sent_touch_event().event.type); |
| 1674 | 1265 |
| 1675 // ACK the moves. | 1266 // ACK the moves. |
| 1676 SendInputEventACK(WebInputEvent::TouchMove, | 1267 SendInputEventACK(WebInputEvent::TouchMove, |
| 1677 INPUT_EVENT_ACK_STATE_CONSUMED); | 1268 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1678 EXPECT_EQ(1U, process_->sink().message_count()); | 1269 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1679 EXPECT_EQ(1U, TouchEventQueueSize()); | 1270 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1680 EXPECT_EQ(WebInputEvent::TouchMove, | 1271 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1681 client_->acked_touch_event().event.type); | 1272 ack_handler_->acked_touch_event().event.type); |
| 1682 client_->ExpectAckCalled(10); | 1273 ack_handler_->ExpectAckCalled(10); |
| 1683 process_->sink().ClearMessages(); | 1274 process_->sink().ClearMessages(); |
| 1684 | 1275 |
| 1685 // ACK the release. | 1276 // ACK the release. |
| 1686 SendInputEventACK(WebInputEvent::TouchEnd, | 1277 SendInputEventACK(WebInputEvent::TouchEnd, |
| 1687 INPUT_EVENT_ACK_STATE_CONSUMED); | 1278 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1688 EXPECT_EQ(0U, process_->sink().message_count()); | 1279 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1689 EXPECT_EQ(0U, TouchEventQueueSize()); | 1280 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1690 EXPECT_EQ(WebInputEvent::TouchEnd, | 1281 EXPECT_EQ(WebInputEvent::TouchEnd, |
| 1691 client_->acked_touch_event().event.type); | 1282 ack_handler_->acked_touch_event().event.type); |
| 1692 client_->ExpectAckCalled(1); | 1283 ack_handler_->ExpectAckCalled(1); |
| 1693 } | 1284 } |
| 1694 | 1285 |
| 1695 // Tests that an event that has already been sent but hasn't been ack'ed yet | 1286 // Tests that an event that has already been sent but hasn't been ack'ed yet |
| 1696 // doesn't get coalesced with newer events. | 1287 // doesn't get coalesced with newer events. |
| 1697 TEST_F(ImmediateInputRouterTest, SentTouchEventDoesNotCoalesce) { | 1288 TEST_F(ImmediateInputRouterTest, SentTouchEventDoesNotCoalesce) { |
| 1698 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); | 1289 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); |
| 1699 EXPECT_EQ(0U, process_->sink().message_count()); | 1290 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1700 EXPECT_EQ(0U, TouchEventQueueSize()); | 1291 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1701 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); | 1292 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); |
| 1702 | 1293 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1837 SendTouchEvent(); | 1428 SendTouchEvent(); |
| 1838 EXPECT_EQ(0U, process_->sink().message_count()); | 1429 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1839 EXPECT_EQ(2U, TouchEventQueueSize()); | 1430 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 1840 | 1431 |
| 1841 // Receive an ACK for the first touch-event. This should release the queued | 1432 // Receive an ACK for the first touch-event. This should release the queued |
| 1842 // touch-event, but it should not be sent to the renderer. | 1433 // touch-event, but it should not be sent to the renderer. |
| 1843 SendInputEventACK(WebInputEvent::TouchStart, | 1434 SendInputEventACK(WebInputEvent::TouchStart, |
| 1844 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1435 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1845 EXPECT_EQ(0U, TouchEventQueueSize()); | 1436 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1846 EXPECT_EQ(WebInputEvent::TouchMove, | 1437 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1847 client_->acked_touch_event().event.type); | 1438 ack_handler_->acked_touch_event().event.type); |
| 1848 client_->ExpectAckCalled(2); | 1439 ack_handler_->ExpectAckCalled(2); |
| 1849 EXPECT_EQ(0U, process_->sink().message_count()); | 1440 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1850 process_->sink().ClearMessages(); | 1441 process_->sink().ClearMessages(); |
| 1851 | 1442 |
| 1852 // Send a release event. This should not reach the renderer. | 1443 // Send a release event. This should not reach the renderer. |
| 1853 ReleaseTouchPoint(0); | 1444 ReleaseTouchPoint(0); |
| 1854 SendTouchEvent(); | 1445 SendTouchEvent(); |
| 1855 EXPECT_EQ(0U, process_->sink().message_count()); | 1446 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1856 EXPECT_EQ(WebInputEvent::TouchEnd, | 1447 EXPECT_EQ(WebInputEvent::TouchEnd, |
| 1857 client_->acked_touch_event().event.type); | 1448 ack_handler_->acked_touch_event().event.type); |
| 1858 client_->ExpectAckCalled(1); | 1449 ack_handler_->ExpectAckCalled(1); |
| 1859 | 1450 |
| 1860 // Send a press-event, followed by move and release events, and another press | 1451 // Send a press-event, followed by move and release events, and another press |
| 1861 // event, before the ACK for the first press event comes back. All of the | 1452 // event, before the ACK for the first press event comes back. All of the |
| 1862 // events should be queued first. After the NO_CONSUMER ack for the first | 1453 // events should be queued first. After the NO_CONSUMER ack for the first |
| 1863 // touch-press, all events upto the second touch-press should be flushed. | 1454 // touch-press, all events upto the second touch-press should be flushed. |
| 1864 PressTouchPoint(10, 10); | 1455 PressTouchPoint(10, 10); |
| 1865 SendTouchEvent(); | 1456 SendTouchEvent(); |
| 1866 EXPECT_EQ(1U, process_->sink().message_count()); | 1457 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1867 process_->sink().ClearMessages(); | 1458 process_->sink().ClearMessages(); |
| 1868 | 1459 |
| 1869 MoveTouchPoint(0, 5, 5); | 1460 MoveTouchPoint(0, 5, 5); |
| 1870 SendTouchEvent(); | 1461 SendTouchEvent(); |
| 1871 MoveTouchPoint(0, 6, 5); | 1462 MoveTouchPoint(0, 6, 5); |
| 1872 SendTouchEvent(); | 1463 SendTouchEvent(); |
| 1873 ReleaseTouchPoint(0); | 1464 ReleaseTouchPoint(0); |
| 1874 SendTouchEvent(); | 1465 SendTouchEvent(); |
| 1875 | 1466 |
| 1876 PressTouchPoint(6, 5); | 1467 PressTouchPoint(6, 5); |
| 1877 SendTouchEvent(); | 1468 SendTouchEvent(); |
| 1878 EXPECT_EQ(0U, process_->sink().message_count()); | 1469 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1879 // The queue should hold the first sent touch-press event, the coalesced | 1470 // The queue should hold the first sent touch-press event, the coalesced |
| 1880 // touch-move event, the touch-end event and the second touch-press event. | 1471 // touch-move event, the touch-end event and the second touch-press event. |
| 1881 EXPECT_EQ(4U, TouchEventQueueSize()); | 1472 EXPECT_EQ(4U, TouchEventQueueSize()); |
| 1882 | 1473 |
| 1883 SendInputEventACK(WebInputEvent::TouchStart, | 1474 SendInputEventACK(WebInputEvent::TouchStart, |
| 1884 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1475 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1885 EXPECT_EQ(1U, process_->sink().message_count()); | 1476 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1886 EXPECT_EQ(WebInputEvent::TouchEnd, client_->acked_touch_event().event.type); | 1477 EXPECT_EQ(WebInputEvent::TouchEnd, |
| 1887 client_->ExpectAckCalled(4); | 1478 ack_handler_->acked_touch_event().event.type); |
| 1479 ack_handler_->ExpectAckCalled(4); |
| 1888 EXPECT_EQ(1U, TouchEventQueueSize()); | 1480 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1889 process_->sink().ClearMessages(); | 1481 process_->sink().ClearMessages(); |
| 1890 | 1482 |
| 1891 // ACK the second press event as NO_CONSUMER too. | 1483 // ACK the second press event as NO_CONSUMER too. |
| 1892 SendInputEventACK(WebInputEvent::TouchStart, | 1484 SendInputEventACK(WebInputEvent::TouchStart, |
| 1893 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1485 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1894 EXPECT_EQ(0U, process_->sink().message_count()); | 1486 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1895 EXPECT_EQ(WebInputEvent::TouchStart, client_->acked_touch_event().event.type); | 1487 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1896 client_->ExpectAckCalled(1); | 1488 ack_handler_->acked_touch_event().event.type); |
| 1489 ack_handler_->ExpectAckCalled(1); |
| 1897 EXPECT_EQ(0U, TouchEventQueueSize()); | 1490 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1898 | 1491 |
| 1899 // Send a second press event. Even though the first touch had NO_CONSUMER, | 1492 // Send a second press event. Even though the first touch had NO_CONSUMER, |
| 1900 // this press event should reach the renderer. | 1493 // this press event should reach the renderer. |
| 1901 PressTouchPoint(1, 1); | 1494 PressTouchPoint(1, 1); |
| 1902 SendTouchEvent(); | 1495 SendTouchEvent(); |
| 1903 EXPECT_EQ(1U, process_->sink().message_count()); | 1496 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1904 EXPECT_EQ(1U, TouchEventQueueSize()); | 1497 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1905 } | 1498 } |
| 1906 | 1499 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2023 MoveTouchPoint(1, 30, 30); | 1616 MoveTouchPoint(1, 30, 30); |
| 2024 SendTouchEvent(); | 1617 SendTouchEvent(); |
| 2025 EXPECT_EQ(0U, process_->sink().message_count()); | 1618 EXPECT_EQ(0U, process_->sink().message_count()); |
| 2026 EXPECT_EQ(4U, TouchEventQueueSize()); | 1619 EXPECT_EQ(4U, TouchEventQueueSize()); |
| 2027 | 1620 |
| 2028 SendInputEventACK(WebInputEvent::TouchEnd, | 1621 SendInputEventACK(WebInputEvent::TouchEnd, |
| 2029 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1622 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2030 EXPECT_EQ(1U, process_->sink().message_count()); | 1623 EXPECT_EQ(1U, process_->sink().message_count()); |
| 2031 EXPECT_EQ(2U, TouchEventQueueSize()); | 1624 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 2032 EXPECT_EQ(WebInputEvent::TouchMove, | 1625 EXPECT_EQ(WebInputEvent::TouchMove, |
| 2033 client_->acked_touch_event().event.type); | 1626 ack_handler_->acked_touch_event().event.type); |
| 2034 process_->sink().ClearMessages(); | 1627 process_->sink().ClearMessages(); |
| 2035 | 1628 |
| 2036 // ACK the press with NO_CONSUMED_EXISTS. This should release the queued | 1629 // ACK the press with NO_CONSUMED_EXISTS. This should release the queued |
| 2037 // touch-move events to the view. | 1630 // touch-move events to the view. |
| 2038 SendInputEventACK(WebInputEvent::TouchStart, | 1631 SendInputEventACK(WebInputEvent::TouchStart, |
| 2039 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1632 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 2040 EXPECT_EQ(0U, process_->sink().message_count()); | 1633 EXPECT_EQ(0U, process_->sink().message_count()); |
| 2041 EXPECT_EQ(0U, TouchEventQueueSize()); | 1634 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 2042 EXPECT_EQ(WebInputEvent::TouchMove, | 1635 EXPECT_EQ(WebInputEvent::TouchMove, |
| 2043 client_->acked_touch_event().event.type); | 1636 ack_handler_->acked_touch_event().event.type); |
| 2044 | 1637 |
| 2045 ReleaseTouchPoint(2); | 1638 ReleaseTouchPoint(2); |
| 2046 ReleaseTouchPoint(1); | 1639 ReleaseTouchPoint(1); |
| 2047 EXPECT_EQ(0U, process_->sink().message_count()); | 1640 EXPECT_EQ(0U, process_->sink().message_count()); |
| 2048 EXPECT_EQ(0U, TouchEventQueueSize()); | 1641 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 2049 } | 1642 } |
| 2050 | 1643 |
| 2051 #if defined(OS_WIN) || defined(USE_AURA) | 1644 #if defined(OS_WIN) || defined(USE_AURA) |
| 2052 // Tests that the acked events have correct state. (ui::Events are used only on | 1645 // Tests that the acked events have correct state. (ui::Events are used only on |
| 2053 // windows and aura) | 1646 // windows and aura) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2111 WebInputEvent::TouchStart, | 1704 WebInputEvent::TouchStart, |
| 2112 WebInputEvent::TouchMove }; | 1705 WebInputEvent::TouchMove }; |
| 2113 | 1706 |
| 2114 TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES; | 1707 TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES; |
| 2115 #if !defined(OS_WIN) | 1708 #if !defined(OS_WIN) |
| 2116 coordinate_system = SCREEN_COORDINATES; | 1709 coordinate_system = SCREEN_COORDINATES; |
| 2117 #endif | 1710 #endif |
| 2118 for (size_t i = 0; i < arraysize(acks); ++i) { | 1711 for (size_t i = 0; i < arraysize(acks); ++i) { |
| 2119 SendInputEventACK(acks[i], | 1712 SendInputEventACK(acks[i], |
| 2120 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1713 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2121 EXPECT_EQ(acks[i], client_->acked_touch_event().event.type); | 1714 EXPECT_EQ(acks[i], ack_handler_->acked_touch_event().event.type); |
| 2122 ScopedVector<ui::TouchEvent> acked; | 1715 ScopedVector<ui::TouchEvent> acked; |
| 2123 | 1716 |
| 2124 MakeUITouchEventsFromWebTouchEvents( | 1717 MakeUITouchEventsFromWebTouchEvents( |
| 2125 client_->acked_touch_event(), &acked, coordinate_system); | 1718 ack_handler_->acked_touch_event(), &acked, coordinate_system); |
| 2126 bool success = EventListIsSubset(acked, expected_events); | 1719 bool success = EventListIsSubset(acked, expected_events); |
| 2127 EXPECT_TRUE(success) << "Failed on step: " << i; | 1720 EXPECT_TRUE(success) << "Failed on step: " << i; |
| 2128 if (!success) | 1721 if (!success) |
| 2129 break; | 1722 break; |
| 2130 expected_events.erase(expected_events.begin(), | 1723 expected_events.erase(expected_events.begin(), |
| 2131 expected_events.begin() + acked.size()); | 1724 expected_events.begin() + acked.size()); |
| 2132 } | 1725 } |
| 2133 | 1726 |
| 2134 EXPECT_EQ(0U, expected_events.size()); | 1727 EXPECT_EQ(0U, expected_events.size()); |
| 2135 } | 1728 } |
| 2136 #endif // defined(OS_WIN) || defined(USE_AURA) | 1729 #endif // defined(OS_WIN) || defined(USE_AURA) |
| 2137 | 1730 |
| 2138 TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) { | 1731 TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) { |
| 2139 // Simulate wheel events. | 1732 // Simulate wheel events. |
| 2140 SimulateWheelEvent(0, -5, 0, false); // sent directly | 1733 SimulateWheelEvent(0, -5, 0, false); // sent directly |
| 2141 SimulateWheelEvent(0, -10, 0, false); // enqueued | 1734 SimulateWheelEvent(0, -10, 0, false); // enqueued |
| 2142 | 1735 |
| 2143 // Check that only the first event was sent. | 1736 // Check that only the first event was sent. |
| 2144 EXPECT_EQ(1U, process_->sink().message_count()); | 1737 EXPECT_EQ(1U, process_->sink().message_count()); |
| 2145 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 1738 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 2146 InputMsg_HandleInputEvent::ID)); | 1739 InputMsg_HandleInputEvent::ID)); |
| 2147 process_->sink().ClearMessages(); | 1740 process_->sink().ClearMessages(); |
| 2148 | 1741 |
| 2149 // Indicate that the wheel event was unhandled. | 1742 // Indicate that the wheel event was unhandled. |
| 2150 SendInputEventACK(WebInputEvent::MouseWheel, | 1743 SendInputEventACK(WebInputEvent::MouseWheel, |
| 2151 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1744 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2152 | 1745 |
| 2153 // Check that the correct unhandled wheel event was received. | 1746 // Check that the correct unhandled wheel event was received. |
| 2154 client_->ExpectAckCalled(1); | 1747 ack_handler_->ExpectAckCalled(1); |
| 2155 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, client_->ack_state()); | 1748 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); |
| 2156 EXPECT_EQ(client_->acked_wheel_event().deltaY, -5); | 1749 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); |
| 2157 | 1750 |
| 2158 // Check that the second event was sent. | 1751 // Check that the second event was sent. |
| 2159 EXPECT_EQ(1U, process_->sink().message_count()); | 1752 EXPECT_EQ(1U, process_->sink().message_count()); |
| 2160 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 1753 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 2161 InputMsg_HandleInputEvent::ID)); | 1754 InputMsg_HandleInputEvent::ID)); |
| 2162 process_->sink().ClearMessages(); | 1755 process_->sink().ClearMessages(); |
| 2163 | 1756 |
| 2164 // Check that the correct unhandled wheel event was received. | 1757 // Check that the correct unhandled wheel event was received. |
| 2165 EXPECT_EQ(client_->acked_wheel_event().deltaY, -5); | 1758 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); |
| 2166 } | 1759 } |
| 2167 | 1760 |
| 2168 } // namespace content | 1761 } // namespace content |
| OLD | NEW |