diff --git a/engine/src/flutter/shell/platform/windows/flutter_windows_view.cc b/engine/src/flutter/shell/platform/windows/flutter_windows_view.cc index 72c9dd2216..531a817d8a 100644 --- a/engine/src/flutter/shell/platform/windows/flutter_windows_view.cc +++ b/engine/src/flutter/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) { + [engine = engine_, view_id = view_id_, key, scancode, action, character, + extended, was_down, callback = std::move(callback)](bool handled) { if (!handled) { - engine_->text_input_plugin()->KeyboardHook( + engine->text_input_plugin()->KeyboardHook( key, scancode, action, character, extended, was_down); } - callback(handled); + if (engine->view(view_id)) { + callback(handled); + } }); } diff --git a/engine/src/flutter/shell/platform/windows/flutter_windows_view_unittests.cc b/engine/src/flutter/shell/platform/windows/flutter_windows_view_unittests.cc index 61ae1b61ca..484dd910e8 100644 --- a/engine/src/flutter/shell/platform/windows/flutter_windows_view_unittests.cc +++ b/engine/src/flutter/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());