[Win32, Keyboard] TextInputPlugin is no longer a KeyboardHandlerBase (#30456)

* Impl

* format

* Comment
diff --git a/shell/platform/windows/flutter_window_win32_unittests.cc b/shell/platform/windows/flutter_window_win32_unittests.cc
index 1b4a77f..a35e10d 100644
--- a/shell/platform/windows/flutter_window_win32_unittests.cc
+++ b/shell/platform/windows/flutter_window_win32_unittests.cc
@@ -35,17 +35,13 @@
 class SpyKeyboardKeyHandler : public KeyboardHandlerBase {
  public:
   SpyKeyboardKeyHandler(flutter::BinaryMessenger* messenger,
-                        KeyboardKeyHandler::EventDispatcher redispatch_event) {
-    real_implementation_ =
-        std::make_unique<KeyboardKeyHandler>(redispatch_event);
+                        KeyboardKeyHandler::EventDispatcher dispatch_event) {
+    real_implementation_ = std::make_unique<KeyboardKeyHandler>(dispatch_event);
     real_implementation_->AddDelegate(
         std::make_unique<KeyboardKeyChannelHandler>(messenger));
     ON_CALL(*this, KeyboardHook(_, _, _, _, _, _))
         .WillByDefault(Invoke(real_implementation_.get(),
                               &KeyboardKeyHandler::KeyboardHook));
-    ON_CALL(*this, TextHook(_))
-        .WillByDefault(
-            Invoke(real_implementation_.get(), &KeyboardKeyHandler::TextHook));
   }
 
   MOCK_METHOD6(KeyboardHook,
@@ -55,7 +51,6 @@
                     char32_t character,
                     bool extended,
                     bool was_down));
-  MOCK_METHOD1(TextHook, void(const std::u16string& text));
   MOCK_METHOD0(ComposeBeginHook, void());
   MOCK_METHOD0(ComposeCommitHook, void());
   MOCK_METHOD0(ComposeEndHook, void());
@@ -68,10 +63,11 @@
 
 // A text input plugin that can be spied on while it forwards calls to the real
 // text input plugin.
-class SpyTextInputPlugin : public KeyboardHandlerBase,
+class SpyTextInputPlugin : public TextInputPlugin,
                            public TextInputPluginDelegate {
  public:
-  SpyTextInputPlugin(flutter::BinaryMessenger* messenger) {
+  SpyTextInputPlugin(flutter::BinaryMessenger* messenger)
+      : TextInputPlugin(messenger, this) {
     real_implementation_ = std::make_unique<TextInputPlugin>(messenger, this);
     ON_CALL(*this, KeyboardHook(_, _, _, _, _, _))
         .WillByDefault(
@@ -82,7 +78,7 @@
   }
 
   MOCK_METHOD6(KeyboardHook,
-               bool(int key,
+               void(int key,
                     int scancode,
                     int action,
                     char32_t character,
@@ -246,7 +242,7 @@
   }
 
  protected:
-  void RegisterKeyboardHandlers(
+  std::unique_ptr<KeyboardHandlerBase> CreateKeyboardKeyHandler(
       flutter::BinaryMessenger* messenger,
       flutter::KeyboardKeyHandler::EventDispatcher dispatch_event,
       flutter::KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state)
@@ -255,12 +251,16 @@
         messenger, [this](UINT cInputs, LPINPUT pInputs, int cbSize) -> UINT {
           return this->SendInput(cInputs, pInputs, cbSize);
         });
-    auto spy_text_input_plugin =
-        std::make_unique<SpyTextInputPlugin>(messenger);
     key_event_handler = spy_key_event_handler.get();
-    text_input_plugin = spy_text_input_plugin.get();
-    AddKeyboardHandler(std::move(spy_key_event_handler));
-    AddKeyboardHandler(std::move(spy_text_input_plugin));
+    return spy_key_event_handler;
+  }
+
+  std::unique_ptr<TextInputPlugin> CreateTextInputPlugin(
+      flutter::BinaryMessenger* messenger) override {
+    auto spy_key_event_handler =
+        std::make_unique<SpyTextInputPlugin>(messenger);
+    text_input_plugin = spy_key_event_handler.get();
+    return spy_key_event_handler;
   }
 
  private:
@@ -357,7 +357,6 @@
                 KeyboardHook(_, _, _, _, _, _))
         .Times(1)
         .RetiresOnSaturation();
-    EXPECT_CALL(*flutter_windows_view.key_event_handler, TextHook(_)).Times(0);
     EXPECT_CALL(*flutter_windows_view.text_input_plugin, TextHook(_)).Times(0);
     win32window.InjectMessages(1,
                                Win32Message{WM_KEYDOWN, virtual_key, lparam});
@@ -410,7 +409,6 @@
                 KeyboardHook(_, _, _, _, _, _))
         .Times(1)
         .RetiresOnSaturation();
-    EXPECT_CALL(*flutter_windows_view.key_event_handler, TextHook(_)).Times(0);
     EXPECT_CALL(*flutter_windows_view.text_input_plugin, TextHook(_)).Times(0);
     win32window.InjectMessages(
         1, Win32Message{WM_SYSKEYDOWN, virtual_key, lparam, kWmResultDefault});
@@ -436,7 +434,7 @@
 // differ from non-printable characters in that they follow a different code
 // path in the WndProc (HandleMessage), producing a follow-on WM_CHAR event.
 TEST(FlutterWindowWin32Test, CharKeyDownPropagation) {
-  // ::testing::InSequence in_sequence;
+  ::testing::InSequence in_sequence;
 
   constexpr WPARAM virtual_key = 65;  // The "A" key, which produces a character
   constexpr WPARAM scan_code = 30;
@@ -463,9 +461,6 @@
                 KeyboardHook(_, _, _, _, _, _))
         .Times(1)
         .RetiresOnSaturation();
-    EXPECT_CALL(*flutter_windows_view.key_event_handler, TextHook(_))
-        .Times(1)
-        .RetiresOnSaturation();
     EXPECT_CALL(*flutter_windows_view.text_input_plugin, TextHook(_))
         .Times(1)
         .RetiresOnSaturation();
@@ -485,7 +480,6 @@
     EXPECT_CALL(*flutter_windows_view.text_input_plugin,
                 KeyboardHook(_, _, _, _, _, _))
         .Times(0);
-    EXPECT_CALL(*flutter_windows_view.key_event_handler, TextHook(_)).Times(0);
     EXPECT_CALL(*flutter_windows_view.text_input_plugin, TextHook(_)).Times(0);
     win32window.InjectMessages(2, Win32Message{WM_KEYDOWN, virtual_key, lparam},
                                Win32Message{WM_CHAR, virtual_key, lparam});
@@ -521,7 +515,6 @@
                 KeyboardHook(_, _, _, _, _, _))
         .Times(1)
         .RetiresOnSaturation();
-    EXPECT_CALL(*flutter_windows_view.key_event_handler, TextHook(_)).Times(0);
     EXPECT_CALL(*flutter_windows_view.text_input_plugin, TextHook(_)).Times(0);
     EXPECT_EQ(win32window.InjectWindowMessage(WM_KEYDOWN, virtual_key, lparam),
               0);
diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc
index 6aeb948..e4fe3b2 100644
--- a/shell/platform/windows/flutter_windows_view.cc
+++ b/shell/platform/windows/flutter_windows_view.cc
@@ -52,14 +52,14 @@
   engine_->SetView(this);
 
   internal_plugin_registrar_ =
-      std::make_unique<flutter::PluginRegistrar>(engine_->GetRegistrar());
+      std::make_unique<PluginRegistrar>(engine_->GetRegistrar());
 
   // Set up the system channel handlers.
   auto internal_plugin_messenger = internal_plugin_registrar_->messenger();
   InitializeKeyboard();
   platform_handler_ = PlatformHandler::Create(internal_plugin_messenger, this);
-  cursor_handler_ = std::make_unique<flutter::CursorHandler>(
-      internal_plugin_messenger, binding_handler_.get());
+  cursor_handler_ = std::make_unique<CursorHandler>(internal_plugin_messenger,
+                                                    binding_handler_.get());
 
   PhysicalWindowBounds bounds = binding_handler_->GetPhysicalWindowBounds();
 
@@ -67,10 +67,11 @@
                     binding_handler_->GetDpiScale());
 }
 
