Merge TextEditKeyBindingsDelegateAuraLinux into LinuxUi

This CL also adds "assert(is_linux)" to //ui/linux/BUILD.gn

R=sky

Bug: 1317782
Change-Id: Id8c2423de1181609f3e2f1332f36b41bf6676e28
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3764706
Reviewed-by: Camille Lamy <[email protected]>
Reviewed-by: Lei Zhang <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Commit-Queue: Thomas Anderson <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1026328}
diff --git a/ui/linux/BUILD.gn b/ui/linux/BUILD.gn
index 759d8d0..f290fe3a 100644
--- a/ui/linux/BUILD.gn
+++ b/ui/linux/BUILD.gn
@@ -5,6 +5,8 @@
 import("//build/config/linux/gtk/gtk.gni")
 import("//ui/qt/qt.gni")
 
+assert(is_linux)
+
 component("linux_ui") {
   defines = [ "IS_LINUX_UI_IMPL" ]
   public = [
@@ -57,3 +59,19 @@
     deps += [ "//ui/qt" ]
   }
 }
+
+source_set("test_support") {
+  testonly = true
+
+  public = [ "fake_linux_ui.h" ]
+  sources = [ "fake_linux_ui.cc" ]
+
+  public_deps = [ ":linux_ui" ]
+  deps = [
+    "//base",
+    "//skia",
+    "//ui/gfx",
+    "//ui/native_theme",
+    "//ui/shell_dialogs",
+  ]
+}
diff --git a/ui/linux/fake_linux_ui.cc b/ui/linux/fake_linux_ui.cc
new file mode 100644
index 0000000..beb120e4
--- /dev/null
+++ b/ui/linux/fake_linux_ui.cc
@@ -0,0 +1,144 @@
+// Copyright 2022 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/linux/fake_linux_ui.h"
+
+#include "base/time/time.h"
+#include "ui/gfx/color_palette.h"
+#include "ui/gfx/image/image.h"
+#include "ui/shell_dialogs/select_file_policy.h"
+
+namespace ui {
+
+FakeLinuxUi::FakeLinuxUi() = default;
+
+FakeLinuxUi::~FakeLinuxUi() = default;
+
+std::unique_ptr<ui::LinuxInputMethodContext>
+FakeLinuxUi::CreateInputMethodContext(
+    ui::LinuxInputMethodContextDelegate* delegate) const {
+  return nullptr;
+}
+
+gfx::FontRenderParams FakeLinuxUi::GetDefaultFontRenderParams() const {
+  return gfx::FontRenderParams();
+}
+
+void FakeLinuxUi::GetDefaultFontDescription(
+    std::string* family_out,
+    int* size_pixels_out,
+    int* style_out,
+    gfx::Font::Weight* weight_out,
+    gfx::FontRenderParams* params_out) const {}
+
+ui::SelectFileDialog* FakeLinuxUi::CreateSelectFileDialog(
+    void* listener,
+    std::unique_ptr<ui::SelectFilePolicy> policy) const {
+  return nullptr;
+}
+
+bool FakeLinuxUi::Initialize() {
+  return false;
+}
+
+bool FakeLinuxUi::GetColor(int id,
+                           SkColor* color,
+                           bool use_custom_frame) const {
+  return false;
+}
+
+bool FakeLinuxUi::GetDisplayProperty(int id, int* result) const {
+  return false;
+}
+
+SkColor FakeLinuxUi::GetFocusRingColor() const {
+  return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetActiveSelectionBgColor() const {
+  return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetActiveSelectionFgColor() const {
+  return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetInactiveSelectionBgColor() const {
+  return gfx::kPlaceholderColor;
+}
+
+SkColor FakeLinuxUi::GetInactiveSelectionFgColor() const {
+  return gfx::kPlaceholderColor;
+}
+
+base::TimeDelta FakeLinuxUi::GetCursorBlinkInterval() const {
+  return base::TimeDelta();
+}
+
+gfx::Image FakeLinuxUi::GetIconForContentType(const std::string& content_type,
+                                              int size,
+                                              float scale) const {
+  return gfx::Image();
+}
+
+LinuxUi::WindowFrameAction FakeLinuxUi::GetWindowFrameAction(
+    WindowFrameActionSource source) {
+  return WindowFrameAction::kNone;
+}
+
+float FakeLinuxUi::GetDeviceScaleFactor() const {
+  return 1.0f;
+}
+
+bool FakeLinuxUi::PreferDarkTheme() const {
+  return false;
+}
+
+bool FakeLinuxUi::AnimationsEnabled() const {
+  return true;
+}
+
+std::unique_ptr<ui::NavButtonProvider> FakeLinuxUi::CreateNavButtonProvider() {
+  return nullptr;
+}
+
+ui::WindowFrameProvider* FakeLinuxUi::GetWindowFrameProvider(bool solid_frame) {
+  return nullptr;
+}
+
+base::flat_map<std::string, std::string> FakeLinuxUi::GetKeyboardLayoutMap() {
+  return base::flat_map<std::string, std::string>();
+}
+
+std::string FakeLinuxUi::GetCursorThemeName() {
+  return std::string();
+}
+
+int FakeLinuxUi::GetCursorThemeSize() {
+  return 0;
+}
+
+ui::NativeTheme* FakeLinuxUi::GetNativeTheme() const {
+  return nullptr;
+}
+
+bool FakeLinuxUi::GetTextEditCommandsForEvent(
+    const ui::Event& event,
+    std::vector<ui::TextEditCommandAuraLinux>* commands) {
+  return false;
+}
+
+#if BUILDFLAG(ENABLE_PRINTING)
+printing::PrintDialogLinuxInterface* FakeLinuxUi::CreatePrintDialog(
+    printing::PrintingContextLinux* context) {
+  return nullptr;
+}
+
+gfx::Size FakeLinuxUi::GetPdfPaperSize(
+    printing::PrintingContextLinux* context) {
+  return gfx::Size();
+}
+#endif
+
+}  // namespace ui
diff --git a/ui/linux/fake_linux_ui.h b/ui/linux/fake_linux_ui.h
new file mode 100644
index 0000000..52cc79e
--- /dev/null
+++ b/ui/linux/fake_linux_ui.h
@@ -0,0 +1,67 @@
+// Copyright 2022 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_LINUX_FAKE_LINUX_UI_H_
+#define UI_LINUX_FAKE_LINUX_UI_H_
+
+#include "ui/linux/linux_ui.h"
+
+namespace ui {
+
+// This class is meant to be overridden by tests.  It's provided as a
+// convenience so that tests don't have to stub lots of methods just to override
+// a single one.
+class COMPONENT_EXPORT(LINUX_UI) FakeLinuxUi : public LinuxUi {
+ public:
+  FakeLinuxUi();
+  ~FakeLinuxUi() override;
+
+  std::unique_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
+      ui::LinuxInputMethodContextDelegate* delegate) const override;
+  gfx::FontRenderParams GetDefaultFontRenderParams() const override;
+  void GetDefaultFontDescription(
+      std::string* family_out,
+      int* size_pixels_out,
+      int* style_out,
+      gfx::Font::Weight* weight_out,
+      gfx::FontRenderParams* params_out) const override;
+  ui::SelectFileDialog* CreateSelectFileDialog(
+      void* listener,
+      std::unique_ptr<ui::SelectFilePolicy> policy) const override;
+  bool Initialize() override;
+  bool GetColor(int id, SkColor* color, bool use_custom_frame) const override;
+  bool GetDisplayProperty(int id, int* result) const override;
+  SkColor GetFocusRingColor() const override;
+  SkColor GetActiveSelectionBgColor() const override;
+  SkColor GetActiveSelectionFgColor() const override;
+  SkColor GetInactiveSelectionBgColor() const override;
+  SkColor GetInactiveSelectionFgColor() const override;
+  base::TimeDelta GetCursorBlinkInterval() const override;
+  gfx::Image GetIconForContentType(const std::string& content_type,
+                                   int size,
+                                   float scale) const override;
+  WindowFrameAction GetWindowFrameAction(
+      WindowFrameActionSource source) override;
+  float GetDeviceScaleFactor() const override;
+  bool PreferDarkTheme() const override;
+  bool AnimationsEnabled() const override;
+  std::unique_ptr<ui::NavButtonProvider> CreateNavButtonProvider() override;
+  ui::WindowFrameProvider* GetWindowFrameProvider(bool solid_frame) override;
+  base::flat_map<std::string, std::string> GetKeyboardLayoutMap() override;
+  std::string GetCursorThemeName() override;
+  int GetCursorThemeSize() override;
+  ui::NativeTheme* GetNativeTheme() const override;
+  bool GetTextEditCommandsForEvent(
+      const ui::Event& event,
+      std::vector<ui::TextEditCommandAuraLinux>* commands) override;
+#if BUILDFLAG(ENABLE_PRINTING)
+  printing::PrintDialogLinuxInterface* CreatePrintDialog(
+      printing::PrintingContextLinux* context) override;
+  gfx::Size GetPdfPaperSize(printing::PrintingContextLinux* context) override;
+#endif
+};
+
+}  // namespace ui
+
+#endif  // UI_LINUX_FAKE_LINUX_UI_H_
diff --git a/ui/linux/linux_ui.cc b/ui/linux/linux_ui.cc
index a4667ab..2021188 100644
--- a/ui/linux/linux_ui.cc
+++ b/ui/linux/linux_ui.cc
@@ -10,35 +10,34 @@
 #include "base/command_line.h"
 #include "base/environment.h"
 #include "base/nix/xdg_util.h"
+#include "base/no_destructor.h"
 #include "build/build_config.h"
 #include "ui/linux/cursor_theme_manager_observer.h"
-#include "ui/linux/linux_ui_delegate.h"
 #include "ui/native_theme/native_theme.h"
 
 namespace {
 
-ui::LinuxUi* g_linux_ui = nullptr;
+std::unique_ptr<ui::LinuxUi>& GetLinuxUiInstance() {
+  static base::NoDestructor<std::unique_ptr<ui::LinuxUi>> linux_ui;
+  return *linux_ui;
+}
 
 }  // namespace
 
 namespace ui {
 
 // static
-void LinuxUi::SetInstance(std::unique_ptr<LinuxUi> instance) {
-  delete g_linux_ui;
-  g_linux_ui = instance.release();
+std::unique_ptr<LinuxUi> LinuxUi::SetInstance(
+    std::unique_ptr<LinuxUi> instance) {
+  SkiaFontDelegate::SetInstance(instance.get());
+  gfx::AnimationSettingsProviderLinux::SetInstance(instance.get());
 
-  SkiaFontDelegate::SetInstance(g_linux_ui);
-  gfx::AnimationSettingsProviderLinux::SetInstance(g_linux_ui);
-
-  // Do not set IME instance for ozone as we delegate creating the input method
-  // to OzonePlatforms instead. If this is set, OzonePlatform never sets a
-  // context factory.
+  return std::exchange(GetLinuxUiInstance(), std::move(instance));
 }
 
 // static
 LinuxUi* LinuxUi::instance() {
-  return g_linux_ui;
+  return GetLinuxUiInstance().get();
 }
 
 LinuxUi::LinuxUi() = default;
diff --git a/ui/linux/linux_ui.h b/ui/linux/linux_ui.h
index 1ca7efb4..401ac46 100644
--- a/ui/linux/linux_ui.h
+++ b/ui/linux/linux_ui.h
@@ -18,9 +18,7 @@
 #include "build/chromecast_buildflags.h"
 #include "printing/buildflags/buildflags.h"
 #include "third_party/skia/include/core/SkColor.h"
-#include "ui/base/ime/linux/text_edit_key_bindings_delegate_auralinux.h"  // nogncheck
 #include "ui/gfx/animation/animation_settings_provider_linux.h"
-#include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/skia_font_delegate.h"
 
@@ -48,12 +46,14 @@
 
 class CursorThemeManagerObserver;
 class DeviceScaleFactorObserver;
+class Event;
 class LinuxInputMethodContext;
 class LinuxInputMethodContextDelegate;
 class NativeTheme;
 class NavButtonProvider;
 class SelectFileDialog;
 class SelectFilePolicy;
+class TextEditCommandAuraLinux;
 class WindowButtonOrderObserver;
 class WindowFrameProvider;
 
@@ -61,7 +61,6 @@
 // project that wants to do linux desktop native rendering.
 class COMPONENT_EXPORT(LINUX_UI) LinuxUi
     : public gfx::SkiaFontDelegate,
-      public ui::TextEditKeyBindingsDelegateAuraLinux,
       public gfx::AnimationSettingsProviderLinux {
  public:
   using UseSystemThemeCallback =
@@ -89,7 +88,9 @@
   ~LinuxUi() override;
 
   // Sets the dynamically loaded singleton that draws the desktop native UI.
-  static void SetInstance(std::unique_ptr<LinuxUi> instance);
+  // Returns the old instance if any.
+  static std::unique_ptr<LinuxUi> SetInstance(
+      std::unique_ptr<LinuxUi> instance);
 
   // Returns a LinuxUI instance for the toolkit used in the user's desktop
   // environment.
@@ -208,6 +209,14 @@
   virtual std::unique_ptr<LinuxInputMethodContext> CreateInputMethodContext(
       LinuxInputMethodContextDelegate* delegate) const = 0;
 
+  // Matches a key event against the users' platform specific key bindings,
+  // false will be returned if the key event doesn't correspond to a predefined
+  // key binding.  Edit commands matched with |event| will be stored in
+  // |edit_commands|, if |edit_commands| is non-nullptr.
+  virtual bool GetTextEditCommandsForEvent(
+      const ui::Event& event,
+      std::vector<TextEditCommandAuraLinux>* commands) = 0;
+
  protected:
   struct CmdLineArgs {
     CmdLineArgs();