IME: Delegate ui::InputMethod construction to ozone

This gives ui::OzonePlatform control over ui::InputMethod creation in
ozone builds.

Bug: 943789, 978970
Test: various builds, ui_unittests

Change-Id: Ie7f8977bf2d36df4ed84cfcae5254add27aa97eb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1531600
Commit-Queue: Michael Spang <spang@chromium.org>
Reviewed-by: Shu Chen <shuchen@chromium.org>
Reviewed-by: Antonio Gomes <tonikitoo@igalia.com>
Cr-Commit-Position: refs/heads/master@{#674959}
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
index 15ef7e3..a3a8b1f6 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -49,6 +49,7 @@
 #include "ui/base/ime/ime_bridge.h"
 #include "ui/chromeos/ime/input_method_menu_item.h"
 #include "ui/chromeos/ime/input_method_menu_manager.h"
+#include "ui/ozone/public/ozone_platform.h"
 
 namespace chromeos {
 namespace input_method {
@@ -920,10 +921,12 @@
       component_extension_ime_manager_(new ComponentExtensionIMEManager()),
       enable_extension_loading_(enable_extension_loading),
       features_enabled_state_(InputMethodManager::FEATURE_ALL) {
-  if (IsRunningAsSystemCompositor())
-    keyboard_ = std::make_unique<ImeKeyboardImpl>();
-  else
+  if (IsRunningAsSystemCompositor()) {
+    keyboard_ = std::make_unique<ImeKeyboardImpl>(
+        ui::OzonePlatform::GetInstance()->GetInputController());
+  } else {
     keyboard_ = std::make_unique<FakeImeKeyboard>();
+  }
   // Initializes the system IME list.
   std::unique_ptr<ComponentExtensionIMEManagerDelegate> comp_delegate(
       new ComponentExtensionIMEManagerImpl());
diff --git a/ui/base/ime/chromeos/BUILD.gn b/ui/base/ime/chromeos/BUILD.gn
index a76249de..b2ce01d 100644
--- a/ui/base/ime/chromeos/BUILD.gn
+++ b/ui/base/ime/chromeos/BUILD.gn
@@ -58,6 +58,6 @@
     "//third_party/icu",
     "//ui/base",
     "//ui/chromeos/strings",
-    "//ui/ozone",
+    "//ui/ozone:ozone_base",
   ]
 }
diff --git a/ui/base/ime/chromeos/ime_keyboard_impl.cc b/ui/base/ime/chromeos/ime_keyboard_impl.cc
index 5a35b01..2f5db43b 100644
--- a/ui/base/ime/chromeos/ime_keyboard_impl.cc
+++ b/ui/base/ime/chromeos/ime_keyboard_impl.cc
@@ -5,14 +5,12 @@
 #include "ui/base/ime/chromeos/ime_keyboard_impl.h"
 
 #include "ui/ozone/public/input_controller.h"
-#include "ui/ozone/public/ozone_platform.h"
 
 namespace chromeos {
 namespace input_method {
 
-ImeKeyboardImpl::ImeKeyboardImpl()
-    : input_controller_(
-          ui::OzonePlatform::GetInstance()->GetInputController()) {}
+ImeKeyboardImpl::ImeKeyboardImpl(ui::InputController* input_controller)
+    : input_controller_(input_controller) {}
 
 ImeKeyboardImpl::~ImeKeyboardImpl() = default;
 
diff --git a/ui/base/ime/chromeos/ime_keyboard_impl.h b/ui/base/ime/chromeos/ime_keyboard_impl.h
index a06dcef..33edf34 100644
--- a/ui/base/ime/chromeos/ime_keyboard_impl.h
+++ b/ui/base/ime/chromeos/ime_keyboard_impl.h
@@ -20,7 +20,7 @@
 class COMPONENT_EXPORT(UI_BASE_IME_CHROMEOS) ImeKeyboardImpl
     : public ImeKeyboard {
  public:
-  ImeKeyboardImpl();
+  ImeKeyboardImpl(ui::InputController* input_controller);
   ~ImeKeyboardImpl() override;
 
   // ImeKeyboard:
@@ -35,7 +35,7 @@
   bool CapsLockIsEnabled() override;
 
  private:
-  ui::InputController* input_controller_;
+  ui::InputController* const input_controller_;
 
   DISALLOW_COPY_AND_ASSIGN(ImeKeyboardImpl);
 };
diff --git a/ui/base/ime/init/BUILD.gn b/ui/base/ime/init/BUILD.gn
index f054326..57c1503 100644
--- a/ui/base/ime/init/BUILD.gn
+++ b/ui/base/ime/init/BUILD.gn
@@ -33,13 +33,10 @@
   if (is_mac) {
     deps += [ "//ui/base/ime/mac" ]
   }
-  if (is_chromeos) {
-    deps += [ "//ui/base/ime/chromeos" ]
-  }
-  if (is_fuchsia) {
-    deps += [ "//ui/base/ime/fuchsia" ]
-  }
   if (is_linux && !is_chromeos) {
     deps += [ "//ui/base/ime/linux" ]
   }
+  if (use_ozone) {
+    deps += [ "//ui/ozone" ]
+  }
 }
diff --git a/ui/base/ime/init/DEPS b/ui/base/ime/init/DEPS
new file mode 100644
index 0000000..4127e4e5
--- /dev/null
+++ b/ui/base/ime/init/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ui/ozone/public"
+]
diff --git a/ui/base/ime/init/input_method_factory.cc b/ui/base/ime/init/input_method_factory.cc
index 81f7f8a9..e12ee43 100644
--- a/ui/base/ime/init/input_method_factory.cc
+++ b/ui/base/ime/init/input_method_factory.cc
@@ -12,17 +12,15 @@
 #include "ui/base/ui_base_features.h"
 #include "ui/gfx/switches.h"
 
-#if defined(OS_CHROMEOS)
-#include "ui/base/ime/chromeos/input_method_chromeos.h"
-#elif defined(OS_WIN)
+#if defined(OS_WIN)
 #include "ui/base/ime/win/input_method_win_imm32.h"
 #include "ui/base/ime/win/input_method_win_tsf.h"
 #elif defined(OS_MACOSX)
 #include "ui/base/ime/mac/input_method_mac.h"
-#elif defined(OS_FUCHSIA)
-#include "ui/base/ime/fuchsia/input_method_fuchsia.h"
-#elif defined(USE_AURA) && (defined(USE_X11) || defined(USE_OZONE))
+#elif defined(USE_X11)
 #include "ui/base/ime/linux/input_method_auralinux.h"
+#elif defined(USE_OZONE)
+#include "ui/ozone/public/ozone_platform.h"
 #else
 #include "ui/base/ime/input_method_minimal.h"
 #endif
@@ -57,9 +55,7 @@
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kHeadless))
     return base::WrapUnique(new MockInputMethod(delegate));
 