-void FlutterWindowsView::RegisterKeyboardHandlers(
-    flutter::BinaryMessenger* messenger,
-    flutter::KeyboardKeyHandler::EventDispatcher dispatch_event,
-    flutter::KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state) {
+std::unique_ptr<KeyboardHandlerBase>
+FlutterWindowsView::CreateKeyboardKeyHandler(
+    BinaryMessenger* messenger,
+    KeyboardKeyHandler::EventDispatcher dispatch_event,
+    KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state) {
   // There must be only one handler that receives |SendInput|, i.e. only one
   // handler that might redispatch events. (See the documentation of
   // |KeyboardKeyHandler| to learn about redispatching.)
@@ -79,24 +80,23 @@
   // of the event. In order to allow the same real event in the future, the
   // handler is "toggled" when events pass through, therefore the redispatching
   // algorithm does not allow more than 1 handler that takes |SendInput|.
-  auto key_handler =
-      std::make_unique<flutter::KeyboardKeyHandler>(dispatch_event);
-  key_handler->AddDelegate(std::make_unique<KeyboardKeyEmbedderHandler>(
-      [this](const FlutterKeyEvent& event, FlutterKeyEventCallback callback,
-             void* user_data) {
-        return engine_->SendKeyEvent(event, callback, user_data);
-      },
-      get_key_state));
-  key_handler->AddDelegate(
+  auto keyboard_key_handler =
+      std::make_unique<KeyboardKeyHandler>(dispatch_event);
+  keyboard_key_handler->AddDelegate(
+      std::make_unique<KeyboardKeyEmbedderHandler>(
+          [this](const FlutterKeyEvent& event, FlutterKeyEventCallback callback,
+                 void* user_data) {
+            return engine_->SendKeyEvent(event, callback, user_data);
+          },
+          get_key_state));
+  keyboard_key_handler->AddDelegate(
       std::make_unique<KeyboardKeyChannelHandler>(messenger));
-  AddKeyboardHandler(std::move(key_handler));
-  AddKeyboardHandler(
-      std::make_unique<flutter::TextInputPlugin>(messenger, this));
+  return keyboard_key_handler;
 }
 
-void FlutterWindowsView::AddKeyboardHandler(
-    std::unique_ptr<flutter::KeyboardHandlerBase> handler) {
-  keyboard_handlers_.push_back(std::move(handler));
+std::unique_ptr<TextInputPlugin> FlutterWindowsView::CreateTextInputPlugin(
+    BinaryMessenger* messenger) {
+  return std::make_unique<TextInputPlugin>(messenger, this);
 }
 
 uint32_t FlutterWindowsView::GetFrameBufferId(size_t width, size_t height) {
@@ -129,7 +129,6 @@
 }
 
 void FlutterWindowsView::OnPreEngineRestart() {
-  keyboard_handlers_.clear();
   InitializeKeyboard();
 }
 
@@ -268,16 +267,16 @@
 void FlutterWindowsView::InitializeKeyboard() {
   auto internal_plugin_messenger = internal_plugin_registrar_->messenger();
 #ifdef WINUWP
-  flutter::KeyboardKeyHandler::EventDispatcher dispatch_event = nullptr;
-  flutter::KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state =
-      nullptr;
+  KeyboardKeyHandler::EventDispatcher dispatch_event = nullptr;
+  KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state = nullptr;
 #else
-  flutter::KeyboardKeyHandler::EventDispatcher dispatch_event = SendInput;
-  flutter::KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state =
-      GetKeyState;
+  KeyboardKeyHandler::EventDispatcher dispatch_event = SendInput;
+  KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state = GetKeyState;
 #endif
-  RegisterKeyboardHandlers(internal_plugin_messenger, dispatch_event,
-                           get_key_state);
+  keyboard_key_handler_ = std::move(CreateKeyboardKeyHandler(
+      internal_plugin_messenger, dispatch_event, get_key_state));
+  text_input_plugin_ =
+      std::move(CreateTextInputPlugin(internal_plugin_messenger));
 }
 
 // Sends new size  information to FlutterEngine.
@@ -381,9 +380,7 @@
 }
 
 void FlutterWindowsView::SendText(const std::u16string& text) {
-  for (const auto& handler : keyboard_handlers_) {
-    handler->TextHook(text);
-  }
+  text_input_plugin_->TextHook(text);
 }
 
 bool FlutterWindowsView::SendKey(int key,
@@ -392,39 +389,32 @@
                                  char32_t character,
                                  bool extended,
                                  bool was_down) {
-  for (const auto& handler : keyboard_handlers_) {
-    if (handler->KeyboardHook(key, scancode, action, character, extended,
-                              was_down)) {
-      // key event was handled, so don't send to other handlers.
-      return true;
-    }
+  if (keyboard_key_handler_->KeyboardHook(key, scancode, action, character,
+                                          extended, was_down)) {
+    return true;
   }
+
+  text_input_plugin_->KeyboardHook(key, scancode, action, character, extended,
+                                   was_down);
+
   return false;
 }
 
 void FlutterWindowsView::SendComposeBegin() {
-  for (const auto& handler : keyboard_handlers_) {
-    handler->ComposeBeginHook();
-  }
+  text_input_plugin_->ComposeBeginHook();
 }
 
 void FlutterWindowsView::SendComposeCommit() {
-  for (const auto& handler : keyboard_handlers_) {
-    handler->ComposeCommitHook();
-  }
+  text_input_plugin_->ComposeCommitHook();
 }
 
 void FlutterWindowsView::SendComposeEnd() {
-  for (const auto& handler : keyboard_handlers_) {
-    handler->ComposeEndHook();
-  }
+  text_input_plugin_->ComposeEndHook();
 }
 
 void FlutterWindowsView::SendComposeChange(const std::u16string& text,
                                            int cursor_pos) {
-  for (const auto& handler : keyboard_handlers_) {
-    handler->ComposeChangeHook(text, cursor_pos);
-  }
+  text_input_plugin_->ComposeChangeHook(text, cursor_pos);
 }
 
 void FlutterWindowsView::SendScroll(double x,
diff --git a/shell/platform/windows/flutter_windows_view.h b/shell/platform/windows/flutter_windows_view.h
index e9a542c..4a9b9a4 100644
--- a/shell/platform/windows/flutter_windows_view.h
+++ b/shell/platform/windows/flutter_windows_view.h
@@ -22,9 +22,9 @@
 #include "flutter/shell/platform/windows/flutter_windows_engine.h"
 #include "flutter/shell/platform/windows/keyboard_handler_base.h"
 #include "flutter/shell/platform/windows/keyboard_key_embedder_handler.h"
-#include "flutter/shell/platform/windows/keyboard_key_handler.h"
 #include "flutter/shell/platform/windows/platform_handler.h"
 #include "flutter/shell/platform/windows/public/flutter_windows.h"
+#include "flutter/shell/platform/windows/text_input_plugin.h"
 #include "flutter/shell/platform/windows/text_input_plugin_delegate.h"
 #include "flutter/shell/platform/windows/window_binding_handler.h"
 #include "flutter/shell/platform/windows/window_binding_handler_delegate.h"
@@ -171,20 +171,20 @@
   void OnResetImeComposing() override;
 
  protected:
-  // Called to create the keyboard hook handlers.
+  // Called to create keyboard key handler.
   //
   // The provided |dispatch_event| is where to inject events into the system,
   // while |get_key_state| is where to acquire keyboard states. They will be
   // the system APIs in production classes, but might be replaced with mock
   // functions in unit tests.
-  virtual void RegisterKeyboardHandlers(
-      flutter::BinaryMessenger* messenger,
-      flutter::KeyboardKeyHandler::EventDispatcher dispatch_event,
-      flutter::KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state);
+  virtual std::unique_ptr<KeyboardHandlerBase> CreateKeyboardKeyHandler(
+      BinaryMessenger* messenger,
+      KeyboardKeyHandler::EventDispatcher dispatch_event,
+      KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state);
 
-  // Used by RegisterKeyboardHandlers to add a new keyboard hook handler.
-  void AddKeyboardHandler(
-      std::unique_ptr<flutter::KeyboardHandlerBase> handler);
+  // Called to create text input plugin.
+  virtual std::unique_ptr<TextInputPlugin> CreateTextInputPlugin(
+      BinaryMessenger* messenger);
 
  private:
   // Struct holding the state of an individual pointer. The engine doesn't keep
@@ -322,19 +322,22 @@
   std::unordered_map<int32_t, std::unique_ptr<PointerState>> pointer_states_;
 
   // The plugin registrar managing internal plugins.
-  std::unique_ptr<flutter::PluginRegistrar> internal_plugin_registrar_;
+  std::unique_ptr<PluginRegistrar> internal_plugin_registrar_;
 
   // Handlers for keyboard events from Windows.
-  std::vector<std::unique_ptr<flutter::KeyboardHandlerBase>> keyboard_handlers_;
+  std::unique_ptr<KeyboardHandlerBase> keyboard_key_handler_;
+
+  // Handlers for text events from Windows.
+  std::unique_ptr<TextInputPlugin> text_input_plugin_;
 
   // Handler for the flutter/platform channel.
-  std::unique_ptr<flutter::PlatformHandler> platform_handler_;
+  std::unique_ptr<PlatformHandler> platform_handler_;
 
   // Handler for cursor events.
-  std::unique_ptr<flutter::CursorHandler> cursor_handler_;
+  std::unique_ptr<CursorHandler> cursor_handler_;
 
   // Currently configured WindowBindingHandler for view.
-  std::unique_ptr<flutter::WindowBindingHandler> binding_handler_;
+  std::unique_ptr<WindowBindingHandler> binding_handler_;
 
   // Resize events are synchronized using this mutex and the corresponding
   // condition variable.
diff --git a/shell/platform/windows/keyboard_handler_base.h b/shell/platform/windows/keyboard_handler_base.h
index db4e92d..4e7b5c4 100644
--- a/shell/platform/windows/keyboard_handler_base.h
+++ b/shell/platform/windows/keyboard_handler_base.h
@@ -29,35 +29,6 @@
                             char32_t character,
                             bool extended,
                             bool was_down) = 0;
-
-  // A function for hooking into Unicode text input.
-  virtual void TextHook(const std::u16string& text) = 0;
-
-  // Handler for IME compose begin events.
-  //
-  // Triggered when the user begins editing composing text using a multi-step
-  // input method such as in CJK text input.
-  virtual void ComposeBeginHook() = 0;
-
-  // Handler for IME compose commit events.
-  //
-  // Triggered when the user commits the current composing text while using a
-  // multi-step input method such as in CJK text input. Composing continues with
-  // the next keypress.
-  virtual void ComposeCommitHook() = 0;
-
-  // Handler for IME compose end events.
-  //
-  // Triggered when the user ends editing composing text while using a
-  // multi-step input method such as in CJK text input.
-  virtual void ComposeEndHook() = 0;
-
-  // Handler for IME compose change events.
-  //
-  // Triggered when the user edits the composing text while using a multi-step
-  // input method such as in CJK text input.
-  virtual void ComposeChangeHook(const std::u16string& text,
-                                 int cursor_pos) = 0;
 };
 
 }  // namespace flutter
diff --git a/shell/platform/windows/keyboard_key_handler.cc b/shell/platform/windows/keyboard_key_handler.cc
index bb47b21..50e669a 100644
--- a/shell/platform/windows/keyboard_key_handler.cc
+++ b/shell/platform/windows/keyboard_key_handler.cc
@@ -109,8 +109,6 @@
 
 KeyboardKeyHandler::~KeyboardKeyHandler() = default;
 
-void KeyboardKeyHandler::TextHook(const std::u16string& code_point) {}
-
 void KeyboardKeyHandler::AddDelegate(
     std::unique_ptr<KeyboardKeyHandlerDelegate> delegate) {
   delegates_.push_back(std::move(delegate));
@@ -291,23 +289,6 @@
   assert(false);
 }
 
-void KeyboardKeyHandler::ComposeBeginHook() {
-  // Ignore.
-}
-
-void KeyboardKeyHandler::ComposeCommitHook() {
-  // Ignore.
-}
-
-void KeyboardKeyHandler::ComposeEndHook() {
-  // Ignore.
-}
-
-void KeyboardKeyHandler::ComposeChangeHook(const std::u16string& text,
-                                           int cursor_pos) {
-  // Ignore.
-}
-
 uint64_t KeyboardKeyHandler::ComputeEventHash(const PendingEvent& event) {
   // Calculate a key event ID based on the scan code of the key pressed,
   // and the flags we care about.
diff --git a/shell/platform/windows/keyboard_key_handler.h b/shell/platform/windows/keyboard_key_handler.h
index 39de836..0f12178 100644
--- a/shell/platform/windows/keyboard_key_handler.h
+++ b/shell/platform/windows/keyboard_key_handler.h
@@ -96,21 +96,6 @@
                     bool extended,
                     bool was_down) override;
 
-  // |KeyboardHandlerBase|
-  void TextHook(const std::u16string& text) override;
-
-  // |KeyboardHandlerBase|
-  void ComposeBeginHook() override;
-
-  // |KeyboardHandlerBase|
-  void ComposeCommitHook() override;
-
-  // |KeyboardHandlerBase|
-  void ComposeEndHook() override;
-
-  // |KeyboardHandlerBase|
-  void ComposeChangeHook(const std::u16string& text, int cursor_pos) override;
-
  protected:
   size_t RedispatchedCount();
 
diff --git a/shell/platform/windows/keyboard_win32_unittests.cc b/shell/platform/windows/keyboard_win32_unittests.cc
index 2be6885..00e5767 100644
--- a/shell/platform/windows/keyboard_win32_unittests.cc
+++ b/shell/platform/windows/keyboard_win32_unittests.cc
@@ -190,11 +190,11 @@
   }
 
  protected:
