From 0aa006102ecbaf23b49d96014e7996e4d3ce7d84 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Thu, 10 Mar 2022 09:59:24 -0800 Subject: [PATCH] Add a message when a key response takes too long. (flutter/engine#31945) This splits the nested event loop in the keyboard manager on iOS into two parts: The first times out after 2 seconds, and if that happens, prints an NSLog indicating that the framework took a long time to respond, and then it enters the event loop again, waiting forever this time. This means the behavior doesn't change from what it is now, but will log when things take a long time. --- .../ios/framework/Source/FlutterKeyboardManager.mm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardManager.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardManager.mm index db6aeca077b..d75e06536c2 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardManager.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardManager.mm @@ -7,6 +7,7 @@ #include "flutter/fml/platform/darwin/message_loop_darwin.h" static constexpr CFTimeInterval kDistantFuture = 1.0e10; +static constexpr CFTimeInterval kReasonableInterval = 2.0; @interface FlutterKeyboardManager () @@ -114,7 +115,14 @@ static constexpr CFTimeInterval kDistantFuture = 1.0e10; // // We need to run in this mode so that UIKit doesn't give us new // events until we are done processing this one. - CFRunLoopRunInMode(fml::MessageLoopDarwin::kMessageLoopCFRunLoopMode, kDistantFuture, NO); + CFRunLoopRunResult result = CFRunLoopRunInMode( + fml::MessageLoopDarwin::kMessageLoopCFRunLoopMode, kReasonableInterval, NO); + if (result == kCFRunLoopRunTimedOut) { + NSLog(@"Flutter framework failed to process a key event in a reasonable time. Continuing " + @"to wait."); + CFRunLoopRunInMode(fml::MessageLoopDarwin::kMessageLoopCFRunLoopMode, kDistantFuture, NO); + NSLog(@"Flutter framework finally responded. Exiting nested event loop."); + } break; } case UIPressPhaseChanged: