| 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 void EnableNoTouchToRendererWhileScrolling() { | 148 void EnableNoTouchToRendererWhileScrolling() { |
| 552 input_router_->enable_no_touch_to_renderer_while_scrolling_ = true; | 149 input_router()->enable_no_touch_to_renderer_while_scrolling_ = true; |
| 553 } | 150 } |
| 554 | 151 |
| 555 bool no_touch_move_to_renderer() { | 152 bool no_touch_move_to_renderer() { |
| 556 return touch_event_queue()->no_touch_move_to_renderer_; | 153 return touch_event_queue()->no_touch_move_to_renderer_; |
| 557 } | 154 } |
| 558 | 155 |
| 559 TouchEventQueue* touch_event_queue() const { | 156 TouchEventQueue* touch_event_queue() const { |
| 560 return input_router_->touch_event_queue(); | 157 return input_router()->touch_event_queue(); |
| 561 } | 158 } |
| 562 | 159 |
| 563 unsigned GestureEventLastQueueEventSize() { | 160 unsigned GestureEventLastQueueEventSize() { |
| 564 return gesture_event_filter()->coalesced_gesture_events_.size(); | 161 return gesture_event_filter()->coalesced_gesture_events_.size(); |
| 565 } | 162 } |
| 566 | 163 |
| 567 WebGestureEvent GestureEventSecondFromLastQueueEvent() { | 164 WebGestureEvent GestureEventSecondFromLastQueueEvent() { |
| 568 return gesture_event_filter()->coalesced_gesture_events_.at( | 165 return gesture_event_filter()->coalesced_gesture_events_.at( |
| 569 GestureEventLastQueueEventSize() - 2).event; | 166 GestureEventLastQueueEventSize() - 2).event; |
| 570 } | 167 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 591 | 188 |
| 592 bool FlingInProgress() { | 189 bool FlingInProgress() { |
| 593 return gesture_event_filter()->fling_in_progress_; | 190 return gesture_event_filter()->fling_in_progress_; |
| 594 } | 191 } |
| 595 | 192 |
| 596 bool WillIgnoreNextACK() { | 193 bool WillIgnoreNextACK() { |
| 597 return gesture_event_filter()->ignore_next_ack_; | 194 return gesture_event_filter()->ignore_next_ack_; |
| 598 } | 195 } |
| 599 | 196 |
| 600 GestureEventFilter* gesture_event_filter() const { | 197 GestureEventFilter* gesture_event_filter() const { |
| 601 return input_router_->gesture_event_filter(); | 198 return input_router()->gesture_event_filter(); |
| 602 } | 199 } |
| 603 | |
| 604 scoped_ptr<MockRenderProcessHost> process_; | |
| 605 scoped_ptr<MockInputRouterClient> client_; | |
| 606 scoped_ptr<ImmediateInputRouter> input_router_; | |
| 607 | |
| 608 private: | |
| 609 base::MessageLoopForUI message_loop_; | |
| 610 WebTouchEvent touch_event_; | |
| 611 | |
| 612 scoped_ptr<TestBrowserContext> browser_context_; | |
| 613 }; | 200 }; |
| 614 | 201 |
| 615 #if GTEST_HAS_PARAM_TEST | 202 #if GTEST_HAS_PARAM_TEST |
| 616 // This is for tests that are to be run for all source devices. | 203 // This is for tests that are to be run for all source devices. |
| 617 class ImmediateInputRouterWithSourceTest | 204 class ImmediateInputRouterWithSourceTest |
| 618 : public ImmediateInputRouterTest, | 205 : public ImmediateInputRouterTest, |
| 619 public testing::WithParamInterface<WebGestureEvent::SourceDevice> { | 206 public testing::WithParamInterface<WebGestureEvent::SourceDevice> { |
| 620 }; | 207 }; |
| 621 #endif // GTEST_HAS_PARAM_TEST | 208 #endif // GTEST_HAS_PARAM_TEST |
| 622 | 209 |
| 623 TEST_F(ImmediateInputRouterTest, CoalescesRangeSelection) { | 210 TEST_F(ImmediateInputRouterTest, CoalescesRangeSelection) { |
| 624 input_router_->SendInput( | 211 input_router_->SendInput(scoped_ptr<IPC::Message>( |
| 625 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4))); | 212 new InputMsg_SelectRange(0, gfx::Point(1, 2), gfx::Point(3, 4)))); |
| 626 EXPECT_EQ(1u, process_->sink().message_count()); | 213 EXPECT_EQ(1u, process_->sink().message_count()); |
| 627 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( | 214 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( |
| 628 process_->sink().GetMessageAt(0), | 215 process_->sink().GetMessageAt(0), |
| 629 gfx::Point(1, 2), | 216 gfx::Point(1, 2), |
| 630 gfx::Point(3, 4)); | 217 gfx::Point(3, 4)); |
| 631 process_->sink().ClearMessages(); | 218 process_->sink().ClearMessages(); |
| 632 | 219 |
| 633 // Send two more messages without acking. | 220 // Send two more messages without acking. |
| 634 input_router_->SendInput( | 221 input_router_->SendInput(scoped_ptr<IPC::Message>( |
| 635 new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8))); | 222 new InputMsg_SelectRange(0, gfx::Point(5, 6), gfx::Point(7, 8)))); |
| 636 EXPECT_EQ(0u, process_->sink().message_count()); | 223 EXPECT_EQ(0u, process_->sink().message_count()); |
| 637 | 224 |
| 638 input_router_->SendInput( | 225 input_router_->SendInput(scoped_ptr<IPC::Message>( |
| 639 new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12))); | 226 new InputMsg_SelectRange(0, gfx::Point(9, 10), gfx::Point(11, 12)))); |
| 640 EXPECT_EQ(0u, process_->sink().message_count()); | 227 EXPECT_EQ(0u, process_->sink().message_count()); |
| 641 | 228 |
| 642 // Now ack the first message. | 229 // Now ack the first message. |
| 643 { | 230 { |
| 644 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); | 231 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); |
| 645 input_router_->OnMessageReceived(*response); | 232 input_router_->OnMessageReceived(*response); |
| 646 } | 233 } |
| 647 | 234 |
| 648 // Verify that the two messages are coalesced into one message. | 235 // Verify that the two messages are coalesced into one message. |
| 649 EXPECT_EQ(1u, process_->sink().message_count()); | 236 EXPECT_EQ(1u, process_->sink().message_count()); |
| 650 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( | 237 ExpectIPCMessageWithArg2<InputMsg_SelectRange>( |
| 651 process_->sink().GetMessageAt(0), | 238 process_->sink().GetMessageAt(0), |
| 652 gfx::Point(9, 10), | 239 gfx::Point(9, 10), |
| 653 gfx::Point(11, 12)); | 240 gfx::Point(11, 12)); |
| 654 process_->sink().ClearMessages(); | 241 process_->sink().ClearMessages(); |
| 655 | 242 |
| 656 // Acking the coalesced msg should not send any more msg. | 243 // Acking the coalesced msg should not send any more msg. |
| 657 { | 244 { |
| 658 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); | 245 scoped_ptr<IPC::Message> response(new ViewHostMsg_SelectRange_ACK(0)); |
| 659 input_router_->OnMessageReceived(*response); | 246 input_router_->OnMessageReceived(*response); |
| 660 } | 247 } |
| 661 EXPECT_EQ(0u, process_->sink().message_count()); | 248 EXPECT_EQ(0u, process_->sink().message_count()); |
| 662 } | 249 } |
| 663 | 250 |
| 664 TEST_F(ImmediateInputRouterTest, CoalescesCaretMove) { | 251 TEST_F(ImmediateInputRouterTest, CoalescesCaretMove) { |
| 665 input_router_->SendInput(new InputMsg_MoveCaret(0, gfx::Point(1, 2))); | 252 input_router_->SendInput( |
| 253 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(1, 2)))); |
| 666 EXPECT_EQ(1u, process_->sink().message_count()); | 254 EXPECT_EQ(1u, process_->sink().message_count()); |
| 667 ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( | 255 ExpectIPCMessageWithArg1<InputMsg_MoveCaret>( |
| 668 process_->sink().GetMessageAt(0), gfx::Point(1, 2)); | 256 process_->sink().GetMessageAt(0), gfx::Point(1, 2)); |
| 669 process_->sink().ClearMessages(); | 257 process_->sink().ClearMessages(); |
| 670 | 258 |
| 671 // Send two more messages without acking. | 259 // Send two more messages without acking. |
| 672 input_router_->SendInput(new InputMsg_MoveCaret(0, gfx::Point(5, 6))); | 260 input_router_->SendInput( |
| 261 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(5, 6)))); |
| 673 EXPECT_EQ(0u, process_->sink().message_count()); | 262 EXPECT_EQ(0u, process_->sink().message_count()); |
| 674 | 263 |
| 675 input_router_->SendInput(new InputMsg_MoveCaret(0, gfx::Point(9, 10))); | 264 input_router_->SendInput( |
| 265 scoped_ptr<IPC::Message>(new InputMsg_MoveCaret(0, gfx::Point(9, 10)))); |
| 676 EXPECT_EQ(0u, process_->sink().message_count()); | 266 EXPECT_EQ(0u, process_->sink().message_count()); |
| 677 | 267 |
| 678 // Now ack the first message. | 268 // Now ack the first message. |
| 679 { | 269 { |
| 680 scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); | 270 scoped_ptr<IPC::Message> response(new ViewHostMsg_MoveCaret_ACK(0)); |
| 681 input_router_->OnMessageReceived(*response); | 271 input_router_->OnMessageReceived(*response); |
| 682 } | 272 } |
| 683 | 273 |
| 684 // Verify that the two messages are coalesced into one message. | 274 // Verify that the two messages are coalesced into one message. |
| 685 EXPECT_EQ(1u, process_->sink().message_count()); | 275 EXPECT_EQ(1u, process_->sink().message_count()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 698 TEST_F(ImmediateInputRouterTest, HandledInputEvent) { | 288 TEST_F(ImmediateInputRouterTest, HandledInputEvent) { |
| 699 client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED); | 289 client_->set_filter_state(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 700 | 290 |
| 701 // Simulate a keyboard event. | 291 // Simulate a keyboard event. |
| 702 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 292 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 703 | 293 |
| 704 // Make sure no input event is sent to the renderer. | 294 // Make sure no input event is sent to the renderer. |
| 705 EXPECT_EQ(0u, process_->sink().message_count()); | 295 EXPECT_EQ(0u, process_->sink().message_count()); |
| 706 | 296 |
| 707 // OnKeyboardEventAck should be triggered without actual ack. | 297 // OnKeyboardEventAck should be triggered without actual ack. |
| 708 client_->ExpectAckCalled(1); | 298 ack_handler_->ExpectAckCalled(1); |
| 709 | 299 |
| 710 // As the event was acked already, keyboard event queue should be | 300 // As the event was acked already, keyboard event queue should be |
| 711 // empty. | 301 // empty. |
| 712 ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent()); | 302 ASSERT_EQ(NULL, input_router_->GetLastKeyboardEvent()); |
| 713 } | 303 } |
| 714 | 304 |
| 715 TEST_F(ImmediateInputRouterTest, ClientCanceledKeyboardEvent) { | 305 TEST_F(ImmediateInputRouterTest, ClientCanceledKeyboardEvent) { |
| 716 client_->set_allow_send_key_event(false); | 306 client_->set_allow_send_event(false); |
| 717 | 307 |
| 718 // Simulate a keyboard event. | 308 // Simulate a keyboard event. |
| 719 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 309 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 720 | 310 |
| 721 // Make sure no input event is sent to the renderer. | 311 // Make sure no input event is sent to the renderer. |
| 722 EXPECT_EQ(0u, process_->sink().message_count()); | 312 EXPECT_EQ(0u, process_->sink().message_count()); |
| 723 client_->ExpectAckCalled(0); | 313 ack_handler_->ExpectAckCalled(0); |
| 724 } | 314 } |
| 725 | 315 |
| 726 TEST_F(ImmediateInputRouterTest, ShortcutKeyboardEvent) { | 316 TEST_F(ImmediateInputRouterTest, ShortcutKeyboardEvent) { |
| 727 client_->set_is_shortcut(true); | 317 client_->set_is_shortcut(true); |
| 728 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 318 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 729 EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage( | 319 EXPECT_TRUE(GetIsShortcutFromHandleInputEventMessage( |
| 730 process_->sink().GetMessageAt(0))); | 320 process_->sink().GetMessageAt(0))); |
| 731 | 321 |
| 732 process_->sink().ClearMessages(); | 322 process_->sink().ClearMessages(); |
| 733 | 323 |
| 734 client_->set_is_shortcut(false); | 324 client_->set_is_shortcut(false); |
| 735 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 325 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 736 EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage( | 326 EXPECT_FALSE(GetIsShortcutFromHandleInputEventMessage( |
| 737 process_->sink().GetMessageAt(0))); | 327 process_->sink().GetMessageAt(0))); |
| 738 } | 328 } |
| 739 | 329 |
| 740 TEST_F(ImmediateInputRouterTest, NoncorrespondingKeyEvents) { | 330 TEST_F(ImmediateInputRouterTest, NoncorrespondingKeyEvents) { |
| 741 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 331 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 742 | 332 |
| 743 SendInputEventACK(WebInputEvent::KeyUp, | 333 SendInputEventACK(WebInputEvent::KeyUp, |
| 744 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 334 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 745 EXPECT_TRUE(client_->unexpected_event_ack_called()); | 335 EXPECT_TRUE(ack_handler_->unexpected_event_ack_called()); |
| 746 } | 336 } |
| 747 | 337 |
| 748 // Tests ported from RenderWidgetHostTest -------------------------------------- | 338 // Tests ported from RenderWidgetHostTest -------------------------------------- |
| 749 | 339 |
| 750 TEST_F(ImmediateInputRouterTest, HandleKeyEventsWeSent) { | 340 TEST_F(ImmediateInputRouterTest, HandleKeyEventsWeSent) { |
| 751 // Simulate a keyboard event. | 341 // Simulate a keyboard event. |
| 752 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); | 342 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); |
| 753 ASSERT_TRUE(input_router_->GetLastKeyboardEvent()); | 343 ASSERT_TRUE(input_router_->GetLastKeyboardEvent()); |
| 754 EXPECT_EQ(WebInputEvent::RawKeyDown, | 344 EXPECT_EQ(WebInputEvent::RawKeyDown, |
| 755 input_router_->GetLastKeyboardEvent()->type); | 345 input_router_->GetLastKeyboardEvent()->type); |
| 756 | 346 |
| 757 // Make sure we sent the input event to the renderer. | 347 // Make sure we sent the input event to the renderer. |
| 758 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 348 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 759 InputMsg_HandleInputEvent::ID)); | 349 InputMsg_HandleInputEvent::ID)); |
| 760 process_->sink().ClearMessages(); | 350 process_->sink().ClearMessages(); |
| 761 | 351 |
| 762 // Send the simulated response from the renderer back. | 352 // Send the simulated response from the renderer back. |
| 763 SendInputEventACK(WebInputEvent::RawKeyDown, | 353 SendInputEventACK(WebInputEvent::RawKeyDown, |
| 764 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 354 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 765 client_->ExpectAckCalled(1); | 355 ack_handler_->ExpectAckCalled(1); |
| 766 EXPECT_EQ(WebInputEvent::RawKeyDown, client_->acked_keyboard_event().type); | 356 EXPECT_EQ(WebInputEvent::RawKeyDown, |
| 357 ack_handler_->acked_keyboard_event().type); |
| 767 } | 358 } |
| 768 | 359 |
| 769 TEST_F(ImmediateInputRouterTest, IgnoreKeyEventsWeDidntSend) { | 360 TEST_F(ImmediateInputRouterTest, IgnoreKeyEventsWeDidntSend) { |
| 770 // Send a simulated, unrequested key response. We should ignore this. | 361 // Send a simulated, unrequested key response. We should ignore this. |
| 771 SendInputEventACK(WebInputEvent::RawKeyDown, | 362 SendInputEventACK(WebInputEvent::RawKeyDown, |
| 772 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 363 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 773 | 364 |
| 774 client_->ExpectAckCalled(0); | 365 ack_handler_->ExpectAckCalled(0); |
| 775 } | 366 } |
| 776 | 367 |
| 777 TEST_F(ImmediateInputRouterTest, CoalescesWheelEvents) { | 368 TEST_F(ImmediateInputRouterTest, CoalescesWheelEvents) { |
| 778 // Simulate wheel events. | 369 // Simulate wheel events. |
| 779 SimulateWheelEvent(0, -5, 0, false); // sent directly | 370 SimulateWheelEvent(0, -5, 0, false); // sent directly |
| 780 SimulateWheelEvent(0, -10, 0, false); // enqueued | 371 SimulateWheelEvent(0, -10, 0, false); // enqueued |
| 781 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event | 372 SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event |
| 782 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers | 373 SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers |
| 783 | 374 |
| 784 // Check that only the first event was sent. | 375 // Check that only the first event was sent. |
| 785 EXPECT_EQ(1U, process_->sink().message_count()); | 376 EXPECT_EQ(1U, process_->sink().message_count()); |
| 786 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 377 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 787 InputMsg_HandleInputEvent::ID)); | 378 InputMsg_HandleInputEvent::ID)); |
| 788 process_->sink().ClearMessages(); | 379 process_->sink().ClearMessages(); |
| 789 | 380 |
| 790 // Check that the ACK sends the second message via ImmediateInputForwarder | 381 // Check that the ACK sends the second message via ImmediateInputForwarder |
| 791 SendInputEventACK(WebInputEvent::MouseWheel, | 382 SendInputEventACK(WebInputEvent::MouseWheel, |
| 792 INPUT_EVENT_ACK_STATE_CONSUMED); | 383 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 793 // The coalesced events can queue up a delayed ack | 384 // The coalesced events can queue up a delayed ack |
| 794 // so that additional input events can be processed before | 385 // so that additional input events can be processed before |
| 795 // we turn off coalescing. | 386 // we turn off coalescing. |
| 796 base::MessageLoop::current()->RunUntilIdle(); | 387 base::MessageLoop::current()->RunUntilIdle(); |
| 797 client_->ExpectAckCalled(1); | 388 ack_handler_->ExpectAckCalled(1); |
| 798 EXPECT_EQ(1U, process_->sink().message_count()); | 389 EXPECT_EQ(1U, process_->sink().message_count()); |
| 799 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 390 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 800 InputMsg_HandleInputEvent::ID)); | 391 InputMsg_HandleInputEvent::ID)); |
| 801 process_->sink().ClearMessages(); | 392 process_->sink().ClearMessages(); |
| 802 | 393 |
| 803 // One more time. | 394 // One more time. |
| 804 SendInputEventACK(WebInputEvent::MouseWheel, | 395 SendInputEventACK(WebInputEvent::MouseWheel, |
| 805 INPUT_EVENT_ACK_STATE_CONSUMED); | 396 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 806 base::MessageLoop::current()->RunUntilIdle(); | 397 base::MessageLoop::current()->RunUntilIdle(); |
| 807 client_->ExpectAckCalled(1); | 398 ack_handler_->ExpectAckCalled(1); |
| 808 EXPECT_EQ(1U, process_->sink().message_count()); | 399 EXPECT_EQ(1U, process_->sink().message_count()); |
| 809 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 400 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 810 InputMsg_HandleInputEvent::ID)); | 401 InputMsg_HandleInputEvent::ID)); |
| 811 process_->sink().ClearMessages(); | 402 process_->sink().ClearMessages(); |
| 812 | 403 |
| 813 // After the final ack, the queue should be empty. | 404 // After the final ack, the queue should be empty. |
| 814 SendInputEventACK(WebInputEvent::MouseWheel, | 405 SendInputEventACK(WebInputEvent::MouseWheel, |
| 815 INPUT_EVENT_ACK_STATE_CONSUMED); | 406 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 816 base::MessageLoop::current()->RunUntilIdle(); | 407 base::MessageLoop::current()->RunUntilIdle(); |
| 817 client_->ExpectAckCalled(1); | 408 ack_handler_->ExpectAckCalled(1); |
| 818 EXPECT_EQ(0U, process_->sink().message_count()); | 409 EXPECT_EQ(0U, process_->sink().message_count()); |
| 819 | 410 |
| 820 // FIXME(kouhei): Below is testing gesture event filter. Maybe separate test? | 411 // FIXME(kouhei): Below is testing gesture event filter. Maybe separate test? |
| 821 { | 412 { |
| 822 WebGestureEvent gesture_event; | 413 WebGestureEvent gesture_event; |
| 823 gesture_event.type = WebInputEvent::GestureFlingStart; | 414 gesture_event.type = WebInputEvent::GestureFlingStart; |
| 824 gesture_event.sourceDevice = WebGestureEvent::Touchpad; | 415 gesture_event.sourceDevice = WebGestureEvent::Touchpad; |
| 825 gesture_event.data.flingStart.velocityX = 0.f; | 416 gesture_event.data.flingStart.velocityX = 0.f; |
| 826 gesture_event.data.flingStart.velocityY = 0.f; | 417 gesture_event.data.flingStart.velocityY = 0.f; |
| 827 EXPECT_FALSE(input_router_->ShouldForwardGestureEvent( | 418 EXPECT_FALSE(input_router_->ShouldForwardGestureEvent( |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 // Check that only the first event was sent. | 501 // Check that only the first event was sent. |
| 911 EXPECT_EQ(1U, process_->sink().message_count()); | 502 EXPECT_EQ(1U, process_->sink().message_count()); |
| 912 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 503 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 913 InputMsg_HandleInputEvent::ID)); | 504 InputMsg_HandleInputEvent::ID)); |
| 914 process_->sink().ClearMessages(); | 505 process_->sink().ClearMessages(); |
| 915 | 506 |
| 916 // Check that the ACK sends the second message. | 507 // Check that the ACK sends the second message. |
| 917 SendInputEventACK(WebInputEvent::GestureScrollBegin, | 508 SendInputEventACK(WebInputEvent::GestureScrollBegin, |
| 918 INPUT_EVENT_ACK_STATE_CONSUMED); | 509 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 919 base::MessageLoop::current()->RunUntilIdle(); | 510 base::MessageLoop::current()->RunUntilIdle(); |
| 920 client_->ExpectAckCalled(1); | 511 ack_handler_->ExpectAckCalled(1); |
| 921 EXPECT_EQ(1U, process_->sink().message_count()); | 512 EXPECT_EQ(1U, process_->sink().message_count()); |
| 922 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 513 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 923 InputMsg_HandleInputEvent::ID)); | 514 InputMsg_HandleInputEvent::ID)); |
| 924 process_->sink().ClearMessages(); | 515 process_->sink().ClearMessages(); |
| 925 | 516 |
| 926 // Ack for queued coalesced event. | 517 // Ack for queued coalesced event. |
| 927 SendInputEventACK(WebInputEvent::GestureScrollUpdate, | 518 SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
| 928 INPUT_EVENT_ACK_STATE_CONSUMED); | 519 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 929 base::MessageLoop::current()->RunUntilIdle(); | 520 base::MessageLoop::current()->RunUntilIdle(); |
| 930 client_->ExpectAckCalled(1); | 521 ack_handler_->ExpectAckCalled(1); |
| 931 EXPECT_EQ(1U, process_->sink().message_count()); | 522 EXPECT_EQ(1U, process_->sink().message_count()); |
| 932 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 523 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 933 InputMsg_HandleInputEvent::ID)); | 524 InputMsg_HandleInputEvent::ID)); |
| 934 process_->sink().ClearMessages(); | 525 process_->sink().ClearMessages(); |
| 935 | 526 |
| 936 // Ack for queued uncoalesced event. | 527 // Ack for queued uncoalesced event. |
| 937 SendInputEventACK(WebInputEvent::GestureScrollUpdate, | 528 SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
| 938 INPUT_EVENT_ACK_STATE_CONSUMED); | 529 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 939 base::MessageLoop::current()->RunUntilIdle(); | 530 base::MessageLoop::current()->RunUntilIdle(); |
| 940 client_->ExpectAckCalled(1); | 531 ack_handler_->ExpectAckCalled(1); |
| 941 EXPECT_EQ(1U, process_->sink().message_count()); | 532 EXPECT_EQ(1U, process_->sink().message_count()); |
| 942 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 533 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 943 InputMsg_HandleInputEvent::ID)); | 534 InputMsg_HandleInputEvent::ID)); |
| 944 process_->sink().ClearMessages(); | 535 process_->sink().ClearMessages(); |
| 945 | 536 |
| 946 // After the final ack, the queue should be empty. | 537 // After the final ack, the queue should be empty. |
| 947 SendInputEventACK(WebInputEvent::GestureScrollEnd, | 538 SendInputEventACK(WebInputEvent::GestureScrollEnd, |
| 948 INPUT_EVENT_ACK_STATE_CONSUMED); | 539 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 949 base::MessageLoop::current()->RunUntilIdle(); | 540 base::MessageLoop::current()->RunUntilIdle(); |
| 950 client_->ExpectAckCalled(1); | 541 ack_handler_->ExpectAckCalled(1); |
| 951 EXPECT_EQ(0U, process_->sink().message_count()); | 542 EXPECT_EQ(0U, process_->sink().message_count()); |
| 952 } | 543 } |
| 953 | 544 |
| 954 TEST_F(ImmediateInputRouterTest, CoalescesScrollAndPinchEvents) { | 545 TEST_F(ImmediateInputRouterTest, CoalescesScrollAndPinchEvents) { |
| 955 // Turn off debounce handling for test isolation. | 546 // Turn off debounce handling for test isolation. |
| 956 set_debounce_interval_time_ms(0); | 547 set_debounce_interval_time_ms(0); |
| 957 | 548 |
| 958 // Test coalescing of only GestureScrollUpdate events. | 549 // Test coalescing of only GestureScrollUpdate events. |
| 959 // Simulate gesture events. | 550 // Simulate gesture events. |
| 960 | 551 |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1193 EXPECT_EQ(0U, process_->sink().message_count()); | 784 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1194 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 785 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1195 | 786 |
| 1196 // GFC after previous GFS is dispatched and acked. | 787 // GFC after previous GFS is dispatched and acked. |
| 1197 process_->sink().ClearMessages(); | 788 process_->sink().ClearMessages(); |
| 1198 SimulateGestureFlingStartEvent(0, -10, source_device); | 789 SimulateGestureFlingStartEvent(0, -10, source_device); |
| 1199 EXPECT_TRUE(FlingInProgress()); | 790 EXPECT_TRUE(FlingInProgress()); |
| 1200 SendInputEventACK(WebInputEvent::GestureFlingStart, | 791 SendInputEventACK(WebInputEvent::GestureFlingStart, |
| 1201 INPUT_EVENT_ACK_STATE_CONSUMED); | 792 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1202 base::MessageLoop::current()->RunUntilIdle(); | 793 base::MessageLoop::current()->RunUntilIdle(); |
| 1203 client_->ExpectAckCalled(1); | 794 ack_handler_->ExpectAckCalled(1); |
| 1204 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | 795 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); |
| 1205 EXPECT_FALSE(FlingInProgress()); | 796 EXPECT_FALSE(FlingInProgress()); |
| 1206 EXPECT_EQ(2U, process_->sink().message_count()); | 797 EXPECT_EQ(2U, process_->sink().message_count()); |
| 1207 SendInputEventACK(WebInputEvent::GestureFlingCancel, | 798 SendInputEventACK(WebInputEvent::GestureFlingCancel, |
| 1208 INPUT_EVENT_ACK_STATE_CONSUMED); | 799 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1209 base::MessageLoop::current()->RunUntilIdle(); | 800 base::MessageLoop::current()->RunUntilIdle(); |
| 1210 client_->ExpectAckCalled(1); | 801 ack_handler_->ExpectAckCalled(1); |
| 1211 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 802 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1212 | 803 |
| 1213 // GFC before previous GFS is acked. | 804 // GFC before previous GFS is acked. |
| 1214 process_->sink().ClearMessages(); | 805 process_->sink().ClearMessages(); |
| 1215 SimulateGestureFlingStartEvent(0, -10, source_device); | 806 SimulateGestureFlingStartEvent(0, -10, source_device); |
| 1216 EXPECT_TRUE(FlingInProgress()); | 807 EXPECT_TRUE(FlingInProgress()); |
| 1217 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | 808 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); |
| 1218 EXPECT_FALSE(FlingInProgress()); | 809 EXPECT_FALSE(FlingInProgress()); |
| 1219 EXPECT_EQ(1U, process_->sink().message_count()); | 810 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1220 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | 811 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); |
| 1221 | 812 |
| 1222 // Advance state realistically. | 813 // Advance state realistically. |
| 1223 SendInputEventACK(WebInputEvent::GestureFlingStart, | 814 SendInputEventACK(WebInputEvent::GestureFlingStart, |
| 1224 INPUT_EVENT_ACK_STATE_CONSUMED); | 815 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1225 base::MessageLoop::current()->RunUntilIdle(); | 816 base::MessageLoop::current()->RunUntilIdle(); |
| 1226 SendInputEventACK(WebInputEvent::GestureFlingCancel, | 817 SendInputEventACK(WebInputEvent::GestureFlingCancel, |
| 1227 INPUT_EVENT_ACK_STATE_CONSUMED); | 818 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1228 base::MessageLoop::current()->RunUntilIdle(); | 819 base::MessageLoop::current()->RunUntilIdle(); |
| 1229 client_->ExpectAckCalled(2); | 820 ack_handler_->ExpectAckCalled(2); |
| 1230 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 821 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
| 1231 | 822 |
| 1232 // GFS is added to the queue if another event is pending | 823 // GFS is added to the queue if another event is pending |
| 1233 process_->sink().ClearMessages(); | 824 process_->sink().ClearMessages(); |
| 1234 SimulateGestureScrollUpdateEvent(8, -7, 0); | 825 SimulateGestureScrollUpdateEvent(8, -7, 0); |
| 1235 SimulateGestureFlingStartEvent(0, -10, source_device); | 826 SimulateGestureFlingStartEvent(0, -10, source_device); |
| 1236 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | 827 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); |
| 1237 EXPECT_EQ(1U, process_->sink().message_count()); | 828 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1238 WebGestureEvent merged_event = GestureEventLastQueueEvent(); | 829 WebGestureEvent merged_event = GestureEventLastQueueEvent(); |
| 1239 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type); | 830 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type); |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1564 SendTouchEvent(); | 1155 SendTouchEvent(); |
| 1565 client_->ExpectSendImmediatelyCalled(false); | 1156 client_->ExpectSendImmediatelyCalled(false); |
| 1566 EXPECT_EQ(0U, process_->sink().message_count()); | 1157 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1567 | 1158 |
| 1568 EXPECT_EQ(2U, TouchEventQueueSize()); | 1159 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 1569 | 1160 |
| 1570 // Receive an ACK for the first touch-event. | 1161 // Receive an ACK for the first touch-event. |
| 1571 SendInputEventACK(WebInputEvent::TouchStart, | 1162 SendInputEventACK(WebInputEvent::TouchStart, |
| 1572 INPUT_EVENT_ACK_STATE_CONSUMED); | 1163 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1573 EXPECT_EQ(1U, TouchEventQueueSize()); | 1164 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1574 client_->ExpectAckCalled(1); | 1165 ack_handler_->ExpectAckCalled(1); |
| 1575 EXPECT_EQ(WebInputEvent::TouchStart, | 1166 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1576 client_->acked_touch_event().event.type); | 1167 ack_handler_->acked_touch_event().event.type); |
| 1577 EXPECT_EQ(1U, process_->sink().message_count()); | 1168 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1578 process_->sink().ClearMessages(); | 1169 process_->sink().ClearMessages(); |
| 1579 | 1170 |
| 1580 SendInputEventACK(WebInputEvent::TouchMove, | 1171 SendInputEventACK(WebInputEvent::TouchMove, |
| 1581 INPUT_EVENT_ACK_STATE_CONSUMED); | 1172 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1582 EXPECT_EQ(0U, TouchEventQueueSize()); | 1173 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1583 client_->ExpectAckCalled(1); | 1174 ack_handler_->ExpectAckCalled(1); |
| 1584 EXPECT_EQ(WebInputEvent::TouchMove, | 1175 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1585 client_->acked_touch_event().event.type); | 1176 ack_handler_->acked_touch_event().event.type); |
| 1586 EXPECT_EQ(0U, process_->sink().message_count()); | 1177 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1587 } | 1178 } |
| 1588 | 1179 |
| 1589 // Tests that the touch-queue is emptied if a page stops listening for touch | 1180 // Tests that the touch-queue is emptied if a page stops listening for touch |
| 1590 // events. | 1181 // events. |
| 1591 TEST_F(ImmediateInputRouterTest, TouchEventQueueFlush) { | 1182 TEST_F(ImmediateInputRouterTest, TouchEventQueueFlush) { |
| 1592 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); | 1183 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); |
| 1593 EXPECT_TRUE(client_->has_touch_handler()); | 1184 EXPECT_TRUE(client_->has_touch_handler()); |
| 1594 EXPECT_EQ(0U, process_->sink().message_count()); | 1185 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1595 EXPECT_EQ(0U, TouchEventQueueSize()); | 1186 EXPECT_EQ(0U, TouchEventQueueSize()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1616 } | 1207 } |
| 1617 EXPECT_EQ(0U, process_->sink().message_count()); | 1208 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1618 EXPECT_EQ(32U, TouchEventQueueSize()); | 1209 EXPECT_EQ(32U, TouchEventQueueSize()); |
| 1619 | 1210 |
| 1620 // Receive an ACK for the first touch-event. One of the queued touch-event | 1211 // Receive an ACK for the first touch-event. One of the queued touch-event |
| 1621 // should be forwarded. | 1212 // should be forwarded. |
| 1622 SendInputEventACK(WebInputEvent::TouchStart, | 1213 SendInputEventACK(WebInputEvent::TouchStart, |
| 1623 INPUT_EVENT_ACK_STATE_CONSUMED); | 1214 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1624 EXPECT_EQ(31U, TouchEventQueueSize()); | 1215 EXPECT_EQ(31U, TouchEventQueueSize()); |
| 1625 EXPECT_EQ(WebInputEvent::TouchStart, | 1216 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1626 client_->acked_touch_event().event.type); | 1217 ack_handler_->acked_touch_event().event.type); |
| 1627 client_->ExpectAckCalled(1); | 1218 ack_handler_->ExpectAckCalled(1); |
| 1628 EXPECT_EQ(1U, process_->sink().message_count()); | 1219 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1629 process_->sink().ClearMessages(); | 1220 process_->sink().ClearMessages(); |
| 1630 | 1221 |
| 1631 // The page stops listening for touch-events. The touch-event queue should now | 1222 // The page stops listening for touch-events. The touch-event queue should now |
| 1632 // be emptied, but none of the queued touch-events should be sent to the | 1223 // be emptied, but none of the queued touch-events should be sent to the |
| 1633 // renderer. | 1224 // renderer. |
| 1634 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false)); | 1225 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false)); |
| 1635 EXPECT_FALSE(client_->has_touch_handler()); | 1226 EXPECT_FALSE(client_->has_touch_handler()); |
| 1636 EXPECT_EQ(0U, process_->sink().message_count()); | 1227 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1637 EXPECT_EQ(0U, TouchEventQueueSize()); | 1228 EXPECT_EQ(0U, TouchEventQueueSize()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1664 EXPECT_EQ(0U, process_->sink().message_count()); | 1255 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1665 EXPECT_EQ(3U, TouchEventQueueSize()); | 1256 EXPECT_EQ(3U, TouchEventQueueSize()); |
| 1666 client_->ExpectSendImmediatelyCalled(false); | 1257 client_->ExpectSendImmediatelyCalled(false); |
| 1667 | 1258 |
| 1668 // ACK the press. | 1259 // ACK the press. |
| 1669 SendInputEventACK(WebInputEvent::TouchStart, | 1260 SendInputEventACK(WebInputEvent::TouchStart, |
| 1670 INPUT_EVENT_ACK_STATE_CONSUMED); | 1261 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1671 EXPECT_EQ(1U, process_->sink().message_count()); | 1262 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1672 EXPECT_EQ(2U, TouchEventQueueSize()); | 1263 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 1673 EXPECT_EQ(WebInputEvent::TouchStart, | 1264 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1674 client_->acked_touch_event().event.type); | 1265 ack_handler_->acked_touch_event().event.type); |
| 1675 client_->ExpectAckCalled(1); | 1266 ack_handler_->ExpectAckCalled(1); |
| 1676 process_->sink().ClearMessages(); | 1267 process_->sink().ClearMessages(); |
| 1677 | 1268 |
| 1678 // Coalesced touch-move events should be sent. | 1269 // Coalesced touch-move events should be sent. |
| 1679 client_->ExpectSendImmediatelyCalled(true); | 1270 client_->ExpectSendImmediatelyCalled(true); |
| 1680 EXPECT_EQ(WebInputEvent::TouchMove, | 1271 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1681 client_->immediately_sent_touch_event().event.type); | 1272 client_->immediately_sent_touch_event().event.type); |
| 1682 | 1273 |
| 1683 // ACK the moves. | 1274 // ACK the moves. |
| 1684 SendInputEventACK(WebInputEvent::TouchMove, | 1275 SendInputEventACK(WebInputEvent::TouchMove, |
| 1685 INPUT_EVENT_ACK_STATE_CONSUMED); | 1276 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1686 EXPECT_EQ(1U, process_->sink().message_count()); | 1277 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1687 EXPECT_EQ(1U, TouchEventQueueSize()); | 1278 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1688 EXPECT_EQ(WebInputEvent::TouchMove, | 1279 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1689 client_->acked_touch_event().event.type); | 1280 ack_handler_->acked_touch_event().event.type); |
| 1690 client_->ExpectAckCalled(10); | 1281 ack_handler_->ExpectAckCalled(10); |
| 1691 process_->sink().ClearMessages(); | 1282 process_->sink().ClearMessages(); |
| 1692 | 1283 |
| 1693 // ACK the release. | 1284 // ACK the release. |
| 1694 SendInputEventACK(WebInputEvent::TouchEnd, | 1285 SendInputEventACK(WebInputEvent::TouchEnd, |
| 1695 INPUT_EVENT_ACK_STATE_CONSUMED); | 1286 INPUT_EVENT_ACK_STATE_CONSUMED); |
| 1696 EXPECT_EQ(0U, process_->sink().message_count()); | 1287 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1697 EXPECT_EQ(0U, TouchEventQueueSize()); | 1288 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1698 EXPECT_EQ(WebInputEvent::TouchEnd, | 1289 EXPECT_EQ(WebInputEvent::TouchEnd, |
| 1699 client_->acked_touch_event().event.type); | 1290 ack_handler_->acked_touch_event().event.type); |
| 1700 client_->ExpectAckCalled(1); | 1291 ack_handler_->ExpectAckCalled(1); |
| 1701 } | 1292 } |
| 1702 | 1293 |
| 1703 // Tests that an event that has already been sent but hasn't been ack'ed yet | 1294 // Tests that an event that has already been sent but hasn't been ack'ed yet |
| 1704 // doesn't get coalesced with newer events. | 1295 // doesn't get coalesced with newer events. |
| 1705 TEST_F(ImmediateInputRouterTest, SentTouchEventDoesNotCoalesce) { | 1296 TEST_F(ImmediateInputRouterTest, SentTouchEventDoesNotCoalesce) { |
| 1706 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); | 1297 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); |
| 1707 EXPECT_EQ(0U, process_->sink().message_count()); | 1298 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1708 EXPECT_EQ(0U, TouchEventQueueSize()); | 1299 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1709 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); | 1300 EXPECT_TRUE(input_router_->ShouldForwardTouchEvent()); |
| 1710 | 1301 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1845 SendTouchEvent(); | 1436 SendTouchEvent(); |
| 1846 EXPECT_EQ(0U, process_->sink().message_count()); | 1437 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1847 EXPECT_EQ(2U, TouchEventQueueSize()); | 1438 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 1848 | 1439 |
| 1849 // Receive an ACK for the first touch-event. This should release the queued | 1440 // Receive an ACK for the first touch-event. This should release the queued |
| 1850 // touch-event, but it should not be sent to the renderer. | 1441 // touch-event, but it should not be sent to the renderer. |
| 1851 SendInputEventACK(WebInputEvent::TouchStart, | 1442 SendInputEventACK(WebInputEvent::TouchStart, |
| 1852 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1443 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1853 EXPECT_EQ(0U, TouchEventQueueSize()); | 1444 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1854 EXPECT_EQ(WebInputEvent::TouchMove, | 1445 EXPECT_EQ(WebInputEvent::TouchMove, |
| 1855 client_->acked_touch_event().event.type); | 1446 ack_handler_->acked_touch_event().event.type); |
| 1856 client_->ExpectAckCalled(2); | 1447 ack_handler_->ExpectAckCalled(2); |
| 1857 EXPECT_EQ(0U, process_->sink().message_count()); | 1448 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1858 process_->sink().ClearMessages(); | 1449 process_->sink().ClearMessages(); |
| 1859 | 1450 |
| 1860 // Send a release event. This should not reach the renderer. | 1451 // Send a release event. This should not reach the renderer. |
| 1861 ReleaseTouchPoint(0); | 1452 ReleaseTouchPoint(0); |
| 1862 SendTouchEvent(); | 1453 SendTouchEvent(); |
| 1863 EXPECT_EQ(0U, process_->sink().message_count()); | 1454 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1864 EXPECT_EQ(WebInputEvent::TouchEnd, | 1455 EXPECT_EQ(WebInputEvent::TouchEnd, |
| 1865 client_->acked_touch_event().event.type); | 1456 ack_handler_->acked_touch_event().event.type); |
| 1866 client_->ExpectAckCalled(1); | 1457 ack_handler_->ExpectAckCalled(1); |
| 1867 | 1458 |
| 1868 // Send a press-event, followed by move and release events, and another press | 1459 // Send a press-event, followed by move and release events, and another press |
| 1869 // event, before the ACK for the first press event comes back. All of the | 1460 // event, before the ACK for the first press event comes back. All of the |
| 1870 // events should be queued first. After the NO_CONSUMER ack for the first | 1461 // events should be queued first. After the NO_CONSUMER ack for the first |
| 1871 // touch-press, all events upto the second touch-press should be flushed. | 1462 // touch-press, all events upto the second touch-press should be flushed. |
| 1872 PressTouchPoint(10, 10); | 1463 PressTouchPoint(10, 10); |
| 1873 SendTouchEvent(); | 1464 SendTouchEvent(); |
| 1874 EXPECT_EQ(1U, process_->sink().message_count()); | 1465 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1875 process_->sink().ClearMessages(); | 1466 process_->sink().ClearMessages(); |
| 1876 | 1467 |
| 1877 MoveTouchPoint(0, 5, 5); | 1468 MoveTouchPoint(0, 5, 5); |
| 1878 SendTouchEvent(); | 1469 SendTouchEvent(); |
| 1879 MoveTouchPoint(0, 6, 5); | 1470 MoveTouchPoint(0, 6, 5); |
| 1880 SendTouchEvent(); | 1471 SendTouchEvent(); |
| 1881 ReleaseTouchPoint(0); | 1472 ReleaseTouchPoint(0); |
| 1882 SendTouchEvent(); | 1473 SendTouchEvent(); |
| 1883 | 1474 |
| 1884 PressTouchPoint(6, 5); | 1475 PressTouchPoint(6, 5); |
| 1885 SendTouchEvent(); | 1476 SendTouchEvent(); |
| 1886 EXPECT_EQ(0U, process_->sink().message_count()); | 1477 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1887 // The queue should hold the first sent touch-press event, the coalesced | 1478 // The queue should hold the first sent touch-press event, the coalesced |
| 1888 // touch-move event, the touch-end event and the second touch-press event. | 1479 // touch-move event, the touch-end event and the second touch-press event. |
| 1889 EXPECT_EQ(4U, TouchEventQueueSize()); | 1480 EXPECT_EQ(4U, TouchEventQueueSize()); |
| 1890 | 1481 |
| 1891 SendInputEventACK(WebInputEvent::TouchStart, | 1482 SendInputEventACK(WebInputEvent::TouchStart, |
| 1892 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1483 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1893 EXPECT_EQ(1U, process_->sink().message_count()); | 1484 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1894 EXPECT_EQ(WebInputEvent::TouchEnd, client_->acked_touch_event().event.type); | 1485 EXPECT_EQ(WebInputEvent::TouchEnd, |
| 1895 client_->ExpectAckCalled(4); | 1486 ack_handler_->acked_touch_event().event.type); |
| 1487 ack_handler_->ExpectAckCalled(4); |
| 1896 EXPECT_EQ(1U, TouchEventQueueSize()); | 1488 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1897 process_->sink().ClearMessages(); | 1489 process_->sink().ClearMessages(); |
| 1898 | 1490 |
| 1899 // ACK the second press event as NO_CONSUMER too. | 1491 // ACK the second press event as NO_CONSUMER too. |
| 1900 SendInputEventACK(WebInputEvent::TouchStart, | 1492 SendInputEventACK(WebInputEvent::TouchStart, |
| 1901 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1493 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 1902 EXPECT_EQ(0U, process_->sink().message_count()); | 1494 EXPECT_EQ(0U, process_->sink().message_count()); |
| 1903 EXPECT_EQ(WebInputEvent::TouchStart, client_->acked_touch_event().event.type); | 1495 EXPECT_EQ(WebInputEvent::TouchStart, |
| 1904 client_->ExpectAckCalled(1); | 1496 ack_handler_->acked_touch_event().event.type); |
| 1497 ack_handler_->ExpectAckCalled(1); |
| 1905 EXPECT_EQ(0U, TouchEventQueueSize()); | 1498 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 1906 | 1499 |
| 1907 // Send a second press event. Even though the first touch had NO_CONSUMER, | 1500 // Send a second press event. Even though the first touch had NO_CONSUMER, |
| 1908 // this press event should reach the renderer. | 1501 // this press event should reach the renderer. |
| 1909 PressTouchPoint(1, 1); | 1502 PressTouchPoint(1, 1); |
| 1910 SendTouchEvent(); | 1503 SendTouchEvent(); |
| 1911 EXPECT_EQ(1U, process_->sink().message_count()); | 1504 EXPECT_EQ(1U, process_->sink().message_count()); |
| 1912 EXPECT_EQ(1U, TouchEventQueueSize()); | 1505 EXPECT_EQ(1U, TouchEventQueueSize()); |
| 1913 } | 1506 } |
| 1914 | 1507 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2031 MoveTouchPoint(1, 30, 30); | 1624 MoveTouchPoint(1, 30, 30); |
| 2032 SendTouchEvent(); | 1625 SendTouchEvent(); |
| 2033 EXPECT_EQ(0U, process_->sink().message_count()); | 1626 EXPECT_EQ(0U, process_->sink().message_count()); |
| 2034 EXPECT_EQ(4U, TouchEventQueueSize()); | 1627 EXPECT_EQ(4U, TouchEventQueueSize()); |
| 2035 | 1628 |
| 2036 SendInputEventACK(WebInputEvent::TouchEnd, | 1629 SendInputEventACK(WebInputEvent::TouchEnd, |
| 2037 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1630 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2038 EXPECT_EQ(1U, process_->sink().message_count()); | 1631 EXPECT_EQ(1U, process_->sink().message_count()); |
| 2039 EXPECT_EQ(2U, TouchEventQueueSize()); | 1632 EXPECT_EQ(2U, TouchEventQueueSize()); |
| 2040 EXPECT_EQ(WebInputEvent::TouchMove, | 1633 EXPECT_EQ(WebInputEvent::TouchMove, |
| 2041 client_->acked_touch_event().event.type); | 1634 ack_handler_->acked_touch_event().event.type); |
| 2042 process_->sink().ClearMessages(); | 1635 process_->sink().ClearMessages(); |
| 2043 | 1636 |
| 2044 // ACK the press with NO_CONSUMED_EXISTS. This should release the queued | 1637 // ACK the press with NO_CONSUMED_EXISTS. This should release the queued |
| 2045 // touch-move events to the view. | 1638 // touch-move events to the view. |
| 2046 SendInputEventACK(WebInputEvent::TouchStart, | 1639 SendInputEventACK(WebInputEvent::TouchStart, |
| 2047 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | 1640 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
| 2048 EXPECT_EQ(0U, process_->sink().message_count()); | 1641 EXPECT_EQ(0U, process_->sink().message_count()); |
| 2049 EXPECT_EQ(0U, TouchEventQueueSize()); | 1642 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 2050 EXPECT_EQ(WebInputEvent::TouchMove, | 1643 EXPECT_EQ(WebInputEvent::TouchMove, |
| 2051 client_->acked_touch_event().event.type); | 1644 ack_handler_->acked_touch_event().event.type); |
| 2052 | 1645 |
| 2053 ReleaseTouchPoint(2); | 1646 ReleaseTouchPoint(2); |
| 2054 ReleaseTouchPoint(1); | 1647 ReleaseTouchPoint(1); |
| 2055 EXPECT_EQ(0U, process_->sink().message_count()); | 1648 EXPECT_EQ(0U, process_->sink().message_count()); |
| 2056 EXPECT_EQ(0U, TouchEventQueueSize()); | 1649 EXPECT_EQ(0U, TouchEventQueueSize()); |
| 2057 } | 1650 } |
| 2058 | 1651 |
| 2059 #if defined(OS_WIN) || defined(USE_AURA) | 1652 #if defined(OS_WIN) || defined(USE_AURA) |
| 2060 // Tests that the acked events have correct state. (ui::Events are used only on | 1653 // Tests that the acked events have correct state. (ui::Events are used only on |
| 2061 // windows and aura) | 1654 // windows and aura) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2119 WebInputEvent::TouchStart, | 1712 WebInputEvent::TouchStart, |
| 2120 WebInputEvent::TouchMove }; | 1713 WebInputEvent::TouchMove }; |
| 2121 | 1714 |
| 2122 TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES; | 1715 TouchEventCoordinateSystem coordinate_system = LOCAL_COORDINATES; |
| 2123 #if !defined(OS_WIN) | 1716 #if !defined(OS_WIN) |
| 2124 coordinate_system = SCREEN_COORDINATES; | 1717 coordinate_system = SCREEN_COORDINATES; |
| 2125 #endif | 1718 #endif |
| 2126 for (size_t i = 0; i < arraysize(acks); ++i) { | 1719 for (size_t i = 0; i < arraysize(acks); ++i) { |
| 2127 SendInputEventACK(acks[i], | 1720 SendInputEventACK(acks[i], |
| 2128 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1721 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2129 EXPECT_EQ(acks[i], client_->acked_touch_event().event.type); | 1722 EXPECT_EQ(acks[i], ack_handler_->acked_touch_event().event.type); |
| 2130 ScopedVector<ui::TouchEvent> acked; | 1723 ScopedVector<ui::TouchEvent> acked; |
| 2131 | 1724 |
| 2132 MakeUITouchEventsFromWebTouchEvents( | 1725 MakeUITouchEventsFromWebTouchEvents( |
| 2133 client_->acked_touch_event(), &acked, coordinate_system); | 1726 ack_handler_->acked_touch_event(), &acked, coordinate_system); |
| 2134 bool success = EventListIsSubset(acked, expected_events); | 1727 bool success = EventListIsSubset(acked, expected_events); |
| 2135 EXPECT_TRUE(success) << "Failed on step: " << i; | 1728 EXPECT_TRUE(success) << "Failed on step: " << i; |
| 2136 if (!success) | 1729 if (!success) |
| 2137 break; | 1730 break; |
| 2138 expected_events.erase(expected_events.begin(), | 1731 expected_events.erase(expected_events.begin(), |
| 2139 expected_events.begin() + acked.size()); | 1732 expected_events.begin() + acked.size()); |
| 2140 } | 1733 } |
| 2141 | 1734 |
| 2142 EXPECT_EQ(0U, expected_events.size()); | 1735 EXPECT_EQ(0U, expected_events.size()); |
| 2143 } | 1736 } |
| 2144 #endif // defined(OS_WIN) || defined(USE_AURA) | 1737 #endif // defined(OS_WIN) || defined(USE_AURA) |
| 2145 | 1738 |
| 2146 TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) { | 1739 TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) { |
| 2147 // Simulate wheel events. | 1740 // Simulate wheel events. |
| 2148 SimulateWheelEvent(0, -5, 0, false); // sent directly | 1741 SimulateWheelEvent(0, -5, 0, false); // sent directly |
| 2149 SimulateWheelEvent(0, -10, 0, false); // enqueued | 1742 SimulateWheelEvent(0, -10, 0, false); // enqueued |
| 2150 | 1743 |
| 2151 // Check that only the first event was sent. | 1744 // Check that only the first event was sent. |
| 2152 EXPECT_EQ(1U, process_->sink().message_count()); | 1745 EXPECT_EQ(1U, process_->sink().message_count()); |
| 2153 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 1746 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 2154 InputMsg_HandleInputEvent::ID)); | 1747 InputMsg_HandleInputEvent::ID)); |
| 2155 process_->sink().ClearMessages(); | 1748 process_->sink().ClearMessages(); |
| 2156 | 1749 |
| 2157 // Indicate that the wheel event was unhandled. | 1750 // Indicate that the wheel event was unhandled. |
| 2158 SendInputEventACK(WebInputEvent::MouseWheel, | 1751 SendInputEventACK(WebInputEvent::MouseWheel, |
| 2159 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1752 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2160 | 1753 |
| 2161 // Check that the correct unhandled wheel event was received. | 1754 // Check that the correct unhandled wheel event was received. |
| 2162 client_->ExpectAckCalled(1); | 1755 ack_handler_->ExpectAckCalled(1); |
| 2163 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, client_->ack_state()); | 1756 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); |
| 2164 EXPECT_EQ(client_->acked_wheel_event().deltaY, -5); | 1757 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); |
| 2165 | 1758 |
| 2166 // Check that the second event was sent. | 1759 // Check that the second event was sent. |
| 2167 EXPECT_EQ(1U, process_->sink().message_count()); | 1760 EXPECT_EQ(1U, process_->sink().message_count()); |
| 2168 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( | 1761 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
| 2169 InputMsg_HandleInputEvent::ID)); | 1762 InputMsg_HandleInputEvent::ID)); |
| 2170 process_->sink().ClearMessages(); | 1763 process_->sink().ClearMessages(); |
| 2171 | 1764 |
| 2172 // Check that the correct unhandled wheel event was received. | 1765 // Check that the correct unhandled wheel event was received. |
| 2173 EXPECT_EQ(client_->acked_wheel_event().deltaY, -5); | 1766 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); |
| 2174 } | 1767 } |
| 2175 | 1768 |
| 2176 // Tests that no touch move events are sent to renderer during scrolling. | 1769 // Tests that no touch move events are sent to renderer during scrolling. |
| 2177 TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) { | 1770 TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) { |
| 2178 EnableNoTouchToRendererWhileScrolling(); | 1771 EnableNoTouchToRendererWhileScrolling(); |
| 2179 set_debounce_interval_time_ms(0); | 1772 set_debounce_interval_time_ms(0); |
| 2180 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); | 1773 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); |
| 2181 process_->sink().ClearMessages(); | 1774 process_->sink().ClearMessages(); |
| 2182 | 1775 |
| 2183 // First touch press. | 1776 // First touch press. |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2256 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1849 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2257 | 1850 |
| 2258 ReleaseTouchPoint(0); | 1851 ReleaseTouchPoint(0); |
| 2259 SendTouchEvent(); | 1852 SendTouchEvent(); |
| 2260 EXPECT_EQ(1U, process_->sink().message_count()); | 1853 EXPECT_EQ(1U, process_->sink().message_count()); |
| 2261 process_->sink().ClearMessages(); | 1854 process_->sink().ClearMessages(); |
| 2262 SendInputEventACK(WebInputEvent::TouchEnd, | 1855 SendInputEventACK(WebInputEvent::TouchEnd, |
| 2263 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 1856 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
| 2264 } | 1857 } |
| 2265 } // namespace content | 1858 } // namespace content |
| OLD | NEW |