-  void RegisterKeyboardHandlers(
+  std::unique_ptr<KeyboardHandlerBase> CreateKeyboardKeyHandler(
       BinaryMessenger* messenger,
       KeyboardKeyHandler::EventDispatcher dispatch_event,
       KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state) override {
-    FlutterWindowsView::RegisterKeyboardHandlers(
+    return FlutterWindowsView::CreateKeyboardKeyHandler(
         messenger,
         [this](UINT cInputs, LPINPUT pInputs, int cbSize) -> UINT {
           return this->SendInput(cInputs, pInputs, cbSize);
diff --git a/shell/platform/windows/text_input_plugin.cc b/shell/platform/windows/text_input_plugin.cc
index 93b538c..15e497e 100644
--- a/shell/platform/windows/text_input_plugin.cc
+++ b/shell/platform/windows/text_input_plugin.cc
@@ -58,14 +58,14 @@
   SendStateUpdate(*active_model_);
 }
 
-bool TextInputPlugin::KeyboardHook(int key,
+void TextInputPlugin::KeyboardHook(int key,
                                    int scancode,
                                    int action,
                                    char32_t character,
                                    bool extended,
                                    bool was_down) {
   if (active_model_ == nullptr) {
-    return false;
+    return;
   }
   if (action == WM_KEYDOWN || action == WM_SYSKEYDOWN) {
     // Most editing keys (arrow keys, backspace, delete, etc.) are handled in
@@ -78,7 +78,6 @@
         break;
     }
   }
-  return false;
 }
 
 TextInputPlugin::TextInputPlugin(flutter::BinaryMessenger* messenger,
diff --git a/shell/platform/windows/text_input_plugin.h b/shell/platform/windows/text_input_plugin.h
index 7b3d487..ad8a131 100644
--- a/shell/platform/windows/text_input_plugin.h
+++ b/shell/platform/windows/text_input_plugin.h
@@ -22,35 +22,29 @@
 // Implements a text input plugin.
 //
 // Specifically handles window events within windows.
-class TextInputPlugin : public KeyboardHandlerBase {
+class TextInputPlugin {
  public:
   explicit TextInputPlugin(flutter::BinaryMessenger* messenger,
                            TextInputPluginDelegate* delegate);
 
   virtual ~TextInputPlugin();
 
-  // |KeyboardHandlerBase|
-  bool KeyboardHook(int key,
-                    int scancode,
-                    int action,
-                    char32_t character,
-                    bool extended,
-                    bool was_down) override;
+  virtual void KeyboardHook(int key,
+                            int scancode,
+                            int action,
+                            char32_t character,
+                            bool extended,
+                            bool was_down);
 
-  // |KeyboardHandlerBase|
-  void TextHook(const std::u16string& text) override;
+  virtual void TextHook(const std::u16string& text);
 
-  // |KeyboardHandlerBase|
-  void ComposeBeginHook() override;
+  virtual void ComposeBeginHook();
 
-  // |KeyboardHandlerBase|
-  void ComposeCommitHook() override;
+  virtual void ComposeCommitHook();
 
-  // |KeyboardHandlerBase|
-  void ComposeEndHook() override;
+  virtual void ComposeEndHook();
 
-  // |KeyboardHandlerBase|
-  void ComposeChangeHook(const std::u16string& text, int cursor_pos) override;
+  virtual void ComposeChangeHook(const std::u16string& text, int cursor_pos);
 
  private:
   // Sends the current state of the given model to the Flutter engine.