Mark nodes as `kIsLineBreakingObject` by default, TODO further distinctions (#38721)

* Line breaks

* Formatting

* Update shell/platform/common/accessibility_bridge.cc

Co-authored-by: Loïc Sharma <737941+loic-sharma@users.noreply.github.com>

* Test line breaking object

* Formatting

* Format

Co-authored-by: Loïc Sharma <737941+loic-sharma@users.noreply.github.com>
diff --git a/shell/platform/common/accessibility_bridge.cc b/shell/platform/common/accessibility_bridge.cc
index 8a98f3d..e6b47d4 100644
--- a/shell/platform/common/accessibility_bridge.cc
+++ b/shell/platform/common/accessibility_bridge.cc
@@ -435,6 +435,12 @@
       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 0aa078f..7b5a492 100644
--- a/shell/platform/common/accessibility_bridge_unittests.cc
+++ b/shell/platform/common/accessibility_bridge_unittests.cc
@@ -496,5 +496,24 @@
   ASSERT_EQ(manager, static_cast<ui::AXTreeManager*>(bridge.get()));
 }
 
+TEST(AccessibilityBridgeTest, LineBreakingObjectTest) {
+  std::shared_ptr<TestAccessibilityBridge> bridge =
+      std::make_shared<TestAccessibilityBridge>();
+
+  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