Commit 7758f33b authored by Nick Diego Yamane's avatar Nick Diego Yamane Committed by Commit Bot

ozone: Fix regression in key events translation

Such regression had already been fixed by crrev.com/c/1823795 but has
been re-introduced by crrev.com/c/1866752. So, in this CL a fix similar
to crrev.com/c/1823795 is applied new XEvent => ui::Event translation
code with a difference, generalize it to any ozone platform, instead of
only OS_CHROMEOS as in the original patch.

Context:

X11EventSource is used by both non-Ozone and Ozone X11, which have
different keyboard layout management implementations. Non-ozone
currently (more specifically after crrev.com/c/1813417) assumes
DomKey/DomCode are set at KeyEvent construction, while Ozone handles it
lazily in KeyEvent::ApplyLayout(). So, this change in XEvent =>
ui::Event translation code is needed to properly support these 2
different code paths.

Bug: 1007389
Change-Id: I7bab6f0187cefdad36ef9246766cd64464dc8b49
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1895399Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Commit-Queue: Nick Yamane <nickdiego@igalia.com>
Cr-Commit-Position: refs/heads/master@{#713035}
parent 4fa76900
......@@ -607,6 +607,14 @@ if (!is_ios) {
]
}
if (use_x11 || ozone_platform_x11) {
sources += [ "x/x11_event_translation_unittest.cc" ]
deps += [
"//ui/events/x",
"//ui/gfx/x",
]
}
if (use_x11 || use_ozone) {
sources += [ "devices/device_data_manager_unittest.cc" ]
}
......
......@@ -9,6 +9,7 @@
#include "ui/events/event.h"
#include "ui/events/event_dispatcher.h"
#include "ui/events/event_target.h"
#include "ui/events/keycodes/dom/dom_key.h"
namespace ui {
......@@ -64,6 +65,8 @@ class KeyEventTestApi : public EventTestApi {
key_event_->set_is_char(is_char);
}
DomKey dom_key() const { return key_event_->key_; }
private:
KeyEventTestApi();
......
......@@ -4,6 +4,8 @@
#include "ui/events/x/x11_event_translation.h"
#include <vector>
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/keycodes/keyboard_code_conversion_x.h"
......@@ -32,9 +34,22 @@ Event::Properties GetEventPropertiesFromXKeyEvent(const XKeyEvent& xev) {
std::unique_ptr<KeyEvent> CreateKeyEvent(EventType event_type,
const XEvent& xev) {
auto event = std::make_unique<KeyEvent>(
event_type, KeyboardCodeFromXKeyEvent(&xev), CodeFromXEvent(&xev),
EventFlagsFromXEvent(xev));
KeyboardCode key_code = KeyboardCodeFromXKeyEvent(&xev);
int event_flags = EventFlagsFromXEvent(xev);
// In Ozone builds, keep DomCode/DomKey unset, so they are extracted lazily
// in KeyEvent::ApplyLayout() which makes it possible for CrOS/Linux, for
// example, to support host system keyboard layouts.
#if defined(USE_OZONE)
auto event = std::make_unique<KeyEvent>(event_type, key_code, event_flags);
#else
DomCode dom_code = CodeFromXEvent(&xev);
DomKey dom_key = GetDomKeyFromXEvent(&xev);
base::TimeTicks timestamp = EventTimeFromXEvent(xev);
ValidateEventTimeClock(&timestamp);
auto event = std::make_unique<KeyEvent>(event_type, key_code, dom_code,
event_flags, dom_key, timestamp);
#endif
DCHECK(event);
event->SetProperties(GetEventPropertiesFromXKeyEvent(xev.xkey));
......
// Copyright (c) 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/events/x/x11_event_translation.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/dom/dom_key.h"
#include "ui/events/test/events_test_utils.h"
#include "ui/events/test/events_test_utils_x11.h"
namespace ui {
// Ensure DomKey extraction happens lazily in Ozone X11, while in non-Ozone
// path it is set right away in XEvent => ui::Event translation. This prevents
// regressions such as crbug.com/1007389.
TEST(XEventTranslationTest, KeyEventDomKeyExtraction) {
ScopedXI2Event xev;
xev.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE);
auto keyev = ui::BuildKeyEventFromXEvent(*xev);
EXPECT_TRUE(keyev);
KeyEventTestApi test(keyev.get());
#if defined(USE_OZONE)
EXPECT_EQ(ui::DomKey::NONE, test.dom_key());
#else
EXPECT_EQ(ui::DomKey::ENTER, test.dom_key());
#endif
EXPECT_EQ(13, keyev->GetCharacter());
EXPECT_EQ("Enter", keyev->GetCodeString());
}
} // namespace ui
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