diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm index e8e54c6cd3f8d..ddebb029c9958 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm @@ -530,6 +530,11 @@ - (UIAccessibilityTraits)accessibilityTraits { 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/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm index 283a8fbbd508c..b03144a5f3a40 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm @@ -89,6 +89,54 @@ - (void)testReplaceChildAtIndex { 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());