Index: content/browser/devtools/protocol/input_handler.cc |
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc |
index b963044209c287436628372f8df442313c35867a..451f29d5084392446001e56707cbdd2376f27b78 100644 |
--- a/content/browser/devtools/protocol/input_handler.cc |
+++ b/content/browser/devtools/protocol/input_handler.cc |
@@ -55,27 +55,39 @@ typedef DevToolsProtocolClient::Response Response; |
namespace { |
-void SetEventModifiers(blink::WebInputEvent* event, const int* modifiers) { |
- if (!modifiers) |
- return; |
- if (*modifiers & 1) |
- event->modifiers |= blink::WebInputEvent::AltKey; |
- if (*modifiers & 2) |
- event->modifiers |= blink::WebInputEvent::ControlKey; |
- if (*modifiers & 4) |
- event->modifiers |= blink::WebInputEvent::MetaKey; |
- if (*modifiers & 8) |
- event->modifiers |= blink::WebInputEvent::ShiftKey; |
+int GetEventModifiers(const int* modifiers, |
+ const bool* auto_repeat, |
+ const bool* is_keypad) { |
+ int result = 0; |
+ if (auto_repeat && *auto_repeat) |
+ result |= blink::WebInputEvent::IsAutoRepeat; |
+ if (is_keypad && *is_keypad) |
+ result |= blink::WebInputEvent::IsKeyPad; |
+ |
+ if (modifiers) { |
+ if (*modifiers & 1) |
+ result |= blink::WebInputEvent::AltKey; |
+ if (*modifiers & 2) |
+ result |= blink::WebInputEvent::ControlKey; |
+ if (*modifiers & 4) |
+ result |= blink::WebInputEvent::MetaKey; |
+ if (*modifiers & 8) |
+ result |= blink::WebInputEvent::ShiftKey; |
+ } |
+ return result; |
} |
-void SetEventTimestamp(blink::WebInputEvent* event, const double* timestamp) { |
+base::TimeTicks GetEventTimeTicks(const double* timestamp) { |
// Convert timestamp, in seconds since unix epoch, to an event timestamp |
// which is time ticks since platform start time. |
- base::TimeTicks ticks = timestamp |
- ? base::TimeDelta::FromSecondsD(*timestamp) + |
- base::TimeTicks::UnixEpoch() |
- : base::TimeTicks::Now(); |
- event->timeStampSeconds = (ticks - base::TimeTicks()).InSecondsF(); |
+ return timestamp |
+ ? base::TimeDelta::FromSecondsD(*timestamp) + |
+ base::TimeTicks::UnixEpoch() |
+ : base::TimeTicks::Now(); |
+} |
+ |
+double GetEventTimestamp(const double* timestamp) { |
+ return (GetEventTimeTicks(timestamp) - base::TimeTicks()).InSecondsF(); |
} |
bool SetKeyboardEventText(blink::WebUChar* to, const std::string* from) { |
@@ -91,39 +103,37 @@ bool SetKeyboardEventText(blink::WebUChar* to, const std::string* from) { |
return true; |
} |
-bool SetMouseEventButton(blink::WebMouseEvent* event, |
- const std::string* button) { |
+bool GetMouseEventButton(const std::string* button, |
+ blink::WebPointerProperties::Button* event_button, |
+ int* event_modifiers) { |
if (!button) |
return true; |
if (*button == dispatch_mouse_event::kButtonNone) { |
- event->button = blink::WebMouseEvent::Button::NoButton; |
+ *event_button = blink::WebMouseEvent::Button::NoButton; |
} else if (*button == dispatch_mouse_event::kButtonLeft) { |
- event->button = blink::WebMouseEvent::Button::Left; |
- event->modifiers |= blink::WebInputEvent::LeftButtonDown; |
+ *event_button = blink::WebMouseEvent::Button::Left; |
+ *event_modifiers = blink::WebInputEvent::LeftButtonDown; |
} else if (*button == dispatch_mouse_event::kButtonMiddle) { |
- event->button = blink::WebMouseEvent::Button::Middle; |
- event->modifiers |= blink::WebInputEvent::MiddleButtonDown; |
+ *event_button = blink::WebMouseEvent::Button::Middle; |
+ *event_modifiers = blink::WebInputEvent::MiddleButtonDown; |
} else if (*button == dispatch_mouse_event::kButtonRight) { |
- event->button = blink::WebMouseEvent::Button::Right; |
- event->modifiers |= blink::WebInputEvent::RightButtonDown; |
+ *event_button = blink::WebMouseEvent::Button::Right; |
+ *event_modifiers = blink::WebInputEvent::RightButtonDown; |
} else { |
return false; |
} |
return true; |
} |
-bool SetMouseEventType(blink::WebMouseEvent* event, const std::string& type) { |
- if (type == dispatch_mouse_event::kTypeMousePressed) { |
- event->type = blink::WebInputEvent::MouseDown; |
- } else if (type == dispatch_mouse_event::kTypeMouseReleased) { |
- event->type = blink::WebInputEvent::MouseUp; |
- } else if (type == dispatch_mouse_event::kTypeMouseMoved) { |
- event->type = blink::WebInputEvent::MouseMove; |
- } else { |
- return false; |
- } |
- return true; |
+blink::WebInputEvent::Type GetMouseEventType(const std::string& type) { |
+ if (type == dispatch_mouse_event::kTypeMousePressed) |
+ return blink::WebInputEvent::MouseDown; |
+ if (type == dispatch_mouse_event::kTypeMouseReleased) |
+ return blink::WebInputEvent::MouseUp; |
+ if (type == dispatch_mouse_event::kTypeMouseMoved) |
+ return blink::WebInputEvent::MouseMove; |
+ return blink::WebInputEvent::Undefined; |
} |
} // namespace |
@@ -165,24 +175,24 @@ Response InputHandler::DispatchKeyEvent( |
const bool* auto_repeat, |
const bool* is_keypad, |
const bool* is_system_key) { |
- NativeWebKeyboardEvent event; |
- event.skip_in_browser = true; |
- |
+ blink::WebInputEvent::Type web_event_type = blink::WebInputEvent::Undefined; |
if (type == dispatch_key_event::kTypeKeyDown) { |
- event.type = blink::WebInputEvent::KeyDown; |
+ web_event_type = blink::WebInputEvent::KeyDown; |
} else if (type == dispatch_key_event::kTypeKeyUp) { |
- event.type = blink::WebInputEvent::KeyUp; |
+ web_event_type = blink::WebInputEvent::KeyUp; |
} else if (type == dispatch_key_event::kTypeChar) { |
- event.type = blink::WebInputEvent::Char; |
+ web_event_type = blink::WebInputEvent::Char; |
} else if (type == dispatch_key_event::kTypeRawKeyDown) { |
- event.type = blink::WebInputEvent::RawKeyDown; |
+ web_event_type = blink::WebInputEvent::RawKeyDown; |
} else { |
return Response::InvalidParams( |
base::StringPrintf("Unexpected event type '%s'", type.c_str())); |
} |
- SetEventModifiers(&event, modifiers); |
- SetEventTimestamp(&event, timestamp); |
+ NativeWebKeyboardEvent event( |
+ web_event_type, GetEventModifiers(modifiers, auto_repeat, is_keypad), |
+ GetEventTimeTicks(timestamp)); |
+ event.skip_in_browser = true; |
if (!SetKeyboardEventText(event.text, text)) |
return Response::InvalidParams("Invalid 'text' parameter"); |
if (!SetKeyboardEventText(event.unmodifiedText, unmodified_text)) |
@@ -192,10 +202,6 @@ Response InputHandler::DispatchKeyEvent( |
event.windowsKeyCode = *windows_virtual_key_code; |
if (native_virtual_key_code) |
event.nativeKeyCode = *native_virtual_key_code; |
- if (auto_repeat && *auto_repeat) |
- event.modifiers |= blink::WebInputEvent::IsAutoRepeat; |
- if (is_keypad && *is_keypad) |
- event.modifiers |= blink::WebInputEvent::IsKeyPad; |
if (is_system_key) |
event.isSystemKey = *is_system_key; |
@@ -225,17 +231,23 @@ Response InputHandler::DispatchMouseEvent( |
const double* timestamp, |
const std::string* button, |
const int* click_count) { |
- blink::WebMouseEvent event; |
- |
- if (!SetMouseEventType(&event, type)) { |
+ blink::WebInputEvent::Type event_type = GetMouseEventType(type); |
+ if (event_type == blink::WebInputEvent::Undefined) { |
return Response::InvalidParams( |
base::StringPrintf("Unexpected event type '%s'", type.c_str())); |
} |
- SetEventModifiers(&event, modifiers); |
- SetEventTimestamp(&event, timestamp); |
- if (!SetMouseEventButton(&event, button)) |
+ blink::WebPointerProperties::Button event_button = |
+ blink::WebPointerProperties::Button::NoButton; |
+ int button_modifiers = 0; |
+ if (!GetMouseEventButton(button, &event_button, &button_modifiers)) |
return Response::InvalidParams("Invalid mouse button"); |
+ blink::WebMouseEvent event( |
+ event_type, |
+ GetEventModifiers(modifiers, nullptr, nullptr) | button_modifiers, |
+ GetEventTimestamp(timestamp)); |
+ |
+ event.button = event_button; |
event.x = x * page_scale_factor_; |
event.y = y * page_scale_factor_; |
event.windowX = x * page_scale_factor_; |
@@ -262,45 +274,64 @@ Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type, |
double* delta_y, |
int* modifiers, |
int* click_count) { |
- blink::WebMouseWheelEvent wheel_event; |
- blink::WebMouseEvent mouse_event; |
- blink::WebMouseEvent* event = &mouse_event; |
- |
+ blink::WebInputEvent::Type event_type; |
if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) { |
+ event_type = blink::WebInputEvent::MouseWheel; |
if (!delta_x || !delta_y) { |
return Response::InvalidParams( |
"'deltaX' and 'deltaY' are expected for mouseWheel event"); |
} |
- wheel_event.deltaX = static_cast<float>(*delta_x); |
- wheel_event.deltaY = static_cast<float>(*delta_y); |
- event = &wheel_event; |
- event->type = blink::WebInputEvent::MouseWheel; |
- } else if (!SetMouseEventType(event, type)) { |
- return Response::InvalidParams( |
- base::StringPrintf("Unexpected event type '%s'", type.c_str())); |
+ } else { |
+ event_type = GetMouseEventType(type); |
+ if (event_type == blink::WebInputEvent::Undefined) { |
+ return Response::InvalidParams( |
+ base::StringPrintf("Unexpected event type '%s'", type.c_str())); |
+ } |
} |
- SetEventModifiers(event, modifiers); |
- SetEventTimestamp(event, ×tamp); |
- if (!SetMouseEventButton(event, &button)) |
+ blink::WebPointerProperties::Button event_button = |
+ blink::WebPointerProperties::Button::NoButton; |
+ int button_modifiers = 0; |
+ if (!GetMouseEventButton(&button, &event_button, &button_modifiers)) |
return Response::InvalidParams("Invalid mouse button"); |
- event->x = x; |
- event->y = y; |
- event->windowX = x; |
- event->windowY = y; |
- event->globalX = x; |
- event->globalY = y; |
- event->clickCount = click_count ? *click_count : 0; |
- event->pointerType = blink::WebPointerProperties::PointerType::Touch; |
+ ui::ScopedWebInputEvent event; |
+ blink::WebMouseWheelEvent* wheel_event = nullptr; |
+ blink::WebMouseEvent* mouse_event = nullptr; |
+ if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) { |
+ wheel_event = new blink::WebMouseWheelEvent( |
+ event_type, |
+ GetEventModifiers(modifiers, nullptr, nullptr) | button_modifiers, |
+ GetEventTimestamp(×tamp)); |
+ mouse_event = wheel_event; |
+ event.reset(wheel_event); |
+ wheel_event->deltaX = static_cast<float>(*delta_x); |
+ wheel_event->deltaY = static_cast<float>(*delta_y); |
+ } else { |
+ mouse_event = new blink::WebMouseEvent( |
+ event_type, |
+ GetEventModifiers(modifiers, nullptr, nullptr) | button_modifiers, |
+ GetEventTimestamp(×tamp)); |
+ event.reset(mouse_event); |
+ } |
+ |
+ mouse_event->x = x; |
+ mouse_event->y = y; |
+ mouse_event->button = event_button; |
+ mouse_event->windowX = x; |
+ mouse_event->windowY = y; |
+ mouse_event->globalX = x; |
+ mouse_event->globalY = y; |
+ mouse_event->clickCount = click_count ? *click_count : 0; |
+ mouse_event->pointerType = blink::WebPointerProperties::PointerType::Touch; |
if (!host_) |
return Response::ServerError("Could not connect to view"); |
- if (event->type == blink::WebInputEvent::MouseWheel) |
- host_->ForwardWheelEvent(wheel_event); |
+ if (wheel_event) |
+ host_->ForwardWheelEvent(*wheel_event); |
else |
- host_->ForwardMouseEvent(mouse_event); |
+ host_->ForwardMouseEvent(*mouse_event); |
return Response::OK(); |
} |