-#if defined(OS_CHROMEOS)
-  return std::make_unique<InputMethodChromeOS>(delegate);
-#elif defined(OS_WIN)
+#if defined(OS_WIN)
   if (base::FeatureList::IsEnabled(features::kTSFImeSupport) &&
       base::win::GetVersion() >= base::win::Version::WIN10_RS3) {
     return std::make_unique<InputMethodWinTSF>(delegate, widget);
@@ -67,10 +63,10 @@
   return std::make_unique<InputMethodWinImm32>(delegate, widget);
 #elif defined(OS_MACOSX)
   return std::make_unique<InputMethodMac>(delegate);
-#elif defined(OS_FUCHSIA)
-  return std::make_unique<InputMethodFuchsia>(delegate);
-#elif defined(USE_AURA) && (defined(USE_X11) || defined(USE_OZONE))
+#elif defined(USE_X11)
   return std::make_unique<InputMethodAuraLinux>(delegate);
+#elif defined(USE_OZONE)
+  return ui::OzonePlatform::GetInstance()->CreateInputMethod(delegate);
 #else
   return std::make_unique<InputMethodMinimal>(delegate);
 #endif
diff --git a/ui/ozone/BUILD.gn b/ui/ozone/BUILD.gn
index 6edc889..daa2f76 100644
--- a/ui/ozone/BUILD.gn
+++ b/ui/ozone/BUILD.gn
@@ -132,6 +132,7 @@
     "//ui/ozone/common/*",
     "//ui/ozone/public/interfaces",
     "//ui/ozone/platform/*",
+    "//ui/base/ime/chromeos/*",
   ]
 
   # Out of tree platforms can depend on this.
diff --git a/ui/ozone/platform/cast/BUILD.gn b/ui/ozone/platform/cast/BUILD.gn
index ade393a..9940dee 100644
--- a/ui/ozone/platform/cast/BUILD.gn
+++ b/ui/ozone/platform/cast/BUILD.gn
@@ -43,6 +43,7 @@
     "//chromecast:chromecast_buildflags",
     "//chromecast/base:base",
     "//chromecast/graphics:libcast_graphics_1.0",
