blob: 29a1f85e07c41d917d7c4ff37cfbc968d2fcb52a [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
Scott Violetfdda96d2018-07-27 20:17:235#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"
Daniel Cheng224569ee2018-04-25 05:45:0621#include "base/time/time.h"
avi5dd91f82015-12-25 22:30:4622#include "build/build_config.h"
Ehsan Karamad0f83cb112018-09-06 22:07:3623#include "content/common/input/web_mouse_wheel_event_traits.h"
Scott Violetfdda96d2018-07-27 20:17:2324#include "content/shell/test_runner/mock_spell_check.h"
25#include "content/shell/test_runner/test_interfaces.h"
26#include "content/shell/test_runner/web_test_delegate.h"
27#include "content/shell/test_runner/web_view_test_proxy.h"
28#include "content/shell/test_runner/web_widget_test_proxy.h"
[email protected]3db130e2014-03-27 08:14:4829#include "gin/handle.h"
30#include "gin/object_template_builder.h"
31#include "gin/wrappable.h"
dcheng3dd85612017-02-08 10:46:2332#include "net/base/filename_util.h"
Blink Reformata30d4232018-04-07 15:31:0633#include "third_party/blink/public/platform/url_conversion.h"
34#include "third_party/blink/public/platform/web_coalesced_input_event.h"
35#include "third_party/blink/public/platform/web_gesture_event.h"
36#include "third_party/blink/public/platform/web_keyboard_event.h"
37#include "third_party/blink/public/platform/web_pointer_properties.h"
38#include "third_party/blink/public/platform/web_string.h"
39#include "third_party/blink/public/platform/web_touch_event.h"
40#include "third_party/blink/public/platform/web_vector.h"
41#include "third_party/blink/public/web/blink.h"
42#include "third_party/blink/public/web/web_context_menu_data.h"
43#include "third_party/blink/public/web/web_frame_widget.h"
44#include "third_party/blink/public/web/web_local_frame.h"
45#include "third_party/blink/public/web/web_page_popup.h"
46#include "third_party/blink/public/web/web_user_gesture_indicator.h"
47#include "third_party/blink/public/web/web_view.h"
oshima76b6eeb2016-06-27 15:55:1248#include "ui/events/blink/blink_event_util.h"
kpschoedel3b0960a2015-05-11 17:52:1149#include "ui/events/keycodes/dom/keycode_converter.h"
[email protected]a731f1a92014-04-17 19:31:0650#include "ui/events/keycodes/keyboard_codes.h"
[email protected]3db130e2014-03-27 08:14:4851#include "v8/include/v8.h"
52
[email protected]3db130e2014-03-27 08:14:4853using blink::WebContextMenuData;
54using blink::WebDragData;
55using blink::WebDragOperationsMask;
56using blink::WebFloatPoint;
[email protected]3db130e2014-03-27 08:14:4857using blink::WebGestureEvent;
58using blink::WebInputEvent;
dtapuska5d2e9c32015-12-03 16:39:4959using blink::WebInputEventResult;
[email protected]3db130e2014-03-27 08:14:4860using blink::WebKeyboardEvent;
lukasza335bb762016-04-22 16:44:0361using blink::WebLocalFrame;
[email protected]f9634a82014-08-05 13:10:1962using blink::WebMenuItemInfo;
[email protected]3db130e2014-03-27 08:14:4863using blink::WebMouseEvent;
64using blink::WebMouseWheelEvent;
tkent588765612014-11-28 01:07:4865using blink::WebPagePopup;
[email protected]3db130e2014-03-27 08:14:4866using blink::WebPoint;
Navid Zolghadr24ff17d2018-01-24 20:58:0467using blink::WebPointerEvent;
mustaqcc6220fa2016-03-09 22:07:5468using blink::WebPointerProperties;
[email protected]3db130e2014-03-27 08:14:4869using blink::WebString;
70using blink::WebTouchEvent;
71using blink::WebTouchPoint;
dcheng3dd85612017-02-08 10:46:2372using blink::WebURL;
[email protected]3db130e2014-03-27 08:14:4873using blink::WebVector;
74using blink::WebView;
75
jochenf5f31752015-06-03 12:06:3476namespace test_runner {
[email protected]3db130e2014-03-27 08:14:4877
78namespace {
79
mustaqabca6ff2016-06-09 17:29:5380const int kRawMousePointerId = -1;
mustaq758b1152016-09-02 22:06:4381const char* const kPointerTypeStringUnknown = "";
82const char* const kPointerTypeStringMouse = "mouse";
83const char* const kPointerTypeStringTouch = "touch";
84const char* const kPointerTypeStringPen = "pen";
85const char* const kPointerTypeStringEraser = "eraser";
nzolghadr43146032016-04-11 15:33:3886
87// Assigns |pointerType| from the provided |args|. Returns false if there was
88// any error.
chongzd65eacf2017-06-28 05:21:5989bool GetPointerType(gin::Arguments* args,
nzolghadr43146032016-04-11 15:33:3890 bool isOnlyMouseAndPenAllowed,
mustaqabca6ff2016-06-09 17:29:5391 WebPointerProperties::PointerType& pointerType) {
nzolghadr43146032016-04-11 15:33:3892 if (args->PeekNext().IsEmpty())
93 return true;
94 std::string pointer_type_string;
95 if (!args->GetNext(&pointer_type_string)) {
96 args->ThrowError();
97 return false;
98 }
99 if (isOnlyMouseAndPenAllowed &&
100 (pointer_type_string == kPointerTypeStringUnknown ||
101 pointer_type_string == kPointerTypeStringTouch)) {
102 args->ThrowError();
103 return false;
104 }
105 if (pointer_type_string == kPointerTypeStringUnknown) {
Blink Reformat1c4d759e2017-04-09 16:34:54106 pointerType = WebMouseEvent::PointerType::kUnknown;
nzolghadr43146032016-04-11 15:33:38107 } else if (pointer_type_string == kPointerTypeStringMouse) {
Blink Reformat1c4d759e2017-04-09 16:34:54108 pointerType = WebMouseEvent::PointerType::kMouse;
nzolghadr43146032016-04-11 15:33:38109 } else if (pointer_type_string == kPointerTypeStringTouch) {
Blink Reformat1c4d759e2017-04-09 16:34:54110 pointerType = WebMouseEvent::PointerType::kTouch;
mustaq758b1152016-09-02 22:06:43111 } else if (pointer_type_string == kPointerTypeStringPen) {
Blink Reformat1c4d759e2017-04-09 16:34:54112 pointerType = WebMouseEvent::PointerType::kPen;
mustaq758b1152016-09-02 22:06:43113 } else if (pointer_type_string == kPointerTypeStringEraser) {
Blink Reformat1c4d759e2017-04-09 16:34:54114 pointerType = WebMouseEvent::PointerType::kEraser;
nzolghadr43146032016-04-11 15:33:38115 } else {
116 args->ThrowError();
117 return false;
118 }
119 return true;
120}
121
Navid Zolghadr24ff17d2018-01-24 20:58:04122WebInputEvent::Type PointerEventTypeForTouchPointState(
123 WebTouchPoint::State state) {
124 switch (state) {
125 case WebTouchPoint::kStateReleased:
126 return WebInputEvent::Type::kPointerUp;
127 case WebTouchPoint::kStateCancelled:
128 return WebInputEvent::Type::kPointerCancel;
129 case WebTouchPoint::kStatePressed:
130 return WebInputEvent::Type::kPointerDown;
131 case WebTouchPoint::kStateMoved:
132 return WebInputEvent::Type::kPointerMove;
133 case WebTouchPoint::kStateStationary:
134 default:
135 NOTREACHED();
136 return WebInputEvent::Type::kUndefined;
137 }
138}
139
mustaqabca6ff2016-06-09 17:29:53140// Parses |pointerType|, |rawPointerId|, |pressure|, |tiltX| and |tiltY| from
141// the provided |args|. Returns false if there was any error, assuming the last
142// 3 of the five parsed parameters are optional.
143bool getMousePenPointerProperties(
nzolghadr43146032016-04-11 15:33:38144 gin::Arguments* args,
mustaqabca6ff2016-06-09 17:29:53145 WebPointerProperties::PointerType& pointerType,
146 int& rawPointerId,
147 float& pressure,
148 int& tiltX,
149 int& tiltY) {
Blink Reformat1c4d759e2017-04-09 16:34:54150 pointerType = WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:53151 rawPointerId = kRawMousePointerId;
152 pressure = std::numeric_limits<float>::quiet_NaN();
153 tiltX = 0;
154 tiltY = 0;
155
nzolghadr43146032016-04-11 15:33:38156 // Only allow pen or mouse through this API.
chongzd65eacf2017-06-28 05:21:59157 if (!GetPointerType(args, false, pointerType))
nzolghadr43146032016-04-11 15:33:38158 return false;
159 if (!args->PeekNext().IsEmpty()) {
mustaqabca6ff2016-06-09 17:29:53160 if (!args->GetNext(&rawPointerId)) {
nzolghadr43146032016-04-11 15:33:38161 args->ThrowError();
162 return false;
163 }
mustaqabca6ff2016-06-09 17:29:53164
165 // Parse optional params
166 if (!args->PeekNext().IsEmpty()) {
167 if (!args->GetNext(&pressure)) {
168 args->ThrowError();
169 return false;
170 }
171 if (!args->PeekNext().IsEmpty()) {
172 if (!args->GetNext(&tiltX)) {
173 args->ThrowError();
174 return false;
175 }
176 if (!args->PeekNext().IsEmpty()) {
177 if (!args->GetNext(&tiltY)) {
178 args->ThrowError();
179 return false;
180 }
181 }
182 }
nzolghadr43146032016-04-11 15:33:38183 }
nzolghadr43146032016-04-11 15:33:38184 }
mustaqabca6ff2016-06-09 17:29:53185
nzolghadr43146032016-04-11 15:33:38186 return true;
187}
188
mustaq8911f4e2015-10-27 18:10:22189WebMouseEvent::Button GetButtonTypeFromButtonNumber(int button_code) {
190 switch (button_code) {
191 case -1:
Blink Reformat1c4d759e2017-04-09 16:34:54192 return WebMouseEvent::Button::kNoButton;
mustaq8911f4e2015-10-27 18:10:22193 case 0:
Blink Reformat1c4d759e2017-04-09 16:34:54194 return WebMouseEvent::Button::kLeft;
mustaq8911f4e2015-10-27 18:10:22195 case 1:
Blink Reformat1c4d759e2017-04-09 16:34:54196 return WebMouseEvent::Button::kMiddle;
mustaq8911f4e2015-10-27 18:10:22197 case 2:
Blink Reformat1c4d759e2017-04-09 16:34:54198 return WebMouseEvent::Button::kRight;
mustaq6ee1f8d2017-03-31 19:23:04199 case 3:
Blink Reformat1c4d759e2017-04-09 16:34:54200 return WebMouseEvent::Button::kBack;
mustaq6ee1f8d2017-03-31 19:23:04201 case 4:
Blink Reformat1c4d759e2017-04-09 16:34:54202 return WebMouseEvent::Button::kForward;
mustaq8911f4e2015-10-27 18:10:22203 }
204 NOTREACHED();
Blink Reformat1c4d759e2017-04-09 16:34:54205 return WebMouseEvent::Button::kNoButton;
mustaq8911f4e2015-10-27 18:10:22206}
207
mustaq21aed4e2015-12-15 21:47:21208int GetWebMouseEventModifierForButton(WebMouseEvent::Button button) {
209 switch (button) {
Blink Reformat1c4d759e2017-04-09 16:34:54210 case WebMouseEvent::Button::kNoButton:
mustaq21aed4e2015-12-15 21:47:21211 return 0;
Blink Reformat1c4d759e2017-04-09 16:34:54212 case WebMouseEvent::Button::kLeft:
213 return WebMouseEvent::kLeftButtonDown;
214 case WebMouseEvent::Button::kMiddle:
215 return WebMouseEvent::kMiddleButtonDown;
216 case WebMouseEvent::Button::kRight:
217 return WebMouseEvent::kRightButtonDown;
218 case WebPointerProperties::Button::kBack:
219 return WebMouseEvent::kBackButtonDown;
220 case WebPointerProperties::Button::kForward:
221 return WebMouseEvent::kForwardButtonDown;
222 case WebPointerProperties::Button::kEraser:
dcheng59826e32017-02-22 10:31:36223 return 0; // Not implemented yet
mustaq21aed4e2015-12-15 21:47:21224 }
225 NOTREACHED();
226 return 0;
227}
228
mustaq6ee1f8d2017-03-31 19:23:04229const int kButtonsInModifiers =
Blink Reformat1c4d759e2017-04-09 16:34:54230 WebMouseEvent::kLeftButtonDown | WebMouseEvent::kMiddleButtonDown |
231 WebMouseEvent::kRightButtonDown | WebMouseEvent::kBackButtonDown |
232 WebMouseEvent::kForwardButtonDown;
mustaq21aed4e2015-12-15 21:47:21233
nzolghadr65468b42016-01-19 14:03:58234int modifiersWithButtons(int modifiers, int buttons) {
dcheng59826e32017-02-22 10:31:36235 return (modifiers & ~kButtonsInModifiers) | (buttons & kButtonsInModifiers);
nzolghadr65468b42016-01-19 14:03:58236}
237
dtapuska899ac222017-01-03 18:09:16238void InitMouseEventGeneric(WebMouseEvent::Button b,
mustaqabca6ff2016-06-09 17:29:53239 int current_buttons,
240 const WebPoint& pos,
mustaqabca6ff2016-06-09 17:29:53241 int click_count,
mustaqabca6ff2016-06-09 17:29:53242 WebPointerProperties::PointerType pointerType,
243 int pointerId,
244 float pressure,
245 int tiltX,
246 int tiltY,
247 WebMouseEvent* e) {
[email protected]3db130e2014-03-27 08:14:48248 e->button = b;
Blink Reformat1c4d759e2017-04-09 16:34:54249 e->SetPositionInWidget(pos.x, pos.y);
250 e->SetPositionInScreen(pos.x, pos.y);
251 e->pointer_type = pointerType;
nzolghadr43146032016-04-11 15:33:38252 e->id = pointerId;
mustaqabca6ff2016-06-09 17:29:53253 e->force = pressure;
Blink Reformat1c4d759e2017-04-09 16:34:54254 e->tilt_x = tiltX;
255 e->tilt_y = tiltY;
256 e->click_count = click_count;
[email protected]3db130e2014-03-27 08:14:48257}
258
dtapuska899ac222017-01-03 18:09:16259void InitMouseEvent(WebMouseEvent::Button b,
mustaqabca6ff2016-06-09 17:29:53260 int current_buttons,
261 const WebPoint& pos,
mustaqabca6ff2016-06-09 17:29:53262 int click_count,
mustaqabca6ff2016-06-09 17:29:53263 WebMouseEvent* e) {
dtapuska899ac222017-01-03 18:09:16264 InitMouseEventGeneric(b, current_buttons, pos, click_count,
Blink Reformat1c4d759e2017-04-09 16:34:54265 WebPointerProperties::PointerType::kMouse, 0, 0.0, 0, 0,
dtapuska899ac222017-01-03 18:09:16266 e);
mustaqabca6ff2016-06-09 17:29:53267}
268
dtapuska899ac222017-01-03 18:09:16269void InitGestureEventFromMouseWheel(const WebMouseWheelEvent& wheel_event,
dtapuska43f18e9e2016-03-20 20:21:30270 WebGestureEvent* gesture_event) {
Ella Ge1116059d2018-03-21 02:06:13271 gesture_event->SetPositionInWidget(wheel_event.PositionInWidget());
272 gesture_event->SetPositionInScreen(wheel_event.PositionInScreen());
dtapuska43f18e9e2016-03-20 20:21:30273}
274
[email protected]3db130e2014-03-27 08:14:48275int GetKeyModifier(const std::string& modifier_name) {
276 const char* characters = modifier_name.c_str();
277 if (!strcmp(characters, "ctrlKey")
278#ifndef __APPLE__
279 || !strcmp(characters, "addSelectionKey")
280#endif
dcheng59826e32017-02-22 10:31:36281 ) {
Blink Reformat1c4d759e2017-04-09 16:34:54282 return WebInputEvent::kControlKey;
[email protected]3db130e2014-03-27 08:14:48283 } else if (!strcmp(characters, "shiftKey") ||
284 !strcmp(characters, "rangeSelectionKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54285 return WebInputEvent::kShiftKey;
[email protected]3db130e2014-03-27 08:14:48286 } else if (!strcmp(characters, "altKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54287 return WebInputEvent::kAltKey;
[email protected]3db130e2014-03-27 08:14:48288#ifdef __APPLE__
289 } else if (!strcmp(characters, "metaKey") ||
290 !strcmp(characters, "addSelectionKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54291 return WebInputEvent::kMetaKey;
[email protected]3db130e2014-03-27 08:14:48292#else
293 } else if (!strcmp(characters, "metaKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54294 return WebInputEvent::kMetaKey;
[email protected]3db130e2014-03-27 08:14:48295#endif
296 } else if (!strcmp(characters, "autoRepeat")) {
Blink Reformat1c4d759e2017-04-09 16:34:54297 return WebInputEvent::kIsAutoRepeat;
[email protected]3db130e2014-03-27 08:14:48298 } else if (!strcmp(characters, "copyKey")) {
299#ifdef __APPLE__
Blink Reformat1c4d759e2017-04-09 16:34:54300 return WebInputEvent::kAltKey;
[email protected]3db130e2014-03-27 08:14:48301#else
Blink Reformat1c4d759e2017-04-09 16:34:54302 return WebInputEvent::kControlKey;
[email protected]3db130e2014-03-27 08:14:48303#endif
tkentc8c0bc82015-10-15 22:43:48304 } else if (!strcmp(characters, "accessKey")) {
305#ifdef __APPLE__
Blink Reformat1c4d759e2017-04-09 16:34:54306 return WebInputEvent::kAltKey | WebInputEvent::kControlKey;
tkentc8c0bc82015-10-15 22:43:48307#else
Blink Reformat1c4d759e2017-04-09 16:34:54308 return WebInputEvent::kAltKey;
tkentc8c0bc82015-10-15 22:43:48309#endif
jinho.bangffc700e2014-11-17 04:05:26310 } else if (!strcmp(characters, "leftButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54311 return WebInputEvent::kLeftButtonDown;
jinho.bangffc700e2014-11-17 04:05:26312 } else if (!strcmp(characters, "middleButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54313 return WebInputEvent::kMiddleButtonDown;
jinho.bangffc700e2014-11-17 04:05:26314 } else if (!strcmp(characters, "rightButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54315 return WebInputEvent::kRightButtonDown;
mustaq6ee1f8d2017-03-31 19:23:04316 } else if (!strcmp(characters, "backButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54317 return WebInputEvent::kBackButtonDown;
mustaq6ee1f8d2017-03-31 19:23:04318 } else if (!strcmp(characters, "forwardButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54319 return WebInputEvent::kForwardButtonDown;
dtapuska299efe12015-10-05 16:53:44320 } else if (!strcmp(characters, "capsLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54321 return WebInputEvent::kCapsLockOn;
dtapuska299efe12015-10-05 16:53:44322 } else if (!strcmp(characters, "numLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54323 return WebInputEvent::kNumLockOn;
dtapuska299efe12015-10-05 16:53:44324 } else if (!strcmp(characters, "locationLeft")) {
Blink Reformat1c4d759e2017-04-09 16:34:54325 return WebInputEvent::kIsLeft;
dtapuska299efe12015-10-05 16:53:44326 } else if (!strcmp(characters, "locationRight")) {
Blink Reformat1c4d759e2017-04-09 16:34:54327 return WebInputEvent::kIsRight;
dtapuska299efe12015-10-05 16:53:44328 } else if (!strcmp(characters, "locationNumpad")) {
Blink Reformat1c4d759e2017-04-09 16:34:54329 return WebInputEvent::kIsKeyPad;
dtapuska299efe12015-10-05 16:53:44330 } else if (!strcmp(characters, "isComposing")) {
Blink Reformat1c4d759e2017-04-09 16:34:54331 return WebInputEvent::kIsComposing;
dtapuska299efe12015-10-05 16:53:44332 } else if (!strcmp(characters, "altGraphKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54333 return WebInputEvent::kAltGrKey;
dtapuska299efe12015-10-05 16:53:44334 } else if (!strcmp(characters, "fnKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54335 return WebInputEvent::kFnKey;
dtapuska299efe12015-10-05 16:53:44336 } else if (!strcmp(characters, "symbolKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54337 return WebInputEvent::kSymbolKey;
dtapuska299efe12015-10-05 16:53:44338 } else if (!strcmp(characters, "scrollLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54339 return WebInputEvent::kScrollLockOn;
[email protected]3db130e2014-03-27 08:14:48340 }
341
342 return 0;
343}
344
345int GetKeyModifiers(const std::vector<std::string>& modifier_names) {
346 int modifiers = 0;
347 for (std::vector<std::string>::const_iterator it = modifier_names.begin();
348 it != modifier_names.end(); ++it) {
349 modifiers |= GetKeyModifier(*it);
350 }
351 return modifiers;
352}
353
bashidbd2ef9bb2015-06-02 01:39:32354int GetKeyModifiersFromV8(v8::Isolate* isolate, v8::Local<v8::Value> value) {
[email protected]3db130e2014-03-27 08:14:48355 std::vector<std::string> modifier_names;
356 if (value->IsString()) {
Dan Elphick38a508052018-07-23 22:19:53357 modifier_names.push_back(gin::V8ToString(isolate, value));
[email protected]3db130e2014-03-27 08:14:48358 } else if (value->IsArray()) {
dcheng59826e32017-02-22 10:31:36359 gin::Converter<std::vector<std::string>>::FromV8(isolate, value,
360 &modifier_names);
[email protected]3db130e2014-03-27 08:14:48361 }
362 return GetKeyModifiers(modifier_names);
363}
364
chongzb92d7112016-07-04 22:11:54365WebMouseWheelEvent::Phase GetMouseWheelEventPhase(
366 const std::string& phase_name) {
367 if (phase_name == "phaseNone") {
Blink Reformat1c4d759e2017-04-09 16:34:54368 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54369 } else if (phase_name == "phaseBegan") {
Blink Reformat1c4d759e2017-04-09 16:34:54370 return WebMouseWheelEvent::kPhaseBegan;
chongzb92d7112016-07-04 22:11:54371 } else if (phase_name == "phaseStationary") {
Blink Reformat1c4d759e2017-04-09 16:34:54372 return WebMouseWheelEvent::kPhaseStationary;
chongzb92d7112016-07-04 22:11:54373 } else if (phase_name == "phaseChanged") {
Blink Reformat1c4d759e2017-04-09 16:34:54374 return WebMouseWheelEvent::kPhaseChanged;
chongzb92d7112016-07-04 22:11:54375 } else if (phase_name == "phaseEnded") {
Blink Reformat1c4d759e2017-04-09 16:34:54376 return WebMouseWheelEvent::kPhaseEnded;
chongzb92d7112016-07-04 22:11:54377 } else if (phase_name == "phaseCancelled") {
Blink Reformat1c4d759e2017-04-09 16:34:54378 return WebMouseWheelEvent::kPhaseCancelled;
chongzb92d7112016-07-04 22:11:54379 } else if (phase_name == "phaseMayBegin") {
Blink Reformat1c4d759e2017-04-09 16:34:54380 return WebMouseWheelEvent::kPhaseMayBegin;
chongzb92d7112016-07-04 22:11:54381 }
382
Blink Reformat1c4d759e2017-04-09 16:34:54383 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54384}
385
386WebMouseWheelEvent::Phase GetMouseWheelEventPhaseFromV8(
Dan Elphick38a508052018-07-23 22:19:53387 v8::Isolate* isolate,
chongzb92d7112016-07-04 22:11:54388 v8::Local<v8::Value> value) {
389 if (value->IsString())
Dan Elphick38a508052018-07-23 22:19:53390 return GetMouseWheelEventPhase(gin::V8ToString(isolate, value));
Blink Reformat1c4d759e2017-04-09 16:34:54391 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54392}
393
[email protected]3db130e2014-03-27 08:14:48394// Maximum distance (in space and time) for a mouse click to register as a
395// double or triple click.
Daniel Cheng224569ee2018-04-25 05:45:06396constexpr base::TimeDelta kMultipleClickTime = base::TimeDelta::FromSeconds(1);
[email protected]3db130e2014-03-27 08:14:48397const int kMultipleClickRadiusPixels = 5;
[email protected]f9634a82014-08-05 13:10:19398const char kSubMenuDepthIdentifier[] = "_";
399const char kSubMenuIdentifier[] = " >";
sanjoy.pal362c3252014-08-26 08:07:08400const char kSeparatorIdentifier[] = "---------";
sanjoy.pala62675e2014-11-27 00:47:29401const char kDisabledIdentifier[] = "#";
402const char kCheckedIdentifier[] = "*";
[email protected]3db130e2014-03-27 08:14:48403
404bool OutsideMultiClickRadius(const WebPoint& a, const WebPoint& b) {
405 return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)) >
406 kMultipleClickRadiusPixels * kMultipleClickRadiusPixels;
407}
408
[email protected]f9634a82014-08-05 13:10:19409void PopulateCustomItems(const WebVector<WebMenuItemInfo>& customItems,
dcheng59826e32017-02-22 10:31:36410 const std::string& prefix,
411 std::vector<std::string>* strings) {
[email protected]f9634a82014-08-05 13:10:19412 for (size_t i = 0; i < customItems.size(); ++i) {
sanjoy.pala62675e2014-11-27 00:47:29413 std::string prefixCopy = prefix;
414 if (!customItems[i].enabled)
dcheng59826e32017-02-22 10:31:36415 prefixCopy = kDisabledIdentifier + prefix;
sanjoy.pala62675e2014-11-27 00:47:29416 if (customItems[i].checked)
dcheng59826e32017-02-22 10:31:36417 prefixCopy = kCheckedIdentifier + prefix;
Blink Reformat1c4d759e2017-04-09 16:34:54418 if (customItems[i].type == blink::WebMenuItemInfo::kSeparator) {
sanjoy.pala62675e2014-11-27 00:47:29419 strings->push_back(prefixCopy + kSeparatorIdentifier);
Blink Reformat1c4d759e2017-04-09 16:34:54420 } else if (customItems[i].type == blink::WebMenuItemInfo::kSubMenu) {
421 strings->push_back(prefixCopy + customItems[i].label.Utf8() +
Kent Tamura08b987e2017-06-13 08:45:40422 kSubMenuIdentifier);
Blink Reformat1c4d759e2017-04-09 16:34:54423 PopulateCustomItems(customItems[i].sub_menu_items,
dcheng59826e32017-02-22 10:31:36424 prefixCopy + kSubMenuDepthIdentifier, strings);
[email protected]f9634a82014-08-05 13:10:19425 } else {
Kent Tamura08b987e2017-06-13 08:45:40426 strings->push_back(prefixCopy + customItems[i].label.Utf8());
[email protected]f9634a82014-08-05 13:10:19427 }
428 }
429}
430
[email protected]3db130e2014-03-27 08:14:48431// Because actual context menu is implemented by the browser side,
432// this function does only what LayoutTests are expecting:
433// - Many test checks the count of items. So returning non-zero value makes
434// sense.
435// - Some test compares the count before and after some action. So changing the
436// count based on flags also makes sense. This function is doing such for some
437// flags.
438// - Some test even checks actual string content. So providing it would be also
439// helpful.
440std::vector<std::string> MakeMenuItemStringsFor(
441 WebContextMenuData* context_menu,
[email protected]79ecada2014-05-04 05:16:16442 WebTestDelegate* delegate) {
[email protected]3db130e2014-03-27 08:14:48443 // These constants are based on Safari's context menu because tests are made
444 // for it.
445 static const char* kNonEditableMenuStrings[] = {
dcheng59826e32017-02-22 10:31:36446 "Back", "Reload Page", "Open in Dashbaord",
447 "<separator>", "View Source", "Save Page As",
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28448 "Print Page", "Inspect Element", nullptr};
dcheng59826e32017-02-22 10:31:36449 static const char* kEditableMenuStrings[] = {"Cut",
450 "Copy",
451 "<separator>",
452 "Paste",
453 "Spelling and Grammar",
454 "Substitutions, Transformations",
455 "Font",
456 "Speech",
457 "Paragraph Direction",
458 "<separator>",
Ivan Kotenkov2c0d2bb32017-11-01 15:41:28459 nullptr};
[email protected]3db130e2014-03-27 08:14:48460
461 // This is possible because mouse events are cancelleable.
462 if (!context_menu)
463 return std::vector<std::string>();
464
465 std::vector<std::string> strings;
466
[email protected]f9634a82014-08-05 13:10:19467 // Populate custom menu items if provided by blink.
Blink Reformat1c4d759e2017-04-09 16:34:54468 PopulateCustomItems(context_menu->custom_items, "", &strings);
[email protected]f9634a82014-08-05 13:10:19469
Blink Reformat1c4d759e2017-04-09 16:34:54470 if (context_menu->is_editable) {
[email protected]3db130e2014-03-27 08:14:48471 for (const char** item = kEditableMenuStrings; *item; ++item) {
472 strings.push_back(*item);
473 }
474 WebVector<WebString> suggestions;
Blink Reformat1c4d759e2017-04-09 16:34:54475 MockSpellCheck::FillSuggestionList(context_menu->misspelled_word,
[email protected]f656a652014-07-25 12:19:52476 &suggestions);
[email protected]3db130e2014-03-27 08:14:48477 for (size_t i = 0; i < suggestions.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:54478 strings.push_back(suggestions[i].Utf8());
[email protected]3db130e2014-03-27 08:14:48479 }
480 } else {
481 for (const char** item = kNonEditableMenuStrings; *item; ++item) {
482 strings.push_back(*item);
483 }
484 }
485
486 return strings;
487}
488
489// How much we should scroll per event - the value here is chosen to match the
490// WebKit impl and layout test results.
491const float kScrollbarPixelsPerTick = 40.0f;
492
[email protected]3db130e2014-03-27 08:14:48493// Get the edit command corresponding to a keyboard event.
494// Returns true if the specified event corresponds to an edit command, the name
495// of the edit command will be stored in |*name|.
496bool GetEditCommand(const WebKeyboardEvent& event, std::string* name) {
497#if defined(OS_MACOSX)
dcheng59826e32017-02-22 10:31:36498 // We only cares about Left,Right,Up,Down keys with Command or Command+Shift
499 // modifiers. These key events correspond to some special movement and
500 // selection editor commands. These keys will be marked as system key, which
501 // prevents them from being handled. Thus they must be handled specially.
Blink Reformat1c4d759e2017-04-09 16:34:54502 if ((event.GetModifiers() & ~WebKeyboardEvent::kShiftKey) !=
503 WebKeyboardEvent::kMetaKey)
[email protected]3db130e2014-03-27 08:14:48504 return false;
505
Blink Reformat1c4d759e2017-04-09 16:34:54506 switch (event.windows_key_code) {
[email protected]a731f1a92014-04-17 19:31:06507 case ui::VKEY_LEFT:
[email protected]3db130e2014-03-27 08:14:48508 *name = "MoveToBeginningOfLine";
509 break;
[email protected]a731f1a92014-04-17 19:31:06510 case ui::VKEY_RIGHT:
[email protected]3db130e2014-03-27 08:14:48511 *name = "MoveToEndOfLine";
512 break;
[email protected]a731f1a92014-04-17 19:31:06513 case ui::VKEY_UP:
[email protected]3db130e2014-03-27 08:14:48514 *name = "MoveToBeginningOfDocument";
515 break;
[email protected]a731f1a92014-04-17 19:31:06516 case ui::VKEY_DOWN:
[email protected]3db130e2014-03-27 08:14:48517 *name = "MoveToEndOfDocument";
518 break;
519 default:
520 return false;
521 }
522
Blink Reformat1c4d759e2017-04-09 16:34:54523 if (event.GetModifiers() & WebKeyboardEvent::kShiftKey)
[email protected]3db130e2014-03-27 08:14:48524 name->append("AndModifySelection");
525
526 return true;
527#else
528 return false;
529#endif
530}
531
[email protected]a731f1a92014-04-17 19:31:06532bool IsSystemKeyEvent(const WebKeyboardEvent& event) {
533#if defined(OS_MACOSX)
Blink Reformat1c4d759e2017-04-09 16:34:54534 return event.GetModifiers() & WebInputEvent::kMetaKey &&
535 event.windows_key_code != ui::VKEY_B &&
536 event.windows_key_code != ui::VKEY_I;
[email protected]a731f1a92014-04-17 19:31:06537#else
Blink Reformat1c4d759e2017-04-09 16:34:54538 return !!(event.GetModifiers() & WebInputEvent::kAltKey);
[email protected]a731f1a92014-04-17 19:31:06539#endif
540}
541
dtapuskab1c5ece2016-01-18 18:18:02542bool GetScrollUnits(gin::Arguments* args, WebGestureEvent::ScrollUnits* units) {
543 std::string units_string;
544 if (!args->PeekNext().IsEmpty()) {
545 if (args->PeekNext()->IsString())
546 args->GetNext(&units_string);
547 if (units_string == "Page") {
Blink Reformat1c4d759e2017-04-09 16:34:54548 *units = WebGestureEvent::kPage;
dtapuskab1c5ece2016-01-18 18:18:02549 return true;
550 } else if (units_string == "Pixels") {
Blink Reformat1c4d759e2017-04-09 16:34:54551 *units = WebGestureEvent::kPixels;
dtapuskab1c5ece2016-01-18 18:18:02552 return true;
553 } else if (units_string == "PrecisePixels") {
Blink Reformat1c4d759e2017-04-09 16:34:54554 *units = WebGestureEvent::kPrecisePixels;
dtapuskab1c5ece2016-01-18 18:18:02555 return true;
556 } else {
557 args->ThrowError();
558 return false;
559 }
560 } else {
Blink Reformat1c4d759e2017-04-09 16:34:54561 *units = WebGestureEvent::kPrecisePixels;
dtapuskab1c5ece2016-01-18 18:18:02562 return true;
563 }
564}
565
tdresser3a1c9722015-02-13 15:44:53566const char* kSourceDeviceStringTouchpad = "touchpad";
567const char* kSourceDeviceStringTouchscreen = "touchscreen";
568
[email protected]3db130e2014-03-27 08:14:48569} // namespace
570
571class EventSenderBindings : public gin::Wrappable<EventSenderBindings> {
572 public:
573 static gin::WrapperInfo kWrapperInfo;
574
575 static void Install(base::WeakPtr<EventSender> sender,
lukasza335bb762016-04-22 16:44:03576 blink::WebLocalFrame* frame);
[email protected]3db130e2014-03-27 08:14:48577
578 private:
579 explicit EventSenderBindings(base::WeakPtr<EventSender> sender);
dchenge933b3e2014-10-21 11:44:09580 ~EventSenderBindings() override;
[email protected]3db130e2014-03-27 08:14:48581
582 // gin::Wrappable:
dchenge933b3e2014-10-21 11:44:09583 gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
anand.ratn449f39a42014-10-06 13:45:57584 v8::Isolate* isolate) override;
[email protected]3db130e2014-03-27 08:14:48585
586 // Bound methods:
587 void EnableDOMUIEventLogging();
588 void FireKeyboardEventsToElement();
589 void ClearKillRing();
590 std::vector<std::string> ContextClick();
591 void TextZoomIn();
592 void TextZoomOut();
593 void ZoomPageIn();
594 void ZoomPageOut();
[email protected]d160488f2014-05-06 17:03:01595 void SetPageZoomFactor(double factor);
[email protected]3db130e2014-03-27 08:14:48596 void ClearTouchPoints();
597 void ReleaseTouchPoint(unsigned index);
e.hakkinen80033922015-07-31 08:41:35598 void UpdateTouchPoint(unsigned index,
599 double x,
600 double y,
601 gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48602 void CancelTouchPoint(unsigned index);
603 void SetTouchModifier(const std::string& key_name, bool set_mask);
[email protected]ace1cd502014-04-24 21:05:30604 void SetTouchCancelable(bool cancelable);
[email protected]3db130e2014-03-27 08:14:48605 void DumpFilenameBeingDragged();
606 void GestureFlingCancel();
tdresser3a1c9722015-02-13 15:44:53607 void GestureFlingStart(float x,
608 float y,
609 float velocity_x,
610 float velocity_y,
611 gin::Arguments* args);
W. James MacLeanb5846e52017-08-31 20:39:50612 bool IsFlinging();
Ella Ge1116059d2018-03-21 02:06:13613 void GestureScrollFirstPoint(float x, float y);
rbyers709aa1e2016-05-12 04:44:06614 void TouchStart(gin::Arguments* args);
615 void TouchMove(gin::Arguments* args);
616 void TouchCancel(gin::Arguments* args);
617 void TouchEnd(gin::Arguments* args);
mustaqb3c44a02016-04-19 18:49:05618 void NotifyStartOfTouchScroll();
[email protected]3db130e2014-03-27 08:14:48619 void LeapForward(int milliseconds);
majidvpbfabb0712015-10-02 16:30:00620 double LastEventTimestamp();
[email protected]3db130e2014-03-27 08:14:48621 void BeginDragWithFiles(const std::vector<std::string>& files);
e.hakkinen80033922015-07-31 08:41:35622 void AddTouchPoint(double x, double y, gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48623 void GestureScrollBegin(gin::Arguments* args);
624 void GestureScrollEnd(gin::Arguments* args);
625 void GestureScrollUpdate(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48626 void GestureTap(gin::Arguments* args);
627 void GestureTapDown(gin::Arguments* args);
628 void GestureShowPress(gin::Arguments* args);
629 void GestureTapCancel(gin::Arguments* args);
630 void GestureLongPress(gin::Arguments* args);
631 void GestureLongTap(gin::Arguments* args);
632 void GestureTwoFingerTap(gin::Arguments* args);
633 void ContinuousMouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48634 void MouseMoveTo(gin::Arguments* args);
lanwei0474c2a52017-05-12 18:52:01635 void MouseLeave(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48636 void MouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48637 void ScheduleAsynchronousClick(gin::Arguments* args);
638 void ScheduleAsynchronousKeyDown(gin::Arguments* args);
Mustaq Ahmedc9b974a2018-01-22 19:43:44639 void ConsumeUserActivation();
[email protected]3db130e2014-03-27 08:14:48640 void MouseDown(gin::Arguments* args);
641 void MouseUp(gin::Arguments* args);
mustaq21aed4e2015-12-15 21:47:21642 void SetMouseButtonState(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48643 void KeyDown(gin::Arguments* args);
644
645 // Binding properties:
646 bool ForceLayoutOnEvents() const;
647 void SetForceLayoutOnEvents(bool force);
648 bool IsDragMode() const;
649 void SetIsDragMode(bool drag_mode);
650
651#if defined(OS_WIN)
652 int WmKeyDown() const;
653 void SetWmKeyDown(int key_down);
654
655 int WmKeyUp() const;
656 void SetWmKeyUp(int key_up);
657
658 int WmChar() const;
659 void SetWmChar(int wm_char);
660
661 int WmDeadChar() const;
662 void SetWmDeadChar(int dead_char);
663
664 int WmSysKeyDown() const;
665 void SetWmSysKeyDown(int key_down);
666
667 int WmSysKeyUp() const;
668 void SetWmSysKeyUp(int key_up);
669
670 int WmSysChar() const;
671 void SetWmSysChar(int sys_char);
672
673 int WmSysDeadChar() const;
674 void SetWmSysDeadChar(int sys_dead_char);
675#endif
676
677 base::WeakPtr<EventSender> sender_;
678
679 DISALLOW_COPY_AND_ASSIGN(EventSenderBindings);
680};
681
682gin::WrapperInfo EventSenderBindings::kWrapperInfo = {gin::kEmbedderNativeGin};
683
684EventSenderBindings::EventSenderBindings(base::WeakPtr<EventSender> sender)
dcheng59826e32017-02-22 10:31:36685 : sender_(sender) {}
[email protected]3db130e2014-03-27 08:14:48686
687EventSenderBindings::~EventSenderBindings() {}
688
689// static
690void EventSenderBindings::Install(base::WeakPtr<EventSender> sender,
lukasza335bb762016-04-22 16:44:03691 WebLocalFrame* frame) {
Blink Reformat1c4d759e2017-04-09 16:34:54692 v8::Isolate* isolate = blink::MainThreadIsolate();
[email protected]3db130e2014-03-27 08:14:48693 v8::HandleScope handle_scope(isolate);
Blink Reformat1c4d759e2017-04-09 16:34:54694 v8::Local<v8::Context> context = frame->MainWorldScriptContext();
[email protected]3db130e2014-03-27 08:14:48695 if (context.IsEmpty())
696 return;
697
698 v8::Context::Scope context_scope(context);
699
700 gin::Handle<EventSenderBindings> bindings =
701 gin::CreateHandle(isolate, new EventSenderBindings(sender));
[email protected]ad4d2032014-04-28 13:50:59702 if (bindings.IsEmpty())
703 return;
deepak.s750d68f2015-04-30 07:32:41704 v8::Local<v8::Object> global = context->Global();
[email protected]3db130e2014-03-27 08:14:48705 global->Set(gin::StringToV8(isolate, "eventSender"), bindings.ToV8());
706}
707
dcheng59826e32017-02-22 10:31:36708gin::ObjectTemplateBuilder EventSenderBindings::GetObjectTemplateBuilder(
709 v8::Isolate* isolate) {
[email protected]3db130e2014-03-27 08:14:48710 return gin::Wrappable<EventSenderBindings>::GetObjectTemplateBuilder(isolate)
711 .SetMethod("enableDOMUIEventLogging",
712 &EventSenderBindings::EnableDOMUIEventLogging)
713 .SetMethod("fireKeyboardEventsToElement",
714 &EventSenderBindings::FireKeyboardEventsToElement)
715 .SetMethod("clearKillRing", &EventSenderBindings::ClearKillRing)
716 .SetMethod("contextClick", &EventSenderBindings::ContextClick)
717 .SetMethod("textZoomIn", &EventSenderBindings::TextZoomIn)
718 .SetMethod("textZoomOut", &EventSenderBindings::TextZoomOut)
719 .SetMethod("zoomPageIn", &EventSenderBindings::ZoomPageIn)
720 .SetMethod("zoomPageOut", &EventSenderBindings::ZoomPageOut)
[email protected]b32fe542014-04-30 08:42:06721 .SetMethod("setPageZoomFactor", &EventSenderBindings::SetPageZoomFactor)
[email protected]3db130e2014-03-27 08:14:48722 .SetMethod("clearTouchPoints", &EventSenderBindings::ClearTouchPoints)
723 .SetMethod("releaseTouchPoint", &EventSenderBindings::ReleaseTouchPoint)
724 .SetMethod("updateTouchPoint", &EventSenderBindings::UpdateTouchPoint)
725 .SetMethod("cancelTouchPoint", &EventSenderBindings::CancelTouchPoint)
726 .SetMethod("setTouchModifier", &EventSenderBindings::SetTouchModifier)
[email protected]ace1cd502014-04-24 21:05:30727 .SetMethod("setTouchCancelable", &EventSenderBindings::SetTouchCancelable)
[email protected]3db130e2014-03-27 08:14:48728 .SetMethod("dumpFilenameBeingDragged",
729 &EventSenderBindings::DumpFilenameBeingDragged)
730 .SetMethod("gestureFlingCancel", &EventSenderBindings::GestureFlingCancel)
731 .SetMethod("gestureFlingStart", &EventSenderBindings::GestureFlingStart)
tdresserd7bba522016-02-19 22:40:13732 .SetMethod("isFlinging", &EventSenderBindings::IsFlinging)
[email protected]3db130e2014-03-27 08:14:48733 .SetMethod("gestureScrollFirstPoint",
734 &EventSenderBindings::GestureScrollFirstPoint)
735 .SetMethod("touchStart", &EventSenderBindings::TouchStart)
736 .SetMethod("touchMove", &EventSenderBindings::TouchMove)
737 .SetMethod("touchCancel", &EventSenderBindings::TouchCancel)
738 .SetMethod("touchEnd", &EventSenderBindings::TouchEnd)
mustaqb3c44a02016-04-19 18:49:05739 .SetMethod("notifyStartOfTouchScroll",
740 &EventSenderBindings::NotifyStartOfTouchScroll)
[email protected]3db130e2014-03-27 08:14:48741 .SetMethod("leapForward", &EventSenderBindings::LeapForward)
majidvpbfabb0712015-10-02 16:30:00742 .SetMethod("lastEventTimestamp", &EventSenderBindings::LastEventTimestamp)
[email protected]3db130e2014-03-27 08:14:48743 .SetMethod("beginDragWithFiles", &EventSenderBindings::BeginDragWithFiles)
744 .SetMethod("addTouchPoint", &EventSenderBindings::AddTouchPoint)
[email protected]3db130e2014-03-27 08:14:48745 .SetMethod("gestureScrollBegin", &EventSenderBindings::GestureScrollBegin)
746 .SetMethod("gestureScrollEnd", &EventSenderBindings::GestureScrollEnd)
747 .SetMethod("gestureScrollUpdate",
748 &EventSenderBindings::GestureScrollUpdate)
[email protected]3db130e2014-03-27 08:14:48749 .SetMethod("gestureTap", &EventSenderBindings::GestureTap)
750 .SetMethod("gestureTapDown", &EventSenderBindings::GestureTapDown)
751 .SetMethod("gestureShowPress", &EventSenderBindings::GestureShowPress)
752 .SetMethod("gestureTapCancel", &EventSenderBindings::GestureTapCancel)
753 .SetMethod("gestureLongPress", &EventSenderBindings::GestureLongPress)
754 .SetMethod("gestureLongTap", &EventSenderBindings::GestureLongTap)
755 .SetMethod("gestureTwoFingerTap",
756 &EventSenderBindings::GestureTwoFingerTap)
757 .SetMethod("continuousMouseScrollBy",
758 &EventSenderBindings::ContinuousMouseScrollBy)
[email protected]3db130e2014-03-27 08:14:48759 .SetMethod("keyDown", &EventSenderBindings::KeyDown)
760 .SetMethod("mouseDown", &EventSenderBindings::MouseDown)
761 .SetMethod("mouseMoveTo", &EventSenderBindings::MouseMoveTo)
myid.shin12c7fea22015-03-06 02:31:24762 .SetMethod("mouseLeave", &EventSenderBindings::MouseLeave)
[email protected]3db130e2014-03-27 08:14:48763 .SetMethod("mouseScrollBy", &EventSenderBindings::MouseScrollBy)
764 .SetMethod("mouseUp", &EventSenderBindings::MouseUp)
mustaq21aed4e2015-12-15 21:47:21765 .SetMethod("setMouseButtonState",
766 &EventSenderBindings::SetMouseButtonState)
[email protected]3db130e2014-03-27 08:14:48767 .SetMethod("scheduleAsynchronousClick",
768 &EventSenderBindings::ScheduleAsynchronousClick)
769 .SetMethod("scheduleAsynchronousKeyDown",
770 &EventSenderBindings::ScheduleAsynchronousKeyDown)
Mustaq Ahmedc9b974a2018-01-22 19:43:44771 .SetMethod("consumeUserActivation",
772 &EventSenderBindings::ConsumeUserActivation)
[email protected]3db130e2014-03-27 08:14:48773 .SetProperty("forceLayoutOnEvents",
774 &EventSenderBindings::ForceLayoutOnEvents,
775 &EventSenderBindings::SetForceLayoutOnEvents)
[email protected]3db130e2014-03-27 08:14:48776#if defined(OS_WIN)
mustaq96985f722015-06-30 21:41:53777 .SetProperty("WM_KEYDOWN", &EventSenderBindings::WmKeyDown,
[email protected]3db130e2014-03-27 08:14:48778 &EventSenderBindings::SetWmKeyDown)
mustaq96985f722015-06-30 21:41:53779 .SetProperty("WM_KEYUP", &EventSenderBindings::WmKeyUp,
[email protected]3db130e2014-03-27 08:14:48780 &EventSenderBindings::SetWmKeyUp)
mustaq96985f722015-06-30 21:41:53781 .SetProperty("WM_CHAR", &EventSenderBindings::WmChar,
[email protected]3db130e2014-03-27 08:14:48782 &EventSenderBindings::SetWmChar)
mustaq96985f722015-06-30 21:41:53783 .SetProperty("WM_DEADCHAR", &EventSenderBindings::WmDeadChar,
[email protected]3db130e2014-03-27 08:14:48784 &EventSenderBindings::SetWmDeadChar)
mustaq96985f722015-06-30 21:41:53785 .SetProperty("WM_SYSKEYDOWN", &EventSenderBindings::WmSysKeyDown,
[email protected]3db130e2014-03-27 08:14:48786 &EventSenderBindings::SetWmSysKeyDown)
mustaq96985f722015-06-30 21:41:53787 .SetProperty("WM_SYSKEYUP", &EventSenderBindings::WmSysKeyUp,
[email protected]3db130e2014-03-27 08:14:48788 &EventSenderBindings::SetWmSysKeyUp)
mustaq96985f722015-06-30 21:41:53789 .SetProperty("WM_SYSCHAR", &EventSenderBindings::WmSysChar,
[email protected]3db130e2014-03-27 08:14:48790 &EventSenderBindings::SetWmSysChar)
mustaq96985f722015-06-30 21:41:53791 .SetProperty("WM_SYSDEADCHAR", &EventSenderBindings::WmSysDeadChar,
thestigfd11ffe2015-12-30 19:25:45792 &EventSenderBindings::SetWmSysDeadChar)
[email protected]3db130e2014-03-27 08:14:48793#endif
thestigfd11ffe2015-12-30 19:25:45794 .SetProperty("dragMode", &EventSenderBindings::IsDragMode,
795 &EventSenderBindings::SetIsDragMode);
[email protected]3db130e2014-03-27 08:14:48796}
797
798void EventSenderBindings::EnableDOMUIEventLogging() {
799 if (sender_)
800 sender_->EnableDOMUIEventLogging();
801}
802
803void EventSenderBindings::FireKeyboardEventsToElement() {
804 if (sender_)
805 sender_->FireKeyboardEventsToElement();
806}
807
808void EventSenderBindings::ClearKillRing() {
809 if (sender_)
810 sender_->ClearKillRing();
811}
812
813std::vector<std::string> EventSenderBindings::ContextClick() {
814 if (sender_)
815 return sender_->ContextClick();
816 return std::vector<std::string>();
817}
818
819void EventSenderBindings::TextZoomIn() {
820 if (sender_)
821 sender_->TextZoomIn();
822}
823
824void EventSenderBindings::TextZoomOut() {
825 if (sender_)
826 sender_->TextZoomOut();
827}
828
829void EventSenderBindings::ZoomPageIn() {
830 if (sender_)
831 sender_->ZoomPageIn();
832}
833
834void EventSenderBindings::ZoomPageOut() {
835 if (sender_)
836 sender_->ZoomPageOut();
837}
838
[email protected]d160488f2014-05-06 17:03:01839void EventSenderBindings::SetPageZoomFactor(double factor) {
840 if (sender_)
841 sender_->SetPageZoomFactor(factor);
[email protected]b32fe542014-04-30 08:42:06842}
843
[email protected]3db130e2014-03-27 08:14:48844void EventSenderBindings::ClearTouchPoints() {
845 if (sender_)
846 sender_->ClearTouchPoints();
847}
848
849void EventSenderBindings::ReleaseTouchPoint(unsigned index) {
850 if (sender_)
851 sender_->ReleaseTouchPoint(index);
852}
853
e.hakkinen80033922015-07-31 08:41:35854void EventSenderBindings::UpdateTouchPoint(unsigned index,
855 double x,
856 double y,
857 gin::Arguments* args) {
jochen73e711c2015-06-03 10:01:46858 if (sender_) {
859 sender_->UpdateTouchPoint(index, static_cast<float>(x),
e.hakkinen80033922015-07-31 08:41:35860 static_cast<float>(y), args);
jochen73e711c2015-06-03 10:01:46861 }
[email protected]3db130e2014-03-27 08:14:48862}
863
864void EventSenderBindings::CancelTouchPoint(unsigned index) {
865 if (sender_)
866 sender_->CancelTouchPoint(index);
867}
868
869void EventSenderBindings::SetTouchModifier(const std::string& key_name,
870 bool set_mask) {
871 if (sender_)
872 sender_->SetTouchModifier(key_name, set_mask);
873}
874
[email protected]ace1cd502014-04-24 21:05:30875void EventSenderBindings::SetTouchCancelable(bool cancelable) {
876 if (sender_)
877 sender_->SetTouchCancelable(cancelable);
878}
879
[email protected]3db130e2014-03-27 08:14:48880void EventSenderBindings::DumpFilenameBeingDragged() {
881 if (sender_)
882 sender_->DumpFilenameBeingDragged();
883}
884
885void EventSenderBindings::GestureFlingCancel() {
886 if (sender_)
887 sender_->GestureFlingCancel();
888}
889
890void EventSenderBindings::GestureFlingStart(float x,
891 float y,
892 float velocity_x,
tdresser3a1c9722015-02-13 15:44:53893 float velocity_y,
894 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48895 if (sender_)
tdresser3a1c9722015-02-13 15:44:53896 sender_->GestureFlingStart(x, y, velocity_x, velocity_y, args);
[email protected]3db130e2014-03-27 08:14:48897}
898
W. James MacLeanb5846e52017-08-31 20:39:50899bool EventSenderBindings::IsFlinging() {
tdresserd7bba522016-02-19 22:40:13900 if (sender_)
901 return sender_->IsFlinging();
902 return false;
903}
904
Ella Ge1116059d2018-03-21 02:06:13905void EventSenderBindings::GestureScrollFirstPoint(float x, float y) {
[email protected]3db130e2014-03-27 08:14:48906 if (sender_)
907 sender_->GestureScrollFirstPoint(x, y);
908}
909
rbyers709aa1e2016-05-12 04:44:06910void EventSenderBindings::TouchStart(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48911 if (sender_)
rbyers709aa1e2016-05-12 04:44:06912 sender_->TouchStart(args);
[email protected]3db130e2014-03-27 08:14:48913}
914
rbyers709aa1e2016-05-12 04:44:06915void EventSenderBindings::TouchMove(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48916 if (sender_)
rbyers709aa1e2016-05-12 04:44:06917 sender_->TouchMove(args);
[email protected]3db130e2014-03-27 08:14:48918}
919
rbyers709aa1e2016-05-12 04:44:06920void EventSenderBindings::TouchCancel(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48921 if (sender_)
rbyers709aa1e2016-05-12 04:44:06922 sender_->TouchCancel(args);
[email protected]3db130e2014-03-27 08:14:48923}
924
rbyers709aa1e2016-05-12 04:44:06925void EventSenderBindings::TouchEnd(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48926 if (sender_)
rbyers709aa1e2016-05-12 04:44:06927 sender_->TouchEnd(args);
[email protected]3db130e2014-03-27 08:14:48928}
929
mustaqb3c44a02016-04-19 18:49:05930void EventSenderBindings::NotifyStartOfTouchScroll() {
931 if (sender_)
932 sender_->NotifyStartOfTouchScroll();
933}
934
[email protected]3db130e2014-03-27 08:14:48935void EventSenderBindings::LeapForward(int milliseconds) {
936 if (sender_)
937 sender_->LeapForward(milliseconds);
938}
939
majidvpbfabb0712015-10-02 16:30:00940double EventSenderBindings::LastEventTimestamp() {
941 if (sender_)
Daniel Cheng224569ee2018-04-25 05:45:06942 return sender_->last_event_timestamp().since_origin().InSecondsF();
majidvpbfabb0712015-10-02 16:30:00943 return 0;
944}
945
[email protected]3db130e2014-03-27 08:14:48946void EventSenderBindings::BeginDragWithFiles(
947 const std::vector<std::string>& files) {
948 if (sender_)
949 sender_->BeginDragWithFiles(files);
950}
951
e.hakkinen80033922015-07-31 08:41:35952void EventSenderBindings::AddTouchPoint(double x,
953 double y,
954 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48955 if (sender_)
e.hakkinen80033922015-07-31 08:41:35956 sender_->AddTouchPoint(static_cast<float>(x), static_cast<float>(y), args);
[email protected]3db130e2014-03-27 08:14:48957}
958
[email protected]3db130e2014-03-27 08:14:48959void EventSenderBindings::GestureScrollBegin(gin::Arguments* args) {
960 if (sender_)
961 sender_->GestureScrollBegin(args);
962}
963
964void EventSenderBindings::GestureScrollEnd(gin::Arguments* args) {
965 if (sender_)
966 sender_->GestureScrollEnd(args);
967}
968
969void EventSenderBindings::GestureScrollUpdate(gin::Arguments* args) {
970 if (sender_)
971 sender_->GestureScrollUpdate(args);
972}
973
[email protected]3db130e2014-03-27 08:14:48974void EventSenderBindings::GestureTap(gin::Arguments* args) {
975 if (sender_)
976 sender_->GestureTap(args);
977}
978
979void EventSenderBindings::GestureTapDown(gin::Arguments* args) {
980 if (sender_)
981 sender_->GestureTapDown(args);
982}
983
984void EventSenderBindings::GestureShowPress(gin::Arguments* args) {
985 if (sender_)
986 sender_->GestureShowPress(args);
987}
988
989void EventSenderBindings::GestureTapCancel(gin::Arguments* args) {
990 if (sender_)
991 sender_->GestureTapCancel(args);
992}
993
994void EventSenderBindings::GestureLongPress(gin::Arguments* args) {
995 if (sender_)
996 sender_->GestureLongPress(args);
997}
998
999void EventSenderBindings::GestureLongTap(gin::Arguments* args) {
1000 if (sender_)
1001 sender_->GestureLongTap(args);
1002}
1003
1004void EventSenderBindings::GestureTwoFingerTap(gin::Arguments* args) {
1005 if (sender_)
1006 sender_->GestureTwoFingerTap(args);
1007}
1008
1009void EventSenderBindings::ContinuousMouseScrollBy(gin::Arguments* args) {
1010 if (sender_)
dtapuska43f18e9e2016-03-20 20:21:301011 sender_->MouseScrollBy(args, EventSender::MouseScrollType::PIXEL);
[email protected]3db130e2014-03-27 08:14:481012}
1013
[email protected]3db130e2014-03-27 08:14:481014void EventSenderBindings::MouseMoveTo(gin::Arguments* args) {
1015 if (sender_)
1016 sender_->MouseMoveTo(args);
1017}
1018
lanwei0474c2a52017-05-12 18:52:011019void EventSenderBindings::MouseLeave(gin::Arguments* args) {
1020 if (!sender_)
1021 return;
1022
1023 WebPointerProperties::PointerType pointerType =
1024 WebPointerProperties::PointerType::kMouse;
1025 int pointerId = kRawMousePointerId;
1026
1027 // Only allow pen or mouse through this API.
chongzd65eacf2017-06-28 05:21:591028 if (!GetPointerType(args, false, pointerType))
lanwei0474c2a52017-05-12 18:52:011029 return;
1030 if (!args->PeekNext().IsEmpty()) {
1031 if (!args->GetNext(&pointerId)) {
1032 args->ThrowError();
1033 return;
1034 }
1035 }
1036 sender_->MouseLeave(pointerType, pointerId);
myid.shin12c7fea22015-03-06 02:31:241037}
1038
[email protected]3db130e2014-03-27 08:14:481039void EventSenderBindings::MouseScrollBy(gin::Arguments* args) {
1040 if (sender_)
dtapuska43f18e9e2016-03-20 20:21:301041 sender_->MouseScrollBy(args, EventSender::MouseScrollType::TICK);
[email protected]3db130e2014-03-27 08:14:481042}
1043
[email protected]3db130e2014-03-27 08:14:481044void EventSenderBindings::ScheduleAsynchronousClick(gin::Arguments* args) {
1045 if (!sender_)
1046 return;
1047
1048 int button_number = 0;
1049 int modifiers = 0;
1050 if (!args->PeekNext().IsEmpty()) {
1051 args->GetNext(&button_number);
1052 if (!args->PeekNext().IsEmpty())
bashidbd2ef9bb2015-06-02 01:39:321053 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
[email protected]3db130e2014-03-27 08:14:481054 }
1055 sender_->ScheduleAsynchronousClick(button_number, modifiers);
1056}
1057
1058void EventSenderBindings::ScheduleAsynchronousKeyDown(gin::Arguments* args) {
1059 if (!sender_)
1060 return;
1061
1062 std::string code_str;
1063 int modifiers = 0;
1064 int location = DOMKeyLocationStandard;
1065 args->GetNext(&code_str);
1066 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:411067 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:481068 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:321069 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:481070 if (!args->PeekNext().IsEmpty())
1071 args->GetNext(&location);
1072 }
1073 sender_->ScheduleAsynchronousKeyDown(code_str, modifiers,
1074 static_cast<KeyLocationCode>(location));
1075}
1076
Mustaq Ahmedc9b974a2018-01-22 19:43:441077void EventSenderBindings::ConsumeUserActivation() {
1078 if (sender_)
1079 sender_->ConsumeUserActivation();
1080}
1081
[email protected]3db130e2014-03-27 08:14:481082void EventSenderBindings::MouseDown(gin::Arguments* args) {
1083 if (!sender_)
1084 return;
1085
1086 int button_number = 0;
1087 int modifiers = 0;
1088 if (!args->PeekNext().IsEmpty()) {
nzolghadr43146032016-04-11 15:33:381089 if (!args->GetNext(&button_number)) {
1090 args->ThrowError();
1091 return;
1092 }
1093 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:321094 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:381095 args->Skip();
1096 }
[email protected]3db130e2014-03-27 08:14:481097 }
nzolghadr43146032016-04-11 15:33:381098
mustaqabca6ff2016-06-09 17:29:531099 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:541100 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:531101 int pointerId = 0;
1102 float pressure = 0;
1103 int tiltX = 0;
1104 int tiltY = 0;
1105 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
1106 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:381107 return;
1108
mustaqabca6ff2016-06-09 17:29:531109 sender_->PointerDown(button_number, modifiers, pointerType, pointerId,
1110 pressure, tiltX, tiltY);
[email protected]3db130e2014-03-27 08:14:481111}
1112
1113void EventSenderBindings::MouseUp(gin::Arguments* args) {
1114 if (!sender_)
1115 return;
1116
1117 int button_number = 0;
1118 int modifiers = 0;
1119 if (!args->PeekNext().IsEmpty()) {
nzolghadr43146032016-04-11 15:33:381120 if (!args->GetNext(&button_number)) {
1121 args->ThrowError();
1122 return;
1123 }
1124 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:321125 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:381126 args->Skip();
1127 }
[email protected]3db130e2014-03-27 08:14:481128 }
nzolghadr43146032016-04-11 15:33:381129
mustaqabca6ff2016-06-09 17:29:531130 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:541131 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:531132 int pointerId = 0;
1133 float pressure = 0;
1134 int tiltX = 0;
1135 int tiltY = 0;
1136 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
1137 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:381138 return;
1139
mustaqabca6ff2016-06-09 17:29:531140 sender_->PointerUp(button_number, modifiers, pointerType, pointerId, pressure,
1141 tiltX, tiltY);
[email protected]3db130e2014-03-27 08:14:481142}
1143
mustaq21aed4e2015-12-15 21:47:211144void EventSenderBindings::SetMouseButtonState(gin::Arguments* args) {
1145 if (!sender_)
1146 return;
1147
1148 int button_number;
1149 if (!args->GetNext(&button_number)) {
1150 args->ThrowError();
1151 return;
1152 }
1153
thestigfd11ffe2015-12-30 19:25:451154 int modifiers = -1; // Default to the modifier implied by button_number
mustaq21aed4e2015-12-15 21:47:211155 if (!args->PeekNext().IsEmpty()) {
1156 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
1157 }
1158
1159 sender_->SetMouseButtonState(button_number, modifiers);
1160}
1161
[email protected]3db130e2014-03-27 08:14:481162void EventSenderBindings::KeyDown(gin::Arguments* args) {
1163 if (!sender_)
1164 return;
1165
1166 std::string code_str;
1167 int modifiers = 0;
1168 int location = DOMKeyLocationStandard;
1169 args->GetNext(&code_str);
1170 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:411171 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:481172 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:321173 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:481174 if (!args->PeekNext().IsEmpty())
1175 args->GetNext(&location);
1176 }
1177 sender_->KeyDown(code_str, modifiers, static_cast<KeyLocationCode>(location));
1178}
1179
1180bool EventSenderBindings::ForceLayoutOnEvents() const {
1181 if (sender_)
1182 return sender_->force_layout_on_events();
1183 return false;
1184}
1185
1186void EventSenderBindings::SetForceLayoutOnEvents(bool force) {
1187 if (sender_)
1188 sender_->set_force_layout_on_events(force);
1189}
1190
1191bool EventSenderBindings::IsDragMode() const {
1192 if (sender_)
1193 return sender_->is_drag_mode();
1194 return true;
1195}
1196
1197void EventSenderBindings::SetIsDragMode(bool drag_mode) {
1198 if (sender_)
1199 sender_->set_is_drag_mode(drag_mode);
1200}
1201
1202#if defined(OS_WIN)
1203int EventSenderBindings::WmKeyDown() const {
1204 if (sender_)
1205 return sender_->wm_key_down();
1206 return 0;
1207}
1208
1209void EventSenderBindings::SetWmKeyDown(int key_down) {
1210 if (sender_)
1211 sender_->set_wm_key_down(key_down);
1212}
1213
1214int EventSenderBindings::WmKeyUp() const {
1215 if (sender_)
1216 return sender_->wm_key_up();
1217 return 0;
1218}
1219
1220void EventSenderBindings::SetWmKeyUp(int key_up) {
1221 if (sender_)
1222 sender_->set_wm_key_up(key_up);
1223}
1224
1225int EventSenderBindings::WmChar() const {
1226 if (sender_)
1227 return sender_->wm_char();
1228 return 0;
1229}
1230
1231void EventSenderBindings::SetWmChar(int wm_char) {
1232 if (sender_)
1233 sender_->set_wm_char(wm_char);
1234}
1235
1236int EventSenderBindings::WmDeadChar() const {
1237 if (sender_)
1238 return sender_->wm_dead_char();
1239 return 0;
1240}
1241
1242void EventSenderBindings::SetWmDeadChar(int dead_char) {
1243 if (sender_)
1244 sender_->set_wm_dead_char(dead_char);
1245}
1246
1247int EventSenderBindings::WmSysKeyDown() const {
1248 if (sender_)
1249 return sender_->wm_sys_key_down();
1250 return 0;
1251}
1252
1253void EventSenderBindings::SetWmSysKeyDown(int key_down) {
1254 if (sender_)
1255 sender_->set_wm_sys_key_down(key_down);
1256}
1257
1258int EventSenderBindings::WmSysKeyUp() const {
1259 if (sender_)
1260 return sender_->wm_sys_key_up();
1261 return 0;
1262}
1263
1264void EventSenderBindings::SetWmSysKeyUp(int key_up) {
1265 if (sender_)
1266 sender_->set_wm_sys_key_up(key_up);
1267}
1268
1269int EventSenderBindings::WmSysChar() const {
1270 if (sender_)
1271 return sender_->wm_sys_char();
1272 return 0;
1273}
1274
1275void EventSenderBindings::SetWmSysChar(int sys_char) {
1276 if (sender_)
1277 sender_->set_wm_sys_char(sys_char);
1278}
1279
1280int EventSenderBindings::WmSysDeadChar() const {
1281 if (sender_)
1282 return sender_->wm_sys_dead_char();
1283 return 0;
1284}
1285
1286void EventSenderBindings::SetWmSysDeadChar(int sys_dead_char) {
1287 if (sender_)
1288 sender_->set_wm_sys_dead_char(sys_dead_char);
1289}
1290#endif
1291
1292// EventSender -----------------------------------------------------------------
1293
[email protected]3db130e2014-03-27 08:14:481294WebMouseEvent::Button EventSender::last_button_type_ =
Blink Reformat1c4d759e2017-04-09 16:34:541295 WebMouseEvent::Button::kNoButton;
[email protected]3db130e2014-03-27 08:14:481296
1297EventSender::SavedEvent::SavedEvent()
1298 : type(TYPE_UNSPECIFIED),
Blink Reformat1c4d759e2017-04-09 16:34:541299 button_type(WebMouseEvent::Button::kNoButton),
[email protected]3db130e2014-03-27 08:14:481300 milliseconds(0),
1301 modifiers(0) {}
1302
lukaszad322c5ca2016-10-07 00:32:341303EventSender::EventSender(WebWidgetTestProxyBase* web_widget_test_proxy_base)
1304 : web_widget_test_proxy_base_(web_widget_test_proxy_base),
[email protected]3db130e2014-03-27 08:14:481305 replaying_saved_events_(false),
sammc5648c852015-07-02 01:25:001306 weak_factory_(this) {
lukasza335bb762016-04-22 16:44:031307 Reset();
sammc5648c852015-07-02 01:25:001308}
[email protected]3db130e2014-03-27 08:14:481309
1310EventSender::~EventSender() {}
1311
1312void EventSender::Reset() {
Blink Reformat1c4d759e2017-04-09 16:34:541313 DCHECK(current_drag_data_.IsNull());
1314 current_drag_data_.Reset();
1315 current_drag_effect_ = blink::kWebDragOperationNone;
1316 current_drag_effects_allowed_ = blink::kWebDragOperationNone;
1317 if (widget() && current_pointer_state_[kRawMousePointerId].pressed_button_ !=
1318 WebMouseEvent::Button::kNoButton)
1319 widget()->MouseCaptureLost();
nzolghadr43146032016-04-11 15:33:381320 current_pointer_state_.clear();
[email protected]3db130e2014-03-27 08:14:481321 is_drag_mode_ = true;
1322 force_layout_on_events_ = true;
1323
1324#if defined(OS_WIN)
1325 wm_key_down_ = WM_KEYDOWN;
1326 wm_key_up_ = WM_KEYUP;
1327 wm_char_ = WM_CHAR;
1328 wm_dead_char_ = WM_DEADCHAR;
1329 wm_sys_key_down_ = WM_SYSKEYDOWN;
1330 wm_sys_key_up_ = WM_SYSKEYUP;
1331 wm_sys_char_ = WM_SYSCHAR;
1332 wm_sys_dead_char_ = WM_SYSDEADCHAR;
1333#endif
1334
Daniel Cheng224569ee2018-04-25 05:45:061335 last_click_time_ = base::TimeTicks();
[email protected]3db130e2014-03-27 08:14:481336 last_click_pos_ = WebPoint(0, 0);
Blink Reformat1c4d759e2017-04-09 16:34:541337 last_button_type_ = WebMouseEvent::Button::kNoButton;
[email protected]3db130e2014-03-27 08:14:481338 touch_points_.clear();
[email protected]644616d2014-03-27 16:14:471339 last_context_menu_data_.reset();
lukaszac9358822016-04-07 14:43:461340 weak_factory_.InvalidateWeakPtrs();
Ella Ge1116059d2018-03-21 02:06:131341 current_gesture_location_ = WebFloatPoint(0, 0);
[email protected]3db130e2014-03-27 08:14:481342 mouse_event_queue_.clear();
1343
Daniel Cheng224569ee2018-04-25 05:45:061344 time_offset_ = base::TimeDelta();
[email protected]3db130e2014-03-27 08:14:481345 click_count_ = 0;
[email protected]ace1cd502014-04-24 21:05:301346
1347 touch_modifiers_ = 0;
1348 touch_cancelable_ = true;
1349 touch_points_.clear();
[email protected]3db130e2014-03-27 08:14:481350}
1351
lukasza335bb762016-04-22 16:44:031352void EventSender::Install(WebLocalFrame* frame) {
[email protected]3db130e2014-03-27 08:14:481353 EventSenderBindings::Install(weak_factory_.GetWeakPtr(), frame);
1354}
1355
[email protected]3db130e2014-03-27 08:14:481356void EventSender::SetContextMenuData(const WebContextMenuData& data) {
1357 last_context_menu_data_.reset(new WebContextMenuData(data));
1358}
1359
dtapuska899ac222017-01-03 18:09:161360int EventSender::ModifiersForPointer(int pointer_id) {
1361 return modifiersWithButtons(
1362 current_pointer_state_[pointer_id].modifiers_,
1363 current_pointer_state_[pointer_id].current_buttons_);
1364}
1365
[email protected]3db130e2014-03-27 08:14:481366void EventSender::DoDragDrop(const WebDragData& drag_data,
dcheng59826e32017-02-22 10:31:361367 WebDragOperationsMask mask) {
Blink Reformat1c4d759e2017-04-09 16:34:541368 WebMouseEvent raw_event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161369 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:061370 GetCurrentEventTime());
dtapuska899ac222017-01-03 18:09:161371 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531372 current_pointer_state_[kRawMousePointerId].current_buttons_,
1373 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161374 click_count_, &raw_event);
oshima76b6eeb2016-06-27 15:55:121375
lukaszad322c5ca2016-10-07 00:32:341376 std::unique_ptr<WebInputEvent> widget_event =
1377 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:121378 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:341379 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
1380 : &raw_event;
oshima76b6eeb2016-06-27 15:55:121381
[email protected]3db130e2014-03-27 08:14:481382 current_drag_data_ = drag_data;
1383 current_drag_effects_allowed_ = mask;
Blink Reformat1c4d759e2017-04-09 16:34:541384 current_drag_effect_ = mainFrameWidget()->DragTargetDragEnter(
Ella Ge80a52dce2017-11-15 18:01:521385 drag_data, event->PositionInWidget(), event->PositionInScreen(),
1386 current_drag_effects_allowed_,
nzolghadr43146032016-04-11 15:33:381387 modifiersWithButtons(
mustaqabca6ff2016-06-09 17:29:531388 current_pointer_state_[kRawMousePointerId].modifiers_,
1389 current_pointer_state_[kRawMousePointerId].current_buttons_));
[email protected]3db130e2014-03-27 08:14:481390
1391 // Finish processing events.
1392 ReplaySavedEvents();
1393}
1394
1395void EventSender::MouseDown(int button_number, int modifiers) {
nzolghadr43146032016-04-11 15:33:381396 PointerDown(button_number, modifiers,
Blink Reformat1c4d759e2017-04-09 16:34:541397 WebPointerProperties::PointerType::kMouse, kRawMousePointerId,
1398 0.0, 0, 0);
[email protected]3db130e2014-03-27 08:14:481399}
1400
1401void EventSender::MouseUp(int button_number, int modifiers) {
Blink Reformat1c4d759e2017-04-09 16:34:541402 PointerUp(button_number, modifiers, WebPointerProperties::PointerType::kMouse,
mustaqabca6ff2016-06-09 17:29:531403 kRawMousePointerId, 0.0, 0, 0);
nzolghadr43146032016-04-11 15:33:381404}
1405
mustaqabca6ff2016-06-09 17:29:531406void EventSender::PointerDown(int button_number,
1407 int modifiers,
1408 WebPointerProperties::PointerType pointerType,
1409 int pointerId,
1410 float pressure,
1411 int tiltX,
1412 int tiltY) {
[email protected]3db130e2014-03-27 08:14:481413 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:531414 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:481415
1416 DCHECK_NE(-1, button_number);
1417
1418 WebMouseEvent::Button button_type =
1419 GetButtonTypeFromButtonNumber(button_number);
1420
nzolghadr43146032016-04-11 15:33:381421 int click_count = 0;
1422 current_pointer_state_[pointerId].pressed_button_ = button_type;
1423 current_pointer_state_[pointerId].current_buttons_ |=
1424 GetWebMouseEventModifierForButton(button_type);
1425 current_pointer_state_[pointerId].modifiers_ = modifiers;
1426
Blink Reformat1c4d759e2017-04-09 16:34:541427 if (pointerType == WebPointerProperties::PointerType::kMouse) {
nzolghadr43146032016-04-11 15:33:381428 UpdateClickCountForButton(button_type);
1429 click_count = click_count_;
1430 }
Blink Reformat1c4d759e2017-04-09 16:34:541431 WebMouseEvent event(WebInputEvent::kMouseDown, ModifiersForPointer(pointerId),
Daniel Cheng224569ee2018-04-25 05:45:061432 GetCurrentEventTime());
dtapuska899ac222017-01-03 18:09:161433 InitMouseEventGeneric(current_pointer_state_[pointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531434 current_pointer_state_[pointerId].current_buttons_,
1435 current_pointer_state_[pointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161436 click_count, pointerType, pointerId, pressure, tiltX,
1437 tiltY, &event);
nzolghadr43146032016-04-11 15:33:381438
1439 HandleInputEventOnViewOrPopup(event);
1440}
1441
mustaqabca6ff2016-06-09 17:29:531442void EventSender::PointerUp(int button_number,
1443 int modifiers,
1444 WebPointerProperties::PointerType pointerType,
1445 int pointerId,
1446 float pressure,
1447 int tiltX,
1448 int tiltY) {
nzolghadr43146032016-04-11 15:33:381449 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:531450 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
nzolghadr43146032016-04-11 15:33:381451
1452 DCHECK_NE(-1, button_number);
1453
1454 WebMouseEvent::Button button_type =
1455 GetButtonTypeFromButtonNumber(button_number);
1456
Blink Reformat1c4d759e2017-04-09 16:34:541457 if (pointerType == WebPointerProperties::PointerType::kMouse &&
nzolghadr43146032016-04-11 15:33:381458 is_drag_mode_ && !replaying_saved_events_) {
[email protected]3db130e2014-03-27 08:14:481459 SavedEvent saved_event;
1460 saved_event.type = SavedEvent::TYPE_MOUSE_UP;
1461 saved_event.button_type = button_type;
1462 saved_event.modifiers = modifiers;
1463 mouse_event_queue_.push_back(saved_event);
1464 ReplaySavedEvents();
1465 } else {
dtapuska899ac222017-01-03 18:09:161466 current_pointer_state_[pointerId].modifiers_ = modifiers;
nzolghadr43146032016-04-11 15:33:381467 current_pointer_state_[pointerId].current_buttons_ &=
1468 ~GetWebMouseEventModifierForButton(button_type);
1469 current_pointer_state_[pointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541470 WebMouseEvent::Button::kNoButton;
mustaq21aed4e2015-12-15 21:47:211471
Blink Reformat1c4d759e2017-04-09 16:34:541472 WebMouseEvent event(WebInputEvent::kMouseUp, ModifiersForPointer(pointerId),
Daniel Cheng224569ee2018-04-25 05:45:061473 GetCurrentEventTime());
Blink Reformat1c4d759e2017-04-09 16:34:541474 int click_count = pointerType == WebPointerProperties::PointerType::kMouse
mustaqabca6ff2016-06-09 17:29:531475 ? click_count_
1476 : 0;
dtapuska899ac222017-01-03 18:09:161477 InitMouseEventGeneric(
1478 button_type, current_pointer_state_[pointerId].current_buttons_,
1479 current_pointer_state_[pointerId].last_pos_, click_count, pointerType,
1480 pointerId, pressure, tiltX, tiltY, &event);
nzolghadr43146032016-04-11 15:33:381481 HandleInputEventOnViewOrPopup(event);
Blink Reformat1c4d759e2017-04-09 16:34:541482 if (pointerType == WebPointerProperties::PointerType::kMouse)
nzolghadr43146032016-04-11 15:33:381483 DoDragAfterMouseUp(event);
[email protected]3db130e2014-03-27 08:14:481484 }
1485}
1486
mustaq21aed4e2015-12-15 21:47:211487void EventSender::SetMouseButtonState(int button_number, int modifiers) {
mustaqabca6ff2016-06-09 17:29:531488 current_pointer_state_[kRawMousePointerId].pressed_button_ =
nzolghadr43146032016-04-11 15:33:381489 GetButtonTypeFromButtonNumber(button_number);
mustaqabca6ff2016-06-09 17:29:531490 current_pointer_state_[kRawMousePointerId].current_buttons_ =
nzolghadr43146032016-04-11 15:33:381491 (modifiers == -1)
1492 ? GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:531493 current_pointer_state_[kRawMousePointerId].pressed_button_)
nzolghadr43146032016-04-11 15:33:381494 : modifiers & kButtonsInModifiers;
mustaq21aed4e2015-12-15 21:47:211495}
1496
[email protected]3db130e2014-03-27 08:14:481497void EventSender::KeyDown(const std::string& code_str,
1498 int modifiers,
1499 KeyLocationCode location) {
1500 // FIXME: I'm not exactly sure how we should convert the string to a key
1501 // event. This seems to work in the cases I tested.
1502 // FIXME: Should we also generate a KEY_UP?
1503
1504 bool generate_char = false;
1505
1506 // Convert \n -> VK_RETURN. Some layout tests use \n to mean "Enter", when
1507 // Windows uses \r for "Enter".
1508 int code = 0;
1509 int text = 0;
1510 bool needs_shift_key_modifier = false;
chongz40aff932016-05-04 14:30:121511 std::string domKeyString;
1512 std::string domCodeString;
[email protected]3db130e2014-03-27 08:14:481513
dtapuska0d1f4af2016-06-29 16:42:221514 if ("Enter" == code_str) {
[email protected]3db130e2014-03-27 08:14:481515 generate_char = true;
[email protected]a731f1a92014-04-17 19:31:061516 text = code = ui::VKEY_RETURN;
chongz40aff932016-05-04 14:30:121517 domKeyString.assign("Enter");
1518 domCodeString.assign("Enter");
dtapuska0d1f4af2016-06-29 16:42:221519 } else if ("ArrowRight" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061520 code = ui::VKEY_RIGHT;
chongz40aff932016-05-04 14:30:121521 domKeyString.assign("ArrowRight");
1522 domCodeString.assign("ArrowRight");
dtapuska0d1f4af2016-06-29 16:42:221523 } else if ("ArrowDown" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061524 code = ui::VKEY_DOWN;
chongz40aff932016-05-04 14:30:121525 domKeyString.assign("ArrowDown");
1526 domCodeString.assign("ArrowDown");
dtapuska0d1f4af2016-06-29 16:42:221527 } else if ("ArrowLeft" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061528 code = ui::VKEY_LEFT;
chongz40aff932016-05-04 14:30:121529 domKeyString.assign("ArrowLeft");
1530 domCodeString.assign("ArrowLeft");
dtapuska0d1f4af2016-06-29 16:42:221531 } else if ("ArrowUp" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061532 code = ui::VKEY_UP;
chongz40aff932016-05-04 14:30:121533 domKeyString.assign("ArrowUp");
1534 domCodeString.assign("ArrowUp");
dtapuska0d1f4af2016-06-29 16:42:221535 } else if ("Insert" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061536 code = ui::VKEY_INSERT;
chongz40aff932016-05-04 14:30:121537 domKeyString.assign("Insert");
1538 domCodeString.assign("Insert");
dtapuska0d1f4af2016-06-29 16:42:221539 } else if ("Delete" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061540 code = ui::VKEY_DELETE;
chongz40aff932016-05-04 14:30:121541 domKeyString.assign("Delete");
1542 domCodeString.assign("Delete");
dtapuska0d1f4af2016-06-29 16:42:221543 } else if ("PageUp" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061544 code = ui::VKEY_PRIOR;
chongz40aff932016-05-04 14:30:121545 domKeyString.assign("PageUp");
1546 domCodeString.assign("PageUp");
dtapuska0d1f4af2016-06-29 16:42:221547 } else if ("PageDown" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061548 code = ui::VKEY_NEXT;
chongz40aff932016-05-04 14:30:121549 domKeyString.assign("PageDown");
1550 domCodeString.assign("PageDown");
dtapuska0d1f4af2016-06-29 16:42:221551 } else if ("Home" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061552 code = ui::VKEY_HOME;
chongz40aff932016-05-04 14:30:121553 domKeyString.assign("Home");
1554 domCodeString.assign("Home");
dtapuska0d1f4af2016-06-29 16:42:221555 } else if ("End" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061556 code = ui::VKEY_END;
chongz40aff932016-05-04 14:30:121557 domKeyString.assign("End");
1558 domCodeString.assign("End");
dtapuska0d1f4af2016-06-29 16:42:221559 } else if ("PrintScreen" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061560 code = ui::VKEY_SNAPSHOT;
chongz40aff932016-05-04 14:30:121561 domKeyString.assign("PrintScreen");
1562 domCodeString.assign("PrintScreen");
dtapuska0d1f4af2016-06-29 16:42:221563 } else if ("ContextMenu" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061564 code = ui::VKEY_APPS;
chongz40aff932016-05-04 14:30:121565 domKeyString.assign("ContextMenu");
1566 domCodeString.assign("ContextMenu");
dtapuska0d1f4af2016-06-29 16:42:221567 } else if ("ControlLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051568 code = ui::VKEY_CONTROL;
chongz40aff932016-05-04 14:30:121569 domKeyString.assign("Control");
1570 domCodeString.assign("ControlLeft");
dtapuskad3ba0f042015-08-27 14:08:051571 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221572 } else if ("ControlRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051573 code = ui::VKEY_CONTROL;
chongz40aff932016-05-04 14:30:121574 domKeyString.assign("Control");
1575 domCodeString.assign("ControlRight");
dtapuskad3ba0f042015-08-27 14:08:051576 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221577 } else if ("ShiftLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051578 code = ui::VKEY_SHIFT;
chongz40aff932016-05-04 14:30:121579 domKeyString.assign("Shift");
1580 domCodeString.assign("ShiftLeft");
dtapuskad3ba0f042015-08-27 14:08:051581 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221582 } else if ("ShiftRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051583 code = ui::VKEY_SHIFT;
chongz40aff932016-05-04 14:30:121584 domKeyString.assign("Shift");
1585 domCodeString.assign("ShiftRight");
dtapuskad3ba0f042015-08-27 14:08:051586 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221587 } else if ("AltLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051588 code = ui::VKEY_MENU;
chongz40aff932016-05-04 14:30:121589 domKeyString.assign("Alt");
1590 domCodeString.assign("AltLeft");
dtapuskad3ba0f042015-08-27 14:08:051591 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221592 } else if ("AltRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051593 code = ui::VKEY_MENU;
chongz40aff932016-05-04 14:30:121594 domKeyString.assign("Alt");
1595 domCodeString.assign("AltRight");
dtapuskad3ba0f042015-08-27 14:08:051596 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221597 } else if ("NumLock" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061598 code = ui::VKEY_NUMLOCK;
chongz40aff932016-05-04 14:30:121599 domKeyString.assign("NumLock");
1600 domCodeString.assign("NumLock");
dtapuska0d1f4af2016-06-29 16:42:221601 } else if ("Backspace" == code_str) {
[email protected]4c07a712014-08-21 17:05:541602 code = ui::VKEY_BACK;
chongz40aff932016-05-04 14:30:121603 domKeyString.assign("Backspace");
1604 domCodeString.assign("Backspace");
dtapuska0d1f4af2016-06-29 16:42:221605 } else if ("Escape" == code_str) {
[email protected]4c07a712014-08-21 17:05:541606 code = ui::VKEY_ESCAPE;
chongz40aff932016-05-04 14:30:121607 domKeyString.assign("Escape");
1608 domCodeString.assign("Escape");
dtapuska8f3b1e52016-06-21 16:34:071609 } else if ("Tab" == code_str) {
1610 code = ui::VKEY_TAB;
1611 domKeyString.assign("Tab");
1612 domCodeString.assign("Tab");
chongz78364d672016-08-03 00:13:431613 } else if ("Cut" == code_str || "Copy" == code_str || "Paste" == code_str) {
1614 // No valid KeyboardCode for Cut/Copy/Paste.
1615 code = 0;
1616 domKeyString.assign(code_str);
1617 // It's OK to assign the same string as the DomCode strings happens to be
1618 // the same for these keys.
1619 domCodeString.assign(code_str);
[email protected]3db130e2014-03-27 08:14:481620 } else {
1621 // Compare the input string with the function-key names defined by the
1622 // DOM spec (i.e. "F1",...,"F24"). If the input string is a function-key
1623 // name, set its key code.
1624 for (int i = 1; i <= 24; ++i) {
1625 std::string function_key_name = base::StringPrintf("F%d", i);
1626 if (function_key_name == code_str) {
[email protected]a731f1a92014-04-17 19:31:061627 code = ui::VKEY_F1 + (i - 1);
chongz40aff932016-05-04 14:30:121628 domKeyString = function_key_name;
1629 domCodeString = function_key_name;
[email protected]3db130e2014-03-27 08:14:481630 break;
1631 }
1632 }
1633 if (!code) {
esprehnd29ab802015-12-11 13:01:191634 base::string16 code_str16 = base::UTF8ToUTF16(code_str);
1635 if (code_str16.size() != 1u) {
Blink Reformat1c4d759e2017-04-09 16:34:541636 v8::Isolate* isolate = blink::MainThreadIsolate();
dtapuskabd2a1652015-05-20 00:30:151637 isolate->ThrowException(v8::Exception::TypeError(
1638 gin::StringToV8(isolate, "Invalid web code.")));
1639 return;
1640 }
esprehnd29ab802015-12-11 13:01:191641 text = code = code_str16[0];
zhongyi23960342016-04-12 23:13:201642 needs_shift_key_modifier = base::IsAsciiUpper(code & 0xFF);
1643 if (base::IsAsciiLower(code & 0xFF))
[email protected]3db130e2014-03-27 08:14:481644 code -= 'a' - 'A';
zhongyi23960342016-04-12 23:13:201645 if (base::IsAsciiAlpha(code)) {
chongz40aff932016-05-04 14:30:121646 domKeyString.assign(code_str);
1647 domCodeString.assign("Key");
1648 domCodeString.push_back(
brettwc15100c2015-08-06 22:54:161649 base::ToUpperASCII(static_cast<base::char16>(code)));
zhongyi23960342016-04-12 23:13:201650 } else if (base::IsAsciiDigit(code)) {
chongz40aff932016-05-04 14:30:121651 domKeyString.assign(code_str);
1652 domCodeString.assign("Digit");
1653 domCodeString.push_back(code);
habib.virji565c80c2015-02-06 12:26:431654 } else if (code == ' ') {
chongz40aff932016-05-04 14:30:121655 domKeyString.assign(code_str);
1656 domCodeString.assign("Space");
habib.virji565c80c2015-02-06 12:26:431657 } else if (code == 9) {
chongz40aff932016-05-04 14:30:121658 domKeyString.assign("Tab");
1659 domCodeString.assign("Tab");
habib.virji565c80c2015-02-06 12:26:431660 }
[email protected]3db130e2014-03-27 08:14:481661 generate_char = true;
1662 }
1663
1664 if ("(" == code_str) {
1665 code = '9';
1666 needs_shift_key_modifier = true;
chongz40aff932016-05-04 14:30:121667 domKeyString.assign("(");
1668 domCodeString.assign("Digit9");
[email protected]3db130e2014-03-27 08:14:481669 }
1670 }
1671
dtapuska899ac222017-01-03 18:09:161672 if (needs_shift_key_modifier)
Blink Reformat1c4d759e2017-04-09 16:34:541673 modifiers |= WebInputEvent::kShiftKey;
dtapuska899ac222017-01-03 18:09:161674
1675 // See if KeyLocation argument is given.
1676 switch (location) {
1677 case DOMKeyLocationStandard:
1678 break;
1679 case DOMKeyLocationLeft:
Blink Reformat1c4d759e2017-04-09 16:34:541680 modifiers |= WebInputEvent::kIsLeft;
dtapuska899ac222017-01-03 18:09:161681 break;
1682 case DOMKeyLocationRight:
Blink Reformat1c4d759e2017-04-09 16:34:541683 modifiers |= WebInputEvent::kIsRight;
dtapuska899ac222017-01-03 18:09:161684 break;
1685 case DOMKeyLocationNumpad:
Blink Reformat1c4d759e2017-04-09 16:34:541686 modifiers |= WebInputEvent::kIsKeyPad;
dtapuska899ac222017-01-03 18:09:161687 break;
1688 }
1689
[email protected]3db130e2014-03-27 08:14:481690 // For one generated keyboard event, we need to generate a keyDown/keyUp
1691 // pair;
1692 // On Windows, we might also need to generate a char event to mimic the
1693 // Windows event flow; on other platforms we create a merged event and test
1694 // the event flow that that platform provides.
Blink Reformat1c4d759e2017-04-09 16:34:541695 WebKeyboardEvent event_down(WebInputEvent::kRawKeyDown, modifiers,
Daniel Cheng224569ee2018-04-25 05:45:061696 GetCurrentEventTime());
Blink Reformat1c4d759e2017-04-09 16:34:541697 event_down.windows_key_code = code;
1698 event_down.dom_key =
dcheng59826e32017-02-22 10:31:361699 static_cast<int>(ui::KeycodeConverter::KeyStringToDomKey(domKeyString));
Blink Reformat1c4d759e2017-04-09 16:34:541700 event_down.dom_code = static_cast<int>(
chongz40aff932016-05-04 14:30:121701 ui::KeycodeConverter::CodeStringToDomCode(domCodeString));
[email protected]3db130e2014-03-27 08:14:481702
[email protected]3db130e2014-03-27 08:14:481703 if (generate_char) {
1704 event_down.text[0] = text;
Blink Reformat1c4d759e2017-04-09 16:34:541705 event_down.unmodified_text[0] = text;
[email protected]3db130e2014-03-27 08:14:481706 }
1707
Blink Reformat1c4d759e2017-04-09 16:34:541708 if (event_down.GetModifiers() != 0)
1709 event_down.is_system_key = IsSystemKeyEvent(event_down);
[email protected]3db130e2014-03-27 08:14:481710
dtapuska899ac222017-01-03 18:09:161711 WebKeyboardEvent event_up = event_down;
Blink Reformat1c4d759e2017-04-09 16:34:541712 event_up.SetType(WebInputEvent::kKeyUp);
[email protected]3db130e2014-03-27 08:14:481713 // EventSender.m forces a layout here, with at least one
1714 // test (fast/forms/focus-control-to-page.html) relying on this.
1715 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:531716 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:481717
1718 // In the browser, if a keyboard event corresponds to an editor command,
1719 // the command will be dispatched to the renderer just before dispatching
1720 // the keyboard event, and then it will be executed in the
1721 // RenderView::handleCurrentKeyboardEvent() method.
1722 // We just simulate the same behavior here.
1723 std::string edit_command;
1724 if (GetEditCommand(event_down, &edit_command))
lukasza335bb762016-04-22 16:44:031725 delegate()->SetEditCommand(edit_command, "");
[email protected]3db130e2014-03-27 08:14:481726
tkent588765612014-11-28 01:07:481727 HandleInputEventOnViewOrPopup(event_down);
[email protected]3db130e2014-03-27 08:14:481728
Blink Reformat1c4d759e2017-04-09 16:34:541729 if (code == ui::VKEY_ESCAPE && !current_drag_data_.IsNull()) {
1730 WebMouseEvent event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161731 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:061732 GetCurrentEventTime());
dtapuska899ac222017-01-03 18:09:161733 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531734 current_pointer_state_[kRawMousePointerId].current_buttons_,
1735 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161736 click_count_, &event);
Blink Reformat1c4d759e2017-04-09 16:34:541737 FinishDragAndDrop(event, blink::kWebDragOperationNone);
[email protected]3db130e2014-03-27 08:14:481738 }
1739
lukasza335bb762016-04-22 16:44:031740 delegate()->ClearEditCommand();
[email protected]3db130e2014-03-27 08:14:481741
1742 if (generate_char) {
1743 WebKeyboardEvent event_char = event_up;
Blink Reformat1c4d759e2017-04-09 16:34:541744 event_char.SetType(WebInputEvent::kChar);
tkent588765612014-11-28 01:07:481745 HandleInputEventOnViewOrPopup(event_char);
[email protected]3db130e2014-03-27 08:14:481746 }
1747
tkent588765612014-11-28 01:07:481748 HandleInputEventOnViewOrPopup(event_up);
[email protected]3db130e2014-03-27 08:14:481749}
1750
1751void EventSender::EnableDOMUIEventLogging() {}
1752
1753void EventSender::FireKeyboardEventsToElement() {}
1754
1755void EventSender::ClearKillRing() {}
1756
1757std::vector<std::string> EventSender::ContextClick() {
lukaszad322c5ca2016-10-07 00:32:341758 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:531759 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:481760
Blink Reformat1c4d759e2017-04-09 16:34:541761 UpdateClickCountForButton(WebMouseEvent::Button::kRight);
[email protected]3db130e2014-03-27 08:14:481762
1763 // Clears last context menu data because we need to know if the context menu
1764 // be requested after following mouse events.
1765 last_context_menu_data_.reset();
1766
1767 // Generate right mouse down and up.
[email protected]3db130e2014-03-27 08:14:481768 // This is a hack to work around only allowing a single pressed button since
1769 // we want to test the case where both the left and right mouse buttons are
1770 // pressed.
mustaq21aed4e2015-12-15 21:47:211771 // TODO(mustaq): This hack seems unused here! But do we need this hack at all
1772 // after adding current_buttons_.
mustaqabca6ff2016-06-09 17:29:531773 if (current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:541774 WebMouseEvent::Button::kNoButton) {
mustaqabca6ff2016-06-09 17:29:531775 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541776 WebMouseEvent::Button::kRight;
mustaqabca6ff2016-06-09 17:29:531777 current_pointer_state_[kRawMousePointerId].current_buttons_ |=
nzolghadr43146032016-04-11 15:33:381778 GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:531779 current_pointer_state_[kRawMousePointerId].pressed_button_);
[email protected]3db130e2014-03-27 08:14:481780 }
Blink Reformat1c4d759e2017-04-09 16:34:541781 WebMouseEvent event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161782 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:061783 GetCurrentEventTime());
Blink Reformat1c4d759e2017-04-09 16:34:541784 InitMouseEvent(WebMouseEvent::Button::kRight,
mustaqabca6ff2016-06-09 17:29:531785 current_pointer_state_[kRawMousePointerId].current_buttons_,
1786 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161787 click_count_, &event);
tkent588765612014-11-28 01:07:481788 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481789
1790#if defined(OS_WIN)
mustaqabca6ff2016-06-09 17:29:531791 current_pointer_state_[kRawMousePointerId].current_buttons_ &=
Blink Reformat1c4d759e2017-04-09 16:34:541792 ~GetWebMouseEventModifierForButton(WebMouseEvent::Button::kRight);
mustaqabca6ff2016-06-09 17:29:531793 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541794 WebMouseEvent::Button::kNoButton;
mustaq21aed4e2015-12-15 21:47:211795
Blink Reformat1c4d759e2017-04-09 16:34:541796 WebMouseEvent mouseUpEvent(WebInputEvent::kMouseUp,
dtapuska899ac222017-01-03 18:09:161797 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:061798 GetCurrentEventTime());
Blink Reformat1c4d759e2017-04-09 16:34:541799 InitMouseEvent(WebMouseEvent::Button::kRight,
mustaqabca6ff2016-06-09 17:29:531800 current_pointer_state_[kRawMousePointerId].current_buttons_,
1801 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161802 click_count_, &mouseUpEvent);
1803 HandleInputEventOnViewOrPopup(mouseUpEvent);
[email protected]3db130e2014-03-27 08:14:481804#endif
1805
jochen73e711c2015-06-03 10:01:461806 std::vector<std::string> menu_items =
lukasza335bb762016-04-22 16:44:031807 MakeMenuItemStringsFor(last_context_menu_data_.get(), delegate());
[email protected]e7c71192014-04-23 11:53:481808 last_context_menu_data_.reset();
1809 return menu_items;
[email protected]3db130e2014-03-27 08:14:481810}
1811
1812void EventSender::TextZoomIn() {
Blink Reformat1c4d759e2017-04-09 16:34:541813 view()->SetTextZoomFactor(view()->TextZoomFactor() * 1.2f);
[email protected]3db130e2014-03-27 08:14:481814}
1815
1816void EventSender::TextZoomOut() {
Blink Reformat1c4d759e2017-04-09 16:34:541817 view()->SetTextZoomFactor(view()->TextZoomFactor() / 1.2f);
[email protected]3db130e2014-03-27 08:14:481818}
1819
1820void EventSender::ZoomPageIn() {
lfg05e41372016-07-22 15:38:101821 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031822 interfaces()->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481823
1824 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541825 window_list.at(i)->web_view()->SetZoomLevel(
1826 window_list.at(i)->web_view()->ZoomLevel() + 1);
[email protected]3db130e2014-03-27 08:14:481827 }
1828}
1829
1830void EventSender::ZoomPageOut() {
lfg05e41372016-07-22 15:38:101831 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031832 interfaces()->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481833
1834 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541835 window_list.at(i)->web_view()->SetZoomLevel(
1836 window_list.at(i)->web_view()->ZoomLevel() - 1);
[email protected]3db130e2014-03-27 08:14:481837 }
1838}
1839
[email protected]b32fe542014-04-30 08:42:061840void EventSender::SetPageZoomFactor(double zoom_factor) {
lfg05e41372016-07-22 15:38:101841 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031842 interfaces()->GetWindowList();
[email protected]b32fe542014-04-30 08:42:061843
1844 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541845 window_list.at(i)->web_view()->SetZoomLevel(std::log(zoom_factor) /
lukasza01da2602016-04-05 14:51:261846 std::log(1.2));
[email protected]b32fe542014-04-30 08:42:061847 }
1848}
1849
[email protected]3db130e2014-03-27 08:14:481850void EventSender::ClearTouchPoints() {
1851 touch_points_.clear();
1852}
1853
[email protected]bfb6a602014-04-16 19:59:411854void EventSender::ThrowTouchPointError() {
Blink Reformat1c4d759e2017-04-09 16:34:541855 v8::Isolate* isolate = blink::MainThreadIsolate();
[email protected]bfb6a602014-04-16 19:59:411856 isolate->ThrowException(v8::Exception::TypeError(
1857 gin::StringToV8(isolate, "Invalid touch point.")));
1858}
1859
[email protected]3db130e2014-03-27 08:14:481860void EventSender::ReleaseTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411861 if (index >= touch_points_.size()) {
1862 ThrowTouchPointError();
1863 return;
1864 }
[email protected]3db130e2014-03-27 08:14:481865
1866 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541867 touch_point->state = WebTouchPoint::kStateReleased;
[email protected]3db130e2014-03-27 08:14:481868}
1869
e.hakkinen80033922015-07-31 08:41:351870void EventSender::UpdateTouchPoint(unsigned index,
1871 float x,
1872 float y,
1873 gin::Arguments* args) {
[email protected]bfb6a602014-04-16 19:59:411874 if (index >= touch_points_.size()) {
1875 ThrowTouchPointError();
1876 return;
1877 }
[email protected]3db130e2014-03-27 08:14:481878
1879 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541880 touch_point->state = WebTouchPoint::kStateMoved;
Mustaq Ahmedff30a0e42017-05-31 17:04:281881 touch_point->SetPositionInWidget(x, y);
1882 touch_point->SetPositionInScreen(x, y);
e.hakkinen80033922015-07-31 08:41:351883
Blink Reformat1c4d759e2017-04-09 16:34:541884 InitPointerProperties(args, touch_point, &touch_point->radius_x,
1885 &touch_point->radius_y);
[email protected]3db130e2014-03-27 08:14:481886}
1887
1888void EventSender::CancelTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411889 if (index >= touch_points_.size()) {
1890 ThrowTouchPointError();
1891 return;
1892 }
[email protected]3db130e2014-03-27 08:14:481893
1894 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541895 touch_point->state = WebTouchPoint::kStateCancelled;
[email protected]3db130e2014-03-27 08:14:481896}
1897
dcheng59826e32017-02-22 10:31:361898void EventSender::SetTouchModifier(const std::string& key_name, bool set_mask) {
mustaq21aed4e2015-12-15 21:47:211899 int mask = GetKeyModifier(key_name);
[email protected]3db130e2014-03-27 08:14:481900
1901 if (set_mask)
1902 touch_modifiers_ |= mask;
1903 else
1904 touch_modifiers_ &= ~mask;
1905}
1906
[email protected]ace1cd502014-04-24 21:05:301907void EventSender::SetTouchCancelable(bool cancelable) {
1908 touch_cancelable_ = cancelable;
1909}
1910
[email protected]3db130e2014-03-27 08:14:481911void EventSender::DumpFilenameBeingDragged() {
Blink Reformat1c4d759e2017-04-09 16:34:541912 if (current_drag_data_.IsNull())
dchengc3fe4642015-01-22 06:29:521913 return;
1914
Blink Reformat1c4d759e2017-04-09 16:34:541915 WebVector<WebDragData::Item> items = current_drag_data_.Items();
[email protected]3db130e2014-03-27 08:14:481916 for (size_t i = 0; i < items.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541917 if (items[i].storage_type == WebDragData::Item::kStorageTypeBinaryData) {
1918 WebURL url = items[i].binary_data_source_url;
1919 WebString filename_extension = items[i].binary_data_filename_extension;
1920 WebString content_disposition = items[i].binary_data_content_disposition;
dcheng3dd85612017-02-08 10:46:231921 base::FilePath filename =
Blink Reformat1c4d759e2017-04-09 16:34:541922 net::GenerateFileName(url, content_disposition.Utf8(),
dcheng3dd85612017-02-08 10:46:231923 std::string(), // referrer_charset
1924 std::string(), // suggested_name
1925 std::string(), // mime_type
1926 std::string()); // default_name
1927#if defined(OS_WIN)
Blink Reformat1c4d759e2017-04-09 16:34:541928 filename = filename.ReplaceExtension(filename_extension.Utf16());
dcheng3dd85612017-02-08 10:46:231929#else
Blink Reformat1c4d759e2017-04-09 16:34:541930 filename = filename.ReplaceExtension(filename_extension.Utf8());
dcheng3dd85612017-02-08 10:46:231931#endif
1932 delegate()->PrintMessage(std::string("Filename being dragged: ") +
1933 filename.AsUTF8Unsafe() + "\n");
1934 return;
[email protected]3db130e2014-03-27 08:14:481935 }
1936 }
[email protected]3db130e2014-03-27 08:14:481937}
1938
1939void EventSender::GestureFlingCancel() {
Blink Reformat1c4d759e2017-04-09 16:34:541940 WebGestureEvent event(WebInputEvent::kGestureFlingCancel,
Daniel Cheng224569ee2018-04-25 05:45:061941 WebInputEvent::kNoModifiers, GetCurrentEventTime(),
Ella Ge1116059d2018-03-21 02:06:131942 blink::kWebGestureDeviceTouchpad);
wjmaclean3bb814792015-10-20 01:13:321943 // Generally it won't matter what device we use here, and since it might
1944 // be cumbersome to expect all callers to specify a device, we'll just
1945 // choose Touchpad here.
[email protected]3db130e2014-03-27 08:14:481946
1947 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:531948 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:481949
tkent588765612014-11-28 01:07:481950 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481951}
1952
1953void EventSender::GestureFlingStart(float x,
tdresser3a1c9722015-02-13 15:44:531954 float y,
1955 float velocity_x,
1956 float velocity_y,
1957 gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:541958 WebGestureEvent event(WebInputEvent::kGestureFlingStart,
Daniel Cheng224569ee2018-04-25 05:45:061959 WebInputEvent::kNoModifiers, GetCurrentEventTime());
[email protected]3db130e2014-03-27 08:14:481960
tdresser15af5872015-02-18 14:03:021961 std::string device_string;
1962 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString())
1963 args->GetNext(&device_string);
tdresser3a1c9722015-02-13 15:44:531964
1965 if (device_string == kSourceDeviceStringTouchpad) {
Ella Ge1116059d2018-03-21 02:06:131966 event.SetSourceDevice(blink::kWebGestureDeviceTouchpad);
tdresser3a1c9722015-02-13 15:44:531967 } else if (device_string == kSourceDeviceStringTouchscreen) {
Ella Ge1116059d2018-03-21 02:06:131968 event.SetSourceDevice(blink::kWebGestureDeviceTouchscreen);
tdresser3a1c9722015-02-13 15:44:531969 } else {
1970 args->ThrowError();
1971 return;
1972 }
1973
sahel42a50bb2016-07-22 19:34:041974 float max_start_velocity = std::max(fabs(velocity_x), fabs(velocity_y));
1975 if (!max_start_velocity) {
Blink Reformat1c4d759e2017-04-09 16:34:541976 v8::Isolate* isolate = blink::MainThreadIsolate();
sahel42a50bb2016-07-22 19:34:041977 isolate->ThrowException(v8::Exception::TypeError(
dcheng59826e32017-02-22 10:31:361978 gin::StringToV8(isolate, "Invalid max start velocity.")));
sahel42a50bb2016-07-22 19:34:041979 return;
1980 }
1981
Ella Ge1116059d2018-03-21 02:06:131982 event.SetPositionInWidget(WebFloatPoint(x, y));
1983 event.SetPositionInScreen(WebFloatPoint(x, y));
[email protected]3db130e2014-03-27 08:14:481984
Blink Reformat1c4d759e2017-04-09 16:34:541985 event.data.fling_start.velocity_x = velocity_x;
1986 event.data.fling_start.velocity_y = velocity_y;
[email protected]3db130e2014-03-27 08:14:481987
1988 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:531989 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:481990
tkent588765612014-11-28 01:07:481991 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481992}
1993
W. James MacLeanb5846e52017-08-31 20:39:501994bool EventSender::IsFlinging() {
1995 return mainFrameWidget()->IsFlinging();
tdresserd7bba522016-02-19 22:40:131996}
1997
Ella Ge1116059d2018-03-21 02:06:131998void EventSender::GestureScrollFirstPoint(float x, float y) {
1999 current_gesture_location_ = WebFloatPoint(x, y);
[email protected]3db130e2014-03-27 08:14:482000}
2001
rbyers709aa1e2016-05-12 04:44:062002void EventSender::TouchStart(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542003 SendCurrentTouchEvent(WebInputEvent::kTouchStart, args);
mustaq96985f722015-06-30 21:41:532004}
2005
rbyers709aa1e2016-05-12 04:44:062006void EventSender::TouchMove(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542007 SendCurrentTouchEvent(WebInputEvent::kTouchMove, args);
[email protected]3db130e2014-03-27 08:14:482008}
2009
rbyers709aa1e2016-05-12 04:44:062010void EventSender::TouchCancel(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542011 SendCurrentTouchEvent(WebInputEvent::kTouchCancel, args);
rbyers709aa1e2016-05-12 04:44:062012}
2013
2014void EventSender::TouchEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542015 SendCurrentTouchEvent(WebInputEvent::kTouchEnd, args);
[email protected]3db130e2014-03-27 08:14:482016}
2017
mustaqb3c44a02016-04-19 18:49:052018void EventSender::NotifyStartOfTouchScroll() {
Navid Zolghadr24ff17d2018-01-24 20:58:042019 WebPointerEvent event = WebPointerEvent::CreatePointerCausesUaActionEvent(
Daniel Cheng224569ee2018-04-25 05:45:062020 WebPointerProperties::PointerType::kUnknown, GetCurrentEventTime());
mustaqb3c44a02016-04-19 18:49:052021 HandleInputEventOnViewOrPopup(event);
2022}
2023
[email protected]3db130e2014-03-27 08:14:482024void EventSender::LeapForward(int milliseconds) {
nzolghadr43146032016-04-11 15:33:382025 if (is_drag_mode_ &&
mustaqabca6ff2016-06-09 17:29:532026 current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542027 WebMouseEvent::Button::kLeft &&
[email protected]3db130e2014-03-27 08:14:482028 !replaying_saved_events_) {
2029 SavedEvent saved_event;
2030 saved_event.type = SavedEvent::TYPE_LEAP_FORWARD;
2031 saved_event.milliseconds = milliseconds;
2032 mouse_event_queue_.push_back(saved_event);
2033 } else {
2034 DoLeapForward(milliseconds);
2035 }
2036}
2037
2038void EventSender::BeginDragWithFiles(const std::vector<std::string>& files) {
Blink Reformat1c4d759e2017-04-09 16:34:542039 if (!current_drag_data_.IsNull()) {
sigbjornf23324ff2016-02-22 15:46:312040 // Nested dragging not supported, fuzzer code a likely culprit.
2041 // Cancel the current drag operation and throw an error.
dtapuska0d1f4af2016-06-29 16:42:222042 KeyDown("Escape", 0, DOMKeyLocationStandard);
Blink Reformat1c4d759e2017-04-09 16:34:542043 v8::Isolate* isolate = blink::MainThreadIsolate();
dcheng59826e32017-02-22 10:31:362044 isolate->ThrowException(v8::Exception::Error(gin::StringToV8(
2045 isolate, "Nested beginDragWithFiles() not supported.")));
sigbjornf23324ff2016-02-22 15:46:312046 return;
2047 }
Blink Reformat1c4d759e2017-04-09 16:34:542048 current_drag_data_.Initialize();
[email protected]3db130e2014-03-27 08:14:482049 WebVector<WebString> absolute_filenames(files.size());
2050 for (size_t i = 0; i < files.size(); ++i) {
2051 WebDragData::Item item;
Blink Reformat1c4d759e2017-04-09 16:34:542052 item.storage_type = WebDragData::Item::kStorageTypeFilename;
2053 item.filename_data = delegate()->GetAbsoluteWebStringFromUTF8Path(files[i]);
2054 current_drag_data_.AddItem(item);
2055 absolute_filenames[i] = item.filename_data;
[email protected]3db130e2014-03-27 08:14:482056 }
Blink Reformat1c4d759e2017-04-09 16:34:542057 current_drag_data_.SetFilesystemId(
lukasza335bb762016-04-22 16:44:032058 delegate()->RegisterIsolatedFileSystem(absolute_filenames));
Blink Reformat1c4d759e2017-04-09 16:34:542059 current_drag_effects_allowed_ = blink::kWebDragOperationCopy;
[email protected]3db130e2014-03-27 08:14:482060
oshima76b6eeb2016-06-27 15:55:122061 const WebPoint& last_pos =
2062 current_pointer_state_[kRawMousePointerId].last_pos_;
2063 float scale = delegate()->GetWindowToViewportScale();
Ella Ge80a52dce2017-11-15 18:01:522064 WebFloatPoint scaled_last_pos(last_pos.x * scale, last_pos.y * scale);
oshima76b6eeb2016-06-27 15:55:122065
[email protected]3db130e2014-03-27 08:14:482066 // Provide a drag source.
Blink Reformat1c4d759e2017-04-09 16:34:542067 mainFrameWidget()->DragTargetDragEnter(current_drag_data_, scaled_last_pos,
dcheng59826e32017-02-22 10:31:362068 scaled_last_pos,
2069 current_drag_effects_allowed_, 0);
[email protected]3db130e2014-03-27 08:14:482070 // |is_drag_mode_| saves events and then replays them later. We don't
2071 // need/want that.
2072 is_drag_mode_ = false;
2073
2074 // Make the rest of eventSender think a drag is in progress.
mustaqabca6ff2016-06-09 17:29:532075 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:542076 WebMouseEvent::Button::kLeft;
mustaqabca6ff2016-06-09 17:29:532077 current_pointer_state_[kRawMousePointerId].current_buttons_ |=
nzolghadr43146032016-04-11 15:33:382078 GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:532079 current_pointer_state_[kRawMousePointerId].pressed_button_);
[email protected]3db130e2014-03-27 08:14:482080}
2081
e.hakkinen80033922015-07-31 08:41:352082void EventSender::AddTouchPoint(float x, float y, gin::Arguments* args) {
Ella Gef69b51b2017-09-28 16:30:452083 if (touch_points_.size() == WebTouchEvent::kTouchesLengthCap) {
2084 args->ThrowError();
2085 return;
2086 }
[email protected]3db130e2014-03-27 08:14:482087 WebTouchPoint touch_point;
Blink Reformat1c4d759e2017-04-09 16:34:542088 touch_point.pointer_type = WebPointerProperties::PointerType::kTouch;
2089 touch_point.state = WebTouchPoint::kStatePressed;
Mustaq Ahmedff30a0e42017-05-31 17:04:282090 touch_point.SetPositionInWidget(x, y);
2091 touch_point.SetPositionInScreen(x, y);
[email protected]3db130e2014-03-27 08:14:482092
mustaq913e8922015-09-09 20:15:362093 int highest_id = -1;
[email protected]3db130e2014-03-27 08:14:482094 for (size_t i = 0; i < touch_points_.size(); i++) {
mustaq913e8922015-09-09 20:15:362095 if (touch_points_[i].id > highest_id)
2096 highest_id = touch_points_[i].id;
[email protected]3db130e2014-03-27 08:14:482097 }
mustaq913e8922015-09-09 20:15:362098 touch_point.id = highest_id + 1;
e.hakkinen80033922015-07-31 08:41:352099
Blink Reformat1c4d759e2017-04-09 16:34:542100 InitPointerProperties(args, &touch_point, &touch_point.radius_x,
2101 &touch_point.radius_y);
e.hakkinen80033922015-07-31 08:41:352102
nzolghadr88114bc2016-02-01 21:46:162103 // Set the touch point pressure to zero if it was not set by the caller
landell7d38a9a12016-02-04 16:34:552104 if (std::isnan(touch_point.force))
dcheng59826e32017-02-22 10:31:362105 touch_point.force = 0.0;
nzolghadr88114bc2016-02-01 21:46:162106
[email protected]3db130e2014-03-27 08:14:482107 touch_points_.push_back(touch_point);
2108}
2109
[email protected]3db130e2014-03-27 08:14:482110void EventSender::GestureScrollBegin(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542111 GestureEvent(WebInputEvent::kGestureScrollBegin, args);
[email protected]3db130e2014-03-27 08:14:482112}
2113
2114void EventSender::GestureScrollEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542115 GestureEvent(WebInputEvent::kGestureScrollEnd, args);
[email protected]3db130e2014-03-27 08:14:482116}
2117
2118void EventSender::GestureScrollUpdate(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542119 GestureEvent(WebInputEvent::kGestureScrollUpdate, args);
[email protected]3db130e2014-03-27 08:14:482120}
2121
[email protected]3db130e2014-03-27 08:14:482122void EventSender::GestureTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542123 GestureEvent(WebInputEvent::kGestureTap, args);
[email protected]3db130e2014-03-27 08:14:482124}
2125
2126void EventSender::GestureTapDown(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542127 GestureEvent(WebInputEvent::kGestureTapDown, args);
[email protected]3db130e2014-03-27 08:14:482128}
2129
2130void EventSender::GestureShowPress(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542131 GestureEvent(WebInputEvent::kGestureShowPress, args);
[email protected]3db130e2014-03-27 08:14:482132}
2133
2134void EventSender::GestureTapCancel(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542135 GestureEvent(WebInputEvent::kGestureTapCancel, args);
[email protected]3db130e2014-03-27 08:14:482136}
2137
2138void EventSender::GestureLongPress(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542139 GestureEvent(WebInputEvent::kGestureLongPress, args);
[email protected]3db130e2014-03-27 08:14:482140}
2141
2142void EventSender::GestureLongTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542143 GestureEvent(WebInputEvent::kGestureLongTap, args);
[email protected]3db130e2014-03-27 08:14:482144}
2145
2146void EventSender::GestureTwoFingerTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542147 GestureEvent(WebInputEvent::kGestureTwoFingerTap, args);
[email protected]3db130e2014-03-27 08:14:482148}
2149
dtapuska43f18e9e2016-03-20 20:21:302150void EventSender::MouseScrollBy(gin::Arguments* args,
2151 MouseScrollType scroll_type) {
dtapuska43f18e9e2016-03-20 20:21:302152 // TODO(dtapuska): Gestures really should be sent by the MouseWheelEventQueue
2153 // class in the browser. But since the event doesn't propogate up into
2154 // the browser generate the events here. See crbug.com/596095.
dtapuskab8b21412016-06-16 11:09:142155 bool send_gestures = true;
dtapuska899ac222017-01-03 18:09:162156 WebMouseWheelEvent wheel_event =
2157 GetMouseWheelEvent(args, scroll_type, &send_gestures);
Blink Reformat1c4d759e2017-04-09 16:34:542158 if (wheel_event.GetType() != WebInputEvent::kUndefined &&
dtapuska899ac222017-01-03 18:09:162159 HandleInputEventOnViewOrPopup(wheel_event) ==
Blink Reformat1c4d759e2017-04-09 16:34:542160 WebInputEventResult::kNotHandled &&
dtapuska43f18e9e2016-03-20 20:21:302161 send_gestures) {
2162 SendGesturesForMouseWheelEvent(wheel_event);
2163 }
[email protected]3db130e2014-03-27 08:14:482164}
2165
[email protected]3db130e2014-03-27 08:14:482166void EventSender::MouseMoveTo(gin::Arguments* args) {
2167 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532168 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:482169
[email protected]f53eba122014-04-16 11:30:012170 double x;
2171 double y;
mustaq0fff7fc32014-09-24 20:21:432172 if (!args->GetNext(&x) || !args->GetNext(&y)) {
2173 args->ThrowError();
2174 return;
2175 }
[email protected]f53eba122014-04-16 11:30:012176 WebPoint mouse_pos(static_cast<int>(x), static_cast<int>(y));
[email protected]3db130e2014-03-27 08:14:482177
2178 int modifiers = 0;
nzolghadr43146032016-04-11 15:33:382179 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:322180 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:382181 args->Skip();
2182 }
[email protected]3db130e2014-03-27 08:14:482183
mustaqabca6ff2016-06-09 17:29:532184 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:542185 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:532186 int pointerId = 0;
2187 float pressure = 0;
2188 int tiltX = 0;
2189 int tiltY = 0;
2190 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
2191 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:382192 return;
2193
Blink Reformat1c4d759e2017-04-09 16:34:542194 if (pointerType == WebPointerProperties::PointerType::kMouse &&
nzolghadr43146032016-04-11 15:33:382195 is_drag_mode_ && !replaying_saved_events_ &&
mustaqabca6ff2016-06-09 17:29:532196 current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542197 WebMouseEvent::Button::kLeft) {
[email protected]3db130e2014-03-27 08:14:482198 SavedEvent saved_event;
2199 saved_event.type = SavedEvent::TYPE_MOUSE_MOVE;
2200 saved_event.pos = mouse_pos;
2201 saved_event.modifiers = modifiers;
2202 mouse_event_queue_.push_back(saved_event);
2203 } else {
nzolghadr43146032016-04-11 15:33:382204 current_pointer_state_[pointerId].last_pos_ = mouse_pos;
dtapuska899ac222017-01-03 18:09:162205 current_pointer_state_[pointerId].modifiers_ = modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542206 WebMouseEvent event(WebInputEvent::kMouseMove,
Daniel Cheng224569ee2018-04-25 05:45:062207 ModifiersForPointer(pointerId), GetCurrentEventTime());
Blink Reformat1c4d759e2017-04-09 16:34:542208 int click_count = pointerType == WebPointerProperties::PointerType::kMouse
mustaqabca6ff2016-06-09 17:29:532209 ? click_count_
2210 : 0;
2211 InitMouseEventGeneric(
mustaqabca6ff2016-06-09 17:29:532212 current_pointer_state_[kRawMousePointerId].pressed_button_,
2213 current_pointer_state_[kRawMousePointerId].current_buttons_, mouse_pos,
dtapuska899ac222017-01-03 18:09:162214 click_count, pointerType, pointerId, pressure, tiltX, tiltY, &event);
nzolghadr43146032016-04-11 15:33:382215 HandleInputEventOnViewOrPopup(event);
Blink Reformat1c4d759e2017-04-09 16:34:542216 if (pointerType == WebPointerProperties::PointerType::kMouse)
nzolghadr43146032016-04-11 15:33:382217 DoDragAfterMouseMove(event);
[email protected]3db130e2014-03-27 08:14:482218 }
2219}
2220
lanwei0474c2a52017-05-12 18:52:012221void EventSender::MouseLeave(
2222 blink::WebPointerProperties::PointerType pointerType,
2223 int pointerId) {
myid.shin12c7fea22015-03-06 02:31:242224 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532225 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
myid.shin12c7fea22015-03-06 02:31:242226
Blink Reformat1c4d759e2017-04-09 16:34:542227 WebMouseEvent event(WebInputEvent::kMouseLeave,
Daniel Cheng224569ee2018-04-25 05:45:062228 ModifiersForPointer(pointerId), GetCurrentEventTime());
lanwei0474c2a52017-05-12 18:52:012229 InitMouseEventGeneric(WebMouseEvent::Button::kNoButton, 0,
2230 current_pointer_state_[kRawMousePointerId].last_pos_,
2231 click_count_, pointerType, pointerId, 0.0, 0, 0,
2232 &event);
thestigfd11ffe2015-12-30 19:25:452233 HandleInputEventOnViewOrPopup(event);
myid.shin12c7fea22015-03-06 02:31:242234}
2235
[email protected]3db130e2014-03-27 08:14:482236void EventSender::ScheduleAsynchronousClick(int button_number, int modifiers) {
tzik47429762018-05-17 08:43:472237 delegate()->PostTask(base::BindOnce(&EventSender::MouseDown,
2238 weak_factory_.GetWeakPtr(), button_number,
2239 modifiers));
2240 delegate()->PostTask(base::BindOnce(&EventSender::MouseUp,
2241 weak_factory_.GetWeakPtr(), button_number,
2242 modifiers));
[email protected]3db130e2014-03-27 08:14:482243}
2244
2245void EventSender::ScheduleAsynchronousKeyDown(const std::string& code_str,
2246 int modifiers,
2247 KeyLocationCode location) {
tzik47429762018-05-17 08:43:472248 delegate()->PostTask(base::BindOnce(&EventSender::KeyDown,
2249 weak_factory_.GetWeakPtr(), code_str,
2250 modifiers, location));
[email protected]3db130e2014-03-27 08:14:482251}
2252
Mustaq Ahmedc9b974a2018-01-22 19:43:442253void EventSender::ConsumeUserActivation() {
2254 blink::WebUserGestureIndicator::ConsumeUserGesture(
2255 view()->MainFrame()->ToWebLocalFrame());
2256}
2257
Daniel Cheng224569ee2018-04-25 05:45:062258base::TimeTicks EventSender::GetCurrentEventTime() const {
2259 return base::TimeTicks::Now() + time_offset_;
[email protected]3db130e2014-03-27 08:14:482260}
2261
2262void EventSender::DoLeapForward(int milliseconds) {
Daniel Cheng224569ee2018-04-25 05:45:062263 time_offset_ += base::TimeDelta::FromMilliseconds(milliseconds);
[email protected]3db130e2014-03-27 08:14:482264}
2265
mustaq19048372016-06-16 21:39:322266uint32_t EventSender::GetUniqueTouchEventId(gin::Arguments* args) {
2267 uint32_t unique_touch_event_id;
dcheng59826e32017-02-22 10:31:362268 if (!args->PeekNext().IsEmpty() && args->GetNext(&unique_touch_event_id))
mustaq19048372016-06-16 21:39:322269 return unique_touch_event_id;
2270
2271 return 0;
2272}
2273
mustaq96985f722015-06-30 21:41:532274void EventSender::SendCurrentTouchEvent(WebInputEvent::Type type,
mustaq19048372016-06-16 21:39:322275 gin::Arguments* args) {
lanwei00f70892017-02-07 23:12:212276 uint32_t unique_touch_event_id = GetUniqueTouchEventId(args);
mustaq19048372016-06-16 21:39:322277
Ella Gef69b51b2017-09-28 16:30:452278 DCHECK_LE(touch_points_.size(),
2279 static_cast<unsigned>(WebTouchEvent::kTouchesLengthCap));
[email protected]3db130e2014-03-27 08:14:482280 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532281 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:482282
Daniel Cheng224569ee2018-04-25 05:45:062283 base::TimeTicks time_stamp = GetCurrentEventTime();
Navid Zolghadr24ff17d2018-01-24 20:58:042284 blink::WebInputEvent::DispatchType dispatch_type =
2285 touch_cancelable_ ? WebInputEvent::kBlocking
2286 : WebInputEvent::kEventNonBlocking;
2287
2288 for (unsigned i = 0; i < touch_points_.size(); ++i) {
2289 const WebTouchPoint& touch_point = touch_points_[i];
2290 if (touch_point.state != blink::WebTouchPoint::kStateStationary) {
2291 WebPointerEvent pointer_event = WebPointerEvent(
2292 PointerEventTypeForTouchPointState(touch_point.state), touch_point,
2293 touch_point.radius_x * 2, touch_point.radius_y * 2);
Navid Zolghadrabfb81c2018-02-07 15:59:052294 pointer_event.hovering = false;
Navid Zolghadr24ff17d2018-01-24 20:58:042295 pointer_event.dispatch_type = dispatch_type;
2296 pointer_event.moved_beyond_slop_region = true;
2297 pointer_event.unique_touch_event_id = unique_touch_event_id;
Daniel Cheng224569ee2018-04-25 05:45:062298 pointer_event.SetTimeStamp(time_stamp);
Navid Zolghadr24ff17d2018-01-24 20:58:042299 pointer_event.SetModifiers(touch_modifiers_);
Navid Zolghadrb897c70e02018-03-01 23:10:482300 pointer_event.button =
2301 (pointer_event.GetType() == WebInputEvent::kPointerDown ||
2302 pointer_event.GetType() == WebInputEvent::kPointerUp)
2303 ? WebPointerProperties::Button::kLeft
2304 : WebPointerProperties::Button::kNoButton;
Navid Zolghadr24ff17d2018-01-24 20:58:042305
2306 HandleInputEventOnViewOrPopup(pointer_event);
2307 }
2308 }
2309 WebPagePopup* popup = widget()->GetPagePopup();
2310 if (popup)
2311 popup->DispatchBufferedTouchEvents();
2312 else
2313 widget()->DispatchBufferedTouchEvents();
[email protected]3db130e2014-03-27 08:14:482314
2315 for (size_t i = 0; i < touch_points_.size(); ++i) {
2316 WebTouchPoint* touch_point = &touch_points_[i];
Blink Reformat1c4d759e2017-04-09 16:34:542317 if (touch_point->state == WebTouchPoint::kStateReleased ||
2318 touch_point->state == WebTouchPoint::kStateCancelled) {
[email protected]3db130e2014-03-27 08:14:482319 touch_points_.erase(touch_points_.begin() + i);
2320 --i;
thestigfd11ffe2015-12-30 19:25:452321 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542322 touch_point->state = WebTouchPoint::kStateStationary;
thestigfd11ffe2015-12-30 19:25:452323 }
[email protected]3db130e2014-03-27 08:14:482324 }
2325}
2326
dcheng59826e32017-02-22 10:31:362327void EventSender::GestureEvent(WebInputEvent::Type type, gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542328 WebGestureEvent event(type, WebInputEvent::kNoModifiers,
Daniel Cheng224569ee2018-04-25 05:45:062329 GetCurrentEventTime(),
Ella Ge1116059d2018-03-21 02:06:132330 blink::kWebGestureDeviceTouchscreen);
ccameronb81b8072015-01-30 00:54:492331
2332 // If the first argument is a string, it is to specify the device, otherwise
2333 // the device is assumed to be a touchscreen (since most tests were written
2334 // assuming this).
jochen87d2fee2015-07-13 08:21:342335 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString()) {
ccameronb81b8072015-01-30 00:54:492336 std::string device_string;
2337 if (!args->GetNext(&device_string)) {
2338 args->ThrowError();
2339 return;
2340 }
tdresser3a1c9722015-02-13 15:44:532341 if (device_string == kSourceDeviceStringTouchpad) {
Ella Ge1116059d2018-03-21 02:06:132342 event.SetSourceDevice(blink::kWebGestureDeviceTouchpad);
tdresser3a1c9722015-02-13 15:44:532343 } else if (device_string == kSourceDeviceStringTouchscreen) {
Ella Ge1116059d2018-03-21 02:06:132344 event.SetSourceDevice(blink::kWebGestureDeviceTouchscreen);
ccameronb81b8072015-01-30 00:54:492345 } else {
2346 args->ThrowError();
2347 return;
2348 }
2349 }
2350
[email protected]3db130e2014-03-27 08:14:482351 double x;
2352 double y;
mustaq0fff7fc32014-09-24 20:21:432353 if (!args->GetNext(&x) || !args->GetNext(&y)) {
2354 args->ThrowError();
2355 return;
2356 }
[email protected]3db130e2014-03-27 08:14:482357
[email protected]3db130e2014-03-27 08:14:482358 switch (type) {
Blink Reformat1c4d759e2017-04-09 16:34:542359 case WebInputEvent::kGestureScrollUpdate: {
Blink Reformat1c4d759e2017-04-09 16:34:542360 if (!GetScrollUnits(args, &event.data.scroll_update.delta_units))
dtapuskab1c5ece2016-01-18 18:18:022361 return;
majidvp50205db2014-11-27 17:28:522362
Blink Reformat1c4d759e2017-04-09 16:34:542363 event.data.scroll_update.delta_x = static_cast<float>(x);
2364 event.data.scroll_update.delta_y = static_cast<float>(y);
Ella Ge1116059d2018-03-21 02:06:132365 event.SetPositionInWidget(current_gesture_location_);
[email protected]3db130e2014-03-27 08:14:482366 current_gesture_location_.x =
Blink Reformat1c4d759e2017-04-09 16:34:542367 current_gesture_location_.x + event.data.scroll_update.delta_x;
[email protected]3db130e2014-03-27 08:14:482368 current_gesture_location_.y =
Blink Reformat1c4d759e2017-04-09 16:34:542369 current_gesture_location_.y + event.data.scroll_update.delta_y;
[email protected]3db130e2014-03-27 08:14:482370 break;
majidvp50205db2014-11-27 17:28:522371 }
Blink Reformat1c4d759e2017-04-09 16:34:542372 case WebInputEvent::kGestureScrollBegin:
Ella Ge1116059d2018-03-21 02:06:132373 current_gesture_location_ = WebFloatPoint(x, y);
2374 event.SetPositionInWidget(current_gesture_location_);
[email protected]3db130e2014-03-27 08:14:482375 break;
Blink Reformat1c4d759e2017-04-09 16:34:542376 case WebInputEvent::kGestureScrollEnd:
2377 case WebInputEvent::kGestureFlingStart:
Ella Ge1116059d2018-03-21 02:06:132378 event.SetPositionInWidget(current_gesture_location_);
[email protected]3db130e2014-03-27 08:14:482379 break;
Blink Reformat1c4d759e2017-04-09 16:34:542380 case WebInputEvent::kGestureTap: {
[email protected]c278d7532014-07-31 19:51:452381 float tap_count = 1;
2382 float width = 30;
2383 float height = 30;
[email protected]3db130e2014-03-27 08:14:482384 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482385 if (!args->GetNext(&tap_count)) {
2386 args->ThrowError();
2387 return;
2388 }
[email protected]3db130e2014-03-27 08:14:482389 }
[email protected]cc42ccf2014-06-27 21:31:432390 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432391 if (!args->GetNext(&width)) {
2392 args->ThrowError();
2393 return;
2394 }
[email protected]cc42ccf2014-06-27 21:31:432395 }
2396 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432397 if (!args->GetNext(&height)) {
2398 args->ThrowError();
2399 return;
2400 }
[email protected]cc42ccf2014-06-27 21:31:432401 }
Blink Reformat1c4d759e2017-04-09 16:34:542402 event.data.tap.tap_count = tap_count;
[email protected]c278d7532014-07-31 19:51:452403 event.data.tap.width = width;
2404 event.data.tap.height = height;
Ella Ge1116059d2018-03-21 02:06:132405 event.SetPositionInWidget(WebFloatPoint(x, y));
[email protected]3db130e2014-03-27 08:14:482406 break;
[email protected]c278d7532014-07-31 19:51:452407 }
Blink Reformat1c4d759e2017-04-09 16:34:542408 case WebInputEvent::kGestureTapUnconfirmed:
[email protected]3db130e2014-03-27 08:14:482409 if (!args->PeekNext().IsEmpty()) {
2410 float tap_count;
2411 if (!args->GetNext(&tap_count)) {
2412 args->ThrowError();
2413 return;
2414 }
Blink Reformat1c4d759e2017-04-09 16:34:542415 event.data.tap.tap_count = tap_count;
[email protected]3db130e2014-03-27 08:14:482416 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542417 event.data.tap.tap_count = 1;
[email protected]3db130e2014-03-27 08:14:482418 }
Ella Ge1116059d2018-03-21 02:06:132419 event.SetPositionInWidget(WebFloatPoint(x, y));
[email protected]3db130e2014-03-27 08:14:482420 break;
Blink Reformat1c4d759e2017-04-09 16:34:542421 case WebInputEvent::kGestureTapDown: {
[email protected]c278d7532014-07-31 19:51:452422 float width = 30;
2423 float height = 30;
[email protected]3db130e2014-03-27 08:14:482424 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482425 if (!args->GetNext(&width)) {
2426 args->ThrowError();
2427 return;
2428 }
[email protected]3db130e2014-03-27 08:14:482429 }
2430 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482431 if (!args->GetNext(&height)) {
2432 args->ThrowError();
2433 return;
2434 }
[email protected]3db130e2014-03-27 08:14:482435 }
Ella Ge1116059d2018-03-21 02:06:132436 event.SetPositionInWidget(WebFloatPoint(x, y));
Blink Reformat1c4d759e2017-04-09 16:34:542437 event.data.tap_down.width = width;
2438 event.data.tap_down.height = height;
[email protected]c278d7532014-07-31 19:51:452439 break;
2440 }
Blink Reformat1c4d759e2017-04-09 16:34:542441 case WebInputEvent::kGestureShowPress: {
[email protected]c278d7532014-07-31 19:51:452442 float width = 30;
2443 float height = 30;
[email protected]3db130e2014-03-27 08:14:482444 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482445 if (!args->GetNext(&width)) {
2446 args->ThrowError();
2447 return;
2448 }
[email protected]3db130e2014-03-27 08:14:482449 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482450 if (!args->GetNext(&height)) {
2451 args->ThrowError();
2452 return;
2453 }
[email protected]3db130e2014-03-27 08:14:482454 }
2455 }
Ella Ge1116059d2018-03-21 02:06:132456 event.SetPositionInWidget(WebFloatPoint(x, y));
Blink Reformat1c4d759e2017-04-09 16:34:542457 event.data.show_press.width = width;
2458 event.data.show_press.height = height;
[email protected]3db130e2014-03-27 08:14:482459 break;
[email protected]c278d7532014-07-31 19:51:452460 }
Blink Reformat1c4d759e2017-04-09 16:34:542461 case WebInputEvent::kGestureTapCancel:
Ella Ge1116059d2018-03-21 02:06:132462 event.SetPositionInWidget(WebFloatPoint(x, y));
[email protected]3db130e2014-03-27 08:14:482463 break;
Blink Reformat1c4d759e2017-04-09 16:34:542464 case WebInputEvent::kGestureLongPress:
2465 case WebInputEvent::kGestureLongTap:
Ella Ge1116059d2018-03-21 02:06:132466 event.SetPositionInWidget(WebFloatPoint(x, y));
[email protected]3db130e2014-03-27 08:14:482467 if (!args->PeekNext().IsEmpty()) {
2468 float width;
2469 if (!args->GetNext(&width)) {
2470 args->ThrowError();
2471 return;
2472 }
Blink Reformat1c4d759e2017-04-09 16:34:542473 event.data.long_press.width = width;
[email protected]3db130e2014-03-27 08:14:482474 if (!args->PeekNext().IsEmpty()) {
2475 float height;
2476 if (!args->GetNext(&height)) {
2477 args->ThrowError();
2478 return;
2479 }
Blink Reformat1c4d759e2017-04-09 16:34:542480 event.data.long_press.height = height;
[email protected]3db130e2014-03-27 08:14:482481 }
2482 }
2483 break;
Blink Reformat1c4d759e2017-04-09 16:34:542484 case WebInputEvent::kGestureTwoFingerTap:
Ella Ge1116059d2018-03-21 02:06:132485 event.SetPositionInWidget(WebFloatPoint(x, y));
[email protected]3db130e2014-03-27 08:14:482486 if (!args->PeekNext().IsEmpty()) {
2487 float first_finger_width;
2488 if (!args->GetNext(&first_finger_width)) {
2489 args->ThrowError();
2490 return;
2491 }
Blink Reformat1c4d759e2017-04-09 16:34:542492 event.data.two_finger_tap.first_finger_width = first_finger_width;
[email protected]3db130e2014-03-27 08:14:482493 if (!args->PeekNext().IsEmpty()) {
2494 float first_finger_height;
2495 if (!args->GetNext(&first_finger_height)) {
2496 args->ThrowError();
2497 return;
2498 }
Blink Reformat1c4d759e2017-04-09 16:34:542499 event.data.two_finger_tap.first_finger_height = first_finger_height;
[email protected]3db130e2014-03-27 08:14:482500 }
2501 }
2502 break;
2503 default:
2504 NOTREACHED();
2505 }
2506
Blink Reformat1c4d759e2017-04-09 16:34:542507 event.unique_touch_event_id = GetUniqueTouchEventId(args);
chongzd65eacf2017-06-28 05:21:592508 if (!GetPointerType(args, false, event.primary_pointer_type))
2509 return;
mustaq19048372016-06-16 21:39:322510
Ella Ge1116059d2018-03-21 02:06:132511 event.SetPositionInScreen(event.PositionInWidget());
[email protected]3db130e2014-03-27 08:14:482512
2513 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532514 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:482515
dtapuska5d2e9c32015-12-03 16:39:492516 WebInputEventResult result = HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:482517
2518 // Long press might start a drag drop session. Complete it if so.
Blink Reformat1c4d759e2017-04-09 16:34:542519 if (type == WebInputEvent::kGestureLongPress &&
2520 !current_drag_data_.IsNull()) {
2521 WebMouseEvent mouse_event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:162522 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:062523 GetCurrentEventTime());
dtapuska899ac222017-01-03 18:09:162524
2525 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:532526 current_pointer_state_[kRawMousePointerId].current_buttons_,
dtapuska899ac222017-01-03 18:09:162527 WebPoint(x, y), click_count_, &mouse_event);
[email protected]3db130e2014-03-27 08:14:482528
Blink Reformat1c4d759e2017-04-09 16:34:542529 FinishDragAndDrop(mouse_event, blink::kWebDragOperationNone);
[email protected]3db130e2014-03-27 08:14:482530 }
Blink Reformat1c4d759e2017-04-09 16:34:542531 args->Return(result != WebInputEventResult::kNotHandled);
[email protected]3db130e2014-03-27 08:14:482532}
2533
dcheng59826e32017-02-22 10:31:362534void EventSender::UpdateClickCountForButton(WebMouseEvent::Button button_type) {
Daniel Cheng224569ee2018-04-25 05:45:062535 if ((GetCurrentEventTime() - last_click_time_ < kMultipleClickTime) &&
nzolghadr43146032016-04-11 15:33:382536 (!OutsideMultiClickRadius(
mustaqabca6ff2016-06-09 17:29:532537 current_pointer_state_[kRawMousePointerId].last_pos_,
nzolghadr43146032016-04-11 15:33:382538 last_click_pos_)) &&
[email protected]3db130e2014-03-27 08:14:482539 (button_type == last_button_type_)) {
2540 ++click_count_;
2541 } else {
2542 click_count_ = 1;
2543 last_button_type_ = button_type;
2544 }
2545}
2546
dtapuska899ac222017-01-03 18:09:162547WebMouseWheelEvent EventSender::GetMouseWheelEvent(gin::Arguments* args,
2548 MouseScrollType scroll_type,
2549 bool* send_gestures) {
[email protected]3db130e2014-03-27 08:14:482550 // Force a layout here just to make sure every position has been
2551 // determined before we send events (as well as all the other methods
2552 // that send an event do).
2553 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532554 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
[email protected]3db130e2014-03-27 08:14:482555
2556 double horizontal;
[email protected]3db130e2014-03-27 08:14:482557 double vertical;
dtapuska899ac222017-01-03 18:09:162558 if (!args->GetNext(&horizontal) || !args->GetNext(&vertical)) {
[email protected]3db130e2014-03-27 08:14:482559 args->ThrowError();
dtapuska899ac222017-01-03 18:09:162560 return WebMouseWheelEvent();
[email protected]3db130e2014-03-27 08:14:482561 }
2562
2563 bool paged = false;
2564 bool has_precise_scrolling_deltas = false;
2565 int modifiers = 0;
Blink Reformat1c4d759e2017-04-09 16:34:542566 WebMouseWheelEvent::Phase phase = WebMouseWheelEvent::kPhaseNone;
yutakf3990fd2014-12-23 03:52:382567 if (!args->PeekNext().IsEmpty()) {
2568 args->GetNext(&paged);
2569 if (!args->PeekNext().IsEmpty()) {
2570 args->GetNext(&has_precise_scrolling_deltas);
lanweia93644f2015-01-21 22:00:332571 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:412572 v8::Local<v8::Value> value;
lanweia93644f2015-01-21 22:00:332573 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:322574 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
dtapuska43f18e9e2016-03-20 20:21:302575 if (!args->PeekNext().IsEmpty()) {
dtapuskab8b21412016-06-16 11:09:142576 args->GetNext(send_gestures);
chongzb92d7112016-07-04 22:11:542577 if (!args->PeekNext().IsEmpty()) {
2578 v8::Local<v8::Value> phase_value;
2579 args->GetNext(&phase_value);
Dan Elphick38a508052018-07-23 22:19:532580 phase = GetMouseWheelEventPhaseFromV8(args->isolate(), phase_value);
chongzb92d7112016-07-04 22:11:542581 }
dtapuska43f18e9e2016-03-20 20:21:302582 }
lanweia93644f2015-01-21 22:00:332583 }
yutakf3990fd2014-12-23 03:52:382584 }
2585 }
[email protected]3db130e2014-03-27 08:14:482586
dtapuska899ac222017-01-03 18:09:162587 current_pointer_state_[kRawMousePointerId].modifiers_ = modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542588 WebMouseWheelEvent event(WebInputEvent::kMouseWheel,
dtapuska899ac222017-01-03 18:09:162589 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:062590 GetCurrentEventTime());
dtapuska899ac222017-01-03 18:09:162591 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:532592 current_pointer_state_[kRawMousePointerId].current_buttons_,
2593 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:162594 click_count_, &event);
Blink Reformat1c4d759e2017-04-09 16:34:542595 event.wheel_ticks_x = static_cast<float>(horizontal);
2596 event.wheel_ticks_y = static_cast<float>(vertical);
2597 event.delta_x = event.wheel_ticks_x;
2598 event.delta_y = event.wheel_ticks_y;
2599 event.scroll_by_page = paged;
2600 event.has_precise_scrolling_deltas = has_precise_scrolling_deltas;
dtapuska899ac222017-01-03 18:09:162601 event.phase = phase;
dtapuska43f18e9e2016-03-20 20:21:302602 if (scroll_type == MouseScrollType::PIXEL) {
Blink Reformat1c4d759e2017-04-09 16:34:542603 event.wheel_ticks_x /= kScrollbarPixelsPerTick;
2604 event.wheel_ticks_y /= kScrollbarPixelsPerTick;
[email protected]3db130e2014-03-27 08:14:482605 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542606 event.delta_x *= kScrollbarPixelsPerTick;
2607 event.delta_y *= kScrollbarPixelsPerTick;
[email protected]3db130e2014-03-27 08:14:482608 }
Ehsan Karamad0f83cb112018-09-06 22:07:362609 event.event_action = content::WebMouseWheelEventTraits::GetEventAction(event);
dtapuska899ac222017-01-03 18:09:162610 return event;
[email protected]3db130e2014-03-27 08:14:482611}
2612
e.hakkinen80033922015-07-31 08:41:352613// Radius fields radius_x and radius_y should eventually be moved to
2614// WebPointerProperties.
2615// TODO(e_hakkinen): Drop radius_{x,y}_pointer parameters once that happens.
2616void EventSender::InitPointerProperties(gin::Arguments* args,
mustaqabca6ff2016-06-09 17:29:532617 WebPointerProperties* e,
e.hakkinen80033922015-07-31 08:41:352618 float* radius_x_pointer,
2619 float* radius_y_pointer) {
2620 if (!args->PeekNext().IsEmpty()) {
2621 double radius_x;
2622 if (!args->GetNext(&radius_x)) {
2623 args->ThrowError();
2624 return;
2625 }
2626
2627 double radius_y = radius_x;
2628 if (!args->PeekNext().IsEmpty()) {
2629 if (!args->GetNext(&radius_y)) {
2630 args->ThrowError();
2631 return;
2632 }
2633 }
2634
2635 *radius_x_pointer = static_cast<float>(radius_x);
2636 *radius_y_pointer = static_cast<float>(radius_y);
2637 }
2638
2639 if (!args->PeekNext().IsEmpty()) {
2640 double force;
2641 if (!args->GetNext(&force)) {
2642 args->ThrowError();
2643 return;
2644 }
2645 e->force = static_cast<float>(force);
2646 }
2647
2648 if (!args->PeekNext().IsEmpty()) {
2649 int tiltX, tiltY;
2650 if (!args->GetNext(&tiltX) || !args->GetNext(&tiltY)) {
2651 args->ThrowError();
2652 return;
2653 }
Blink Reformat1c4d759e2017-04-09 16:34:542654 e->tilt_x = tiltX;
2655 e->tilt_y = tiltY;
e.hakkinen80033922015-07-31 08:41:352656 }
2657
chongzd65eacf2017-06-28 05:21:592658 if (!GetPointerType(args, false, e->pointer_type))
nzolghadr43146032016-04-11 15:33:382659 return;
e.hakkinen80033922015-07-31 08:41:352660}
2661
lukaszad322c5ca2016-10-07 00:32:342662void EventSender::FinishDragAndDrop(const WebMouseEvent& raw_event,
oshima76b6eeb2016-06-27 15:55:122663 blink::WebDragOperation drag_effect) {
lukaszad322c5ca2016-10-07 00:32:342664 std::unique_ptr<WebInputEvent> widget_event =
2665 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122666 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342667 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2668 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122669
[email protected]3db130e2014-03-27 08:14:482670 current_drag_effect_ = drag_effect;
2671 if (current_drag_effect_) {
2672 // Specifically pass any keyboard modifiers to the drop method. This allows
2673 // tests to control the drop type (i.e. copy or move).
Ella Ge80a52dce2017-11-15 18:01:522674 mainFrameWidget()->DragTargetDrop(
2675 current_drag_data_, event->PositionInWidget(),
2676 event->PositionInScreen(), event->GetModifiers());
[email protected]3db130e2014-03-27 08:14:482677 } else {
Ella Ge80a52dce2017-11-15 18:01:522678 mainFrameWidget()->DragTargetDragLeave(blink::WebFloatPoint(),
2679 blink::WebFloatPoint());
[email protected]3db130e2014-03-27 08:14:482680 }
Blink Reformat1c4d759e2017-04-09 16:34:542681 current_drag_data_.Reset();
Ella Ge80a52dce2017-11-15 18:01:522682 mainFrameWidget()->DragSourceEndedAt(event->PositionInWidget(),
2683 event->PositionInScreen(),
paulmeyer8fc8ea92016-11-15 05:12:212684 current_drag_effect_);
Blink Reformat1c4d759e2017-04-09 16:34:542685 mainFrameWidget()->DragSourceSystemDragEnded();
[email protected]3db130e2014-03-27 08:14:482686}
2687
lukaszad322c5ca2016-10-07 00:32:342688void EventSender::DoDragAfterMouseUp(const WebMouseEvent& raw_event) {
2689 std::unique_ptr<WebInputEvent> widget_event =
2690 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122691 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342692 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2693 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122694
Daniel Cheng224569ee2018-04-25 05:45:062695 last_click_time_ = event->TimeStamp();
mustaqabca6ff2016-06-09 17:29:532696 last_click_pos_ = current_pointer_state_[kRawMousePointerId].last_pos_;
[email protected]3db130e2014-03-27 08:14:482697
2698 // If we're in a drag operation, complete it.
Blink Reformat1c4d759e2017-04-09 16:34:542699 if (current_drag_data_.IsNull())
[email protected]3db130e2014-03-27 08:14:482700 return;
2701
Blink Reformat1c4d759e2017-04-09 16:34:542702 blink::WebDragOperation drag_effect = mainFrameWidget()->DragTargetDragOver(
Ella Ge80a52dce2017-11-15 18:01:522703 event->PositionInWidget(), event->PositionInScreen(),
2704 current_drag_effects_allowed_, event->GetModifiers());
sigbjornf8d568b122016-02-24 21:29:472705
2706 // Bail if dragover caused cancellation.
Blink Reformat1c4d759e2017-04-09 16:34:542707 if (current_drag_data_.IsNull())
sigbjornf8d568b122016-02-24 21:29:472708 return;
2709
lukaszad322c5ca2016-10-07 00:32:342710 FinishDragAndDrop(raw_event, drag_effect);
[email protected]3db130e2014-03-27 08:14:482711}
2712
lukaszad322c5ca2016-10-07 00:32:342713void EventSender::DoDragAfterMouseMove(const WebMouseEvent& raw_event) {
mustaqabca6ff2016-06-09 17:29:532714 if (current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542715 WebMouseEvent::Button::kNoButton ||
2716 current_drag_data_.IsNull()) {
[email protected]3db130e2014-03-27 08:14:482717 return;
2718 }
2719
lukaszad322c5ca2016-10-07 00:32:342720 std::unique_ptr<WebInputEvent> widget_event =
2721 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122722 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342723 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2724 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122725
Blink Reformat1c4d759e2017-04-09 16:34:542726 current_drag_effect_ = mainFrameWidget()->DragTargetDragOver(
Ella Ge80a52dce2017-11-15 18:01:522727 event->PositionInWidget(), event->PositionInScreen(),
2728 current_drag_effects_allowed_, event->GetModifiers());
[email protected]3db130e2014-03-27 08:14:482729}
2730
2731void EventSender::ReplaySavedEvents() {
2732 replaying_saved_events_ = true;
2733 while (!mouse_event_queue_.empty()) {
2734 SavedEvent e = mouse_event_queue_.front();
2735 mouse_event_queue_.pop_front();
2736
2737 switch (e.type) {
2738 case SavedEvent::TYPE_MOUSE_MOVE: {
dtapuska899ac222017-01-03 18:09:162739 current_pointer_state_[kRawMousePointerId].modifiers_ = e.modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542740 WebMouseEvent event(WebInputEvent::kMouseMove,
dtapuska899ac222017-01-03 18:09:162741 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:062742 GetCurrentEventTime());
nzolghadr43146032016-04-11 15:33:382743 InitMouseEvent(
mustaqabca6ff2016-06-09 17:29:532744 current_pointer_state_[kRawMousePointerId].pressed_button_,
2745 current_pointer_state_[kRawMousePointerId].current_buttons_, e.pos,
dtapuska899ac222017-01-03 18:09:162746 click_count_, &event);
mustaqabca6ff2016-06-09 17:29:532747 current_pointer_state_[kRawMousePointerId].last_pos_ =
Blink Reformat1c4d759e2017-04-09 16:34:542748 WebPoint(event.PositionInWidget().x, event.PositionInWidget().y);
nzolghadr43146032016-04-11 15:33:382749 HandleInputEventOnViewOrPopup(event);
2750 DoDragAfterMouseMove(event);
[email protected]3db130e2014-03-27 08:14:482751 break;
2752 }
2753 case SavedEvent::TYPE_LEAP_FORWARD:
2754 DoLeapForward(e.milliseconds);
2755 break;
2756 case SavedEvent::TYPE_MOUSE_UP: {
mustaqabca6ff2016-06-09 17:29:532757 current_pointer_state_[kRawMousePointerId].current_buttons_ &=
nzolghadr43146032016-04-11 15:33:382758 ~GetWebMouseEventModifierForButton(e.button_type);
mustaqabca6ff2016-06-09 17:29:532759 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:542760 WebMouseEvent::Button::kNoButton;
dtapuska899ac222017-01-03 18:09:162761 current_pointer_state_[kRawMousePointerId].modifiers_ = e.modifiers;
mustaq21aed4e2015-12-15 21:47:212762
Blink Reformat1c4d759e2017-04-09 16:34:542763 WebMouseEvent event(WebInputEvent::kMouseUp,
dtapuska899ac222017-01-03 18:09:162764 ModifiersForPointer(kRawMousePointerId),
Daniel Cheng224569ee2018-04-25 05:45:062765 GetCurrentEventTime());
mustaqabca6ff2016-06-09 17:29:532766 InitMouseEvent(
dtapuska899ac222017-01-03 18:09:162767 e.button_type,
mustaqabca6ff2016-06-09 17:29:532768 current_pointer_state_[kRawMousePointerId].current_buttons_,
dtapuska899ac222017-01-03 18:09:162769 current_pointer_state_[kRawMousePointerId].last_pos_, click_count_,
2770 &event);
nzolghadr43146032016-04-11 15:33:382771 HandleInputEventOnViewOrPopup(event);
2772 DoDragAfterMouseUp(event);
[email protected]3db130e2014-03-27 08:14:482773 break;
2774 }
2775 default:
2776 NOTREACHED();
2777 }
2778 }
2779
2780 replaying_saved_events_ = false;
2781}
2782
dtapuska5d2e9c32015-12-03 16:39:492783WebInputEventResult EventSender::HandleInputEventOnViewOrPopup(
lukaszad322c5ca2016-10-07 00:32:342784 const WebInputEvent& raw_event) {
Daniel Cheng224569ee2018-04-25 05:45:062785 last_event_timestamp_ = raw_event.TimeStamp();
oshima76b6eeb2016-06-27 15:55:122786
Blink Reformat1c4d759e2017-04-09 16:34:542787 WebPagePopup* popup = widget()->GetPagePopup();
2788 if (popup && !WebInputEvent::IsKeyboardEventType(raw_event.GetType())) {
lukaszad322c5ca2016-10-07 00:32:342789 // ui::ScaleWebInputEvent returns nullptr when the scale is 1.0f as the
2790 // event does not have to be converted.
2791 std::unique_ptr<WebInputEvent> scaled_event = ui::ScaleWebInputEvent(
2792 raw_event, delegate()->GetWindowToViewportScale());
2793 const WebInputEvent* popup_friendly_event =
2794 scaled_event.get() ? scaled_event.get() : &raw_event;
Blink Reformat1c4d759e2017-04-09 16:34:542795 return popup->HandleInputEvent(
nzolghadr5d8596502017-01-23 22:59:352796 blink::WebCoalescedInputEvent(*popup_friendly_event));
tkent588765612014-11-28 01:07:482797 }
lukaszad322c5ca2016-10-07 00:32:342798
2799 std::unique_ptr<WebInputEvent> widget_event =
2800 TransformScreenToWidgetCoordinates(raw_event);
2801 const WebInputEvent* event =
2802 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2803 : &raw_event;
Blink Reformat1c4d759e2017-04-09 16:34:542804 return widget()->HandleInputEvent(blink::WebCoalescedInputEvent(*event));
tkent588765612014-11-28 01:07:482805}
2806
dtapuska43f18e9e2016-03-20 20:21:302807void EventSender::SendGesturesForMouseWheelEvent(
2808 const WebMouseWheelEvent wheel_event) {
Daniel Cheng224569ee2018-04-25 05:45:062809 WebGestureEvent begin_event(WebInputEvent::kGestureScrollBegin,
2810 wheel_event.GetModifiers(), GetCurrentEventTime(),
2811 blink::kWebGestureDeviceTouchpad);
dtapuska899ac222017-01-03 18:09:162812 InitGestureEventFromMouseWheel(wheel_event, &begin_event);
Blink Reformat1c4d759e2017-04-09 16:34:542813 begin_event.data.scroll_begin.delta_x_hint = wheel_event.delta_x;
2814 begin_event.data.scroll_begin.delta_y_hint = wheel_event.delta_y;
2815 if (wheel_event.scroll_by_page) {
2816 begin_event.data.scroll_begin.delta_hint_units =
2817 blink::WebGestureEvent::kPage;
2818 if (begin_event.data.scroll_begin.delta_x_hint) {
2819 begin_event.data.scroll_begin.delta_x_hint =
2820 begin_event.data.scroll_begin.delta_x_hint > 0 ? 1 : -1;
dtapuska43f18e9e2016-03-20 20:21:302821 }
Blink Reformat1c4d759e2017-04-09 16:34:542822 if (begin_event.data.scroll_begin.delta_y_hint) {
2823 begin_event.data.scroll_begin.delta_y_hint =
2824 begin_event.data.scroll_begin.delta_y_hint > 0 ? 1 : -1;
dtapuska43f18e9e2016-03-20 20:21:302825 }
2826 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542827 begin_event.data.scroll_begin.delta_hint_units =
2828 wheel_event.has_precise_scrolling_deltas
2829 ? blink::WebGestureEvent::kPrecisePixels
2830 : blink::WebGestureEvent::kPixels;
dtapuska43f18e9e2016-03-20 20:21:302831 }
2832
2833 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532834 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
dtapuska43f18e9e2016-03-20 20:21:302835
2836 HandleInputEventOnViewOrPopup(begin_event);
2837
Ella Ge1116059d2018-03-21 02:06:132838 WebGestureEvent update_event(
2839 WebInputEvent::kGestureScrollUpdate, wheel_event.GetModifiers(),
Daniel Cheng224569ee2018-04-25 05:45:062840 GetCurrentEventTime(), blink::kWebGestureDeviceTouchpad);
dtapuska899ac222017-01-03 18:09:162841 InitGestureEventFromMouseWheel(wheel_event, &update_event);
Blink Reformat1c4d759e2017-04-09 16:34:542842 update_event.data.scroll_update.delta_x =
2843 begin_event.data.scroll_begin.delta_x_hint;
2844 update_event.data.scroll_update.delta_y =
2845 begin_event.data.scroll_begin.delta_y_hint;
2846 update_event.data.scroll_update.delta_units =
2847 begin_event.data.scroll_begin.delta_hint_units;
dtapuska43f18e9e2016-03-20 20:21:302848
2849 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532850 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
dtapuska43f18e9e2016-03-20 20:21:302851 HandleInputEventOnViewOrPopup(update_event);
2852
Daniel Cheng224569ee2018-04-25 05:45:062853 WebGestureEvent end_event(WebInputEvent::kGestureScrollEnd,
2854 wheel_event.GetModifiers(), GetCurrentEventTime(),
2855 blink::kWebGestureDeviceTouchpad);
dtapuska899ac222017-01-03 18:09:162856 InitGestureEventFromMouseWheel(wheel_event, &end_event);
Blink Reformat1c4d759e2017-04-09 16:34:542857 end_event.data.scroll_end.delta_units =
2858 begin_event.data.scroll_begin.delta_hint_units;
dtapuska43f18e9e2016-03-20 20:21:302859
2860 if (force_layout_on_events_)
Philip Rogers028845b72018-05-19 21:43:532861 widget()->UpdateLifecycle(blink::WebWidget::LifecycleUpdate::kPrePaint);
dtapuska43f18e9e2016-03-20 20:21:302862 HandleInputEventOnViewOrPopup(end_event);
2863}
2864
lukasza335bb762016-04-22 16:44:032865TestInterfaces* EventSender::interfaces() {
lukaszad322c5ca2016-10-07 00:32:342866 return web_widget_test_proxy_base_->web_view_test_proxy_base()
2867 ->test_interfaces();
lukasza335bb762016-04-22 16:44:032868}
2869
2870WebTestDelegate* EventSender::delegate() {
lukaszad322c5ca2016-10-07 00:32:342871 return web_widget_test_proxy_base_->web_view_test_proxy_base()->delegate();
lukasza335bb762016-04-22 16:44:032872}
2873
2874const blink::WebView* EventSender::view() const {
lukaszad322c5ca2016-10-07 00:32:342875 return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view();
lukasza335bb762016-04-22 16:44:032876}
2877
2878blink::WebView* EventSender::view() {
lukaszad322c5ca2016-10-07 00:32:342879 return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view();
lukasza335bb762016-04-22 16:44:032880}
2881
lukaszad322c5ca2016-10-07 00:32:342882blink::WebWidget* EventSender::widget() {
2883 return web_widget_test_proxy_base_->web_widget();
2884}
2885
paulmeyer90f6c31d2016-11-12 00:17:592886blink::WebFrameWidget* EventSender::mainFrameWidget() {
Blink Reformat1c4d759e2017-04-09 16:34:542887 return view()->MainFrame()->ToWebLocalFrame()->FrameWidget();
paulmeyer90f6c31d2016-11-12 00:17:592888}
2889
lukaszad322c5ca2016-10-07 00:32:342890std::unique_ptr<WebInputEvent> EventSender::TransformScreenToWidgetCoordinates(
oshima76b6eeb2016-06-27 15:55:122891 const WebInputEvent& event) {
lukaszad322c5ca2016-10-07 00:32:342892 return delegate()->TransformScreenToWidgetCoordinates(
2893 web_widget_test_proxy_base_, event);
oshima76b6eeb2016-06-27 15:55:122894}
2895
jochenf5f31752015-06-03 12:06:342896} // namespace test_runner