| 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 b8d6fbd1d18c4797a8150534232f2f7a513a9193..77b32b9147c05a68dc43e24a19ddb3553ad444e5 100644
|
| --- a/content/browser/devtools/protocol/input_handler.cc
|
| +++ b/content/browser/devtools/protocol/input_handler.cc
|
| @@ -5,8 +5,10 @@
|
| #include "content/browser/devtools/protocol/input_handler.h"
|
|
|
| #include "base/strings/stringprintf.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| #include "content/browser/renderer_host/render_view_host_impl.h"
|
| #include "third_party/WebKit/public/web/WebInputEvent.h"
|
| +#include "ui/events/keycodes/dom4/keycode_converter.h"
|
|
|
| namespace content {
|
| namespace devtools {
|
| @@ -14,6 +16,76 @@ namespace input {
|
|
|
| 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;
|
| +}
|
| +
|
| +void SetEventTimestamp(blink::WebInputEvent* event, const double* timestamp) {
|
| + event->timeStampSeconds =
|
| + timestamp ? *timestamp : base::Time::Now().ToDoubleT();
|
| +}
|
| +
|
| +bool SetKeyboardEventText(blink::WebUChar* to, const std::string* from) {
|
| + if (!from)
|
| + return true;
|
| +
|
| + base::string16 text16 = base::UTF8ToUTF16(*from);
|
| + if (text16.size() > blink::WebKeyboardEvent::textLengthCap)
|
| + return false;
|
| +
|
| + for (size_t i = 0; i < text16.size(); ++i)
|
| + to[i] = text16[i];
|
| + return true;
|
| +}
|
| +
|
| +bool SetMouseEventButton(blink::WebMouseEvent* event,
|
| + const std::string* button) {
|
| + if (!button)
|
| + return true;
|
| +
|
| + if (*button == dispatch_mouse_event::kButtonNone) {
|
| + event->button = blink::WebMouseEvent::ButtonNone;
|
| + } else if (*button == dispatch_mouse_event::kButtonLeft) {
|
| + event->button = blink::WebMouseEvent::ButtonLeft;
|
| + event->modifiers |= blink::WebInputEvent::LeftButtonDown;
|
| + } else if (*button == dispatch_mouse_event::kButtonMiddle) {
|
| + event->button = blink::WebMouseEvent::ButtonMiddle;
|
| + event->modifiers |= blink::WebInputEvent::MiddleButtonDown;
|
| + } else if (*button == dispatch_mouse_event::kButtonRight) {
|
| + event->button = blink::WebMouseEvent::ButtonRight;
|
| + 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;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| InputHandler::InputHandler()
|
| : host_(NULL) {
|
| }
|
| @@ -41,7 +113,60 @@ Response InputHandler::DispatchKeyEvent(
|
| const bool* auto_repeat,
|
| const bool* is_keypad,
|
| const bool* is_system_key) {
|
| - return Response::FallThrough();
|
| + NativeWebKeyboardEvent event;
|
| +
|
| + if (type == dispatch_key_event::kTypeKeyDown) {
|
| + event.type = blink::WebInputEvent::KeyDown;
|
| + } else if (type == dispatch_key_event::kTypeKeyUp) {
|
| + event.type = blink::WebInputEvent::KeyUp;
|
| + } else if (type == dispatch_key_event::kTypeChar) {
|
| + event.type = blink::WebInputEvent::Char;
|
| + } else if (type == dispatch_key_event::kTypeRawKeyDown) {
|
| + event.type = blink::WebInputEvent::RawKeyDown;
|
| + } else {
|
| + return Response::InvalidParams(
|
| + base::StringPrintf("Unexpected event type '%s'", type.c_str()));
|
| + }
|
| +
|
| + SetEventModifiers(&event, modifiers);
|
| + SetEventTimestamp(&event, timestamp);
|
| + if (!SetKeyboardEventText(event.text, text))
|
| + return Response::InvalidParams("Invalid 'text' parameter");
|
| + if (!SetKeyboardEventText(event.unmodifiedText, unmodified_text))
|
| + return Response::InvalidParams("Invalid 'unmodifiedText' parameter");
|
| +
|
| + if (key_identifier) {
|
| + if (key_identifier->size() >
|
| + blink::WebKeyboardEvent::keyIdentifierLengthCap) {
|
| + return Response::InvalidParams("Invalid 'keyIdentifier' parameter");
|
| + }
|
| + for (size_t i = 0; i < key_identifier->size(); ++i)
|
| + event.keyIdentifier[i] = (*key_identifier)[i];
|
| + }
|
| +
|
| + if (code) {
|
| + event.domCode = static_cast<int>(
|
| + ui::KeycodeConverter::CodeStringToDomCode(code->c_str()));
|
| + }
|
| +
|
| + if (windows_virtual_key_code)
|
| + 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;
|
| +
|
| + if (!host_)
|
| + return Response::ServerError("Could not connect to view");
|
| +
|
| + if (!host_->is_focused())
|
| + host_->Focus();
|
| + host_->ForwardKeyboardEvent(event);
|
| + return Response::OK();
|
| }
|
|
|
| Response InputHandler::DispatchMouseEvent(
|
| @@ -52,7 +177,32 @@ Response InputHandler::DispatchMouseEvent(
|
| const double* timestamp,
|
| const std::string* button,
|
| const int* click_count) {
|
| - return Response::FallThrough();
|
| + blink::WebMouseEvent event;
|
| +
|
| + if (!SetMouseEventType(&event, type)) {
|
| + return Response::InvalidParams(
|
| + base::StringPrintf("Unexpected event type '%s'", type.c_str()));
|
| + }
|
| + SetEventModifiers(&event, modifiers);
|
| + SetEventTimestamp(&event, timestamp);
|
| + if (!SetMouseEventButton(&event, button))
|
| + 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;
|
| +
|
| + if (!host_)
|
| + return Response::ServerError("Could not connect to view");
|
| +
|
| + if (!host_->is_focused())
|
| + host_->Focus();
|
| + host_->ForwardMouseEvent(event);
|
| + return Response::OK();
|
| }
|
|
|
| Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type,
|
| @@ -68,13 +218,7 @@ Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type,
|
| blink::WebMouseEvent mouse_event;
|
| blink::WebMouseEvent* event = &mouse_event;
|
|
|
| - if (type == emulate_touch_from_mouse_event::kTypeMousePressed) {
|
| - event->type = blink::WebInputEvent::MouseDown;
|
| - } else if (type == emulate_touch_from_mouse_event::kTypeMouseReleased) {
|
| - event->type = blink::WebInputEvent::MouseUp;
|
| - } else if (type == emulate_touch_from_mouse_event::kTypeMouseMoved) {
|
| - event->type = blink::WebInputEvent::MouseMove;
|
| - } else if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) {
|
| + if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) {
|
| if (!delta_x || !delta_y) {
|
| return Response::InvalidParams(
|
| "'deltaX' and 'deltaY' are expected for mouseWheel event");
|
| @@ -83,48 +227,23 @@ Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type,
|
| wheel_event.deltaY = static_cast<float>(*delta_y);
|
| event = &wheel_event;
|
| event->type = blink::WebInputEvent::MouseWheel;
|
| - } else {
|
| + } else if (!SetMouseEventType(event, type)) {
|
| return Response::InvalidParams(
|
| base::StringPrintf("Unexpected event type '%s'", type.c_str()));
|
| }
|
|
|
| - if (modifiers) {
|
| - 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;
|
| - }
|
| + SetEventModifiers(event, modifiers);
|
| + SetEventTimestamp(event, ×tamp);
|
| + if (!SetMouseEventButton(event, &button))
|
| + return Response::InvalidParams("Invalid mouse button");
|
|
|
| - event->timeStampSeconds = timestamp;
|
| event->x = x;
|
| event->y = y;
|
| event->windowX = x;
|
| event->windowY = y;
|
| event->globalX = x;
|
| event->globalY = y;
|
| -
|
| - if (click_count)
|
| - event->clickCount = *click_count;
|
| -
|
| - if (button == emulate_touch_from_mouse_event::kButtonNone) {
|
| - event->button = blink::WebMouseEvent::ButtonNone;
|
| - } else if (button == emulate_touch_from_mouse_event::kButtonLeft) {
|
| - event->button = blink::WebMouseEvent::ButtonLeft;
|
| - event->modifiers |= blink::WebInputEvent::LeftButtonDown;
|
| - } else if (button == emulate_touch_from_mouse_event::kButtonMiddle) {
|
| - event->button = blink::WebMouseEvent::ButtonMiddle;
|
| - event->modifiers |= blink::WebInputEvent::MiddleButtonDown;
|
| - } else if (button == emulate_touch_from_mouse_event::kButtonRight) {
|
| - event->button = blink::WebMouseEvent::ButtonRight;
|
| - event->modifiers |= blink::WebInputEvent::RightButtonDown;
|
| - } else {
|
| - return Response::InvalidParams(
|
| - base::StringPrintf("Unexpected mouse button '%s'", button.c_str()));
|
| - }
|
| + event->clickCount = click_count ? *click_count : 0;
|
|
|
| if (!host_)
|
| return Response::ServerError("Could not connect to view");
|
|
|