+    "//ui/base/ime",
     "//ui/events/ozone:events_ozone",
     "//ui/events/ozone:events_ozone_evdev",
     "//ui/events/ozone:events_ozone_layout",
diff --git a/ui/ozone/platform/cast/ozone_platform_cast.cc b/ui/ozone/platform/cast/ozone_platform_cast.cc
index 5eca91a..fc04766 100644
--- a/ui/ozone/platform/cast/ozone_platform_cast.cc
+++ b/ui/ozone/platform/cast/ozone_platform_cast.cc
@@ -14,6 +14,7 @@
 #include "chromecast/chromecast_buildflags.h"
 #include "chromecast/public/cast_egl_platform.h"
 #include "chromecast/public/cast_egl_platform_shlib.h"
+#include "ui/base/ime/input_method_minimal.h"
 #include "ui/display/types/native_display_delegate.h"
 #include "ui/events/ozone/device/device_manager.h"
 #include "ui/events/ozone/evdev/event_factory_evdev.h"
@@ -103,6 +104,11 @@
     // On Cast platform the display is initialized by low-level non-Ozone code.
     return nullptr;
   }
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+    return std::make_unique<InputMethodMinimal>(delegate);
+  }
+
   bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
                                      gfx::BufferUsage usage) const override {
     return format == gfx::BufferFormat::BGRA_8888 &&
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn
index 55e26c2..c195b2d 100644
--- a/ui/ozone/platform/drm/BUILD.gn
+++ b/ui/ozone/platform/drm/BUILD.gn
@@ -134,6 +134,7 @@
     "//third_party/libsync",
     "//third_party/minigbm",
     "//ui/base",
+    "//ui/base/ime",
     "//ui/display",
     "//ui/display/types",
     "//ui/display/util",
@@ -154,6 +155,10 @@
     "//ui/platform_window",
   ]
 
