14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/common/input/synthetic_web_input_event_builders.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/logging.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content { 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebKeyboardEvent; 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent; 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint; 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseEvent SyntheticWebMouseEventBuilder::Build( 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::Type type) { 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebMouseEvent result; 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.type = type; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseEvent SyntheticWebMouseEventBuilder::Build( 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebInputEvent::Type type, 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int window_x, 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int window_y, 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int modifiers) { 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(WebInputEvent::isMouseEventType(type)); 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebMouseEvent result = Build(type); 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.x = window_x; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.y = window_y; 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.windowX = window_x; 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.windowY = window_y; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.modifiers = modifiers; 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (type == WebInputEvent::MouseDown || type == WebInputEvent::MouseUp) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.button = WebMouseEvent::ButtonLeft; 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) else 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.button = WebMouseEvent::ButtonNone; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build( 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebMouseWheelEvent::Phase phase) { 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebMouseWheelEvent result; 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.type = WebInputEvent::MouseWheel; 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.phase = phase; 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build(float dx, 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) float dy, 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int modifiers, 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool precise) { 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebMouseWheelEvent result; 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.type = WebInputEvent::MouseWheel; 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.deltaX = dx; 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.deltaY = dy; 64d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if (dx) 65d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) result.wheelTicksX = dx > 0.0f ? 1.0f : -1.0f; 66d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if (dy) 67d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) result.wheelTicksY = dy > 0.0f ? 1.0f : -1.0f; 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.modifiers = modifiers; 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.hasPreciseScrollingDeltas = precise; 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebKeyboardEvent SyntheticWebKeyboardEventBuilder::Build( 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebInputEvent::Type type) { 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(WebInputEvent::isKeyboardEventType(type)); 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebKeyboardEvent result; 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.type = type; 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.windowsKeyCode = ui::VKEY_L; // non-null made up value. 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::Build( 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebInputEvent::Type type, 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent::SourceDevice source_device) { 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(WebInputEvent::isGestureEventType(type)); 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent result; 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.type = type; 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.sourceDevice = source_device; 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::BuildScrollUpdate( 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float dx, 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float dy, 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int modifiers) { 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent result = Build(WebInputEvent::GestureScrollUpdate, 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent::Touchscreen); 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.data.scrollUpdate.deltaX = dx; 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.data.scrollUpdate.deltaY = dy; 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.modifiers = modifiers; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::BuildPinchUpdate( 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float scale, 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float anchor_x, 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float anchor_y, 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int modifiers) { 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent result = Build(WebInputEvent::GesturePinchUpdate, 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent::Touchscreen); 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.data.pinchUpdate.scale = scale; 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.x = anchor_x; 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.y = anchor_y; 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.modifiers = modifiers; 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WebGestureEvent SyntheticWebGestureEventBuilder::BuildFling( 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float velocity_x, 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float velocity_y, 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent::SourceDevice source_device) { 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebGestureEvent result = Build(WebInputEvent::GestureFlingStart, 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) source_device); 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.data.flingStart.velocityX = velocity_x; 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.data.flingStart.velocityY = velocity_y; 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SyntheticWebTouchEvent::SyntheticWebTouchEvent() : WebTouchEvent() {} 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::ResetPoints() { 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int point = 0; 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (unsigned int i = 0; i < touchesLength; ++i) { 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (touches[i].state == WebTouchPoint::StateReleased) 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) continue; 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) touches[point] = touches[i]; 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) touches[point].state = WebTouchPoint::StateStationary; 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ++point; 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) touchesLength = point; 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type = WebInputEvent::Undefined; 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int SyntheticWebTouchEvent::PressPoint(int x, int y) { 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (touchesLength == touchesLengthCap) 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return -1; 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebTouchPoint& point = touches[touchesLength]; 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) point.id = touchesLength; 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) point.position.x = point.screenPosition.x = x; 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) point.position.y = point.screenPosition.y = y; 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) point.state = WebTouchPoint::StatePressed; 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) point.radiusX = point.radiusY = 1.f; 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ++touchesLength; 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type = WebInputEvent::TouchStart; 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return point.id; 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::MovePoint(int index, int x, int y) { 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(index >= 0 && index < touchesLengthCap); 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebTouchPoint& point = touches[index]; 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) point.position.x = point.screenPosition.x = x; 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) point.position.y = point.screenPosition.y = y; 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) touches[index].state = WebTouchPoint::StateMoved; 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type = WebInputEvent::TouchMove; 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::ReleasePoint(int index) { 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CHECK(index >= 0 && index < touchesLengthCap); 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) touches[index].state = WebTouchPoint::StateReleased; 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) type = WebInputEvent::TouchEnd; 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SyntheticWebTouchEvent::CancelPoint(int index) { 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(index >= 0 && index < touchesLengthCap); 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) touches[index].state = WebTouchPoint::StateCancelled; 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) type = WebInputEvent::TouchCancel; 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SyntheticWebTouchEvent::SetTimestamp(base::TimeDelta timestamp) { 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) timeStampSeconds = timestamp.InSecondsF(); 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)SyntheticWebTouchEvent SyntheticWebTouchEventBuilder::Build( 1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebInputEvent::Type type) { 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(WebInputEvent::isTouchEventType(type)); 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SyntheticWebTouchEvent result; 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) result.type = type; 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return result; 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace content 193