Skip to content

UWP: Pressing ctrl key causes a native exception #82440

@clarkezone

Description

@clarkezone

@cbracken @gspencergoog

If you run a basic flutter app using the UWP embedder and press the ctrl key, the app blows up. Keyboard handling isn't fully baked yet but this issue appears to be newly introduced. Comparing the key values sent from UWP embedding and win32 embedding, the difference is as follows:

FlutterWindowWin32::OnKey sends:
key: 162
scancode: 29
action: 256
character: 0
extended: false
wasdown: false

to the engine where as

FlutterWindowWinUWP::OnKeyDown sends:
key: 17
scancode: 29
action: 256
character: 0
extended: false
wasdown: false

The result is malformed XML passed back on the platform channel which causes things to blow up. Even though there is a problem with the payload, seems like the XML parser should be hardened to not blow up (a related case where this seems bad is if a key is held during app launch which repro's in current win32 embedder on windows).

I tried hacking around this by

if (key == 17) { key = 162; }

But that didn't fix it suggesting there is other state / machinery at work here that hasn't been implemented in UWP text input handling yet.

Steps to Reproduce

Ensure you are right at the tip of flutter framework, master

  1. Clone the flutter_runner project from here: https://github.com/clarkezone/runner-uwp.git
  2. Switch to dev branch git checkout dev
  3. cd src
  4. flutter run -d winuwp
  5. when prompted, press y to launch app
  6. once app launches, press and release the ctrl key

Expected results:
Pressing control and releasing it does nothing

Actual:

logs
flutter_windows_winuwp.dll!rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>::IsObject() Line 1024
	at c:\src\f\engine\src\third_party\rapidjson\include\rapidjson\document.h(1024)
flutter_windows_winuwp.dll!rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>::FindMember<rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>(const rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>> & name) Line 1255
	at c:\src\f\engine\src\third_party\rapidjson\include\rapidjson\document.h(1255)
flutter_windows_winuwp.dll!rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>::operator[]<rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>(const rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>> & name) Line 1135
	at c:\src\f\engine\src\third_party\rapidjson\include\rapidjson\document.h(1135)
flutter_windows_winuwp.dll!rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>::operator[]<const char>(const char * name) Line 1119
	at c:\src\f\engine\src\third_party\rapidjson\include\rapidjson\document.h(1119)
flutter_windows_winuwp.dll!flutter::KeyboardKeyChannelHandler::KeyboardHook::<unnamed-tag>::operator()(const unsigned char * reply, unsigned __int64 reply_size) Line 143
	at c:\src\f\engine\src\flutter\shell\platform\windows\keyboard_key_channel_handler.cc(143)
[External Code]
flutter_windows_winuwp.dll!flutter::BinaryMessengerImpl::Send::<unnamed-tag>::operator()(const unsigned char * data, unsigned __int64 data_size, void * user_data) Line 88
	at c:\src\f\engine\src\flutter\shell\platform\common\client_wrapper\core_implementations.cc(88)
flutter_windows_winuwp.dll!flutter::BinaryMessengerImpl::Send::<unnamed-tag>::__invoke(const unsigned char * data, unsigned __int64 data_size, void * user_data) Line 84
	at c:\src\f\engine\src\flutter\shell\platform\common\client_wrapper\core_implementations.cc(84)
flutter_windows_winuwp.dll!FlutterPlatformMessageCreateResponseHandle::<unnamed-tag>::operator()(const unsigned char * data, unsigned __int64 size) Line 1669
	at c:\src\f\engine\src\flutter\shell\platform\embedder\embedder.cc(1669)
[External Code]
flutter_windows_winuwp.dll!flutter::EmbedderPlatformMessageResponse::Complete::<unnamed-tag>::operator()() Line 29
	at c:\src\f\engine\src\flutter\shell\platform\embedder\embedder_platform_message_response.cc(29)
flutter_windows_winuwp.dll!fml::internal::CopyableLambda<`lambda at ../../flutter/shell/platform/embedder/embedder_platform_message_response.cc:27:25'>::operator()<>() Line 24
	at c:\src\f\engine\src\flutter\fml\make_copyable.h(24)
[External Code]
flutter_windows_winuwp.dll!flutter::EmbedderTaskRunner::PostTask(unsigned __int64 baton) Line 78
	at c:\src\f\engine\src\flutter\shell\platform\embedder\embedder_task_runner.cc(78)
flutter_windows_winuwp.dll!flutter::EmbedderThreadHost::PostTask(__int64 runner, unsigned __int64 task) Line 270
	at c:\src\f\engine\src\flutter\shell\platform\embedder\embedder_thread_host.cc(270)
flutter_windows_winuwp.dll!flutter::EmbedderEngine::RunTask(const FlutterTask * task) Line 260
	at c:\src\f\engine\src\flutter\shell\platform\embedder\embedder_engine.cc(260)
flutter_windows_winuwp.dll!FlutterEngineRunTask(_FlutterEngine * engine, const FlutterTask * task) Line 1928
	at c:\src\f\engine\src\flutter\shell\platform\embedder\embedder.cc(1928)
flutter_windows_winuwp.dll!flutter::FlutterWindowsEngine::FlutterWindowsEngine::<unnamed-tag>::operator()<FlutterTask>(const FlutterTask * task) Line 153
	at c:\src\f\engine\src\flutter\shell\platform\windows\flutter_windows_engine.cc(153)
[External Code]
flutter_windows_winuwp.dll!flutter::TaskRunnerWinUwp::PostFlutterTask::<unnamed-tag>::operator()() Line 41
	at c:\src\f\engine\src\flutter\shell\platform\windows\task_runner_winuwp.cc(41)
flutter_windows_winuwp.dll!winrt::impl::delegate<winrt::Windows::UI::Core::DispatchedHandler,`lambda at ../../flutter/shell/platform/windows/task_runner_winuwp.cc:41:7'>::Invoke() Line 1087
	at c:\src\f\engine\src\third_party\cppwinrt\generated\winrt\Windows.UI.Core.h(1087)
flutter doctor -v
c:\src\f\engine\src>flutter doctor -v
[✓] Flutter (Channel master, 2.3.0-2.0.pre.164, on Microsoft Windows [Version 10.0.19042.928], locale en-US)
    • Flutter version 2.3.0-2.0.pre.164 at C:\src\f\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 79709605ce (5 hours ago), 2021-05-13 04:33:36 -0400
    • Engine revision 08d9bc0fdd
    • Dart version 2.14.0 (build 2.14.0-111.0.dev)

[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.


[✓] Chrome - develop for the web
    • Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[✓] Visual Studio - develop for Windows (Visual Studio Community 2019 16.9.4)
    • Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
    • Visual Studio Community 2019 version 16.9.31205.134
    • Windows 10 SDK version 10.0.19041.0

[!] Android Studio (not installed)
    • Android Studio not found; download from https://developer.android.com/studio/index.html
      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).

[✓] VS Code (version 1.56.1)
    • VS Code at C:\Users\james\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.22.0

[✓] Connected device (4 available)
    • Windows (desktop)       • windows • windows-x64     • Microsoft Windows [Version 10.0.19042.928]
    • Windows (UWP) (desktop) • winuwp  • windows-uwp-x64 •
    • Chrome (web)            • chrome  • web-javascript  • Google Chrome 89.0.4389.90
    • Edge (web)              • edge    • web-javascript  • Microsoft Edge 90.0.818.56`

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Important issues not at the top of the work listplatform-windowsBuilding on or for Windows specifically

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions