[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;