Commit 01f70ed0 authored by Ryan Daum's avatar Ryan Daum Committed by Commit Bot

[chromecast] Fix synthetic key events for webviews

  * Unless is_char is true blink will interpret the key event as a raw
    keypress instead of a proper keystroke. Derive and pass through
    this property correctly.

  * Mark the event as EF_IS_SYNTHESIZED and ui::kPropertyFromVK, in
    the same manner that chromeos's virtual keyboard implementation
    does.

Bug: internal b/161811385
Test: manual x86 cast_shell build with wayland_webview_client attached
Change-Id: I4d752bd219eb540a719e0bd339ab674bbbd3db23
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2418999Reviewed-by: default avatarKevin Schoedel <kpschoedel@chromium.org>
Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Commit-Queue: Ryan Daum <rdaum@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808906}
parent 852ab97c
...@@ -480,6 +480,7 @@ void WebviewClient::SendKeyEvent(const Webview* webview, ...@@ -480,6 +480,7 @@ void WebviewClient::SendKeyEvent(const Webview* webview,
key_input->set_key_code(keyboard_code); key_input->set_key_code(keyboard_code);
key_input->set_dom_code(static_cast<int32_t>(dom_code)); key_input->set_dom_code(static_cast<int32_t>(dom_code));
key_input->set_dom_key(static_cast<int32_t>(dom_key)); key_input->set_dom_key(static_cast<int32_t>(dom_key));
key_input->set_is_char(dom_key.IsCharacter());
auto key_event = std::make_unique<InputEvent>(); auto key_event = std::make_unique<InputEvent>();
key_event->set_event_type(down ? ui::EventType::ET_KEY_PRESSED key_event->set_event_type(down ? ui::EventType::ET_KEY_PRESSED
......
...@@ -25,7 +25,9 @@ ...@@ -25,7 +25,9 @@
#include "third_party/blink/public/common/input/web_touch_event.h" #include "third_party/blink/public/common/input/web_touch_event.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/aura/window_delegate.h" #include "ui/aura/window_delegate.h"
#include "ui/base/ime/constants.h"
#include "ui/events/event.h" #include "ui/events/event.h"
#include "ui/events/event_constants.h"
namespace chromecast { namespace chromecast {
...@@ -273,12 +275,20 @@ void WebContentController::ProcessInputEvent(const webview::InputEvent& ev) { ...@@ -273,12 +275,20 @@ void WebContentController::ProcessInputEvent(const webview::InputEvent& ev) {
case ui::ET_KEY_PRESSED: case ui::ET_KEY_PRESSED:
case ui::ET_KEY_RELEASED: case ui::ET_KEY_RELEASED:
if (ev.has_key()) { if (ev.has_key()) {
ui::KeyEvent evt(type, ui::KeyEvent evt(
static_cast<ui::KeyboardCode>(ev.key().key_code()), type, static_cast<ui::KeyboardCode>(ev.key().key_code()),
static_cast<ui::DomCode>(ev.key().dom_code()), static_cast<ui::DomCode>(ev.key().dom_code()),
ev.flags(), ui::DomKey(ev.key().dom_key()), ev.flags() | ui::EF_IS_SYNTHESIZED, ui::DomKey(ev.key().dom_key()),
base::TimeTicks() + base::TimeTicks() +
base::TimeDelta::FromMicroseconds(ev.timestamp())); base::TimeDelta::FromMicroseconds(ev.timestamp()),
ev.key().is_char());
// Marks the simulated key event is from a Virtual Keyboard.
ui::Event::Properties properties;
properties[ui::kPropertyFromVK] =
std::vector<uint8_t>(ui::kPropertyFromVKSize);
evt.SetProperties(properties);
handler->OnKeyEvent(&evt); handler->OnKeyEvent(&evt);
} else { } else {
client_->OnError("key() not supplied for key event"); client_->OnError("key() not supplied for key event");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment