diff --git a/shell/platform/common/accessibility_bridge.cc b/shell/platform/common/accessibility_bridge.cc index 8a98f3d724b4c..e6b47d4ae6f86 100644 --- a/shell/platform/common/accessibility_bridge.cc +++ b/shell/platform/common/accessibility_bridge.cc @@ -435,6 +435,12 @@ void AccessibilityBridge::SetBooleanAttributesFromFlutterUpdate( ax::mojom::BoolAttribute::kEditableRoot, flags & FlutterSemanticsFlag::kFlutterSemanticsFlagIsTextField && (flags & FlutterSemanticsFlag::kFlutterSemanticsFlagIsReadOnly) == 0); + // Mark nodes as line breaking so that screen readers don't + // merge all consecutive objects into one. + // TODO(schectman): When should a node have this attribute set? + // https://github.com/flutter/flutter/issues/118184 + node_data.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); } void AccessibilityBridge::SetIntAttributesFromFlutterUpdate( diff --git a/shell/platform/common/accessibility_bridge_unittests.cc b/shell/platform/common/accessibility_bridge_unittests.cc index 0aa078f925f5d..7b5a4924e01c3 100644 --- a/shell/platform/common/accessibility_bridge_unittests.cc +++ b/shell/platform/common/accessibility_bridge_unittests.cc @@ -496,5 +496,24 @@ TEST(AccessibilityBridgeTest, AXTreeManagerTest) { ASSERT_EQ(manager, static_cast(bridge.get())); } +TEST(AccessibilityBridgeTest, LineBreakingObjectTest) { + std::shared_ptr bridge = + std::make_shared(); + + const int32_t root_id = 0; + + FlutterSemanticsNode root = CreateSemanticsNode(root_id, "root", {}); + + bridge->AddFlutterSemanticsNodeUpdate(&root); + bridge->CommitUpdates(); + + auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(root_id).lock(); + auto root_data = root_node->GetData(); + EXPECT_TRUE(root_data.HasBoolAttribute( + ax::mojom::BoolAttribute::kIsLineBreakingObject)); + EXPECT_TRUE(root_data.GetBoolAttribute( + ax::mojom::BoolAttribute::kIsLineBreakingObject)); +} + } // namespace testing } // namespace flutter