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();