diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm index e8e54c6cd3f..ddebb029c99 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm @@ -530,6 +530,11 @@ flutter::SemanticsAction GetSemanticsActionForScrollDirection( if ([self node].HasFlag(flutter::SemanticsFlags::kIsLink)) { traits |= UIAccessibilityTraitLink; } + if (traits == UIAccessibilityTraitNone && ![self hasChildren] && + [[self accessibilityLabel] length] != 0 && + ![self node].HasFlag(flutter::SemanticsFlags::kIsTextField)) { + traits = UIAccessibilityTraitStaticText; + } return traits; } diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm index 283a8fbbd50..b03144a5f3a 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm @@ -89,6 +89,54 @@ class MockAccessibilityBridge : public AccessibilityBridgeIos { XCTAssertEqualObjects(parent.children, @[ child2 ]); } +- (void)testPlainSemanticsObjectWithLabelHasStaticTextTrait { + fml::WeakPtrFactory factory( + new flutter::MockAccessibilityBridge()); + fml::WeakPtr bridge = factory.GetWeakPtr(); + flutter::SemanticsNode node; + node.label = "foo"; + FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0]; + [object setSemanticsNode:&node]; + XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitStaticText); +} + +- (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait { + fml::WeakPtrFactory factory( + new flutter::MockAccessibilityBridge()); + fml::WeakPtr bridge = factory.GetWeakPtr(); + flutter::SemanticsNode node; + node.label = "foo"; + FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0]; + SemanticsObject* child1 = [[SemanticsObject alloc] initWithBridge:bridge uid:1]; + object.children = @[ child1 ]; + [object setSemanticsNode:&node]; + XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitNone); +} + +- (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait1 { + fml::WeakPtrFactory factory( + new flutter::MockAccessibilityBridge()); + fml::WeakPtr bridge = factory.GetWeakPtr(); + flutter::SemanticsNode node; + node.label = "foo"; + node.flags = static_cast(flutter::SemanticsFlags::kIsTextField); + FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0]; + [object setSemanticsNode:&node]; + XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitNone); +} + +- (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait2 { + fml::WeakPtrFactory factory( + new flutter::MockAccessibilityBridge()); + fml::WeakPtr bridge = factory.GetWeakPtr(); + flutter::SemanticsNode node; + node.label = "foo"; + node.flags = static_cast(flutter::SemanticsFlags::kIsButton); + FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0]; + [object setSemanticsNode:&node]; + XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitButton); +} + - (void)testShouldTriggerAnnouncement { fml::WeakPtrFactory factory( new flutter::MockAccessibilityBridge());