[ozone/wayland] Add a mock impl XKBWaylandKeyboardLayoutEngine
In order to allow existing unittests (namely WaylandKeyboardTests)
and future ones to pass with XKB enabled, we need a specialization of
XkbWaylandKeyboardLayoutEngine for tests.
Following the logic used throughout the Wayland unittests' machinery,
it makes sense to mock a Xkb-capable KeyboardLayoutEngine, rather than
using an actual implementation.
This CL adds a mock implementation of XkbWaylandKeyboardLayoutEngine to
be used by Wayland unittests.
For this, it turns XkbWaylandKeyboardLayoutEngine into a pure virtual
class, which is implemented by
- XkbWaylandKeyboardLayoutEngineImpl, for regular ozone/wayland execution
(e.g. chrome/wayland), which keeps the current XkbWaylandKeyboardLayoutEngine
logic unchanged;
- MockXkbWaylandKeyboardLayoutEngine, a sibling implementation added
by this CL, derived from XkbWaylandKeyboardLayoutEngine to be used for
unittests.
BUG=578890
Change-Id: Ie98f0d5bcf5b45c86812c4fab7dc63e1ffdc0890
Reviewed-on: https://chromium-review.googlesource.com/849032
Reviewed-by: Robert Kroeger <rjkroege@chromium.org>
Commit-Queue: Antonio Gomes <tonikitoo@igalia.com>
Cr-Commit-Position: refs/heads/master@{#528082}
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index 9a0efae..74bd53e 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -95,12 +95,22 @@
"wayland_window_unittest.cc",
]
+ import("//ui/base/ui_features.gni")
+ if (use_xkbcommon) {
+ sources += [
+ "mock_wayland_xkb_keyboard_layout_engine.cc",
+ "mock_wayland_xkb_keyboard_layout_engine.h",
+ ]
+ }
+
deps = [
":wayland",
"//testing/gmock",
"//testing/gtest",
"//third_party/wayland:wayland_server",
"//third_party/wayland-protocols:xdg_shell_protocol",
+ "//ui/base:ui_features",
+ "//ui/events/ozone:events_ozone_layout",
"//ui/gfx:test_support",
"//ui/ozone:platform",
]
diff --git a/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.cc b/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.cc
new file mode 100644
index 0000000..4dd5c352
--- /dev/null
+++ b/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.cc
@@ -0,0 +1,22 @@
+// Copyright 2018 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/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h"
+#include "ui/events/keycodes/keyboard_code_conversion.h"
+
+#if !BUILDFLAG(USE_XKBCOMMON)
+#error "This file should only be compiled if USE_XKBCOMMON is enabled."
+#endif
+
+namespace ui {
+
+bool MockWaylandXkbKeyboardLayoutEngine::Lookup(
+ ui::DomCode dom_code,
+ int event_flags,
+ ui::DomKey* dom_key,
+ ui::KeyboardCode* key_code) const {
+ return DomCodeToUsLayoutDomKey(dom_code, event_flags, dom_key, key_code);
+}
+
+} // namespace ui
diff --git a/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h b/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h
new file mode 100644
index 0000000..8d60d2b
--- /dev/null
+++ b/ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h
@@ -0,0 +1,42 @@
+// Copyright 2018 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.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_MOCK_WAYLAND_XKB_KEYBOARD_LAYOUT_ENGINE_H_
+#define UI_OZONE_PLATFORM_WAYLAND_MOCK_WAYLAND_XKB_KEYBOARD_LAYOUT_ENGINE_H_
+
+#include "ui/base/ui_features.h"
+
+#if !BUILDFLAG(USE_XKBCOMMON)
+#error "This file should only be included if USE_XKBCOMMON is enabled."
+#endif
+
+#include "ui/events/ozone/layout/xkb/xkb_evdev_codes.h"
+#include "ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h"
+
+namespace ui {
+
+class MockWaylandXkbKeyboardLayoutEngine
+ : public ui::WaylandXkbKeyboardLayoutEngine {
+ public:
+ MockWaylandXkbKeyboardLayoutEngine(const ui::XkbKeyCodeConverter& converter)
+ : WaylandXkbKeyboardLayoutEngine(converter) {}
+
+ void UpdateModifiers(uint32_t depressed_mods,
+ uint32_t latched_mods,
+ uint32_t locked_mods,
+ uint32_t group) override {}
+ void SetEventModifiers(ui::EventModifiers* event_modifiers) override {}
+
+ private:
+ bool Lookup(ui::DomCode dom_code,
+ int event_flags,
+ ui::DomKey* dom_key,
+ ui::KeyboardCode* key_code) const override;
+
+ DISALLOW_COPY_AND_ASSIGN(MockWaylandXkbKeyboardLayoutEngine);
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_WAYLAND_MOCK_WAYLAND_XKB_KEYBOARD_LAYOUT_ENGINE_H_
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 843d7c9..e94ef56 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -77,7 +77,7 @@
void InitializeUI(const InitParams& args) override {
#if BUILDFLAG(USE_XKBCOMMON)
KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
- std::make_unique<WaylandXkbKeyboardLayoutEngine>(
+ std::make_unique<WaylandXkbKeyboardLayoutEngineImpl>(
xkb_evdev_code_converter_));
#else
KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
diff --git a/ui/ozone/platform/wayland/wayland_keyboard.cc b/ui/ozone/platform/wayland/wayland_keyboard.cc
index a9f7399..9d2612d 100644
--- a/ui/ozone/platform/wayland/wayland_keyboard.cc
+++ b/ui/ozone/platform/wayland/wayland_keyboard.cc
@@ -41,7 +41,7 @@
#if BUILDFLAG(USE_XKBCOMMON)
auto* engine = static_cast<WaylandXkbKeyboardLayoutEngine*>(
KeyboardLayoutEngineManager::GetKeyboardLayoutEngine());
- engine->set_event_modifiers(&event_modifiers_);
+ engine->SetEventModifiers(&event_modifiers_);
#endif
wl_keyboard_add_listener(obj_.get(), &listener, this);
diff --git a/ui/ozone/platform/wayland/wayland_test.cc b/ui/ozone/platform/wayland/wayland_test.cc
index 60328cb..4eb44e8 100644
--- a/ui/ozone/platform/wayland/wayland_test.cc
+++ b/ui/ozone/platform/wayland/wayland_test.cc
@@ -5,6 +5,13 @@
#include "ui/ozone/platform/wayland/wayland_test.h"
#include "base/run_loop.h"
+#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
+
+#if BUILDFLAG(USE_XKBCOMMON)
+#include "ui/ozone/platform/wayland/mock_wayland_xkb_keyboard_layout_engine.h"
+#else
+#include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
+#endif
using ::testing::SaveArg;
using ::testing::_;
@@ -12,8 +19,14 @@
namespace ui {
WaylandTest::WaylandTest() {
- // TODO(tonikitoo): Set the proper KeyboardLayoutEngine instance here,
- // before the WaylandConnection is instantiated.
+#if BUILDFLAG(USE_XKBCOMMON)
+ KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
+ std::make_unique<MockWaylandXkbKeyboardLayoutEngine>(
+ xkb_evdev_code_converter_));
+#else
+ KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(
+ std::make_unique<StubKeyboardLayoutEngine>());
+#endif
connection.reset(new WaylandConnection);
window = std::make_unique<WaylandWindow>(&delegate, connection.get(),
gfx::Rect(0, 0, 800, 600));
diff --git a/ui/ozone/platform/wayland/wayland_test.h b/ui/ozone/platform/wayland/wayland_test.h
index 459422d..5441aa2 100644
--- a/ui/ozone/platform/wayland/wayland_test.h
+++ b/ui/ozone/platform/wayland/wayland_test.h
@@ -7,11 +7,16 @@
#include "base/message_loop/message_loop.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/ui_features.h"
#include "ui/ozone/platform/wayland/fake_server.h"
#include "ui/ozone/platform/wayland/mock_platform_window_delegate.h"
#include "ui/ozone/platform/wayland/wayland_connection.h"
#include "ui/ozone/platform/wayland/wayland_window.h"
+#if BUILDFLAG(USE_XKBCOMMON)
+#include "ui/events/ozone/layout/xkb/xkb_evdev_codes.h"
+#endif
+
namespace ui {
const uint32_t kXdgShellV5 = 5;
@@ -43,6 +48,10 @@
gfx::AcceleratedWidget widget = gfx::kNullAcceleratedWidget;
private:
+#if BUILDFLAG(USE_XKBCOMMON)
+ XkbEvdevCodes xkb_evdev_code_converter_;
+#endif
+
DISALLOW_COPY_AND_ASSIGN(WaylandTest);
};
diff --git a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc
index 8e6e4fe..3b754f3 100644
--- a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc
+++ b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.cc
@@ -9,11 +9,11 @@
namespace ui {
-WaylandXkbKeyboardLayoutEngine::WaylandXkbKeyboardLayoutEngine(
+WaylandXkbKeyboardLayoutEngineImpl::WaylandXkbKeyboardLayoutEngineImpl(
const XkbKeyCodeConverter& converter)
- : XkbKeyboardLayoutEngine(converter) {}
+ : WaylandXkbKeyboardLayoutEngine(converter) {}
-void WaylandXkbKeyboardLayoutEngine::SetKeymap(xkb_keymap* keymap) {
+void WaylandXkbKeyboardLayoutEngineImpl::SetKeymap(xkb_keymap* keymap) {
XkbKeyboardLayoutEngine::SetKeymap(keymap);
xkb_mod_indexes_.control =
@@ -22,10 +22,11 @@
xkb_mod_indexes_.shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
}
-void WaylandXkbKeyboardLayoutEngine::UpdateModifiers(uint32_t depressed_mods,
- uint32_t latched_mods,
- uint32_t locked_mods,
- uint32_t group) {
+void WaylandXkbKeyboardLayoutEngineImpl::UpdateModifiers(
+ uint32_t depressed_mods,
+ uint32_t latched_mods,
+ uint32_t locked_mods,
+ uint32_t group) {
xkb_state_update_mask(xkb_state_.get(), depressed_mods, latched_mods,
locked_mods, 0, 0, group);
@@ -46,4 +47,9 @@
event_modifiers_->UpdateModifier(MODIFIER_SHIFT, true);
}
+void WaylandXkbKeyboardLayoutEngineImpl::SetEventModifiers(
+ EventModifiers* event_modifiers) {
+ event_modifiers_ = event_modifiers;
+}
+
} // namespace ui
diff --git a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h
index 63c3dd5..ae8eafa5 100644
--- a/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h
+++ b/ui/ozone/platform/wayland/wayland_xkb_keyboard_layout_engine.h
@@ -15,18 +15,29 @@
class WaylandXkbKeyboardLayoutEngine : public XkbKeyboardLayoutEngine {
public:
- WaylandXkbKeyboardLayoutEngine(const XkbKeyCodeConverter& converter);
+ WaylandXkbKeyboardLayoutEngine(const XkbKeyCodeConverter& converter)
+ : XkbKeyboardLayoutEngine(converter) {}
// Used to sync up client side 'xkb_state' instance with modifiers status
// update from the compositor.
+ virtual void UpdateModifiers(uint32_t depressed_mods,
+ uint32_t latched_mods,
+ uint32_t locked_mods,
+ uint32_t group) = 0;
+ virtual void SetEventModifiers(EventModifiers* event_modifiers) = 0;
+};
+
+class WaylandXkbKeyboardLayoutEngineImpl
+ : public WaylandXkbKeyboardLayoutEngine {
+ public:
+ WaylandXkbKeyboardLayoutEngineImpl(const XkbKeyCodeConverter& converter);
+
void UpdateModifiers(uint32_t depressed_mods,
uint32_t latched_mods,
uint32_t locked_mods,
- uint32_t group);
+ uint32_t group) override;
- void set_event_modifiers(EventModifiers* event_modifiers) {
- event_modifiers_ = event_modifiers;
- }
+ void SetEventModifiers(EventModifiers* event_modifiers) override;
private:
void SetKeymap(xkb_keymap* keymap) override;