diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index ca7feb93fd..8d35ef97ff 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -67,7 +67,6 @@ AccessibilityBridge::AccessibilityBridge( AccessibilityBridge::~AccessibilityBridge() { [accessibility_channel_ setMessageHandler:nil]; clearState(); - view_controller_.viewIfLoaded.accessibilityElements = nil; } UIView* AccessibilityBridge::textInputView() { @@ -382,6 +381,7 @@ void AccessibilityBridge::clearState() { [objects_ removeAllObjects]; previous_route_id_ = 0; previous_routes_.clear(); + view_controller_.viewIfLoaded.accessibilityElements = nil; } } // namespace flutter diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm index 8f372f579f..39edc77869 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm @@ -2364,4 +2364,41 @@ fml::RefPtr CreateNewThread(const std::string& name) { latch.Wait(); } +- (void)testResetsAccessibilityElementsOnHotRestart { + flutter::MockDelegate mock_delegate; + auto thread = std::make_unique("AccessibilityBridgeTest"); + auto thread_task_runner = thread->GetTaskRunner(); + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/thread_task_runner, + /*raster=*/thread_task_runner, + /*ui=*/thread_task_runner, + /*io=*/thread_task_runner); + id mockFlutterView = OCMClassMock([FlutterView class]); + id mockFlutterViewController = OCMClassMock([FlutterViewController class]); + OCMStub([mockFlutterViewController viewIfLoaded]).andReturn(mockFlutterView); + + fml::AutoResetWaitableEvent latch; + thread_task_runner->PostTask([&] { + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/mock_delegate.settings_.enable_impeller + ? flutter::IOSRenderingAPI::kMetal + : flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/nil, + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_sync_switch=*/std::make_shared()); + + platform_view->SetOwnerViewController(mockFlutterViewController); + platform_view->SetSemanticsEnabled(true); + + OCMExpect([mockFlutterView setAccessibilityElements:[OCMArg isNil]]); + platform_view->OnPreEngineRestart(); + OCMVerifyAll(mockFlutterView); + + latch.Signal(); + }); + latch.Wait(); +} + @end