blob: 2bbf4def7219e18dc2008f55f7eafd4d24c5f14a [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
jochen73e711c2015-06-03 10:01:465#include "components/test_runner/event_sender.h"
[email protected]3db130e2014-03-27 08:14:486
avi5dd91f82015-12-25 22:30:467#include <stddef.h>
8
[email protected]3db130e2014-03-27 08:14:489#include "base/logging.h"
avi5dd91f82015-12-25 22:30:4610#include "base/macros.h"
esprehnd29ab802015-12-11 13:01:1911#include "base/strings/string16.h"
habib.virji565c80c2015-02-06 12:26:4312#include "base/strings/string_util.h"
[email protected]3db130e2014-03-27 08:14:4813#include "base/strings/stringprintf.h"
esprehnd29ab802015-12-11 13:01:1914#include "base/strings/utf_string_conversions.h"
avi5dd91f82015-12-25 22:30:4615#include "build/build_config.h"
jochen73e711c2015-06-03 10:01:4616#include "components/test_runner/mock_spell_check.h"
17#include "components/test_runner/test_interfaces.h"
18#include "components/test_runner/web_test_delegate.h"
19#include "components/test_runner/web_test_proxy.h"
[email protected]3db130e2014-03-27 08:14:4820#include "gin/handle.h"
21#include "gin/object_template_builder.h"
22#include "gin/wrappable.h"
23#include "third_party/WebKit/public/platform/WebString.h"
24#include "third_party/WebKit/public/platform/WebVector.h"
25#include "third_party/WebKit/public/web/WebContextMenuData.h"
26#include "third_party/WebKit/public/web/WebFrame.h"
27#include "third_party/WebKit/public/web/WebKit.h"
tkent588765612014-11-28 01:07:4828#include "third_party/WebKit/public/web/WebPagePopup.h"
[email protected]3db130e2014-03-27 08:14:4829#include "third_party/WebKit/public/web/WebView.h"
kpschoedel3b0960a2015-05-11 17:52:1130#include "ui/events/keycodes/dom/keycode_converter.h"
[email protected]a731f1a92014-04-17 19:31:0631#include "ui/events/keycodes/keyboard_codes.h"
[email protected]3db130e2014-03-27 08:14:4832#include "v8/include/v8.h"
33
[email protected]3db130e2014-03-27 08:14:4834using blink::WebContextMenuData;
35using blink::WebDragData;
36using blink::WebDragOperationsMask;
37using blink::WebFloatPoint;
38using blink::WebFrame;
39using blink::WebGestureEvent;
40using blink::WebInputEvent;
dtapuska5d2e9c32015-12-03 16:39:4941using blink::WebInputEventResult;
[email protected]3db130e2014-03-27 08:14:4842using blink::WebKeyboardEvent;
[email protected]f9634a82014-08-05 13:10:1943using blink::WebMenuItemInfo;
[email protected]3db130e2014-03-27 08:14:4844using blink::WebMouseEvent;
45using blink::WebMouseWheelEvent;
tkent588765612014-11-28 01:07:4846using blink::WebPagePopup;
[email protected]3db130e2014-03-27 08:14:4847using blink::WebPoint;
48using blink::WebString;
49using blink::WebTouchEvent;
50using blink::WebTouchPoint;
51using blink::WebVector;
52using blink::WebView;
53
jochenf5f31752015-06-03 12:06:3454namespace test_runner {
[email protected]3db130e2014-03-27 08:14:4855
56namespace {
57
mustaq8911f4e2015-10-27 18:10:2258WebMouseEvent::Button GetButtonTypeFromButtonNumber(int button_code) {
59 switch (button_code) {
60 case -1:
61 return WebMouseEvent::ButtonNone;
62 case 0:
63 return WebMouseEvent::ButtonLeft;
64 case 1:
65 return WebMouseEvent::ButtonMiddle;
66 case 2:
67 return WebMouseEvent::ButtonRight;
68 }
69 NOTREACHED();
70 return WebMouseEvent::ButtonNone;
71}
72
mustaq21aed4e2015-12-15 21:47:2173int GetWebMouseEventModifierForButton(WebMouseEvent::Button button) {
74 switch (button) {
75 case WebMouseEvent::ButtonNone:
76 return 0;
77 case WebMouseEvent::ButtonLeft:
78 return WebMouseEvent::LeftButtonDown;
79 case WebMouseEvent::ButtonMiddle:
80 return WebMouseEvent::MiddleButtonDown;
81 case WebMouseEvent::ButtonRight:
82 return WebMouseEvent::RightButtonDown;
83 }
84 NOTREACHED();
85 return 0;
86}
87
88const int kButtonsInModifiers = WebMouseEvent::LeftButtonDown
89 | WebMouseEvent::MiddleButtonDown | WebMouseEvent::RightButtonDown;
90
nzolghadr65468b42016-01-19 14:03:5891int modifiersWithButtons(int modifiers, int buttons) {
92 return (modifiers & ~kButtonsInModifiers)
93 | (buttons & kButtonsInModifiers);
94}
95
[email protected]3db130e2014-03-27 08:14:4896void InitMouseEvent(WebInputEvent::Type t,
97 WebMouseEvent::Button b,
mustaq21aed4e2015-12-15 21:47:2198 int current_buttons,
[email protected]3db130e2014-03-27 08:14:4899 const WebPoint& pos,
100 double time_stamp,
101 int click_count,
102 int modifiers,
103 WebMouseEvent* e) {
104 e->type = t;
105 e->button = b;
nzolghadr65468b42016-01-19 14:03:58106 e->modifiers = modifiersWithButtons(modifiers, current_buttons);
[email protected]3db130e2014-03-27 08:14:48107 e->x = pos.x;
108 e->y = pos.y;
109 e->globalX = pos.x;
110 e->globalY = pos.y;
nzolghadr06d3f722015-12-02 20:06:51111 e->pointerType = blink::WebPointerProperties::PointerType::Mouse;
[email protected]3db130e2014-03-27 08:14:48112 e->timeStampSeconds = time_stamp;
113 e->clickCount = click_count;
114}
115
116int GetKeyModifier(const std::string& modifier_name) {
117 const char* characters = modifier_name.c_str();
118 if (!strcmp(characters, "ctrlKey")
119#ifndef __APPLE__
120 || !strcmp(characters, "addSelectionKey")
121#endif
122 ) {
123 return WebInputEvent::ControlKey;
124 } else if (!strcmp(characters, "shiftKey") ||
125 !strcmp(characters, "rangeSelectionKey")) {
126 return WebInputEvent::ShiftKey;
127 } else if (!strcmp(characters, "altKey")) {
128 return WebInputEvent::AltKey;
129#ifdef __APPLE__
130 } else if (!strcmp(characters, "metaKey") ||
131 !strcmp(characters, "addSelectionKey")) {
132 return WebInputEvent::MetaKey;
133#else
134 } else if (!strcmp(characters, "metaKey")) {
135 return WebInputEvent::MetaKey;
136#endif
137 } else if (!strcmp(characters, "autoRepeat")) {
138 return WebInputEvent::IsAutoRepeat;
139 } else if (!strcmp(characters, "copyKey")) {
140#ifdef __APPLE__
141 return WebInputEvent::AltKey;
142#else
143 return WebInputEvent::ControlKey;
144#endif
tkentc8c0bc82015-10-15 22:43:48145 } else if (!strcmp(characters, "accessKey")) {
146#ifdef __APPLE__
147 return WebInputEvent::AltKey | WebInputEvent::ControlKey;
148#else
149 return WebInputEvent::AltKey;
150#endif
jinho.bangffc700e2014-11-17 04:05:26151 } else if (!strcmp(characters, "leftButton")) {
152 return WebInputEvent::LeftButtonDown;
153 } else if (!strcmp(characters, "middleButton")) {
154 return WebInputEvent::MiddleButtonDown;
155 } else if (!strcmp(characters, "rightButton")) {
156 return WebInputEvent::RightButtonDown;
dtapuska299efe12015-10-05 16:53:44157 } else if (!strcmp(characters, "capsLockOn")) {
158 return WebInputEvent::CapsLockOn;
159 } else if (!strcmp(characters, "numLockOn")) {
160 return WebInputEvent::NumLockOn;
161 } else if (!strcmp(characters, "locationLeft")) {
162 return WebInputEvent::IsLeft;
163 } else if (!strcmp(characters, "locationRight")) {
164 return WebInputEvent::IsRight;
165 } else if (!strcmp(characters, "locationNumpad")) {
166 return WebInputEvent::IsKeyPad;
167 } else if (!strcmp(characters, "isComposing")) {
168 return WebInputEvent::IsComposing;
169 } else if (!strcmp(characters, "altGraphKey")) {
170 return WebInputEvent::AltGrKey;
171 } else if (!strcmp(characters, "osKey")) {
172 return WebInputEvent::OSKey;
173 } else if (!strcmp(characters, "fnKey")) {
174 return WebInputEvent::FnKey;
175 } else if (!strcmp(characters, "symbolKey")) {
176 return WebInputEvent::SymbolKey;
177 } else if (!strcmp(characters, "scrollLockOn")) {
178 return WebInputEvent::ScrollLockOn;
[email protected]3db130e2014-03-27 08:14:48179 }
180
181 return 0;
182}
183
184int GetKeyModifiers(const std::vector<std::string>& modifier_names) {
185 int modifiers = 0;
186 for (std::vector<std::string>::const_iterator it = modifier_names.begin();
187 it != modifier_names.end(); ++it) {
188 modifiers |= GetKeyModifier(*it);
189 }
190 return modifiers;
191}
192
bashidbd2ef9bb2015-06-02 01:39:32193int GetKeyModifiersFromV8(v8::Isolate* isolate, v8::Local<v8::Value> value) {
[email protected]3db130e2014-03-27 08:14:48194 std::vector<std::string> modifier_names;
195 if (value->IsString()) {
196 modifier_names.push_back(gin::V8ToString(value));
197 } else if (value->IsArray()) {
198 gin::Converter<std::vector<std::string> >::FromV8(
bashidbd2ef9bb2015-06-02 01:39:32199 isolate, value, &modifier_names);
[email protected]3db130e2014-03-27 08:14:48200 }
201 return GetKeyModifiers(modifier_names);
202}
203
204// Maximum distance (in space and time) for a mouse click to register as a
205// double or triple click.
206const double kMultipleClickTimeSec = 1;
207const int kMultipleClickRadiusPixels = 5;
[email protected]f9634a82014-08-05 13:10:19208const char kSubMenuDepthIdentifier[] = "_";
209const char kSubMenuIdentifier[] = " >";
sanjoy.pal362c3252014-08-26 08:07:08210const char kSeparatorIdentifier[] = "---------";
sanjoy.pala62675e2014-11-27 00:47:29211const char kDisabledIdentifier[] = "#";
212const char kCheckedIdentifier[] = "*";
[email protected]3db130e2014-03-27 08:14:48213
214bool OutsideMultiClickRadius(const WebPoint& a, const WebPoint& b) {
215 return ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)) >
216 kMultipleClickRadiusPixels * kMultipleClickRadiusPixels;
217}
218
[email protected]f9634a82014-08-05 13:10:19219void PopulateCustomItems(const WebVector<WebMenuItemInfo>& customItems,
220 const std::string& prefix, std::vector<std::string>* strings) {
221 for (size_t i = 0; i < customItems.size(); ++i) {
sanjoy.pala62675e2014-11-27 00:47:29222 std::string prefixCopy = prefix;
223 if (!customItems[i].enabled)
224 prefixCopy = kDisabledIdentifier + prefix;
225 if (customItems[i].checked)
226 prefixCopy = kCheckedIdentifier + prefix;
sanjoy.pal362c3252014-08-26 08:07:08227 if (customItems[i].type == blink::WebMenuItemInfo::Separator) {
sanjoy.pala62675e2014-11-27 00:47:29228 strings->push_back(prefixCopy + kSeparatorIdentifier);
sanjoy.pal362c3252014-08-26 08:07:08229 } else if (customItems[i].type == blink::WebMenuItemInfo::SubMenu) {
sanjoy.pala62675e2014-11-27 00:47:29230 strings->push_back(prefixCopy + customItems[i].label.utf8() +
sanjoy.pal2adb5c52015-01-13 11:26:49231 customItems[i].icon.utf8() + kSubMenuIdentifier);
sanjoy.pala62675e2014-11-27 00:47:29232 PopulateCustomItems(customItems[i].subMenuItems, prefixCopy +
[email protected]f9634a82014-08-05 13:10:19233 kSubMenuDepthIdentifier, strings);
234 } else {
sanjoy.pal2adb5c52015-01-13 11:26:49235 strings->push_back(prefixCopy + customItems[i].label.utf8() +
236 customItems[i].icon.utf8());
[email protected]f9634a82014-08-05 13:10:19237 }
238 }
239}
240
[email protected]3db130e2014-03-27 08:14:48241// Because actual context menu is implemented by the browser side,
242// this function does only what LayoutTests are expecting:
243// - Many test checks the count of items. So returning non-zero value makes
244// sense.
245// - Some test compares the count before and after some action. So changing the
246// count based on flags also makes sense. This function is doing such for some
247// flags.
248// - Some test even checks actual string content. So providing it would be also
249// helpful.
250std::vector<std::string> MakeMenuItemStringsFor(
251 WebContextMenuData* context_menu,
[email protected]79ecada2014-05-04 05:16:16252 WebTestDelegate* delegate) {
[email protected]3db130e2014-03-27 08:14:48253 // These constants are based on Safari's context menu because tests are made
254 // for it.
255 static const char* kNonEditableMenuStrings[] = {
256 "Back",
257 "Reload Page",
258 "Open in Dashbaord",
259 "<separator>",
260 "View Source",
261 "Save Page As",
262 "Print Page",
263 "Inspect Element",
264 0
265 };
266 static const char* kEditableMenuStrings[] = {
267 "Cut",
268 "Copy",
269 "<separator>",
270 "Paste",
271 "Spelling and Grammar",
272 "Substitutions, Transformations",
273 "Font",
274 "Speech",
275 "Paragraph Direction",
276 "<separator>",
277 0
278 };
279
280 // This is possible because mouse events are cancelleable.
281 if (!context_menu)
282 return std::vector<std::string>();
283
284 std::vector<std::string> strings;
285
[email protected]f9634a82014-08-05 13:10:19286 // Populate custom menu items if provided by blink.
287 PopulateCustomItems(context_menu->customItems, "", &strings);
288
[email protected]3db130e2014-03-27 08:14:48289 if (context_menu->isEditable) {
290 for (const char** item = kEditableMenuStrings; *item; ++item) {
291 strings.push_back(*item);
292 }
293 WebVector<WebString> suggestions;
[email protected]f656a652014-07-25 12:19:52294 MockSpellCheck::FillSuggestionList(context_menu->misspelledWord,
295 &suggestions);
[email protected]3db130e2014-03-27 08:14:48296 for (size_t i = 0; i < suggestions.size(); ++i) {
297 strings.push_back(suggestions[i].utf8());
298 }
299 } else {
300 for (const char** item = kNonEditableMenuStrings; *item; ++item) {
301 strings.push_back(*item);
302 }
303 }
304
305 return strings;
306}
307
308// How much we should scroll per event - the value here is chosen to match the
309// WebKit impl and layout test results.
310const float kScrollbarPixelsPerTick = 40.0f;
311
[email protected]79ecada2014-05-04 05:16:16312class MouseDownTask : public WebMethodTask<EventSender> {
[email protected]3db130e2014-03-27 08:14:48313 public:
314 MouseDownTask(EventSender* obj, int button_number, int modifiers)
315 : WebMethodTask<EventSender>(obj),
316 button_number_(button_number),
317 modifiers_(modifiers) {}
318
dchenge933b3e2014-10-21 11:44:09319 void RunIfValid() override { object_->MouseDown(button_number_, modifiers_); }
[email protected]3db130e2014-03-27 08:14:48320
321 private:
322 int button_number_;
323 int modifiers_;
324};
325
[email protected]79ecada2014-05-04 05:16:16326class MouseUpTask : public WebMethodTask<EventSender> {
[email protected]3db130e2014-03-27 08:14:48327 public:
328 MouseUpTask(EventSender* obj, int button_number, int modifiers)
329 : WebMethodTask<EventSender>(obj),
330 button_number_(button_number),
331 modifiers_(modifiers) {}
332
dchenge933b3e2014-10-21 11:44:09333 void RunIfValid() override { object_->MouseUp(button_number_, modifiers_); }
[email protected]3db130e2014-03-27 08:14:48334
335 private:
336 int button_number_;
337 int modifiers_;
338};
339
[email protected]79ecada2014-05-04 05:16:16340class KeyDownTask : public WebMethodTask<EventSender> {
[email protected]3db130e2014-03-27 08:14:48341 public:
342 KeyDownTask(EventSender* obj,
343 const std::string code_str,
344 int modifiers,
345 KeyLocationCode location)
346 : WebMethodTask<EventSender>(obj),
347 code_str_(code_str),
348 modifiers_(modifiers),
349 location_(location) {}
350
dchenge933b3e2014-10-21 11:44:09351 void RunIfValid() override {
abhishek.a21ab71acb2014-09-12 16:46:31352 object_->KeyDown(code_str_, modifiers_, location_);
[email protected]3db130e2014-03-27 08:14:48353 }
354
355 private:
356 std::string code_str_;
357 int modifiers_;
358 KeyLocationCode location_;
359};
360
361bool NeedsShiftModifier(int keyCode) {
362 // If code is an uppercase letter, assign a SHIFT key to eventDown.modifier.
363 return (keyCode & 0xFF) >= 'A' && (keyCode & 0xFF) <= 'Z';
364}
365
366// Get the edit command corresponding to a keyboard event.
367// Returns true if the specified event corresponds to an edit command, the name
368// of the edit command will be stored in |*name|.
369bool GetEditCommand(const WebKeyboardEvent& event, std::string* name) {
370#if defined(OS_MACOSX)
371// We only cares about Left,Right,Up,Down keys with Command or Command+Shift
372// modifiers. These key events correspond to some special movement and
373// selection editor commands. These keys will be marked as system key, which
374// prevents them from being handled. Thus they must be handled specially.
375 if ((event.modifiers & ~WebKeyboardEvent::ShiftKey) !=
376 WebKeyboardEvent::MetaKey)
377 return false;
378
379 switch (event.windowsKeyCode) {
[email protected]a731f1a92014-04-17 19:31:06380 case ui::VKEY_LEFT:
[email protected]3db130e2014-03-27 08:14:48381 *name = "MoveToBeginningOfLine";
382 break;
[email protected]a731f1a92014-04-17 19:31:06383 case ui::VKEY_RIGHT:
[email protected]3db130e2014-03-27 08:14:48384 *name = "MoveToEndOfLine";
385 break;
[email protected]a731f1a92014-04-17 19:31:06386 case ui::VKEY_UP:
[email protected]3db130e2014-03-27 08:14:48387 *name = "MoveToBeginningOfDocument";
388 break;
[email protected]a731f1a92014-04-17 19:31:06389 case ui::VKEY_DOWN:
[email protected]3db130e2014-03-27 08:14:48390 *name = "MoveToEndOfDocument";
391 break;
392 default:
393 return false;
394 }
395
396 if (event.modifiers & WebKeyboardEvent::ShiftKey)
397 name->append("AndModifySelection");
398
399 return true;
400#else
401 return false;
402#endif
403}
404
[email protected]a731f1a92014-04-17 19:31:06405bool IsSystemKeyEvent(const WebKeyboardEvent& event) {
406#if defined(OS_MACOSX)
407 return event.modifiers & WebInputEvent::MetaKey &&
408 event.windowsKeyCode != ui::VKEY_B &&
409 event.windowsKeyCode != ui::VKEY_I;
410#else
411 return !!(event.modifiers & WebInputEvent::AltKey);
412#endif
413}
414
dtapuskab1c5ece2016-01-18 18:18:02415bool GetScrollUnits(gin::Arguments* args, WebGestureEvent::ScrollUnits* units) {
416 std::string units_string;
417 if (!args->PeekNext().IsEmpty()) {
418 if (args->PeekNext()->IsString())
419 args->GetNext(&units_string);
420 if (units_string == "Page") {
421 *units = WebGestureEvent::Page;
422 return true;
423 } else if (units_string == "Pixels") {
424 *units = WebGestureEvent::Pixels;
425 return true;
426 } else if (units_string == "PrecisePixels") {
427 *units = WebGestureEvent::PrecisePixels;
428 return true;
429 } else {
430 args->ThrowError();
431 return false;
432 }
433 } else {
434 *units = WebGestureEvent::PrecisePixels;
435 return true;
436 }
437}
438
tdresser3a1c9722015-02-13 15:44:53439const char* kSourceDeviceStringTouchpad = "touchpad";
440const char* kSourceDeviceStringTouchscreen = "touchscreen";
441
e.hakkinen80033922015-07-31 08:41:35442const char* kPointerTypeStringUnknown = "";
443const char* kPointerTypeStringMouse = "mouse";
444const char* kPointerTypeStringPen = "pen";
445const char* kPointerTypeStringTouch = "touch";
446
[email protected]3db130e2014-03-27 08:14:48447} // namespace
448
449class EventSenderBindings : public gin::Wrappable<EventSenderBindings> {
450 public:
451 static gin::WrapperInfo kWrapperInfo;
452
453 static void Install(base::WeakPtr<EventSender> sender,
454 blink::WebFrame* frame);
455
456 private:
457 explicit EventSenderBindings(base::WeakPtr<EventSender> sender);
dchenge933b3e2014-10-21 11:44:09458 ~EventSenderBindings() override;
[email protected]3db130e2014-03-27 08:14:48459
460 // gin::Wrappable:
dchenge933b3e2014-10-21 11:44:09461 gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
anand.ratn449f39a42014-10-06 13:45:57462 v8::Isolate* isolate) override;
[email protected]3db130e2014-03-27 08:14:48463
464 // Bound methods:
465 void EnableDOMUIEventLogging();
466 void FireKeyboardEventsToElement();
467 void ClearKillRing();
468 std::vector<std::string> ContextClick();
469 void TextZoomIn();
470 void TextZoomOut();
471 void ZoomPageIn();
472 void ZoomPageOut();
[email protected]d160488f2014-05-06 17:03:01473 void SetPageZoomFactor(double factor);
[email protected]3db130e2014-03-27 08:14:48474 void ClearTouchPoints();
475 void ReleaseTouchPoint(unsigned index);
e.hakkinen80033922015-07-31 08:41:35476 void UpdateTouchPoint(unsigned index,
477 double x,
478 double y,
479 gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48480 void CancelTouchPoint(unsigned index);
481 void SetTouchModifier(const std::string& key_name, bool set_mask);
[email protected]ace1cd502014-04-24 21:05:30482 void SetTouchCancelable(bool cancelable);
[email protected]3db130e2014-03-27 08:14:48483 void DumpFilenameBeingDragged();
484 void GestureFlingCancel();
tdresser3a1c9722015-02-13 15:44:53485 void GestureFlingStart(float x,
486 float y,
487 float velocity_x,
488 float velocity_y,
489 gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48490 void GestureScrollFirstPoint(int x, int y);
491 void TouchStart();
492 void TouchMove();
mustaq96985f722015-06-30 21:41:53493 void TouchMoveCausingScrollIfUncanceled();
[email protected]3db130e2014-03-27 08:14:48494 void TouchCancel();
495 void TouchEnd();
496 void LeapForward(int milliseconds);
majidvpbfabb0712015-10-02 16:30:00497 double LastEventTimestamp();
[email protected]3db130e2014-03-27 08:14:48498 void BeginDragWithFiles(const std::vector<std::string>& files);
e.hakkinen80033922015-07-31 08:41:35499 void AddTouchPoint(double x, double y, gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48500 void MouseDragBegin();
501 void MouseDragEnd();
[email protected]3db130e2014-03-27 08:14:48502 void GestureScrollBegin(gin::Arguments* args);
503 void GestureScrollEnd(gin::Arguments* args);
504 void GestureScrollUpdate(gin::Arguments* args);
ccameronb81b8072015-01-30 00:54:49505 void GesturePinchBegin(gin::Arguments* args);
506 void GesturePinchEnd(gin::Arguments* args);
507 void GesturePinchUpdate(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48508 void GestureTap(gin::Arguments* args);
509 void GestureTapDown(gin::Arguments* args);
510 void GestureShowPress(gin::Arguments* args);
511 void GestureTapCancel(gin::Arguments* args);
512 void GestureLongPress(gin::Arguments* args);
513 void GestureLongTap(gin::Arguments* args);
514 void GestureTwoFingerTap(gin::Arguments* args);
515 void ContinuousMouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48516 void MouseMoveTo(gin::Arguments* args);
myid.shin12c7fea22015-03-06 02:31:24517 void MouseLeave();
[email protected]9d80c822014-05-19 19:07:12518 void TrackpadScrollBegin();
519 void TrackpadScroll(gin::Arguments* args);
520 void TrackpadScrollEnd();
[email protected]3db130e2014-03-27 08:14:48521 void MouseScrollBy(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48522 void ScheduleAsynchronousClick(gin::Arguments* args);
523 void ScheduleAsynchronousKeyDown(gin::Arguments* args);
524 void MouseDown(gin::Arguments* args);
525 void MouseUp(gin::Arguments* args);
mustaq21aed4e2015-12-15 21:47:21526 void SetMouseButtonState(gin::Arguments* args);
[email protected]3db130e2014-03-27 08:14:48527 void KeyDown(gin::Arguments* args);
528
529 // Binding properties:
530 bool ForceLayoutOnEvents() const;
531 void SetForceLayoutOnEvents(bool force);
532 bool IsDragMode() const;
533 void SetIsDragMode(bool drag_mode);
534
535#if defined(OS_WIN)
536 int WmKeyDown() const;
537 void SetWmKeyDown(int key_down);
538
539 int WmKeyUp() const;
540 void SetWmKeyUp(int key_up);
541
542 int WmChar() const;
543 void SetWmChar(int wm_char);
544
545 int WmDeadChar() const;
546 void SetWmDeadChar(int dead_char);
547
548 int WmSysKeyDown() const;
549 void SetWmSysKeyDown(int key_down);
550
551 int WmSysKeyUp() const;
552 void SetWmSysKeyUp(int key_up);
553
554 int WmSysChar() const;
555 void SetWmSysChar(int sys_char);
556
557 int WmSysDeadChar() const;
558 void SetWmSysDeadChar(int sys_dead_char);
559#endif
560
561 base::WeakPtr<EventSender> sender_;
562
563 DISALLOW_COPY_AND_ASSIGN(EventSenderBindings);
564};
565
566gin::WrapperInfo EventSenderBindings::kWrapperInfo = {gin::kEmbedderNativeGin};
567
568EventSenderBindings::EventSenderBindings(base::WeakPtr<EventSender> sender)
569 : sender_(sender) {
570}
571
572EventSenderBindings::~EventSenderBindings() {}
573
574// static
575void EventSenderBindings::Install(base::WeakPtr<EventSender> sender,
576 WebFrame* frame) {
577 v8::Isolate* isolate = blink::mainThreadIsolate();
578 v8::HandleScope handle_scope(isolate);
deepak.s750d68f2015-04-30 07:32:41579 v8::Local<v8::Context> context = frame->mainWorldScriptContext();
[email protected]3db130e2014-03-27 08:14:48580 if (context.IsEmpty())
581 return;
582
583 v8::Context::Scope context_scope(context);
584
585 gin::Handle<EventSenderBindings> bindings =
586 gin::CreateHandle(isolate, new EventSenderBindings(sender));
[email protected]ad4d2032014-04-28 13:50:59587 if (bindings.IsEmpty())
588 return;
deepak.s750d68f2015-04-30 07:32:41589 v8::Local<v8::Object> global = context->Global();
[email protected]3db130e2014-03-27 08:14:48590 global->Set(gin::StringToV8(isolate, "eventSender"), bindings.ToV8());
591}
592
593gin::ObjectTemplateBuilder
594EventSenderBindings::GetObjectTemplateBuilder(v8::Isolate* isolate) {
595 return gin::Wrappable<EventSenderBindings>::GetObjectTemplateBuilder(isolate)
596 .SetMethod("enableDOMUIEventLogging",
597 &EventSenderBindings::EnableDOMUIEventLogging)
598 .SetMethod("fireKeyboardEventsToElement",
599 &EventSenderBindings::FireKeyboardEventsToElement)
600 .SetMethod("clearKillRing", &EventSenderBindings::ClearKillRing)
601 .SetMethod("contextClick", &EventSenderBindings::ContextClick)
602 .SetMethod("textZoomIn", &EventSenderBindings::TextZoomIn)
603 .SetMethod("textZoomOut", &EventSenderBindings::TextZoomOut)
604 .SetMethod("zoomPageIn", &EventSenderBindings::ZoomPageIn)
605 .SetMethod("zoomPageOut", &EventSenderBindings::ZoomPageOut)
[email protected]b32fe542014-04-30 08:42:06606 .SetMethod("setPageZoomFactor", &EventSenderBindings::SetPageZoomFactor)
[email protected]3db130e2014-03-27 08:14:48607 .SetMethod("clearTouchPoints", &EventSenderBindings::ClearTouchPoints)
608 .SetMethod("releaseTouchPoint", &EventSenderBindings::ReleaseTouchPoint)
609 .SetMethod("updateTouchPoint", &EventSenderBindings::UpdateTouchPoint)
610 .SetMethod("cancelTouchPoint", &EventSenderBindings::CancelTouchPoint)
611 .SetMethod("setTouchModifier", &EventSenderBindings::SetTouchModifier)
[email protected]ace1cd502014-04-24 21:05:30612 .SetMethod("setTouchCancelable", &EventSenderBindings::SetTouchCancelable)
[email protected]3db130e2014-03-27 08:14:48613 .SetMethod("dumpFilenameBeingDragged",
614 &EventSenderBindings::DumpFilenameBeingDragged)
615 .SetMethod("gestureFlingCancel", &EventSenderBindings::GestureFlingCancel)
616 .SetMethod("gestureFlingStart", &EventSenderBindings::GestureFlingStart)
617 .SetMethod("gestureScrollFirstPoint",
618 &EventSenderBindings::GestureScrollFirstPoint)
619 .SetMethod("touchStart", &EventSenderBindings::TouchStart)
620 .SetMethod("touchMove", &EventSenderBindings::TouchMove)
mustaq96985f722015-06-30 21:41:53621 .SetMethod("touchMoveCausingScrollIfUncanceled",
622 &EventSenderBindings::TouchMoveCausingScrollIfUncanceled)
[email protected]3db130e2014-03-27 08:14:48623 .SetMethod("touchCancel", &EventSenderBindings::TouchCancel)
624 .SetMethod("touchEnd", &EventSenderBindings::TouchEnd)
625 .SetMethod("leapForward", &EventSenderBindings::LeapForward)
majidvpbfabb0712015-10-02 16:30:00626 .SetMethod("lastEventTimestamp", &EventSenderBindings::LastEventTimestamp)
[email protected]3db130e2014-03-27 08:14:48627 .SetMethod("beginDragWithFiles", &EventSenderBindings::BeginDragWithFiles)
628 .SetMethod("addTouchPoint", &EventSenderBindings::AddTouchPoint)
629 .SetMethod("mouseDragBegin", &EventSenderBindings::MouseDragBegin)
630 .SetMethod("mouseDragEnd", &EventSenderBindings::MouseDragEnd)
[email protected]3db130e2014-03-27 08:14:48631 .SetMethod("gestureScrollBegin", &EventSenderBindings::GestureScrollBegin)
632 .SetMethod("gestureScrollEnd", &EventSenderBindings::GestureScrollEnd)
633 .SetMethod("gestureScrollUpdate",
634 &EventSenderBindings::GestureScrollUpdate)
ccameronb81b8072015-01-30 00:54:49635 .SetMethod("gesturePinchBegin", &EventSenderBindings::GesturePinchBegin)
636 .SetMethod("gesturePinchEnd", &EventSenderBindings::GesturePinchEnd)
637 .SetMethod("gesturePinchUpdate", &EventSenderBindings::GesturePinchUpdate)
[email protected]3db130e2014-03-27 08:14:48638 .SetMethod("gestureTap", &EventSenderBindings::GestureTap)
639 .SetMethod("gestureTapDown", &EventSenderBindings::GestureTapDown)
640 .SetMethod("gestureShowPress", &EventSenderBindings::GestureShowPress)
641 .SetMethod("gestureTapCancel", &EventSenderBindings::GestureTapCancel)
642 .SetMethod("gestureLongPress", &EventSenderBindings::GestureLongPress)
643 .SetMethod("gestureLongTap", &EventSenderBindings::GestureLongTap)
644 .SetMethod("gestureTwoFingerTap",
645 &EventSenderBindings::GestureTwoFingerTap)
646 .SetMethod("continuousMouseScrollBy",
647 &EventSenderBindings::ContinuousMouseScrollBy)
[email protected]3db130e2014-03-27 08:14:48648 .SetMethod("keyDown", &EventSenderBindings::KeyDown)
649 .SetMethod("mouseDown", &EventSenderBindings::MouseDown)
650 .SetMethod("mouseMoveTo", &EventSenderBindings::MouseMoveTo)
myid.shin12c7fea22015-03-06 02:31:24651 .SetMethod("mouseLeave", &EventSenderBindings::MouseLeave)
[email protected]9d80c822014-05-19 19:07:12652 .SetMethod("trackpadScrollBegin",
653 &EventSenderBindings::TrackpadScrollBegin)
654 .SetMethod("trackpadScroll", &EventSenderBindings::TrackpadScroll)
655 .SetMethod("trackpadScrollEnd", &EventSenderBindings::TrackpadScrollEnd)
[email protected]3db130e2014-03-27 08:14:48656 .SetMethod("mouseScrollBy", &EventSenderBindings::MouseScrollBy)
657 .SetMethod("mouseUp", &EventSenderBindings::MouseUp)
mustaq21aed4e2015-12-15 21:47:21658 .SetMethod("setMouseButtonState",
659 &EventSenderBindings::SetMouseButtonState)
[email protected]3db130e2014-03-27 08:14:48660 .SetMethod("scheduleAsynchronousClick",
661 &EventSenderBindings::ScheduleAsynchronousClick)
662 .SetMethod("scheduleAsynchronousKeyDown",
663 &EventSenderBindings::ScheduleAsynchronousKeyDown)
664 .SetProperty("forceLayoutOnEvents",
665 &EventSenderBindings::ForceLayoutOnEvents,
666 &EventSenderBindings::SetForceLayoutOnEvents)
[email protected]3db130e2014-03-27 08:14:48667#if defined(OS_WIN)
mustaq96985f722015-06-30 21:41:53668 .SetProperty("WM_KEYDOWN", &EventSenderBindings::WmKeyDown,
[email protected]3db130e2014-03-27 08:14:48669 &EventSenderBindings::SetWmKeyDown)
mustaq96985f722015-06-30 21:41:53670 .SetProperty("WM_KEYUP", &EventSenderBindings::WmKeyUp,
[email protected]3db130e2014-03-27 08:14:48671 &EventSenderBindings::SetWmKeyUp)
mustaq96985f722015-06-30 21:41:53672 .SetProperty("WM_CHAR", &EventSenderBindings::WmChar,
[email protected]3db130e2014-03-27 08:14:48673 &EventSenderBindings::SetWmChar)
mustaq96985f722015-06-30 21:41:53674 .SetProperty("WM_DEADCHAR", &EventSenderBindings::WmDeadChar,
[email protected]3db130e2014-03-27 08:14:48675 &EventSenderBindings::SetWmDeadChar)
mustaq96985f722015-06-30 21:41:53676 .SetProperty("WM_SYSKEYDOWN", &EventSenderBindings::WmSysKeyDown,
[email protected]3db130e2014-03-27 08:14:48677 &EventSenderBindings::SetWmSysKeyDown)
mustaq96985f722015-06-30 21:41:53678 .SetProperty("WM_SYSKEYUP", &EventSenderBindings::WmSysKeyUp,
[email protected]3db130e2014-03-27 08:14:48679 &EventSenderBindings::SetWmSysKeyUp)
mustaq96985f722015-06-30 21:41:53680 .SetProperty("WM_SYSCHAR", &EventSenderBindings::WmSysChar,
[email protected]3db130e2014-03-27 08:14:48681 &EventSenderBindings::SetWmSysChar)
mustaq96985f722015-06-30 21:41:53682 .SetProperty("WM_SYSDEADCHAR", &EventSenderBindings::WmSysDeadChar,
thestigfd11ffe2015-12-30 19:25:45683 &EventSenderBindings::SetWmSysDeadChar)
[email protected]3db130e2014-03-27 08:14:48684#endif
thestigfd11ffe2015-12-30 19:25:45685 .SetProperty("dragMode", &EventSenderBindings::IsDragMode,
686 &EventSenderBindings::SetIsDragMode);
[email protected]3db130e2014-03-27 08:14:48687}
688
689void EventSenderBindings::EnableDOMUIEventLogging() {
690 if (sender_)
691 sender_->EnableDOMUIEventLogging();
692}
693
694void EventSenderBindings::FireKeyboardEventsToElement() {
695 if (sender_)
696 sender_->FireKeyboardEventsToElement();
697}
698
699void EventSenderBindings::ClearKillRing() {
700 if (sender_)
701 sender_->ClearKillRing();
702}
703
704std::vector<std::string> EventSenderBindings::ContextClick() {
705 if (sender_)
706 return sender_->ContextClick();
707 return std::vector<std::string>();
708}
709
710void EventSenderBindings::TextZoomIn() {
711 if (sender_)
712 sender_->TextZoomIn();
713}
714
715void EventSenderBindings::TextZoomOut() {
716 if (sender_)
717 sender_->TextZoomOut();
718}
719
720void EventSenderBindings::ZoomPageIn() {
721 if (sender_)
722 sender_->ZoomPageIn();
723}
724
725void EventSenderBindings::ZoomPageOut() {
726 if (sender_)
727 sender_->ZoomPageOut();
728}
729
[email protected]d160488f2014-05-06 17:03:01730void EventSenderBindings::SetPageZoomFactor(double factor) {
731 if (sender_)
732 sender_->SetPageZoomFactor(factor);
[email protected]b32fe542014-04-30 08:42:06733}
734
[email protected]3db130e2014-03-27 08:14:48735void EventSenderBindings::ClearTouchPoints() {
736 if (sender_)
737 sender_->ClearTouchPoints();
738}
739
740void EventSenderBindings::ReleaseTouchPoint(unsigned index) {
741 if (sender_)
742 sender_->ReleaseTouchPoint(index);
743}
744
e.hakkinen80033922015-07-31 08:41:35745void EventSenderBindings::UpdateTouchPoint(unsigned index,
746 double x,
747 double y,
748 gin::Arguments* args) {
jochen73e711c2015-06-03 10:01:46749 if (sender_) {
750 sender_->UpdateTouchPoint(index, static_cast<float>(x),
e.hakkinen80033922015-07-31 08:41:35751 static_cast<float>(y), args);
jochen73e711c2015-06-03 10:01:46752 }
[email protected]3db130e2014-03-27 08:14:48753}
754
755void EventSenderBindings::CancelTouchPoint(unsigned index) {
756 if (sender_)
757 sender_->CancelTouchPoint(index);
758}
759
760void EventSenderBindings::SetTouchModifier(const std::string& key_name,
761 bool set_mask) {
762 if (sender_)
763 sender_->SetTouchModifier(key_name, set_mask);
764}
765
[email protected]ace1cd502014-04-24 21:05:30766void EventSenderBindings::SetTouchCancelable(bool cancelable) {
767 if (sender_)
768 sender_->SetTouchCancelable(cancelable);
769}
770
[email protected]3db130e2014-03-27 08:14:48771void EventSenderBindings::DumpFilenameBeingDragged() {
772 if (sender_)
773 sender_->DumpFilenameBeingDragged();
774}
775
776void EventSenderBindings::GestureFlingCancel() {
777 if (sender_)
778 sender_->GestureFlingCancel();
779}
780
781void EventSenderBindings::GestureFlingStart(float x,
782 float y,
783 float velocity_x,
tdresser3a1c9722015-02-13 15:44:53784 float velocity_y,
785 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48786 if (sender_)
tdresser3a1c9722015-02-13 15:44:53787 sender_->GestureFlingStart(x, y, velocity_x, velocity_y, args);
[email protected]3db130e2014-03-27 08:14:48788}
789
790void EventSenderBindings::GestureScrollFirstPoint(int x, int y) {
791 if (sender_)
792 sender_->GestureScrollFirstPoint(x, y);
793}
794
795void EventSenderBindings::TouchStart() {
796 if (sender_)
797 sender_->TouchStart();
798}
799
800void EventSenderBindings::TouchMove() {
801 if (sender_)
802 sender_->TouchMove();
803}
804
mustaq96985f722015-06-30 21:41:53805void EventSenderBindings::TouchMoveCausingScrollIfUncanceled() {
806 if (sender_)
807 sender_->TouchMoveCausingScrollIfUncanceled();
808}
809
[email protected]3db130e2014-03-27 08:14:48810void EventSenderBindings::TouchCancel() {
811 if (sender_)
812 sender_->TouchCancel();
813}
814
815void EventSenderBindings::TouchEnd() {
816 if (sender_)
817 sender_->TouchEnd();
818}
819
820void EventSenderBindings::LeapForward(int milliseconds) {
821 if (sender_)
822 sender_->LeapForward(milliseconds);
823}
824
majidvpbfabb0712015-10-02 16:30:00825double EventSenderBindings::LastEventTimestamp() {
826 if (sender_)
827 return sender_->last_event_timestamp();
828 return 0;
829}
830
[email protected]3db130e2014-03-27 08:14:48831void EventSenderBindings::BeginDragWithFiles(
832 const std::vector<std::string>& files) {
833 if (sender_)
834 sender_->BeginDragWithFiles(files);
835}
836
e.hakkinen80033922015-07-31 08:41:35837void EventSenderBindings::AddTouchPoint(double x,
838 double y,
839 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:48840 if (sender_)
e.hakkinen80033922015-07-31 08:41:35841 sender_->AddTouchPoint(static_cast<float>(x), static_cast<float>(y), args);
[email protected]3db130e2014-03-27 08:14:48842}
843
844void EventSenderBindings::MouseDragBegin() {
845 if (sender_)
846 sender_->MouseDragBegin();
847}
848
849void EventSenderBindings::MouseDragEnd() {
850 if (sender_)
851 sender_->MouseDragEnd();
852}
853
[email protected]3db130e2014-03-27 08:14:48854void EventSenderBindings::GestureScrollBegin(gin::Arguments* args) {
855 if (sender_)
856 sender_->GestureScrollBegin(args);
857}
858
859void EventSenderBindings::GestureScrollEnd(gin::Arguments* args) {
860 if (sender_)
861 sender_->GestureScrollEnd(args);
862}
863
864void EventSenderBindings::GestureScrollUpdate(gin::Arguments* args) {
865 if (sender_)
866 sender_->GestureScrollUpdate(args);
867}
868
ccameronb81b8072015-01-30 00:54:49869void EventSenderBindings::GesturePinchBegin(gin::Arguments* args) {
870 if (sender_)
871 sender_->GesturePinchBegin(args);
872}
873
874void EventSenderBindings::GesturePinchEnd(gin::Arguments* args) {
875 if (sender_)
876 sender_->GesturePinchEnd(args);
877}
878
879void EventSenderBindings::GesturePinchUpdate(gin::Arguments* args) {
880 if (sender_)
881 sender_->GesturePinchUpdate(args);
882}
883
[email protected]3db130e2014-03-27 08:14:48884void EventSenderBindings::GestureTap(gin::Arguments* args) {
885 if (sender_)
886 sender_->GestureTap(args);
887}
888
889void EventSenderBindings::GestureTapDown(gin::Arguments* args) {
890 if (sender_)
891 sender_->GestureTapDown(args);
892}
893
894void EventSenderBindings::GestureShowPress(gin::Arguments* args) {
895 if (sender_)
896 sender_->GestureShowPress(args);
897}
898
899void EventSenderBindings::GestureTapCancel(gin::Arguments* args) {
900 if (sender_)
901 sender_->GestureTapCancel(args);
902}
903
904void EventSenderBindings::GestureLongPress(gin::Arguments* args) {
905 if (sender_)
906 sender_->GestureLongPress(args);
907}
908
909void EventSenderBindings::GestureLongTap(gin::Arguments* args) {
910 if (sender_)
911 sender_->GestureLongTap(args);
912}
913
914void EventSenderBindings::GestureTwoFingerTap(gin::Arguments* args) {
915 if (sender_)
916 sender_->GestureTwoFingerTap(args);
917}
918
919void EventSenderBindings::ContinuousMouseScrollBy(gin::Arguments* args) {
920 if (sender_)
921 sender_->ContinuousMouseScrollBy(args);
922}
923
[email protected]3db130e2014-03-27 08:14:48924void EventSenderBindings::MouseMoveTo(gin::Arguments* args) {
925 if (sender_)
926 sender_->MouseMoveTo(args);
927}
928
myid.shin12c7fea22015-03-06 02:31:24929void EventSenderBindings::MouseLeave() {
930 if (sender_)
931 sender_->MouseLeave();
932}
933
[email protected]9d80c822014-05-19 19:07:12934void EventSenderBindings::TrackpadScrollBegin() {
935 if (sender_)
936 sender_->TrackpadScrollBegin();
937}
938
939void EventSenderBindings::TrackpadScroll(gin::Arguments* args) {
940 if (sender_)
941 sender_->TrackpadScroll(args);
942}
943
944void EventSenderBindings::TrackpadScrollEnd() {
945 if (sender_)
946 sender_->TrackpadScrollEnd();
947}
948
[email protected]3db130e2014-03-27 08:14:48949void EventSenderBindings::MouseScrollBy(gin::Arguments* args) {
950 if (sender_)
951 sender_->MouseScrollBy(args);
952}
953
[email protected]3db130e2014-03-27 08:14:48954void EventSenderBindings::ScheduleAsynchronousClick(gin::Arguments* args) {
955 if (!sender_)
956 return;
957
958 int button_number = 0;
959 int modifiers = 0;
960 if (!args->PeekNext().IsEmpty()) {
961 args->GetNext(&button_number);
962 if (!args->PeekNext().IsEmpty())
bashidbd2ef9bb2015-06-02 01:39:32963 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
[email protected]3db130e2014-03-27 08:14:48964 }
965 sender_->ScheduleAsynchronousClick(button_number, modifiers);
966}
967
968void EventSenderBindings::ScheduleAsynchronousKeyDown(gin::Arguments* args) {
969 if (!sender_)
970 return;
971
972 std::string code_str;
973 int modifiers = 0;
974 int location = DOMKeyLocationStandard;
975 args->GetNext(&code_str);
976 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:41977 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:48978 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:32979 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:48980 if (!args->PeekNext().IsEmpty())
981 args->GetNext(&location);
982 }
983 sender_->ScheduleAsynchronousKeyDown(code_str, modifiers,
984 static_cast<KeyLocationCode>(location));
985}
986
987void EventSenderBindings::MouseDown(gin::Arguments* args) {
988 if (!sender_)
989 return;
990
991 int button_number = 0;
992 int modifiers = 0;
993 if (!args->PeekNext().IsEmpty()) {
994 args->GetNext(&button_number);
995 if (!args->PeekNext().IsEmpty())
bashidbd2ef9bb2015-06-02 01:39:32996 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
[email protected]3db130e2014-03-27 08:14:48997 }
998 sender_->MouseDown(button_number, modifiers);
999}
1000
1001void EventSenderBindings::MouseUp(gin::Arguments* args) {
1002 if (!sender_)
1003 return;
1004
1005 int button_number = 0;
1006 int modifiers = 0;
1007 if (!args->PeekNext().IsEmpty()) {
1008 args->GetNext(&button_number);
1009 if (!args->PeekNext().IsEmpty())
bashidbd2ef9bb2015-06-02 01:39:321010 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
[email protected]3db130e2014-03-27 08:14:481011 }
1012 sender_->MouseUp(button_number, modifiers);
1013}
1014
mustaq21aed4e2015-12-15 21:47:211015void EventSenderBindings::SetMouseButtonState(gin::Arguments* args) {
1016 if (!sender_)
1017 return;
1018
1019 int button_number;
1020 if (!args->GetNext(&button_number)) {
1021 args->ThrowError();
1022 return;
1023 }
1024
thestigfd11ffe2015-12-30 19:25:451025 int modifiers = -1; // Default to the modifier implied by button_number
mustaq21aed4e2015-12-15 21:47:211026 if (!args->PeekNext().IsEmpty()) {
1027 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
1028 }
1029
1030 sender_->SetMouseButtonState(button_number, modifiers);
1031}
1032
[email protected]3db130e2014-03-27 08:14:481033void EventSenderBindings::KeyDown(gin::Arguments* args) {
1034 if (!sender_)
1035 return;
1036
1037 std::string code_str;
1038 int modifiers = 0;
1039 int location = DOMKeyLocationStandard;
1040 args->GetNext(&code_str);
1041 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:411042 v8::Local<v8::Value> value;
[email protected]3db130e2014-03-27 08:14:481043 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:321044 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
[email protected]3db130e2014-03-27 08:14:481045 if (!args->PeekNext().IsEmpty())
1046 args->GetNext(&location);
1047 }
1048 sender_->KeyDown(code_str, modifiers, static_cast<KeyLocationCode>(location));
1049}
1050
1051bool EventSenderBindings::ForceLayoutOnEvents() const {
1052 if (sender_)
1053 return sender_->force_layout_on_events();
1054 return false;
1055}
1056
1057void EventSenderBindings::SetForceLayoutOnEvents(bool force) {
1058 if (sender_)
1059 sender_->set_force_layout_on_events(force);
1060}
1061
1062bool EventSenderBindings::IsDragMode() const {
1063 if (sender_)
1064 return sender_->is_drag_mode();
1065 return true;
1066}
1067
1068void EventSenderBindings::SetIsDragMode(bool drag_mode) {
1069 if (sender_)
1070 sender_->set_is_drag_mode(drag_mode);
1071}
1072
1073#if defined(OS_WIN)
1074int EventSenderBindings::WmKeyDown() const {
1075 if (sender_)
1076 return sender_->wm_key_down();
1077 return 0;
1078}
1079
1080void EventSenderBindings::SetWmKeyDown(int key_down) {
1081 if (sender_)
1082 sender_->set_wm_key_down(key_down);
1083}
1084
1085int EventSenderBindings::WmKeyUp() const {
1086 if (sender_)
1087 return sender_->wm_key_up();
1088 return 0;
1089}
1090
1091void EventSenderBindings::SetWmKeyUp(int key_up) {
1092 if (sender_)
1093 sender_->set_wm_key_up(key_up);
1094}
1095
1096int EventSenderBindings::WmChar() const {
1097 if (sender_)
1098 return sender_->wm_char();
1099 return 0;
1100}
1101
1102void EventSenderBindings::SetWmChar(int wm_char) {
1103 if (sender_)
1104 sender_->set_wm_char(wm_char);
1105}
1106
1107int EventSenderBindings::WmDeadChar() const {
1108 if (sender_)
1109 return sender_->wm_dead_char();
1110 return 0;
1111}
1112
1113void EventSenderBindings::SetWmDeadChar(int dead_char) {
1114 if (sender_)
1115 sender_->set_wm_dead_char(dead_char);
1116}
1117
1118int EventSenderBindings::WmSysKeyDown() const {
1119 if (sender_)
1120 return sender_->wm_sys_key_down();
1121 return 0;
1122}
1123
1124void EventSenderBindings::SetWmSysKeyDown(int key_down) {
1125 if (sender_)
1126 sender_->set_wm_sys_key_down(key_down);
1127}
1128
1129int EventSenderBindings::WmSysKeyUp() const {
1130 if (sender_)
1131 return sender_->wm_sys_key_up();
1132 return 0;
1133}
1134
1135void EventSenderBindings::SetWmSysKeyUp(int key_up) {
1136 if (sender_)
1137 sender_->set_wm_sys_key_up(key_up);
1138}
1139
1140int EventSenderBindings::WmSysChar() const {
1141 if (sender_)
1142 return sender_->wm_sys_char();
1143 return 0;
1144}
1145
1146void EventSenderBindings::SetWmSysChar(int sys_char) {
1147 if (sender_)
1148 sender_->set_wm_sys_char(sys_char);
1149}
1150
1151int EventSenderBindings::WmSysDeadChar() const {
1152 if (sender_)
1153 return sender_->wm_sys_dead_char();
1154 return 0;
1155}
1156
1157void EventSenderBindings::SetWmSysDeadChar(int sys_dead_char) {
1158 if (sender_)
1159 sender_->set_wm_sys_dead_char(sys_dead_char);
1160}
1161#endif
1162
1163// EventSender -----------------------------------------------------------------
1164
1165WebMouseEvent::Button EventSender::pressed_button_ = WebMouseEvent::ButtonNone;
mustaq21aed4e2015-12-15 21:47:211166int EventSender::current_buttons_ = 0;
jinho.banga7447af2015-03-11 04:56:581167int EventSender::modifiers_ = 0;
[email protected]3db130e2014-03-27 08:14:481168
1169WebPoint EventSender::last_mouse_pos_;
1170
1171WebMouseEvent::Button EventSender::last_button_type_ =
1172 WebMouseEvent::ButtonNone;
1173
1174EventSender::SavedEvent::SavedEvent()
1175 : type(TYPE_UNSPECIFIED),
1176 button_type(WebMouseEvent::ButtonNone),
1177 milliseconds(0),
1178 modifiers(0) {}
1179
[email protected]79ecada2014-05-04 05:16:161180EventSender::EventSender(TestInterfaces* interfaces)
sammc5648c852015-07-02 01:25:001181 :
1182#if defined(OS_WIN)
1183 wm_key_down_(0),
1184 wm_key_up_(0),
1185 wm_char_(0),
1186 wm_dead_char_(0),
1187 wm_sys_key_down_(0),
1188 wm_sys_key_up_(0),
1189 wm_sys_char_(0),
1190 wm_sys_dead_char_(0),
1191#endif
1192 interfaces_(interfaces),
[email protected]3db130e2014-03-27 08:14:481193 delegate_(NULL),
1194 view_(NULL),
1195 force_layout_on_events_(false),
1196 is_drag_mode_(true),
1197 touch_modifiers_(0),
[email protected]ace1cd502014-04-24 21:05:301198 touch_cancelable_(true),
[email protected]3db130e2014-03-27 08:14:481199 replaying_saved_events_(false),
1200 current_drag_effects_allowed_(blink::WebDragOperationNone),
1201 last_click_time_sec_(0),
1202 current_drag_effect_(blink::WebDragOperationNone),
1203 time_offset_ms_(0),
1204 click_count_(0),
sammc5648c852015-07-02 01:25:001205 weak_factory_(this) {
1206}
[email protected]3db130e2014-03-27 08:14:481207
1208EventSender::~EventSender() {}
1209
1210void EventSender::Reset() {
1211 DCHECK(current_drag_data_.isNull());
1212 current_drag_data_.reset();
1213 current_drag_effect_ = blink::WebDragOperationNone;
1214 current_drag_effects_allowed_ = blink::WebDragOperationNone;
1215 if (view_ && pressed_button_ != WebMouseEvent::ButtonNone)
1216 view_->mouseCaptureLost();
1217 pressed_button_ = WebMouseEvent::ButtonNone;
mustaq21aed4e2015-12-15 21:47:211218 current_buttons_ = 0;
mustaq06b26f2002015-12-14 18:37:161219 modifiers_ = 0;
[email protected]3db130e2014-03-27 08:14:481220 is_drag_mode_ = true;
1221 force_layout_on_events_ = true;
1222
1223#if defined(OS_WIN)
1224 wm_key_down_ = WM_KEYDOWN;
1225 wm_key_up_ = WM_KEYUP;
1226 wm_char_ = WM_CHAR;
1227 wm_dead_char_ = WM_DEADCHAR;
1228 wm_sys_key_down_ = WM_SYSKEYDOWN;
1229 wm_sys_key_up_ = WM_SYSKEYUP;
1230 wm_sys_char_ = WM_SYSCHAR;
1231 wm_sys_dead_char_ = WM_SYSDEADCHAR;
1232#endif
1233
1234 last_mouse_pos_ = WebPoint(0, 0);
1235 last_click_time_sec_ = 0;
1236 last_click_pos_ = WebPoint(0, 0);
1237 last_button_type_ = WebMouseEvent::ButtonNone;
1238 touch_points_.clear();
[email protected]644616d2014-03-27 16:14:471239 last_context_menu_data_.reset();
abhishek.a21ab71acb2014-09-12 16:46:311240 task_list_.RevokeAll();
[email protected]3db130e2014-03-27 08:14:481241 current_gesture_location_ = WebPoint(0, 0);
1242 mouse_event_queue_.clear();
1243
1244 time_offset_ms_ = 0;
1245 click_count_ = 0;
[email protected]ace1cd502014-04-24 21:05:301246
1247 touch_modifiers_ = 0;
1248 touch_cancelable_ = true;
1249 touch_points_.clear();
[email protected]3db130e2014-03-27 08:14:481250}
1251
1252void EventSender::Install(WebFrame* frame) {
1253 EventSenderBindings::Install(weak_factory_.GetWeakPtr(), frame);
1254}
1255
[email protected]79ecada2014-05-04 05:16:161256void EventSender::SetDelegate(WebTestDelegate* delegate) {
[email protected]3db130e2014-03-27 08:14:481257 delegate_ = delegate;
1258}
1259
1260void EventSender::SetWebView(WebView* view) {
1261 view_ = view;
1262}
1263
1264void EventSender::SetContextMenuData(const WebContextMenuData& data) {
1265 last_context_menu_data_.reset(new WebContextMenuData(data));
1266}
1267
1268void EventSender::DoDragDrop(const WebDragData& drag_data,
1269 WebDragOperationsMask mask) {
1270 WebMouseEvent event;
1271 InitMouseEvent(WebInputEvent::MouseDown,
1272 pressed_button_,
mustaq21aed4e2015-12-15 21:47:211273 current_buttons_,
[email protected]3db130e2014-03-27 08:14:481274 last_mouse_pos_,
1275 GetCurrentEventTimeSec(),
1276 click_count_,
jinho.banga7447af2015-03-11 04:56:581277 modifiers_,
[email protected]3db130e2014-03-27 08:14:481278 &event);
1279 WebPoint client_point(event.x, event.y);
1280 WebPoint screen_point(event.globalX, event.globalY);
1281 current_drag_data_ = drag_data;
1282 current_drag_effects_allowed_ = mask;
1283 current_drag_effect_ = view_->dragTargetDragEnter(
jinho.banga7447af2015-03-11 04:56:581284 drag_data,
1285 client_point,
1286 screen_point,
1287 current_drag_effects_allowed_,
nzolghadr65468b42016-01-19 14:03:581288 modifiersWithButtons(modifiers_, current_buttons_));
[email protected]3db130e2014-03-27 08:14:481289
1290 // Finish processing events.
1291 ReplaySavedEvents();
1292}
1293
1294void EventSender::MouseDown(int button_number, int modifiers) {
1295 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:251296 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481297
1298 DCHECK_NE(-1, button_number);
1299
1300 WebMouseEvent::Button button_type =
1301 GetButtonTypeFromButtonNumber(button_number);
1302
1303 UpdateClickCountForButton(button_type);
1304
1305 pressed_button_ = button_type;
mustaq21aed4e2015-12-15 21:47:211306 current_buttons_ |= GetWebMouseEventModifierForButton(pressed_button_);
jinho.banga7447af2015-03-11 04:56:581307 modifiers_ = modifiers;
[email protected]3db130e2014-03-27 08:14:481308
1309 WebMouseEvent event;
1310 InitMouseEvent(WebInputEvent::MouseDown,
mustaq21aed4e2015-12-15 21:47:211311 pressed_button_,
1312 current_buttons_,
[email protected]3db130e2014-03-27 08:14:481313 last_mouse_pos_,
1314 GetCurrentEventTimeSec(),
1315 click_count_,
mustaq21aed4e2015-12-15 21:47:211316 modifiers_,
[email protected]3db130e2014-03-27 08:14:481317 &event);
tkent588765612014-11-28 01:07:481318 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481319}
1320
1321void EventSender::MouseUp(int button_number, int modifiers) {
1322 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:251323 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481324
1325 DCHECK_NE(-1, button_number);
1326
1327 WebMouseEvent::Button button_type =
1328 GetButtonTypeFromButtonNumber(button_number);
1329
1330 if (is_drag_mode_ && !replaying_saved_events_) {
1331 SavedEvent saved_event;
1332 saved_event.type = SavedEvent::TYPE_MOUSE_UP;
1333 saved_event.button_type = button_type;
1334 saved_event.modifiers = modifiers;
1335 mouse_event_queue_.push_back(saved_event);
1336 ReplaySavedEvents();
1337 } else {
mustaq21aed4e2015-12-15 21:47:211338 current_buttons_ &= ~GetWebMouseEventModifierForButton(button_type);
1339 pressed_button_ = WebMouseEvent::ButtonNone;
1340
[email protected]3db130e2014-03-27 08:14:481341 WebMouseEvent event;
1342 InitMouseEvent(WebInputEvent::MouseUp,
1343 button_type,
mustaq21aed4e2015-12-15 21:47:211344 current_buttons_,
[email protected]3db130e2014-03-27 08:14:481345 last_mouse_pos_,
1346 GetCurrentEventTimeSec(),
1347 click_count_,
1348 modifiers,
1349 &event);
1350 DoMouseUp(event);
1351 }
1352}
1353
mustaq21aed4e2015-12-15 21:47:211354void EventSender::SetMouseButtonState(int button_number, int modifiers) {
1355 pressed_button_ = GetButtonTypeFromButtonNumber(button_number);
1356 current_buttons_ = (modifiers == -1) ?
1357 GetWebMouseEventModifierForButton(pressed_button_) :
1358 modifiers & kButtonsInModifiers;
1359}
1360
[email protected]3db130e2014-03-27 08:14:481361void EventSender::KeyDown(const std::string& code_str,
1362 int modifiers,
1363 KeyLocationCode location) {
1364 // FIXME: I'm not exactly sure how we should convert the string to a key
1365 // event. This seems to work in the cases I tested.
1366 // FIXME: Should we also generate a KEY_UP?
1367
1368 bool generate_char = false;
1369
1370 // Convert \n -> VK_RETURN. Some layout tests use \n to mean "Enter", when
1371 // Windows uses \r for "Enter".
1372 int code = 0;
1373 int text = 0;
1374 bool needs_shift_key_modifier = false;
habib.virji565c80c2015-02-06 12:26:431375 std::string domString;
[email protected]3db130e2014-03-27 08:14:481376
1377 if ("\n" == code_str) {
1378 generate_char = true;
[email protected]a731f1a92014-04-17 19:31:061379 text = code = ui::VKEY_RETURN;
habib.virji565c80c2015-02-06 12:26:431380 domString.assign("Enter");
[email protected]3db130e2014-03-27 08:14:481381 } else if ("rightArrow" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061382 code = ui::VKEY_RIGHT;
habib.virji565c80c2015-02-06 12:26:431383 domString.assign("ArrowRight");
[email protected]3db130e2014-03-27 08:14:481384 } else if ("downArrow" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061385 code = ui::VKEY_DOWN;
habib.virji565c80c2015-02-06 12:26:431386 domString.assign("ArrowDown");
[email protected]3db130e2014-03-27 08:14:481387 } else if ("leftArrow" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061388 code = ui::VKEY_LEFT;
habib.virji565c80c2015-02-06 12:26:431389 domString.assign("ArrowLeft");
[email protected]3db130e2014-03-27 08:14:481390 } else if ("upArrow" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061391 code = ui::VKEY_UP;
habib.virji565c80c2015-02-06 12:26:431392 domString.assign("ArrowUp");
[email protected]3db130e2014-03-27 08:14:481393 } else if ("insert" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061394 code = ui::VKEY_INSERT;
habib.virji565c80c2015-02-06 12:26:431395 domString.assign("Insert");
[email protected]3db130e2014-03-27 08:14:481396 } else if ("delete" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061397 code = ui::VKEY_DELETE;
habib.virji565c80c2015-02-06 12:26:431398 domString.assign("Delete");
[email protected]3db130e2014-03-27 08:14:481399 } else if ("pageUp" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061400 code = ui::VKEY_PRIOR;
habib.virji565c80c2015-02-06 12:26:431401 domString.assign("PageUp");
[email protected]3db130e2014-03-27 08:14:481402 } else if ("pageDown" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061403 code = ui::VKEY_NEXT;
habib.virji565c80c2015-02-06 12:26:431404 domString.assign("PageDown");
[email protected]3db130e2014-03-27 08:14:481405 } else if ("home" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061406 code = ui::VKEY_HOME;
habib.virji565c80c2015-02-06 12:26:431407 domString.assign("Home");
[email protected]3db130e2014-03-27 08:14:481408 } else if ("end" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061409 code = ui::VKEY_END;
habib.virji565c80c2015-02-06 12:26:431410 domString.assign("End");
[email protected]3db130e2014-03-27 08:14:481411 } else if ("printScreen" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061412 code = ui::VKEY_SNAPSHOT;
habib.virji565c80c2015-02-06 12:26:431413 domString.assign("PrintScreen");
[email protected]3db130e2014-03-27 08:14:481414 } else if ("menu" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061415 code = ui::VKEY_APPS;
habib.virji565c80c2015-02-06 12:26:431416 domString.assign("ContextMenu");
[email protected]3db130e2014-03-27 08:14:481417 } else if ("leftControl" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051418 code = ui::VKEY_CONTROL;
habib.virji565c80c2015-02-06 12:26:431419 domString.assign("ControlLeft");
dtapuskad3ba0f042015-08-27 14:08:051420 location = DOMKeyLocationLeft;
[email protected]3db130e2014-03-27 08:14:481421 } else if ("rightControl" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051422 code = ui::VKEY_CONTROL;
habib.virji565c80c2015-02-06 12:26:431423 domString.assign("ControlRight");
dtapuskad3ba0f042015-08-27 14:08:051424 location = DOMKeyLocationRight;
[email protected]3db130e2014-03-27 08:14:481425 } else if ("leftShift" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051426 code = ui::VKEY_SHIFT;
habib.virji565c80c2015-02-06 12:26:431427 domString.assign("ShiftLeft");
dtapuskad3ba0f042015-08-27 14:08:051428 location = DOMKeyLocationLeft;
[email protected]3db130e2014-03-27 08:14:481429 } else if ("rightShift" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051430 code = ui::VKEY_SHIFT;
habib.virji565c80c2015-02-06 12:26:431431 domString.assign("ShiftRight");
dtapuskad3ba0f042015-08-27 14:08:051432 location = DOMKeyLocationRight;
[email protected]3db130e2014-03-27 08:14:481433 } else if ("leftAlt" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051434 code = ui::VKEY_MENU;
habib.virji565c80c2015-02-06 12:26:431435 domString.assign("AltLeft");
dtapuskad3ba0f042015-08-27 14:08:051436 location = DOMKeyLocationLeft;
[email protected]3db130e2014-03-27 08:14:481437 } else if ("rightAlt" == code_str) {
dtapuskad3ba0f042015-08-27 14:08:051438 code = ui::VKEY_MENU;
habib.virji565c80c2015-02-06 12:26:431439 domString.assign("AltRight");
dtapuskad3ba0f042015-08-27 14:08:051440 location = DOMKeyLocationRight;
[email protected]3db130e2014-03-27 08:14:481441 } else if ("numLock" == code_str) {
[email protected]a731f1a92014-04-17 19:31:061442 code = ui::VKEY_NUMLOCK;
habib.virji565c80c2015-02-06 12:26:431443 domString.assign("NumLock");
[email protected]4c07a712014-08-21 17:05:541444 } else if ("backspace" == code_str) {
1445 code = ui::VKEY_BACK;
habib.virji565c80c2015-02-06 12:26:431446 domString.assign("Backspace");
[email protected]4c07a712014-08-21 17:05:541447 } else if ("escape" == code_str) {
1448 code = ui::VKEY_ESCAPE;
habib.virji565c80c2015-02-06 12:26:431449 domString.assign("Escape");
[email protected]3db130e2014-03-27 08:14:481450 } else {
1451 // Compare the input string with the function-key names defined by the
1452 // DOM spec (i.e. "F1",...,"F24"). If the input string is a function-key
1453 // name, set its key code.
1454 for (int i = 1; i <= 24; ++i) {
1455 std::string function_key_name = base::StringPrintf("F%d", i);
1456 if (function_key_name == code_str) {
[email protected]a731f1a92014-04-17 19:31:061457 code = ui::VKEY_F1 + (i - 1);
habib.virji565c80c2015-02-06 12:26:431458 domString = function_key_name;
[email protected]3db130e2014-03-27 08:14:481459 break;
1460 }
1461 }
1462 if (!code) {
esprehnd29ab802015-12-11 13:01:191463 base::string16 code_str16 = base::UTF8ToUTF16(code_str);
1464 if (code_str16.size() != 1u) {
dtapuskabd2a1652015-05-20 00:30:151465 v8::Isolate* isolate = blink::mainThreadIsolate();
1466 isolate->ThrowException(v8::Exception::TypeError(
1467 gin::StringToV8(isolate, "Invalid web code.")));
1468 return;
1469 }
esprehnd29ab802015-12-11 13:01:191470 text = code = code_str16[0];
[email protected]3db130e2014-03-27 08:14:481471 needs_shift_key_modifier = NeedsShiftModifier(code);
1472 if ((code & 0xFF) >= 'a' && (code & 0xFF) <= 'z')
1473 code -= 'a' - 'A';
habib.virji565c80c2015-02-06 12:26:431474 if ((code >= 'A' && code <= 'Z') || (code >= 'a' && code <= 'z')) {
1475 domString.assign("Key");
brettwc15100c2015-08-06 22:54:161476 domString.push_back(
1477 base::ToUpperASCII(static_cast<base::char16>(code)));
habib.virji565c80c2015-02-06 12:26:431478 } else if (code >= '0' && code <= '9') {
1479 domString.assign("Digit");
1480 domString.push_back(code);
1481 } else if (code == ' ') {
1482 domString.assign("Space");
1483 } else if (code == 9) {
1484 domString.assign("Tab");
1485 }
[email protected]3db130e2014-03-27 08:14:481486 generate_char = true;
1487 }
1488
1489 if ("(" == code_str) {
1490 code = '9';
1491 needs_shift_key_modifier = true;
1492 }
1493 }
1494
1495 // For one generated keyboard event, we need to generate a keyDown/keyUp
1496 // pair;
1497 // On Windows, we might also need to generate a char event to mimic the
1498 // Windows event flow; on other platforms we create a merged event and test
1499 // the event flow that that platform provides.
1500 WebKeyboardEvent event_down;
majidvp0c6422a2015-09-17 20:07:251501 event_down.timeStampSeconds = GetCurrentEventTimeSec();
[email protected]3db130e2014-03-27 08:14:481502 event_down.type = WebInputEvent::RawKeyDown;
1503 event_down.modifiers = modifiers;
1504 event_down.windowsKeyCode = code;
habib.virji565c80c2015-02-06 12:26:431505 event_down.domCode = static_cast<int>(
kpschoedela6d524f332015-10-26 14:46:251506 ui::KeycodeConverter::CodeStringToDomCode(domString));
[email protected]3db130e2014-03-27 08:14:481507
[email protected]3db130e2014-03-27 08:14:481508 if (generate_char) {
1509 event_down.text[0] = text;
1510 event_down.unmodifiedText[0] = text;
1511 }
1512
1513 event_down.setKeyIdentifierFromWindowsKeyCode();
1514
[email protected]3db130e2014-03-27 08:14:481515 if (event_down.modifiers != 0)
[email protected]a731f1a92014-04-17 19:31:061516 event_down.isSystemKey = IsSystemKeyEvent(event_down);
[email protected]3db130e2014-03-27 08:14:481517
1518 if (needs_shift_key_modifier)
1519 event_down.modifiers |= WebInputEvent::ShiftKey;
1520
1521 // See if KeyLocation argument is given.
thestigfd11ffe2015-12-30 19:25:451522 switch (location) {
dtapuskad3ba0f042015-08-27 14:08:051523 case DOMKeyLocationStandard:
1524 break;
1525 case DOMKeyLocationLeft:
1526 event_down.modifiers |= WebInputEvent::IsLeft;
1527 break;
1528 case DOMKeyLocationRight:
1529 event_down.modifiers |= WebInputEvent::IsRight;
1530 break;
1531 case DOMKeyLocationNumpad:
[email protected]3db130e2014-03-27 08:14:481532 event_down.modifiers |= WebInputEvent::IsKeyPad;
dtapuskad3ba0f042015-08-27 14:08:051533 break;
1534 }
[email protected]3db130e2014-03-27 08:14:481535
1536 WebKeyboardEvent event_up;
1537 event_up = event_down;
1538 event_up.type = WebInputEvent::KeyUp;
1539 // EventSender.m forces a layout here, with at least one
1540 // test (fast/forms/focus-control-to-page.html) relying on this.
1541 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:251542 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481543
1544 // In the browser, if a keyboard event corresponds to an editor command,
1545 // the command will be dispatched to the renderer just before dispatching
1546 // the keyboard event, and then it will be executed in the
1547 // RenderView::handleCurrentKeyboardEvent() method.
1548 // We just simulate the same behavior here.
1549 std::string edit_command;
1550 if (GetEditCommand(event_down, &edit_command))
abhishek.a21ca9b5602014-09-19 07:33:331551 delegate_->SetEditCommand(edit_command, "");
[email protected]3db130e2014-03-27 08:14:481552
tkent588765612014-11-28 01:07:481553 HandleInputEventOnViewOrPopup(event_down);
[email protected]3db130e2014-03-27 08:14:481554
[email protected]a731f1a92014-04-17 19:31:061555 if (code == ui::VKEY_ESCAPE && !current_drag_data_.isNull()) {
[email protected]3db130e2014-03-27 08:14:481556 WebMouseEvent event;
1557 InitMouseEvent(WebInputEvent::MouseDown,
1558 pressed_button_,
mustaq21aed4e2015-12-15 21:47:211559 current_buttons_,
[email protected]3db130e2014-03-27 08:14:481560 last_mouse_pos_,
1561 GetCurrentEventTimeSec(),
1562 click_count_,
1563 0,
1564 &event);
1565 FinishDragAndDrop(event, blink::WebDragOperationNone);
1566 }
1567
abhishek.a21ca9b5602014-09-19 07:33:331568 delegate_->ClearEditCommand();
[email protected]3db130e2014-03-27 08:14:481569
1570 if (generate_char) {
1571 WebKeyboardEvent event_char = event_up;
1572 event_char.type = WebInputEvent::Char;
rob994f9e82014-11-02 20:55:041573 // keyIdentifier is an empty string, unless the Enter key was pressed.
1574 // This behavior is not standard (keyIdentifier itself is not even a
1575 // standard any more), but it matches the actual behavior in Blink.
1576 if (code != ui::VKEY_RETURN)
1577 event_char.keyIdentifier[0] = '\0';
tkent588765612014-11-28 01:07:481578 HandleInputEventOnViewOrPopup(event_char);
[email protected]3db130e2014-03-27 08:14:481579 }
1580
tkent588765612014-11-28 01:07:481581 HandleInputEventOnViewOrPopup(event_up);
[email protected]3db130e2014-03-27 08:14:481582}
1583
1584void EventSender::EnableDOMUIEventLogging() {}
1585
1586void EventSender::FireKeyboardEventsToElement() {}
1587
1588void EventSender::ClearKillRing() {}
1589
1590std::vector<std::string> EventSender::ContextClick() {
1591 if (force_layout_on_events_) {
wkorman7265db012015-11-03 04:08:251592 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481593 }
1594
1595 UpdateClickCountForButton(WebMouseEvent::ButtonRight);
1596
1597 // Clears last context menu data because we need to know if the context menu
1598 // be requested after following mouse events.
1599 last_context_menu_data_.reset();
1600
1601 // Generate right mouse down and up.
1602 WebMouseEvent event;
1603 // This is a hack to work around only allowing a single pressed button since
1604 // we want to test the case where both the left and right mouse buttons are
1605 // pressed.
mustaq21aed4e2015-12-15 21:47:211606 // TODO(mustaq): This hack seems unused here! But do we need this hack at all
1607 // after adding current_buttons_.
[email protected]3db130e2014-03-27 08:14:481608 if (pressed_button_ == WebMouseEvent::ButtonNone) {
1609 pressed_button_ = WebMouseEvent::ButtonRight;
mustaq21aed4e2015-12-15 21:47:211610 current_buttons_ |= GetWebMouseEventModifierForButton(pressed_button_);
[email protected]3db130e2014-03-27 08:14:481611 }
1612 InitMouseEvent(WebInputEvent::MouseDown,
1613 WebMouseEvent::ButtonRight,
mustaq21aed4e2015-12-15 21:47:211614 current_buttons_,
[email protected]3db130e2014-03-27 08:14:481615 last_mouse_pos_,
1616 GetCurrentEventTimeSec(),
1617 click_count_,
1618 0,
1619 &event);
tkent588765612014-11-28 01:07:481620 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481621
1622#if defined(OS_WIN)
mustaq21aed4e2015-12-15 21:47:211623 current_buttons_ &=
1624 ~GetWebMouseEventModifierForButton(WebMouseEvent::ButtonRight);
thestigfd11ffe2015-12-30 19:25:451625 pressed_button_ = WebMouseEvent::ButtonNone;
mustaq21aed4e2015-12-15 21:47:211626
[email protected]3db130e2014-03-27 08:14:481627 InitMouseEvent(WebInputEvent::MouseUp,
1628 WebMouseEvent::ButtonRight,
mustaq21aed4e2015-12-15 21:47:211629 current_buttons_,
[email protected]3db130e2014-03-27 08:14:481630 last_mouse_pos_,
1631 GetCurrentEventTimeSec(),
1632 click_count_,
1633 0,
1634 &event);
tkent588765612014-11-28 01:07:481635 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481636#endif
1637
jochen73e711c2015-06-03 10:01:461638 std::vector<std::string> menu_items =
1639 MakeMenuItemStringsFor(last_context_menu_data_.get(), delegate_);
[email protected]e7c71192014-04-23 11:53:481640 last_context_menu_data_.reset();
1641 return menu_items;
[email protected]3db130e2014-03-27 08:14:481642}
1643
1644void EventSender::TextZoomIn() {
1645 view_->setTextZoomFactor(view_->textZoomFactor() * 1.2f);
1646}
1647
1648void EventSender::TextZoomOut() {
1649 view_->setTextZoomFactor(view_->textZoomFactor() / 1.2f);
1650}
1651
1652void EventSender::ZoomPageIn() {
[email protected]8ed8bf432014-08-11 19:47:551653 const std::vector<WebTestProxyBase*>& window_list =
1654 interfaces_->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481655
1656 for (size_t i = 0; i < window_list.size(); ++i) {
[email protected]a1640e42014-05-14 13:43:321657 window_list.at(i)->GetWebView()->setZoomLevel(
1658 window_list.at(i)->GetWebView()->zoomLevel() + 1);
[email protected]3db130e2014-03-27 08:14:481659 }
1660}
1661
1662void EventSender::ZoomPageOut() {
[email protected]8ed8bf432014-08-11 19:47:551663 const std::vector<WebTestProxyBase*>& window_list =
1664 interfaces_->GetWindowList();
[email protected]3db130e2014-03-27 08:14:481665
1666 for (size_t i = 0; i < window_list.size(); ++i) {
[email protected]a1640e42014-05-14 13:43:321667 window_list.at(i)->GetWebView()->setZoomLevel(
1668 window_list.at(i)->GetWebView()->zoomLevel() - 1);
[email protected]3db130e2014-03-27 08:14:481669 }
1670}
1671
[email protected]b32fe542014-04-30 08:42:061672void EventSender::SetPageZoomFactor(double zoom_factor) {
[email protected]8ed8bf432014-08-11 19:47:551673 const std::vector<WebTestProxyBase*>& window_list =
1674 interfaces_->GetWindowList();
[email protected]b32fe542014-04-30 08:42:061675
1676 for (size_t i = 0; i < window_list.size(); ++i) {
[email protected]a1640e42014-05-14 13:43:321677 window_list.at(i)->GetWebView()->setZoomLevel(
jochen7fa00372015-05-13 07:13:351678 std::log(zoom_factor) / std::log(1.2));
[email protected]b32fe542014-04-30 08:42:061679 }
1680}
1681
[email protected]3db130e2014-03-27 08:14:481682void EventSender::ClearTouchPoints() {
1683 touch_points_.clear();
1684}
1685
[email protected]bfb6a602014-04-16 19:59:411686void EventSender::ThrowTouchPointError() {
1687 v8::Isolate* isolate = blink::mainThreadIsolate();
1688 isolate->ThrowException(v8::Exception::TypeError(
1689 gin::StringToV8(isolate, "Invalid touch point.")));
1690}
1691
[email protected]3db130e2014-03-27 08:14:481692void EventSender::ReleaseTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411693 if (index >= touch_points_.size()) {
1694 ThrowTouchPointError();
1695 return;
1696 }
[email protected]3db130e2014-03-27 08:14:481697
1698 WebTouchPoint* touch_point = &touch_points_[index];
1699 touch_point->state = WebTouchPoint::StateReleased;
1700}
1701
e.hakkinen80033922015-07-31 08:41:351702void EventSender::UpdateTouchPoint(unsigned index,
1703 float x,
1704 float y,
1705 gin::Arguments* args) {
[email protected]bfb6a602014-04-16 19:59:411706 if (index >= touch_points_.size()) {
1707 ThrowTouchPointError();
1708 return;
1709 }
[email protected]3db130e2014-03-27 08:14:481710
1711 WebTouchPoint* touch_point = &touch_points_[index];
1712 touch_point->state = WebTouchPoint::StateMoved;
1713 touch_point->position = WebFloatPoint(x, y);
1714 touch_point->screenPosition = touch_point->position;
e.hakkinen80033922015-07-31 08:41:351715
1716 InitPointerProperties(args, touch_point, &touch_point->radiusX,
1717 &touch_point->radiusY);
[email protected]3db130e2014-03-27 08:14:481718}
1719
1720void EventSender::CancelTouchPoint(unsigned index) {
[email protected]bfb6a602014-04-16 19:59:411721 if (index >= touch_points_.size()) {
1722 ThrowTouchPointError();
1723 return;
1724 }
[email protected]3db130e2014-03-27 08:14:481725
1726 WebTouchPoint* touch_point = &touch_points_[index];
1727 touch_point->state = WebTouchPoint::StateCancelled;
1728}
1729
1730void EventSender::SetTouchModifier(const std::string& key_name,
1731 bool set_mask) {
mustaq21aed4e2015-12-15 21:47:211732 int mask = GetKeyModifier(key_name);
[email protected]3db130e2014-03-27 08:14:481733
1734 if (set_mask)
1735 touch_modifiers_ |= mask;
1736 else
1737 touch_modifiers_ &= ~mask;
1738}
1739
[email protected]ace1cd502014-04-24 21:05:301740void EventSender::SetTouchCancelable(bool cancelable) {
1741 touch_cancelable_ = cancelable;
1742}
1743
[email protected]3db130e2014-03-27 08:14:481744void EventSender::DumpFilenameBeingDragged() {
dchengc3fe4642015-01-22 06:29:521745 if (current_drag_data_.isNull())
1746 return;
1747
[email protected]3db130e2014-03-27 08:14:481748 WebString filename;
1749 WebVector<WebDragData::Item> items = current_drag_data_.items();
1750 for (size_t i = 0; i < items.size(); ++i) {
1751 if (items[i].storageType == WebDragData::Item::StorageTypeBinaryData) {
1752 filename = items[i].title;
1753 break;
1754 }
1755 }
abhishek.a21ca9b5602014-09-19 07:33:331756 delegate_->PrintMessage(std::string("Filename being dragged: ") +
[email protected]3db130e2014-03-27 08:14:481757 filename.utf8().data() + "\n");
1758}
1759
1760void EventSender::GestureFlingCancel() {
1761 WebGestureEvent event;
1762 event.type = WebInputEvent::GestureFlingCancel;
wjmaclean3bb814792015-10-20 01:13:321763 // Generally it won't matter what device we use here, and since it might
1764 // be cumbersome to expect all callers to specify a device, we'll just
1765 // choose Touchpad here.
1766 event.sourceDevice = blink::WebGestureDeviceTouchpad;
[email protected]3db130e2014-03-27 08:14:481767 event.timeStampSeconds = GetCurrentEventTimeSec();
1768
1769 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:251770 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481771
tkent588765612014-11-28 01:07:481772 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481773}
1774
1775void EventSender::GestureFlingStart(float x,
tdresser3a1c9722015-02-13 15:44:531776 float y,
1777 float velocity_x,
1778 float velocity_y,
1779 gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:481780 WebGestureEvent event;
1781 event.type = WebInputEvent::GestureFlingStart;
1782
tdresser15af5872015-02-18 14:03:021783 std::string device_string;
1784 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString())
1785 args->GetNext(&device_string);
tdresser3a1c9722015-02-13 15:44:531786
1787 if (device_string == kSourceDeviceStringTouchpad) {
1788 event.sourceDevice = blink::WebGestureDeviceTouchpad;
1789 } else if (device_string == kSourceDeviceStringTouchscreen) {
1790 event.sourceDevice = blink::WebGestureDeviceTouchscreen;
1791 } else {
1792 args->ThrowError();
1793 return;
1794 }
1795
[email protected]3db130e2014-03-27 08:14:481796 event.x = x;
1797 event.y = y;
1798 event.globalX = event.x;
1799 event.globalY = event.y;
1800
1801 event.data.flingStart.velocityX = velocity_x;
1802 event.data.flingStart.velocityY = velocity_y;
1803 event.timeStampSeconds = GetCurrentEventTimeSec();
1804
1805 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:251806 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481807
tkent588765612014-11-28 01:07:481808 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481809}
1810
1811void EventSender::GestureScrollFirstPoint(int x, int y) {
1812 current_gesture_location_ = WebPoint(x, y);
1813}
1814
1815void EventSender::TouchStart() {
mustaq96985f722015-06-30 21:41:531816 SendCurrentTouchEvent(WebInputEvent::TouchStart, false);
[email protected]3db130e2014-03-27 08:14:481817}
1818
1819void EventSender::TouchMove() {
mustaq96985f722015-06-30 21:41:531820 SendCurrentTouchEvent(WebInputEvent::TouchMove, false);
1821}
1822
1823void EventSender::TouchMoveCausingScrollIfUncanceled() {
1824 SendCurrentTouchEvent(WebInputEvent::TouchMove, true);
[email protected]3db130e2014-03-27 08:14:481825}
1826
1827void EventSender::TouchCancel() {
mustaq96985f722015-06-30 21:41:531828 SendCurrentTouchEvent(WebInputEvent::TouchCancel, false);
[email protected]3db130e2014-03-27 08:14:481829}
1830
1831void EventSender::TouchEnd() {
mustaq96985f722015-06-30 21:41:531832 SendCurrentTouchEvent(WebInputEvent::TouchEnd, false);
[email protected]3db130e2014-03-27 08:14:481833}
1834
1835void EventSender::LeapForward(int milliseconds) {
1836 if (is_drag_mode_ && pressed_button_ == WebMouseEvent::ButtonLeft &&
1837 !replaying_saved_events_) {
1838 SavedEvent saved_event;
1839 saved_event.type = SavedEvent::TYPE_LEAP_FORWARD;
1840 saved_event.milliseconds = milliseconds;
1841 mouse_event_queue_.push_back(saved_event);
1842 } else {
1843 DoLeapForward(milliseconds);
1844 }
1845}
1846
1847void EventSender::BeginDragWithFiles(const std::vector<std::string>& files) {
1848 current_drag_data_.initialize();
1849 WebVector<WebString> absolute_filenames(files.size());
1850 for (size_t i = 0; i < files.size(); ++i) {
1851 WebDragData::Item item;
1852 item.storageType = WebDragData::Item::StorageTypeFilename;
abhishek.a21ca9b5602014-09-19 07:33:331853 item.filenameData = delegate_->GetAbsoluteWebStringFromUTF8Path(files[i]);
[email protected]3db130e2014-03-27 08:14:481854 current_drag_data_.addItem(item);
1855 absolute_filenames[i] = item.filenameData;
1856 }
1857 current_drag_data_.setFilesystemId(
abhishek.a21ca9b5602014-09-19 07:33:331858 delegate_->RegisterIsolatedFileSystem(absolute_filenames));
[email protected]3db130e2014-03-27 08:14:481859 current_drag_effects_allowed_ = blink::WebDragOperationCopy;
1860
1861 // Provide a drag source.
1862 view_->dragTargetDragEnter(current_drag_data_,
1863 last_mouse_pos_,
1864 last_mouse_pos_,
1865 current_drag_effects_allowed_,
1866 0);
1867 // |is_drag_mode_| saves events and then replays them later. We don't
1868 // need/want that.
1869 is_drag_mode_ = false;
1870
1871 // Make the rest of eventSender think a drag is in progress.
1872 pressed_button_ = WebMouseEvent::ButtonLeft;
mustaq21aed4e2015-12-15 21:47:211873 current_buttons_ |= GetWebMouseEventModifierForButton(pressed_button_);
[email protected]3db130e2014-03-27 08:14:481874}
1875
e.hakkinen80033922015-07-31 08:41:351876void EventSender::AddTouchPoint(float x, float y, gin::Arguments* args) {
[email protected]3db130e2014-03-27 08:14:481877 WebTouchPoint touch_point;
1878 touch_point.state = WebTouchPoint::StatePressed;
e.hakkinen80033922015-07-31 08:41:351879 touch_point.position = WebFloatPoint(x, y);
[email protected]3db130e2014-03-27 08:14:481880 touch_point.screenPosition = touch_point.position;
1881
mustaq913e8922015-09-09 20:15:361882 int highest_id = -1;
[email protected]3db130e2014-03-27 08:14:481883 for (size_t i = 0; i < touch_points_.size(); i++) {
mustaq913e8922015-09-09 20:15:361884 if (touch_points_[i].id > highest_id)
1885 highest_id = touch_points_[i].id;
[email protected]3db130e2014-03-27 08:14:481886 }
mustaq913e8922015-09-09 20:15:361887 touch_point.id = highest_id + 1;
e.hakkinen80033922015-07-31 08:41:351888
1889 InitPointerProperties(args, &touch_point, &touch_point.radiusX,
1890 &touch_point.radiusY);
1891
nzolghadr88114bc2016-02-01 21:46:161892 // Set the touch point pressure to zero if it was not set by the caller
1893 if (isnan(touch_point.force))
1894 touch_point.force = 0.0;
1895
[email protected]3db130e2014-03-27 08:14:481896 touch_points_.push_back(touch_point);
1897}
1898
1899void EventSender::MouseDragBegin() {
1900 WebMouseWheelEvent event;
1901 InitMouseEvent(WebInputEvent::MouseWheel,
1902 WebMouseEvent::ButtonNone,
mustaq21aed4e2015-12-15 21:47:211903 0,
[email protected]3db130e2014-03-27 08:14:481904 last_mouse_pos_,
1905 GetCurrentEventTimeSec(),
1906 click_count_,
1907 0,
1908 &event);
1909 event.phase = WebMouseWheelEvent::PhaseBegan;
1910 event.hasPreciseScrollingDeltas = true;
tkent588765612014-11-28 01:07:481911 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481912}
1913
1914void EventSender::MouseDragEnd() {
1915 WebMouseWheelEvent event;
1916 InitMouseEvent(WebInputEvent::MouseWheel,
1917 WebMouseEvent::ButtonNone,
mustaq21aed4e2015-12-15 21:47:211918 0,
[email protected]3db130e2014-03-27 08:14:481919 last_mouse_pos_,
1920 GetCurrentEventTimeSec(),
1921 click_count_,
1922 0,
1923 &event);
1924 event.phase = WebMouseWheelEvent::PhaseEnded;
1925 event.hasPreciseScrollingDeltas = true;
tkent588765612014-11-28 01:07:481926 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481927}
1928
[email protected]3db130e2014-03-27 08:14:481929void EventSender::GestureScrollBegin(gin::Arguments* args) {
1930 GestureEvent(WebInputEvent::GestureScrollBegin, args);
1931}
1932
1933void EventSender::GestureScrollEnd(gin::Arguments* args) {
1934 GestureEvent(WebInputEvent::GestureScrollEnd, args);
1935}
1936
1937void EventSender::GestureScrollUpdate(gin::Arguments* args) {
1938 GestureEvent(WebInputEvent::GestureScrollUpdate, args);
1939}
1940
ccameronb81b8072015-01-30 00:54:491941void EventSender::GesturePinchBegin(gin::Arguments* args) {
1942 GestureEvent(WebInputEvent::GesturePinchBegin, args);
1943}
1944
1945void EventSender::GesturePinchEnd(gin::Arguments* args) {
1946 GestureEvent(WebInputEvent::GesturePinchEnd, args);
1947}
1948
1949void EventSender::GesturePinchUpdate(gin::Arguments* args) {
1950 GestureEvent(WebInputEvent::GesturePinchUpdate, args);
1951}
1952
[email protected]3db130e2014-03-27 08:14:481953void EventSender::GestureTap(gin::Arguments* args) {
1954 GestureEvent(WebInputEvent::GestureTap, args);
1955}
1956
1957void EventSender::GestureTapDown(gin::Arguments* args) {
1958 GestureEvent(WebInputEvent::GestureTapDown, args);
1959}
1960
1961void EventSender::GestureShowPress(gin::Arguments* args) {
1962 GestureEvent(WebInputEvent::GestureShowPress, args);
1963}
1964
1965void EventSender::GestureTapCancel(gin::Arguments* args) {
1966 GestureEvent(WebInputEvent::GestureTapCancel, args);
1967}
1968
1969void EventSender::GestureLongPress(gin::Arguments* args) {
1970 GestureEvent(WebInputEvent::GestureLongPress, args);
1971}
1972
1973void EventSender::GestureLongTap(gin::Arguments* args) {
1974 GestureEvent(WebInputEvent::GestureLongTap, args);
1975}
1976
1977void EventSender::GestureTwoFingerTap(gin::Arguments* args) {
1978 GestureEvent(WebInputEvent::GestureTwoFingerTap, args);
1979}
1980
1981void EventSender::ContinuousMouseScrollBy(gin::Arguments* args) {
1982 WebMouseWheelEvent event;
1983 InitMouseWheelEvent(args, true, &event);
tkent588765612014-11-28 01:07:481984 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:481985}
1986
[email protected]3db130e2014-03-27 08:14:481987void EventSender::MouseMoveTo(gin::Arguments* args) {
1988 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:251989 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:481990
[email protected]f53eba122014-04-16 11:30:011991 double x;
1992 double y;
mustaq0fff7fc32014-09-24 20:21:431993 if (!args->GetNext(&x) || !args->GetNext(&y)) {
1994 args->ThrowError();
1995 return;
1996 }
[email protected]f53eba122014-04-16 11:30:011997 WebPoint mouse_pos(static_cast<int>(x), static_cast<int>(y));
[email protected]3db130e2014-03-27 08:14:481998
1999 int modifiers = 0;
2000 if (!args->PeekNext().IsEmpty())
bashidbd2ef9bb2015-06-02 01:39:322001 modifiers = GetKeyModifiersFromV8(args->isolate(), args->PeekNext());
[email protected]3db130e2014-03-27 08:14:482002
2003 if (is_drag_mode_ && pressed_button_ == WebMouseEvent::ButtonLeft &&
2004 !replaying_saved_events_) {
2005 SavedEvent saved_event;
2006 saved_event.type = SavedEvent::TYPE_MOUSE_MOVE;
2007 saved_event.pos = mouse_pos;
2008 saved_event.modifiers = modifiers;
2009 mouse_event_queue_.push_back(saved_event);
2010 } else {
2011 WebMouseEvent event;
2012 InitMouseEvent(WebInputEvent::MouseMove,
2013 pressed_button_,
mustaq21aed4e2015-12-15 21:47:212014 current_buttons_,
[email protected]3db130e2014-03-27 08:14:482015 mouse_pos,
2016 GetCurrentEventTimeSec(),
2017 click_count_,
2018 modifiers,
2019 &event);
2020 DoMouseMove(event);
2021 }
2022}
2023
myid.shin12c7fea22015-03-06 02:31:242024void EventSender::MouseLeave() {
2025 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:252026 view_->updateAllLifecyclePhases();
myid.shin12c7fea22015-03-06 02:31:242027
2028 WebMouseEvent event;
2029 InitMouseEvent(WebInputEvent::MouseLeave,
2030 WebMouseEvent::ButtonNone,
mustaq21aed4e2015-12-15 21:47:212031 0,
myid.shin12c7fea22015-03-06 02:31:242032 last_mouse_pos_,
2033 GetCurrentEventTimeSec(),
2034 click_count_,
2035 0,
2036 &event);
thestigfd11ffe2015-12-30 19:25:452037 HandleInputEventOnViewOrPopup(event);
myid.shin12c7fea22015-03-06 02:31:242038}
2039
2040
[email protected]9d80c822014-05-19 19:07:122041void EventSender::TrackpadScrollBegin() {
2042 WebMouseWheelEvent event;
2043 InitMouseEvent(WebInputEvent::MouseWheel,
2044 WebMouseEvent::ButtonNone,
mustaq21aed4e2015-12-15 21:47:212045 0,
[email protected]9d80c822014-05-19 19:07:122046 last_mouse_pos_,
2047 GetCurrentEventTimeSec(),
2048 click_count_,
2049 0,
2050 &event);
2051 event.phase = blink::WebMouseWheelEvent::PhaseBegan;
2052 event.hasPreciseScrollingDeltas = true;
tkent588765612014-11-28 01:07:482053 HandleInputEventOnViewOrPopup(event);
[email protected]9d80c822014-05-19 19:07:122054}
2055
2056void EventSender::TrackpadScroll(gin::Arguments* args) {
2057 WebMouseWheelEvent event;
2058 InitMouseWheelEvent(args, true, &event);
2059 event.phase = blink::WebMouseWheelEvent::PhaseChanged;
2060 event.hasPreciseScrollingDeltas = true;
tkent588765612014-11-28 01:07:482061 HandleInputEventOnViewOrPopup(event);
[email protected]9d80c822014-05-19 19:07:122062}
2063
2064void EventSender::TrackpadScrollEnd() {
2065 WebMouseWheelEvent event;
2066 InitMouseEvent(WebInputEvent::MouseWheel,
2067 WebMouseEvent::ButtonNone,
mustaq21aed4e2015-12-15 21:47:212068 0,
[email protected]9d80c822014-05-19 19:07:122069 last_mouse_pos_,
2070 GetCurrentEventTimeSec(),
2071 click_count_,
2072 0,
2073 &event);
2074 event.phase = WebMouseWheelEvent::PhaseEnded;
2075 event.hasPreciseScrollingDeltas = true;
tkent588765612014-11-28 01:07:482076 HandleInputEventOnViewOrPopup(event);
[email protected]9d80c822014-05-19 19:07:122077}
2078
[email protected]3db130e2014-03-27 08:14:482079void EventSender::MouseScrollBy(gin::Arguments* args) {
thestigfd11ffe2015-12-30 19:25:452080 WebMouseWheelEvent event;
[email protected]3db130e2014-03-27 08:14:482081 InitMouseWheelEvent(args, false, &event);
tkent588765612014-11-28 01:07:482082 HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:482083}
2084
[email protected]3db130e2014-03-27 08:14:482085void EventSender::ScheduleAsynchronousClick(int button_number, int modifiers) {
abhishek.a21ca9b5602014-09-19 07:33:332086 delegate_->PostTask(new MouseDownTask(this, button_number, modifiers));
2087 delegate_->PostTask(new MouseUpTask(this, button_number, modifiers));
[email protected]3db130e2014-03-27 08:14:482088}
2089
2090void EventSender::ScheduleAsynchronousKeyDown(const std::string& code_str,
2091 int modifiers,
2092 KeyLocationCode location) {
abhishek.a21ca9b5602014-09-19 07:33:332093 delegate_->PostTask(new KeyDownTask(this, code_str, modifiers, location));
[email protected]3db130e2014-03-27 08:14:482094}
2095
2096double EventSender::GetCurrentEventTimeSec() {
majidvpeabdeb82015-11-30 19:02:052097 return (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF() +
majidvpbfabb0712015-10-02 16:30:002098 time_offset_ms_ / 1000.0;
[email protected]3db130e2014-03-27 08:14:482099}
2100
2101void EventSender::DoLeapForward(int milliseconds) {
2102 time_offset_ms_ += milliseconds;
2103}
2104
mustaq96985f722015-06-30 21:41:532105void EventSender::SendCurrentTouchEvent(WebInputEvent::Type type,
2106 bool causesScrollingIfUncanceled) {
[email protected]3db130e2014-03-27 08:14:482107 DCHECK_GT(static_cast<unsigned>(WebTouchEvent::touchesLengthCap),
2108 touch_points_.size());
2109 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:252110 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482111
2112 WebTouchEvent touch_event;
2113 touch_event.type = type;
2114 touch_event.modifiers = touch_modifiers_;
[email protected]ace1cd502014-04-24 21:05:302115 touch_event.cancelable = touch_cancelable_;
[email protected]3db130e2014-03-27 08:14:482116 touch_event.timeStampSeconds = GetCurrentEventTimeSec();
mustaq96985f722015-06-30 21:41:532117 touch_event.causesScrollingIfUncanceled = causesScrollingIfUncanceled;
[email protected]3db130e2014-03-27 08:14:482118 touch_event.touchesLength = touch_points_.size();
2119 for (size_t i = 0; i < touch_points_.size(); ++i)
2120 touch_event.touches[i] = touch_points_[i];
tkent588765612014-11-28 01:07:482121 HandleInputEventOnViewOrPopup(touch_event);
[email protected]3db130e2014-03-27 08:14:482122
2123 for (size_t i = 0; i < touch_points_.size(); ++i) {
2124 WebTouchPoint* touch_point = &touch_points_[i];
mustaq913e8922015-09-09 20:15:362125 if (touch_point->state == WebTouchPoint::StateReleased
2126 || touch_point->state == WebTouchPoint::StateCancelled) {
[email protected]3db130e2014-03-27 08:14:482127 touch_points_.erase(touch_points_.begin() + i);
2128 --i;
thestigfd11ffe2015-12-30 19:25:452129 } else {
[email protected]3db130e2014-03-27 08:14:482130 touch_point->state = WebTouchPoint::StateStationary;
thestigfd11ffe2015-12-30 19:25:452131 }
[email protected]3db130e2014-03-27 08:14:482132 }
2133}
2134
2135void EventSender::GestureEvent(WebInputEvent::Type type,
majidvp41c4272a2014-12-08 15:51:142136 gin::Arguments* args) {
ccameronb81b8072015-01-30 00:54:492137 WebGestureEvent event;
2138 event.type = type;
2139
2140 // If the first argument is a string, it is to specify the device, otherwise
2141 // the device is assumed to be a touchscreen (since most tests were written
2142 // assuming this).
2143 event.sourceDevice = blink::WebGestureDeviceTouchscreen;
jochen87d2fee2015-07-13 08:21:342144 if (!args->PeekNext().IsEmpty() && args->PeekNext()->IsString()) {
ccameronb81b8072015-01-30 00:54:492145 std::string device_string;
2146 if (!args->GetNext(&device_string)) {
2147 args->ThrowError();
2148 return;
2149 }
tdresser3a1c9722015-02-13 15:44:532150 if (device_string == kSourceDeviceStringTouchpad) {
ccameronb81b8072015-01-30 00:54:492151 event.sourceDevice = blink::WebGestureDeviceTouchpad;
tdresser3a1c9722015-02-13 15:44:532152 } else if (device_string == kSourceDeviceStringTouchscreen) {
ccameronb81b8072015-01-30 00:54:492153 event.sourceDevice = blink::WebGestureDeviceTouchscreen;
2154 } else {
2155 args->ThrowError();
2156 return;
2157 }
2158 }
2159
[email protected]3db130e2014-03-27 08:14:482160 double x;
2161 double y;
mustaq0fff7fc32014-09-24 20:21:432162 if (!args->GetNext(&x) || !args->GetNext(&y)) {
2163 args->ThrowError();
2164 return;
2165 }
[email protected]3db130e2014-03-27 08:14:482166
[email protected]3db130e2014-03-27 08:14:482167 switch (type) {
2168 case WebInputEvent::GestureScrollUpdate:
majidvp50205db2014-11-27 17:28:522169 {
majidvp41c4272a2014-12-08 15:51:142170 bool preventPropagation = false;
2171 if (!args->PeekNext().IsEmpty()) {
majidvp50205db2014-11-27 17:28:522172 if (!args->GetNext(&preventPropagation)) {
2173 args->ThrowError();
2174 return;
2175 }
2176 }
dtapuskab1c5ece2016-01-18 18:18:022177 if (!GetScrollUnits(args, &event.data.scrollUpdate.deltaUnits))
2178 return;
majidvp50205db2014-11-27 17:28:522179
[email protected]3db130e2014-03-27 08:14:482180 event.data.scrollUpdate.deltaX = static_cast<float>(x);
2181 event.data.scrollUpdate.deltaY = static_cast<float>(y);
majidvp50205db2014-11-27 17:28:522182 event.data.scrollUpdate.preventPropagation = preventPropagation;
[email protected]3db130e2014-03-27 08:14:482183 event.x = current_gesture_location_.x;
2184 event.y = current_gesture_location_.y;
2185 current_gesture_location_.x =
2186 current_gesture_location_.x + event.data.scrollUpdate.deltaX;
2187 current_gesture_location_.y =
2188 current_gesture_location_.y + event.data.scrollUpdate.deltaY;
2189 break;
majidvp50205db2014-11-27 17:28:522190 }
[email protected]3db130e2014-03-27 08:14:482191 case WebInputEvent::GestureScrollBegin:
mustaq0fff7fc32014-09-24 20:21:432192 current_gesture_location_ = WebPoint(x, y);
[email protected]3db130e2014-03-27 08:14:482193 event.x = current_gesture_location_.x;
2194 event.y = current_gesture_location_.y;
2195 break;
2196 case WebInputEvent::GestureScrollEnd:
2197 case WebInputEvent::GestureFlingStart:
2198 event.x = current_gesture_location_.x;
2199 event.y = current_gesture_location_.y;
2200 break;
ccameronb81b8072015-01-30 00:54:492201 case WebInputEvent::GesturePinchBegin:
2202 case WebInputEvent::GesturePinchEnd:
2203 current_gesture_location_ = WebPoint(x, y);
2204 event.x = current_gesture_location_.x;
2205 event.y = current_gesture_location_.y;
2206 break;
2207 case WebInputEvent::GesturePinchUpdate:
2208 {
2209 float scale = 1;
2210 if (!args->PeekNext().IsEmpty()) {
2211 if (!args->GetNext(&scale)) {
2212 args->ThrowError();
2213 return;
2214 }
2215 }
2216 event.data.pinchUpdate.scale = scale;
2217 current_gesture_location_ = WebPoint(x, y);
2218 event.x = current_gesture_location_.x;
2219 event.y = current_gesture_location_.y;
2220 break;
2221 }
[email protected]4c07a712014-08-21 17:05:542222 case WebInputEvent::GestureTap:
[email protected]c278d7532014-07-31 19:51:452223 {
2224 float tap_count = 1;
2225 float width = 30;
2226 float height = 30;
[email protected]3db130e2014-03-27 08:14:482227 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482228 if (!args->GetNext(&tap_count)) {
2229 args->ThrowError();
2230 return;
2231 }
[email protected]3db130e2014-03-27 08:14:482232 }
[email protected]cc42ccf2014-06-27 21:31:432233 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432234 if (!args->GetNext(&width)) {
2235 args->ThrowError();
2236 return;
2237 }
[email protected]cc42ccf2014-06-27 21:31:432238 }
2239 if (!args->PeekNext().IsEmpty()) {
[email protected]cc42ccf2014-06-27 21:31:432240 if (!args->GetNext(&height)) {
2241 args->ThrowError();
2242 return;
2243 }
[email protected]cc42ccf2014-06-27 21:31:432244 }
[email protected]c278d7532014-07-31 19:51:452245 event.data.tap.tapCount = tap_count;
2246 event.data.tap.width = width;
2247 event.data.tap.height = height;
mustaq0fff7fc32014-09-24 20:21:432248 event.x = x;
2249 event.y = y;
[email protected]3db130e2014-03-27 08:14:482250 break;
[email protected]c278d7532014-07-31 19:51:452251 }
[email protected]3db130e2014-03-27 08:14:482252 case WebInputEvent::GestureTapUnconfirmed:
2253 if (!args->PeekNext().IsEmpty()) {
2254 float tap_count;
2255 if (!args->GetNext(&tap_count)) {
2256 args->ThrowError();
2257 return;
2258 }
2259 event.data.tap.tapCount = tap_count;
2260 } else {
2261 event.data.tap.tapCount = 1;
2262 }
mustaq0fff7fc32014-09-24 20:21:432263 event.x = x;
2264 event.y = y;
[email protected]3db130e2014-03-27 08:14:482265 break;
2266 case WebInputEvent::GestureTapDown:
[email protected]c278d7532014-07-31 19:51:452267 {
2268 float width = 30;
2269 float height = 30;
[email protected]3db130e2014-03-27 08:14:482270 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482271 if (!args->GetNext(&width)) {
2272 args->ThrowError();
2273 return;
2274 }
[email protected]3db130e2014-03-27 08:14:482275 }
2276 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482277 if (!args->GetNext(&height)) {
2278 args->ThrowError();
2279 return;
2280 }
[email protected]3db130e2014-03-27 08:14:482281 }
mustaq0fff7fc32014-09-24 20:21:432282 event.x = x;
2283 event.y = y;
[email protected]c278d7532014-07-31 19:51:452284 event.data.tapDown.width = width;
2285 event.data.tapDown.height = height;
2286 break;
2287 }
2288 case WebInputEvent::GestureShowPress:
2289 {
2290 float width = 30;
2291 float height = 30;
[email protected]3db130e2014-03-27 08:14:482292 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482293 if (!args->GetNext(&width)) {
2294 args->ThrowError();
2295 return;
2296 }
[email protected]3db130e2014-03-27 08:14:482297 if (!args->PeekNext().IsEmpty()) {
[email protected]3db130e2014-03-27 08:14:482298 if (!args->GetNext(&height)) {
2299 args->ThrowError();
2300 return;
2301 }
[email protected]3db130e2014-03-27 08:14:482302 }
2303 }
mustaq0fff7fc32014-09-24 20:21:432304 event.x = x;
2305 event.y = y;
[email protected]c278d7532014-07-31 19:51:452306 event.data.showPress.width = width;
2307 event.data.showPress.height = height;
[email protected]3db130e2014-03-27 08:14:482308 break;
[email protected]c278d7532014-07-31 19:51:452309 }
[email protected]3db130e2014-03-27 08:14:482310 case WebInputEvent::GestureTapCancel:
mustaq0fff7fc32014-09-24 20:21:432311 event.x = x;
2312 event.y = y;
[email protected]3db130e2014-03-27 08:14:482313 break;
2314 case WebInputEvent::GestureLongPress:
mustaq0fff7fc32014-09-24 20:21:432315 event.x = x;
2316 event.y = y;
[email protected]3db130e2014-03-27 08:14:482317 if (!args->PeekNext().IsEmpty()) {
2318 float width;
2319 if (!args->GetNext(&width)) {
2320 args->ThrowError();
2321 return;
2322 }
2323 event.data.longPress.width = width;
2324 if (!args->PeekNext().IsEmpty()) {
2325 float height;
2326 if (!args->GetNext(&height)) {
2327 args->ThrowError();
2328 return;
2329 }
2330 event.data.longPress.height = height;
2331 }
2332 }
2333 break;
2334 case WebInputEvent::GestureLongTap:
mustaq0fff7fc32014-09-24 20:21:432335 event.x = x;
2336 event.y = y;
[email protected]3db130e2014-03-27 08:14:482337 if (!args->PeekNext().IsEmpty()) {
2338 float width;
2339 if (!args->GetNext(&width)) {
2340 args->ThrowError();
2341 return;
2342 }
2343 event.data.longPress.width = width;
2344 if (!args->PeekNext().IsEmpty()) {
2345 float height;
2346 if (!args->GetNext(&height)) {
2347 args->ThrowError();
2348 return;
2349 }
2350 event.data.longPress.height = height;
2351 }
2352 }
2353 break;
2354 case WebInputEvent::GestureTwoFingerTap:
mustaq0fff7fc32014-09-24 20:21:432355 event.x = x;
2356 event.y = y;
[email protected]3db130e2014-03-27 08:14:482357 if (!args->PeekNext().IsEmpty()) {
2358 float first_finger_width;
2359 if (!args->GetNext(&first_finger_width)) {
2360 args->ThrowError();
2361 return;
2362 }
2363 event.data.twoFingerTap.firstFingerWidth = first_finger_width;
2364 if (!args->PeekNext().IsEmpty()) {
2365 float first_finger_height;
2366 if (!args->GetNext(&first_finger_height)) {
2367 args->ThrowError();
2368 return;
2369 }
2370 event.data.twoFingerTap.firstFingerHeight = first_finger_height;
2371 }
2372 }
2373 break;
2374 default:
2375 NOTREACHED();
2376 }
2377
2378 event.globalX = event.x;
2379 event.globalY = event.y;
2380 event.timeStampSeconds = GetCurrentEventTimeSec();
2381
2382 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:252383 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482384
dtapuska5d2e9c32015-12-03 16:39:492385 WebInputEventResult result = HandleInputEventOnViewOrPopup(event);
[email protected]3db130e2014-03-27 08:14:482386
2387 // Long press might start a drag drop session. Complete it if so.
2388 if (type == WebInputEvent::GestureLongPress && !current_drag_data_.isNull()) {
2389 WebMouseEvent mouse_event;
2390 InitMouseEvent(WebInputEvent::MouseDown,
2391 pressed_button_,
mustaq21aed4e2015-12-15 21:47:212392 current_buttons_,
mustaq0fff7fc32014-09-24 20:21:432393 WebPoint(x, y),
[email protected]3db130e2014-03-27 08:14:482394 GetCurrentEventTimeSec(),
2395 click_count_,
mustaq21aed4e2015-12-15 21:47:212396 modifiers_,
[email protected]3db130e2014-03-27 08:14:482397 &mouse_event);
2398
2399 FinishDragAndDrop(mouse_event, blink::WebDragOperationNone);
2400 }
dtapuska5d2e9c32015-12-03 16:39:492401 args->Return(result != WebInputEventResult::NotHandled);
[email protected]3db130e2014-03-27 08:14:482402}
2403
2404void EventSender::UpdateClickCountForButton(
2405 WebMouseEvent::Button button_type) {
2406 if ((GetCurrentEventTimeSec() - last_click_time_sec_ <
2407 kMultipleClickTimeSec) &&
2408 (!OutsideMultiClickRadius(last_mouse_pos_, last_click_pos_)) &&
2409 (button_type == last_button_type_)) {
2410 ++click_count_;
2411 } else {
2412 click_count_ = 1;
2413 last_button_type_ = button_type;
2414 }
2415}
2416
2417void EventSender::InitMouseWheelEvent(gin::Arguments* args,
2418 bool continuous,
2419 WebMouseWheelEvent* event) {
2420 // Force a layout here just to make sure every position has been
2421 // determined before we send events (as well as all the other methods
2422 // that send an event do).
2423 if (force_layout_on_events_)
wkorman7265db012015-11-03 04:08:252424 view_->updateAllLifecyclePhases();
[email protected]3db130e2014-03-27 08:14:482425
2426 double horizontal;
2427 if (!args->GetNext(&horizontal)) {
2428 args->ThrowError();
2429 return;
2430 }
2431 double vertical;
2432 if (!args->GetNext(&vertical)) {
2433 args->ThrowError();
2434 return;
2435 }
2436
2437 bool paged = false;
2438 bool has_precise_scrolling_deltas = false;
2439 int modifiers = 0;
lanweia93644f2015-01-21 22:00:332440 bool can_scroll = true;
yutakf3990fd2014-12-23 03:52:382441 if (!args->PeekNext().IsEmpty()) {
2442 args->GetNext(&paged);
2443 if (!args->PeekNext().IsEmpty()) {
2444 args->GetNext(&has_precise_scrolling_deltas);
lanweia93644f2015-01-21 22:00:332445 if (!args->PeekNext().IsEmpty()) {
deepak.s750d68f2015-04-30 07:32:412446 v8::Local<v8::Value> value;
lanweia93644f2015-01-21 22:00:332447 args->GetNext(&value);
bashidbd2ef9bb2015-06-02 01:39:322448 modifiers = GetKeyModifiersFromV8(args->isolate(), value);
lanweia93644f2015-01-21 22:00:332449 if (!args->PeekNext().IsEmpty())
2450 args->GetNext(&can_scroll);
2451 }
yutakf3990fd2014-12-23 03:52:382452 }
2453 }
[email protected]3db130e2014-03-27 08:14:482454
2455 InitMouseEvent(WebInputEvent::MouseWheel,
2456 pressed_button_,
mustaq21aed4e2015-12-15 21:47:212457 current_buttons_,
[email protected]3db130e2014-03-27 08:14:482458 last_mouse_pos_,
2459 GetCurrentEventTimeSec(),
2460 click_count_,
2461 modifiers,
2462 event);
2463 event->wheelTicksX = static_cast<float>(horizontal);
2464 event->wheelTicksY = static_cast<float>(vertical);
2465 event->deltaX = event->wheelTicksX;
2466 event->deltaY = event->wheelTicksY;
2467 event->scrollByPage = paged;
2468 event->hasPreciseScrollingDeltas = has_precise_scrolling_deltas;
lanweia93644f2015-01-21 22:00:332469 event->canScroll = can_scroll;
[email protected]3db130e2014-03-27 08:14:482470 if (continuous) {
2471 event->wheelTicksX /= kScrollbarPixelsPerTick;
2472 event->wheelTicksY /= kScrollbarPixelsPerTick;
2473 } else {
2474 event->deltaX *= kScrollbarPixelsPerTick;
2475 event->deltaY *= kScrollbarPixelsPerTick;
2476 }
2477}
2478
e.hakkinen80033922015-07-31 08:41:352479// Radius fields radius_x and radius_y should eventually be moved to
2480// WebPointerProperties.
2481// TODO(e_hakkinen): Drop radius_{x,y}_pointer parameters once that happens.
2482void EventSender::InitPointerProperties(gin::Arguments* args,
2483 blink::WebPointerProperties* e,
2484 float* radius_x_pointer,
2485 float* radius_y_pointer) {
2486 if (!args->PeekNext().IsEmpty()) {
2487 double radius_x;
2488 if (!args->GetNext(&radius_x)) {
2489 args->ThrowError();
2490 return;
2491 }
2492
2493 double radius_y = radius_x;
2494 if (!args->PeekNext().IsEmpty()) {
2495 if (!args->GetNext(&radius_y)) {
2496 args->ThrowError();
2497 return;
2498 }
2499 }
2500
2501 *radius_x_pointer = static_cast<float>(radius_x);
2502 *radius_y_pointer = static_cast<float>(radius_y);
2503 }
2504
2505 if (!args->PeekNext().IsEmpty()) {
2506 double force;
2507 if (!args->GetNext(&force)) {
2508 args->ThrowError();
2509 return;
2510 }
2511 e->force = static_cast<float>(force);
2512 }
2513
2514 if (!args->PeekNext().IsEmpty()) {
2515 int tiltX, tiltY;
2516 if (!args->GetNext(&tiltX) || !args->GetNext(&tiltY)) {
2517 args->ThrowError();
2518 return;
2519 }
2520 e->tiltX = tiltX;
2521 e->tiltY = tiltY;
2522 }
2523
2524 if (!args->PeekNext().IsEmpty()) {
2525 std::string pointer_type_string;
2526 if (!args->GetNext(&pointer_type_string)) {
2527 args->ThrowError();
2528 return;
2529 }
2530 if (pointer_type_string == kPointerTypeStringUnknown) {
mustaq496d6f3c2015-10-08 16:17:192531 e->pointerType = WebMouseEvent::PointerType::Unknown;
e.hakkinen80033922015-07-31 08:41:352532 } else if (pointer_type_string == kPointerTypeStringMouse) {
mustaq496d6f3c2015-10-08 16:17:192533 e->pointerType = WebMouseEvent::PointerType::Mouse;
e.hakkinen80033922015-07-31 08:41:352534 } else if (pointer_type_string == kPointerTypeStringPen) {
mustaq496d6f3c2015-10-08 16:17:192535 e->pointerType = WebMouseEvent::PointerType::Pen;
e.hakkinen80033922015-07-31 08:41:352536 } else if (pointer_type_string == kPointerTypeStringTouch) {
mustaq496d6f3c2015-10-08 16:17:192537 e->pointerType = WebMouseEvent::PointerType::Touch;
e.hakkinen80033922015-07-31 08:41:352538 } else {
2539 args->ThrowError();
2540 return;
2541 }
2542 }
2543}
2544
[email protected]3db130e2014-03-27 08:14:482545void EventSender::FinishDragAndDrop(const WebMouseEvent& e,
2546 blink::WebDragOperation drag_effect) {
2547 WebPoint client_point(e.x, e.y);
2548 WebPoint screen_point(e.globalX, e.globalY);
2549 current_drag_effect_ = drag_effect;
2550 if (current_drag_effect_) {
2551 // Specifically pass any keyboard modifiers to the drop method. This allows
2552 // tests to control the drop type (i.e. copy or move).
2553 view_->dragTargetDrop(client_point, screen_point, e.modifiers);
2554 } else {
2555 view_->dragTargetDragLeave();
2556 }
2557 view_->dragSourceEndedAt(client_point, screen_point, current_drag_effect_);
2558 view_->dragSourceSystemDragEnded();
2559
2560 current_drag_data_.reset();
2561}
2562
2563void EventSender::DoMouseUp(const WebMouseEvent& e) {
tkent588765612014-11-28 01:07:482564 HandleInputEventOnViewOrPopup(e);
[email protected]3db130e2014-03-27 08:14:482565
[email protected]3db130e2014-03-27 08:14:482566 last_click_time_sec_ = e.timeStampSeconds;
2567 last_click_pos_ = last_mouse_pos_;
2568
2569 // If we're in a drag operation, complete it.
2570 if (current_drag_data_.isNull())
2571 return;
2572
2573 WebPoint client_point(e.x, e.y);
2574 WebPoint screen_point(e.globalX, e.globalY);
2575 FinishDragAndDrop(
2576 e,
2577 view_->dragTargetDragOver(
jinho.banga7447af2015-03-11 04:56:582578 client_point,
2579 screen_point,
2580 current_drag_effects_allowed_,
2581 e.modifiers));
[email protected]3db130e2014-03-27 08:14:482582}
2583
2584void EventSender::DoMouseMove(const WebMouseEvent& e) {
2585 last_mouse_pos_ = WebPoint(e.x, e.y);
2586
tkent588765612014-11-28 01:07:482587 HandleInputEventOnViewOrPopup(e);
[email protected]3db130e2014-03-27 08:14:482588
2589 if (pressed_button_ == WebMouseEvent::ButtonNone ||
2590 current_drag_data_.isNull()) {
2591 return;
2592 }
2593
2594 WebPoint client_point(e.x, e.y);
2595 WebPoint screen_point(e.globalX, e.globalY);
2596 current_drag_effect_ = view_->dragTargetDragOver(
jinho.banga7447af2015-03-11 04:56:582597 client_point, screen_point, current_drag_effects_allowed_, e.modifiers);
[email protected]3db130e2014-03-27 08:14:482598}
2599
2600void EventSender::ReplaySavedEvents() {
2601 replaying_saved_events_ = true;
2602 while (!mouse_event_queue_.empty()) {
2603 SavedEvent e = mouse_event_queue_.front();
2604 mouse_event_queue_.pop_front();
2605
2606 switch (e.type) {
2607 case SavedEvent::TYPE_MOUSE_MOVE: {
2608 WebMouseEvent event;
2609 InitMouseEvent(WebInputEvent::MouseMove,
2610 pressed_button_,
mustaq21aed4e2015-12-15 21:47:212611 current_buttons_,
[email protected]3db130e2014-03-27 08:14:482612 e.pos,
2613 GetCurrentEventTimeSec(),
2614 click_count_,
2615 e.modifiers,
2616 &event);
2617 DoMouseMove(event);
2618 break;
2619 }
2620 case SavedEvent::TYPE_LEAP_FORWARD:
2621 DoLeapForward(e.milliseconds);
2622 break;
2623 case SavedEvent::TYPE_MOUSE_UP: {
mustaq21aed4e2015-12-15 21:47:212624 current_buttons_ &= ~GetWebMouseEventModifierForButton(e.button_type);
2625 pressed_button_ = WebMouseEvent::ButtonNone;
2626
[email protected]3db130e2014-03-27 08:14:482627 WebMouseEvent event;
2628 InitMouseEvent(WebInputEvent::MouseUp,
2629 e.button_type,
mustaq21aed4e2015-12-15 21:47:212630 current_buttons_,
[email protected]3db130e2014-03-27 08:14:482631 last_mouse_pos_,
2632 GetCurrentEventTimeSec(),
2633 click_count_,
2634 e.modifiers,
2635 &event);
2636 DoMouseUp(event);
2637 break;
2638 }
2639 default:
2640 NOTREACHED();
2641 }
2642 }
2643
2644 replaying_saved_events_ = false;
2645}
2646
dtapuska5d2e9c32015-12-03 16:39:492647WebInputEventResult EventSender::HandleInputEventOnViewOrPopup(
2648 const WebInputEvent& event) {
majidvpbfabb0712015-10-02 16:30:002649 last_event_timestamp_ = event.timeStampSeconds;
2650
tkent588765612014-11-28 01:07:482651 if (WebPagePopup* popup = view_->pagePopup()) {
2652 if (!WebInputEvent::isKeyboardEventType(event.type))
2653 return popup->handleInputEvent(event);
2654 }
2655 return view_->handleInputEvent(event);
2656}
2657
jochenf5f31752015-06-03 12:06:342658} // namespace test_runner