+  if (is_chromeos) {
+    deps += [ "//ui/base/ime/chromeos" ]
+  }
+
   if (enable_vulkan) {
     sources += [
       "gpu/vulkan_implementation_gbm.cc",
@@ -195,6 +200,7 @@
     "//build/config/linux/libdrm",
     "//skia",
     "//testing/gtest",
+    "//ui/base/ime",
     "//ui/gfx",
     "//ui/ozone:platform",
     "//ui/ozone/common",
diff --git a/ui/ozone/platform/drm/ozone_platform_gbm.cc b/ui/ozone/platform/drm/ozone_platform_gbm.cc
index d762d447..5b40dfc 100644
--- a/ui/ozone/platform/drm/ozone_platform_gbm.cc
+++ b/ui/ozone/platform/drm/ozone_platform_gbm.cc
@@ -57,6 +57,12 @@
 #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
 #endif
 
+#if defined(OS_CHROMEOS)
+#include "ui/base/ime/chromeos/input_method_chromeos.h"
+#else
+#include "ui/base/ime/input_method_minimal.h"
+#endif
+
 namespace ui {
 
 namespace {
@@ -155,6 +161,14 @@
       override {
     return std::make_unique<DrmNativeDisplayDelegate>(display_manager_.get());
   }
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+#if defined(OS_CHROMEOS)
+    return std::make_unique<InputMethodChromeOS>(delegate);
+#else
+    return std::make_unique<InputMethodMinimal>(delegate);
+#endif
+  }
 
   bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
                                      gfx::BufferUsage usage) const override {
diff --git a/ui/ozone/platform/headless/BUILD.gn b/ui/ozone/platform/headless/BUILD.gn
index 64198049..635cc8f 100644
--- a/ui/ozone/platform/headless/BUILD.gn
+++ b/ui/ozone/platform/headless/BUILD.gn
@@ -26,6 +26,7 @@
     "//base",
     "//skia",
     "//ui/base",
+    "//ui/base/ime",
     "//ui/events",
     "//ui/events/ozone:events_ozone_layout",
     "//ui/events/platform",
@@ -35,4 +36,8 @@
     "//ui/platform_window",
     "//ui/platform_window/stub",
   ]
+
+  if (is_fuchsia) {
+    deps += [ "//ui/base/ime/fuchsia" ]
+  }
 }
diff --git a/ui/ozone/platform/headless/ozone_platform_headless.cc b/ui/ozone/platform/headless/ozone_platform_headless.cc
index 1bf25803..7a2a1c2 100644
--- a/ui/ozone/platform/headless/ozone_platform_headless.cc
+++ b/ui/ozone/platform/headless/ozone_platform_headless.cc
@@ -9,7 +9,9 @@
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
+#include "build/build_config.h"
 #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
+#include "ui/base/ime/input_method_minimal.h"
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
 #include "ui/events/platform/platform_event_source.h"
@@ -26,6 +28,10 @@
 #include "ui/ozone/public/system_input_injector.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
+#if defined(OS_FUCHSIA)
+#include "ui/base/ime/fuchsia/input_method_fuchsia.h"
+#endif
+
 namespace ui {
 
 namespace {
@@ -78,6 +84,14 @@
       override {
     return std::make_unique<HeadlessNativeDisplayDelegate>();
   }
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+#if defined(OS_FUCHSIA)
+    return std::make_unique<InputMethodFuchsia>(delegate);
+#else
+    return std::make_unique<InputMethodMinimal>(delegate);
+#endif
+  }
 
   void InitializeUI(const InitParams& params) override {
     window_manager_ = std::make_unique<HeadlessWindowManager>();
diff --git a/ui/ozone/platform/magma/BUILD.gn b/ui/ozone/platform/magma/BUILD.gn
index 6afd9d7..e4873406 100644
--- a/ui/ozone/platform/magma/BUILD.gn
+++ b/ui/ozone/platform/magma/BUILD.gn
@@ -24,6 +24,7 @@
     "//base",
     "//skia",
     "//ui/base",
+    "//ui/base/ime",
     "//ui/display/fake",
     "//ui/events",
     "//ui/events/ozone:events_ozone_layout",
diff --git a/ui/ozone/platform/magma/ozone_platform_magma.cc b/ui/ozone/platform/magma/ozone_platform_magma.cc
index e5b661b..12367d5 100644
--- a/ui/ozone/platform/magma/ozone_platform_magma.cc
+++ b/ui/ozone/platform/magma/ozone_platform_magma.cc
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
+#include "ui/base/ime/input_method_minimal.h"
 #include "ui/display/fake/fake_display_delegate.h"
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
@@ -77,6 +78,10 @@
       override {
     return std::make_unique<display::FakeDisplayDelegate>();
   }
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+    return std::make_unique<InputMethodMinimal>(delegate);
+  }
 
   void InitializeUI(const InitParams& params) override {
     window_manager_ = std::make_unique<MagmaWindowManager>();
diff --git a/ui/ozone/platform/scenic/BUILD.gn b/ui/ozone/platform/scenic/BUILD.gn
index 59d1d8ae..39e7355 100644
--- a/ui/ozone/platform/scenic/BUILD.gn
+++ b/ui/ozone/platform/scenic/BUILD.gn
@@ -53,6 +53,7 @@
     "//third_party/fuchsia-sdk/sdk:ui_gfx",
     "//third_party/fuchsia-sdk/sdk:ui_scenic",
     "//ui/base",
+    "//ui/base/ime/fuchsia",
     "//ui/display/fake",
     "//ui/events:dom_keycode_converter",
     "//ui/events/ozone:events_ozone_layout",
diff --git a/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
index 237f106..45e47d3 100644
--- a/ui/ozone/platform/scenic/ozone_platform_scenic.cc
+++ b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -13,6 +13,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop_current.h"
 #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
+#include "ui/base/ime/fuchsia/input_method_fuchsia.h"
 #include "ui/display/fake/fake_display_delegate.h"
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
@@ -112,6 +113,11 @@
     return window_manager_->CreateScreen();
   }
 
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+    return std::make_unique<InputMethodFuchsia>(delegate);
+  }
+
   void InitializeUI(const InitParams& params) override {
     if (!PlatformEventSource::GetInstance())
       platform_event_source_ = std::make_unique<ScenicPlatformEventSource>();
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 17bb667..0e442dd 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -13,6 +13,7 @@
 #include "base/memory/ptr_util.h"
 #include "ui/base/buildflags.h"
 #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
+#include "ui/base/ime/linux/input_method_auralinux.h"
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/gfx/linux/client_native_pixmap_dmabuf.h"
 #include "ui/ozone/common/stub_overlay_manager.h"
@@ -97,16 +98,6 @@
   std::unique_ptr<PlatformWindow> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
-    // Some unit tests may try to set custom input method context factory
-    // after InitializeUI. Thus instead of creating factory in InitializeUI
-    // it is set at this point if none exists
-    if (!LinuxInputMethodContextFactory::instance() &&
-        !input_method_context_factory_) {
-      auto* factory = new WaylandInputMethodContextFactory(connection_.get());
-      input_method_context_factory_.reset(factory);
-      LinuxInputMethodContextFactory::SetInstance(factory);
-    }
-
     auto window = std::make_unique<WaylandWindow>(delegate, connection_.get());
     if (!window->Initialize(std::move(properties)))
       return nullptr;
@@ -131,6 +122,21 @@
     return connection_->clipboard();
   }
 
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+    // Some unit tests may try to set custom input method context factory
+    // after InitializeUI. Thus instead of creating factory in InitializeUI
+    // it is set at this point if none exists
+    if (!LinuxInputMethodContextFactory::instance() &&
+        !input_method_context_factory_) {
+      auto* factory = new WaylandInputMethodContextFactory(connection_.get());
+      input_method_context_factory_.reset(factory);
+      LinuxInputMethodContextFactory::SetInstance(factory);
+    }
+
+    return std::make_unique<InputMethodAuraLinux>(delegate);
+  }
+
   bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
                                      gfx::BufferUsage usage) const override {
     // If there is no drm render node device available, native pixmaps are not
diff --git a/ui/ozone/platform/windows/ozone_platform_windows.cc b/ui/ozone/platform/windows/ozone_platform_windows.cc
index 5d7a8e746..702dcb9 100644
--- a/ui/ozone/platform/windows/ozone_platform_windows.cc
+++ b/ui/ozone/platform/windows/ozone_platform_windows.cc
@@ -76,6 +76,11 @@
       override {
     return std::make_unique<display::FakeDisplayDelegate>();
   }
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+    NOTREACHED();
+    return nullptr;
+  }
 
   void InitializeUI(const InitParams& params) override {
     window_manager_ = std::make_unique<WindowsWindowManager>();
diff --git a/ui/ozone/platform/x11/BUILD.gn b/ui/ozone/platform/x11/BUILD.gn
index 07ee634..42637c3 100644
--- a/ui/ozone/platform/x11/BUILD.gn
+++ b/ui/ozone/platform/x11/BUILD.gn
@@ -41,6 +41,7 @@
     "//gpu/vulkan:buildflags",
     "//skia",
     "//ui/base",
+    "//ui/base/ime",
     "//ui/base/x",
     "//ui/display/fake",
     "//ui/events",
@@ -59,6 +60,10 @@
     "//ui/platform_window/x11",
   ]
 
