blob: 09d1aa059f49d29734b0c3187f1aa4e96907ada0 [file] [log] [blame]
[email protected]3db130e2014-03-27 08:14:481// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
dcheng59826e32017-02-22 10:31:365#include "content/shell/test_runner/event_sender.h"
[email protected]3db130e2014-03-27 08:14:486
avi5dd91f82015-12-25 22:30:467#include <stddef.h>
8
lukaszad322c5ca2016-10-07 00:32:349#include <memory>
10
lukaszac9358822016-04-07 14:43:4611#include "base/bind.h"
12#include "base/bind_helpers.h"
dtapuska43f18e9e2016-03-20 20:21:3013#include "base/command_line.h"
dcheng3dd85612017-02-08 10:46:2314#include "base/files/file_path.h"
[email protected]3db130e2014-03-27 08:14:4815#include "base/logging.h"
avi5dd91f82015-12-25 22:30:4616#include "base/macros.h"
esprehnd29ab802015-12-11 13:01:1917#include "base/strings/string16.h"
habib.virji565c80c2015-02-06 12:26:4318#include "base/strings/string_util.h"
[email protected]3db130e2014-03-27 08:14:4819#include "base/strings/stringprintf.h"
esprehnd29ab802015-12-11 13:01:1920#include "base/strings/utf_string_conversions.h"
avi5dd91f82015-12-25 22:30:4621#include "build/build_config.h"
dcheng59826e32017-02-22 10:31:3622#include "content/shell/test_runner/mock_spell_check.h"
23#include "content/shell/test_runner/test_interfaces.h"
24#include "content/shell/test_runner/web_test_delegate.h"
25#include "content/shell/test_runner/web_view_test_proxy.h"
26#include "content/shell/test_runner/web_widget_test_proxy.h"
[email protected]3db130e2014-03-27 08:14:4827#include "gin/handle.h"
28#include "gin/object_template_builder.h"
29#include "gin/wrappable.h"
dcheng3dd85612017-02-08 10:46:2330#include "net/base/filename_util.h"
31#include "third_party/WebKit/public/platform/URLConversion.h"
nzolghadr5d8596502017-01-23 22:59:3532#include "third_party/WebKit/public/platform/WebCoalescedInputEvent.h"
dtapuska836e1f92016-11-15 00:38:0633#include "third_party/WebKit/public/platform/WebGestureEvent.h"
dtapuskaa64845d2017-01-20 21:20:4534#include "third_party/WebKit/public/platform/WebKeyboardEvent.h"
mustaqcc6220fa2016-03-09 22:07:5435#include "third_party/WebKit/public/platform/WebPointerProperties.h"
[email protected]3db130e2014-03-27 08:14:4836#include "third_party/WebKit/public/platform/WebString.h"
dtapuskaa64845d2017-01-20 21:20:4537#include "third_party/WebKit/public/platform/WebTouchEvent.h"
[email protected]3db130e2014-03-27 08:14:4838#include "third_party/WebKit/public/platform/WebVector.h"
39#include "third_party/WebKit/public/web/WebContextMenuData.h"
paulmeyer90f6c31d2016-11-12 00:17:5940#include "third_party/WebKit/public/web/WebFrameWidget.h"
[email protected]3db130e2014-03-27 08:14:4841#include "third_party/WebKit/public/web/WebKit.h"
lukasza335bb762016-04-22 16:44:0342#include "third_party/WebKit/public/web/WebLocalFrame.h"
tkent588765612014-11-28 01:07:4843#include "third_party/WebKit/public/web/WebPagePopup.h"
Mustaq Ahmedc9b974a2018-01-22 19:43:4444#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
[email protected]3db130e2014-03-27 08:14:4845#include "third_party/WebKit/public/web/WebView.h"
oshima76b6eeb2016-06-27 15:55:1246#include "ui/events/blink/blink_event_util.h"
kpschoedel3b0960a2015-05-11 17:52:1147#include "ui/events/keycodes/dom/keycode_converter.h"
[email protected]a731f1a92014-04-17 19:31:0648#include "ui/events/keycodes/keyboard_codes.h"
[email protected]3db130e2014-03-27 08:14:4849#include "v8/include/v8.h"
50
[email protected]3db130e2014-03-27 08:14:4851using blink::WebContextMenuData;
52using blink::WebDragData;
53using blink::WebDragOperationsMask;
54using blink::WebFloatPoint;
[email protected]3db130e2014-03-27 08:14:4855using blink::WebGestureEvent;
56using blink::WebInputEvent;
dtapuska5d2e9c32015-12-03 16:39:4957using blink::WebInputEventResult;
[email protected]3db130e2014-03-27 08:14:4858using blink::WebKeyboardEvent;
lukasza335bb762016-04-22 16:44:0359using blink::WebLocalFrame;
[email protected]f9634a82014-08-05 13:10:1960using blink::WebMenuItemInfo;
[email protected]3db130e2014-03-27 08:14:4861using blink::WebMouseEvent;
62using blink::WebMouseWheelEvent;
tkent588765612014-11-28 01:07:4863using blink::WebPagePopup;
[email protected]3db130e2014-03-27 08:14:4864using blink::WebPoint;
Navid Zolghadr24ff17d2018-01-24 20:58:0465using blink::WebPointerEvent;
mustaqcc6220fa2016-03-09 22:07:5466using blink::WebPointerProperties;
[email protected]3db130e2014-03-27 08:14:4867using blink::WebString;
68using blink::WebTouchEvent;
69using blink::WebTouchPoint;
dcheng3dd85612017-02-08 10:46:2370using blink::WebURL;
[email protected]3db130e2014-03-27 08:14:4871using blink::WebVector;
72using blink::WebView;
73
jochenf5f31752015-06-03 12:06:3474namespace test_runner {
[email protected]3db130e2014-03-27 08:14:4875
76namespace {
77
mustaqabca6ff2016-06-09 17:29:5378const int kRawMousePointerId = -1;
mustaq758b1152016-09-02 22:06:4379const char* const kPointerTypeStringUnknown = "";
80const char* const kPointerTypeStringMouse = "mouse";
81const char* const kPointerTypeStringTouch = "touch";
82const char* const kPointerTypeStringPen = "pen";
83const char* const kPointerTypeStringEraser = "eraser";
nzolghadr43146032016-04-11 15:33:3884
85// Assigns |pointerType| from the provided |args|. Returns false if there was
86// any error.
chongzd65eacf2017-06-28 05:21:5987bool GetPointerType(gin::Arguments* args,
nzolghadr43146032016-04-11 15:33:3888 bool isOnlyMouseAndPenAllowed,
mustaqabca6ff2016-06-09 17:29:5389 WebPointerProperties::PointerType& pointerType) {
nzolghadr43146032016-04-11 15:33:3890 if (args->PeekNext().IsEmpty())
91 return true;
92 std::string pointer_type_string;
93 if (!args->GetNext(&pointer_type_string)) {
94 args->ThrowError();
95 return false;
96 }
97 if (isOnlyMouseAndPenAllowed &&
98 (pointer_type_string == kPointerTypeStringUnknown ||
99 pointer_type_string == kPointerTypeStringTouch)) {
100 args->ThrowError();
101 return false;
102 }
103 if (pointer_type_string == kPointerTypeStringUnknown) {
Blink Reformat1c4d759e2017-04-09 16:34:54104 pointerType = WebMouseEvent::PointerType::kUnknown;
nzolghadr43146032016-04-11 15:33:38105 } else if (pointer_type_string == kPointerTypeStringMouse) {
Blink Reformat1c4d759e2017-04-09 16:34:54106 pointerType = WebMouseEvent::PointerType::kMouse;
nzolghadr43146032016-04-11 15:33:38107 } else if (pointer_type_string == kPointerTypeStringTouch) {
Blink Reformat1c4d759e2017-04-09 16:34:54108 pointerType = WebMouseEvent::PointerType::kTouch;
mustaq758b1152016-09-02 22:06:43109 } else if (pointer_type_string == kPointerTypeStringPen) {
Blink Reformat1c4d759e2017-04-09 16:34:54110 pointerType = WebMouseEvent::PointerType::kPen;
mustaq758b1152016-09-02 22:06:43111 } else if (pointer_type_string == kPointerTypeStringEraser) {
Blink Reformat1c4d759e2017-04-09 16:34:54112 pointerType = WebMouseEvent::PointerType::kEraser;
nzolghadr43146032016-04-11 15:33:38113 } else {
114 args->ThrowError();
115 return false;
116 }
117 return true;
118}
119
Navid Zolghadr24ff17d2018-01-24 20:58:04120WebInputEvent::Type PointerEventTypeForTouchPointState(
121 WebTouchPoint::State state) {
122 switch (state) {
123 case WebTouchPoint::kStateReleased:
124 return WebInputEvent::Type::kPointerUp;
125 case WebTouchPoint::kStateCancelled:
126 return WebInputEvent::Type::kPointerCancel;
127 case WebTouchPoint::kStatePressed:
128 return WebInputEvent::Type::kPointerDown;
129 case WebTouchPoint::kStateMoved:
130 return WebInputEvent::Type::kPointerMove;
131 case WebTouchPoint::kStateStationary:
132 default:
133 NOTREACHED();
134 return WebInputEvent::Type::kUndefined;
135 }
136}
137
mustaqabca6ff2016-06-09 17:29:53138// Parses |pointerType|, |rawPointerId|, |pressure|, |tiltX| and |tiltY| from
139// the provided |args|. Returns false if there was any error, assuming the last
140// 3 of the five parsed parameters are optional.
141bool getMousePenPointerProperties(
nzolghadr43146032016-04-11 15:33:38142 gin::Arguments* args,
mustaqabca6ff2016-06-09 17:29:53143 WebPointerProperties::PointerType& pointerType,
144 int& rawPointerId,
145 float& pressure,
146 int& tiltX,
147 int& tiltY) {
Blink Reformat1c4d759e2017-04-09 16:34:54148 pointerType = WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:53149 rawPointerId = kRawMousePointerId;
150 pressure = std::numeric_limits<float>::quiet_NaN();
151 tiltX = 0;
152 tiltY = 0;
153
nzolghadr43146032016-04-11 15:33:38154 // Only allow pen or mouse through this API.
chongzd65eacf2017-06-28 05:21:59155 if (!GetPointerType(args, false, pointerType))
nzolghadr43146032016-04-11 15:33:38156 return false;
157 if (!args->PeekNext().IsEmpty()) {
mustaqabca6ff2016-06-09 17:29:53158 if (!args->GetNext(&rawPointerId)) {
nzolghadr43146032016-04-11 15:33:38159 args->ThrowError();
160 return false;
161 }
mustaqabca6ff2016-06-09 17:29:53162
163 // Parse optional params
164 if (!args->PeekNext().IsEmpty()) {
165 if (!args->GetNext(&pressure)) {
166 args->ThrowError();
167 return false;
168 }
169 if (!args->PeekNext().IsEmpty()) {
170 if (!args->GetNext(&tiltX)) {
171 args->ThrowError();
172 return false;
173 }
174 if (!args->PeekNext().IsEmpty()) {
175 if (!args->GetNext(&tiltY)) {
176 args->ThrowError();
177 return false;
178 }
179 }
180 }
nzolghadr43146032016-04-11 15:33:38181 }
nzolghadr43146032016-04-11 15:33:38182 }
mustaqabca6ff2016-06-09 17:29:53183
nzolghadr43146032016-04-11 15:33:38184 return true;
185}
186
mustaq8911f4e2015-10-27 18:10:22187WebMouseEvent::Button GetButtonTypeFromButtonNumber(int button_code) {
188 switch (button_code) {
189 case -1:
Blink Reformat1c4d759e2017-04-09 16:34:54190 return WebMouseEvent::Button::kNoButton;
mustaq8911f4e2015-10-27 18:10:22191 case 0:
Blink Reformat1c4d759e2017-04-09 16:34:54192 return WebMouseEvent::Button::kLeft;
mustaq8911f4e2015-10-27 18:10:22193 case 1:
Blink Reformat1c4d759e2017-04-09 16:34:54194 return WebMouseEvent::Button::kMiddle;
mustaq8911f4e2015-10-27 18:10:22195 case 2:
Blink Reformat1c4d759e2017-04-09 16:34:54196 return WebMouseEvent::Button::kRight;
mustaq6ee1f8d2017-03-31 19:23:04197 case 3:
Blink Reformat1c4d759e2017-04-09 16:34:54198 return WebMouseEvent::Button::kBack;
mustaq6ee1f8d2017-03-31 19:23:04199 case 4:
Blink Reformat1c4d759e2017-04-09 16:34:54200 return WebMouseEvent::Button::kForward;
mustaq8911f4e2015-10-27 18:10:22201 }
202 NOTREACHED();
Blink Reformat1c4d759e2017-04-09 16:34:54203 return WebMouseEvent::Button::kNoButton;
mustaq8911f4e2015-10-27 18:10:22204}
205
mustaq21aed4e2015-12-15 21:47:21206int GetWebMouseEventModifierForButton(WebMouseEvent::Button button) {
207 switch (button) {
Blink Reformat1c4d759e2017-04-09 16:34:54208 case WebMouseEvent::Button::kNoButton:
mustaq21aed4e2015-12-15 21:47:21209 return 0;
Blink Reformat1c4d759e2017-04-09 16:34:54210 case WebMouseEvent::Button::kLeft:
211 return WebMouseEvent::kLeftButtonDown;
212 case WebMouseEvent::Button::kMiddle:
213 return WebMouseEvent::kMiddleButtonDown;
214 case WebMouseEvent::Button::kRight:
215 return WebMouseEvent::kRightButtonDown;
216 case WebPointerProperties::Button::kBack:
217 return WebMouseEvent::kBackButtonDown;
218 case WebPointerProperties::Button::kForward:
219 return WebMouseEvent::kForwardButtonDown;
220 case WebPointerProperties::Button::kEraser:
dcheng59826e32017-02-22 10:31:36221 return 0; // Not implemented yet
mustaq21aed4e2015-12-15 21:47:21222 }
223 NOTREACHED();
224 return 0;
225}
226
mustaq6ee1f8d2017-03-31 19:23:04227const int kButtonsInModifiers =
Blink Reformat1c4d759e2017-04-09 16:34:54228 WebMouseEvent::kLeftButtonDown | WebMouseEvent::kMiddleButtonDown |
229 WebMouseEvent::kRightButtonDown | WebMouseEvent::kBackButtonDown |
230 WebMouseEvent::kForwardButtonDown;
mustaq21aed4e2015-12-15 21:47:21231
nzolghadr65468b42016-01-19 14:03:58232int modifiersWithButtons(int modifiers, int buttons) {
dcheng59826e32017-02-22 10:31:36233 return (modifiers & ~kButtonsInModifiers) | (buttons & kButtonsInModifiers);
nzolghadr65468b42016-01-19 14:03:58234}
235
dtapuska899ac222017-01-03 18:09:16236void InitMouseEventGeneric(WebMouseEvent::Button b,
mustaqabca6ff2016-06-09 17:29:53237 int current_buttons,
238 const WebPoint& pos,
mustaqabca6ff2016-06-09 17:29:53239 int click_count,
mustaqabca6ff2016-06-09 17:29:53240 WebPointerProperties::PointerType pointerType,
241 int pointerId,
242 float pressure,
243 int tiltX,
244 int tiltY,
245 WebMouseEvent* e) {
[email protected]3db130e2014-03-27 08:14:48246 e->button = b;
Blink Reformat1c4d759e2017-04-09 16:34:54247 e->SetPositionInWidget(pos.x, pos.y);
248 e->SetPositionInScreen(pos.x, pos.y);
249 e->pointer_type = pointerType;
nzolghadr43146032016-04-11 15:33:38250 e->id = pointerId;
mustaqabca6ff2016-06-09 17:29:53251 e->force = pressure;
Blink Reformat1c4d759e2017-04-09 16:34:54252 e->tilt_x = tiltX;
253 e->tilt_y = tiltY;
254 e->click_count = click_count;
[email protected]3db130e2014-03-27 08:14:48255}
256
dtapuska899ac222017-01-03 18:09:16257void InitMouseEvent(WebMouseEvent::Button b,
mustaqabca6ff2016-06-09 17:29:53258 int current_buttons,
259 const WebPoint& pos,
mustaqabca6ff2016-06-09 17:29:53260 int click_count,
mustaqabca6ff2016-06-09 17:29:53261 WebMouseEvent* e) {
dtapuska899ac222017-01-03 18:09:16262 InitMouseEventGeneric(b, current_buttons, pos, click_count,
Blink Reformat1c4d759e2017-04-09 16:34:54263 WebPointerProperties::PointerType::kMouse, 0, 0.0, 0, 0,
dtapuska899ac222017-01-03 18:09:16264 e);
mustaqabca6ff2016-06-09 17:29:53265}
266
dtapuska899ac222017-01-03 18:09:16267void InitGestureEventFromMouseWheel(const WebMouseWheelEvent& wheel_event,
dtapuska43f18e9e2016-03-20 20:21:30268 WebGestureEvent* gesture_event) {
Blink Reformat1c4d759e2017-04-09 16:34:54269 gesture_event->source_device = blink::kWebGestureDeviceTouchpad;
270 gesture_event->x = wheel_event.PositionInWidget().x;
271 gesture_event->y = wheel_event.PositionInWidget().y;
272 gesture_event->global_x = wheel_event.PositionInScreen().x;
273 gesture_event->global_y = wheel_event.PositionInScreen().y;
dtapuska43f18e9e2016-03-20 20:21:30274}
275
[email protected]3db130e2014-03-27 08:14:48276int GetKeyModifier(const std::string& modifier_name) {
277 const char* characters = modifier_name.c_str();
278 if (!strcmp(characters, "ctrlKey")
279#ifndef __APPLE__
280 || !strcmp(characters, "addSelectionKey")
281#endif
dcheng59826e32017-02-22 10:31:36282 ) {
Blink Reformat1c4d759e2017-04-09 16:34:54283 return WebInputEvent::kControlKey;
[email protected]3db130e2014-03-27 08:14:48284 } else if (!strcmp(characters, "shiftKey") ||
285 !strcmp(characters, "rangeSelectionKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54286 return WebInputEvent::kShiftKey;
[email protected]3db130e2014-03-27 08:14:48287 } else if (!strcmp(characters, "altKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54288 return WebInputEvent::kAltKey;
[email protected]3db130e2014-03-27 08:14:48289#ifdef __APPLE__
290 } else if (!strcmp(characters, "metaKey") ||
291 !strcmp(characters, "addSelectionKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54292 return WebInputEvent::kMetaKey;
[email protected]3db130e2014-03-27 08:14:48293#else
294 } else if (!strcmp(characters, "metaKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54295 return WebInputEvent::kMetaKey;
[email protected]3db130e2014-03-27 08:14:48296#endif
297 } else if (!strcmp(characters, "autoRepeat")) {
Blink Reformat1c4d759e2017-04-09 16:34:54298 return WebInputEvent::kIsAutoRepeat;
[email protected]3db130e2014-03-27 08:14:48299 } else if (!strcmp(characters, "copyKey")) {
300#ifdef __APPLE__
Blink Reformat1c4d759e2017-04-09 16:34:54301 return WebInputEvent::kAltKey;
[email protected]3db130e2014-03-27 08:14:48302#else
Blink Reformat1c4d759e2017-04-09 16:34:54303 return WebInputEvent::kControlKey;
[email protected]3db130e2014-03-27 08:14:48304#endif
tkentc8c0bc82015-10-15 22:43:48305 } else if (!strcmp(characters, "accessKey")) {
306#ifdef __APPLE__
Blink Reformat1c4d759e2017-04-09 16:34:54307 return WebInputEvent::kAltKey | WebInputEvent::kControlKey;
tkentc8c0bc82015-10-15 22:43:48308#else
Blink Reformat1c4d759e2017-04-09 16:34:54309 return WebInputEvent::kAltKey;
tkentc8c0bc82015-10-15 22:43:48310#endif
jinho.bangffc700e2014-11-17 04:05:26311 } else if (!strcmp(characters, "leftButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54312 return WebInputEvent::kLeftButtonDown;
jinho.bangffc700e2014-11-17 04:05:26313 } else if (!strcmp(characters, "middleButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54314 return WebInputEvent::kMiddleButtonDown;
jinho.bangffc700e2014-11-17 04:05:26315 } else if (!strcmp(characters, "rightButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54316 return WebInputEvent::kRightButtonDown;
mustaq6ee1f8d2017-03-31 19:23:04317 } else if (!strcmp(characters, "backButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54318 return WebInputEvent::kBackButtonDown;
mustaq6ee1f8d2017-03-31 19:23:04319 } else if (!strcmp(characters, "forwardButton")) {
Blink Reformat1c4d759e2017-04-09 16:34:54320 return WebInputEvent::kForwardButtonDown;
dtapuska299efe12015-10-05 16:53:44321 } else if (!strcmp(characters, "capsLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54322 return WebInputEvent::kCapsLockOn;
dtapuska299efe12015-10-05 16:53:44323 } else if (!strcmp(characters, "numLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54324 return WebInputEvent::kNumLockOn;
dtapuska299efe12015-10-05 16:53:44325 } else if (!strcmp(characters, "locationLeft")) {
Blink Reformat1c4d759e2017-04-09 16:34:54326 return WebInputEvent::kIsLeft;
dtapuska299efe12015-10-05 16:53:44327 } else if (!strcmp(characters, "locationRight")) {
Blink Reformat1c4d759e2017-04-09 16:34:54328 return WebInputEvent::kIsRight;
dtapuska299efe12015-10-05 16:53:44329 } else if (!strcmp(characters, "locationNumpad")) {
Blink Reformat1c4d759e2017-04-09 16:34:54330 return WebInputEvent::kIsKeyPad;
dtapuska299efe12015-10-05 16:53:44331 } else if (!strcmp(characters, "isComposing")) {
Blink Reformat1c4d759e2017-04-09 16:34:54332 return WebInputEvent::kIsComposing;
dtapuska299efe12015-10-05 16:53:44333 } else if (!strcmp(characters, "altGraphKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54334 return WebInputEvent::kAltGrKey;
dtapuska299efe12015-10-05 16:53:44335 } else if (!strcmp(characters, "fnKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54336 return WebInputEvent::kFnKey;
dtapuska299efe12015-10-05 16:53:44337 } else if (!strcmp(characters, "symbolKey")) {
Blink Reformat1c4d759e2017-04-09 16:34:54338 return WebInputEvent::kSymbolKey;
dtapuska299efe12015-10-05 16:53:44339 } else if (!strcmp(characters, "scrollLockOn")) {
Blink Reformat1c4d759e2017-04-09 16:34:54340 return WebInputEvent::kScrollLockOn;
[email protected]3db130e2014-03-27 08:14:48341 }
342
343 return 0;
344}
345
346int GetKeyModifiers(const std::vector<std::string>& modifier_names) {
347 int modifiers = 0;
348 for (std::vector<std::string>::const_iterator it = modifier_names.begin();
349 it != modifier_names.end(); ++it) {
350 modifiers |= GetKeyModifier(*it);
351 }
352 return modifiers;
353}
354
bashidbd2ef9bb2015-06-02 01:39:32355int GetKeyModifiersFromV8(v8::Isolate* isolate, v8::Local<v8::Value> value) {
[email protected]3db130e2014-03-27 08:14:48356 std::vector<std::string> modifier_names;
357 if (value->IsString()) {
358 modifier_names.push_back(gin::V8ToString(value));
359 } else if (value->IsArray()) {
dcheng59826e32017-02-22 10:31:36360 gin::Converter<std::vector<std::string>>::FromV8(isolate, value,
361 &modifier_names);
[email protected]3db130e2014-03-27 08:14:48362 }
363 return GetKeyModifiers(modifier_names);
364}
365
chongzb92d7112016-07-04 22:11:54366WebMouseWheelEvent::Phase GetMouseWheelEventPhase(
367 const std::string& phase_name) {
368 if (phase_name == "phaseNone") {
Blink Reformat1c4d759e2017-04-09 16:34:54369 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54370 } else if (phase_name == "phaseBegan") {
Blink Reformat1c4d759e2017-04-09 16:34:54371 return WebMouseWheelEvent::kPhaseBegan;
chongzb92d7112016-07-04 22:11:54372 } else if (phase_name == "phaseStationary") {
Blink Reformat1c4d759e2017-04-09 16:34:54373 return WebMouseWheelEvent::kPhaseStationary;
chongzb92d7112016-07-04 22:11:54374 } else if (phase_name == "phaseChanged") {
Blink Reformat1c4d759e2017-04-09 16:34:54375 return WebMouseWheelEvent::kPhaseChanged;
chongzb92d7112016-07-04 22:11:54376 } else if (phase_name == "phaseEnded") {
Blink Reformat1c4d759e2017-04-09 16:34:54377 return WebMouseWheelEvent::kPhaseEnded;
chongzb92d7112016-07-04 22:11:54378 } else if (phase_name == "phaseCancelled") {
Blink Reformat1c4d759e2017-04-09 16:34:54379 return WebMouseWheelEvent::kPhaseCancelled;
chongzb92d7112016-07-04 22:11:54380 } else if (phase_name == "phaseMayBegin") {
Blink Reformat1c4d759e2017-04-09 16:34:54381 return WebMouseWheelEvent::kPhaseMayBegin;
chongzb92d7112016-07-04 22:11:54382 }
383
Blink Reformat1c4d759e2017-04-09 16:34:54384 return WebMouseWheelEvent::kPhaseNone;
chongzb92d7112016-07-04 22:11:54385}
386
387WebMouseWheelEvent::Phase GetMouseWheelEventPhaseFromV8(
388 v8::Local<v8::Value> value) {
389 if (value->IsString())
390 return GetMouseWheelEventPhase(gin::V8ToString(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.
396const double kMultipleClickTimeSec = 1;
397const 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();
[email protected]3db130e2014-03-27 08:14:48613 void GestureScrollFirstPoint(int x, int 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);
ccameronb81b8072015-01-30 00:54:49626 void GesturePinchBegin(gin::Arguments* args);
627 void GesturePinchEnd(gin::Arguments* args);
628 void GesturePinchUpdate(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48629 void GestureTap(gin::Arguments* args);
630 void GestureTapDown(gin::Arguments* args);
631 void GestureShowPress(gin::Arguments* args);
632 void GestureTapCancel(gin::Arguments* args);
633 void GestureLongPress(gin::Arguments* args);
634 void GestureLongTap(gin::Arguments* args);
635 void GestureTwoFingerTap(gin::Arguments* args);
636 void ContinuousMouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48637 void MouseMoveTo(gin::Arguments* args);
lanwei0474c2a52017-05-12 18:52:01638 void MouseLeave(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48639 void MouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48640 void ScheduleAsynchronousClick(gin::Arguments* args);
641 void ScheduleAsynchronousKeyDown(gin::Arguments* args);
Mustaq Ahmedc9b974a2018-01-22 19:43:44642 void ConsumeUserActivation();
[email protected]3db130e2014-03-27 08:14:48643 void MouseDown(gin::Arguments* args);
644 void MouseUp(gin::Arguments* args);
mustaq21aed4e2015-12-15 21:47:21645 void SetMouseButtonState(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48646 void KeyDown(gin::Arguments* args);
647
648 // Binding properties:
649 bool ForceLayoutOnEvents() const;
650 void SetForceLayoutOnEvents(bool force);
651 bool IsDragMode() const;
652 void SetIsDragMode(bool drag_mode);
653
654#if defined(OS_WIN)
655 int WmKeyDown() const;
656 void SetWmKeyDown(int key_down);
657
658 int WmKeyUp() const;
659 void SetWmKeyUp(int key_up);
660
661 int WmChar() const;
662 void SetWmChar(int wm_char);
663
664 int WmDeadChar() const;
665 void SetWmDeadChar(int dead_char);
666
667 int WmSysKeyDown() const;
668 void SetWmSysKeyDown(int key_down);
669
670 int WmSysKeyUp() const;
671 void SetWmSysKeyUp(int key_up);
672
673 int WmSysChar() const;
674 void SetWmSysChar(int sys_char);
675
676 int WmSysDeadChar() const;
677 void SetWmSysDeadChar(int sys_dead_char);
678#endif
679
680 base::WeakPtr<EventSender> sender_;
681
682 DISALLOW_COPY_AND_ASSIGN(EventSenderBindings);
683};
684
685gin::WrapperInfo EventSenderBindings::kWrapperInfo = {gin::kEmbedderNativeGin};
686
687EventSenderBindings::EventSenderBindings(base::WeakPtr<EventSender> sender)
dcheng59826e32017-02-22 10:31:36688 : sender_(sender) {}
[email protected]3db130e2014-03-27 08:14:48689
690EventSenderBindings::~EventSenderBindings() {}
691
692// static
693void EventSenderBindings::Install(base::WeakPtr<EventSender> sender,
lukasza335bb762016-04-22 16:44:03694 WebLocalFrame* frame) {
Blink Reformat1c4d759e2017-04-09 16:34:54695 v8::Isolate* isolate = blink::MainThreadIsolate();
[email protected]3db130e2014-03-27 08:14:48696 v8::HandleScope handle_scope(isolate);
Blink Reformat1c4d759e2017-04-09 16:34:54697 v8::Local<v8::Context> context = frame->MainWorldScriptContext();
[email protected]3db130e2014-03-27 08:14:48698 if (context.IsEmpty())
699 return;
700
701 v8::Context::Scope context_scope(context);
702
703 gin::Handle<EventSenderBindings> bindings =
704 gin::CreateHandle(isolate, new EventSenderBindings(sender));
[email protected]ad4d2032014-04-28 13:50:59705 if (bindings.IsEmpty())
706 return;
deepak.s750d68f2015-04-30 07:32:41707 v8::Local<v8::Object> global = context->Global();
[email protected]3db130e2014-03-27 08:14:48708 global->Set(gin::StringToV8(isolate, "eventSender"), bindings.ToV8());
709}
710
dcheng59826e32017-02-22 10:31:36711gin::ObjectTemplateBuilder EventSenderBindings::GetObjectTemplateBuilder(
712 v8::Isolate* isolate) {
[email protected]3db130e2014-03-27 08:14:48713 return gin::Wrappable<EventSenderBindings>::GetObjectTemplateBuilder(isolate)
714 .SetMethod("enableDOMUIEventLogging",
715 &EventSenderBindings::EnableDOMUIEventLogging)
716 .SetMethod("fireKeyboardEventsToElement",
717 &EventSenderBindings::FireKeyboardEventsToElement)
718 .SetMethod("clearKillRing", &EventSenderBindings::ClearKillRing)
719 .SetMethod("contextClick", &EventSenderBindings::ContextClick)
720 .SetMethod("textZoomIn", &EventSenderBindings::TextZoomIn)
721 .SetMethod("textZoomOut", &EventSenderBindings::TextZoomOut)
722 .SetMethod("zoomPageIn", &EventSenderBindings::ZoomPageIn)
723 .SetMethod("zoomPageOut", &EventSenderBindings::ZoomPageOut)
[email protected]b32fe542014-04-30 08:42:06724 .SetMethod("setPageZoomFactor", &EventSenderBindings::SetPageZoomFactor)
[email protected]3db130e2014-03-27 08:14:48725 .SetMethod("clearTouchPoints", &EventSenderBindings::ClearTouchPoints)
726 .SetMethod("releaseTouchPoint", &EventSenderBindings::ReleaseTouchPoint)
727 .SetMethod("updateTouchPoint", &EventSenderBindings::UpdateTouchPoint)
728 .SetMethod("cancelTouchPoint", &EventSenderBindings::CancelTouchPoint)
729 .SetMethod("setTouchModifier", &EventSenderBindings::SetTouchModifier)
[email protected]ace1cd502014-04-24 21:05:30730 .SetMethod("setTouchCancelable", &EventSenderBindings::SetTouchCancelable)
[email protected]3db130e2014-03-27 08:14:48731 .SetMethod("dumpFilenameBeingDragged",
732 &EventSenderBindings::DumpFilenameBeingDragged)
733 .SetMethod("gestureFlingCancel", &EventSenderBindings::GestureFlingCancel)
734 .SetMethod("gestureFlingStart", &EventSenderBindings::GestureFlingStart)
tdresserd7bba522016-02-19 22:40:13735 .SetMethod("isFlinging", &EventSenderBindings::IsFlinging)
[email protected]3db130e2014-03-27 08:14:48736 .SetMethod("gestureScrollFirstPoint",
737 &EventSenderBindings::GestureScrollFirstPoint)
738 .SetMethod("touchStart", &EventSenderBindings::TouchStart)
739 .SetMethod("touchMove", &EventSenderBindings::TouchMove)
740 .SetMethod("touchCancel", &EventSenderBindings::TouchCancel)
741 .SetMethod("touchEnd", &EventSenderBindings::TouchEnd)
mustaqb3c44a02016-04-19 18:49:05742 .SetMethod("notifyStartOfTouchScroll",
743 &EventSenderBindings::NotifyStartOfTouchScroll)
[email protected]3db130e2014-03-27 08:14:48744 .SetMethod("leapForward", &EventSenderBindings::LeapForward)
majidvpbfabb0712015-10-02 16:30:00745 .SetMethod("lastEventTimestamp", &EventSenderBindings::LastEventTimestamp)
[email protected]3db130e2014-03-27 08:14:48746 .SetMethod("beginDragWithFiles", &EventSenderBindings::BeginDragWithFiles)
747 .SetMethod("addTouchPoint", &EventSenderBindings::AddTouchPoint)
[email protected]3db130e2014-03-27 08:14:48748 .SetMethod("gestureScrollBegin", &EventSenderBindings::GestureScrollBegin)
749 .SetMethod("gestureScrollEnd", &EventSenderBindings::GestureScrollEnd)
750 .SetMethod("gestureScrollUpdate",
751 &EventSenderBindings::GestureScrollUpdate)
ccameronb81b8072015-01-30 00:54:49752 .SetMethod("gesturePinchBegin", &EventSenderBindings::GesturePinchBegin)
753 .SetMethod("gesturePinchEnd", &EventSenderBindings::GesturePinchEnd)
754 .SetMethod("gesturePinchUpdate", &EventSenderBindings::GesturePinchUpdate)
[email protected]3db130e2014-03-27 08:14:48755 .SetMethod("gestureTap", &EventSenderBindings::GestureTap)
756 .SetMethod("gestureTapDown", &EventSenderBindings::GestureTapDown)
757 .SetMethod("gestureShowPress", &EventSenderBindings::GestureShowPress)
758 .SetMethod("gestureTapCancel", &EventSenderBindings::GestureTapCancel)
759 .SetMethod("gestureLongPress", &EventSenderBindings::GestureLongPress)
760 .SetMethod("gestureLongTap", &EventSenderBindings::GestureLongTap)
761 .SetMethod("gestureTwoFingerTap",
762 &EventSenderBindings::GestureTwoFingerTap)
763 .SetMethod("continuousMouseScrollBy",
764 &EventSenderBindings::ContinuousMouseScrollBy)
[email protected]3db130e2014-03-27 08:14:48765 .SetMethod("keyDown", &EventSenderBindings::KeyDown)
766 .SetMethod("mouseDown", &EventSenderBindings::MouseDown)
767 .SetMethod("mouseMoveTo", &EventSenderBindings::MouseMoveTo)
myid.shin12c7fea22015-03-06 02:31:24768 .SetMethod("mouseLeave", &EventSenderBindings::MouseLeave)
[email protected]3db130e2014-03-27 08:14:48769 .SetMethod("mouseScrollBy", &EventSenderBindings::MouseScrollBy)
770 .SetMethod("mouseUp", &EventSenderBindings::MouseUp)
mustaq21aed4e2015-12-15 21:47:21771 .SetMethod("setMouseButtonState",
772 &EventSenderBindings::SetMouseButtonState)
[email protected]3db130e2014-03-27 08:14:48773 .SetMethod("scheduleAsynchronousClick",
774 &EventSenderBindings::ScheduleAsynchronousClick)
775 .SetMethod("scheduleAsynchronousKeyDown",
776 &EventSenderBindings::ScheduleAsynchronousKeyDown)
Mustaq Ahmedc9b974a2018-01-22 19:43:44777 .SetMethod("consumeUserActivation",
778 &EventSenderBindings::ConsumeUserActivation)
[email protected]3db130e2014-03-27 08:14:48779 .SetProperty("forceLayoutOnEvents",
780 &EventSenderBindings::ForceLayoutOnEvents,
781 &EventSenderBindings::SetForceLayoutOnEvents)
[email protected]3db130e2014-03-27 08:14:48782#if defined(OS_WIN)
mustaq96985f722015-06-30 21:41:53783 .SetProperty("WM_KEYDOWN", &EventSenderBindings::WmKeyDown,
[email protected]3db130e2014-03-27 08:14:48784 &EventSenderBindings::SetWmKeyDown)
mustaq96985f722015-06-30 21:41:53785 .SetProperty("WM_KEYUP", &EventSenderBindings::WmKeyUp,
[email protected]3db130e2014-03-27 08:14:48786 &EventSenderBindings::SetWmKeyUp)
mustaq96985f722015-06-30 21:41:53787 .SetProperty("WM_CHAR", &EventSenderBindings::WmChar,
[email protected]3db130e2014-03-27 08:14:48788 &EventSenderBindings::SetWmChar)
mustaq96985f722015-06-30 21:41:53789 .SetProperty("WM_DEADCHAR", &EventSenderBindings::WmDeadChar,
[email protected]3db130e2014-03-27 08:14:48790 &EventSenderBindings::SetWmDeadChar)
mustaq96985f722015-06-30 21:41:53791 .SetProperty("WM_SYSKEYDOWN", &EventSenderBindings::WmSysKeyDown,
[email protected]3db130e2014-03-27 08:14:48792 &EventSenderBindings::SetWmSysKeyDown)
mustaq96985f722015-06-30 21:41:53793 .SetProperty("WM_SYSKEYUP", &EventSenderBindings::WmSysKeyUp,
[email protected]3db130e2014-03-27 08:14:48794 &EventSenderBindings::SetWmSysKeyUp)
mustaq96985f722015-06-30 21:41:53795 .SetProperty("WM_SYSCHAR", &EventSenderBindings::WmSysChar,
[email protected]3db130e2014-03-27 08:14:48796 &EventSenderBindings::SetWmSysChar)
mustaq96985f722015-06-30 21:41:53797 .SetProperty("WM_SYSDEADCHAR", &EventSenderBindings::WmSysDeadChar,
thestigfd11ffe2015-12-30 19:25:45798 &EventSenderBindings::SetWmSysDeadChar)
[email protected]3db130e2014-03-27 08:14:48799#endif
thestigfd11ffe2015-12-30 19:25:45800 .SetProperty("dragMode", &EventSenderBindings::IsDragMode,
801 &EventSenderBindings::SetIsDragMode);
[email protected]3db130e2014-03-27 08:14:48802}
803
804void EventSenderBindings::EnableDOMUIEventLogging() {
805 if (sender_)
806 sender_->EnableDOMUIEventLogging();
807}
808
809void EventSenderBindings::FireKeyboardEventsToElement() {
810 if (sender_)
811 sender_->FireKeyboardEventsToElement();
812}
813
814void EventSenderBindings::ClearKillRing() {
815 if (sender_)
816 sender_->ClearKillRing();
817}
818
819std::vector<std::string> EventSenderBindings::ContextClick() {
820 if (sender_)
821 return sender_->ContextClick();
822 return std::vector<std::string>();
823}
824
825void EventSenderBindings::TextZoomIn() {
826 if (sender_)
827 sender_->TextZoomIn();
828}
829
830void EventSenderBindings::TextZoomOut() {
831 if (sender_)
832 sender_->TextZoomOut();
833}
834
835void EventSenderBindings::ZoomPageIn() {
836 if (sender_)
837 sender_->ZoomPageIn();
838}
839
840void EventSenderBindings::ZoomPageOut() {
841 if (sender_)
842 sender_->ZoomPageOut();
843}
844
[email protected]d160488f2014-05-06 17:03:01845void EventSenderBindings::SetPageZoomFactor(double factor) {
846 if (sender_)
847 sender_->SetPageZoomFactor(factor);
[email protected]b32fe542014-04-30 08:42:06848}
849
[email protected]3db130e2014-03-27 08:14:48850void EventSenderBindings::ClearTouchPoints() {
851 if (sender_)
852 sender_->ClearTouchPoints();
853}
854
855void EventSenderBindings::ReleaseTouchPoint(unsigned index) {
856 if (sender_)
857 sender_->ReleaseTouchPoint(index);
858}
859
e.hakkinen80033922015-07-31 08:41:35860void EventSenderBindings::UpdateTouchPoint(unsigned index,
861 double x,
862 double y,
863 gin::Arguments* args) {
jochen73e711c2015-06-03 10:01:46864 if (sender_) {
865 sender_->UpdateTouchPoint(index, static_cast<float>(x),
e.hakkinen80033922015-07-31 08:41:35866 static_cast<float>(y), args);
jochen73e711c2015-06-03 10:01:46867 }
[email protected]3db130e2014-03-27 08:14:48868}
869
870void EventSenderBindings::CancelTouchPoint(unsigned index) {
871 if (sender_)
872 sender_->CancelTouchPoint(index);
873}
874
875void EventSenderBindings::SetTouchModifier(const std::string& key_name,
876 bool set_mask) {
877 if (sender_)
878 sender_->SetTouchModifier(key_name, set_mask);
879}
880
[email protected]ace1cd502014-04-24 21:05:30881void EventSenderBindings::SetTouchCancelable(bool cancelable) {
882 if (sender_)
883 sender_->SetTouchCancelable(cancelable);
884}
885
[email protected]3db130e2014-03-27 08:14:48886void EventSenderBindings::DumpFilenameBeingDragged() {
887 if (sender_)
888 sender_->DumpFilenameBeingDragged();
889}
890
891void EventSenderBindings::GestureFlingCancel() {
892 if (sender_)
893 sender_->GestureFlingCancel();
894}
895
896void EventSenderBindings::GestureFlingStart(float x,
897 float y,
898 float velocity_x,
tdresser3a1c9722015-02-13 15:44:53899 float velocity_y,
900 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48901 if (sender_)
tdresser3a1c9722015-02-13 15:44:53902 sender_->GestureFlingStart(x, y, velocity_x, velocity_y, args);
[email protected]3db130e2014-03-27 08:14:48903}
904
W. James MacLeanb5846e52017-08-31 20:39:50905bool EventSenderBindings::IsFlinging() {
tdresserd7bba522016-02-19 22:40:13906 if (sender_)
907 return sender_->IsFlinging();
908 return false;
909}
910
[email protected]3db130e2014-03-27 08:14:48911void EventSenderBindings::GestureScrollFirstPoint(int x, int y) {
912 if (sender_)
913 sender_->GestureScrollFirstPoint(x, y);
914}
915
rbyers709aa1e2016-05-12 04:44:06916void EventSenderBindings::TouchStart(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48917 if (sender_)
rbyers709aa1e2016-05-12 04:44:06918 sender_->TouchStart(args);
[email protected]3db130e2014-03-27 08:14:48919}
920
rbyers709aa1e2016-05-12 04:44:06921void EventSenderBindings::TouchMove(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48922 if (sender_)
rbyers709aa1e2016-05-12 04:44:06923 sender_->TouchMove(args);
[email protected]3db130e2014-03-27 08:14:48924}
925
rbyers709aa1e2016-05-12 04:44:06926void EventSenderBindings::TouchCancel(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48927 if (sender_)
rbyers709aa1e2016-05-12 04:44:06928 sender_->TouchCancel(args);
[email protected]3db130e2014-03-27 08:14:48929}
930
rbyers709aa1e2016-05-12 04:44:06931void EventSenderBindings::TouchEnd(gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48932 if (sender_)
rbyers709aa1e2016-05-12 04:44:06933 sender_->TouchEnd(args);
[email protected]3db130e2014-03-27 08:14:48934}
935
mustaqb3c44a02016-04-19 18:49:05936void EventSenderBindings::NotifyStartOfTouchScroll() {
937 if (sender_)
938 sender_->NotifyStartOfTouchScroll();
939}
940
[email protected]3db130e2014-03-27 08:14:48941void EventSenderBindings::LeapForward(int milliseconds) {
942 if (sender_)
943 sender_->LeapForward(milliseconds);
944}
945
majidvpbfabb0712015-10-02 16:30:00946double EventSenderBindings::LastEventTimestamp() {
947 if (sender_)
948 return sender_->last_event_timestamp();
949 return 0;
950}
951
[email protected]3db130e2014-03-27 08:14:48952void EventSenderBindings::BeginDragWithFiles(
953 const std::vector<std::string>& files) {
954 if (sender_)
955 sender_->BeginDragWithFiles(files);
956}
957
e.hakkinen80033922015-07-31 08:41:35958void EventSenderBindings::AddTouchPoint(double x,
959 double y,
960 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48961 if (sender_)
e.hakkinen80033922015-07-31 08:41:35962 sender_->AddTouchPoint(static_cast<float>(x), static_cast<float>(y), args);
[email protected]3db130e2014-03-27 08:14:48963}
964
[email protected]3db130e2014-03-27 08:14:48965void EventSenderBindings::GestureScrollBegin(gin::Arguments* args) {
966 if (sender_)
967 sender_->GestureScrollBegin(args);
968}
969
970void EventSenderBindings::GestureScrollEnd(gin::Arguments* args) {
971 if (sender_)
972 sender_->GestureScrollEnd(args);
973}
974
975void EventSenderBindings::GestureScrollUpdate(gin::Arguments* args) {
976 if (sender_)
977 sender_->GestureScrollUpdate(args);
978}
979
ccameronb81b8072015-01-30 00:54:49980void EventSenderBindings::GesturePinchBegin(gin::Arguments* args) {
981 if (sender_)
982 sender_->GesturePinchBegin(args);
983}
984
985void EventSenderBindings::GesturePinchEnd(gin::Arguments* args) {
986 if (sender_)
987 sender_->GesturePinchEnd(args);
988}
989
990void EventSenderBindings::GesturePinchUpdate(gin::Arguments* args) {
991 if (sender_)
992 sender_->GesturePinchUpdate(args);
993}
994
[email protected]3db130e2014-03-27 08:14:48995void EventSenderBindings::GestureTap(gin::Arguments* args) {
996 if (sender_)
997 sender_->GestureTap(args);
998}
999
1000void EventSenderBindings::GestureTapDown(gin::Arguments* args) {
1001 if (sender_)
1002 sender_->GestureTapDown(args);
1003}
1004
1005void EventSenderBindings::GestureShowPress(gin::Arguments* args) {
1006 if (sender_)
1007 sender_->GestureShowPress(args);
1008}
1009
1010void EventSenderBindings::GestureTapCancel(gin::Arguments* args) {
1011 if (sender_)
1012 sender_->GestureTapCancel(args);
1013}
1014
1015void EventSenderBindings::GestureLongPress(gin::Arguments* args) {
1016 if (sender_)
1017 sender_->GestureLongPress(args);
1018}
1019
1020void EventSenderBindings::GestureLongTap(gin::Arguments* args) {
1021 if (sender_)
1022 sender_->GestureLongTap(args);
1023}
1024
1025void EventSenderBindings::GestureTwoFingerTap(gin::Arguments* args) {
1026 if (sender_)
1027 sender_->GestureTwoFingerTap(args);
1028}
1029
1030void EventSenderBindings::ContinuousMouseScrollBy(gin::Arguments* args) {
1031 if (sender_)
dtapuska43f18e9e2016-03-20 20:21:301032 sender_->MouseScrollBy(args, EventSender::MouseScrollType::PIXEL);
[email protected]3db130e2014-03-27 08:14:481033}
1034
[email protected]3db130e2014-03-27 08:14:481035void EventSenderBindings::MouseMoveTo(gin::Arguments* args) {
1036 if (sender_)
1037 sender_->MouseMoveTo(args);
1038}
1039
lanwei0474c2a52017-05-12 18:52:011040void EventSenderBindings::MouseLeave(gin::Arguments* args) {
1041 if (!sender_)
1042 return;
1043
1044 WebPointerProperties::PointerType pointerType =
1045 WebPointerProperties::PointerType::kMouse;
1046 int pointerId = kRawMousePointerId;
1047
1048 // Only allow pen or mouse through this API.
chongzd65eacf2017-06-28 05:21:591049 if (!GetPointerType(args, false, pointerType))
lanwei0474c2a52017-05-12 18:52:011050 return;
1051 if (!args->PeekNext().IsEmpty()) {
1052 if (!args->GetNext(&pointerId)) {
1053 args->ThrowError();
1054 return;
1055 }
1056 }
1057 sender_->MouseLeave(pointerType, pointerId);
myid.shin12c7fea22015-03-06 02:31:241058}
1059
[email protected]3db130e2014-03-27 08:14:481060void EventSenderBindings::MouseScrollBy(gin::Arguments* args) {
1061 if (sender_)
dtapuska43f18e9e2016-03-20 20:21:301062 sender_->MouseScrollBy(args, EventSender::MouseScrollType::TICK);
[email protected]3db130e2014-03-27 08:14:481063}
1064
[email protected]3db130e2014-03-27 08:14:481065void EventSenderBindings::ScheduleAsynchronousClick(gin::Arguments* args) {
1066 if (!sender_)
1067 return;
1068
1069 int button_number = 0;
1070 int modifiers = 0;
1071 if (!args->PeekNext().IsEmpty()) {
1072 args->GetNext(&button_number);
1073 if (!args->PeekNext().IsEmpty())
bashidbd2ef9bb2015-06-02 01:39:321074 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
[email protected]3db130e2014-03-27 08:14:481075 }
1076 sender_->ScheduleAsynchronousClick(button_number, modifiers);
1077}
1078
1079void EventSenderBindings::ScheduleAsynchronousKeyDown(gin::Arguments* args) {
1080 if (!sender_)
1081 return;
1082
1083 std::string code_str;
1084 int modifiers = 0;
1085 int location = DOMKeyLocationStandard;
1086 args->GetNext(&code_str);
1087 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:411088 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:481089 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:321090 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:481091 if (!args->PeekNext().IsEmpty())
1092 args->GetNext(&location);
1093 }
1094 sender_->ScheduleAsynchronousKeyDown(code_str, modifiers,
1095 static_cast<KeyLocationCode>(location));
1096}
1097
Mustaq Ahmedc9b974a2018-01-22 19:43:441098void EventSenderBindings::ConsumeUserActivation() {
1099 if (sender_)
1100 sender_->ConsumeUserActivation();
1101}
1102
[email protected]3db130e2014-03-27 08:14:481103void EventSenderBindings::MouseDown(gin::Arguments* args) {
1104 if (!sender_)
1105 return;
1106
1107 int button_number = 0;
1108 int modifiers = 0;
1109 if (!args->PeekNext().IsEmpty()) {
nzolghadr43146032016-04-11 15:33:381110 if (!args->GetNext(&button_number)) {
1111 args->ThrowError();
1112 return;
1113 }
1114 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:321115 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:381116 args->Skip();
1117 }
[email protected]3db130e2014-03-27 08:14:481118 }
nzolghadr43146032016-04-11 15:33:381119
mustaqabca6ff2016-06-09 17:29:531120 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:541121 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:531122 int pointerId = 0;
1123 float pressure = 0;
1124 int tiltX = 0;
1125 int tiltY = 0;
1126 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
1127 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:381128 return;
1129
mustaqabca6ff2016-06-09 17:29:531130 sender_->PointerDown(button_number, modifiers, pointerType, pointerId,
1131 pressure, tiltX, tiltY);
[email protected]3db130e2014-03-27 08:14:481132}
1133
1134void EventSenderBindings::MouseUp(gin::Arguments* args) {
1135 if (!sender_)
1136 return;
1137
1138 int button_number = 0;
1139 int modifiers = 0;
1140 if (!args->PeekNext().IsEmpty()) {
nzolghadr43146032016-04-11 15:33:381141 if (!args->GetNext(&button_number)) {
1142 args->ThrowError();
1143 return;
1144 }
1145 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:321146 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:381147 args->Skip();
1148 }
[email protected]3db130e2014-03-27 08:14:481149 }
nzolghadr43146032016-04-11 15:33:381150
mustaqabca6ff2016-06-09 17:29:531151 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:541152 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:531153 int pointerId = 0;
1154 float pressure = 0;
1155 int tiltX = 0;
1156 int tiltY = 0;
1157 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
1158 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:381159 return;
1160
mustaqabca6ff2016-06-09 17:29:531161 sender_->PointerUp(button_number, modifiers, pointerType, pointerId, pressure,
1162 tiltX, tiltY);
[email protected]3db130e2014-03-27 08:14:481163}
1164
mustaq21aed4e2015-12-15 21:47:211165void EventSenderBindings::SetMouseButtonState(gin::Arguments* args) {
1166 if (!sender_)
1167 return;
1168
1169 int button_number;
1170 if (!args->GetNext(&button_number)) {
1171 args->ThrowError();
1172 return;
1173 }
1174
thestigfd11ffe2015-12-30 19:25:451175 int modifiers = -1; // Default to the modifier implied by button_number
mustaq21aed4e2015-12-15 21:47:211176 if (!args->PeekNext().IsEmpty()) {
1177 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
1178 }
1179
1180 sender_->SetMouseButtonState(button_number, modifiers);
1181}
1182
[email protected]3db130e2014-03-27 08:14:481183void EventSenderBindings::KeyDown(gin::Arguments* args) {
1184 if (!sender_)
1185 return;
1186
1187 std::string code_str;
1188 int modifiers = 0;
1189 int location = DOMKeyLocationStandard;
1190 args->GetNext(&code_str);
1191 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:411192 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:481193 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:321194 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:481195 if (!args->PeekNext().IsEmpty())
1196 args->GetNext(&location);
1197 }
1198 sender_->KeyDown(code_str, modifiers, static_cast<KeyLocationCode>(location));
1199}
1200
1201bool EventSenderBindings::ForceLayoutOnEvents() const {
1202 if (sender_)
1203 return sender_->force_layout_on_events();
1204 return false;
1205}
1206
1207void EventSenderBindings::SetForceLayoutOnEvents(bool force) {
1208 if (sender_)
1209 sender_->set_force_layout_on_events(force);
1210}
1211
1212bool EventSenderBindings::IsDragMode() const {
1213 if (sender_)
1214 return sender_->is_drag_mode();
1215 return true;
1216}
1217
1218void EventSenderBindings::SetIsDragMode(bool drag_mode) {
1219 if (sender_)
1220 sender_->set_is_drag_mode(drag_mode);
1221}
1222
1223#if defined(OS_WIN)
1224int EventSenderBindings::WmKeyDown() const {
1225 if (sender_)
1226 return sender_->wm_key_down();
1227 return 0;
1228}
1229
1230void EventSenderBindings::SetWmKeyDown(int key_down) {
1231 if (sender_)
1232 sender_->set_wm_key_down(key_down);
1233}
1234
1235int EventSenderBindings::WmKeyUp() const {
1236 if (sender_)
1237 return sender_->wm_key_up();
1238 return 0;
1239}
1240
1241void EventSenderBindings::SetWmKeyUp(int key_up) {
1242 if (sender_)
1243 sender_->set_wm_key_up(key_up);
1244}
1245
1246int EventSenderBindings::WmChar() const {
1247 if (sender_)
1248 return sender_->wm_char();
1249 return 0;
1250}
1251
1252void EventSenderBindings::SetWmChar(int wm_char) {
1253 if (sender_)
1254 sender_->set_wm_char(wm_char);
1255}
1256
1257int EventSenderBindings::WmDeadChar() const {
1258 if (sender_)
1259 return sender_->wm_dead_char();
1260 return 0;
1261}
1262
1263void EventSenderBindings::SetWmDeadChar(int dead_char) {
1264 if (sender_)
1265 sender_->set_wm_dead_char(dead_char);
1266}
1267
1268int EventSenderBindings::WmSysKeyDown() const {
1269 if (sender_)
1270 return sender_->wm_sys_key_down();
1271 return 0;
1272}
1273
1274void EventSenderBindings::SetWmSysKeyDown(int key_down) {
1275 if (sender_)
1276 sender_->set_wm_sys_key_down(key_down);
1277}
1278
1279int EventSenderBindings::WmSysKeyUp() const {
1280 if (sender_)
1281 return sender_->wm_sys_key_up();
1282 return 0;
1283}
1284
1285void EventSenderBindings::SetWmSysKeyUp(int key_up) {
1286 if (sender_)
1287 sender_->set_wm_sys_key_up(key_up);
1288}
1289
1290int EventSenderBindings::WmSysChar() const {
1291 if (sender_)
1292 return sender_->wm_sys_char();
1293 return 0;
1294}
1295
1296void EventSenderBindings::SetWmSysChar(int sys_char) {
1297 if (sender_)
1298 sender_->set_wm_sys_char(sys_char);
1299}
1300
1301int EventSenderBindings::WmSysDeadChar() const {
1302 if (sender_)
1303 return sender_->wm_sys_dead_char();
1304 return 0;
1305}
1306
1307void EventSenderBindings::SetWmSysDeadChar(int sys_dead_char) {
1308 if (sender_)
1309 sender_->set_wm_sys_dead_char(sys_dead_char);
1310}
1311#endif
1312
1313// EventSender -----------------------------------------------------------------
1314
[email protected]3db130e2014-03-27 08:14:481315WebMouseEvent::Button EventSender::last_button_type_ =
Blink Reformat1c4d759e2017-04-09 16:34:541316 WebMouseEvent::Button::kNoButton;
[email protected]3db130e2014-03-27 08:14:481317
1318EventSender::SavedEvent::SavedEvent()
1319 : type(TYPE_UNSPECIFIED),
Blink Reformat1c4d759e2017-04-09 16:34:541320 button_type(WebMouseEvent::Button::kNoButton),
[email protected]3db130e2014-03-27 08:14:481321 milliseconds(0),
1322 modifiers(0) {}
1323
lukaszad322c5ca2016-10-07 00:32:341324EventSender::EventSender(WebWidgetTestProxyBase* web_widget_test_proxy_base)
1325 : web_widget_test_proxy_base_(web_widget_test_proxy_base),
[email protected]3db130e2014-03-27 08:14:481326 replaying_saved_events_(false),
sammc5648c852015-07-02 01:25:001327 weak_factory_(this) {
lukasza335bb762016-04-22 16:44:031328 Reset();
sammc5648c852015-07-02 01:25:001329}
[email protected]3db130e2014-03-27 08:14:481330
1331EventSender::~EventSender() {}
1332
1333void EventSender::Reset() {
Blink Reformat1c4d759e2017-04-09 16:34:541334 DCHECK(current_drag_data_.IsNull());
1335 current_drag_data_.Reset();
1336 current_drag_effect_ = blink::kWebDragOperationNone;
1337 current_drag_effects_allowed_ = blink::kWebDragOperationNone;
1338 if (widget() && current_pointer_state_[kRawMousePointerId].pressed_button_ !=
1339 WebMouseEvent::Button::kNoButton)
1340 widget()->MouseCaptureLost();
nzolghadr43146032016-04-11 15:33:381341 current_pointer_state_.clear();
[email protected]3db130e2014-03-27 08:14:481342 is_drag_mode_ = true;
1343 force_layout_on_events_ = true;
1344
1345#if defined(OS_WIN)
1346 wm_key_down_ = WM_KEYDOWN;
1347 wm_key_up_ = WM_KEYUP;
1348 wm_char_ = WM_CHAR;
1349 wm_dead_char_ = WM_DEADCHAR;
1350 wm_sys_key_down_ = WM_SYSKEYDOWN;
1351 wm_sys_key_up_ = WM_SYSKEYUP;
1352 wm_sys_char_ = WM_SYSCHAR;
1353 wm_sys_dead_char_ = WM_SYSDEADCHAR;
1354#endif
1355
[email protected]3db130e2014-03-27 08:14:481356 last_click_time_sec_ = 0;
1357 last_click_pos_ = WebPoint(0, 0);
Blink Reformat1c4d759e2017-04-09 16:34:541358 last_button_type_ = WebMouseEvent::Button::kNoButton;
[email protected]3db130e2014-03-27 08:14:481359 touch_points_.clear();
[email protected]644616d2014-03-27 16:14:471360 last_context_menu_data_.reset();
lukaszac9358822016-04-07 14:43:461361 weak_factory_.InvalidateWeakPtrs();
[email protected]3db130e2014-03-27 08:14:481362 current_gesture_location_ = WebPoint(0, 0);
1363 mouse_event_queue_.clear();
1364
1365 time_offset_ms_ = 0;
1366 click_count_ = 0;
[email protected]ace1cd502014-04-24 21:05:301367
1368 touch_modifiers_ = 0;
1369 touch_cancelable_ = true;
1370 touch_points_.clear();
[email protected]3db130e2014-03-27 08:14:481371}
1372
lukasza335bb762016-04-22 16:44:031373void EventSender::Install(WebLocalFrame* frame) {
[email protected]3db130e2014-03-27 08:14:481374 EventSenderBindings::Install(weak_factory_.GetWeakPtr(), frame);
1375}
1376
[email protected]3db130e2014-03-27 08:14:481377void EventSender::SetContextMenuData(const WebContextMenuData& data) {
1378 last_context_menu_data_.reset(new WebContextMenuData(data));
1379}
1380
dtapuska899ac222017-01-03 18:09:161381int EventSender::ModifiersForPointer(int pointer_id) {
1382 return modifiersWithButtons(
1383 current_pointer_state_[pointer_id].modifiers_,
1384 current_pointer_state_[pointer_id].current_buttons_);
1385}
1386
[email protected]3db130e2014-03-27 08:14:481387void EventSender::DoDragDrop(const WebDragData& drag_data,
dcheng59826e32017-02-22 10:31:361388 WebDragOperationsMask mask) {
Blink Reformat1c4d759e2017-04-09 16:34:541389 WebMouseEvent raw_event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161390 ModifiersForPointer(kRawMousePointerId),
1391 GetCurrentEventTimeSec());
1392 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531393 current_pointer_state_[kRawMousePointerId].current_buttons_,
1394 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161395 click_count_, &raw_event);
oshima76b6eeb2016-06-27 15:55:121396
lukaszad322c5ca2016-10-07 00:32:341397 std::unique_ptr<WebInputEvent> widget_event =
1398 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:121399 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:341400 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
1401 : &raw_event;
oshima76b6eeb2016-06-27 15:55:121402
[email protected]3db130e2014-03-27 08:14:481403 current_drag_data_ = drag_data;
1404 current_drag_effects_allowed_ = mask;
Blink Reformat1c4d759e2017-04-09 16:34:541405 current_drag_effect_ = mainFrameWidget()->DragTargetDragEnter(
Ella Ge80a52dce2017-11-15 18:01:521406 drag_data, event->PositionInWidget(), event->PositionInScreen(),
1407 current_drag_effects_allowed_,
nzolghadr43146032016-04-11 15:33:381408 modifiersWithButtons(
mustaqabca6ff2016-06-09 17:29:531409 current_pointer_state_[kRawMousePointerId].modifiers_,
1410 current_pointer_state_[kRawMousePointerId].current_buttons_));
[email protected]3db130e2014-03-27 08:14:481411
1412 // Finish processing events.
1413 ReplaySavedEvents();
1414}
1415
1416void EventSender::MouseDown(int button_number, int modifiers) {
nzolghadr43146032016-04-11 15:33:381417 PointerDown(button_number, modifiers,
Blink Reformat1c4d759e2017-04-09 16:34:541418 WebPointerProperties::PointerType::kMouse, kRawMousePointerId,
1419 0.0, 0, 0);
[email protected]3db130e2014-03-27 08:14:481420}
1421
1422void EventSender::MouseUp(int button_number, int modifiers) {
Blink Reformat1c4d759e2017-04-09 16:34:541423 PointerUp(button_number, modifiers, WebPointerProperties::PointerType::kMouse,
mustaqabca6ff2016-06-09 17:29:531424 kRawMousePointerId, 0.0, 0, 0);
nzolghadr43146032016-04-11 15:33:381425}
1426
mustaqabca6ff2016-06-09 17:29:531427void EventSender::PointerDown(int button_number,
1428 int modifiers,
1429 WebPointerProperties::PointerType pointerType,
1430 int pointerId,
1431 float pressure,
1432 int tiltX,
1433 int tiltY) {
[email protected]3db130e2014-03-27 08:14:481434 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541435 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481436
1437 DCHECK_NE(-1, button_number);
1438
1439 WebMouseEvent::Button button_type =
1440 GetButtonTypeFromButtonNumber(button_number);
1441
nzolghadr43146032016-04-11 15:33:381442 int click_count = 0;
1443 current_pointer_state_[pointerId].pressed_button_ = button_type;
1444 current_pointer_state_[pointerId].current_buttons_ |=
1445 GetWebMouseEventModifierForButton(button_type);
1446 current_pointer_state_[pointerId].modifiers_ = modifiers;
1447
Blink Reformat1c4d759e2017-04-09 16:34:541448 if (pointerType == WebPointerProperties::PointerType::kMouse) {
nzolghadr43146032016-04-11 15:33:381449 UpdateClickCountForButton(button_type);
1450 click_count = click_count_;
1451 }
Blink Reformat1c4d759e2017-04-09 16:34:541452 WebMouseEvent event(WebInputEvent::kMouseDown, ModifiersForPointer(pointerId),
dtapuska899ac222017-01-03 18:09:161453 GetCurrentEventTimeSec());
1454 InitMouseEventGeneric(current_pointer_state_[pointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531455 current_pointer_state_[pointerId].current_buttons_,
1456 current_pointer_state_[pointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161457 click_count, pointerType, pointerId, pressure, tiltX,
1458 tiltY, &event);
nzolghadr43146032016-04-11 15:33:381459
1460 HandleInputEventOnViewOrPopup(event);
1461}
1462
mustaqabca6ff2016-06-09 17:29:531463void EventSender::PointerUp(int button_number,
1464 int modifiers,
1465 WebPointerProperties::PointerType pointerType,
1466 int pointerId,
1467 float pressure,
1468 int tiltX,
1469 int tiltY) {
nzolghadr43146032016-04-11 15:33:381470 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541471 widget()->UpdateAllLifecyclePhases();
nzolghadr43146032016-04-11 15:33:381472
1473 DCHECK_NE(-1, button_number);
1474
1475 WebMouseEvent::Button button_type =
1476 GetButtonTypeFromButtonNumber(button_number);
1477
Blink Reformat1c4d759e2017-04-09 16:34:541478 if (pointerType == WebPointerProperties::PointerType::kMouse &&
nzolghadr43146032016-04-11 15:33:381479 is_drag_mode_ && !replaying_saved_events_) {
[email protected]3db130e2014-03-27 08:14:481480 SavedEvent saved_event;
1481 saved_event.type = SavedEvent::TYPE_MOUSE_UP;
1482 saved_event.button_type = button_type;
1483 saved_event.modifiers = modifiers;
1484 mouse_event_queue_.push_back(saved_event);
1485 ReplaySavedEvents();
1486 } else {
dtapuska899ac222017-01-03 18:09:161487 current_pointer_state_[pointerId].modifiers_ = modifiers;
nzolghadr43146032016-04-11 15:33:381488 current_pointer_state_[pointerId].current_buttons_ &=
1489 ~GetWebMouseEventModifierForButton(button_type);
1490 current_pointer_state_[pointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541491 WebMouseEvent::Button::kNoButton;
mustaq21aed4e2015-12-15 21:47:211492
Blink Reformat1c4d759e2017-04-09 16:34:541493 WebMouseEvent event(WebInputEvent::kMouseUp, ModifiersForPointer(pointerId),
dtapuska899ac222017-01-03 18:09:161494 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541495 int click_count = pointerType == WebPointerProperties::PointerType::kMouse
mustaqabca6ff2016-06-09 17:29:531496 ? click_count_
1497 : 0;
dtapuska899ac222017-01-03 18:09:161498 InitMouseEventGeneric(
1499 button_type, current_pointer_state_[pointerId].current_buttons_,
1500 current_pointer_state_[pointerId].last_pos_, click_count, pointerType,
1501 pointerId, pressure, tiltX, tiltY, &event);
nzolghadr43146032016-04-11 15:33:381502 HandleInputEventOnViewOrPopup(event);
Blink Reformat1c4d759e2017-04-09 16:34:541503 if (pointerType == WebPointerProperties::PointerType::kMouse)
nzolghadr43146032016-04-11 15:33:381504 DoDragAfterMouseUp(event);
[email protected]3db130e2014-03-27 08:14:481505 }
1506}
1507
mustaq21aed4e2015-12-15 21:47:211508void EventSender::SetMouseButtonState(int button_number, int modifiers) {
mustaqabca6ff2016-06-09 17:29:531509 current_pointer_state_[kRawMousePointerId].pressed_button_ =
nzolghadr43146032016-04-11 15:33:381510 GetButtonTypeFromButtonNumber(button_number);
mustaqabca6ff2016-06-09 17:29:531511 current_pointer_state_[kRawMousePointerId].current_buttons_ =
nzolghadr43146032016-04-11 15:33:381512 (modifiers == -1)
1513 ? GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:531514 current_pointer_state_[kRawMousePointerId].pressed_button_)
nzolghadr43146032016-04-11 15:33:381515 : modifiers & kButtonsInModifiers;
mustaq21aed4e2015-12-15 21:47:211516}
1517
[email protected]3db130e2014-03-27 08:14:481518void EventSender::KeyDown(const std::string& code_str,
1519 int modifiers,
1520 KeyLocationCode location) {
1521 // FIXME: I'm not exactly sure how we should convert the string to a key
1522 // event. This seems to work in the cases I tested.
1523 // FIXME: Should we also generate a KEY_UP?
1524
1525 bool generate_char = false;
1526
1527 // Convert \n -> VK_RETURN. Some layout tests use \n to mean "Enter", when
1528 // Windows uses \r for "Enter".
1529 int code = 0;
1530 int text = 0;
1531 bool needs_shift_key_modifier = false;
chongz40aff932016-05-04 14:30:121532 std::string domKeyString;
1533 std::string domCodeString;
[email protected]3db130e2014-03-27 08:14:481534
dtapuska0d1f4af2016-06-29 16:42:221535 if ("Enter" == code_str) {
[email protected]3db130e2014-03-27 08:14:481536 generate_char = true;
[email protected]a731f1a92014-04-17 19:31:061537 text = code = ui::VKEY_RETURN;
chongz40aff932016-05-04 14:30:121538 domKeyString.assign("Enter");
1539 domCodeString.assign("Enter");
dtapuska0d1f4af2016-06-29 16:42:221540 } else if ("ArrowRight" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061541 code = ui::VKEY_RIGHT;
chongz40aff932016-05-04 14:30:121542 domKeyString.assign("ArrowRight");
1543 domCodeString.assign("ArrowRight");
dtapuska0d1f4af2016-06-29 16:42:221544 } else if ("ArrowDown" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061545 code = ui::VKEY_DOWN;
chongz40aff932016-05-04 14:30:121546 domKeyString.assign("ArrowDown");
1547 domCodeString.assign("ArrowDown");
dtapuska0d1f4af2016-06-29 16:42:221548 } else if ("ArrowLeft" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061549 code = ui::VKEY_LEFT;
chongz40aff932016-05-04 14:30:121550 domKeyString.assign("ArrowLeft");
1551 domCodeString.assign("ArrowLeft");
dtapuska0d1f4af2016-06-29 16:42:221552 } else if ("ArrowUp" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061553 code = ui::VKEY_UP;
chongz40aff932016-05-04 14:30:121554 domKeyString.assign("ArrowUp");
1555 domCodeString.assign("ArrowUp");
dtapuska0d1f4af2016-06-29 16:42:221556 } else if ("Insert" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061557 code = ui::VKEY_INSERT;
chongz40aff932016-05-04 14:30:121558 domKeyString.assign("Insert");
1559 domCodeString.assign("Insert");
dtapuska0d1f4af2016-06-29 16:42:221560 } else if ("Delete" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061561 code = ui::VKEY_DELETE;
chongz40aff932016-05-04 14:30:121562 domKeyString.assign("Delete");
1563 domCodeString.assign("Delete");
dtapuska0d1f4af2016-06-29 16:42:221564 } else if ("PageUp" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061565 code = ui::VKEY_PRIOR;
chongz40aff932016-05-04 14:30:121566 domKeyString.assign("PageUp");
1567 domCodeString.assign("PageUp");
dtapuska0d1f4af2016-06-29 16:42:221568 } else if ("PageDown" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061569 code = ui::VKEY_NEXT;
chongz40aff932016-05-04 14:30:121570 domKeyString.assign("PageDown");
1571 domCodeString.assign("PageDown");
dtapuska0d1f4af2016-06-29 16:42:221572 } else if ("Home" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061573 code = ui::VKEY_HOME;
chongz40aff932016-05-04 14:30:121574 domKeyString.assign("Home");
1575 domCodeString.assign("Home");
dtapuska0d1f4af2016-06-29 16:42:221576 } else if ("End" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061577 code = ui::VKEY_END;
chongz40aff932016-05-04 14:30:121578 domKeyString.assign("End");
1579 domCodeString.assign("End");
dtapuska0d1f4af2016-06-29 16:42:221580 } else if ("PrintScreen" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061581 code = ui::VKEY_SNAPSHOT;
chongz40aff932016-05-04 14:30:121582 domKeyString.assign("PrintScreen");
1583 domCodeString.assign("PrintScreen");
dtapuska0d1f4af2016-06-29 16:42:221584 } else if ("ContextMenu" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061585 code = ui::VKEY_APPS;
chongz40aff932016-05-04 14:30:121586 domKeyString.assign("ContextMenu");
1587 domCodeString.assign("ContextMenu");
dtapuska0d1f4af2016-06-29 16:42:221588 } else if ("ControlLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051589 code = ui::VKEY_CONTROL;
chongz40aff932016-05-04 14:30:121590 domKeyString.assign("Control");
1591 domCodeString.assign("ControlLeft");
dtapuskad3ba0f042015-08-27 14:08:051592 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221593 } else if ("ControlRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051594 code = ui::VKEY_CONTROL;
chongz40aff932016-05-04 14:30:121595 domKeyString.assign("Control");
1596 domCodeString.assign("ControlRight");
dtapuskad3ba0f042015-08-27 14:08:051597 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221598 } else if ("ShiftLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051599 code = ui::VKEY_SHIFT;
chongz40aff932016-05-04 14:30:121600 domKeyString.assign("Shift");
1601 domCodeString.assign("ShiftLeft");
dtapuskad3ba0f042015-08-27 14:08:051602 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221603 } else if ("ShiftRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051604 code = ui::VKEY_SHIFT;
chongz40aff932016-05-04 14:30:121605 domKeyString.assign("Shift");
1606 domCodeString.assign("ShiftRight");
dtapuskad3ba0f042015-08-27 14:08:051607 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221608 } else if ("AltLeft" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051609 code = ui::VKEY_MENU;
chongz40aff932016-05-04 14:30:121610 domKeyString.assign("Alt");
1611 domCodeString.assign("AltLeft");
dtapuskad3ba0f042015-08-27 14:08:051612 location = DOMKeyLocationLeft;
dtapuska0d1f4af2016-06-29 16:42:221613 } else if ("AltRight" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051614 code = ui::VKEY_MENU;
chongz40aff932016-05-04 14:30:121615 domKeyString.assign("Alt");
1616 domCodeString.assign("AltRight");
dtapuskad3ba0f042015-08-27 14:08:051617 location = DOMKeyLocationRight;
dtapuska0d1f4af2016-06-29 16:42:221618 } else if ("NumLock" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061619 code = ui::VKEY_NUMLOCK;
chongz40aff932016-05-04 14:30:121620 domKeyString.assign("NumLock");
1621 domCodeString.assign("NumLock");
dtapuska0d1f4af2016-06-29 16:42:221622 } else if ("Backspace" == code_str) {
[email protected]4c07a712014-08-21 17:05:541623 code = ui::VKEY_BACK;
chongz40aff932016-05-04 14:30:121624 domKeyString.assign("Backspace");
1625 domCodeString.assign("Backspace");
dtapuska0d1f4af2016-06-29 16:42:221626 } else if ("Escape" == code_str) {
[email protected]4c07a712014-08-21 17:05:541627 code = ui::VKEY_ESCAPE;
chongz40aff932016-05-04 14:30:121628 domKeyString.assign("Escape");
1629 domCodeString.assign("Escape");
dtapuska8f3b1e52016-06-21 16:34:071630 } else if ("Tab" == code_str) {
1631 code = ui::VKEY_TAB;
1632 domKeyString.assign("Tab");
1633 domCodeString.assign("Tab");
chongz78364d672016-08-03 00:13:431634 } else if ("Cut" == code_str || "Copy" == code_str || "Paste" == code_str) {
1635 // No valid KeyboardCode for Cut/Copy/Paste.
1636 code = 0;
1637 domKeyString.assign(code_str);
1638 // It's OK to assign the same string as the DomCode strings happens to be
1639 // the same for these keys.
1640 domCodeString.assign(code_str);
[email protected]3db130e2014-03-27 08:14:481641 } else {
1642 // Compare the input string with the function-key names defined by the
1643 // DOM spec (i.e. "F1",...,"F24"). If the input string is a function-key
1644 // name, set its key code.
1645 for (int i = 1; i <= 24; ++i) {
1646 std::string function_key_name = base::StringPrintf("F%d", i);
1647 if (function_key_name == code_str) {
[email protected]a731f1a92014-04-17 19:31:061648 code = ui::VKEY_F1 + (i - 1);
chongz40aff932016-05-04 14:30:121649 domKeyString = function_key_name;
1650 domCodeString = function_key_name;
[email protected]3db130e2014-03-27 08:14:481651 break;
1652 }
1653 }
1654 if (!code) {
esprehnd29ab802015-12-11 13:01:191655 base::string16 code_str16 = base::UTF8ToUTF16(code_str);
1656 if (code_str16.size() != 1u) {
Blink Reformat1c4d759e2017-04-09 16:34:541657 v8::Isolate* isolate = blink::MainThreadIsolate();
dtapuskabd2a1652015-05-20 00:30:151658 isolate->ThrowException(v8::Exception::TypeError(
1659 gin::StringToV8(isolate, "Invalid web code.")));
1660 return;
1661 }
esprehnd29ab802015-12-11 13:01:191662 text = code = code_str16[0];
zhongyi23960342016-04-12 23:13:201663 needs_shift_key_modifier = base::IsAsciiUpper(code & 0xFF);
1664 if (base::IsAsciiLower(code & 0xFF))
[email protected]3db130e2014-03-27 08:14:481665 code -= 'a' - 'A';
zhongyi23960342016-04-12 23:13:201666 if (base::IsAsciiAlpha(code)) {
chongz40aff932016-05-04 14:30:121667 domKeyString.assign(code_str);
1668 domCodeString.assign("Key");
1669 domCodeString.push_back(
brettwc15100c2015-08-06 22:54:161670 base::ToUpperASCII(static_cast<base::char16>(code)));
zhongyi23960342016-04-12 23:13:201671 } else if (base::IsAsciiDigit(code)) {
chongz40aff932016-05-04 14:30:121672 domKeyString.assign(code_str);
1673 domCodeString.assign("Digit");
1674 domCodeString.push_back(code);
habib.virji565c80c2015-02-06 12:26:431675 } else if (code == ' ') {
chongz40aff932016-05-04 14:30:121676 domKeyString.assign(code_str);
1677 domCodeString.assign("Space");
habib.virji565c80c2015-02-06 12:26:431678 } else if (code == 9) {
chongz40aff932016-05-04 14:30:121679 domKeyString.assign("Tab");
1680 domCodeString.assign("Tab");
habib.virji565c80c2015-02-06 12:26:431681 }
[email protected]3db130e2014-03-27 08:14:481682 generate_char = true;
1683 }
1684
1685 if ("(" == code_str) {
1686 code = '9';
1687 needs_shift_key_modifier = true;
chongz40aff932016-05-04 14:30:121688 domKeyString.assign("(");
1689 domCodeString.assign("Digit9");
[email protected]3db130e2014-03-27 08:14:481690 }
1691 }
1692
dtapuska899ac222017-01-03 18:09:161693 if (needs_shift_key_modifier)
Blink Reformat1c4d759e2017-04-09 16:34:541694 modifiers |= WebInputEvent::kShiftKey;
dtapuska899ac222017-01-03 18:09:161695
1696 // See if KeyLocation argument is given.
1697 switch (location) {
1698 case DOMKeyLocationStandard:
1699 break;
1700 case DOMKeyLocationLeft:
Blink Reformat1c4d759e2017-04-09 16:34:541701 modifiers |= WebInputEvent::kIsLeft;
dtapuska899ac222017-01-03 18:09:161702 break;
1703 case DOMKeyLocationRight:
Blink Reformat1c4d759e2017-04-09 16:34:541704 modifiers |= WebInputEvent::kIsRight;
dtapuska899ac222017-01-03 18:09:161705 break;
1706 case DOMKeyLocationNumpad:
Blink Reformat1c4d759e2017-04-09 16:34:541707 modifiers |= WebInputEvent::kIsKeyPad;
dtapuska899ac222017-01-03 18:09:161708 break;
1709 }
1710
[email protected]3db130e2014-03-27 08:14:481711 // For one generated keyboard event, we need to generate a keyDown/keyUp
1712 // pair;
1713 // On Windows, we might also need to generate a char event to mimic the
1714 // Windows event flow; on other platforms we create a merged event and test
1715 // the event flow that that platform provides.
Blink Reformat1c4d759e2017-04-09 16:34:541716 WebKeyboardEvent event_down(WebInputEvent::kRawKeyDown, modifiers,
dtapuska899ac222017-01-03 18:09:161717 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541718 event_down.windows_key_code = code;
1719 event_down.dom_key =
dcheng59826e32017-02-22 10:31:361720 static_cast<int>(ui::KeycodeConverter::KeyStringToDomKey(domKeyString));
Blink Reformat1c4d759e2017-04-09 16:34:541721 event_down.dom_code = static_cast<int>(
chongz40aff932016-05-04 14:30:121722 ui::KeycodeConverter::CodeStringToDomCode(domCodeString));
[email protected]3db130e2014-03-27 08:14:481723
[email protected]3db130e2014-03-27 08:14:481724 if (generate_char) {
1725 event_down.text[0] = text;
Blink Reformat1c4d759e2017-04-09 16:34:541726 event_down.unmodified_text[0] = text;
[email protected]3db130e2014-03-27 08:14:481727 }
1728
Blink Reformat1c4d759e2017-04-09 16:34:541729 if (event_down.GetModifiers() != 0)
1730 event_down.is_system_key = IsSystemKeyEvent(event_down);
[email protected]3db130e2014-03-27 08:14:481731
dtapuska899ac222017-01-03 18:09:161732 WebKeyboardEvent event_up = event_down;
Blink Reformat1c4d759e2017-04-09 16:34:541733 event_up.SetType(WebInputEvent::kKeyUp);
[email protected]3db130e2014-03-27 08:14:481734 // EventSender.m forces a layout here, with at least one
1735 // test (fast/forms/focus-control-to-page.html) relying on this.
1736 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541737 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481738
1739 // In the browser, if a keyboard event corresponds to an editor command,
1740 // the command will be dispatched to the renderer just before dispatching
1741 // the keyboard event, and then it will be executed in the
1742 // RenderView::handleCurrentKeyboardEvent() method.
1743 // We just simulate the same behavior here.
1744 std::string edit_command;
1745 if (GetEditCommand(event_down, &edit_command))
lukasza335bb762016-04-22 16:44:031746 delegate()->SetEditCommand(edit_command, "");
[email protected]3db130e2014-03-27 08:14:481747
tkent588765612014-11-28 01:07:481748 HandleInputEventOnViewOrPopup(event_down);
[email protected]3db130e2014-03-27 08:14:481749
Blink Reformat1c4d759e2017-04-09 16:34:541750 if (code == ui::VKEY_ESCAPE && !current_drag_data_.IsNull()) {
1751 WebMouseEvent event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161752 ModifiersForPointer(kRawMousePointerId),
1753 GetCurrentEventTimeSec());
1754 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:531755 current_pointer_state_[kRawMousePointerId].current_buttons_,
1756 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161757 click_count_, &event);
Blink Reformat1c4d759e2017-04-09 16:34:541758 FinishDragAndDrop(event, blink::kWebDragOperationNone);
[email protected]3db130e2014-03-27 08:14:481759 }
1760
lukasza335bb762016-04-22 16:44:031761 delegate()->ClearEditCommand();
[email protected]3db130e2014-03-27 08:14:481762
1763 if (generate_char) {
1764 WebKeyboardEvent event_char = event_up;
Blink Reformat1c4d759e2017-04-09 16:34:541765 event_char.SetType(WebInputEvent::kChar);
tkent588765612014-11-28 01:07:481766 HandleInputEventOnViewOrPopup(event_char);
[email protected]3db130e2014-03-27 08:14:481767 }
1768
tkent588765612014-11-28 01:07:481769 HandleInputEventOnViewOrPopup(event_up);
[email protected]3db130e2014-03-27 08:14:481770}
1771
1772void EventSender::EnableDOMUIEventLogging() {}
1773
1774void EventSender::FireKeyboardEventsToElement() {}
1775
1776void EventSender::ClearKillRing() {}
1777
1778std::vector<std::string> EventSender::ContextClick() {
lukaszad322c5ca2016-10-07 00:32:341779 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541780 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481781
Blink Reformat1c4d759e2017-04-09 16:34:541782 UpdateClickCountForButton(WebMouseEvent::Button::kRight);
[email protected]3db130e2014-03-27 08:14:481783
1784 // Clears last context menu data because we need to know if the context menu
1785 // be requested after following mouse events.
1786 last_context_menu_data_.reset();
1787
1788 // Generate right mouse down and up.
[email protected]3db130e2014-03-27 08:14:481789 // This is a hack to work around only allowing a single pressed button since
1790 // we want to test the case where both the left and right mouse buttons are
1791 // pressed.
mustaq21aed4e2015-12-15 21:47:211792 // TODO(mustaq): This hack seems unused here! But do we need this hack at all
1793 // after adding current_buttons_.
mustaqabca6ff2016-06-09 17:29:531794 if (current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:541795 WebMouseEvent::Button::kNoButton) {
mustaqabca6ff2016-06-09 17:29:531796 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541797 WebMouseEvent::Button::kRight;
mustaqabca6ff2016-06-09 17:29:531798 current_pointer_state_[kRawMousePointerId].current_buttons_ |=
nzolghadr43146032016-04-11 15:33:381799 GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:531800 current_pointer_state_[kRawMousePointerId].pressed_button_);
[email protected]3db130e2014-03-27 08:14:481801 }
Blink Reformat1c4d759e2017-04-09 16:34:541802 WebMouseEvent event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:161803 ModifiersForPointer(kRawMousePointerId),
1804 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541805 InitMouseEvent(WebMouseEvent::Button::kRight,
mustaqabca6ff2016-06-09 17:29:531806 current_pointer_state_[kRawMousePointerId].current_buttons_,
1807 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161808 click_count_, &event);
tkent588765612014-11-28 01:07:481809 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481810
1811#if defined(OS_WIN)
mustaqabca6ff2016-06-09 17:29:531812 current_pointer_state_[kRawMousePointerId].current_buttons_ &=
Blink Reformat1c4d759e2017-04-09 16:34:541813 ~GetWebMouseEventModifierForButton(WebMouseEvent::Button::kRight);
mustaqabca6ff2016-06-09 17:29:531814 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:541815 WebMouseEvent::Button::kNoButton;
mustaq21aed4e2015-12-15 21:47:211816
Blink Reformat1c4d759e2017-04-09 16:34:541817 WebMouseEvent mouseUpEvent(WebInputEvent::kMouseUp,
dtapuska899ac222017-01-03 18:09:161818 ModifiersForPointer(kRawMousePointerId),
1819 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:541820 InitMouseEvent(WebMouseEvent::Button::kRight,
mustaqabca6ff2016-06-09 17:29:531821 current_pointer_state_[kRawMousePointerId].current_buttons_,
1822 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:161823 click_count_, &mouseUpEvent);
1824 HandleInputEventOnViewOrPopup(mouseUpEvent);
[email protected]3db130e2014-03-27 08:14:481825#endif
1826
jochen73e711c2015-06-03 10:01:461827 std::vector<std::string> menu_items =
lukasza335bb762016-04-22 16:44:031828 MakeMenuItemStringsFor(last_context_menu_data_.get(), delegate());
[email protected]e7c71192014-04-23 11:53:481829 last_context_menu_data_.reset();
1830 return menu_items;
[email protected]3db130e2014-03-27 08:14:481831}
1832
1833void EventSender::TextZoomIn() {
Blink Reformat1c4d759e2017-04-09 16:34:541834 view()->SetTextZoomFactor(view()->TextZoomFactor() * 1.2f);
[email protected]3db130e2014-03-27 08:14:481835}
1836
1837void EventSender::TextZoomOut() {
Blink Reformat1c4d759e2017-04-09 16:34:541838 view()->SetTextZoomFactor(view()->TextZoomFactor() / 1.2f);
[email protected]3db130e2014-03-27 08:14:481839}
1840
1841void EventSender::ZoomPageIn() {
lfg05e41372016-07-22 15:38:101842 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031843 interfaces()->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481844
1845 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541846 window_list.at(i)->web_view()->SetZoomLevel(
1847 window_list.at(i)->web_view()->ZoomLevel() + 1);
[email protected]3db130e2014-03-27 08:14:481848 }
1849}
1850
1851void EventSender::ZoomPageOut() {
lfg05e41372016-07-22 15:38:101852 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031853 interfaces()->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481854
1855 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541856 window_list.at(i)->web_view()->SetZoomLevel(
1857 window_list.at(i)->web_view()->ZoomLevel() - 1);
[email protected]3db130e2014-03-27 08:14:481858 }
1859}
1860
[email protected]b32fe542014-04-30 08:42:061861void EventSender::SetPageZoomFactor(double zoom_factor) {
lfg05e41372016-07-22 15:38:101862 const std::vector<WebViewTestProxyBase*>& window_list =
lukasza335bb762016-04-22 16:44:031863 interfaces()->GetWindowList();
[email protected]b32fe542014-04-30 08:42:061864
1865 for (size_t i = 0; i < window_list.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541866 window_list.at(i)->web_view()->SetZoomLevel(std::log(zoom_factor) /
lukasza01da2602016-04-05 14:51:261867 std::log(1.2));
[email protected]b32fe542014-04-30 08:42:061868 }
1869}
1870
[email protected]3db130e2014-03-27 08:14:481871void EventSender::ClearTouchPoints() {
1872 touch_points_.clear();
1873}
1874
[email protected]bfb6a602014-04-16 19:59:411875void EventSender::ThrowTouchPointError() {
Blink Reformat1c4d759e2017-04-09 16:34:541876 v8::Isolate* isolate = blink::MainThreadIsolate();
[email protected]bfb6a602014-04-16 19:59:411877 isolate->ThrowException(v8::Exception::TypeError(
1878 gin::StringToV8(isolate, "Invalid touch point.")));
1879}
1880
[email protected]3db130e2014-03-27 08:14:481881void EventSender::ReleaseTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411882 if (index >= touch_points_.size()) {
1883 ThrowTouchPointError();
1884 return;
1885 }
[email protected]3db130e2014-03-27 08:14:481886
1887 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541888 touch_point->state = WebTouchPoint::kStateReleased;
[email protected]3db130e2014-03-27 08:14:481889}
1890
e.hakkinen80033922015-07-31 08:41:351891void EventSender::UpdateTouchPoint(unsigned index,
1892 float x,
1893 float y,
1894 gin::Arguments* args) {
[email protected]bfb6a602014-04-16 19:59:411895 if (index >= touch_points_.size()) {
1896 ThrowTouchPointError();
1897 return;
1898 }
[email protected]3db130e2014-03-27 08:14:481899
1900 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541901 touch_point->state = WebTouchPoint::kStateMoved;
Mustaq Ahmedff30a0e42017-05-31 17:04:281902 touch_point->SetPositionInWidget(x, y);
1903 touch_point->SetPositionInScreen(x, y);
e.hakkinen80033922015-07-31 08:41:351904
Blink Reformat1c4d759e2017-04-09 16:34:541905 InitPointerProperties(args, touch_point, &touch_point->radius_x,
1906 &touch_point->radius_y);
[email protected]3db130e2014-03-27 08:14:481907}
1908
1909void EventSender::CancelTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411910 if (index >= touch_points_.size()) {
1911 ThrowTouchPointError();
1912 return;
1913 }
[email protected]3db130e2014-03-27 08:14:481914
1915 WebTouchPoint* touch_point = &touch_points_[index];
Blink Reformat1c4d759e2017-04-09 16:34:541916 touch_point->state = WebTouchPoint::kStateCancelled;
[email protected]3db130e2014-03-27 08:14:481917}
1918
dcheng59826e32017-02-22 10:31:361919void EventSender::SetTouchModifier(const std::string& key_name, bool set_mask) {
mustaq21aed4e2015-12-15 21:47:211920 int mask = GetKeyModifier(key_name);
[email protected]3db130e2014-03-27 08:14:481921
1922 if (set_mask)
1923 touch_modifiers_ |= mask;
1924 else
1925 touch_modifiers_ &= ~mask;
1926}
1927
[email protected]ace1cd502014-04-24 21:05:301928void EventSender::SetTouchCancelable(bool cancelable) {
1929 touch_cancelable_ = cancelable;
1930}
1931
[email protected]3db130e2014-03-27 08:14:481932void EventSender::DumpFilenameBeingDragged() {
Blink Reformat1c4d759e2017-04-09 16:34:541933 if (current_drag_data_.IsNull())
dchengc3fe4642015-01-22 06:29:521934 return;
1935
Blink Reformat1c4d759e2017-04-09 16:34:541936 WebVector<WebDragData::Item> items = current_drag_data_.Items();
[email protected]3db130e2014-03-27 08:14:481937 for (size_t i = 0; i < items.size(); ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541938 if (items[i].storage_type == WebDragData::Item::kStorageTypeBinaryData) {
1939 WebURL url = items[i].binary_data_source_url;
1940 WebString filename_extension = items[i].binary_data_filename_extension;
1941 WebString content_disposition = items[i].binary_data_content_disposition;
dcheng3dd85612017-02-08 10:46:231942 base::FilePath filename =
Blink Reformat1c4d759e2017-04-09 16:34:541943 net::GenerateFileName(url, content_disposition.Utf8(),
dcheng3dd85612017-02-08 10:46:231944 std::string(), // referrer_charset
1945 std::string(), // suggested_name
1946 std::string(), // mime_type
1947 std::string()); // default_name
1948#if defined(OS_WIN)
Blink Reformat1c4d759e2017-04-09 16:34:541949 filename = filename.ReplaceExtension(filename_extension.Utf16());
dcheng3dd85612017-02-08 10:46:231950#else
Blink Reformat1c4d759e2017-04-09 16:34:541951 filename = filename.ReplaceExtension(filename_extension.Utf8());
dcheng3dd85612017-02-08 10:46:231952#endif
1953 delegate()->PrintMessage(std::string("Filename being dragged: ") +
1954 filename.AsUTF8Unsafe() + "\n");
1955 return;
[email protected]3db130e2014-03-27 08:14:481956 }
1957 }
[email protected]3db130e2014-03-27 08:14:481958}
1959
1960void EventSender::GestureFlingCancel() {
Blink Reformat1c4d759e2017-04-09 16:34:541961 WebGestureEvent event(WebInputEvent::kGestureFlingCancel,
1962 WebInputEvent::kNoModifiers, GetCurrentEventTimeSec());
wjmaclean3bb814792015-10-20 01:13:321963 // Generally it won't matter what device we use here, and since it might
1964 // be cumbersome to expect all callers to specify a device, we'll just
1965 // choose Touchpad here.
Blink Reformat1c4d759e2017-04-09 16:34:541966 event.source_device = blink::kWebGestureDeviceTouchpad;
[email protected]3db130e2014-03-27 08:14:481967
1968 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:541969 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481970
tkent588765612014-11-28 01:07:481971 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481972}
1973
1974void EventSender::GestureFlingStart(float x,
tdresser3a1c9722015-02-13 15:44:531975 float y,
1976 float velocity_x,
1977 float velocity_y,
1978 gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:541979 WebGestureEvent event(WebInputEvent::kGestureFlingStart,
1980 WebInputEvent::kNoModifiers, GetCurrentEventTimeSec());
[email protected]3db130e2014-03-27 08:14:481981
tdresser15af5872015-02-18 14:03:021982 std::string device_string;
1983 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString())
1984 args->GetNext(&device_string);
tdresser3a1c9722015-02-13 15:44:531985
1986 if (device_string == kSourceDeviceStringTouchpad) {
Blink Reformat1c4d759e2017-04-09 16:34:541987 event.source_device = blink::kWebGestureDeviceTouchpad;
tdresser3a1c9722015-02-13 15:44:531988 } else if (device_string == kSourceDeviceStringTouchscreen) {
Blink Reformat1c4d759e2017-04-09 16:34:541989 event.source_device = blink::kWebGestureDeviceTouchscreen;
tdresser3a1c9722015-02-13 15:44:531990 } else {
1991 args->ThrowError();
1992 return;
1993 }
1994
sahel42a50bb2016-07-22 19:34:041995 float max_start_velocity = std::max(fabs(velocity_x), fabs(velocity_y));
1996 if (!max_start_velocity) {
Blink Reformat1c4d759e2017-04-09 16:34:541997 v8::Isolate* isolate = blink::MainThreadIsolate();
sahel42a50bb2016-07-22 19:34:041998 isolate->ThrowException(v8::Exception::TypeError(
dcheng59826e32017-02-22 10:31:361999 gin::StringToV8(isolate, "Invalid max start velocity.")));
sahel42a50bb2016-07-22 19:34:042000 return;
2001 }
2002
[email protected]3db130e2014-03-27 08:14:482003 event.x = x;
2004 event.y = y;
Blink Reformat1c4d759e2017-04-09 16:34:542005 event.global_x = event.x;
2006 event.global_y = event.y;
[email protected]3db130e2014-03-27 08:14:482007
Blink Reformat1c4d759e2017-04-09 16:34:542008 event.data.fling_start.velocity_x = velocity_x;
2009 event.data.fling_start.velocity_y = velocity_y;
[email protected]3db130e2014-03-27 08:14:482010
2011 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542012 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482013
tkent588765612014-11-28 01:07:482014 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:482015}
2016
W. James MacLeanb5846e52017-08-31 20:39:502017bool EventSender::IsFlinging() {
2018 return mainFrameWidget()->IsFlinging();
tdresserd7bba522016-02-19 22:40:132019}
2020
[email protected]3db130e2014-03-27 08:14:482021void EventSender::GestureScrollFirstPoint(int x, int y) {
2022 current_gesture_location_ = WebPoint(x, y);
2023}
2024
rbyers709aa1e2016-05-12 04:44:062025void EventSender::TouchStart(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542026 SendCurrentTouchEvent(WebInputEvent::kTouchStart, args);
mustaq96985f722015-06-30 21:41:532027}
2028
rbyers709aa1e2016-05-12 04:44:062029void EventSender::TouchMove(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542030 SendCurrentTouchEvent(WebInputEvent::kTouchMove, args);
[email protected]3db130e2014-03-27 08:14:482031}
2032
rbyers709aa1e2016-05-12 04:44:062033void EventSender::TouchCancel(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542034 SendCurrentTouchEvent(WebInputEvent::kTouchCancel, args);
rbyers709aa1e2016-05-12 04:44:062035}
2036
2037void EventSender::TouchEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542038 SendCurrentTouchEvent(WebInputEvent::kTouchEnd, args);
[email protected]3db130e2014-03-27 08:14:482039}
2040
mustaqb3c44a02016-04-19 18:49:052041void EventSender::NotifyStartOfTouchScroll() {
Navid Zolghadr24ff17d2018-01-24 20:58:042042 WebPointerEvent event = WebPointerEvent::CreatePointerCausesUaActionEvent(
2043 WebPointerProperties::PointerType::kUnknown, GetCurrentEventTimeSec());
mustaqb3c44a02016-04-19 18:49:052044 HandleInputEventOnViewOrPopup(event);
2045}
2046
[email protected]3db130e2014-03-27 08:14:482047void EventSender::LeapForward(int milliseconds) {
nzolghadr43146032016-04-11 15:33:382048 if (is_drag_mode_ &&
mustaqabca6ff2016-06-09 17:29:532049 current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542050 WebMouseEvent::Button::kLeft &&
[email protected]3db130e2014-03-27 08:14:482051 !replaying_saved_events_) {
2052 SavedEvent saved_event;
2053 saved_event.type = SavedEvent::TYPE_LEAP_FORWARD;
2054 saved_event.milliseconds = milliseconds;
2055 mouse_event_queue_.push_back(saved_event);
2056 } else {
2057 DoLeapForward(milliseconds);
2058 }
2059}
2060
2061void EventSender::BeginDragWithFiles(const std::vector<std::string>& files) {
Blink Reformat1c4d759e2017-04-09 16:34:542062 if (!current_drag_data_.IsNull()) {
sigbjornf23324ff2016-02-22 15:46:312063 // Nested dragging not supported, fuzzer code a likely culprit.
2064 // Cancel the current drag operation and throw an error.
dtapuska0d1f4af2016-06-29 16:42:222065 KeyDown("Escape", 0, DOMKeyLocationStandard);
Blink Reformat1c4d759e2017-04-09 16:34:542066 v8::Isolate* isolate = blink::MainThreadIsolate();
dcheng59826e32017-02-22 10:31:362067 isolate->ThrowException(v8::Exception::Error(gin::StringToV8(
2068 isolate, "Nested beginDragWithFiles() not supported.")));
sigbjornf23324ff2016-02-22 15:46:312069 return;
2070 }
Blink Reformat1c4d759e2017-04-09 16:34:542071 current_drag_data_.Initialize();
[email protected]3db130e2014-03-27 08:14:482072 WebVector<WebString> absolute_filenames(files.size());
2073 for (size_t i = 0; i < files.size(); ++i) {
2074 WebDragData::Item item;
Blink Reformat1c4d759e2017-04-09 16:34:542075 item.storage_type = WebDragData::Item::kStorageTypeFilename;
2076 item.filename_data = delegate()->GetAbsoluteWebStringFromUTF8Path(files[i]);
2077 current_drag_data_.AddItem(item);
2078 absolute_filenames[i] = item.filename_data;
[email protected]3db130e2014-03-27 08:14:482079 }
Blink Reformat1c4d759e2017-04-09 16:34:542080 current_drag_data_.SetFilesystemId(
lukasza335bb762016-04-22 16:44:032081 delegate()->RegisterIsolatedFileSystem(absolute_filenames));
Blink Reformat1c4d759e2017-04-09 16:34:542082 current_drag_effects_allowed_ = blink::kWebDragOperationCopy;
[email protected]3db130e2014-03-27 08:14:482083
oshima76b6eeb2016-06-27 15:55:122084 const WebPoint& last_pos =
2085 current_pointer_state_[kRawMousePointerId].last_pos_;
2086 float scale = delegate()->GetWindowToViewportScale();
Ella Ge80a52dce2017-11-15 18:01:522087 WebFloatPoint scaled_last_pos(last_pos.x * scale, last_pos.y * scale);
oshima76b6eeb2016-06-27 15:55:122088
[email protected]3db130e2014-03-27 08:14:482089 // Provide a drag source.
Blink Reformat1c4d759e2017-04-09 16:34:542090 mainFrameWidget()->DragTargetDragEnter(current_drag_data_, scaled_last_pos,
dcheng59826e32017-02-22 10:31:362091 scaled_last_pos,
2092 current_drag_effects_allowed_, 0);
[email protected]3db130e2014-03-27 08:14:482093 // |is_drag_mode_| saves events and then replays them later. We don't
2094 // need/want that.
2095 is_drag_mode_ = false;
2096
2097 // Make the rest of eventSender think a drag is in progress.
mustaqabca6ff2016-06-09 17:29:532098 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:542099 WebMouseEvent::Button::kLeft;
mustaqabca6ff2016-06-09 17:29:532100 current_pointer_state_[kRawMousePointerId].current_buttons_ |=
nzolghadr43146032016-04-11 15:33:382101 GetWebMouseEventModifierForButton(
mustaqabca6ff2016-06-09 17:29:532102 current_pointer_state_[kRawMousePointerId].pressed_button_);
[email protected]3db130e2014-03-27 08:14:482103}
2104
e.hakkinen80033922015-07-31 08:41:352105void EventSender::AddTouchPoint(float x, float y, gin::Arguments* args) {
Ella Gef69b51b2017-09-28 16:30:452106 if (touch_points_.size() == WebTouchEvent::kTouchesLengthCap) {
2107 args->ThrowError();
2108 return;
2109 }
[email protected]3db130e2014-03-27 08:14:482110 WebTouchPoint touch_point;
Blink Reformat1c4d759e2017-04-09 16:34:542111 touch_point.pointer_type = WebPointerProperties::PointerType::kTouch;
2112 touch_point.state = WebTouchPoint::kStatePressed;
Mustaq Ahmedff30a0e42017-05-31 17:04:282113 touch_point.SetPositionInWidget(x, y);
2114 touch_point.SetPositionInScreen(x, y);
[email protected]3db130e2014-03-27 08:14:482115
mustaq913e8922015-09-09 20:15:362116 int highest_id = -1;
[email protected]3db130e2014-03-27 08:14:482117 for (size_t i = 0; i < touch_points_.size(); i++) {
mustaq913e8922015-09-09 20:15:362118 if (touch_points_[i].id > highest_id)
2119 highest_id = touch_points_[i].id;
[email protected]3db130e2014-03-27 08:14:482120 }
mustaq913e8922015-09-09 20:15:362121 touch_point.id = highest_id + 1;
e.hakkinen80033922015-07-31 08:41:352122
Blink Reformat1c4d759e2017-04-09 16:34:542123 InitPointerProperties(args, &touch_point, &touch_point.radius_x,
2124 &touch_point.radius_y);
e.hakkinen80033922015-07-31 08:41:352125
nzolghadr88114bc2016-02-01 21:46:162126 // Set the touch point pressure to zero if it was not set by the caller
landell7d38a9a12016-02-04 16:34:552127 if (std::isnan(touch_point.force))
dcheng59826e32017-02-22 10:31:362128 touch_point.force = 0.0;
nzolghadr88114bc2016-02-01 21:46:162129
[email protected]3db130e2014-03-27 08:14:482130 touch_points_.push_back(touch_point);
2131}
2132
[email protected]3db130e2014-03-27 08:14:482133void EventSender::GestureScrollBegin(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542134 GestureEvent(WebInputEvent::kGestureScrollBegin, args);
[email protected]3db130e2014-03-27 08:14:482135}
2136
2137void EventSender::GestureScrollEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542138 GestureEvent(WebInputEvent::kGestureScrollEnd, args);
[email protected]3db130e2014-03-27 08:14:482139}
2140
2141void EventSender::GestureScrollUpdate(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542142 GestureEvent(WebInputEvent::kGestureScrollUpdate, args);
[email protected]3db130e2014-03-27 08:14:482143}
2144
ccameronb81b8072015-01-30 00:54:492145void EventSender::GesturePinchBegin(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542146 GestureEvent(WebInputEvent::kGesturePinchBegin, args);
ccameronb81b8072015-01-30 00:54:492147}
2148
2149void EventSender::GesturePinchEnd(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542150 GestureEvent(WebInputEvent::kGesturePinchEnd, args);
ccameronb81b8072015-01-30 00:54:492151}
2152
2153void EventSender::GesturePinchUpdate(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542154 GestureEvent(WebInputEvent::kGesturePinchUpdate, args);
ccameronb81b8072015-01-30 00:54:492155}
2156
[email protected]3db130e2014-03-27 08:14:482157void EventSender::GestureTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542158 GestureEvent(WebInputEvent::kGestureTap, args);
[email protected]3db130e2014-03-27 08:14:482159}
2160
2161void EventSender::GestureTapDown(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542162 GestureEvent(WebInputEvent::kGestureTapDown, args);
[email protected]3db130e2014-03-27 08:14:482163}
2164
2165void EventSender::GestureShowPress(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542166 GestureEvent(WebInputEvent::kGestureShowPress, args);
[email protected]3db130e2014-03-27 08:14:482167}
2168
2169void EventSender::GestureTapCancel(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542170 GestureEvent(WebInputEvent::kGestureTapCancel, args);
[email protected]3db130e2014-03-27 08:14:482171}
2172
2173void EventSender::GestureLongPress(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542174 GestureEvent(WebInputEvent::kGestureLongPress, args);
[email protected]3db130e2014-03-27 08:14:482175}
2176
2177void EventSender::GestureLongTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542178 GestureEvent(WebInputEvent::kGestureLongTap, args);
[email protected]3db130e2014-03-27 08:14:482179}
2180
2181void EventSender::GestureTwoFingerTap(gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542182 GestureEvent(WebInputEvent::kGestureTwoFingerTap, args);
[email protected]3db130e2014-03-27 08:14:482183}
2184
dtapuska43f18e9e2016-03-20 20:21:302185void EventSender::MouseScrollBy(gin::Arguments* args,
2186 MouseScrollType scroll_type) {
dtapuska43f18e9e2016-03-20 20:21:302187 // TODO(dtapuska): Gestures really should be sent by the MouseWheelEventQueue
2188 // class in the browser. But since the event doesn't propogate up into
2189 // the browser generate the events here. See crbug.com/596095.
dtapuskab8b21412016-06-16 11:09:142190 bool send_gestures = true;
dtapuska899ac222017-01-03 18:09:162191 WebMouseWheelEvent wheel_event =
2192 GetMouseWheelEvent(args, scroll_type, &send_gestures);
Blink Reformat1c4d759e2017-04-09 16:34:542193 if (wheel_event.GetType() != WebInputEvent::kUndefined &&
dtapuska899ac222017-01-03 18:09:162194 HandleInputEventOnViewOrPopup(wheel_event) ==
Blink Reformat1c4d759e2017-04-09 16:34:542195 WebInputEventResult::kNotHandled &&
dtapuska43f18e9e2016-03-20 20:21:302196 send_gestures) {
2197 SendGesturesForMouseWheelEvent(wheel_event);
2198 }
[email protected]3db130e2014-03-27 08:14:482199}
2200
[email protected]3db130e2014-03-27 08:14:482201void EventSender::MouseMoveTo(gin::Arguments* args) {
2202 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542203 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482204
[email protected]f53eba122014-04-16 11:30:012205 double x;
2206 double y;
mustaq0fff7fc32014-09-24 20:21:432207 if (!args->GetNext(&x) || !args->GetNext(&y)) {
2208 args->ThrowError();
2209 return;
2210 }
[email protected]f53eba122014-04-16 11:30:012211 WebPoint mouse_pos(static_cast<int>(x), static_cast<int>(y));
[email protected]3db130e2014-03-27 08:14:482212
2213 int modifiers = 0;
nzolghadr43146032016-04-11 15:33:382214 if (!args->PeekNext().IsEmpty()) {
bashidbd2ef9bb2015-06-02 01:39:322215 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
nzolghadr43146032016-04-11 15:33:382216 args->Skip();
2217 }
[email protected]3db130e2014-03-27 08:14:482218
mustaqabca6ff2016-06-09 17:29:532219 WebPointerProperties::PointerType pointerType =
Blink Reformat1c4d759e2017-04-09 16:34:542220 WebPointerProperties::PointerType::kMouse;
mustaqabca6ff2016-06-09 17:29:532221 int pointerId = 0;
2222 float pressure = 0;
2223 int tiltX = 0;
2224 int tiltY = 0;
2225 if (!getMousePenPointerProperties(args, pointerType, pointerId, pressure,
2226 tiltX, tiltY))
nzolghadr43146032016-04-11 15:33:382227 return;
2228
Blink Reformat1c4d759e2017-04-09 16:34:542229 if (pointerType == WebPointerProperties::PointerType::kMouse &&
nzolghadr43146032016-04-11 15:33:382230 is_drag_mode_ && !replaying_saved_events_ &&
mustaqabca6ff2016-06-09 17:29:532231 current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542232 WebMouseEvent::Button::kLeft) {
[email protected]3db130e2014-03-27 08:14:482233 SavedEvent saved_event;
2234 saved_event.type = SavedEvent::TYPE_MOUSE_MOVE;
2235 saved_event.pos = mouse_pos;
2236 saved_event.modifiers = modifiers;
2237 mouse_event_queue_.push_back(saved_event);
2238 } else {
nzolghadr43146032016-04-11 15:33:382239 current_pointer_state_[pointerId].last_pos_ = mouse_pos;
dtapuska899ac222017-01-03 18:09:162240 current_pointer_state_[pointerId].modifiers_ = modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542241 WebMouseEvent event(WebInputEvent::kMouseMove,
dtapuska899ac222017-01-03 18:09:162242 ModifiersForPointer(pointerId),
2243 GetCurrentEventTimeSec());
Blink Reformat1c4d759e2017-04-09 16:34:542244 int click_count = pointerType == WebPointerProperties::PointerType::kMouse
mustaqabca6ff2016-06-09 17:29:532245 ? click_count_
2246 : 0;
2247 InitMouseEventGeneric(
mustaqabca6ff2016-06-09 17:29:532248 current_pointer_state_[kRawMousePointerId].pressed_button_,
2249 current_pointer_state_[kRawMousePointerId].current_buttons_, mouse_pos,
dtapuska899ac222017-01-03 18:09:162250 click_count, pointerType, pointerId, pressure, tiltX, tiltY, &event);
nzolghadr43146032016-04-11 15:33:382251 HandleInputEventOnViewOrPopup(event);
Blink Reformat1c4d759e2017-04-09 16:34:542252 if (pointerType == WebPointerProperties::PointerType::kMouse)
nzolghadr43146032016-04-11 15:33:382253 DoDragAfterMouseMove(event);
[email protected]3db130e2014-03-27 08:14:482254 }
2255}
2256
lanwei0474c2a52017-05-12 18:52:012257void EventSender::MouseLeave(
2258 blink::WebPointerProperties::PointerType pointerType,
2259 int pointerId) {
myid.shin12c7fea22015-03-06 02:31:242260 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542261 widget()->UpdateAllLifecyclePhases();
myid.shin12c7fea22015-03-06 02:31:242262
Blink Reformat1c4d759e2017-04-09 16:34:542263 WebMouseEvent event(WebInputEvent::kMouseLeave,
lanwei0474c2a52017-05-12 18:52:012264 ModifiersForPointer(pointerId), GetCurrentEventTimeSec());
2265 InitMouseEventGeneric(WebMouseEvent::Button::kNoButton, 0,
2266 current_pointer_state_[kRawMousePointerId].last_pos_,
2267 click_count_, pointerType, pointerId, 0.0, 0, 0,
2268 &event);
thestigfd11ffe2015-12-30 19:25:452269 HandleInputEventOnViewOrPopup(event);
myid.shin12c7fea22015-03-06 02:31:242270}
2271
[email protected]3db130e2014-03-27 08:14:482272void EventSender::ScheduleAsynchronousClick(int button_number, int modifiers) {
tzik5f3ffb22016-09-21 16:54:542273 delegate()->PostTask(base::Bind(&EventSender::MouseDown,
2274 weak_factory_.GetWeakPtr(), button_number,
2275 modifiers));
2276 delegate()->PostTask(base::Bind(&EventSender::MouseUp,
2277 weak_factory_.GetWeakPtr(), button_number,
2278 modifiers));
[email protected]3db130e2014-03-27 08:14:482279}
2280
2281void EventSender::ScheduleAsynchronousKeyDown(const std::string& code_str,
2282 int modifiers,
2283 KeyLocationCode location) {
tzik5f3ffb22016-09-21 16:54:542284 delegate()->PostTask(base::Bind(&EventSender::KeyDown,
2285 weak_factory_.GetWeakPtr(), code_str,
2286 modifiers, location));
[email protected]3db130e2014-03-27 08:14:482287}
2288
Mustaq Ahmedc9b974a2018-01-22 19:43:442289void EventSender::ConsumeUserActivation() {
2290 blink::WebUserGestureIndicator::ConsumeUserGesture(
2291 view()->MainFrame()->ToWebLocalFrame());
2292}
2293
[email protected]3db130e2014-03-27 08:14:482294double EventSender::GetCurrentEventTimeSec() {
majidvpeabdeb82015-11-30 19:02:052295 return (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF() +
majidvpbfabb0712015-10-02 16:30:002296 time_offset_ms_ / 1000.0;
[email protected]3db130e2014-03-27 08:14:482297}
2298
2299void EventSender::DoLeapForward(int milliseconds) {
2300 time_offset_ms_ += milliseconds;
2301}
2302
mustaq19048372016-06-16 21:39:322303uint32_t EventSender::GetUniqueTouchEventId(gin::Arguments* args) {
2304 uint32_t unique_touch_event_id;
dcheng59826e32017-02-22 10:31:362305 if (!args->PeekNext().IsEmpty() && args->GetNext(&unique_touch_event_id))
mustaq19048372016-06-16 21:39:322306 return unique_touch_event_id;
2307
2308 return 0;
2309}
2310
mustaq96985f722015-06-30 21:41:532311void EventSender::SendCurrentTouchEvent(WebInputEvent::Type type,
mustaq19048372016-06-16 21:39:322312 gin::Arguments* args) {
lanwei00f70892017-02-07 23:12:212313 uint32_t unique_touch_event_id = GetUniqueTouchEventId(args);
mustaq19048372016-06-16 21:39:322314
Ella Gef69b51b2017-09-28 16:30:452315 DCHECK_LE(touch_points_.size(),
2316 static_cast<unsigned>(WebTouchEvent::kTouchesLengthCap));
[email protected]3db130e2014-03-27 08:14:482317 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542318 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482319
Navid Zolghadr24ff17d2018-01-24 20:58:042320 double time_stamp = GetCurrentEventTimeSec();
2321 blink::WebInputEvent::DispatchType dispatch_type =
2322 touch_cancelable_ ? WebInputEvent::kBlocking
2323 : WebInputEvent::kEventNonBlocking;
2324
2325 for (unsigned i = 0; i < touch_points_.size(); ++i) {
2326 const WebTouchPoint& touch_point = touch_points_[i];
2327 if (touch_point.state != blink::WebTouchPoint::kStateStationary) {
2328 WebPointerEvent pointer_event = WebPointerEvent(
2329 PointerEventTypeForTouchPointState(touch_point.state), touch_point,
2330 touch_point.radius_x * 2, touch_point.radius_y * 2);
Navid Zolghadrabfb81c2018-02-07 15:59:052331 pointer_event.hovering = false;
Navid Zolghadr24ff17d2018-01-24 20:58:042332 pointer_event.dispatch_type = dispatch_type;
2333 pointer_event.moved_beyond_slop_region = true;
2334 pointer_event.unique_touch_event_id = unique_touch_event_id;
2335 pointer_event.SetTimeStampSeconds(time_stamp);
2336 pointer_event.SetModifiers(touch_modifiers_);
2337
2338 HandleInputEventOnViewOrPopup(pointer_event);
2339 }
2340 }
2341 WebPagePopup* popup = widget()->GetPagePopup();
2342 if (popup)
2343 popup->DispatchBufferedTouchEvents();
2344 else
2345 widget()->DispatchBufferedTouchEvents();
[email protected]3db130e2014-03-27 08:14:482346
2347 for (size_t i = 0; i < touch_points_.size(); ++i) {
2348 WebTouchPoint* touch_point = &touch_points_[i];
Blink Reformat1c4d759e2017-04-09 16:34:542349 if (touch_point->state == WebTouchPoint::kStateReleased ||
2350 touch_point->state == WebTouchPoint::kStateCancelled) {
[email protected]3db130e2014-03-27 08:14:482351 touch_points_.erase(touch_points_.begin() + i);
2352 --i;
thestigfd11ffe2015-12-30 19:25:452353 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542354 touch_point->state = WebTouchPoint::kStateStationary;
thestigfd11ffe2015-12-30 19:25:452355 }
[email protected]3db130e2014-03-27 08:14:482356 }
2357}
2358
dcheng59826e32017-02-22 10:31:362359void EventSender::GestureEvent(WebInputEvent::Type type, gin::Arguments* args) {
Blink Reformat1c4d759e2017-04-09 16:34:542360 WebGestureEvent event(type, WebInputEvent::kNoModifiers,
dtapuska899ac222017-01-03 18:09:162361 GetCurrentEventTimeSec());
ccameronb81b8072015-01-30 00:54:492362
2363 // If the first argument is a string, it is to specify the device, otherwise
2364 // the device is assumed to be a touchscreen (since most tests were written
2365 // assuming this).
Blink Reformat1c4d759e2017-04-09 16:34:542366 event.source_device = blink::kWebGestureDeviceTouchscreen;
jochen87d2fee2015-07-13 08:21:342367 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString()) {
ccameronb81b8072015-01-30 00:54:492368 std::string device_string;
2369 if (!args->GetNext(&device_string)) {
2370 args->ThrowError();
2371 return;
2372 }
tdresser3a1c9722015-02-13 15:44:532373 if (device_string == kSourceDeviceStringTouchpad) {
Blink Reformat1c4d759e2017-04-09 16:34:542374 event.source_device = blink::kWebGestureDeviceTouchpad;
tdresser3a1c9722015-02-13 15:44:532375 } else if (device_string == kSourceDeviceStringTouchscreen) {
Blink Reformat1c4d759e2017-04-09 16:34:542376 event.source_device = blink::kWebGestureDeviceTouchscreen;
ccameronb81b8072015-01-30 00:54:492377 } else {
2378 args->ThrowError();
2379 return;
2380 }
2381 }
2382
[email protected]3db130e2014-03-27 08:14:482383 double x;
2384 double y;
mustaq0fff7fc32014-09-24 20:21:432385 if (!args->GetNext(&x) || !args->GetNext(&y)) {
2386 args->ThrowError();
2387 return;
2388 }
[email protected]3db130e2014-03-27 08:14:482389
[email protected]3db130e2014-03-27 08:14:482390 switch (type) {
Blink Reformat1c4d759e2017-04-09 16:34:542391 case WebInputEvent::kGestureScrollUpdate: {
Blink Reformat1c4d759e2017-04-09 16:34:542392 if (!GetScrollUnits(args, &event.data.scroll_update.delta_units))
dtapuskab1c5ece2016-01-18 18:18:022393 return;
majidvp50205db2014-11-27 17:28:522394
Blink Reformat1c4d759e2017-04-09 16:34:542395 event.data.scroll_update.delta_x = static_cast<float>(x);
2396 event.data.scroll_update.delta_y = static_cast<float>(y);
[email protected]3db130e2014-03-27 08:14:482397 event.x = current_gesture_location_.x;
2398 event.y = current_gesture_location_.y;
2399 current_gesture_location_.x =
Blink Reformat1c4d759e2017-04-09 16:34:542400 current_gesture_location_.x + event.data.scroll_update.delta_x;
[email protected]3db130e2014-03-27 08:14:482401 current_gesture_location_.y =
Blink Reformat1c4d759e2017-04-09 16:34:542402 current_gesture_location_.y + event.data.scroll_update.delta_y;
[email protected]3db130e2014-03-27 08:14:482403 break;
majidvp50205db2014-11-27 17:28:522404 }
Blink Reformat1c4d759e2017-04-09 16:34:542405 case WebInputEvent::kGestureScrollBegin:
mustaq0fff7fc32014-09-24 20:21:432406 current_gesture_location_ = WebPoint(x, y);
[email protected]3db130e2014-03-27 08:14:482407 event.x = current_gesture_location_.x;
2408 event.y = current_gesture_location_.y;
2409 break;
Blink Reformat1c4d759e2017-04-09 16:34:542410 case WebInputEvent::kGestureScrollEnd:
2411 case WebInputEvent::kGestureFlingStart:
[email protected]3db130e2014-03-27 08:14:482412 event.x = current_gesture_location_.x;
2413 event.y = current_gesture_location_.y;
2414 break;
Blink Reformat1c4d759e2017-04-09 16:34:542415 case WebInputEvent::kGesturePinchBegin:
2416 case WebInputEvent::kGesturePinchEnd:
ccameronb81b8072015-01-30 00:54:492417 current_gesture_location_ = WebPoint(x, y);
2418 event.x = current_gesture_location_.x;
2419 event.y = current_gesture_location_.y;
2420 break;
Blink Reformat1c4d759e2017-04-09 16:34:542421 case WebInputEvent::kGesturePinchUpdate: {
ccameronb81b8072015-01-30 00:54:492422 float scale = 1;
2423 if (!args->PeekNext().IsEmpty()) {
2424 if (!args->GetNext(&scale)) {
2425 args->ThrowError();
2426 return;
2427 }
2428 }
Blink Reformat1c4d759e2017-04-09 16:34:542429 event.data.pinch_update.scale = scale;
ccameronb81b8072015-01-30 00:54:492430 current_gesture_location_ = WebPoint(x, y);
2431 event.x = current_gesture_location_.x;
2432 event.y = current_gesture_location_.y;
2433 break;
2434 }
Blink Reformat1c4d759e2017-04-09 16:34:542435 case WebInputEvent::kGestureTap: {
[email protected]c278d7532014-07-31 19:51:452436 float tap_count = 1;
2437 float width = 30;
2438 float height = 30;
[email protected]3db130e2014-03-27 08:14:482439 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482440 if (!args->GetNext(&tap_count)) {
2441 args->ThrowError();
2442 return;
2443 }
[email protected]3db130e2014-03-27 08:14:482444 }
[email protected]cc42ccf2014-06-27 21:31:432445 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432446 if (!args->GetNext(&width)) {
2447 args->ThrowError();
2448 return;
2449 }
[email protected]cc42ccf2014-06-27 21:31:432450 }
2451 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432452 if (!args->GetNext(&height)) {
2453 args->ThrowError();
2454 return;
2455 }
[email protected]cc42ccf2014-06-27 21:31:432456 }
Blink Reformat1c4d759e2017-04-09 16:34:542457 event.data.tap.tap_count = tap_count;
[email protected]c278d7532014-07-31 19:51:452458 event.data.tap.width = width;
2459 event.data.tap.height = height;
mustaq0fff7fc32014-09-24 20:21:432460 event.x = x;
2461 event.y = y;
[email protected]3db130e2014-03-27 08:14:482462 break;
[email protected]c278d7532014-07-31 19:51:452463 }
Blink Reformat1c4d759e2017-04-09 16:34:542464 case WebInputEvent::kGestureTapUnconfirmed:
[email protected]3db130e2014-03-27 08:14:482465 if (!args->PeekNext().IsEmpty()) {
2466 float tap_count;
2467 if (!args->GetNext(&tap_count)) {
2468 args->ThrowError();
2469 return;
2470 }
Blink Reformat1c4d759e2017-04-09 16:34:542471 event.data.tap.tap_count = tap_count;
[email protected]3db130e2014-03-27 08:14:482472 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542473 event.data.tap.tap_count = 1;
[email protected]3db130e2014-03-27 08:14:482474 }
mustaq0fff7fc32014-09-24 20:21:432475 event.x = x;
2476 event.y = y;
[email protected]3db130e2014-03-27 08:14:482477 break;
Blink Reformat1c4d759e2017-04-09 16:34:542478 case WebInputEvent::kGestureTapDown: {
[email protected]c278d7532014-07-31 19:51:452479 float width = 30;
2480 float height = 30;
[email protected]3db130e2014-03-27 08:14:482481 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482482 if (!args->GetNext(&width)) {
2483 args->ThrowError();
2484 return;
2485 }
[email protected]3db130e2014-03-27 08:14:482486 }
2487 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482488 if (!args->GetNext(&height)) {
2489 args->ThrowError();
2490 return;
2491 }
[email protected]3db130e2014-03-27 08:14:482492 }
mustaq0fff7fc32014-09-24 20:21:432493 event.x = x;
2494 event.y = y;
Blink Reformat1c4d759e2017-04-09 16:34:542495 event.data.tap_down.width = width;
2496 event.data.tap_down.height = height;
[email protected]c278d7532014-07-31 19:51:452497 break;
2498 }
Blink Reformat1c4d759e2017-04-09 16:34:542499 case WebInputEvent::kGestureShowPress: {
[email protected]c278d7532014-07-31 19:51:452500 float width = 30;
2501 float height = 30;
[email protected]3db130e2014-03-27 08:14:482502 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482503 if (!args->GetNext(&width)) {
2504 args->ThrowError();
2505 return;
2506 }
[email protected]3db130e2014-03-27 08:14:482507 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482508 if (!args->GetNext(&height)) {
2509 args->ThrowError();
2510 return;
2511 }
[email protected]3db130e2014-03-27 08:14:482512 }
2513 }
mustaq0fff7fc32014-09-24 20:21:432514 event.x = x;
2515 event.y = y;
Blink Reformat1c4d759e2017-04-09 16:34:542516 event.data.show_press.width = width;
2517 event.data.show_press.height = height;
[email protected]3db130e2014-03-27 08:14:482518 break;
[email protected]c278d7532014-07-31 19:51:452519 }
Blink Reformat1c4d759e2017-04-09 16:34:542520 case WebInputEvent::kGestureTapCancel:
mustaq0fff7fc32014-09-24 20:21:432521 event.x = x;
2522 event.y = y;
[email protected]3db130e2014-03-27 08:14:482523 break;
Blink Reformat1c4d759e2017-04-09 16:34:542524 case WebInputEvent::kGestureLongPress:
2525 case WebInputEvent::kGestureLongTap:
mustaq0fff7fc32014-09-24 20:21:432526 event.x = x;
2527 event.y = y;
[email protected]3db130e2014-03-27 08:14:482528 if (!args->PeekNext().IsEmpty()) {
2529 float width;
2530 if (!args->GetNext(&width)) {
2531 args->ThrowError();
2532 return;
2533 }
Blink Reformat1c4d759e2017-04-09 16:34:542534 event.data.long_press.width = width;
[email protected]3db130e2014-03-27 08:14:482535 if (!args->PeekNext().IsEmpty()) {
2536 float height;
2537 if (!args->GetNext(&height)) {
2538 args->ThrowError();
2539 return;
2540 }
Blink Reformat1c4d759e2017-04-09 16:34:542541 event.data.long_press.height = height;
[email protected]3db130e2014-03-27 08:14:482542 }
2543 }
2544 break;
Blink Reformat1c4d759e2017-04-09 16:34:542545 case WebInputEvent::kGestureTwoFingerTap:
mustaq0fff7fc32014-09-24 20:21:432546 event.x = x;
2547 event.y = y;
[email protected]3db130e2014-03-27 08:14:482548 if (!args->PeekNext().IsEmpty()) {
2549 float first_finger_width;
2550 if (!args->GetNext(&first_finger_width)) {
2551 args->ThrowError();
2552 return;
2553 }
Blink Reformat1c4d759e2017-04-09 16:34:542554 event.data.two_finger_tap.first_finger_width = first_finger_width;
[email protected]3db130e2014-03-27 08:14:482555 if (!args->PeekNext().IsEmpty()) {
2556 float first_finger_height;
2557 if (!args->GetNext(&first_finger_height)) {
2558 args->ThrowError();
2559 return;
2560 }
Blink Reformat1c4d759e2017-04-09 16:34:542561 event.data.two_finger_tap.first_finger_height = first_finger_height;
[email protected]3db130e2014-03-27 08:14:482562 }
2563 }
2564 break;
2565 default:
2566 NOTREACHED();
2567 }
2568
Blink Reformat1c4d759e2017-04-09 16:34:542569 event.unique_touch_event_id = GetUniqueTouchEventId(args);
chongzd65eacf2017-06-28 05:21:592570 if (!GetPointerType(args, false, event.primary_pointer_type))
2571 return;
mustaq19048372016-06-16 21:39:322572
Blink Reformat1c4d759e2017-04-09 16:34:542573 event.global_x = event.x;
2574 event.global_y = event.y;
[email protected]3db130e2014-03-27 08:14:482575
2576 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542577 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482578
dtapuska5d2e9c32015-12-03 16:39:492579 WebInputEventResult result = HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:482580
2581 // Long press might start a drag drop session. Complete it if so.
Blink Reformat1c4d759e2017-04-09 16:34:542582 if (type == WebInputEvent::kGestureLongPress &&
2583 !current_drag_data_.IsNull()) {
2584 WebMouseEvent mouse_event(WebInputEvent::kMouseDown,
dtapuska899ac222017-01-03 18:09:162585 ModifiersForPointer(kRawMousePointerId),
2586 GetCurrentEventTimeSec());
2587
2588 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:532589 current_pointer_state_[kRawMousePointerId].current_buttons_,
dtapuska899ac222017-01-03 18:09:162590 WebPoint(x, y), click_count_, &mouse_event);
[email protected]3db130e2014-03-27 08:14:482591
Blink Reformat1c4d759e2017-04-09 16:34:542592 FinishDragAndDrop(mouse_event, blink::kWebDragOperationNone);
[email protected]3db130e2014-03-27 08:14:482593 }
Blink Reformat1c4d759e2017-04-09 16:34:542594 args->Return(result != WebInputEventResult::kNotHandled);
[email protected]3db130e2014-03-27 08:14:482595}
2596
dcheng59826e32017-02-22 10:31:362597void EventSender::UpdateClickCountForButton(WebMouseEvent::Button button_type) {
[email protected]3db130e2014-03-27 08:14:482598 if ((GetCurrentEventTimeSec() - last_click_time_sec_ <
2599 kMultipleClickTimeSec) &&
nzolghadr43146032016-04-11 15:33:382600 (!OutsideMultiClickRadius(
mustaqabca6ff2016-06-09 17:29:532601 current_pointer_state_[kRawMousePointerId].last_pos_,
nzolghadr43146032016-04-11 15:33:382602 last_click_pos_)) &&
[email protected]3db130e2014-03-27 08:14:482603 (button_type == last_button_type_)) {
2604 ++click_count_;
2605 } else {
2606 click_count_ = 1;
2607 last_button_type_ = button_type;
2608 }
2609}
2610
dtapuska899ac222017-01-03 18:09:162611WebMouseWheelEvent EventSender::GetMouseWheelEvent(gin::Arguments* args,
2612 MouseScrollType scroll_type,
2613 bool* send_gestures) {
[email protected]3db130e2014-03-27 08:14:482614 // Force a layout here just to make sure every position has been
2615 // determined before we send events (as well as all the other methods
2616 // that send an event do).
2617 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542618 widget()->UpdateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482619
2620 double horizontal;
[email protected]3db130e2014-03-27 08:14:482621 double vertical;
dtapuska899ac222017-01-03 18:09:162622 if (!args->GetNext(&horizontal) || !args->GetNext(&vertical)) {
[email protected]3db130e2014-03-27 08:14:482623 args->ThrowError();
dtapuska899ac222017-01-03 18:09:162624 return WebMouseWheelEvent();
[email protected]3db130e2014-03-27 08:14:482625 }
2626
2627 bool paged = false;
2628 bool has_precise_scrolling_deltas = false;
2629 int modifiers = 0;
Blink Reformat1c4d759e2017-04-09 16:34:542630 WebMouseWheelEvent::Phase phase = WebMouseWheelEvent::kPhaseNone;
yutakf3990fd2014-12-23 03:52:382631 if (!args->PeekNext().IsEmpty()) {
2632 args->GetNext(&paged);
2633 if (!args->PeekNext().IsEmpty()) {
2634 args->GetNext(&has_precise_scrolling_deltas);
lanweia93644f2015-01-21 22:00:332635 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:412636 v8::Local<v8::Value> value;
lanweia93644f2015-01-21 22:00:332637 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:322638 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
dtapuska43f18e9e2016-03-20 20:21:302639 if (!args->PeekNext().IsEmpty()) {
dtapuskab8b21412016-06-16 11:09:142640 args->GetNext(send_gestures);
chongzb92d7112016-07-04 22:11:542641 if (!args->PeekNext().IsEmpty()) {
2642 v8::Local<v8::Value> phase_value;
2643 args->GetNext(&phase_value);
2644 phase = GetMouseWheelEventPhaseFromV8(phase_value);
2645 }
dtapuska43f18e9e2016-03-20 20:21:302646 }
lanweia93644f2015-01-21 22:00:332647 }
yutakf3990fd2014-12-23 03:52:382648 }
2649 }
[email protected]3db130e2014-03-27 08:14:482650
dtapuska899ac222017-01-03 18:09:162651 current_pointer_state_[kRawMousePointerId].modifiers_ = modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542652 WebMouseWheelEvent event(WebInputEvent::kMouseWheel,
dtapuska899ac222017-01-03 18:09:162653 ModifiersForPointer(kRawMousePointerId),
2654 GetCurrentEventTimeSec());
2655 InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_,
mustaqabca6ff2016-06-09 17:29:532656 current_pointer_state_[kRawMousePointerId].current_buttons_,
2657 current_pointer_state_[kRawMousePointerId].last_pos_,
dtapuska899ac222017-01-03 18:09:162658 click_count_, &event);
Blink Reformat1c4d759e2017-04-09 16:34:542659 event.wheel_ticks_x = static_cast<float>(horizontal);
2660 event.wheel_ticks_y = static_cast<float>(vertical);
2661 event.delta_x = event.wheel_ticks_x;
2662 event.delta_y = event.wheel_ticks_y;
2663 event.scroll_by_page = paged;
2664 event.has_precise_scrolling_deltas = has_precise_scrolling_deltas;
dtapuska899ac222017-01-03 18:09:162665 event.phase = phase;
dtapuska43f18e9e2016-03-20 20:21:302666 if (scroll_type == MouseScrollType::PIXEL) {
Blink Reformat1c4d759e2017-04-09 16:34:542667 event.wheel_ticks_x /= kScrollbarPixelsPerTick;
2668 event.wheel_ticks_y /= kScrollbarPixelsPerTick;
[email protected]3db130e2014-03-27 08:14:482669 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542670 event.delta_x *= kScrollbarPixelsPerTick;
2671 event.delta_y *= kScrollbarPixelsPerTick;
[email protected]3db130e2014-03-27 08:14:482672 }
dtapuska899ac222017-01-03 18:09:162673 return event;
[email protected]3db130e2014-03-27 08:14:482674}
2675
e.hakkinen80033922015-07-31 08:41:352676// Radius fields radius_x and radius_y should eventually be moved to
2677// WebPointerProperties.
2678// TODO(e_hakkinen): Drop radius_{x,y}_pointer parameters once that happens.
2679void EventSender::InitPointerProperties(gin::Arguments* args,
mustaqabca6ff2016-06-09 17:29:532680 WebPointerProperties* e,
e.hakkinen80033922015-07-31 08:41:352681 float* radius_x_pointer,
2682 float* radius_y_pointer) {
2683 if (!args->PeekNext().IsEmpty()) {
2684 double radius_x;
2685 if (!args->GetNext(&radius_x)) {
2686 args->ThrowError();
2687 return;
2688 }
2689
2690 double radius_y = radius_x;
2691 if (!args->PeekNext().IsEmpty()) {
2692 if (!args->GetNext(&radius_y)) {
2693 args->ThrowError();
2694 return;
2695 }
2696 }
2697
2698 *radius_x_pointer = static_cast<float>(radius_x);
2699 *radius_y_pointer = static_cast<float>(radius_y);
2700 }
2701
2702 if (!args->PeekNext().IsEmpty()) {
2703 double force;
2704 if (!args->GetNext(&force)) {
2705 args->ThrowError();
2706 return;
2707 }
2708 e->force = static_cast<float>(force);
2709 }
2710
2711 if (!args->PeekNext().IsEmpty()) {
2712 int tiltX, tiltY;
2713 if (!args->GetNext(&tiltX) || !args->GetNext(&tiltY)) {
2714 args->ThrowError();
2715 return;
2716 }
Blink Reformat1c4d759e2017-04-09 16:34:542717 e->tilt_x = tiltX;
2718 e->tilt_y = tiltY;
e.hakkinen80033922015-07-31 08:41:352719 }
2720
chongzd65eacf2017-06-28 05:21:592721 if (!GetPointerType(args, false, e->pointer_type))
nzolghadr43146032016-04-11 15:33:382722 return;
e.hakkinen80033922015-07-31 08:41:352723}
2724
lukaszad322c5ca2016-10-07 00:32:342725void EventSender::FinishDragAndDrop(const WebMouseEvent& raw_event,
oshima76b6eeb2016-06-27 15:55:122726 blink::WebDragOperation drag_effect) {
lukaszad322c5ca2016-10-07 00:32:342727 std::unique_ptr<WebInputEvent> widget_event =
2728 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122729 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342730 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2731 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122732
[email protected]3db130e2014-03-27 08:14:482733 current_drag_effect_ = drag_effect;
2734 if (current_drag_effect_) {
2735 // Specifically pass any keyboard modifiers to the drop method. This allows
2736 // tests to control the drop type (i.e. copy or move).
Ella Ge80a52dce2017-11-15 18:01:522737 mainFrameWidget()->DragTargetDrop(
2738 current_drag_data_, event->PositionInWidget(),
2739 event->PositionInScreen(), event->GetModifiers());
[email protected]3db130e2014-03-27 08:14:482740 } else {
Ella Ge80a52dce2017-11-15 18:01:522741 mainFrameWidget()->DragTargetDragLeave(blink::WebFloatPoint(),
2742 blink::WebFloatPoint());
[email protected]3db130e2014-03-27 08:14:482743 }
Blink Reformat1c4d759e2017-04-09 16:34:542744 current_drag_data_.Reset();
Ella Ge80a52dce2017-11-15 18:01:522745 mainFrameWidget()->DragSourceEndedAt(event->PositionInWidget(),
2746 event->PositionInScreen(),
paulmeyer8fc8ea92016-11-15 05:12:212747 current_drag_effect_);
Blink Reformat1c4d759e2017-04-09 16:34:542748 mainFrameWidget()->DragSourceSystemDragEnded();
[email protected]3db130e2014-03-27 08:14:482749}
2750
lukaszad322c5ca2016-10-07 00:32:342751void EventSender::DoDragAfterMouseUp(const WebMouseEvent& raw_event) {
2752 std::unique_ptr<WebInputEvent> widget_event =
2753 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122754 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342755 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2756 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122757
Blink Reformat1c4d759e2017-04-09 16:34:542758 last_click_time_sec_ = event->TimeStampSeconds();
mustaqabca6ff2016-06-09 17:29:532759 last_click_pos_ = current_pointer_state_[kRawMousePointerId].last_pos_;
[email protected]3db130e2014-03-27 08:14:482760
2761 // If we're in a drag operation, complete it.
Blink Reformat1c4d759e2017-04-09 16:34:542762 if (current_drag_data_.IsNull())
[email protected]3db130e2014-03-27 08:14:482763 return;
2764
Blink Reformat1c4d759e2017-04-09 16:34:542765 blink::WebDragOperation drag_effect = mainFrameWidget()->DragTargetDragOver(
Ella Ge80a52dce2017-11-15 18:01:522766 event->PositionInWidget(), event->PositionInScreen(),
2767 current_drag_effects_allowed_, event->GetModifiers());
sigbjornf8d568b122016-02-24 21:29:472768
2769 // Bail if dragover caused cancellation.
Blink Reformat1c4d759e2017-04-09 16:34:542770 if (current_drag_data_.IsNull())
sigbjornf8d568b122016-02-24 21:29:472771 return;
2772
lukaszad322c5ca2016-10-07 00:32:342773 FinishDragAndDrop(raw_event, drag_effect);
[email protected]3db130e2014-03-27 08:14:482774}
2775
lukaszad322c5ca2016-10-07 00:32:342776void EventSender::DoDragAfterMouseMove(const WebMouseEvent& raw_event) {
mustaqabca6ff2016-06-09 17:29:532777 if (current_pointer_state_[kRawMousePointerId].pressed_button_ ==
Blink Reformat1c4d759e2017-04-09 16:34:542778 WebMouseEvent::Button::kNoButton ||
2779 current_drag_data_.IsNull()) {
[email protected]3db130e2014-03-27 08:14:482780 return;
2781 }
2782
lukaszad322c5ca2016-10-07 00:32:342783 std::unique_ptr<WebInputEvent> widget_event =
2784 TransformScreenToWidgetCoordinates(raw_event);
oshima76b6eeb2016-06-27 15:55:122785 const WebMouseEvent* event =
lukaszad322c5ca2016-10-07 00:32:342786 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2787 : &raw_event;
oshima76b6eeb2016-06-27 15:55:122788
Blink Reformat1c4d759e2017-04-09 16:34:542789 current_drag_effect_ = mainFrameWidget()->DragTargetDragOver(
Ella Ge80a52dce2017-11-15 18:01:522790 event->PositionInWidget(), event->PositionInScreen(),
2791 current_drag_effects_allowed_, event->GetModifiers());
[email protected]3db130e2014-03-27 08:14:482792}
2793
2794void EventSender::ReplaySavedEvents() {
2795 replaying_saved_events_ = true;
2796 while (!mouse_event_queue_.empty()) {
2797 SavedEvent e = mouse_event_queue_.front();
2798 mouse_event_queue_.pop_front();
2799
2800 switch (e.type) {
2801 case SavedEvent::TYPE_MOUSE_MOVE: {
dtapuska899ac222017-01-03 18:09:162802 current_pointer_state_[kRawMousePointerId].modifiers_ = e.modifiers;
Blink Reformat1c4d759e2017-04-09 16:34:542803 WebMouseEvent event(WebInputEvent::kMouseMove,
dtapuska899ac222017-01-03 18:09:162804 ModifiersForPointer(kRawMousePointerId),
2805 GetCurrentEventTimeSec());
nzolghadr43146032016-04-11 15:33:382806 InitMouseEvent(
mustaqabca6ff2016-06-09 17:29:532807 current_pointer_state_[kRawMousePointerId].pressed_button_,
2808 current_pointer_state_[kRawMousePointerId].current_buttons_, e.pos,
dtapuska899ac222017-01-03 18:09:162809 click_count_, &event);
mustaqabca6ff2016-06-09 17:29:532810 current_pointer_state_[kRawMousePointerId].last_pos_ =
Blink Reformat1c4d759e2017-04-09 16:34:542811 WebPoint(event.PositionInWidget().x, event.PositionInWidget().y);
nzolghadr43146032016-04-11 15:33:382812 HandleInputEventOnViewOrPopup(event);
2813 DoDragAfterMouseMove(event);
[email protected]3db130e2014-03-27 08:14:482814 break;
2815 }
2816 case SavedEvent::TYPE_LEAP_FORWARD:
2817 DoLeapForward(e.milliseconds);
2818 break;
2819 case SavedEvent::TYPE_MOUSE_UP: {
mustaqabca6ff2016-06-09 17:29:532820 current_pointer_state_[kRawMousePointerId].current_buttons_ &=
nzolghadr43146032016-04-11 15:33:382821 ~GetWebMouseEventModifierForButton(e.button_type);
mustaqabca6ff2016-06-09 17:29:532822 current_pointer_state_[kRawMousePointerId].pressed_button_ =
Blink Reformat1c4d759e2017-04-09 16:34:542823 WebMouseEvent::Button::kNoButton;
dtapuska899ac222017-01-03 18:09:162824 current_pointer_state_[kRawMousePointerId].modifiers_ = e.modifiers;
mustaq21aed4e2015-12-15 21:47:212825
Blink Reformat1c4d759e2017-04-09 16:34:542826 WebMouseEvent event(WebInputEvent::kMouseUp,
dtapuska899ac222017-01-03 18:09:162827 ModifiersForPointer(kRawMousePointerId),
2828 GetCurrentEventTimeSec());
mustaqabca6ff2016-06-09 17:29:532829 InitMouseEvent(
dtapuska899ac222017-01-03 18:09:162830 e.button_type,
mustaqabca6ff2016-06-09 17:29:532831 current_pointer_state_[kRawMousePointerId].current_buttons_,
dtapuska899ac222017-01-03 18:09:162832 current_pointer_state_[kRawMousePointerId].last_pos_, click_count_,
2833 &event);
nzolghadr43146032016-04-11 15:33:382834 HandleInputEventOnViewOrPopup(event);
2835 DoDragAfterMouseUp(event);
[email protected]3db130e2014-03-27 08:14:482836 break;
2837 }
2838 default:
2839 NOTREACHED();
2840 }
2841 }
2842
2843 replaying_saved_events_ = false;
2844}
2845
dtapuska5d2e9c32015-12-03 16:39:492846WebInputEventResult EventSender::HandleInputEventOnViewOrPopup(
lukaszad322c5ca2016-10-07 00:32:342847 const WebInputEvent& raw_event) {
Blink Reformat1c4d759e2017-04-09 16:34:542848 last_event_timestamp_ = raw_event.TimeStampSeconds();
oshima76b6eeb2016-06-27 15:55:122849
Blink Reformat1c4d759e2017-04-09 16:34:542850 WebPagePopup* popup = widget()->GetPagePopup();
2851 if (popup && !WebInputEvent::IsKeyboardEventType(raw_event.GetType())) {
lukaszad322c5ca2016-10-07 00:32:342852 // ui::ScaleWebInputEvent returns nullptr when the scale is 1.0f as the
2853 // event does not have to be converted.
2854 std::unique_ptr<WebInputEvent> scaled_event = ui::ScaleWebInputEvent(
2855 raw_event, delegate()->GetWindowToViewportScale());
2856 const WebInputEvent* popup_friendly_event =
2857 scaled_event.get() ? scaled_event.get() : &raw_event;
Blink Reformat1c4d759e2017-04-09 16:34:542858 return popup->HandleInputEvent(
nzolghadr5d8596502017-01-23 22:59:352859 blink::WebCoalescedInputEvent(*popup_friendly_event));
tkent588765612014-11-28 01:07:482860 }
lukaszad322c5ca2016-10-07 00:32:342861
2862 std::unique_ptr<WebInputEvent> widget_event =
2863 TransformScreenToWidgetCoordinates(raw_event);
2864 const WebInputEvent* event =
2865 widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get())
2866 : &raw_event;
Blink Reformat1c4d759e2017-04-09 16:34:542867 return widget()->HandleInputEvent(blink::WebCoalescedInputEvent(*event));
tkent588765612014-11-28 01:07:482868}
2869
dtapuska43f18e9e2016-03-20 20:21:302870void EventSender::SendGesturesForMouseWheelEvent(
2871 const WebMouseWheelEvent wheel_event) {
Blink Reformat1c4d759e2017-04-09 16:34:542872 WebGestureEvent begin_event(WebInputEvent::kGestureScrollBegin,
2873 wheel_event.GetModifiers(),
dtapuska8c4dae12017-01-13 00:23:062874 GetCurrentEventTimeSec());
dtapuska899ac222017-01-03 18:09:162875 InitGestureEventFromMouseWheel(wheel_event, &begin_event);
Blink Reformat1c4d759e2017-04-09 16:34:542876 begin_event.data.scroll_begin.delta_x_hint = wheel_event.delta_x;
2877 begin_event.data.scroll_begin.delta_y_hint = wheel_event.delta_y;
2878 if (wheel_event.scroll_by_page) {
2879 begin_event.data.scroll_begin.delta_hint_units =
2880 blink::WebGestureEvent::kPage;
2881 if (begin_event.data.scroll_begin.delta_x_hint) {
2882 begin_event.data.scroll_begin.delta_x_hint =
2883 begin_event.data.scroll_begin.delta_x_hint > 0 ? 1 : -1;
dtapuska43f18e9e2016-03-20 20:21:302884 }
Blink Reformat1c4d759e2017-04-09 16:34:542885 if (begin_event.data.scroll_begin.delta_y_hint) {
2886 begin_event.data.scroll_begin.delta_y_hint =
2887 begin_event.data.scroll_begin.delta_y_hint > 0 ? 1 : -1;
dtapuska43f18e9e2016-03-20 20:21:302888 }
2889 } else {
Blink Reformat1c4d759e2017-04-09 16:34:542890 begin_event.data.scroll_begin.delta_hint_units =
2891 wheel_event.has_precise_scrolling_deltas
2892 ? blink::WebGestureEvent::kPrecisePixels
2893 : blink::WebGestureEvent::kPixels;
dtapuska43f18e9e2016-03-20 20:21:302894 }
2895
2896 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542897 widget()->UpdateAllLifecyclePhases();
dtapuska43f18e9e2016-03-20 20:21:302898
2899 HandleInputEventOnViewOrPopup(begin_event);
2900
Blink Reformat1c4d759e2017-04-09 16:34:542901 WebGestureEvent update_event(WebInputEvent::kGestureScrollUpdate,
2902 wheel_event.GetModifiers(),
dtapuska8c4dae12017-01-13 00:23:062903 GetCurrentEventTimeSec());
dtapuska899ac222017-01-03 18:09:162904 InitGestureEventFromMouseWheel(wheel_event, &update_event);
Blink Reformat1c4d759e2017-04-09 16:34:542905 update_event.data.scroll_update.delta_x =
2906 begin_event.data.scroll_begin.delta_x_hint;
2907 update_event.data.scroll_update.delta_y =
2908 begin_event.data.scroll_begin.delta_y_hint;
2909 update_event.data.scroll_update.delta_units =
2910 begin_event.data.scroll_begin.delta_hint_units;
dtapuska43f18e9e2016-03-20 20:21:302911
2912 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542913 widget()->UpdateAllLifecyclePhases();
dtapuska43f18e9e2016-03-20 20:21:302914 HandleInputEventOnViewOrPopup(update_event);
2915
Blink Reformat1c4d759e2017-04-09 16:34:542916 WebGestureEvent end_event(WebInputEvent::kGestureScrollEnd,
2917 wheel_event.GetModifiers(),
2918 GetCurrentEventTimeSec());
dtapuska899ac222017-01-03 18:09:162919 InitGestureEventFromMouseWheel(wheel_event, &end_event);
Blink Reformat1c4d759e2017-04-09 16:34:542920 end_event.data.scroll_end.delta_units =
2921 begin_event.data.scroll_begin.delta_hint_units;
dtapuska43f18e9e2016-03-20 20:21:302922
2923 if (force_layout_on_events_)
Blink Reformat1c4d759e2017-04-09 16:34:542924 widget()->UpdateAllLifecyclePhases();
dtapuska43f18e9e2016-03-20 20:21:302925 HandleInputEventOnViewOrPopup(end_event);
2926}
2927
lukasza335bb762016-04-22 16:44:032928TestInterfaces* EventSender::interfaces() {
lukaszad322c5ca2016-10-07 00:32:342929 return web_widget_test_proxy_base_->web_view_test_proxy_base()
2930 ->test_interfaces();
lukasza335bb762016-04-22 16:44:032931}
2932
2933WebTestDelegate* EventSender::delegate() {
lukaszad322c5ca2016-10-07 00:32:342934 return web_widget_test_proxy_base_->web_view_test_proxy_base()->delegate();
lukasza335bb762016-04-22 16:44:032935}
2936
2937const blink::WebView* EventSender::view() const {
lukaszad322c5ca2016-10-07 00:32:342938 return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view();
lukasza335bb762016-04-22 16:44:032939}
2940
2941blink::WebView* EventSender::view() {
lukaszad322c5ca2016-10-07 00:32:342942 return web_widget_test_proxy_base_->web_view_test_proxy_base()->web_view();
lukasza335bb762016-04-22 16:44:032943}
2944
lukaszad322c5ca2016-10-07 00:32:342945blink::WebWidget* EventSender::widget() {
2946 return web_widget_test_proxy_base_->web_widget();
2947}
2948
paulmeyer90f6c31d2016-11-12 00:17:592949blink::WebFrameWidget* EventSender::mainFrameWidget() {
Blink Reformat1c4d759e2017-04-09 16:34:542950 return view()->MainFrame()->ToWebLocalFrame()->FrameWidget();
paulmeyer90f6c31d2016-11-12 00:17:592951}
2952
lukaszad322c5ca2016-10-07 00:32:342953std::unique_ptr<WebInputEvent> EventSender::TransformScreenToWidgetCoordinates(
oshima76b6eeb2016-06-27 15:55:122954 const WebInputEvent& event) {
lukaszad322c5ca2016-10-07 00:32:342955 return delegate()->TransformScreenToWidgetCoordinates(
2956 web_widget_test_proxy_base_, event);
oshima76b6eeb2016-06-27 15:55:122957}
2958
jochenf5f31752015-06-03 12:06:342959} // namespace test_runner