diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index 72c9dd2216087..4c4fb56128f2d 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -536,12 +536,15 @@ void FlutterWindowsView::SendKey(int key, KeyEventCallback callback) { engine_->keyboard_key_handler()->KeyboardHook( key, scancode, action, character, extended, was_down, - [=, callback = std::move(callback)](bool handled) { - if (!handled) { - engine_->text_input_plugin()->KeyboardHook( - key, scancode, action, character, extended, was_down); + [=, engine = engine_, view_id = view_id_, + callback = std::move(callback)](bool handled) { + if (engine->view(view_id)) { + if (!handled) { + engine->text_input_plugin()->KeyboardHook( + key, scancode, action, character, extended, was_down); + } + callback(handled); } - callback(handled); }); } diff --git a/shell/platform/windows/flutter_windows_view_unittests.cc b/shell/platform/windows/flutter_windows_view_unittests.cc index 61ae1b61ca266..484dd910e8294 100644 --- a/shell/platform/windows/flutter_windows_view_unittests.cc +++ b/shell/platform/windows/flutter_windows_view_unittests.cc @@ -306,6 +306,35 @@ TEST(FlutterWindowsViewTest, KeySequence) { key_event_logs.clear(); } +TEST(FlutterWindowsViewTest, KeyEventCallback) { + std::unique_ptr engine = GetTestEngine(); + + std::unique_ptr view = engine->CreateView( + std::make_unique>()); + + class MockCallback { + public: + MOCK_METHOD(void, Call, ()); + }; + + NiceMock callback_with_valid_view; + NiceMock callback_with_invalid_view; + + auto trigger_key_event = [&](NiceMock& callback) { + view->OnKey(kVirtualKeyA, kScanCodeKeyA, WM_KEYDOWN, 'a', false, false, + [&](bool) { callback.Call(); }); + }; + + EXPECT_CALL(callback_with_valid_view, Call()).Times(1); + EXPECT_CALL(callback_with_invalid_view, Call()).Times(0); + + trigger_key_event(callback_with_valid_view); + engine->RemoveView(view->view_id()); + trigger_key_event(callback_with_invalid_view); + + key_event_logs.clear(); +} + TEST(FlutterWindowsViewTest, EnableSemantics) { std::unique_ptr engine = GetTestEngine(); EngineModifier modifier(engine.get());