blob: d25385e5fbe3d11785bc65281eeb3472788a238d [file] [log] [blame]
[email protected]3db130e2014-03-27 08:14:481// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
dcheng59826e32017-02-22 10:31:365#include "content/shell/test_runner/event_sender.h"
[email protected]3db130e2014-03-27 08:14:486
avi5dd91f82015-12-25 22:30:467#include <stddef.h>
8
lukaszad322c5ca2016-10-07 00:32:349#include <memory>
10
lukaszac9358822016-04-07 14:43:4611#include "base/bind.h"
12#include "base/bind_helpers.h"
dtapuska43f18e9e2016-03-20 20:21:3013#include "base/command_line.h"
dcheng3dd85612017-02-08 10:46:2314#include "base/files/file_path.h"
[email protected]3db130e2014-03-27 08:14:4815#include "base/logging.h"
avi5dd91f82015-12-25 22:30:4616#include "base/macros.h"
esprehnd29ab802015-12-11 13:01:1917#include "base/strings/string16.h"
habib.virji565c80c2015-02-06 12:26:4318#include "base/strings/string_util.h"
[email protected]3db130e2014-03-27 08:14:4819#include "base/strings/stringprintf.h"
esprehnd29ab802015-12-11 13:01:1920#include "base/strings/utf_string_conversions.h"
avi5dd91f82015-12-25 22:30:4621#include "build/build_config.h"
dcheng59826e32017-02-22 10:31:3622#include "content/shell/test_runner/mock_spell_check.h"
23#include "content/shell/test_runner/test_interfaces.h"
24#include "content/shell/test_runner/web_test_delegate.h"
25#include "content/shell/test_runner/web_view_test_proxy.h"
26#include "content/shell/test_runner/web_widget_test_proxy.h"
[email protected]3db130e2014-03-27 08:14:4827#include "gin/handle.h"
28#include "gin/object_template_builder.h"
29#include "gin/wrappable.h"
dcheng3dd85612017-02-08 10:46:2330#include "net/base/filename_util.h"
31#include "third_party/WebKit/public/platform/URLConversion.h"
nzolghadr5d8596502017-01-23 22:59:3532#include "third_party/WebKit/public/platform/WebCoalescedInputEvent.h"
dtapuska836e1f92016-11-15 00:38:0633#include "third_party/WebKit/public/platform/WebGestureEvent.h"
dtapuskaa64845d2017-01-20 21:20:4534#include "third_party/WebKit/public/platform/WebKeyboardEvent.h"
mustaqcc6220fa2016-03-09 22:07:5435#include "third_party/WebKit/public/platform/WebPointerProperties.h"
[email protected]3db130e2014-03-27 08:14:4836#include "third_party/WebKit/public/platform/WebString.h"
dtapuskaa64845d2017-01-20 21:20:4537#include "third_party/WebKit/public/platform/WebTouchEvent.h"
[email protected]3db130e2014-03-27 08:14:4838#include "third_party/WebKit/public/platform/WebVector.h"
39#include "third_party/WebKit/public/web/WebContextMenuData.h"
paulmeyer90f6c31d2016-11-12 00:17:5940#include "third_party/WebKit/public/web/WebFrameWidget.h"
[email protected]3db130e2014-03-27 08:14:4841#include "third_party/WebKit/public/web/WebKit.h"
lukasza335bb762016-04-22 16:44:0342#include "third_party/WebKit/public/web/WebLocalFrame.h"
tkent588765612014-11-28 01:07:4843#include "third_party/WebKit/public/web/WebPagePopup.h"
[email protected]3db130e2014-03-27 08:14:4844#include "third_party/WebKit/public/web/WebView.h"
oshima76b6eeb2016-06-27 15:55:1245#include "ui/events/blink/blink_event_util.h"
kpschoedel3b0960a2015-05-11 17:52:1146#include "ui/events/keycodes/dom/keycode_converter.h"
[email protected]a731f1a92014-04-17 19:31:0647#include "ui/events/keycodes/keyboard_codes.h"
[email protected]3db130e2014-03-27 08:14:4848#include "v8/include/v8.h"
49
[email protected]3db130e2014-03-27 08:14:4850using blink::WebContextMenuData;
51using blink::WebDragData;
52using blink::WebDragOperationsMask;
53using blink::WebFloatPoint;
[email protected]3db130e2014-03-27 08:14:4854using blink::WebGestureEvent;
55using blink::WebInputEvent;
dtapuska5d2e9c32015-12-03 16:39:4956using blink::WebInputEventResult;
[email protected]3db130e2014-03-27 08:14:4857using blink::WebKeyboardEvent;
lukasza335bb762016-04-22 16:44:0358using blink::WebLocalFrame;
[email protected]f9634a82014-08-05 13:10:1959using blink::WebMenuItemInfo;
[email protected]3db130e2014-03-27 08:14:4860using blink::WebMouseEvent;
61using blink::WebMouseWheelEvent;
tkent588765612014-11-28 01:07:4862using blink::WebPagePopup;
[email protected]3db130e2014-03-27 08:14:4863using blink::WebPoint;
mustaqcc6220fa2016-03-09 22:07:5464using blink::WebPointerProperties;
[email protected]3db130e2014-03-27 08:14:4865using blink::WebString;
66using blink::WebTouchEvent;
67using blink::WebTouchPoint;
dcheng3dd85612017-02-08 10:46:2368using blink::WebURL;
[email protected]3db130e2014-03-27 08:14:4869using blink::WebVector;
70using blink::WebView;
71
jochenf5f31752015-06-03 12:06:3472namespace test_runner {
[email protected]3db130e2014-03-27 08:14:4873
74namespace {
75
mustaqabca6ff2016-06-09 17:29:5376const int kRawMousePointerId = -1;
mustaq758b1152016-09-02 22:06:4377const char* const kPointerTypeStringUnknown = "";
78const char* const kPointerTypeStringMouse = "mouse";
79const char* const kPointerTypeStringTouch = "touch";
80const char* const kPointerTypeStringPen = "pen";
81const char* const kPointerTypeStringEraser = "eraser";
nzolghadr43146032016-04-11 15:33:3882
83// Assigns |pointerType| from the provided |args|. Returns false if there was
84// any error.
85bool getPointerType(gin::Arguments* args,
86 bool isOnlyMouseAndPenAllowed,
mustaqabca6ff2016-06-09 17:29:5387 WebPointerProperties::PointerType& pointerType) {
nzolghadr43146032016-04-11 15:33:3888 if (args->PeekNext().IsEmpty())
89 return true;
90 std::string pointer_type_string;
91 if (!args->GetNext(&pointer_type_string)) {
92 args->ThrowError();
93 return false;
94 }
95 if (isOnlyMouseAndPenAllowed &&
96 (pointer_type_string == kPointerTypeStringUnknown ||
97 pointer_type_string == kPointerTypeStringTouch)) {
98 args->ThrowError();
99 return false;
100 }
101 if (pointer_type_string == kPointerTypeStringUnknown) {
Blink Reformat1c4d759e2017-04-09 16:34:54102 pointerType = WebMouseEvent::PointerType::kUnknown;
nzolghadr43146032016-04-11 15:33:38103 } else if (pointer_type_string == kPointerTypeStringMouse) {
Blink Reformat1c4d759e2017-04-09 16:34:54104 pointerType = WebMouseEvent::PointerType::kMouse;
nzolghadr43146032016-04-11 15:33:38105 } else if (pointer_type_string == kPointerTypeStringTouch) {
Blink Reformat1c4d759e2017-04-09 16:34:54106 pointerType = WebMouseEvent::PointerType::kTouch;
mustaq758b1152016-09-02 22:06:43107 } else if (pointer_type_string == kPointerTypeStringPen) {
Blink Reformat1c4d759e2017-04-09 16:34:54108 pointerType = WebMouseEvent::PointerType::kPen;
mustaq758b1152016-09-02 22:06:43109 } else if (pointer_type_string == kPointerTypeStringEraser) {
Blink Reformat1c4d759e2017-04-09 16:34:54110 pointerType = WebMouseEvent::PointerType::kEraser;
nzolghadr43146032016-04-11 15:33:38111 } else {
112 args->ThrowError();
113 return false;
114 }
115 return true;
116}
117
mustaqabca6ff2016-06-09 17:29:53118// Parses |pointerType|, |rawPointerId|, |pressure|, |tiltX| and |tiltY| from
119// the provided |args|. Returns false if there was any error, assuming the last
120// 3 of the five parsed parameters are optional.
121bool getMousePenPointerProperties(
nzolghadr43146032016-04-11 15:33:38122 gin::Arguments* args,
mustaqabca6ff2016-06-09 17:29:53123 WebPointerProperties::PointerType& pointerType,
124 int& rawPointerId,
125 float& pressure,
126 int& tiltX,
127 int& tiltY) {
Blink Reformat1c4d759e2017-04-09 16:34:54128 pointerType = WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:53129 rawPointerId = kRawMousePointerId;
130 pressure = std::numeric_limits<float>::quiet_NaN();
131 tiltX = 0;
132 tiltY = 0;
133
nzolghadr43146032016-04-11 15:33:38134 // Only allow pen or mouse through this API.
135 if (!getPointerType(args, false, pointerType))
136 return false;
137 if (!args->PeekNext().IsEmpty()) {
mustaqabca6ff2016-06-09 17:29:53138 if (!args->GetNext(&rawPointerId)) {
nzolghadr43146032016-04-11 15:33:38139 args->ThrowError();
140 return false;
141 }
mustaqabca6ff2016-06-09 17:29:53142
143 // Parse optional params
144 if (!args->PeekNext().IsEmpty()) {
145 if (!args->GetNext(&pressure)) {
146 args->ThrowError();
147 return false;
148 }
149 if (!args->PeekNext().IsEmpty()) {
150 if (!args->GetNext(&tiltX)) {
151 args->ThrowError();
152 return false;
153 }
154 if (!args->PeekNext().IsEmpty()) {
155 if (!args->GetNext(&tiltY)) {
156 args->ThrowError();
157 return false;
158 }
159 }
160 }
nzolghadr43146032016-04-11 15:33:38161 }
nzolghadr43146032016-04-11 15:33:38162 }
mustaqabca6ff2016-06-09 17:29:53163
nzolghadr43146032016-04-11 15:33:38164 return true;
165}
166
mustaq8911f4e2015-10-27 18:10:22167WebMouseEvent::Button GetButtonTypeFromButtonNumber(int button_code) {
168 switch (button_code) {
169 case -1:
Blink Reformat1c4d759e2017-04-09 16:34:54170 return WebMouseEvent::Button::kNoButton;
mustaq8911f4e2015-10-27 18:10:22171 case 0:
Blink Reformat1c4d759e2017-04-09 16:34:54172 return WebMouseEvent::Button::kLeft;
mustaq8911f4e2015-10-27 18:10:22173 case 1:
Blink Reformat1c4d759e2017-04-09 16:34:54174 return WebMouseEvent::Button::kMiddle;
mustaq8911f4e2015-10-27 18:10:22175 case 2:
Blink Reformat1c4d759e2017-04-09 16:34:54176 return WebMouseEvent::Button::kRight;
mustaq6ee1f8d2017-03-31 19:23:04177 case 3:
Blink Reformat1c4d759e2017-04-09 16:34:54178 return WebMouseEvent::Button::kBack;
mustaq6ee1f8d2017-03-31 19:23:04179 case 4:
Blink Reformat1c4d759e2017-04-09 16:34:54180 return WebMouseEvent::Button::kForward;
mustaq8911f4e2015-10-27 18:10:22181 }
182 NOTREACHED();
Blink Reformat1c4d759e2017-04-09 16:34:54183 return WebMouseEvent::Button::kNoButton;
mustaq8911f4e2015-10-27 18:10:22184}
185
mustaq21aed4e2015-12-15 21:47:21186int GetWebMouseEventModifierForButton(WebMouseEvent::Button button) {
187 switch (button) {
Blink Reformat1c4d759e2017-04-09 16:34:54188 case WebMouseEvent::Button::kNoButton:
mustaq21aed4e2015-12-15 21:47:21189 return 0;
Blink Reformat1c4d759e2017-04-09 16:34:54190 case WebMouseEvent::Button::kLeft:
191 return WebMouseEvent::kLeftButtonDown;
192 case WebMouseEvent::Button::kMiddle:
193 return WebMouseEvent::kMiddleButtonDown;
194 case WebMouseEvent::Button::kRight:
195 return WebMouseEvent::kRightButtonDown;
196 case WebPointerProperties::Button::kBack:
197 return WebMouseEvent::kBackButtonDown;
198 case WebPointerProperties::Button::kForward:
199 return WebMouseEvent::kForwardButtonDown;
200 case WebPointerProperties::Button::kEraser:
dcheng59826e32017-02-22 10:31:36201 return 0; // Not implemented yet
mustaq21aed4e2015-12-15 21:47:21202 }
203 NOTREACHED();
204 return 0;
205}
206
mustaq6ee1f8d2017-03-31 19:23:04207const int kButtonsInModifiers =
Blink Reformat1c4d759e2017-04-09 16:34:54208 WebMouseEvent::kLeftButtonDown | WebMouseEvent::kMiddleButtonDown |
209 WebMouseEvent::kRightButtonDown | WebMouseEvent::kBackButtonDown |
210 WebMouseEvent::kForwardButtonDown;
mustaq21aed4e2015-12-15 21:47:21211
nzolghadr65468b42016-01-19 14:03:58212int modifiersWithButtons(int modifiers, int buttons) {
dcheng59826e32017-02-22 10:31:36213 return (modifiers & ~kButtonsInModifiers) | (buttons & kButtonsInModifiers);
nzolghadr65468b42016-01-19 14:03:58214}
215
dtapuska899ac222017-01-03 18:09:16216void InitMouseEventGeneric(WebMouseEvent::Button b,
mustaqabca6ff2016-06-09 17:29:53217 int current_buttons,
218 const WebPoint& pos,
mustaqabca6ff2016-06-09 17:29:53219 int click_count,
mustaqabca6ff2016-06-09 17:29:53220 WebPointerProperties::PointerType pointerType,
221 int pointerId,
222 float pressure,
223 int tiltX,
224 int tiltY,
225 WebMouseEvent* e) {
[email protected]3db130e2014-03-27 08:14:48226 e->button = b;
Blink Reformat1c4d759e2017-04-09 16:34:54227 e->SetPositionInWidget(pos.x, pos.y);
228 e->SetPositionInScreen(pos.x, pos.y);
229 e->pointer_type = pointerType;
nzolghadr43146032016-04-11 15:33:38230 e->id = pointerId;
mustaqabca6ff2016-06-09 17:29:53231 e->force = pressure;
Blink Reformat1c4d759e2017-04-09 16:34:54232 e->tilt_x = tiltX;
233 e->tilt_y = tiltY;
234 e->click_count = click_count;
[email protected]3db130e2014-03-27 08:14:48235}
236
dtapuska899ac222017-01-03 18:09:16237void InitMouseEvent(WebMouseEvent::Button b,
mustaqabca6ff2016-06-09 17:29:53238 int current_buttons,
239 const WebPoint& pos,
mustaqabca6ff2016-06-09 17:29:53240 int click_count,
mustaqabca6ff2016-06-09 17:29:53241 WebMouseEvent* e) {
dtapuska899ac222017-01-03 18:09:16242 InitMouseEventGeneric(b, current_buttons, pos, click_count,
Blink Reformat1c4d759e2017-04-09 16:34:54243 WebPointerProperties::PointerType::kMouse, 0, 0.0, 0, 0,
dtapuska899ac222017-01-03 18:09:16244 e);
mustaqabca6ff2016-06-09 17:29:53245}
246
dtapuska899ac222017-01-03 18:09:16247void InitGestureEventFromMouseWheel(const WebMouseWheelEvent& wheel_event,
dtapuska43f18e9e2016-03-20 20:21:30248 WebGestureEvent* gesture_event) {
Blink Reformat1c4d759e2017-04-09 16:34:54249 gesture_event->source_device = blink::kWebGestureDeviceTouchpad;
250 gesture_event->x = wheel_event.PositionInWidget().x;
251 gesture_event->y = wheel_event.PositionInWidget().y;
252 gesture_event->global_x = wheel_event.PositionInScreen().x;
253 gesture_event->global_y = wheel_event.PositionInScreen().y;
dtapuska43f18e9e2016-03-20 20:21:30254}
255
[email protected]3db130e2014-03-27 08:14:48256int GetKeyModifier(const std::string& modifier_name) {
257 const char* characters = modifier_name.c_str();
258 if (!strcmp(characters, "ctrlKey")
259#ifndef __APPLE__
260 || !strcmp(characters, "addSelectionKey")
261#endif
dcheng59826e32017-02-22 10:31:36262 ) {
Blink Reformat1c4d759e2017-04-09 16:34:54263 return WebInputEvent::kControlKey;
[email protected]3db130e2014-03-27 08:14:48264 } else if (!strcmp(characters, "shiftKey") ||
265 !strcmp(characters, "rangeSelectionKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54266 return WebInputEvent::kShiftKey;
[email protected]3db130e2014-03-27 08:14:48267 } else if (!strcmp(characters, "altKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54268 return WebInputEvent::kAltKey;
[email protected]3db130e2014-03-27 08:14:48269#ifdef __APPLE__
270 } else if (!strcmp(characters, "metaKey") ||
271 !strcmp(characters, "addSelectionKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54272 return WebInputEvent::kMetaKey;
[email protected]3db130e2014-03-27 08:14:48273#else
274 } else if (!strcmp(characters, "metaKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54275 return WebInputEvent::kMetaKey;
[email protected]3db130e2014-03-27 08:14:48276#endif
277 } else if (!strcmp(characters, "autoRepeat")) {
Blink Reformat1c4d759e2017-04-09 16:34:54278 return WebInputEvent::kIsAutoRepeat;
[email protected]3db130e2014-03-27 08:14:48279 } else if (!strcmp(characters, "copyKey")) {
280#ifdef __APPLE__
Blink Reformat1c4d759e2017-04-09 16:34:54281 return WebInputEvent::kAltKey;
[email protected]3db130e2014-03-27 08:14:48282#else
Blink Reformat1c4d759e2017-04-09 16:34:54283 return WebInputEvent::kControlKey;
[email protected]3db130e2014-03-27 08:14:48284#endif
tkentc8c0bc82015-10-15 22:43:48285 } else if (!strcmp(characters, "accessKey")) {
286#ifdef __APPLE__
Blink Reformat1c4d759e2017-04-09 16:34:54287 return WebInputEvent::kAltKey | WebInputEvent::kControlKey;
tkentc8c0bc82015-10-15 22:43:48288#else
Blink Reformat1c4d759e2017-04-09 16:34:54289 return WebInputEvent::kAltKey;
tkentc8c0bc82015-10-15 22:43:48290#endif
jinho.bangffc700e2014-11-17 04:05:26291 } else if (!strcmp(characters, "leftButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54292 return WebInputEvent::kLeftButtonDown;
jinho.bangffc700e2014-11-17 04:05:26293 } else if (!strcmp(characters, "middleButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54294 return WebInputEvent::kMiddleButtonDown;
jinho.bangffc700e2014-11-17 04:05:26295 } else if (!strcmp(characters, "rightButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54296 return WebInputEvent::kRightButtonDown;
mustaq6ee1f8d2017-03-31 19:23:04297 } else if (!strcmp(characters, "backButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54298 return WebInputEvent::kBackButtonDown;
mustaq6ee1f8d2017-03-31 19:23:04299 } else if (!strcmp(characters, "forwardButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54300 return WebInputEvent::kForwardButtonDown;
dtapuska299efe12015-10-05 16:53:44301 } else if (!strcmp(characters, "capsLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54302 return WebInputEvent::kCapsLockOn;
dtapuska299efe12015-10-05 16:53:44303 } else if (!strcmp(characters, "numLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54304 return WebInputEvent::kNumLockOn;
dtapuska299efe12015-10-05 16:53:44305 } else if (!strcmp(characters, "locationLeft")) {
Blink Reformat1c4d759e2017-04-09 16:34:54306 return WebInputEvent::kIsLeft;
dtapuska299efe12015-10-05 16:53:44307 } else if (!strcmp(characters, "locationRight")) {
Blink Reformat1c4d759e2017-04-09 16:34:54308 return WebInputEvent::kIsRight;
dtapuska299efe12015-10-05 16:53:44309 } else if (!strcmp(characters, "locationNumpad")) {
Blink Reformat1c4d759e2017-04-09 16:34:54310 return WebInputEvent::kIsKeyPad;
dtapuska299efe12015-10-05 16:53:44311 } else if (!strcmp(characters, "isComposing")) {
Blink Reformat1c4d759e2017-04-09 16:34:54312 return WebInputEvent::kIsComposing;
dtapuska299efe12015-10-05 16:53:44313 } else if (!strcmp(characters, "altGraphKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54314 return WebInputEvent::kAltGrKey;
dtapuska299efe12015-10-05 16:53:44315 } else if (!strcmp(characters, "fnKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54316 return WebInputEvent::kFnKey;
dtapuska299efe12015-10-05 16:53:44317 } else if (!strcmp(characters, "symbolKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54318 return WebInputEvent::kSymbolKey;
dtapuska299efe12015-10-05 16:53:44319 } else if (!strcmp(characters, "scrollLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54320 return WebInputEvent::kScrollLockOn;
[email protected]3db130e2014-03-27 08:14:48321 }
322
323 return 0;
324}
325
326int GetKeyModifiers(const std::vector<std::string>& modifier_names) {
327 int modifiers = 0;
328 for (std::vector<std::string>::const_iterator it = modifier_names.begin();
329 it != modifier_names.end(); ++it) {
330 modifiers |= GetKeyModifier(*it);
331 }
332 return modifiers;
333}
334
bashidbd2ef9bb2015-06-02 01:39:32335int GetKeyModifiersFromV8(v8::Isolate* isolate, v8::Local<v8::Value> value) {
[email protected]3db130e2014-03-27 08:14:48336 std::vector<std::string> modifier_names;
337 if (value->IsString()) {
338 modifier_names.push_back(gin::V8ToString(value));
339 } else if (value->IsArray()) {
dcheng59826e32017-02-22 10:31:36340 gin::Converter<std::vector<std::string>>::FromV8(isolate, value,
341 &modifier_names);
[email protected]3db130e2014-03-27 08:14:48342 }
343 return GetKeyModifiers(modifier_names);
344}
345
chongzb92d7112016-07-04 22:11:54346WebMouseWheelEvent::Phase GetMouseWheelEventPhase(
347 const std::string& phase_name) {
348 if (phase_name == "phaseNone") {
Blink Reformat1c4d759e2017-04-09 16:34:54349 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54350 } else if (phase_name == "phaseBegan") {
Blink Reformat1c4d759e2017-04-09 16:34:54351 return WebMouseWheelEvent::kPhaseBegan;
chongzb92d7112016-07-04 22:11:54352 } else if (phase_name == "phaseStationary") {
Blink Reformat1c4d759e2017-04-09 16:34:54353 return WebMouseWheelEvent::kPhaseStationary;
chongzb92d7112016-07-04 22:11:54354 } else if (phase_name == "phaseChanged") {
Blink Reformat1c4d759e2017-04-09 16:34:54355 return WebMouseWheelEvent::kPhaseChanged;
chongzb92d7112016-07-04 22:11:54356 } else if (phase_name == "phaseEnded") {
Blink Reformat1c4d759e2017-04-09 16:34:54357 return WebMouseWheelEvent::kPhaseEnded;
chongzb92d7112016-07-04 22:11:54358 } else if (phase_name == "phaseCancelled") {
Blink Reformat1c4d759e2017-04-09 16:34:54359 return WebMouseWheelEvent::kPhaseCancelled;
chongzb92d7112016-07-04 22:11:54360 } else if (phase_name == "phaseMayBegin") {
Blink Reformat1c4d759e2017-04-09 16:34:54361 return WebMouseWheelEvent::kPhaseMayBegin;
chongzb92d7112016-07-04 22:11:54362 }
363
Blink Reformat1c4d759e2017-04-09 16:34:54364 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54365}
366
367WebMouseWheelEvent::Phase GetMouseWheelEventPhaseFromV8(
368 v8::Local<v8::Value> value) {
369 if (value->IsString())
370 return GetMouseWheelEventPhase(gin::V8ToString(value));
Blink Reformat1c4d759e2017-04-09 16:34:54371 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54372}
373
[email protected]3db130e2014-03-27 08:14:48374// Maximum distance (in space and time) for a mouse click to register as a
375// double or triple click.
376const double kMultipleClickTimeSec = 1;
377const int kMultipleClickRadiusPixels = 5;
[email protected]f9634a82014-08-05 13:10:19378const char kSubMenuDepthIdentifier[] = "_";
379const char kSubMenuIdentifier[] = " >";
sanjoy.pal362c3252014-08-26 08:07:08380const char kSeparatorIdentifier[] = "---------";
sanjoy.pala62675e2014-11-27 00:47:29381const char kDisabledIdentifier[] = "#";
382const char kCheckedIdentifier[] = "*";
[email protected]3db130e2014-03-27 08:14:48383
384bool OutsideMultiClickRadius(const WebPoint& a, const WebPoint& b) {
385 return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)) >
386 kMultipleClickRadiusPixels * kMultipleClickRadiusPixels;
387}
388
[email protected]f9634a82014-08-05 13:10:19389void PopulateCustomItems(const WebVector<WebMenuItemInfo>& customItems,
dcheng59826e32017-02-22 10:31:36390 const std::string& prefix,
391 std::vector<std::string>* strings) {
[email protected]f9634a82014-08-05 13:10:19392 for (size_t i = 0; i < customItems.size(); ++i) {
sanjoy.pala62675e2014-11-27 00:47:29393 std::string prefixCopy = prefix;
394 if (!customItems[i].enabled)
dcheng59826e32017-02-22 10:31:36395 prefixCopy = kDisabledIdentifier + prefix;
sanjoy.pala62675e2014-11-27 00:47:29396 if (customItems[i].checked)
dcheng59826e32017-02-22 10:31:36397 prefixCopy = kCheckedIdentifier + prefix;
Blink Reformat1c4d759e2017-04-09 16:34:54398 if (customItems[i].type == blink::WebMenuItemInfo::kSeparator) {
sanjoy.pala62675e2014-11-27 00:47:29399 strings->push_back(prefixCopy + kSeparatorIdentifier);
Blink Reformat1c4d759e2017-04-09 16:34:54400 } else if (customItems[i].type == blink::WebMenuItemInfo::kSubMenu) {
401 strings->push_back(prefixCopy + customItems[i].label.Utf8() +
402 customItems[i].icon.Utf8() + kSubMenuIdentifier);
403 PopulateCustomItems(customItems[i].sub_menu_items,
dcheng59826e32017-02-22 10:31:36404 prefixCopy + kSubMenuDepthIdentifier, strings);
[email protected]f9634a82014-08-05 13:10:19405 } else {
Blink Reformat1c4d759e2017-04-09 16:34:54406 strings->push_back(prefixCopy + customItems[i].label.Utf8() +
407 customItems[i].icon.Utf8());
[email protected]f9634a82014-08-05 13:10:19408 }
409 }
410}
411
[email protected]3db130e2014-03-27 08:14:48412// Because actual context menu is implemented by the browser side,
413// this function does only what LayoutTests are expecting:
414// - Many test checks the count of items. So returning non-zero value makes
415// sense.
416// - Some test compares the count before and after some action. So changing the
417// count based on flags also makes sense. This function is doing such for some
418// flags.
419// - Some test even checks actual string content. So providing it would be also
420// helpful.
421std::vector<std::string> MakeMenuItemStringsFor(
422 WebContextMenuData* context_menu,
[email protected]79ecada2014-05-04 05:16:16423 WebTestDelegate* delegate) {
[email protected]3db130e2014-03-27 08:14:48424 // These constants are based on Safari's context menu because tests are made
425 // for it.
426 static const char* kNonEditableMenuStrings[] = {
dcheng59826e32017-02-22 10:31:36427 "Back", "Reload Page", "Open in Dashbaord",
428 "<separator>", "View Source", "Save Page As",
429 "Print Page", "Inspect Element", 0};
430 static const char* kEditableMenuStrings[] = {"Cut",
431 "Copy",
432 "<separator>",
433 "Paste",
434 "Spelling and Grammar",
435 "Substitutions, Transformations",
436 "Font",
437 "Speech",
438 "Paragraph Direction",
439 "<separator>",
440 0};
[email protected]3db130e2014-03-27 08:14:48441
442 // This is possible because mouse events are cancelleable.
443 if (!context_menu)
444 return std::vector<std::string>();
445
446 std::vector<std::string> strings;
447
[email protected]f9634a82014-08-05 13:10:19448 // Populate custom menu items if provided by blink.
Blink Reformat1c4d759e2017-04-09 16:34:54449 PopulateCustomItems(context_menu->custom_items, "", &strings);
[email protected]f9634a82014-08-05 13:10:19450
Blink Reformat1c4d759e2017-04-09 16:34:54451 if (context_menu->is_editable) {
[email protected]3db130e2014-03-27 08:14:48452 for (const char** item = kEditableMenuStrings; *item; ++item) {
453 strings.push_back(*item);
454 }
455 WebVector<WebString> suggestions;
Blink Reformat1c4d759e2017-04-09 16:34:54456 MockSpellCheck::FillSuggestionList(context_menu->misspelled_word,
[email protected]f656a652014-07-25 12:19:52457 &suggestions);
[email protected]3db130e2014-03-27 08:14:48458 for (size_t i = 0; i < suggestions.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:54459 strings.push_back(suggestions[i].Utf8());
[email protected]3db130e2014-03-27 08:14:48460 }
461 } else {
462 for (const char** item = kNonEditableMenuStrings; *item; ++item) {
463 strings.push_back(*item);
464 }
465 }
466
467 return strings;
468}
469
470// How much we should scroll per event - the value here is chosen to match the
471// WebKit impl and layout test results.
472const float kScrollbarPixelsPerTick = 40.0f;
473
[email protected]3db130e2014-03-27 08:14:48474// Get the edit command corresponding to a keyboard event.
475// Returns true if the specified event corresponds to an edit command, the name
476// of the edit command will be stored in |*name|.
477bool GetEditCommand(const WebKeyboardEvent& event, std::string* name) {
478#if defined(OS_MACOSX)
dcheng59826e32017-02-22 10:31:36479 // We only cares about Left,Right,Up,Down keys with Command or Command+Shift
480 // modifiers. These key events correspond to some special movement and
481 // selection editor commands. These keys will be marked as system key, which
482 // prevents them from being handled. Thus they must be handled specially.
Blink Reformat1c4d759e2017-04-09 16:34:54483 if ((event.GetModifiers() & ~WebKeyboardEvent::kShiftKey) !=
484 WebKeyboardEvent::kMetaKey)
[email protected]3db130e2014-03-27 08:14:48485 return false;
486
Blink Reformat1c4d759e2017-04-09 16:34:54487 switch (event.windows_key_code) {
[email protected]a731f1a92014-04-17 19:31:06488 case ui::VKEY_LEFT:
[email protected]3db130e2014-03-27 08:14:48489 *name = "MoveToBeginningOfLine";
490 break;
[email protected]a731f1a92014-04-17 19:31:06491 case ui::VKEY_RIGHT:
[email protected]3db130e2014-03-27 08:14:48492 *name = "MoveToEndOfLine";
493 break;
[email protected]a731f1a92014-04-17 19:31:06494 case ui::VKEY_UP:
[email protected]3db130e2014-03-27 08:14:48495 *name = "MoveToBeginningOfDocument";
496 break;
[email protected]a731f1a92014-04-17 19:31:06497 case ui::VKEY_DOWN:
[email protected]3db130e2014-03-27 08:14:48498 *name = "MoveToEndOfDocument";
499 break;
500 default:
501 return false;
502 }
503
Blink Reformat1c4d759e2017-04-09 16:34:54504 if (event.GetModifiers() & WebKeyboardEvent::kShiftKey)
[email protected]3db130e2014-03-27 08:14:48505 name->append("AndModifySelection");
506
507 return true;
508#else
509 return false;
510#endif
511}
512
[email protected]a731f1a92014-04-17 19:31:06513bool IsSystemKeyEvent(const WebKeyboardEvent& event) {
514#if defined(OS_MACOSX)
Blink Reformat1c4d759e2017-04-09 16:34:54515 return event.GetModifiers() & WebInputEvent::kMetaKey &&
516 event.windows_key_code != ui::VKEY_B &&
517 event.windows_key_code != ui::VKEY_I;
[email protected]a731f1a92014-04-17 19:31:06518#else
Blink Reformat1c4d759e2017-04-09 16:34:54519 return !!(event.GetModifiers() & WebInputEvent::kAltKey);
[email protected]a731f1a92014-04-17 19:31:06520#endif
521}
522
dtapuskab1c5ece2016-01-18 18:18:02523bool GetScrollUnits(gin::Arguments* args, WebGestureEvent::ScrollUnits* units) {
524 std::string units_string;
525 if (!args->PeekNext().IsEmpty()) {
526 if (args->PeekNext()->IsString())
527 args->GetNext(&units_string);
528 if (units_string == "Page") {
Blink Reformat1c4d759e2017-04-09 16:34:54529 *units = WebGestureEvent::kPage;
dtapuskab1c5ece2016-01-18 18:18:02530 return true;
531 } else if (units_string == "Pixels") {
Blink Reformat1c4d759e2017-04-09 16:34:54532 *units = WebGestureEvent::kPixels;
dtapuskab1c5ece2016-01-18 18:18:02533 return true;
534 } else if (units_string == "PrecisePixels") {
Blink Reformat1c4d759e2017-04-09 16:34:54535 *units = WebGestureEvent::kPrecisePixels;
dtapuskab1c5ece2016-01-18 18:18:02536 return true;
537 } else {
538 args->ThrowError();
539 return false;
540 }
541 } else {
Blink Reformat1c4d759e2017-04-09 16:34:54542 *units = WebGestureEvent::kPrecisePixels;
dtapuskab1c5ece2016-01-18 18:18:02543 return true;
544 }
545}
546
tdresser3a1c9722015-02-13 15:44:53547const char* kSourceDeviceStringTouchpad = "touchpad";
548const char* kSourceDeviceStringTouchscreen = "touchscreen";
549
[email protected]3db130e2014-03-27 08:14:48550} // namespace
551
552class EventSenderBindings : public gin::Wrappable<EventSenderBindings> {
553 public:
554 static gin::WrapperInfo kWrapperInfo;
555
556 static void Install(base::WeakPtr<EventSender> sender,
lukasza335bb762016-04-22 16:44:03557 blink::WebLocalFrame* frame);
[email protected]3db130e2014-03-27 08:14:48558
559 private:
560 explicit EventSenderBindings(base::WeakPtr<EventSender> sender);
dchenge933b3e2014-10-21 11:44:09561 ~EventSenderBindings() override;
[email protected]3db130e2014-03-27 08:14:48562
563 // gin::Wrappable:
dchenge933b3e2014-10-21 11:44:09564 gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
anand.ratn449f39a42014-10-06 13:45:57565 v8::Isolate* isolate) override;
[email protected]3db130e2014-03-27 08:14:48566
567 // Bound methods:
568 void EnableDOMUIEventLogging();
569 void FireKeyboardEventsToElement();
570 void ClearKillRing();
571 std::vector<std::string> ContextClick();
572 void TextZoomIn();
573 void TextZoomOut();
574 void ZoomPageIn();
575 void ZoomPageOut();
[email protected]d160488f2014-05-06 17:03:01576 void SetPageZoomFactor(double factor);
[email protected]3db130e2014-03-27 08:14:48577 void ClearTouchPoints();
578 void ReleaseTouchPoint(unsigned index);
e.hakkinen80033922015-07-31 08:41:35579 void UpdateTouchPoint(unsigned index,
580 double x,
581 double y,
582 gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48583 void CancelTouchPoint(unsigned index);
584 void SetTouchModifier(const std::string& key_name, bool set_mask);
[email protected]ace1cd502014-04-24 21:05:30585 void SetTouchCancelable(bool cancelable);
[email protected]3db130e2014-03-27 08:14:48586 void DumpFilenameBeingDragged();
587 void GestureFlingCancel();
tdresser3a1c9722015-02-13 15:44:53588 void GestureFlingStart(float x,
589 float y,
590 float velocity_x,
591 float velocity_y,
592 gin::Arguments* args);
tdresserd7bba522016-02-19 22:40:13593 bool IsFlinging() const;
[email protected]3db130e2014-03-27 08:14:48594 void GestureScrollFirstPoint(int x, int y);
rbyers709aa1e2016-05-12 04:44:06595 void TouchStart(gin::Arguments* args);
596 void TouchMove(gin::Arguments* args);
597 void TouchCancel(gin::Arguments* args);
598 void TouchEnd(gin::Arguments* args);
mustaqb3c44a02016-04-19 18:49:05599 void NotifyStartOfTouchScroll();
[email protected]3db130e2014-03-27 08:14:48600 void LeapForward(int milliseconds);
majidvpbfabb0712015-10-02 16:30:00601 double LastEventTimestamp();
[email protected]3db130e2014-03-27 08:14:48602 void BeginDragWithFiles(const std::vector<std::string>& files);
e.hakkinen80033922015-07-31 08:41:35603 void AddTouchPoint(double x, double y, gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48604 void GestureScrollBegin(gin::Arguments* args);
605 void GestureScrollEnd(gin::Arguments* args);
606 void GestureScrollUpdate(gin::Arguments* args);
ccameronb81b8072015-01-30 00:54:49607 void GesturePinchBegin(gin::Arguments* args);
608 void GesturePinchEnd(gin::Arguments* args);
609 void GesturePinchUpdate(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48610 void GestureTap(gin::Arguments* args);
611 void GestureTapDown(gin::Arguments* args);
612 void GestureShowPress(gin::Arguments* args);
613 void GestureTapCancel(gin::Arguments* args);
614 void GestureLongPress(gin::Arguments* args);
615 void GestureLongTap(gin::Arguments* args);
616 void GestureTwoFingerTap(gin::Arguments* args);
617 void ContinuousMouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48618 void MouseMoveTo(gin::Arguments* args);
lanwei0474c2a52017-05-12 18:52:01619 void MouseLeave(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48620 void MouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48621 void ScheduleAsynchronousClick(gin::Arguments* args);
622 void ScheduleAsynchronousKeyDown(gin::Arguments* args);
623 void MouseDown(gin::Arguments* args);
624 void MouseUp(gin::Arguments* args);
mustaq21aed4e2015-12-15 21:47:21625 void SetMouseButtonState(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48626 void KeyDown(gin::Arguments* args);
627
628 // Binding properties:
629 bool ForceLayoutOnEvents() const;
630 void SetForceLayoutOnEvents(bool force);
631 bool IsDragMode() const;
632 void SetIsDragMode(bool drag_mode);
633
634#if defined(OS_WIN)
635 int WmKeyDown() const;
636 void SetWmKeyDown(int key_down);
637
638 int WmKeyUp() const;
639 void SetWmKeyUp(int key_up);
640
641 int WmChar() const;
642 void SetWmChar(int wm_char);
643
644 int WmDeadChar() const;
645 void SetWmDeadChar(int dead_char);
646
647 int WmSysKeyDown() const;
648 void SetWmSysKeyDown(int key_down);
649
650 int WmSysKeyUp() const;
651 void SetWmSysKeyUp(int key_up);
652
653 int WmSysChar() const;
654 void SetWmSysChar(int sys_char);
655
656 int WmSysDeadChar() const;
657 void SetWmSysDeadChar(int sys_dead_char);
658#endif
659
660 base::WeakPtr<EventSender> sender_;
661
662 DISALLOW_COPY_AND_ASSIGN(EventSenderBindings);
663};
664
665gin::WrapperInfo EventSenderBindings::kWrapperInfo = {gin::kEmbedderNativeGin};
666
667EventSenderBindings::EventSenderBindings(base::WeakPtr<EventSender> sender)
dcheng59826e32017-02-22 10:31:36668 : sender_(sender) {}
[email protected]3db130e2014-03-27 08:14:48669
670EventSenderBindings::~EventSenderBindings() {}
671
672// static
673void EventSenderBindings::Install(base::WeakPtr<EventSender> sender,
lukasza335bb762016-04-22 16:44:03674 WebLocalFrame* frame) {
Blink Reformat1c4d759e2017-04-09 16:34:54675 v8::Isolate* isolate = blink::MainThreadIsolate();
[email protected]3db130e2014-03-27 08:14:48676 v8::HandleScope handle_scope(isolate);
Blink Reformat1c4d759e2017-04-09 16:34:54677 v8::Local<v8::Context> context = frame->MainWorldScriptContext();
[email protected]3db130e2014-03-27 08:14:48678 if (context.IsEmpty())
679 return;
680
681 v8::Context::Scope context_scope(context);
682
683 gin::Handle<EventSenderBindings> bindings =
684 gin::CreateHandle(isolate, new EventSenderBindings(sender));
[email protected]ad4d2032014-04-28 13:50:59685 if (bindings.IsEmpty())
686 return;
deepak.s750d68f2015-04-30 07:32:41687 v8::Local<v8::Object> global = context->Global();
[email protected]3db130e2014-03-27 08:14:48688 global->Set(gin::StringToV8(isolate, "eventSender"), bindings.ToV8());
689}
690
dcheng59826e32017-02-22 10:31:36691gin::ObjectTemplateBuilder EventSenderBindings::GetObjectTemplateBuilder(
692 v8::Isolate* isolate) {
[email protected]3db130e2014-03-27 08:14:48693 return gin::Wrappable<EventSenderBindings>::GetObjectTemplateBuilder(isolate)
694 .SetMethod("enableDOMUIEventLogging",
695 &EventSenderBindings::EnableDOMUIEventLogging)
696 .SetMethod("fireKeyboardEventsToElement",
697 &EventSenderBindings::FireKeyboardEventsToElement)
698 .SetMethod("clearKillRing", &EventSenderBindings::ClearKillRing)
699 .SetMethod("contextClick", &EventSenderBindings::ContextClick)
700 .SetMethod("textZoomIn", &EventSenderBindings::TextZoomIn)
701 .SetMethod("textZoomOut", &EventSenderBindings::TextZoomOut)
702 .SetMethod("zoomPageIn", &EventSenderBindings::ZoomPageIn)
703 .SetMethod("zoomPageOut", &EventSenderBindings::ZoomPageOut)
[email protected]b32fe542014-04-30 08:42:06704 .SetMethod("setPageZoomFactor", &EventSenderBindings::SetPageZoomFactor)
[email protected]3db130e2014-03-27 08:14:48705 .SetMethod("clearTouchPoints", &EventSenderBindings::ClearTouchPoints)
706 .SetMethod("releaseTouchPoint", &EventSenderBindings::ReleaseTouchPoint)
707 .SetMethod("updateTouchPoint", &EventSenderBindings::UpdateTouchPoint)
708 .SetMethod("cancelTouchPoint", &EventSenderBindings::CancelTouchPoint)
709 .SetMethod("setTouchModifier", &EventSenderBindings::SetTouchModifier)
[email protected]ace1cd502014-04-24 21:05:30710 .SetMethod("setTouchCancelable", &EventSenderBindings::SetTouchCancelable)
[email protected]3db130e2014-03-27 08:14:48711 .SetMethod("dumpFilenameBeingDragged",
712 &EventSenderBindings::DumpFilenameBeingDragged)
713 .SetMethod("gestureFlingCancel", &EventSenderBindings::GestureFlingCancel)
714 .SetMethod("gestureFlingStart", &EventSenderBindings::GestureFlingStart)
tdresserd7bba522016-02-19 22:40:13715 .SetMethod("isFlinging", &EventSenderBindings::IsFlinging)
[email protected]3db130e2014-03-27 08:14:48716 .SetMethod("gestureScrollFirstPoint",
717 &EventSenderBindings::GestureScrollFirstPoint)
718 .SetMethod("touchStart", &EventSenderBindings::TouchStart)
719 .SetMethod("touchMove", &EventSenderBindings::TouchMove)
720 .SetMethod("touchCancel", &EventSenderBindings::TouchCancel)
721 .SetMethod("touchEnd", &EventSenderBindings::TouchEnd)
mustaqb3c44a02016-04-19 18:49:05722 .SetMethod("notifyStartOfTouchScroll",
723 &EventSenderBindings::NotifyStartOfTouchScroll)
[email protected]3db130e2014-03-27 08:14:48724 .SetMethod("leapForward", &EventSenderBindings::LeapForward)
majidvpbfabb0712015-10-02 16:30:00725 .SetMethod("lastEventTimestamp", &EventSenderBindings::LastEventTimestamp)
[email protected]3db130e2014-03-27 08:14:48726 .SetMethod("beginDragWithFiles", &EventSenderBindings::BeginDragWithFiles)
727 .SetMethod("addTouchPoint", &EventSenderBindings::AddTouchPoint)
[email protected]3db130e2014-03-27 08:14:48728 .SetMethod("gestureScrollBegin", &EventSenderBindings::GestureScrollBegin)
729 .SetMethod("gestureScrollEnd", &EventSenderBindings::GestureScrollEnd)
730 .SetMethod("gestureScrollUpdate",
731 &EventSenderBindings::GestureScrollUpdate)
ccameronb81b8072015-01-30 00:54:49732 .SetMethod("gesturePinchBegin", &EventSenderBindings::GesturePinchBegin)
733 .SetMethod("gesturePinchEnd", &EventSenderBindings::GesturePinchEnd)
734 .SetMethod("gesturePinchUpdate", &EventSenderBindings::GesturePinchUpdate)
[email protected]3db130e2014-03-27 08:14:48735 .SetMethod("gestureTap", &EventSenderBindings::GestureTap)
736 .SetMethod("gestureTapDown", &EventSenderBindings::GestureTapDown)
737 .SetMethod("gestureShowPress", &EventSenderBindings::GestureShowPress)
738 .SetMethod("gestureTapCancel", &EventSenderBindings::GestureTapCancel)
739 .SetMethod("gestureLongPress", &EventSenderBindings::GestureLongPress)
740 .SetMethod("gestureLongTap", &EventSenderBindings::GestureLongTap)
741 .SetMethod("gestureTwoFingerTap",
742 &EventSenderBindings::GestureTwoFingerTap)
743 .SetMethod("continuousMouseScrollBy",
744 &EventSenderBindings::ContinuousMouseScrollBy)
[email protected]3db130e2014-03-27 08:14:48745 .SetMethod("keyDown", &EventSenderBindings::KeyDown)
746 .SetMethod("mouseDown", &EventSenderBindings::MouseDown)
747 .SetMethod("mouseMoveTo", &EventSenderBindings::MouseMoveTo)
myid.shin12c7fea22015-03-06 02:31:24748 .SetMethod("mouseLeave", &EventSenderBindings::MouseLeave)
[email protected]3db130e2014-03-27 08:14:48749 .SetMethod("mouseScrollBy", &EventSenderBindings::MouseScrollBy)
750 .SetMethod("mouseUp", &EventSenderBindings::MouseUp)
mustaq21aed4e2015-12-15 21:47:21751 .SetMethod("setMouseButtonState",
752 &EventSenderBindings::SetMouseButtonState)
[email protected]3db130e2014-03-27 08:14:48753 .SetMethod("scheduleAsynchronousClick",
754 &EventSenderBindings::ScheduleAsynchronousClick)
755 .SetMethod("scheduleAsynchronousKeyDown",
756 &EventSenderBindings::ScheduleAsynchronousKeyDown)
757 .SetProperty("forceLayoutOnEvents",
758 &EventSenderBindings::ForceLayoutOnEvents,
759 &EventSenderBindings::SetForceLayoutOnEvents)
[email protected]3db130e2014-03-27 08:14:48760#if defined(OS_WIN)
mustaq96985f722015-06-30 21:41:53761 .SetProperty("WM_KEYDOWN", &EventSenderBindings::WmKeyDown,
[email protected]3db130e2014-03-27 08:14:48762 &EventSenderBindings::SetWmKeyDown)
mustaq96985f722015-06-30 21:41:53763 .SetProperty("WM_KEYUP", &EventSenderBindings::WmKeyUp,
[email protected]3db130e2014-03-27 08:14:48764 &EventSenderBindings::SetWmKeyUp)
mustaq96985f722015-06-30 21:41:53765 .SetProperty("WM_CHAR", &EventSenderBindings::WmChar,
[email protected]3db130e2014-03-27 08:14:48766 &EventSenderBindings::SetWmChar)
mustaq96985f722015-06-30 21:41:53767 .SetProperty("WM_DEADCHAR", &EventSenderBindings::WmDeadChar,
[email protected]3db130e2014-03-27 08:14:48768 &EventSenderBindings::SetWmDeadChar)
mustaq96985f722015-06-30 21:41:53769 .SetProperty("WM_SYSKEYDOWN", &EventSenderBindings::WmSysKeyDown,
[email protected]3db130e2014-03-27 08:14:48770 &EventSenderBindings::SetWmSysKeyDown)
mustaq96985f722015-06-30 21:41:53771 .SetProperty("WM_SYSKEYUP", &EventSenderBindings::WmSysKeyUp,
[email protected]3db130e2014-03-27 08:14:48772 &EventSenderBindings::SetWmSysKeyUp)
mustaq96985f722015-06-30 21:41:53773 .SetProperty("WM_SYSCHAR", &EventSenderBindings::WmSysChar,
[email protected]3db130e2014-03-27 08:14:48774 &EventSenderBindings::SetWmSysChar)
mustaq96985f722015-06-30 21:41:53775 .SetProperty("WM_SYSDEADCHAR", &EventSenderBindings::WmSysDeadChar,
thestigfd11ffe2015-12-30 19:25:45776 &EventSenderBindings::SetWmSysDeadChar)
[email protected]3db130e2014-03-27 08:14:48777#endif
thestigfd11ffe2015-12-30 19:25:45778 .SetProperty("dragMode", &EventSenderBindings::IsDragMode,
779 &EventSenderBindings::SetIsDragMode);
[email protected]3db130e2014-03-27 08:14:48780}
781
782void EventSenderBindings::EnableDOMUIEventLogging() {
783 if (sender_)
784 sender_->EnableDOMUIEventLogging();
785}
786
787void EventSenderBindings::FireKeyboardEventsToElement() {
788 if (sender_)
789 sender_->FireKeyboardEventsToElement();
790}
791
792void EventSenderBindings::ClearKillRing() {
793 if (sender_)
794 sender_->ClearKillRing();
795}
796
797std::vector<std::string> EventSenderBindings::ContextClick() {
798 if (sender_)
799 return sender_->ContextClick();
800 return std::vector<std::string>();
801}
802
803void EventSenderBindings::TextZoomIn() {
804 if (sender_)
805 sender_->TextZoomIn();
806}
807
808void EventSenderBindings::TextZoomOut() {
809 if (sender_)
810 sender_->TextZoomOut();
811}
812
813void EventSenderBindings::ZoomPageIn() {
814 if (sender_)
815 sender_->ZoomPageIn();
816}
817
818void EventSenderBindings::ZoomPageOut() {
819 if (sender_)
820 sender_->ZoomPageOut();
821}
822
[email protected]d160488f2014-05-06 17:03:01823void EventSenderBindings::SetPageZoomFactor(double factor) {
824 if (sender_)
825 sender_->SetPageZoomFactor(factor);
[email protected]b32fe542014-04-30 08:42:06826}
827
[email protected]3db130e2014-03-27 08:14:48828void EventSenderBindings::ClearTouchPoints() {
829 if (sender_)
830 sender_->ClearTouchPoints();
831}
832
833void EventSenderBindings::ReleaseTouchPoint(unsigned index) {
834 if (sender_)
835 sender_->ReleaseTouchPoint(index);
836}
837
e.hakkinen80033922015-07-31 08:41:35838void EventSenderBindings::UpdateTouchPoint(unsigned index,
839 double x,
840 double y,
841 gin::Arguments* args) {
jochen73e711c2015-06-03 10:01:46842 if (sender_) {
843 sender_->UpdateTouchPoint(index, static_cast<float>(x),
e.hakkinen80033922015-07-31 08:41:35844 static_cast<float>(y), args);
jochen73e711c2015-06-03 10:01:46845 }
[email protected]3db130e2014-03-27 08:14:48846}
847
848void EventSenderBindings::CancelTouchPoint(unsigned index) {
849 if (sender_)
850 sender_->CancelTouchPoint(index);
851}
852
853void EventSenderBindings::SetTouchModifier(const std::string& key_name,
854 bool set_mask) {
855 if (sender_)
856 sender_->SetTouchModifier(key_name, set_mask);
857}
858
[email protected]ace1cd502014-04-24 21:05:30859void EventSenderBindings::SetTouchCancelable(bool cancelable) {
860 if (sender_)
861 sender_->SetTouchCancelable(cancelable);
862}
863
[email protected]3db130e2014-03-27 08:14:48864void EventSenderBindings::DumpFilenameBeingDragged() {
865 if (sender_)
866 sender_->DumpFilenameBeingDragged();
867}
868
869void EventSenderBindings::GestureFlingCancel() {
870 if (sender_)
871 sender_->GestureFlingCancel();
872}
873
874void EventSenderBindings::GestureFlingStart(float x,
875 float y,
876 float velocity_x,
tdresser3a1c9722015-02-13 15:44:53877 float velocity_y,
878 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48879 if (sender_)
tdresser3a1c9722015-02-13 15:44:53880 sender_->GestureFlingStart(x, y, velocity_x, velocity_y, args);
[email protected]3db130e2014-03-27 08:14:48881}
882
tdresserd7bba522016-02-19 22:40:13883bool EventSenderBindings::IsFlinging() const {
884 if (sender_)
885 return sender_->IsFlinging();
886 return false;
887}
888
[email protected]3db130e2014-03-27 08:14:48889void EventSenderBindings::GestureScrollFirstPoint(int x, int y) {
890 if (sender_)
891 sender_->GestureScrollFirstPoint(x, y);
892}
893
rbyers709aa1e2016-05-12 04:44:06894void EventSenderBindings::TouchStart(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48895 if (sender_)
rbyers709aa1e2016-05-12 04:44:06896 sender_->TouchStart(args);
[email protected]3db130e2014-03-27 08:14:48897}
898
rbyers709aa1e2016-05-12 04:44:06899void EventSenderBindings::TouchMove(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48900 if (sender_)
rbyers709aa1e2016-05-12 04:44:06901 sender_->TouchMove(args);
[email protected]3db130e2014-03-27 08:14:48902}
903
rbyers709aa1e2016-05-12 04:44:06904void EventSenderBindings::TouchCancel(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48905 if (sender_)
rbyers709aa1e2016-05-12 04:44:06906 sender_->TouchCancel(args);
[email protected]3db130e2014-03-27 08:14:48907}
908
rbyers709aa1e2016-05-12 04:44:06909void EventSenderBindings::TouchEnd(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48910 if (sender_)
rbyers709aa1e2016-05-12 04:44:06911 sender_->TouchEnd(args);
[email protected]3db130e2014-03-27 08:14:48912}
913
mustaqb3c44a02016-04-19 18:49:05914void EventSenderBindings::NotifyStartOfTouchScroll() {
915 if (sender_)
916 sender_->NotifyStartOfTouchScroll();
917}
918
[email protected]3db130e2014-03-27 08:14:48919void EventSenderBindings::LeapForward(int milliseconds) {
920 if (sender_)
921 sender_->LeapForward(milliseconds);
922}
923
majidvpbfabb0712015-10-02 16:30:00924double EventSenderBindings::LastEventTimestamp() {
925 if (sender_)
926 return sender_->last_event_timestamp();
927 return 0;
928}
929
[email protected]3db130e2014-03-27 08:14:48930void EventSenderBindings::BeginDragWithFiles(
931 const std::vector<std::string>& files) {
932 if (sender_)
933 sender_->BeginDragWithFiles(files);
934}
935
e.hakkinen80033922015-07-31 08:41:35936void EventSenderBindings::AddTouchPoint(double x,
937 double y,
938 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48939 if (sender_)
e.hakkinen80033922015-07-31 08:41:35940 sender_->AddTouchPoint(static_cast<float>(x), static_cast<float>(y), args);
[email protected]3db130e2014-03-27 08:14:48941}
942
[email protected]3db130e2014-03-27 08:14:48943void EventSenderBindings::GestureScrollBegin(gin::Arguments* args) {
944 if (sender_)
945 sender_->GestureScrollBegin(args);
946}
947
948void EventSenderBindings::GestureScrollEnd(gin::Arguments* args) {
949 if (sender_)
950 sender_->GestureScrollEnd(args);
951}
952
953void EventSenderBindings::GestureScrollUpdate(gin::Arguments* args) {
954 if (sender_)
955 sender_->GestureScrollUpdate(args);
956}
957
ccameronb81b8072015-01-30 00:54:49958void EventSenderBindings::GesturePinchBegin(gin::Arguments* args) {
959 if (sender_)
960 sender_->GesturePinchBegin(args);
961}
962
963void EventSenderBindings::GesturePinchEnd(gin::Arguments* args) {
964 if (sender_)
965 sender_->GesturePinchEnd(args);
966}
967
968void EventSenderBindings::GesturePinchUpdate(gin::Arguments* args) {
969 if (sender_)
970 sender_->GesturePinchUpdate(args);
971}
972
[email protected]3db130e2014-03-27 08:14:48973void EventSenderBindings::GestureTap(gin::Arguments* args) {
974 if (sender_)
975 sender_->GestureTap(args);
976}
977
978void EventSenderBindings::GestureTapDown(gin::Arguments* args) {
979 if (sender_)
980 sender_->GestureTapDown(args);
981}
982
983void EventSenderBindings::GestureShowPress(gin::Arguments* args) {
984 if (sender_)
985 sender_->GestureShowPress(args);
986}
987
988void EventSenderBindings::GestureTapCancel(gin::Arguments* args) {
989 if (sender_)
990 sender_->GestureTapCancel(args);
991}
992
993void EventSenderBindings::GestureLongPress(gin::Arguments* args) {
994 if (sender_)
995 sender_->GestureLongPress(args);
996}
997
998void EventSenderBindings::GestureLongTap(gin::Arguments* args) {
999 if (sender_)
1000 sender_->GestureLongTap(args);
1001}
1002
1003void EventSenderBindings::GestureTwoFingerTap(gin::Arguments* args) {
1004 if (sender_)
1005 sender_->GestureTwoFingerTap(args);
1006}
1007
1008void EventSenderBindings::ContinuousMouseScrollBy(gin::Arguments* args) {
1009 if (sender_)
dtapuska43f18e9e2016-03-20 20:21:301010 sender_->MouseScrollBy(args, EventSender::MouseScrollType::PIXEL);
[email protected]3db130e2014-03-27 08:14:481011}
1012
[email protected]3db130e2014-03-27 08:14:481013void EventSenderBindings::MouseMoveTo(gin::Arguments* args) {
1014 if (sender_)
1015 sender_->MouseMoveTo(args);
1016}
1017
lanwei0474c2a52017-05-12 18:52:011018void EventSenderBindings::MouseLeave(gin::Arguments* args) {
1019 if (!sender_)
1020 return;
1021
1022 WebPointerProperties::PointerType pointerType =
1023 WebPointerProperties::PointerType::kMouse;
1024 int pointerId = kRawMousePointerId;
1025
1026 // Only allow pen or mouse through this API.
1027 if (!getPointerType(args, false, pointerType))
1028 return;
1029 if (!args->PeekNext().IsEmpty()) {
1030 if (!args->GetNext(&pointerId)) {
1031 args->ThrowError();
1032 return;
1033 }
1034 }
1035 sender_->MouseLeave(pointerType, pointerId);
myid.shin12c7fea22015-03-06 02:31:241036}
1037
[email protected]3db130e2014-03-27 08:14:481038void EventSenderBindings::MouseScrollBy(gin::Arguments* args) {
1039 if (sender_)
dtapuska43f18e9e2016-03-20 20:21:301040 sender_->MouseScrollBy(args, EventSender::MouseScrollType::TICK);
[email protected]3db130e2014-03-27 08:14:481041}
1042
[email protected]3db130e2014-03-27 08:14:481043void EventSenderBindings::ScheduleAsynchronousClick(gin::Arguments* args) {
1044 if (!sender_)
1045 return;
1046
1047 int button_number = 0;
1048 int modifiers = 0;
1049 if (!args->PeekNext().IsEmpty()) {
1050 args->GetNext(&button_number);
1051 if (!args->PeekNext().IsEmpty())
bashidbd2ef9bb2015-06-02 01:39:321052 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
[email protected]3db130e2014-03-27 08:14:481053 }
1054 sender_->ScheduleAsynchronousClick(button_number, modifiers);
1055}
1056
1057void EventSenderBindings::ScheduleAsynchronousKeyDown(gin::Arguments* args) {
1058 if (!sender_)
1059 return;
1060
1061 std::string code_str;
1062 int modifiers = 0;
1063 int location = DOMKeyLocationStandard;
1064 args->GetNext(&code_str);
1065 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:411066 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:481067 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:321068 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:481069 if (!args->PeekNext().IsEmpty())
1070 args->GetNext(&location);
1071 }
1072 sender_->ScheduleAsynchronousKeyDown(code_str, modifiers,
1073 static_cast<KeyLocationCode>(location));
1074}
1075
1076void EventSenderBindings::MouseDown(gin::Arguments* args) {
1077 if (!sender_)
1078 return;
1079
1080 int button_number = 0;
1081 int modifiers = 0;
1082 if (!args->PeekNext().IsEmpty()) {
nzolghadr43146032016-04-11 15:33:381083 if (!args->GetNext(&button_number)) {
1084 args->ThrowError();
1085 return;
1086 }
1087 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:321088 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:381089 args->Skip();
1090 }
[email protected]3db130e2014-03-27 08:14:481091 }
nzolghadr43146032016-04-11 15:33:381092
mustaqabca6ff2016-06-09 17:29:531093 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:541094 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:531095 int pointerId = 0;
1096 float pressure = 0;
1097 int tiltX = 0;
1098 int tiltY = 0;
1099 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
1100 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:381101 return;
1102
mustaqabca6ff2016-06-09 17:29:531103 sender_->PointerDown(button_number, modifiers, pointerType, pointerId,
1104 pressure, tiltX, tiltY);
[email protected]3db130e2014-03-27 08:14:481105}
1106
1107void EventSenderBindings::MouseUp(gin::Arguments* args) {
1108 if (!sender_)
1109 return;
1110
1111 int button_number = 0;
1112 int modifiers = 0;
1113 if (!args->PeekNext().IsEmpty()) {
nzolghadr43146032016-04-11 15:33:381114 if (!args->GetNext(&button_number)) {
1115 args->ThrowError();
1116 return;
1117 }
1118 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:321119 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:381120 args->Skip();
1121 }
[email protected]3db130e2014-03-27 08:14:481122 }
nzolghadr43146032016-04-11 15:33:381123
mustaqabca6ff2016-06-09 17:29:531124 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:541125 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:531126 int pointerId = 0;
1127 float pressure = 0;
1128 int tiltX = 0;
1129 int tiltY = 0;
1130 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
1131 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:381132 return;
1133
mustaqabca6ff2016-06-09 17:29:531134 sender_->PointerUp(button_number, modifiers, pointerType, pointerId, pressure,
1135 tiltX, tiltY);
[email protected]3db130e2014-03-27 08:14:481136}
1137
mustaq21aed4e2015-12-15 21:47:211138void EventSenderBindings::SetMouseButtonState(gin::Arguments* args) {
1139 if (!sender_)
1140 return;
1141
1142 int button_number;
1143 if (!args->GetNext(&button_number)) {
1144 args->ThrowError();
1145 return;
1146 }
1147
thestigfd11ffe2015-12-30 19:25:451148 int modifiers = -1; // Default to the modifier implied by button_number
mustaq21aed4e2015-12-15 21:47:211149 if (!args->PeekNext().IsEmpty()) {
1150 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
1151 }
1152
1153 sender_->SetMouseButtonState(button_number, modifiers);
1154}
1155
[email protected]3db130e2014-03-27 08:14:481156void EventSenderBindings::KeyDown(gin::Arguments* args) {
1157 if (!sender_)
1158 return;
1159
1160 std::string code_str;
1161 int modifiers = 0;
1162 int location = DOMKeyLocationStandard;
1163 args->GetNext(&code_str);
1164 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:411165 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:481166 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:321167 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:481168 if (!args->PeekNext().IsEmpty())
1169 args->GetNext(&location);
1170 }
1171 sender_->KeyDown(code_str, modifiers, static_cast<KeyLocationCode>(location));
1172}
1173
1174bool EventSenderBindings::ForceLayoutOnEvents() const {
1175 if (sender_)
1176 return sender_->force_layout_on_events();
1177 return false;
1178}
1179
1180void EventSenderBindings::SetForceLayoutOnEvents(bool force) {
1181 if (sender_)
1182 sender_->set_force_layout_on_events(force);
1183}
1184
1185bool EventSenderBindings::IsDragMode() const {
1186 if (sender_)
1187 return sender_->is_drag_mode();
1188 return true;
1189}
1190
1191void EventSenderBindings::SetIsDragMode(bool drag_mode) {
1192 if (sender_)
1193 sender_->set_is_drag_mode(drag_mode);
1194}
1195
1196#if defined(OS_WIN)
1197int EventSenderBindings::WmKeyDown() const {
1198 if (sender_)
1199 return sender_->wm_key_down();
1200 return 0;
1201}
1202
1203void EventSenderBindings::SetWmKeyDown(int key_down) {
1204 if (sender_)
1205 sender_->set_wm_key_down(key_down);
1206}
1207
1208int EventSenderBindings::WmKeyUp() const {
1209 if (sender_)
1210 return sender_->wm_key_up();
1211 return 0;
1212}
1213
1214void EventSenderBindings::SetWmKeyUp(int key_up) {
1215 if (sender_)
1216 sender_->set_wm_key_up(key_up);
1217}
1218
1219int EventSenderBindings::WmChar() const {
1220 if (sender_)
1221 return sender_->wm_char();
1222 return 0;
1223}
1224
1225void EventSenderBindings::SetWmChar(int wm_char) {
1226 if (sender_)
1227 sender_->set_wm_char(wm_char);
1228}
1229
1230int EventSenderBindings::WmDeadChar() const {
1231 if (sender_)
1232 return sender_->wm_dead_char();
1233 return 0;
1234}
1235
1236void EventSenderBindings::SetWmDeadChar(int dead_char) {
1237 if (sender_)
1238 sender_->set_wm_dead_char(dead_char);
1239}
1240
1241int EventSenderBindings::WmSysKeyDown() const {
1242 if (sender_)
1243 return sender_->wm_sys_key_down();
1244 return 0;
1245}
1246
1247void EventSenderBindings::SetWmSysKeyDown(int key_down) {
1248 if (sender_)
1249 sender_->set_wm_sys_key_down(key_down);
1250}
1251
1252int EventSenderBindings::WmSysKeyUp() const {
1253 if (sender_)
1254 return sender_->wm_sys_key_up();
1255 return 0;
1256}
1257
1258void EventSenderBindings::SetWmSysKeyUp(int key_up) {
1259 if (sender_)
1260 sender_->set_wm_sys_key_up(key_up);
1261}
1262
1263int EventSenderBindings::WmSysChar() const {
1264 if (sender_)
1265 return sender_->wm_sys_char();
1266 return 0;
1267}
1268
1269void EventSenderBindings::SetWmSysChar(int sys_char) {
1270 if (sender_)
1271 sender_->set_wm_sys_char(sys_char);
1272}
1273
1274int EventSenderBindings::WmSysDeadChar() const {
1275 if (sender_)
1276 return sender_->wm_sys_dead_char();
1277 return 0;
1278}
1279
1280void EventSenderBindings::SetWmSysDeadChar(int sys_dead_char) {
1281 if (sender_)
1282 sender_->set_wm_sys_dead_char(sys_dead_char);
1283}
1284#endif
1285
1286// EventSender -----------------------------------------------------------------
1287
[email protected]3db130e2014-03-27 08:14:481288WebMouseEvent::Button EventSender::last_button_type_ =
Blink Reformat1c4d759e2017-04-09 16:34:541289 WebMouseEvent::Button::kNoButton;
[email protected]3db130e2014-03-27 08:14:481290
1291EventSender::SavedEvent::SavedEvent()
1292 : type(TYPE_UNSPECIFIED),
Blink Reformat1c4d759e2017-04-09 16:34:541293 button_type(WebMouseEvent::Button::kNoButton),
[email protected]3db130e2014-03-27 08:14:481294 milliseconds(0),
1295 modifiers(0) {}
1296
lukaszad322c5ca2016-10-07 00:32:341297EventSender::EventSender(WebWidgetTestProxyBase* web_widget_test_proxy_base)
1298 : web_widget_test_proxy_base_(web_widget_test_proxy_base),
[email protected]3db130e2014-03-27 08:14:481299 replaying_saved_events_(false),
sammc5648c852015-07-02 01:25:001300 weak_factory_(this) {
lukasza335bb762016-04-22 16:44:031301 Reset();
sammc5648c852015-07-02 01:25:001302}
[email protected]3db130e2014-03-27 08:14:481303
1304EventSender::~EventSender() {}
1305
1306void EventSender::Reset() {
Blink Reformat1c4d759e2017-04-09 16:34:541307 DCHECK(current_drag_data_.IsNull());
1308 current_drag_data_.Reset();
1309 current_drag_effect_ = blink::kWebDragOperationNone;
1310 current_drag_effects_allowed_ = blink::kWebDragOperationNone;
1311 if (widget() && current_pointer_state_[kRawMousePointerId].pressed_button_ !=
1312 WebMouseEvent::Button::kNoButton)
1313 widget()->MouseCaptureLost();
nzolghadr43146032016-04-11 15:33:381314 current_pointer_state_.clear();
[email protected]3db130e2014-03-27 08:14:481315 is_drag_mode_ = true;
1316 force_layout_on_events_ = true;
1317
1318#if defined(OS_WIN)
1319 wm_key_down_ = WM_KEYDOWN;
1320 wm_key_up_ = WM_KEYUP;
1321 wm_char_ = WM_CHAR;
1322 wm_dead_char_ = WM_DEADCHAR;
1323 wm_sys_key_down_ = WM_SYSKEYDOWN;
1324 wm_sys_key_up_ = WM_SYSKEYUP;
1325 wm_sys_char_ = WM_SYSCHAR;
1326 wm_sys_dead_char_ = WM_SYSDEADCHAR;
1327#endif
1328
[email protected]3db130e2014-03-27 08:14:481329 last_click_time_sec_ = 0;
1330 last_click_pos_ = WebPoint(0, 0);
Blink Reformat1c4d759e2017-04-09 16:34:541331 last_button_type_ = WebMouseEvent::Button::kNoButton;
[email protected]3db130e2014-03-27 08:14:481332 touch_points_.clear();
[email protected]644616d2014-03-27 16:14:471333 last_context_menu_data_.reset();
lukaszac9358822016-04-07 14:43:461334 weak_factory_.InvalidateWeakPtrs();
[email protected]3db130e2014-03-27 08:14:481335 current_gesture_location_ = WebPoint(0, 0);
1336 mouse_event_queue_.clear();
1337
1338 time_offset_ms_ = 0;
1339 click_count_ = 0;
[email protected]ace1cd502014-04-24 21:05:301340
1341 touch_modifiers_ = 0;
1342 touch_cancelable_ = true;
1343 touch_points_.clear();
[email protected]3db130e2014-03-27 08:14:481344}
1345
lukasza335bb762016-04-22 16:44:031346void EventSender::Install(WebLocalFrame* frame) {
[email protected]3db130e2014-03-27 08:14:481347 EventSenderBindings::Install(weak_factory_.GetWeakPtr(), frame);
1348}
1349
[email protected]3db130e2014-03-27 08:14:481350void EventSender::SetContextMenuData(const WebContextMenuData& data) {
1351 last_context_menu_data_.reset(new WebContextMenuData(data));
1352}
1353
dtapuska899ac222017-01-03 18:09:161354int EventSender::ModifiersForPointer(int pointer_id) {
1355 return modifiersWithButtons(
1356 current_pointer_state_[pointer_id].modifiers_,
1357 current_pointer_state_[pointer_id].current_buttons_);
1358}
1359
[email protected]3db130e2014-03-27 08:14:481360void EventSender::DoDragDrop(const WebDragData& drag_data,
dcheng59826e32017-02-22 10:31:361361 WebDragOperationsMask mask) {
Blink Reformat1c4d759e2017-04-09 16:34:541362 WebMouseEvent raw_event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161363 ModifiersForPointer(kRawMousePointerId),
1364 GetCurrentEventTimeSec());
1365 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531366 current_pointer_state_[kRawMousePointerId].current_buttons_,
1367 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161368 click_count_, &raw_event);
oshima76b6eeb2016-06-27 15:55:121369
lukaszad322c5ca2016-10-07 00:32:341370 std::unique_ptr<WebInputEvent> widget_event =
1371 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:121372 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:341373 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
1374 : &raw_event;
oshima76b6eeb2016-06-27 15:55:121375
Blink Reformat1c4d759e2017-04-09 16:34:541376 WebPoint client_point(event->PositionInWidget().x,
1377 event->PositionInWidget().y);
1378 WebPoint screen_point(event->PositionInScreen().x,
1379 event->PositionInScreen().y);
[email protected]3db130e2014-03-27 08:14:481380 current_drag_data_ = drag_data;
1381 current_drag_effects_allowed_ = mask;
Blink Reformat1c4d759e2017-04-09 16:34:541382 current_drag_effect_ = mainFrameWidget()->DragTargetDragEnter(
lukasza335bb762016-04-22 16:44:031383 drag_data, client_point, screen_point, current_drag_effects_allowed_,
nzolghadr43146032016-04-11 15:33:381384 modifiersWithButtons(
mustaqabca6ff2016-06-09 17:29:531385 current_pointer_state_[kRawMousePointerId].modifiers_,
1386 current_pointer_state_[kRawMousePointerId].current_buttons_));
[email protected]3db130e2014-03-27 08:14:481387
1388 // Finish processing events.
1389 ReplaySavedEvents();
1390}
1391
1392void EventSender::MouseDown(int button_number, int modifiers) {
nzolghadr43146032016-04-11 15:33:381393 PointerDown(button_number, modifiers,
Blink Reformat1c4d759e2017-04-09 16:34:541394 WebPointerProperties::PointerType::kMouse, kRawMousePointerId,
1395 0.0, 0, 0);
[email protected]3db130e2014-03-27 08:14:481396}
1397
1398void EventSender::MouseUp(int button_number, int modifiers) {
Blink Reformat1c4d759e2017-04-09 16:34:541399 PointerUp(button_number, modifiers, WebPointerProperties::PointerType::kMouse,
mustaqabca6ff2016-06-09 17:29:531400 kRawMousePointerId, 0.0, 0, 0);
nzolghadr43146032016-04-11 15:33:381401}
1402
mustaqabca6ff2016-06-09 17:29:531403void EventSender::PointerDown(int button_number,
1404 int modifiers,
1405 WebPointerProperties::PointerType pointerType,
1406 int pointerId,
1407 float pressure,
1408 int tiltX,
1409 int tiltY) {
[email protected]3db130e2014-03-27 08:14:481410 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541411 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481412
1413 DCHECK_NE(-1, button_number);
1414
1415 WebMouseEvent::Button button_type =
1416 GetButtonTypeFromButtonNumber(button_number);
1417
nzolghadr43146032016-04-11 15:33:381418 int click_count = 0;
1419 current_pointer_state_[pointerId].pressed_button_ = button_type;
1420 current_pointer_state_[pointerId].current_buttons_ |=
1421 GetWebMouseEventModifierForButton(button_type);
1422 current_pointer_state_[pointerId].modifiers_ = modifiers;
1423
Blink Reformat1c4d759e2017-04-09 16:34:541424 if (pointerType == WebPointerProperties::PointerType::kMouse) {
nzolghadr43146032016-04-11 15:33:381425 UpdateClickCountForButton(button_type);
1426 click_count = click_count_;
1427 }
Blink Reformat1c4d759e2017-04-09 16:34:541428 WebMouseEvent event(WebInputEvent::kMouseDown, ModifiersForPointer(pointerId),
dtapuska899ac222017-01-03 18:09:161429 GetCurrentEventTimeSec());
1430 InitMouseEventGeneric(current_pointer_state_[pointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531431 current_pointer_state_[pointerId].current_buttons_,
1432 current_pointer_state_[pointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161433 click_count, pointerType, pointerId, pressure, tiltX,
1434 tiltY, &event);
nzolghadr43146032016-04-11 15:33:381435
1436 HandleInputEventOnViewOrPopup(event);
1437}
1438
mustaqabca6ff2016-06-09 17:29:531439void EventSender::PointerUp(int button_number,
1440 int modifiers,
1441 WebPointerProperties::PointerType pointerType,
1442 int pointerId,
1443 float pressure,
1444 int tiltX,
1445 int tiltY) {
nzolghadr43146032016-04-11 15:33:381446 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541447 widget()->UpdateAllLifecyclePhases();
nzolghadr43146032016-04-11 15:33:381448
1449 DCHECK_NE(-1, button_number);
1450
1451 WebMouseEvent::Button button_type =
1452 GetButtonTypeFromButtonNumber(button_number);
1453
Blink Reformat1c4d759e2017-04-09 16:34:541454 if (pointerType == WebPointerProperties::PointerType::kMouse &&
nzolghadr43146032016-04-11 15:33:381455 is_drag_mode_ && !replaying_saved_events_) {
[email protected]3db130e2014-03-27 08:14:481456 SavedEvent saved_event;
1457 saved_event.type = SavedEvent::TYPE_MOUSE_UP;
1458 saved_event.button_type = button_type;
1459 saved_event.modifiers = modifiers;
1460 mouse_event_queue_.push_back(saved_event);
1461 ReplaySavedEvents();
1462 } else {
dtapuska899ac222017-01-03 18:09:161463 current_pointer_state_[pointerId].modifiers_ = modifiers;
nzolghadr43146032016-04-11 15:33:381464 current_pointer_state_[pointerId].current_buttons_ &=
1465 ~GetWebMouseEventModifierForButton(button_type);
1466 current_pointer_state_[pointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541467 WebMouseEvent::Button::kNoButton;
mustaq21aed4e2015-12-15 21:47:211468
Blink Reformat1c4d759e2017-04-09 16:34:541469 WebMouseEvent event(WebInputEvent::kMouseUp, ModifiersForPointer(pointerId),
dtapuska899ac222017-01-03 18:09:161470 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541471 int click_count = pointerType == WebPointerProperties::PointerType::kMouse
mustaqabca6ff2016-06-09 17:29:531472 ? click_count_
1473 : 0;
dtapuska899ac222017-01-03 18:09:161474 InitMouseEventGeneric(
1475 button_type, current_pointer_state_[pointerId].current_buttons_,
1476 current_pointer_state_[pointerId].last_pos_, click_count, pointerType,
1477 pointerId, pressure, tiltX, tiltY, &event);
nzolghadr43146032016-04-11 15:33:381478 HandleInputEventOnViewOrPopup(event);
Blink Reformat1c4d759e2017-04-09 16:34:541479 if (pointerType == WebPointerProperties::PointerType::kMouse)
nzolghadr43146032016-04-11 15:33:381480 DoDragAfterMouseUp(event);
[email protected]3db130e2014-03-27 08:14:481481 }
1482}
1483
mustaq21aed4e2015-12-15 21:47:211484void EventSender::SetMouseButtonState(int button_number, int modifiers) {
mustaqabca6ff2016-06-09 17:29:531485 current_pointer_state_[kRawMousePointerId].pressed_button_ =
nzolghadr43146032016-04-11 15:33:381486 GetButtonTypeFromButtonNumber(button_number);
mustaqabca6ff2016-06-09 17:29:531487 current_pointer_state_[kRawMousePointerId].current_buttons_ =
nzolghadr43146032016-04-11 15:33:381488 (modifiers == -1)
1489 ? GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:531490 current_pointer_state_[kRawMousePointerId].pressed_button_)
nzolghadr43146032016-04-11 15:33:381491 : modifiers & kButtonsInModifiers;
mustaq21aed4e2015-12-15 21:47:211492}
1493
[email protected]3db130e2014-03-27 08:14:481494void EventSender::KeyDown(const std::string& code_str,
1495 int modifiers,
1496 KeyLocationCode location) {
1497 // FIXME: I'm not exactly sure how we should convert the string to a key
1498 // event. This seems to work in the cases I tested.
1499 // FIXME: Should we also generate a KEY_UP?
1500
1501 bool generate_char = false;
1502
1503 // Convert \n -> VK_RETURN. Some layout tests use \n to mean "Enter", when
1504 // Windows uses \r for "Enter".
1505 int code = 0;
1506 int text = 0;
1507 bool needs_shift_key_modifier = false;
chongz40aff932016-05-04 14:30:121508 std::string domKeyString;
1509 std::string domCodeString;
[email protected]3db130e2014-03-27 08:14:481510
dtapuska0d1f4af2016-06-29 16:42:221511 if ("Enter" == code_str) {
[email protected]3db130e2014-03-27 08:14:481512 generate_char = true;
[email protected]a731f1a92014-04-17 19:31:061513 text = code = ui::VKEY_RETURN;
chongz40aff932016-05-04 14:30:121514 domKeyString.assign("Enter");
1515 domCodeString.assign("Enter");
dtapuska0d1f4af2016-06-29 16:42:221516 } else if ("ArrowRight" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061517 code = ui::VKEY_RIGHT;
chongz40aff932016-05-04 14:30:121518 domKeyString.assign("ArrowRight");
1519 domCodeString.assign("ArrowRight");
dtapuska0d1f4af2016-06-29 16:42:221520 } else if ("ArrowDown" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061521 code = ui::VKEY_DOWN;
chongz40aff932016-05-04 14:30:121522 domKeyString.assign("ArrowDown");
1523 domCodeString.assign("ArrowDown");
dtapuska0d1f4af2016-06-29 16:42:221524 } else if ("ArrowLeft" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061525 code = ui::VKEY_LEFT;
chongz40aff932016-05-04 14:30:121526 domKeyString.assign("ArrowLeft");
1527 domCodeString.assign("ArrowLeft");
dtapuska0d1f4af2016-06-29 16:42:221528 } else if ("ArrowUp" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061529 code = ui::VKEY_UP;
chongz40aff932016-05-04 14:30:121530 domKeyString.assign("ArrowUp");
1531 domCodeString.assign("ArrowUp");
dtapuska0d1f4af2016-06-29 16:42:221532 } else if ("Insert" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061533 code = ui::VKEY_INSERT;
chongz40aff932016-05-04 14:30:121534 domKeyString.assign("Insert");
1535 domCodeString.assign("Insert");
dtapuska0d1f4af2016-06-29 16:42:221536 } else if ("Delete" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061537 code = ui::VKEY_DELETE;
chongz40aff932016-05-04 14:30:121538 domKeyString.assign("Delete");
1539 domCodeString.assign("Delete");
dtapuska0d1f4af2016-06-29 16:42:221540 } else if ("PageUp" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061541 code = ui::VKEY_PRIOR;
chongz40aff932016-05-04 14:30:121542 domKeyString.assign("PageUp");
1543 domCodeString.assign("PageUp");
dtapuska0d1f4af2016-06-29 16:42:221544 } else if ("PageDown" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061545 code = ui::VKEY_NEXT;
chongz40aff932016-05-04 14:30:121546 domKeyString.assign("PageDown");
1547 domCodeString.assign("PageDown");
dtapuska0d1f4af2016-06-29 16:42:221548 } else if ("Home" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061549 code = ui::VKEY_HOME;
chongz40aff932016-05-04 14:30:121550 domKeyString.assign("Home");
1551 domCodeString.assign("Home");
dtapuska0d1f4af2016-06-29 16:42:221552 } else if ("End" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061553 code = ui::VKEY_END;
chongz40aff932016-05-04 14:30:121554 domKeyString.assign("End");
1555 domCodeString.assign("End");
dtapuska0d1f4af2016-06-29 16:42:221556 } else if ("PrintScreen" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061557 code = ui::VKEY_SNAPSHOT;
chongz40aff932016-05-04 14:30:121558 domKeyString.assign("PrintScreen");
1559 domCodeString.assign("PrintScreen");
dtapuska0d1f4af2016-06-29 16:42:221560 } else if ("ContextMenu" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061561 code = ui::VKEY_APPS;
chongz40aff932016-05-04 14:30:121562 domKeyString.assign("ContextMenu");
1563 domCodeString.assign("ContextMenu");
dtapuska0d1f4af2016-06-29 16:42:221564 } else if ("ControlLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051565 code = ui::VKEY_CONTROL;
chongz40aff932016-05-04 14:30:121566 domKeyString.assign("Control");
1567 domCodeString.assign("ControlLeft");
dtapuskad3ba0f042015-08-27 14:08:051568 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221569 } else if ("ControlRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051570 code = ui::VKEY_CONTROL;
chongz40aff932016-05-04 14:30:121571 domKeyString.assign("Control");
1572 domCodeString.assign("ControlRight");
dtapuskad3ba0f042015-08-27 14:08:051573 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221574 } else if ("ShiftLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051575 code = ui::VKEY_SHIFT;
chongz40aff932016-05-04 14:30:121576 domKeyString.assign("Shift");
1577 domCodeString.assign("ShiftLeft");
dtapuskad3ba0f042015-08-27 14:08:051578 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221579 } else if ("ShiftRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051580 code = ui::VKEY_SHIFT;
chongz40aff932016-05-04 14:30:121581 domKeyString.assign("Shift");
1582 domCodeString.assign("ShiftRight");
dtapuskad3ba0f042015-08-27 14:08:051583 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221584 } else if ("AltLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051585 code = ui::VKEY_MENU;
chongz40aff932016-05-04 14:30:121586 domKeyString.assign("Alt");
1587 domCodeString.assign("AltLeft");
dtapuskad3ba0f042015-08-27 14:08:051588 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221589 } else if ("AltRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051590 code = ui::VKEY_MENU;
chongz40aff932016-05-04 14:30:121591 domKeyString.assign("Alt");
1592 domCodeString.assign("AltRight");
dtapuskad3ba0f042015-08-27 14:08:051593 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221594 } else if ("NumLock" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061595 code = ui::VKEY_NUMLOCK;
chongz40aff932016-05-04 14:30:121596 domKeyString.assign("NumLock");
1597 domCodeString.assign("NumLock");
dtapuska0d1f4af2016-06-29 16:42:221598 } else if ("Backspace" == code_str) {
[email protected]4c07a712014-08-21 17:05:541599 code = ui::VKEY_BACK;
chongz40aff932016-05-04 14:30:121600 domKeyString.assign("Backspace");
1601 domCodeString.assign("Backspace");
dtapuska0d1f4af2016-06-29 16:42:221602 } else if ("Escape" == code_str) {
[email protected]4c07a712014-08-21 17:05:541603 code = ui::VKEY_ESCAPE;
chongz40aff932016-05-04 14:30:121604 domKeyString.assign("Escape");
1605 domCodeString.assign("Escape");
dtapuska8f3b1e52016-06-21 16:34:071606 } else if ("Tab" == code_str) {
1607 code = ui::VKEY_TAB;
1608 domKeyString.assign("Tab");
1609 domCodeString.assign("Tab");
chongz78364d672016-08-03 00:13:431610 } else if ("Cut" == code_str || "Copy" == code_str || "Paste" == code_str) {
1611 // No valid KeyboardCode for Cut/Copy/Paste.
1612 code = 0;
1613 domKeyString.assign(code_str);
1614 // It's OK to assign the same string as the DomCode strings happens to be
1615 // the same for these keys.
1616 domCodeString.assign(code_str);
[email protected]3db130e2014-03-27 08:14:481617 } else {
1618 // Compare the input string with the function-key names defined by the
1619 // DOM spec (i.e. "F1",...,"F24"). If the input string is a function-key
1620 // name, set its key code.
1621 for (int i = 1; i <= 24; ++i) {
1622 std::string function_key_name = base::StringPrintf("F%d", i);
1623 if (function_key_name == code_str) {
[email protected]a731f1a92014-04-17 19:31:061624 code = ui::VKEY_F1 + (i - 1);
chongz40aff932016-05-04 14:30:121625 domKeyString = function_key_name;
1626 domCodeString = function_key_name;
[email protected]3db130e2014-03-27 08:14:481627 break;
1628 }
1629 }
1630 if (!code) {
esprehnd29ab802015-12-11 13:01:191631 base::string16 code_str16 = base::UTF8ToUTF16(code_str);
1632 if (code_str16.size() != 1u) {
Blink Reformat1c4d759e2017-04-09 16:34:541633 v8::Isolate* isolate = blink::MainThreadIsolate();
dtapuskabd2a1652015-05-20 00:30:151634 isolate->ThrowException(v8::Exception::TypeError(
1635 gin::StringToV8(isolate, "Invalid web code.")));
1636 return;
1637 }
esprehnd29ab802015-12-11 13:01:191638 text = code = code_str16[0];
zhongyi23960342016-04-12 23:13:201639 needs_shift_key_modifier = base::IsAsciiUpper(code & 0xFF);
1640 if (base::IsAsciiLower(code & 0xFF))
[email protected]3db130e2014-03-27 08:14:481641 code -= 'a' - 'A';
zhongyi23960342016-04-12 23:13:201642 if (base::IsAsciiAlpha(code)) {
chongz40aff932016-05-04 14:30:121643 domKeyString.assign(code_str);
1644 domCodeString.assign("Key");
1645 domCodeString.push_back(
brettwc15100c2015-08-06 22:54:161646 base::ToUpperASCII(static_cast<base::char16>(code)));
zhongyi23960342016-04-12 23:13:201647 } else if (base::IsAsciiDigit(code)) {
chongz40aff932016-05-04 14:30:121648 domKeyString.assign(code_str);
1649 domCodeString.assign("Digit");
1650 domCodeString.push_back(code);
habib.virji565c80c2015-02-06 12:26:431651 } else if (code == ' ') {
chongz40aff932016-05-04 14:30:121652 domKeyString.assign(code_str);
1653 domCodeString.assign("Space");
habib.virji565c80c2015-02-06 12:26:431654 } else if (code == 9) {
chongz40aff932016-05-04 14:30:121655 domKeyString.assign("Tab");
1656 domCodeString.assign("Tab");
habib.virji565c80c2015-02-06 12:26:431657 }
[email protected]3db130e2014-03-27 08:14:481658 generate_char = true;
1659 }
1660
1661 if ("(" == code_str) {
1662 code = '9';
1663 needs_shift_key_modifier = true;
chongz40aff932016-05-04 14:30:121664 domKeyString.assign("(");
1665 domCodeString.assign("Digit9");
[email protected]3db130e2014-03-27 08:14:481666 }
1667 }
1668
dtapuska899ac222017-01-03 18:09:161669 if (needs_shift_key_modifier)
Blink Reformat1c4d759e2017-04-09 16:34:541670 modifiers |= WebInputEvent::kShiftKey;
dtapuska899ac222017-01-03 18:09:161671
1672 // See if KeyLocation argument is given.
1673 switch (location) {
1674 case DOMKeyLocationStandard:
1675 break;
1676 case DOMKeyLocationLeft:
Blink Reformat1c4d759e2017-04-09 16:34:541677 modifiers |= WebInputEvent::kIsLeft;
dtapuska899ac222017-01-03 18:09:161678 break;
1679 case DOMKeyLocationRight:
Blink Reformat1c4d759e2017-04-09 16:34:541680 modifiers |= WebInputEvent::kIsRight;
dtapuska899ac222017-01-03 18:09:161681 break;
1682 case DOMKeyLocationNumpad:
Blink Reformat1c4d759e2017-04-09 16:34:541683 modifiers |= WebInputEvent::kIsKeyPad;
dtapuska899ac222017-01-03 18:09:161684 break;
1685 }
1686
[email protected]3db130e2014-03-27 08:14:481687 // For one generated keyboard event, we need to generate a keyDown/keyUp
1688 // pair;
1689 // On Windows, we might also need to generate a char event to mimic the
1690 // Windows event flow; on other platforms we create a merged event and test
1691 // the event flow that that platform provides.
Blink Reformat1c4d759e2017-04-09 16:34:541692 WebKeyboardEvent event_down(WebInputEvent::kRawKeyDown, modifiers,
dtapuska899ac222017-01-03 18:09:161693 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541694 event_down.windows_key_code = code;
1695 event_down.dom_key =
dcheng59826e32017-02-22 10:31:361696 static_cast<int>(ui::KeycodeConverter::KeyStringToDomKey(domKeyString));
Blink Reformat1c4d759e2017-04-09 16:34:541697 event_down.dom_code = static_cast<int>(
chongz40aff932016-05-04 14:30:121698 ui::KeycodeConverter::CodeStringToDomCode(domCodeString));
[email protected]3db130e2014-03-27 08:14:481699
[email protected]3db130e2014-03-27 08:14:481700 if (generate_char) {
1701 event_down.text[0] = text;
Blink Reformat1c4d759e2017-04-09 16:34:541702 event_down.unmodified_text[0] = text;
[email protected]3db130e2014-03-27 08:14:481703 }
1704
Blink Reformat1c4d759e2017-04-09 16:34:541705 if (event_down.GetModifiers() != 0)
1706 event_down.is_system_key = IsSystemKeyEvent(event_down);
[email protected]3db130e2014-03-27 08:14:481707
dtapuska899ac222017-01-03 18:09:161708 WebKeyboardEvent event_up = event_down;
Blink Reformat1c4d759e2017-04-09 16:34:541709 event_up.SetType(WebInputEvent::kKeyUp);
[email protected]3db130e2014-03-27 08:14:481710 // EventSender.m forces a layout here, with at least one
1711 // test (fast/forms/focus-control-to-page.html) relying on this.
1712 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541713 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481714
1715 // In the browser, if a keyboard event corresponds to an editor command,
1716 // the command will be dispatched to the renderer just before dispatching
1717 // the keyboard event, and then it will be executed in the
1718 // RenderView::handleCurrentKeyboardEvent() method.
1719 // We just simulate the same behavior here.
1720 std::string edit_command;
1721 if (GetEditCommand(event_down, &edit_command))
lukasza335bb762016-04-22 16:44:031722 delegate()->SetEditCommand(edit_command, "");
[email protected]3db130e2014-03-27 08:14:481723
tkent588765612014-11-28 01:07:481724 HandleInputEventOnViewOrPopup(event_down);
[email protected]3db130e2014-03-27 08:14:481725
Blink Reformat1c4d759e2017-04-09 16:34:541726 if (code == ui::VKEY_ESCAPE && !current_drag_data_.IsNull()) {
1727 WebMouseEvent event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161728 ModifiersForPointer(kRawMousePointerId),
1729 GetCurrentEventTimeSec());
1730 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531731 current_pointer_state_[kRawMousePointerId].current_buttons_,
1732 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161733 click_count_, &event);
Blink Reformat1c4d759e2017-04-09 16:34:541734 FinishDragAndDrop(event, blink::kWebDragOperationNone);
[email protected]3db130e2014-03-27 08:14:481735 }
1736
lukasza335bb762016-04-22 16:44:031737 delegate()->ClearEditCommand();
[email protected]3db130e2014-03-27 08:14:481738
1739 if (generate_char) {
1740 WebKeyboardEvent event_char = event_up;
Blink Reformat1c4d759e2017-04-09 16:34:541741 event_char.SetType(WebInputEvent::kChar);
tkent588765612014-11-28 01:07:481742 HandleInputEventOnViewOrPopup(event_char);
[email protected]3db130e2014-03-27 08:14:481743 }
1744
tkent588765612014-11-28 01:07:481745 HandleInputEventOnViewOrPopup(event_up);
[email protected]3db130e2014-03-27 08:14:481746}
1747
1748void EventSender::EnableDOMUIEventLogging() {}
1749
1750void EventSender::FireKeyboardEventsToElement() {}
1751
1752void EventSender::ClearKillRing() {}
1753
1754std::vector<std::string> EventSender::ContextClick() {
lukaszad322c5ca2016-10-07 00:32:341755 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541756 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481757
Blink Reformat1c4d759e2017-04-09 16:34:541758 UpdateClickCountForButton(WebMouseEvent::Button::kRight);
[email protected]3db130e2014-03-27 08:14:481759
1760 // Clears last context menu data because we need to know if the context menu
1761 // be requested after following mouse events.
1762 last_context_menu_data_.reset();
1763
1764 // Generate right mouse down and up.
[email protected]3db130e2014-03-27 08:14:481765 // This is a hack to work around only allowing a single pressed button since
1766 // we want to test the case where both the left and right mouse buttons are
1767 // pressed.
mustaq21aed4e2015-12-15 21:47:211768 // TODO(mustaq): This hack seems unused here! But do we need this hack at all
1769 // after adding current_buttons_.
mustaqabca6ff2016-06-09 17:29:531770 if (current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:541771 WebMouseEvent::Button::kNoButton) {
mustaqabca6ff2016-06-09 17:29:531772 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541773 WebMouseEvent::Button::kRight;
mustaqabca6ff2016-06-09 17:29:531774 current_pointer_state_[kRawMousePointerId].current_buttons_ |=
nzolghadr43146032016-04-11 15:33:381775 GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:531776 current_pointer_state_[kRawMousePointerId].pressed_button_);
[email protected]3db130e2014-03-27 08:14:481777 }
Blink Reformat1c4d759e2017-04-09 16:34:541778 WebMouseEvent event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161779 ModifiersForPointer(kRawMousePointerId),
1780 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541781 InitMouseEvent(WebMouseEvent::Button::kRight,
mustaqabca6ff2016-06-09 17:29:531782 current_pointer_state_[kRawMousePointerId].current_buttons_,
1783 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161784 click_count_, &event);
tkent588765612014-11-28 01:07:481785 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481786
1787#if defined(OS_WIN)
mustaqabca6ff2016-06-09 17:29:531788 current_pointer_state_[kRawMousePointerId].current_buttons_ &=
Blink Reformat1c4d759e2017-04-09 16:34:541789 ~GetWebMouseEventModifierForButton(WebMouseEvent::Button::kRight);
mustaqabca6ff2016-06-09 17:29:531790 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541791 WebMouseEvent::Button::kNoButton;
mustaq21aed4e2015-12-15 21:47:211792
Blink Reformat1c4d759e2017-04-09 16:34:541793 WebMouseEvent mouseUpEvent(WebInputEvent::kMouseUp,
dtapuska899ac222017-01-03 18:09:161794 ModifiersForPointer(kRawMousePointerId),
1795 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541796 InitMouseEvent(WebMouseEvent::Button::kRight,
mustaqabca6ff2016-06-09 17:29:531797 current_pointer_state_[kRawMousePointerId].current_buttons_,
1798 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161799 click_count_, &mouseUpEvent);
1800 HandleInputEventOnViewOrPopup(mouseUpEvent);
[email protected]3db130e2014-03-27 08:14:481801#endif
1802
jochen73e711c2015-06-03 10:01:461803 std::vector<std::string> menu_items =
lukasza335bb762016-04-22 16:44:031804 MakeMenuItemStringsFor(last_context_menu_data_.get(), delegate());
[email protected]e7c71192014-04-23 11:53:481805 last_context_menu_data_.reset();
1806 return menu_items;
[email protected]3db130e2014-03-27 08:14:481807}
1808
1809void EventSender::TextZoomIn() {
Blink Reformat1c4d759e2017-04-09 16:34:541810 view()->SetTextZoomFactor(view()->TextZoomFactor() * 1.2f);
[email protected]3db130e2014-03-27 08:14:481811}
1812
1813void EventSender::TextZoomOut() {
Blink Reformat1c4d759e2017-04-09 16:34:541814 view()->SetTextZoomFactor(view()->TextZoomFactor() / 1.2f);
[email protected]3db130e2014-03-27 08:14:481815}
1816
1817void EventSender::ZoomPageIn() {
lfg05e41372016-07-22 15:38:101818 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031819 interfaces()->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481820
1821 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541822 window_list.at(i)->web_view()->SetZoomLevel(
1823 window_list.at(i)->web_view()->ZoomLevel() + 1);
[email protected]3db130e2014-03-27 08:14:481824 }
1825}
1826
1827void EventSender::ZoomPageOut() {
lfg05e41372016-07-22 15:38:101828 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031829 interfaces()->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481830
1831 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541832 window_list.at(i)->web_view()->SetZoomLevel(
1833 window_list.at(i)->web_view()->ZoomLevel() - 1);
[email protected]3db130e2014-03-27 08:14:481834 }
1835}
1836
[email protected]b32fe542014-04-30 08:42:061837void EventSender::SetPageZoomFactor(double zoom_factor) {
lfg05e41372016-07-22 15:38:101838 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031839 interfaces()->GetWindowList();
[email protected]b32fe542014-04-30 08:42:061840
1841 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541842 window_list.at(i)->web_view()->SetZoomLevel(std::log(zoom_factor) /
lukasza01da2602016-04-05 14:51:261843 std::log(1.2));
[email protected]b32fe542014-04-30 08:42:061844 }
1845}
1846
[email protected]3db130e2014-03-27 08:14:481847void EventSender::ClearTouchPoints() {
1848 touch_points_.clear();
1849}
1850
[email protected]bfb6a602014-04-16 19:59:411851void EventSender::ThrowTouchPointError() {
Blink Reformat1c4d759e2017-04-09 16:34:541852 v8::Isolate* isolate = blink::MainThreadIsolate();
[email protected]bfb6a602014-04-16 19:59:411853 isolate->ThrowException(v8::Exception::TypeError(
1854 gin::StringToV8(isolate, "Invalid touch point.")));
1855}
1856
[email protected]3db130e2014-03-27 08:14:481857void EventSender::ReleaseTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411858 if (index >= touch_points_.size()) {
1859 ThrowTouchPointError();
1860 return;
1861 }
[email protected]3db130e2014-03-27 08:14:481862
1863 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541864 touch_point->state = WebTouchPoint::kStateReleased;
[email protected]3db130e2014-03-27 08:14:481865}
1866
e.hakkinen80033922015-07-31 08:41:351867void EventSender::UpdateTouchPoint(unsigned index,
1868 float x,
1869 float y,
1870 gin::Arguments* args) {
[email protected]bfb6a602014-04-16 19:59:411871 if (index >= touch_points_.size()) {
1872 ThrowTouchPointError();
1873 return;
1874 }
[email protected]3db130e2014-03-27 08:14:481875
1876 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541877 touch_point->state = WebTouchPoint::kStateMoved;
Mustaq Ahmedff30a0e42017-05-31 17:04:281878 touch_point->SetPositionInWidget(x, y);
1879 touch_point->SetPositionInScreen(x, y);
e.hakkinen80033922015-07-31 08:41:351880
Blink Reformat1c4d759e2017-04-09 16:34:541881 InitPointerProperties(args, touch_point, &touch_point->radius_x,
1882 &touch_point->radius_y);
[email protected]3db130e2014-03-27 08:14:481883}
1884
1885void EventSender::CancelTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411886 if (index >= touch_points_.size()) {
1887 ThrowTouchPointError();
1888 return;
1889 }
[email protected]3db130e2014-03-27 08:14:481890
1891 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541892 touch_point->state = WebTouchPoint::kStateCancelled;
[email protected]3db130e2014-03-27 08:14:481893}
1894
dcheng59826e32017-02-22 10:31:361895void EventSender::SetTouchModifier(const std::string& key_name, bool set_mask) {
mustaq21aed4e2015-12-15 21:47:211896 int mask = GetKeyModifier(key_name);
[email protected]3db130e2014-03-27 08:14:481897
1898 if (set_mask)
1899 touch_modifiers_ |= mask;
1900 else
1901 touch_modifiers_ &= ~mask;
1902}
1903
[email protected]ace1cd502014-04-24 21:05:301904void EventSender::SetTouchCancelable(bool cancelable) {
1905 touch_cancelable_ = cancelable;
1906}
1907
[email protected]3db130e2014-03-27 08:14:481908void EventSender::DumpFilenameBeingDragged() {
Blink Reformat1c4d759e2017-04-09 16:34:541909 if (current_drag_data_.IsNull())
dchengc3fe4642015-01-22 06:29:521910 return;
1911
Blink Reformat1c4d759e2017-04-09 16:34:541912 WebVector<WebDragData::Item> items = current_drag_data_.Items();
[email protected]3db130e2014-03-27 08:14:481913 for (size_t i = 0; i < items.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541914 if (items[i].storage_type == WebDragData::Item::kStorageTypeBinaryData) {
1915 WebURL url = items[i].binary_data_source_url;
1916 WebString filename_extension = items[i].binary_data_filename_extension;
1917 WebString content_disposition = items[i].binary_data_content_disposition;
dcheng3dd85612017-02-08 10:46:231918 base::FilePath filename =
Blink Reformat1c4d759e2017-04-09 16:34:541919 net::GenerateFileName(url, content_disposition.Utf8(),
dcheng3dd85612017-02-08 10:46:231920 std::string(), // referrer_charset
1921 std::string(), // suggested_name
1922 std::string(), // mime_type
1923 std::string()); // default_name
1924#if defined(OS_WIN)
Blink Reformat1c4d759e2017-04-09 16:34:541925 filename = filename.ReplaceExtension(filename_extension.Utf16());
dcheng3dd85612017-02-08 10:46:231926#else
Blink Reformat1c4d759e2017-04-09 16:34:541927 filename = filename.ReplaceExtension(filename_extension.Utf8());
dcheng3dd85612017-02-08 10:46:231928#endif
1929 delegate()->PrintMessage(std::string("Filename being dragged: ") +
1930 filename.AsUTF8Unsafe() + "\n");
1931 return;
[email protected]3db130e2014-03-27 08:14:481932 }
1933 }
[email protected]3db130e2014-03-27 08:14:481934}
1935
1936void EventSender::GestureFlingCancel() {
Blink Reformat1c4d759e2017-04-09 16:34:541937 WebGestureEvent event(WebInputEvent::kGestureFlingCancel,
1938 WebInputEvent::kNoModifiers, GetCurrentEventTimeSec());
wjmaclean3bb814792015-10-20 01:13:321939 // Generally it won't matter what device we use here, and since it might
1940 // be cumbersome to expect all callers to specify a device, we'll just
1941 // choose Touchpad here.
Blink Reformat1c4d759e2017-04-09 16:34:541942 event.source_device = blink::kWebGestureDeviceTouchpad;
[email protected]3db130e2014-03-27 08:14:481943
1944 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541945 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481946
tkent588765612014-11-28 01:07:481947 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481948}
1949
1950void EventSender::GestureFlingStart(float x,
tdresser3a1c9722015-02-13 15:44:531951 float y,
1952 float velocity_x,
1953 float velocity_y,
1954 gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:541955 WebGestureEvent event(WebInputEvent::kGestureFlingStart,
1956 WebInputEvent::kNoModifiers, GetCurrentEventTimeSec());
[email protected]3db130e2014-03-27 08:14:481957
tdresser15af5872015-02-18 14:03:021958 std::string device_string;
1959 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString())
1960 args->GetNext(&device_string);
tdresser3a1c9722015-02-13 15:44:531961
1962 if (device_string == kSourceDeviceStringTouchpad) {
Blink Reformat1c4d759e2017-04-09 16:34:541963 event.source_device = blink::kWebGestureDeviceTouchpad;
tdresser3a1c9722015-02-13 15:44:531964 } else if (device_string == kSourceDeviceStringTouchscreen) {
Blink Reformat1c4d759e2017-04-09 16:34:541965 event.source_device = blink::kWebGestureDeviceTouchscreen;
tdresser3a1c9722015-02-13 15:44:531966 } else {
1967 args->ThrowError();
1968 return;
1969 }
1970
sahel42a50bb2016-07-22 19:34:041971 float max_start_velocity = std::max(fabs(velocity_x), fabs(velocity_y));
1972 if (!max_start_velocity) {
Blink Reformat1c4d759e2017-04-09 16:34:541973 v8::Isolate* isolate = blink::MainThreadIsolate();
sahel42a50bb2016-07-22 19:34:041974 isolate->ThrowException(v8::Exception::TypeError(
dcheng59826e32017-02-22 10:31:361975 gin::StringToV8(isolate, "Invalid max start velocity.")));
sahel42a50bb2016-07-22 19:34:041976 return;
1977 }
1978
[email protected]3db130e2014-03-27 08:14:481979 event.x = x;
1980 event.y = y;
Blink Reformat1c4d759e2017-04-09 16:34:541981 event.global_x = event.x;
1982 event.global_y = event.y;
[email protected]3db130e2014-03-27 08:14:481983
Blink Reformat1c4d759e2017-04-09 16:34:541984 event.data.fling_start.velocity_x = velocity_x;
1985 event.data.fling_start.velocity_y = velocity_y;
[email protected]3db130e2014-03-27 08:14:481986
1987 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541988 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481989
tkent588765612014-11-28 01:07:481990 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481991}
1992
tdresserd7bba522016-02-19 22:40:131993bool EventSender::IsFlinging() const {
Blink Reformat1c4d759e2017-04-09 16:34:541994 return view()->IsFlinging();
tdresserd7bba522016-02-19 22:40:131995}
1996
[email protected]3db130e2014-03-27 08:14:481997void EventSender::GestureScrollFirstPoint(int x, int y) {
1998 current_gesture_location_ = WebPoint(x, y);
1999}
2000
rbyers709aa1e2016-05-12 04:44:062001void EventSender::TouchStart(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542002 SendCurrentTouchEvent(WebInputEvent::kTouchStart, args);
mustaq96985f722015-06-30 21:41:532003}
2004
rbyers709aa1e2016-05-12 04:44:062005void EventSender::TouchMove(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542006 SendCurrentTouchEvent(WebInputEvent::kTouchMove, args);
[email protected]3db130e2014-03-27 08:14:482007}
2008
rbyers709aa1e2016-05-12 04:44:062009void EventSender::TouchCancel(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542010 SendCurrentTouchEvent(WebInputEvent::kTouchCancel, args);
rbyers709aa1e2016-05-12 04:44:062011}
2012
2013void EventSender::TouchEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542014 SendCurrentTouchEvent(WebInputEvent::kTouchEnd, args);
[email protected]3db130e2014-03-27 08:14:482015}
2016
mustaqb3c44a02016-04-19 18:49:052017void EventSender::NotifyStartOfTouchScroll() {
Blink Reformat1c4d759e2017-04-09 16:34:542018 WebTouchEvent event(WebInputEvent::kTouchScrollStarted,
2019 WebInputEvent::kNoModifiers, GetCurrentEventTimeSec());
mustaqb3c44a02016-04-19 18:49:052020 HandleInputEventOnViewOrPopup(event);
2021}
2022
[email protected]3db130e2014-03-27 08:14:482023void EventSender::LeapForward(int milliseconds) {
nzolghadr43146032016-04-11 15:33:382024 if (is_drag_mode_ &&
mustaqabca6ff2016-06-09 17:29:532025 current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542026 WebMouseEvent::Button::kLeft &&
[email protected]3db130e2014-03-27 08:14:482027 !replaying_saved_events_) {
2028 SavedEvent saved_event;
2029 saved_event.type = SavedEvent::TYPE_LEAP_FORWARD;
2030 saved_event.milliseconds = milliseconds;
2031 mouse_event_queue_.push_back(saved_event);
2032 } else {
2033 DoLeapForward(milliseconds);
2034 }
2035}
2036
2037void EventSender::BeginDragWithFiles(const std::vector<std::string>& files) {
Blink Reformat1c4d759e2017-04-09 16:34:542038 if (!current_drag_data_.IsNull()) {
sigbjornf23324ff2016-02-22 15:46:312039 // Nested dragging not supported, fuzzer code a likely culprit.
2040 // Cancel the current drag operation and throw an error.
dtapuska0d1f4af2016-06-29 16:42:222041 KeyDown("Escape", 0, DOMKeyLocationStandard);
Blink Reformat1c4d759e2017-04-09 16:34:542042 v8::Isolate* isolate = blink::MainThreadIsolate();
dcheng59826e32017-02-22 10:31:362043 isolate->ThrowException(v8::Exception::Error(gin::StringToV8(
2044 isolate, "Nested beginDragWithFiles() not supported.")));
sigbjornf23324ff2016-02-22 15:46:312045 return;
2046 }
Blink Reformat1c4d759e2017-04-09 16:34:542047 current_drag_data_.Initialize();
[email protected]3db130e2014-03-27 08:14:482048 WebVector<WebString> absolute_filenames(files.size());
2049 for (size_t i = 0; i < files.size(); ++i) {
2050 WebDragData::Item item;
Blink Reformat1c4d759e2017-04-09 16:34:542051 item.storage_type = WebDragData::Item::kStorageTypeFilename;
2052 item.filename_data = delegate()->GetAbsoluteWebStringFromUTF8Path(files[i]);
2053 current_drag_data_.AddItem(item);
2054 absolute_filenames[i] = item.filename_data;
[email protected]3db130e2014-03-27 08:14:482055 }
Blink Reformat1c4d759e2017-04-09 16:34:542056 current_drag_data_.SetFilesystemId(
lukasza335bb762016-04-22 16:44:032057 delegate()->RegisterIsolatedFileSystem(absolute_filenames));
Blink Reformat1c4d759e2017-04-09 16:34:542058 current_drag_effects_allowed_ = blink::kWebDragOperationCopy;
[email protected]3db130e2014-03-27 08:14:482059
oshima76b6eeb2016-06-27 15:55:122060 const WebPoint& last_pos =
2061 current_pointer_state_[kRawMousePointerId].last_pos_;
2062 float scale = delegate()->GetWindowToViewportScale();
2063 WebPoint scaled_last_pos(last_pos.x * scale, last_pos.y * scale);
2064
[email protected]3db130e2014-03-27 08:14:482065 // Provide a drag source.
Blink Reformat1c4d759e2017-04-09 16:34:542066 mainFrameWidget()->DragTargetDragEnter(current_drag_data_, scaled_last_pos,
dcheng59826e32017-02-22 10:31:362067 scaled_last_pos,
2068 current_drag_effects_allowed_, 0);
[email protected]3db130e2014-03-27 08:14:482069 // |is_drag_mode_| saves events and then replays them later. We don't
2070 // need/want that.
2071 is_drag_mode_ = false;
2072
2073 // Make the rest of eventSender think a drag is in progress.
mustaqabca6ff2016-06-09 17:29:532074 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:542075 WebMouseEvent::Button::kLeft;
mustaqabca6ff2016-06-09 17:29:532076 current_pointer_state_[kRawMousePointerId].current_buttons_ |=
nzolghadr43146032016-04-11 15:33:382077 GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:532078 current_pointer_state_[kRawMousePointerId].pressed_button_);
[email protected]3db130e2014-03-27 08:14:482079}
2080
e.hakkinen80033922015-07-31 08:41:352081void EventSender::AddTouchPoint(float x, float y, gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:482082 WebTouchPoint touch_point;
Blink Reformat1c4d759e2017-04-09 16:34:542083 touch_point.pointer_type = WebPointerProperties::PointerType::kTouch;
2084 touch_point.state = WebTouchPoint::kStatePressed;
Mustaq Ahmedff30a0e42017-05-31 17:04:282085 touch_point.SetPositionInWidget(x, y);
2086 touch_point.SetPositionInScreen(x, y);
[email protected]3db130e2014-03-27 08:14:482087
mustaq913e8922015-09-09 20:15:362088 int highest_id = -1;
[email protected]3db130e2014-03-27 08:14:482089 for (size_t i = 0; i < touch_points_.size(); i++) {
mustaq913e8922015-09-09 20:15:362090 if (touch_points_[i].id > highest_id)
2091 highest_id = touch_points_[i].id;
[email protected]3db130e2014-03-27 08:14:482092 }
mustaq913e8922015-09-09 20:15:362093 touch_point.id = highest_id + 1;
e.hakkinen80033922015-07-31 08:41:352094
Blink Reformat1c4d759e2017-04-09 16:34:542095 InitPointerProperties(args, &touch_point, &touch_point.radius_x,
2096 &touch_point.radius_y);
e.hakkinen80033922015-07-31 08:41:352097
nzolghadr88114bc2016-02-01 21:46:162098 // Set the touch point pressure to zero if it was not set by the caller
landell7d38a9a12016-02-04 16:34:552099 if (std::isnan(touch_point.force))
dcheng59826e32017-02-22 10:31:362100 touch_point.force = 0.0;
nzolghadr88114bc2016-02-01 21:46:162101
[email protected]3db130e2014-03-27 08:14:482102 touch_points_.push_back(touch_point);
2103}
2104
[email protected]3db130e2014-03-27 08:14:482105void EventSender::GestureScrollBegin(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542106 GestureEvent(WebInputEvent::kGestureScrollBegin, args);
[email protected]3db130e2014-03-27 08:14:482107}
2108
2109void EventSender::GestureScrollEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542110 GestureEvent(WebInputEvent::kGestureScrollEnd, args);
[email protected]3db130e2014-03-27 08:14:482111}
2112
2113void EventSender::GestureScrollUpdate(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542114 GestureEvent(WebInputEvent::kGestureScrollUpdate, args);
[email protected]3db130e2014-03-27 08:14:482115}
2116
ccameronb81b8072015-01-30 00:54:492117void EventSender::GesturePinchBegin(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542118 GestureEvent(WebInputEvent::kGesturePinchBegin, args);
ccameronb81b8072015-01-30 00:54:492119}
2120
2121void EventSender::GesturePinchEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542122 GestureEvent(WebInputEvent::kGesturePinchEnd, args);
ccameronb81b8072015-01-30 00:54:492123}
2124
2125void EventSender::GesturePinchUpdate(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542126 GestureEvent(WebInputEvent::kGesturePinchUpdate, args);
ccameronb81b8072015-01-30 00:54:492127}
2128
[email protected]3db130e2014-03-27 08:14:482129void EventSender::GestureTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542130 GestureEvent(WebInputEvent::kGestureTap, args);
[email protected]3db130e2014-03-27 08:14:482131}
2132
2133void EventSender::GestureTapDown(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542134 GestureEvent(WebInputEvent::kGestureTapDown, args);
[email protected]3db130e2014-03-27 08:14:482135}
2136
2137void EventSender::GestureShowPress(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542138 GestureEvent(WebInputEvent::kGestureShowPress, args);
[email protected]3db130e2014-03-27 08:14:482139}
2140
2141void EventSender::GestureTapCancel(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542142 GestureEvent(WebInputEvent::kGestureTapCancel, args);
[email protected]3db130e2014-03-27 08:14:482143}
2144
2145void EventSender::GestureLongPress(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542146 GestureEvent(WebInputEvent::kGestureLongPress, args);
[email protected]3db130e2014-03-27 08:14:482147}
2148
2149void EventSender::GestureLongTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542150 GestureEvent(WebInputEvent::kGestureLongTap, args);
[email protected]3db130e2014-03-27 08:14:482151}
2152
2153void EventSender::GestureTwoFingerTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542154 GestureEvent(WebInputEvent::kGestureTwoFingerTap, args);
[email protected]3db130e2014-03-27 08:14:482155}
2156
dtapuska43f18e9e2016-03-20 20:21:302157void EventSender::MouseScrollBy(gin::Arguments* args,
2158 MouseScrollType scroll_type) {
dtapuska43f18e9e2016-03-20 20:21:302159 // TODO(dtapuska): Gestures really should be sent by the MouseWheelEventQueue
2160 // class in the browser. But since the event doesn't propogate up into
2161 // the browser generate the events here. See crbug.com/596095.
dtapuskab8b21412016-06-16 11:09:142162 bool send_gestures = true;
dtapuska899ac222017-01-03 18:09:162163 WebMouseWheelEvent wheel_event =
2164 GetMouseWheelEvent(args, scroll_type, &send_gestures);
Blink Reformat1c4d759e2017-04-09 16:34:542165 if (wheel_event.GetType() != WebInputEvent::kUndefined &&
dtapuska899ac222017-01-03 18:09:162166 HandleInputEventOnViewOrPopup(wheel_event) ==
Blink Reformat1c4d759e2017-04-09 16:34:542167 WebInputEventResult::kNotHandled &&
dtapuska43f18e9e2016-03-20 20:21:302168 send_gestures) {
2169 SendGesturesForMouseWheelEvent(wheel_event);
2170 }
[email protected]3db130e2014-03-27 08:14:482171}
2172
[email protected]3db130e2014-03-27 08:14:482173void EventSender::MouseMoveTo(gin::Arguments* args) {
2174 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542175 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482176
[email protected]f53eba122014-04-16 11:30:012177 double x;
2178 double y;
mustaq0fff7fc32014-09-24 20:21:432179 if (!args->GetNext(&x) || !args->GetNext(&y)) {
2180 args->ThrowError();
2181 return;
2182 }
[email protected]f53eba122014-04-16 11:30:012183 WebPoint mouse_pos(static_cast<int>(x), static_cast<int>(y));
[email protected]3db130e2014-03-27 08:14:482184
2185 int modifiers = 0;
nzolghadr43146032016-04-11 15:33:382186 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:322187 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:382188 args->Skip();
2189 }
[email protected]3db130e2014-03-27 08:14:482190
mustaqabca6ff2016-06-09 17:29:532191 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:542192 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:532193 int pointerId = 0;
2194 float pressure = 0;
2195 int tiltX = 0;
2196 int tiltY = 0;
2197 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
2198 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:382199 return;
2200
Blink Reformat1c4d759e2017-04-09 16:34:542201 if (pointerType == WebPointerProperties::PointerType::kMouse &&
nzolghadr43146032016-04-11 15:33:382202 is_drag_mode_ && !replaying_saved_events_ &&
mustaqabca6ff2016-06-09 17:29:532203 current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542204 WebMouseEvent::Button::kLeft) {
[email protected]3db130e2014-03-27 08:14:482205 SavedEvent saved_event;
2206 saved_event.type = SavedEvent::TYPE_MOUSE_MOVE;
2207 saved_event.pos = mouse_pos;
2208 saved_event.modifiers = modifiers;
2209 mouse_event_queue_.push_back(saved_event);
2210 } else {
nzolghadr43146032016-04-11 15:33:382211 current_pointer_state_[pointerId].last_pos_ = mouse_pos;
dtapuska899ac222017-01-03 18:09:162212 current_pointer_state_[pointerId].modifiers_ = modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542213 WebMouseEvent event(WebInputEvent::kMouseMove,
dtapuska899ac222017-01-03 18:09:162214 ModifiersForPointer(pointerId),
2215 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:542216 int click_count = pointerType == WebPointerProperties::PointerType::kMouse
mustaqabca6ff2016-06-09 17:29:532217 ? click_count_
2218 : 0;
2219 InitMouseEventGeneric(
mustaqabca6ff2016-06-09 17:29:532220 current_pointer_state_[kRawMousePointerId].pressed_button_,
2221 current_pointer_state_[kRawMousePointerId].current_buttons_, mouse_pos,
dtapuska899ac222017-01-03 18:09:162222 click_count, pointerType, pointerId, pressure, tiltX, tiltY, &event);
nzolghadr43146032016-04-11 15:33:382223 HandleInputEventOnViewOrPopup(event);
Blink Reformat1c4d759e2017-04-09 16:34:542224 if (pointerType == WebPointerProperties::PointerType::kMouse)
nzolghadr43146032016-04-11 15:33:382225 DoDragAfterMouseMove(event);
[email protected]3db130e2014-03-27 08:14:482226 }
2227}
2228
lanwei0474c2a52017-05-12 18:52:012229void EventSender::MouseLeave(
2230 blink::WebPointerProperties::PointerType pointerType,
2231 int pointerId) {
myid.shin12c7fea22015-03-06 02:31:242232 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542233 widget()->UpdateAllLifecyclePhases();
myid.shin12c7fea22015-03-06 02:31:242234
Blink Reformat1c4d759e2017-04-09 16:34:542235 WebMouseEvent event(WebInputEvent::kMouseLeave,
lanwei0474c2a52017-05-12 18:52:012236 ModifiersForPointer(pointerId), GetCurrentEventTimeSec());
2237 InitMouseEventGeneric(WebMouseEvent::Button::kNoButton, 0,
2238 current_pointer_state_[kRawMousePointerId].last_pos_,
2239 click_count_, pointerType, pointerId, 0.0, 0, 0,
2240 &event);
thestigfd11ffe2015-12-30 19:25:452241 HandleInputEventOnViewOrPopup(event);
myid.shin12c7fea22015-03-06 02:31:242242}
2243
[email protected]3db130e2014-03-27 08:14:482244void EventSender::ScheduleAsynchronousClick(int button_number, int modifiers) {
tzik5f3ffb22016-09-21 16:54:542245 delegate()->PostTask(base::Bind(&EventSender::MouseDown,
2246 weak_factory_.GetWeakPtr(), button_number,
2247 modifiers));
2248 delegate()->PostTask(base::Bind(&EventSender::MouseUp,
2249 weak_factory_.GetWeakPtr(), button_number,
2250 modifiers));
[email protected]3db130e2014-03-27 08:14:482251}
2252
2253void EventSender::ScheduleAsynchronousKeyDown(const std::string& code_str,
2254 int modifiers,
2255 KeyLocationCode location) {
tzik5f3ffb22016-09-21 16:54:542256 delegate()->PostTask(base::Bind(&EventSender::KeyDown,
2257 weak_factory_.GetWeakPtr(), code_str,
2258 modifiers, location));
[email protected]3db130e2014-03-27 08:14:482259}
2260
2261double EventSender::GetCurrentEventTimeSec() {
majidvpeabdeb82015-11-30 19:02:052262 return (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF() +
majidvpbfabb0712015-10-02 16:30:002263 time_offset_ms_ / 1000.0;
[email protected]3db130e2014-03-27 08:14:482264}
2265
2266void EventSender::DoLeapForward(int milliseconds) {
2267 time_offset_ms_ += milliseconds;
2268}
2269
mustaq19048372016-06-16 21:39:322270uint32_t EventSender::GetUniqueTouchEventId(gin::Arguments* args) {
2271 uint32_t unique_touch_event_id;
dcheng59826e32017-02-22 10:31:362272 if (!args->PeekNext().IsEmpty() && args->GetNext(&unique_touch_event_id))
mustaq19048372016-06-16 21:39:322273 return unique_touch_event_id;
2274
2275 return 0;
2276}
2277
mustaq96985f722015-06-30 21:41:532278void EventSender::SendCurrentTouchEvent(WebInputEvent::Type type,
mustaq19048372016-06-16 21:39:322279 gin::Arguments* args) {
lanwei00f70892017-02-07 23:12:212280 uint32_t unique_touch_event_id = GetUniqueTouchEventId(args);
mustaq19048372016-06-16 21:39:322281
dtapuska8502cd582016-07-22 17:16:292282 DCHECK_GT(static_cast<unsigned>(WebTouchEvent::kTouchesLengthCap),
[email protected]3db130e2014-03-27 08:14:482283 touch_points_.size());
2284 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542285 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482286
dtapuska899ac222017-01-03 18:09:162287 WebTouchEvent touch_event(type, touch_modifiers_, GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:542288 touch_event.dispatch_type = touch_cancelable_
2289 ? WebInputEvent::kBlocking
2290 : WebInputEvent::kEventNonBlocking;
2291 touch_event.moved_beyond_slop_region = true;
2292 touch_event.unique_touch_event_id = unique_touch_event_id;
2293 touch_event.touches_length = touch_points_.size();
[email protected]3db130e2014-03-27 08:14:482294 for (size_t i = 0; i < touch_points_.size(); ++i)
2295 touch_event.touches[i] = touch_points_[i];
tkent588765612014-11-28 01:07:482296 HandleInputEventOnViewOrPopup(touch_event);
[email protected]3db130e2014-03-27 08:14:482297
2298 for (size_t i = 0; i < touch_points_.size(); ++i) {
2299 WebTouchPoint* touch_point = &touch_points_[i];
Blink Reformat1c4d759e2017-04-09 16:34:542300 if (touch_point->state == WebTouchPoint::kStateReleased ||
2301 touch_point->state == WebTouchPoint::kStateCancelled) {
[email protected]3db130e2014-03-27 08:14:482302 touch_points_.erase(touch_points_.begin() + i);
2303 --i;
thestigfd11ffe2015-12-30 19:25:452304 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542305 touch_point->state = WebTouchPoint::kStateStationary;
thestigfd11ffe2015-12-30 19:25:452306 }
[email protected]3db130e2014-03-27 08:14:482307 }
2308}
2309
dcheng59826e32017-02-22 10:31:362310void EventSender::GestureEvent(WebInputEvent::Type type, gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542311 WebGestureEvent event(type, WebInputEvent::kNoModifiers,
dtapuska899ac222017-01-03 18:09:162312 GetCurrentEventTimeSec());
ccameronb81b8072015-01-30 00:54:492313
2314 // If the first argument is a string, it is to specify the device, otherwise
2315 // the device is assumed to be a touchscreen (since most tests were written
2316 // assuming this).
Blink Reformat1c4d759e2017-04-09 16:34:542317 event.source_device = blink::kWebGestureDeviceTouchscreen;
jochen87d2fee2015-07-13 08:21:342318 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString()) {
ccameronb81b8072015-01-30 00:54:492319 std::string device_string;
2320 if (!args->GetNext(&device_string)) {
2321 args->ThrowError();
2322 return;
2323 }
tdresser3a1c9722015-02-13 15:44:532324 if (device_string == kSourceDeviceStringTouchpad) {
Blink Reformat1c4d759e2017-04-09 16:34:542325 event.source_device = blink::kWebGestureDeviceTouchpad;
tdresser3a1c9722015-02-13 15:44:532326 } else if (device_string == kSourceDeviceStringTouchscreen) {
Blink Reformat1c4d759e2017-04-09 16:34:542327 event.source_device = blink::kWebGestureDeviceTouchscreen;
ccameronb81b8072015-01-30 00:54:492328 } else {
2329 args->ThrowError();
2330 return;
2331 }
2332 }
2333
[email protected]3db130e2014-03-27 08:14:482334 double x;
2335 double y;
mustaq0fff7fc32014-09-24 20:21:432336 if (!args->GetNext(&x) || !args->GetNext(&y)) {
2337 args->ThrowError();
2338 return;
2339 }
[email protected]3db130e2014-03-27 08:14:482340
[email protected]3db130e2014-03-27 08:14:482341 switch (type) {
Blink Reformat1c4d759e2017-04-09 16:34:542342 case WebInputEvent::kGestureScrollUpdate: {
majidvp41c4272a2014-12-08 15:51:142343 bool preventPropagation = false;
2344 if (!args->PeekNext().IsEmpty()) {
majidvp50205db2014-11-27 17:28:522345 if (!args->GetNext(&preventPropagation)) {
2346 args->ThrowError();
2347 return;
2348 }
2349 }
Blink Reformat1c4d759e2017-04-09 16:34:542350 if (!GetScrollUnits(args, &event.data.scroll_update.delta_units))
dtapuskab1c5ece2016-01-18 18:18:022351 return;
majidvp50205db2014-11-27 17:28:522352
Blink Reformat1c4d759e2017-04-09 16:34:542353 event.data.scroll_update.delta_x = static_cast<float>(x);
2354 event.data.scroll_update.delta_y = static_cast<float>(y);
2355 event.data.scroll_update.prevent_propagation = preventPropagation;
[email protected]3db130e2014-03-27 08:14:482356 event.x = current_gesture_location_.x;
2357 event.y = current_gesture_location_.y;
2358 current_gesture_location_.x =
Blink Reformat1c4d759e2017-04-09 16:34:542359 current_gesture_location_.x + event.data.scroll_update.delta_x;
[email protected]3db130e2014-03-27 08:14:482360 current_gesture_location_.y =
Blink Reformat1c4d759e2017-04-09 16:34:542361 current_gesture_location_.y + event.data.scroll_update.delta_y;
[email protected]3db130e2014-03-27 08:14:482362 break;
majidvp50205db2014-11-27 17:28:522363 }
Blink Reformat1c4d759e2017-04-09 16:34:542364 case WebInputEvent::kGestureScrollBegin:
mustaq0fff7fc32014-09-24 20:21:432365 current_gesture_location_ = WebPoint(x, y);
[email protected]3db130e2014-03-27 08:14:482366 event.x = current_gesture_location_.x;
2367 event.y = current_gesture_location_.y;
2368 break;
Blink Reformat1c4d759e2017-04-09 16:34:542369 case WebInputEvent::kGestureScrollEnd:
2370 case WebInputEvent::kGestureFlingStart:
[email protected]3db130e2014-03-27 08:14:482371 event.x = current_gesture_location_.x;
2372 event.y = current_gesture_location_.y;
2373 break;
Blink Reformat1c4d759e2017-04-09 16:34:542374 case WebInputEvent::kGesturePinchBegin:
2375 case WebInputEvent::kGesturePinchEnd:
ccameronb81b8072015-01-30 00:54:492376 current_gesture_location_ = WebPoint(x, y);
2377 event.x = current_gesture_location_.x;
2378 event.y = current_gesture_location_.y;
2379 break;
Blink Reformat1c4d759e2017-04-09 16:34:542380 case WebInputEvent::kGesturePinchUpdate: {
ccameronb81b8072015-01-30 00:54:492381 float scale = 1;
2382 if (!args->PeekNext().IsEmpty()) {
2383 if (!args->GetNext(&scale)) {
2384 args->ThrowError();
2385 return;
2386 }
2387 }
Blink Reformat1c4d759e2017-04-09 16:34:542388 event.data.pinch_update.scale = scale;
ccameronb81b8072015-01-30 00:54:492389 current_gesture_location_ = WebPoint(x, y);
2390 event.x = current_gesture_location_.x;
2391 event.y = current_gesture_location_.y;
2392 break;
2393 }
Blink Reformat1c4d759e2017-04-09 16:34:542394 case WebInputEvent::kGestureTap: {
[email protected]c278d7532014-07-31 19:51:452395 float tap_count = 1;
2396 float width = 30;
2397 float height = 30;
[email protected]3db130e2014-03-27 08:14:482398 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482399 if (!args->GetNext(&tap_count)) {
2400 args->ThrowError();
2401 return;
2402 }
[email protected]3db130e2014-03-27 08:14:482403 }
[email protected]cc42ccf2014-06-27 21:31:432404 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432405 if (!args->GetNext(&width)) {
2406 args->ThrowError();
2407 return;
2408 }
[email protected]cc42ccf2014-06-27 21:31:432409 }
2410 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432411 if (!args->GetNext(&height)) {
2412 args->ThrowError();
2413 return;
2414 }
[email protected]cc42ccf2014-06-27 21:31:432415 }
Blink Reformat1c4d759e2017-04-09 16:34:542416 event.data.tap.tap_count = tap_count;
[email protected]c278d7532014-07-31 19:51:452417 event.data.tap.width = width;
2418 event.data.tap.height = height;
mustaq0fff7fc32014-09-24 20:21:432419 event.x = x;
2420 event.y = y;
[email protected]3db130e2014-03-27 08:14:482421 break;
[email protected]c278d7532014-07-31 19:51:452422 }
Blink Reformat1c4d759e2017-04-09 16:34:542423 case WebInputEvent::kGestureTapUnconfirmed:
[email protected]3db130e2014-03-27 08:14:482424 if (!args->PeekNext().IsEmpty()) {
2425 float tap_count;
2426 if (!args->GetNext(&tap_count)) {
2427 args->ThrowError();
2428 return;
2429 }
Blink Reformat1c4d759e2017-04-09 16:34:542430 event.data.tap.tap_count = tap_count;
[email protected]3db130e2014-03-27 08:14:482431 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542432 event.data.tap.tap_count = 1;
[email protected]3db130e2014-03-27 08:14:482433 }
mustaq0fff7fc32014-09-24 20:21:432434 event.x = x;
2435 event.y = y;
[email protected]3db130e2014-03-27 08:14:482436 break;
Blink Reformat1c4d759e2017-04-09 16:34:542437 case WebInputEvent::kGestureTapDown: {
[email protected]c278d7532014-07-31 19:51:452438 float width = 30;
2439 float height = 30;
[email protected]3db130e2014-03-27 08:14:482440 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482441 if (!args->GetNext(&width)) {
2442 args->ThrowError();
2443 return;
2444 }
[email protected]3db130e2014-03-27 08:14:482445 }
2446 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482447 if (!args->GetNext(&height)) {
2448 args->ThrowError();
2449 return;
2450 }
[email protected]3db130e2014-03-27 08:14:482451 }
mustaq0fff7fc32014-09-24 20:21:432452 event.x = x;
2453 event.y = y;
Blink Reformat1c4d759e2017-04-09 16:34:542454 event.data.tap_down.width = width;
2455 event.data.tap_down.height = height;
[email protected]c278d7532014-07-31 19:51:452456 break;
2457 }
Blink Reformat1c4d759e2017-04-09 16:34:542458 case WebInputEvent::kGestureShowPress: {
[email protected]c278d7532014-07-31 19:51:452459 float width = 30;
2460 float height = 30;
[email protected]3db130e2014-03-27 08:14:482461 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482462 if (!args->GetNext(&width)) {
2463 args->ThrowError();
2464 return;
2465 }
[email protected]3db130e2014-03-27 08:14:482466 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482467 if (!args->GetNext(&height)) {
2468 args->ThrowError();
2469 return;
2470 }
[email protected]3db130e2014-03-27 08:14:482471 }
2472 }
mustaq0fff7fc32014-09-24 20:21:432473 event.x = x;
2474 event.y = y;
Blink Reformat1c4d759e2017-04-09 16:34:542475 event.data.show_press.width = width;
2476 event.data.show_press.height = height;
[email protected]3db130e2014-03-27 08:14:482477 break;
[email protected]c278d7532014-07-31 19:51:452478 }
Blink Reformat1c4d759e2017-04-09 16:34:542479 case WebInputEvent::kGestureTapCancel:
mustaq0fff7fc32014-09-24 20:21:432480 event.x = x;
2481 event.y = y;
[email protected]3db130e2014-03-27 08:14:482482 break;
Blink Reformat1c4d759e2017-04-09 16:34:542483 case WebInputEvent::kGestureLongPress:
2484 case WebInputEvent::kGestureLongTap:
mustaq0fff7fc32014-09-24 20:21:432485 event.x = x;
2486 event.y = y;
[email protected]3db130e2014-03-27 08:14:482487 if (!args->PeekNext().IsEmpty()) {
2488 float width;
2489 if (!args->GetNext(&width)) {
2490 args->ThrowError();
2491 return;
2492 }
Blink Reformat1c4d759e2017-04-09 16:34:542493 event.data.long_press.width = width;
[email protected]3db130e2014-03-27 08:14:482494 if (!args->PeekNext().IsEmpty()) {
2495 float height;
2496 if (!args->GetNext(&height)) {
2497 args->ThrowError();
2498 return;
2499 }
Blink Reformat1c4d759e2017-04-09 16:34:542500 event.data.long_press.height = height;
[email protected]3db130e2014-03-27 08:14:482501 }
2502 }
2503 break;
Blink Reformat1c4d759e2017-04-09 16:34:542504 case WebInputEvent::kGestureTwoFingerTap:
mustaq0fff7fc32014-09-24 20:21:432505 event.x = x;
2506 event.y = y;
[email protected]3db130e2014-03-27 08:14:482507 if (!args->PeekNext().IsEmpty()) {
2508 float first_finger_width;
2509 if (!args->GetNext(&first_finger_width)) {
2510 args->ThrowError();
2511 return;
2512 }
Blink Reformat1c4d759e2017-04-09 16:34:542513 event.data.two_finger_tap.first_finger_width = first_finger_width;
[email protected]3db130e2014-03-27 08:14:482514 if (!args->PeekNext().IsEmpty()) {
2515 float first_finger_height;
2516 if (!args->GetNext(&first_finger_height)) {
2517 args->ThrowError();
2518 return;
2519 }
Blink Reformat1c4d759e2017-04-09 16:34:542520 event.data.two_finger_tap.first_finger_height = first_finger_height;
[email protected]3db130e2014-03-27 08:14:482521 }
2522 }
2523 break;
2524 default:
2525 NOTREACHED();
2526 }
2527
Blink Reformat1c4d759e2017-04-09 16:34:542528 event.unique_touch_event_id = GetUniqueTouchEventId(args);
mustaq19048372016-06-16 21:39:322529
Blink Reformat1c4d759e2017-04-09 16:34:542530 event.global_x = event.x;
2531 event.global_y = event.y;
[email protected]3db130e2014-03-27 08:14:482532
2533 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542534 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482535
dtapuska5d2e9c32015-12-03 16:39:492536 WebInputEventResult result = HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:482537
2538 // Long press might start a drag drop session. Complete it if so.
Blink Reformat1c4d759e2017-04-09 16:34:542539 if (type == WebInputEvent::kGestureLongPress &&
2540 !current_drag_data_.IsNull()) {
2541 WebMouseEvent mouse_event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:162542 ModifiersForPointer(kRawMousePointerId),
2543 GetCurrentEventTimeSec());
2544
2545 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:532546 current_pointer_state_[kRawMousePointerId].current_buttons_,
dtapuska899ac222017-01-03 18:09:162547 WebPoint(x, y), click_count_, &mouse_event);
[email protected]3db130e2014-03-27 08:14:482548
Blink Reformat1c4d759e2017-04-09 16:34:542549 FinishDragAndDrop(mouse_event, blink::kWebDragOperationNone);
[email protected]3db130e2014-03-27 08:14:482550 }
Blink Reformat1c4d759e2017-04-09 16:34:542551 args->Return(result != WebInputEventResult::kNotHandled);
[email protected]3db130e2014-03-27 08:14:482552}
2553
dcheng59826e32017-02-22 10:31:362554void EventSender::UpdateClickCountForButton(WebMouseEvent::Button button_type) {
[email protected]3db130e2014-03-27 08:14:482555 if ((GetCurrentEventTimeSec() - last_click_time_sec_ <
2556 kMultipleClickTimeSec) &&
nzolghadr43146032016-04-11 15:33:382557 (!OutsideMultiClickRadius(
mustaqabca6ff2016-06-09 17:29:532558 current_pointer_state_[kRawMousePointerId].last_pos_,
nzolghadr43146032016-04-11 15:33:382559 last_click_pos_)) &&
[email protected]3db130e2014-03-27 08:14:482560 (button_type == last_button_type_)) {
2561 ++click_count_;
2562 } else {
2563 click_count_ = 1;
2564 last_button_type_ = button_type;
2565 }
2566}
2567
dtapuska899ac222017-01-03 18:09:162568WebMouseWheelEvent EventSender::GetMouseWheelEvent(gin::Arguments* args,
2569 MouseScrollType scroll_type,
2570 bool* send_gestures) {
[email protected]3db130e2014-03-27 08:14:482571 // Force a layout here just to make sure every position has been
2572 // determined before we send events (as well as all the other methods
2573 // that send an event do).
2574 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542575 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482576
2577 double horizontal;
[email protected]3db130e2014-03-27 08:14:482578 double vertical;
dtapuska899ac222017-01-03 18:09:162579 if (!args->GetNext(&horizontal) || !args->GetNext(&vertical)) {
[email protected]3db130e2014-03-27 08:14:482580 args->ThrowError();
dtapuska899ac222017-01-03 18:09:162581 return WebMouseWheelEvent();
[email protected]3db130e2014-03-27 08:14:482582 }
2583
2584 bool paged = false;
2585 bool has_precise_scrolling_deltas = false;
2586 int modifiers = 0;
Blink Reformat1c4d759e2017-04-09 16:34:542587 WebMouseWheelEvent::Phase phase = WebMouseWheelEvent::kPhaseNone;
yutakf3990fd2014-12-23 03:52:382588 if (!args->PeekNext().IsEmpty()) {
2589 args->GetNext(&paged);
2590 if (!args->PeekNext().IsEmpty()) {
2591 args->GetNext(&has_precise_scrolling_deltas);
lanweia93644f2015-01-21 22:00:332592 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:412593 v8::Local<v8::Value> value;
lanweia93644f2015-01-21 22:00:332594 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:322595 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
dtapuska43f18e9e2016-03-20 20:21:302596 if (!args->PeekNext().IsEmpty()) {
dtapuskab8b21412016-06-16 11:09:142597 args->GetNext(send_gestures);
chongzb92d7112016-07-04 22:11:542598 if (!args->PeekNext().IsEmpty()) {
2599 v8::Local<v8::Value> phase_value;
2600 args->GetNext(&phase_value);
2601 phase = GetMouseWheelEventPhaseFromV8(phase_value);
2602 }
dtapuska43f18e9e2016-03-20 20:21:302603 }
lanweia93644f2015-01-21 22:00:332604 }
yutakf3990fd2014-12-23 03:52:382605 }
2606 }
[email protected]3db130e2014-03-27 08:14:482607
dtapuska899ac222017-01-03 18:09:162608 current_pointer_state_[kRawMousePointerId].modifiers_ = modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542609 WebMouseWheelEvent event(WebInputEvent::kMouseWheel,
dtapuska899ac222017-01-03 18:09:162610 ModifiersForPointer(kRawMousePointerId),
2611 GetCurrentEventTimeSec());
2612 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:532613 current_pointer_state_[kRawMousePointerId].current_buttons_,
2614 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:162615 click_count_, &event);
Blink Reformat1c4d759e2017-04-09 16:34:542616 event.wheel_ticks_x = static_cast<float>(horizontal);
2617 event.wheel_ticks_y = static_cast<float>(vertical);
2618 event.delta_x = event.wheel_ticks_x;
2619 event.delta_y = event.wheel_ticks_y;
2620 event.scroll_by_page = paged;
2621 event.has_precise_scrolling_deltas = has_precise_scrolling_deltas;
dtapuska899ac222017-01-03 18:09:162622 event.phase = phase;
dtapuska43f18e9e2016-03-20 20:21:302623 if (scroll_type == MouseScrollType::PIXEL) {
Blink Reformat1c4d759e2017-04-09 16:34:542624 event.wheel_ticks_x /= kScrollbarPixelsPerTick;
2625 event.wheel_ticks_y /= kScrollbarPixelsPerTick;
[email protected]3db130e2014-03-27 08:14:482626 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542627 event.delta_x *= kScrollbarPixelsPerTick;
2628 event.delta_y *= kScrollbarPixelsPerTick;
[email protected]3db130e2014-03-27 08:14:482629 }
dtapuska899ac222017-01-03 18:09:162630 return event;
[email protected]3db130e2014-03-27 08:14:482631}
2632
e.hakkinen80033922015-07-31 08:41:352633// Radius fields radius_x and radius_y should eventually be moved to
2634// WebPointerProperties.
2635// TODO(e_hakkinen): Drop radius_{x,y}_pointer parameters once that happens.
2636void EventSender::InitPointerProperties(gin::Arguments* args,
mustaqabca6ff2016-06-09 17:29:532637 WebPointerProperties* e,
e.hakkinen80033922015-07-31 08:41:352638 float* radius_x_pointer,
2639 float* radius_y_pointer) {
2640 if (!args->PeekNext().IsEmpty()) {
2641 double radius_x;
2642 if (!args->GetNext(&radius_x)) {
2643 args->ThrowError();
2644 return;
2645 }
2646
2647 double radius_y = radius_x;
2648 if (!args->PeekNext().IsEmpty()) {
2649 if (!args->GetNext(&radius_y)) {
2650 args->ThrowError();
2651 return;
2652 }
2653 }
2654
2655 *radius_x_pointer = static_cast<float>(radius_x);
2656 *radius_y_pointer = static_cast<float>(radius_y);
2657 }
2658
2659 if (!args->PeekNext().IsEmpty()) {
2660 double force;
2661 if (!args->GetNext(&force)) {
2662 args->ThrowError();
2663 return;
2664 }
2665 e->force = static_cast<float>(force);
2666 }
2667
2668 if (!args->PeekNext().IsEmpty()) {
2669 int tiltX, tiltY;
2670 if (!args->GetNext(&tiltX) || !args->GetNext(&tiltY)) {
2671 args->ThrowError();
2672 return;
2673 }
Blink Reformat1c4d759e2017-04-09 16:34:542674 e->tilt_x = tiltX;
2675 e->tilt_y = tiltY;
e.hakkinen80033922015-07-31 08:41:352676 }
2677
Blink Reformat1c4d759e2017-04-09 16:34:542678 if (!getPointerType(args, false, e->pointer_type))
nzolghadr43146032016-04-11 15:33:382679 return;
e.hakkinen80033922015-07-31 08:41:352680}
2681
lukaszad322c5ca2016-10-07 00:32:342682void EventSender::FinishDragAndDrop(const WebMouseEvent& raw_event,
oshima76b6eeb2016-06-27 15:55:122683 blink::WebDragOperation drag_effect) {
lukaszad322c5ca2016-10-07 00:32:342684 std::unique_ptr<WebInputEvent> widget_event =
2685 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122686 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342687 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2688 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122689
Blink Reformat1c4d759e2017-04-09 16:34:542690 WebPoint client_point(event->PositionInWidget().x,
2691 event->PositionInWidget().y);
2692 WebPoint screen_point(event->PositionInScreen().x,
2693 event->PositionInScreen().y);
[email protected]3db130e2014-03-27 08:14:482694 current_drag_effect_ = drag_effect;
2695 if (current_drag_effect_) {
2696 // Specifically pass any keyboard modifiers to the drop method. This allows
2697 // tests to control the drop type (i.e. copy or move).
Blink Reformat1c4d759e2017-04-09 16:34:542698 mainFrameWidget()->DragTargetDrop(current_drag_data_, client_point,
2699 screen_point, event->GetModifiers());
[email protected]3db130e2014-03-27 08:14:482700 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542701 mainFrameWidget()->DragTargetDragLeave(blink::WebPoint(),
kenrb07c272802017-02-07 23:48:172702 blink::WebPoint());
[email protected]3db130e2014-03-27 08:14:482703 }
Blink Reformat1c4d759e2017-04-09 16:34:542704 current_drag_data_.Reset();
2705 mainFrameWidget()->DragSourceEndedAt(client_point, screen_point,
paulmeyer8fc8ea92016-11-15 05:12:212706 current_drag_effect_);
Blink Reformat1c4d759e2017-04-09 16:34:542707 mainFrameWidget()->DragSourceSystemDragEnded();
[email protected]3db130e2014-03-27 08:14:482708}
2709
lukaszad322c5ca2016-10-07 00:32:342710void EventSender::DoDragAfterMouseUp(const WebMouseEvent& raw_event) {
2711 std::unique_ptr<WebInputEvent> widget_event =
2712 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122713 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342714 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2715 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122716
Blink Reformat1c4d759e2017-04-09 16:34:542717 last_click_time_sec_ = event->TimeStampSeconds();
mustaqabca6ff2016-06-09 17:29:532718 last_click_pos_ = current_pointer_state_[kRawMousePointerId].last_pos_;
[email protected]3db130e2014-03-27 08:14:482719
2720 // If we're in a drag operation, complete it.
Blink Reformat1c4d759e2017-04-09 16:34:542721 if (current_drag_data_.IsNull())
[email protected]3db130e2014-03-27 08:14:482722 return;
2723
Blink Reformat1c4d759e2017-04-09 16:34:542724 WebPoint client_point(event->PositionInWidget().x,
2725 event->PositionInWidget().y);
2726 WebPoint screen_point(event->PositionInScreen().x,
2727 event->PositionInScreen().y);
2728 blink::WebDragOperation drag_effect = mainFrameWidget()->DragTargetDragOver(
oshima76b6eeb2016-06-27 15:55:122729 client_point, screen_point, current_drag_effects_allowed_,
Blink Reformat1c4d759e2017-04-09 16:34:542730 event->GetModifiers());
sigbjornf8d568b122016-02-24 21:29:472731
2732 // Bail if dragover caused cancellation.
Blink Reformat1c4d759e2017-04-09 16:34:542733 if (current_drag_data_.IsNull())
sigbjornf8d568b122016-02-24 21:29:472734 return;
2735
lukaszad322c5ca2016-10-07 00:32:342736 FinishDragAndDrop(raw_event, drag_effect);
[email protected]3db130e2014-03-27 08:14:482737}
2738
lukaszad322c5ca2016-10-07 00:32:342739void EventSender::DoDragAfterMouseMove(const WebMouseEvent& raw_event) {
mustaqabca6ff2016-06-09 17:29:532740 if (current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542741 WebMouseEvent::Button::kNoButton ||
2742 current_drag_data_.IsNull()) {
[email protected]3db130e2014-03-27 08:14:482743 return;
2744 }
2745
lukaszad322c5ca2016-10-07 00:32:342746 std::unique_ptr<WebInputEvent> widget_event =
2747 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122748 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342749 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2750 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122751
Blink Reformat1c4d759e2017-04-09 16:34:542752 WebPoint client_point(event->PositionInWidget().x,
2753 event->PositionInWidget().y);
2754 WebPoint screen_point(event->PositionInScreen().x,
2755 event->PositionInScreen().y);
2756 current_drag_effect_ = mainFrameWidget()->DragTargetDragOver(
oshima76b6eeb2016-06-27 15:55:122757 client_point, screen_point, current_drag_effects_allowed_,
Blink Reformat1c4d759e2017-04-09 16:34:542758 event->GetModifiers());
[email protected]3db130e2014-03-27 08:14:482759}
2760
2761void EventSender::ReplaySavedEvents() {
2762 replaying_saved_events_ = true;
2763 while (!mouse_event_queue_.empty()) {
2764 SavedEvent e = mouse_event_queue_.front();
2765 mouse_event_queue_.pop_front();
2766
2767 switch (e.type) {
2768 case SavedEvent::TYPE_MOUSE_MOVE: {
dtapuska899ac222017-01-03 18:09:162769 current_pointer_state_[kRawMousePointerId].modifiers_ = e.modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542770 WebMouseEvent event(WebInputEvent::kMouseMove,
dtapuska899ac222017-01-03 18:09:162771 ModifiersForPointer(kRawMousePointerId),
2772 GetCurrentEventTimeSec());
nzolghadr43146032016-04-11 15:33:382773 InitMouseEvent(
mustaqabca6ff2016-06-09 17:29:532774 current_pointer_state_[kRawMousePointerId].pressed_button_,
2775 current_pointer_state_[kRawMousePointerId].current_buttons_, e.pos,
dtapuska899ac222017-01-03 18:09:162776 click_count_, &event);
mustaqabca6ff2016-06-09 17:29:532777 current_pointer_state_[kRawMousePointerId].last_pos_ =
Blink Reformat1c4d759e2017-04-09 16:34:542778 WebPoint(event.PositionInWidget().x, event.PositionInWidget().y);
nzolghadr43146032016-04-11 15:33:382779 HandleInputEventOnViewOrPopup(event);
2780 DoDragAfterMouseMove(event);
[email protected]3db130e2014-03-27 08:14:482781 break;
2782 }
2783 case SavedEvent::TYPE_LEAP_FORWARD:
2784 DoLeapForward(e.milliseconds);
2785 break;
2786 case SavedEvent::TYPE_MOUSE_UP: {
mustaqabca6ff2016-06-09 17:29:532787 current_pointer_state_[kRawMousePointerId].current_buttons_ &=
nzolghadr43146032016-04-11 15:33:382788 ~GetWebMouseEventModifierForButton(e.button_type);
mustaqabca6ff2016-06-09 17:29:532789 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:542790 WebMouseEvent::Button::kNoButton;
dtapuska899ac222017-01-03 18:09:162791 current_pointer_state_[kRawMousePointerId].modifiers_ = e.modifiers;
mustaq21aed4e2015-12-15 21:47:212792
Blink Reformat1c4d759e2017-04-09 16:34:542793 WebMouseEvent event(WebInputEvent::kMouseUp,
dtapuska899ac222017-01-03 18:09:162794 ModifiersForPointer(kRawMousePointerId),
2795 GetCurrentEventTimeSec());
mustaqabca6ff2016-06-09 17:29:532796 InitMouseEvent(
dtapuska899ac222017-01-03 18:09:162797 e.button_type,
mustaqabca6ff2016-06-09 17:29:532798 current_pointer_state_[kRawMousePointerId].current_buttons_,
dtapuska899ac222017-01-03 18:09:162799 current_pointer_state_[kRawMousePointerId].last_pos_, click_count_,
2800 &event);
nzolghadr43146032016-04-11 15:33:382801 HandleInputEventOnViewOrPopup(event);
2802 DoDragAfterMouseUp(event);
[email protected]3db130e2014-03-27 08:14:482803 break;
2804 }
2805 default:
2806 NOTREACHED();
2807 }
2808 }
2809
2810 replaying_saved_events_ = false;
2811}
2812
dtapuska5d2e9c32015-12-03 16:39:492813WebInputEventResult EventSender::HandleInputEventOnViewOrPopup(
lukaszad322c5ca2016-10-07 00:32:342814 const WebInputEvent& raw_event) {
Blink Reformat1c4d759e2017-04-09 16:34:542815 last_event_timestamp_ = raw_event.TimeStampSeconds();
oshima76b6eeb2016-06-27 15:55:122816
Blink Reformat1c4d759e2017-04-09 16:34:542817 WebPagePopup* popup = widget()->GetPagePopup();
2818 if (popup && !WebInputEvent::IsKeyboardEventType(raw_event.GetType())) {
lukaszad322c5ca2016-10-07 00:32:342819 // ui::ScaleWebInputEvent returns nullptr when the scale is 1.0f as the
2820 // event does not have to be converted.
2821 std::unique_ptr<WebInputEvent> scaled_event = ui::ScaleWebInputEvent(
2822 raw_event, delegate()->GetWindowToViewportScale());
2823 const WebInputEvent* popup_friendly_event =
2824 scaled_event.get() ? scaled_event.get() : &raw_event;
Blink Reformat1c4d759e2017-04-09 16:34:542825 return popup->HandleInputEvent(
nzolghadr5d8596502017-01-23 22:59:352826 blink::WebCoalescedInputEvent(*popup_friendly_event));
tkent588765612014-11-28 01:07:482827 }
lukaszad322c5ca2016-10-07 00:32:342828
2829 std::unique_ptr<WebInputEvent> widget_event =
2830 TransformScreenToWidgetCoordinates(raw_event);
2831 const WebInputEvent* event =
2832 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2833 : &raw_event;
Blink Reformat1c4d759e2017-04-09 16:34:542834 return widget()->HandleInputEvent(blink::WebCoalescedInputEvent(*event));
tkent588765612014-11-28 01:07:482835}
2836
dtapuska43f18e9e2016-03-20 20:21:302837void EventSender::SendGesturesForMouseWheelEvent(
2838 const WebMouseWheelEvent wheel_event) {
Blink Reformat1c4d759e2017-04-09 16:34:542839 WebGestureEvent begin_event(WebInputEvent::kGestureScrollBegin,
2840 wheel_event.GetModifiers(),
dtapuska8c4dae12017-01-13 00:23:062841 GetCurrentEventTimeSec());
dtapuska899ac222017-01-03 18:09:162842 InitGestureEventFromMouseWheel(wheel_event, &begin_event);
Blink Reformat1c4d759e2017-04-09 16:34:542843 begin_event.data.scroll_begin.delta_x_hint = wheel_event.delta_x;
2844 begin_event.data.scroll_begin.delta_y_hint = wheel_event.delta_y;
2845 if (wheel_event.scroll_by_page) {
2846 begin_event.data.scroll_begin.delta_hint_units =
2847 blink::WebGestureEvent::kPage;
2848 if (begin_event.data.scroll_begin.delta_x_hint) {
2849 begin_event.data.scroll_begin.delta_x_hint =
2850 begin_event.data.scroll_begin.delta_x_hint > 0 ? 1 : -1;
dtapuska43f18e9e2016-03-20 20:21:302851 }
Blink Reformat1c4d759e2017-04-09 16:34:542852 if (begin_event.data.scroll_begin.delta_y_hint) {
2853 begin_event.data.scroll_begin.delta_y_hint =
2854 begin_event.data.scroll_begin.delta_y_hint > 0 ? 1 : -1;
dtapuska43f18e9e2016-03-20 20:21:302855 }
2856 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542857 begin_event.data.scroll_begin.delta_hint_units =
2858 wheel_event.has_precise_scrolling_deltas
2859 ? blink::WebGestureEvent::kPrecisePixels
2860 : blink::WebGestureEvent::kPixels;
dtapuska43f18e9e2016-03-20 20:21:302861 }
2862
2863 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542864 widget()->UpdateAllLifecyclePhases();
dtapuska43f18e9e2016-03-20 20:21:302865
2866 HandleInputEventOnViewOrPopup(begin_event);
2867
Blink Reformat1c4d759e2017-04-09 16:34:542868 WebGestureEvent update_event(WebInputEvent::kGestureScrollUpdate,
2869 wheel_event.GetModifiers(),
dtapuska8c4dae12017-01-13 00:23:062870 GetCurrentEventTimeSec());
dtapuska899ac222017-01-03 18:09:162871 InitGestureEventFromMouseWheel(wheel_event, &update_event);
Blink Reformat1c4d759e2017-04-09 16:34:542872 update_event.data.scroll_update.delta_x =
2873 begin_event.data.scroll_begin.delta_x_hint;
2874 update_event.data.scroll_update.delta_y =
2875 begin_event.data.scroll_begin.delta_y_hint;
2876 update_event.data.scroll_update.delta_units =
2877 begin_event.data.scroll_begin.delta_hint_units;
dtapuska43f18e9e2016-03-20 20:21:302878
2879 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542880 widget()->UpdateAllLifecyclePhases();
dtapuska43f18e9e2016-03-20 20:21:302881 HandleInputEventOnViewOrPopup(update_event);
2882
Blink Reformat1c4d759e2017-04-09 16:34:542883 WebGestureEvent end_event(WebInputEvent::kGestureScrollEnd,
2884 wheel_event.GetModifiers(),
2885 GetCurrentEventTimeSec());
dtapuska899ac222017-01-03 18:09:162886 InitGestureEventFromMouseWheel(wheel_event, &end_event);
Blink Reformat1c4d759e2017-04-09 16:34:542887 end_event.data.scroll_end.delta_units =
2888 begin_event.data.scroll_begin.delta_hint_units;
dtapuska43f18e9e2016-03-20 20:21:302889
2890 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542891 widget()->UpdateAllLifecyclePhases();
dtapuska43f18e9e2016-03-20 20:21:302892 HandleInputEventOnViewOrPopup(end_event);
2893}
2894
lukasza335bb762016-04-22 16:44:032895TestInterfaces* EventSender::interfaces() {
lukaszad322c5ca2016-10-07 00:32:342896 return web_widget_test_proxy_base_->web_view_test_proxy_base()
2897 ->test_interfaces();
lukasza335bb762016-04-22 16:44:032898}
2899
2900WebTestDelegate* EventSender::delegate() {
lukaszad322c5ca2016-10-07 00:32:342901 return web_widget_test_proxy_base_->web_view_test_proxy_base()->delegate();
lukasza335bb762016-04-22 16:44:032902}
2903
2904const blink::WebView* EventSender::view() const {
lukaszad322c5ca2016-10-07 00:32:342905 return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view();
lukasza335bb762016-04-22 16:44:032906}
2907
2908blink::WebView* EventSender::view() {
lukaszad322c5ca2016-10-07 00:32:342909 return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view();
lukasza335bb762016-04-22 16:44:032910}
2911
lukaszad322c5ca2016-10-07 00:32:342912blink::WebWidget* EventSender::widget() {
2913 return web_widget_test_proxy_base_->web_widget();
2914}
2915
paulmeyer90f6c31d2016-11-12 00:17:592916blink::WebFrameWidget* EventSender::mainFrameWidget() {
Blink Reformat1c4d759e2017-04-09 16:34:542917 return view()->MainFrame()->ToWebLocalFrame()->FrameWidget();
paulmeyer90f6c31d2016-11-12 00:17:592918}
2919
lukaszad322c5ca2016-10-07 00:32:342920std::unique_ptr<WebInputEvent> EventSender::TransformScreenToWidgetCoordinates(
oshima76b6eeb2016-06-27 15:55:122921 const WebInputEvent& event) {
lukaszad322c5ca2016-10-07 00:32:342922 return delegate()->TransformScreenToWidgetCoordinates(
2923 web_widget_test_proxy_base_, event);
oshima76b6eeb2016-06-27 15:55:122924}
2925
jochenf5f31752015-06-03 12:06:342926} // namespace test_runner