+  if (is_chromeos) {
+    deps += [ "//ui/base/ime/chromeos" ]
+  }
+
   if (enable_vulkan) {
     deps += [ "//gpu/vulkan/x" ]
   }
diff --git a/ui/ozone/platform/x11/ozone_platform_x11.cc b/ui/ozone/platform/x11/ozone_platform_x11.cc
index 3a65ca6..e5f7197f 100644
--- a/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -28,6 +28,12 @@
 #include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
+#if defined(OS_CHROMEOS)
+#include "ui/base/ime/chromeos/input_method_chromeos.h"
+#else
+#include "ui/base/ime/input_method_minimal.h"
+#endif
+
 namespace ui {
 
 namespace {
@@ -87,6 +93,17 @@
     return clipboard_.get();
   }
 
+  std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) override {
+#if defined(OS_CHROMEOS)
+    return std::make_unique<InputMethodChromeOS>(delegate);
+#else
+    // TODO(spang): Fix InputMethodAuraLinux which requires another level
+    // of initization.
+    return std::make_unique<InputMethodMinimal>(delegate);
+#endif
+  }
+
   void InitializeUI(const InitParams& params) override {
     InitializeCommon(params);
     CreatePlatformEventSource();
diff --git a/ui/ozone/public/ozone_platform.h b/ui/ozone/public/ozone_platform.h
index 67d1357..fc22f54 100644
--- a/ui/ozone/public/ozone_platform.h
+++ b/ui/ozone/public/ozone_platform.h
@@ -40,6 +40,11 @@
 class SystemInputInjector;
 class PlatformClipboard;
 
+namespace internal {
+class InputMethodDelegate;
+}  // namespace internal
+class InputMethod;
+
 struct PlatformWindowInitProperties;
 
 // Base class for Ozone platform implementations.
@@ -155,6 +160,8 @@
   CreateNativeDisplayDelegate() = 0;
   virtual std::unique_ptr<PlatformScreen> CreateScreen();
   virtual PlatformClipboard* GetPlatformClipboard();
+  virtual std::unique_ptr<InputMethod> CreateInputMethod(
+      internal::InputMethodDelegate* delegate) = 0;
 
   // Returns true if the specified buffer format is supported.
   virtual bool IsNativePixmapConfigSupported(gfx::BufferFormat format,