| 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 03add8b6f3149b2237f57b117529918ac1e6a448..c6b7acd11557b9ad1008252f98e39392d0ace581 100644
|
| --- a/content/browser/devtools/protocol/input_handler.cc
|
| +++ b/content/browser/devtools/protocol/input_handler.cc
|
| @@ -55,25 +55,36 @@ bool StringToGestureSourceType(Maybe<std::string> in,
|
| return false;
|
| }
|
|
|
| -void SetEventModifiers(blink::WebInputEvent* event, int modifiers) {
|
| +int GetEventModifiers(int modifiers, bool auto_repeat, bool is_keypad) {
|
| + int result = 0;
|
| + if (auto_repeat)
|
| + result |= blink::WebInputEvent::IsAutoRepeat;
|
| + if (is_keypad)
|
| + result |= blink::WebInputEvent::IsKeyPad;
|
| +
|
| if (modifiers & 1)
|
| - event->modifiers |= blink::WebInputEvent::AltKey;
|
| + result |= blink::WebInputEvent::AltKey;
|
| if (modifiers & 2)
|
| - event->modifiers |= blink::WebInputEvent::ControlKey;
|
| + result |= blink::WebInputEvent::ControlKey;
|
| if (modifiers & 4)
|
| - event->modifiers |= blink::WebInputEvent::MetaKey;
|
| + result |= blink::WebInputEvent::MetaKey;
|
| if (modifiers & 8)
|
| - event->modifiers |= blink::WebInputEvent::ShiftKey;
|
| + result |= blink::WebInputEvent::ShiftKey;
|
| + return result;
|
| }
|
|
|
| -void SetEventTimestamp(blink::WebInputEvent* event, Maybe<double> timestamp) {
|
| +base::TimeTicks GetEventTimeTicks(Maybe<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.isJust()
|
| - ? base::TimeDelta::FromSecondsD(timestamp.fromJust()) +
|
| - base::TimeTicks::UnixEpoch()
|
| - : base::TimeTicks::Now();
|
| - event->timeStampSeconds = (ticks - base::TimeTicks()).InSecondsF();
|
| + return timestamp.isJust()
|
| + ? base::TimeDelta::FromSecondsD(timestamp.fromJust()) +
|
| + base::TimeTicks::UnixEpoch()
|
| + : base::TimeTicks::Now();
|
| +}
|
| +
|
| +double GetEventTimestamp(Maybe<double> timestamp) {
|
| + return (GetEventTimeTicks(std::move(timestamp)) - base::TimeTicks())
|
| + .InSecondsF();
|
| }
|
|
|
| bool SetKeyboardEventText(blink::WebUChar* to, Maybe<std::string> from) {
|
| @@ -89,39 +100,37 @@ bool SetKeyboardEventText(blink::WebUChar* to, Maybe<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.empty())
|
| return true;
|
|
|
| if (button == Input::DispatchMouseEvent::ButtonEnum::None) {
|
| - event->button = blink::WebMouseEvent::Button::NoButton;
|
| + *event_button = blink::WebMouseEvent::Button::NoButton;
|
| } else if (button == Input::DispatchMouseEvent::ButtonEnum::Left) {
|
| - 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 == Input::DispatchMouseEvent::ButtonEnum::Middle) {
|
| - 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 == Input::DispatchMouseEvent::ButtonEnum::Right) {
|
| - 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 == Input::DispatchMouseEvent::TypeEnum::MousePressed) {
|
| - event->type = blink::WebInputEvent::MouseDown;
|
| - } else if (type == Input::DispatchMouseEvent::TypeEnum::MouseReleased) {
|
| - event->type = blink::WebInputEvent::MouseUp;
|
| - } else if (type == Input::DispatchMouseEvent::TypeEnum::MouseMoved) {
|
| - event->type = blink::WebInputEvent::MouseMove;
|
| - } else {
|
| - return false;
|
| - }
|
| - return true;
|
| +blink::WebInputEvent::Type GetMouseEventType(const std::string& type) {
|
| + if (type == Input::DispatchMouseEvent::TypeEnum::MousePressed)
|
| + return blink::WebInputEvent::MouseDown;
|
| + if (type == Input::DispatchMouseEvent::TypeEnum::MouseReleased)
|
| + return blink::WebInputEvent::MouseUp;
|
| + if (type == Input::DispatchMouseEvent::TypeEnum::MouseMoved)
|
| + return blink::WebInputEvent::MouseMove;
|
| + return blink::WebInputEvent::Undefined;
|
| }
|
|
|
| void SendSynthesizePinchGestureResponse(
|
| @@ -229,24 +238,28 @@ Response InputHandler::DispatchKeyEvent(
|
| Maybe<bool> auto_repeat,
|
| Maybe<bool> is_keypad,
|
| Maybe<bool> is_system_key) {
|
| - NativeWebKeyboardEvent event;
|
| - event.skip_in_browser = true;
|
| + blink::WebInputEvent::Type web_event_type;
|
|
|
| if (type == Input::DispatchKeyEvent::TypeEnum::KeyDown) {
|
| - event.type = blink::WebInputEvent::KeyDown;
|
| + web_event_type = blink::WebInputEvent::KeyDown;
|
| } else if (type == Input::DispatchKeyEvent::TypeEnum::KeyUp) {
|
| - event.type = blink::WebInputEvent::KeyUp;
|
| + web_event_type = blink::WebInputEvent::KeyUp;
|
| } else if (type == Input::DispatchKeyEvent::TypeEnum::Char) {
|
| - event.type = blink::WebInputEvent::Char;
|
| + web_event_type = blink::WebInputEvent::Char;
|
| } else if (type == Input::DispatchKeyEvent::TypeEnum::RawKeyDown) {
|
| - 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.fromMaybe(0));
|
| - SetEventTimestamp(&event, std::move(timestamp));
|
| + NativeWebKeyboardEvent event(
|
| + web_event_type,
|
| + GetEventModifiers(modifiers.fromMaybe(blink::WebInputEvent::NoModifiers),
|
| + auto_repeat.fromMaybe(false),
|
| + is_keypad.fromMaybe(false)),
|
| + GetEventTimeTicks(std::move(timestamp)));
|
| + event.skip_in_browser = true;
|
| if (!SetKeyboardEventText(event.text, std::move(text)))
|
| return Response::InvalidParams("Invalid 'text' parameter");
|
| if (!SetKeyboardEventText(event.unmodifiedText, std::move(unmodified_text)))
|
| @@ -256,10 +269,6 @@ Response InputHandler::DispatchKeyEvent(
|
| event.windowsKeyCode = windows_virtual_key_code.fromJust();
|
| if (native_virtual_key_code.isJust())
|
| event.nativeKeyCode = native_virtual_key_code.fromJust();
|
| - if (auto_repeat.fromMaybe(false))
|
| - event.modifiers |= blink::WebInputEvent::IsAutoRepeat;
|
| - if (is_keypad.fromMaybe(false))
|
| - event.modifiers |= blink::WebInputEvent::IsKeyPad;
|
| if (is_system_key.isJust())
|
| event.isSystemKey = is_system_key.fromJust();
|
|
|
| @@ -289,17 +298,26 @@ Response InputHandler::DispatchMouseEvent(
|
| Maybe<double> timestamp,
|
| Maybe<std::string> button,
|
| Maybe<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.fromMaybe(0));
|
| - SetEventTimestamp(&event, std::move(timestamp));
|
| - if (!SetMouseEventButton(&event, button.fromMaybe("")))
|
| + blink::WebPointerProperties::Button event_button =
|
| + blink::WebPointerProperties::Button::NoButton;
|
| + int button_modifiers = 0;
|
| + if (!GetMouseEventButton(button.fromMaybe(""), &event_button,
|
| + &button_modifiers))
|
| return Response::InvalidParams("Invalid mouse button");
|
|
|
| + blink::WebMouseEvent event(
|
| + event_type,
|
| + GetEventModifiers(modifiers.fromMaybe(blink::WebInputEvent::NoModifiers),
|
| + false, false) |
|
| + button_modifiers,
|
| + GetEventTimestamp(std::move(timestamp)));
|
| +
|
| + event.button = event_button;
|
| event.x = x * page_scale_factor_;
|
| event.y = y * page_scale_factor_;
|
| event.windowX = x * page_scale_factor_;
|
| @@ -326,45 +344,68 @@ Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type,
|
| Maybe<double> delta_y,
|
| Maybe<int> modifiers,
|
| Maybe<int> click_count) {
|
| - blink::WebMouseWheelEvent wheel_event;
|
| - blink::WebMouseEvent mouse_event;
|
| - blink::WebMouseEvent* event = &mouse_event;
|
| -
|
| + blink::WebInputEvent::Type event_type;
|
| if (type == Input::EmulateTouchFromMouseEvent::TypeEnum::MouseWheel) {
|
| + event_type = blink::WebInputEvent::MouseWheel;
|
| if (!delta_x.isJust() || !delta_y.isJust()) {
|
| return Response::InvalidParams(
|
| "'deltaX' and 'deltaY' are expected for mouseWheel event");
|
| }
|
| - wheel_event.deltaX = static_cast<float>(delta_x.fromJust());
|
| - wheel_event.deltaY = static_cast<float>(delta_y.fromJust());
|
| - 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.fromMaybe(0));
|
| - SetEventTimestamp(event, Maybe<double>(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");
|
|
|
| - event->x = x;
|
| - event->y = y;
|
| - event->windowX = x;
|
| - event->windowY = y;
|
| - event->globalX = x;
|
| - event->globalY = y;
|
| - event->clickCount = click_count.fromMaybe(0);
|
| - event->pointerType = blink::WebPointerProperties::PointerType::Touch;
|
| + ui::ScopedWebInputEvent event;
|
| + blink::WebMouseWheelEvent* wheel_event = nullptr;
|
| + blink::WebMouseEvent* mouse_event = nullptr;
|
| + if (type == Input::EmulateTouchFromMouseEvent::TypeEnum::MouseWheel) {
|
| + wheel_event = new blink::WebMouseWheelEvent(
|
| + event_type, GetEventModifiers(
|
| + modifiers.fromMaybe(blink::WebInputEvent::NoModifiers),
|
| + false, false) |
|
| + button_modifiers,
|
| + GetEventTimestamp(timestamp));
|
| + mouse_event = wheel_event;
|
| + event.reset(wheel_event);
|
| + wheel_event->deltaX = static_cast<float>(delta_x.fromJust());
|
| + wheel_event->deltaY = static_cast<float>(delta_y.fromJust());
|
| + } else {
|
| + mouse_event = new blink::WebMouseEvent(
|
| + event_type, GetEventModifiers(
|
| + modifiers.fromMaybe(blink::WebInputEvent::NoModifiers),
|
| + false, false) |
|
| + button_modifiers,
|
| + GetEventTimestamp(timestamp));
|
| + 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.fromMaybe(0);
|
| + mouse_event->pointerType = blink::WebPointerProperties::PointerType::Touch;
|
|
|
| if (!host_ || !host_->GetRenderWidgetHost())
|
| return Response::InternalError();
|
|
|
| - if (event->type == blink::WebInputEvent::MouseWheel)
|
| - host_->GetRenderWidgetHost()->ForwardWheelEvent(wheel_event);
|
| + if (wheel_event)
|
| + host_->GetRenderWidgetHost()->ForwardWheelEvent(*wheel_event);
|
| else
|
| - host_->GetRenderWidgetHost()->ForwardMouseEvent(mouse_event);
|
| + host_->GetRenderWidgetHost()->ForwardMouseEvent(*mouse_event);
|
| return Response::OK();
|
| }
|
|
|
|
|