7 #include "gmock/gmock.h"
8 #include "gtest/gtest.h"
10 #include "flutter/third_party/accessibility/ax/ax_tree_manager_map.h"
16 using ::testing::Contains;
23 const std::vector<int32_t>* children =
nullptr) {
26 .flags__deprecated__ =
static_cast<FlutterSemanticsFlag
>(0),
27 .actions =
static_cast<FlutterSemanticsAction
>(0),
28 .text_selection_base = -1,
29 .text_selection_extent = -1,
33 .increased_value =
"",
34 .decreased_value =
"",
35 .child_count = children ? children->size() : 0,
36 .children_in_traversal_order = children ? children->data() :
nullptr,
37 .custom_accessibility_actions_count = 0,
43 TEST(AccessibilityBridgeTest, BasicTest) {
44 std::shared_ptr<TestAccessibilityBridge> bridge =
45 std::make_shared<TestAccessibilityBridge>();
47 std::vector<int32_t> children{1, 2};
52 bridge->AddFlutterSemanticsNodeUpdate(root);
53 bridge->AddFlutterSemanticsNodeUpdate(child1);
54 bridge->AddFlutterSemanticsNodeUpdate(child2);
55 bridge->CommitUpdates();
57 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
58 auto child1_node = bridge->GetFlutterPlatformNodeDelegateFromID(1).lock();
59 auto child2_node = bridge->GetFlutterPlatformNodeDelegateFromID(2).lock();
60 EXPECT_EQ(root_node->GetChildCount(), 2);
61 EXPECT_EQ(root_node->GetData().child_ids[0], 1);
62 EXPECT_EQ(root_node->GetData().child_ids[1], 2);
63 EXPECT_EQ(root_node->GetName(),
"root");
65 EXPECT_EQ(child1_node->GetChildCount(), 0);
66 EXPECT_EQ(child1_node->GetName(),
"child 1");
68 EXPECT_EQ(child2_node->GetChildCount(), 0);
69 EXPECT_EQ(child2_node->GetName(),
"child 2");
75 TEST(AccessibilityBridgeTest, AccessibilityRootId) {
76 std::shared_ptr<TestAccessibilityBridge> bridge =
77 std::make_shared<TestAccessibilityBridge>();
79 std::vector<int32_t> children{456, 789};
84 bridge->AddFlutterSemanticsNodeUpdate(root);
85 bridge->AddFlutterSemanticsNodeUpdate(child1);
86 bridge->AddFlutterSemanticsNodeUpdate(child2);
87 bridge->CommitUpdates();
89 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(123).lock();
90 auto child1_node = bridge->GetFlutterPlatformNodeDelegateFromID(456).lock();
91 auto child2_node = bridge->GetFlutterPlatformNodeDelegateFromID(789).lock();
92 auto fake_delegate = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
94 EXPECT_EQ(bridge->GetRootAsAXNode()->id(), 123);
95 EXPECT_EQ(bridge->RootDelegate()->GetName(),
"root");
97 EXPECT_EQ(root_node->GetChildCount(), 2);
98 EXPECT_EQ(root_node->GetData().child_ids[0], 456);
99 EXPECT_EQ(root_node->GetData().child_ids[1], 789);
100 EXPECT_EQ(root_node->GetName(),
"root");
102 EXPECT_EQ(child1_node->GetChildCount(), 0);
103 EXPECT_EQ(child1_node->GetName(),
"child 1");
105 EXPECT_EQ(child2_node->GetChildCount(), 0);
106 EXPECT_EQ(child2_node->GetName(),
"child 2");
108 ASSERT_FALSE(fake_delegate);
112 TEST(AccessibilityBridgeTest, AddOrder) {
113 std::shared_ptr<TestAccessibilityBridge> bridge =
114 std::make_shared<TestAccessibilityBridge>();
116 std::vector<int32_t> root_children{34, 56};
117 std::vector<int32_t> child2_children{78};
118 std::vector<int32_t> child3_children{90};
121 FlutterSemanticsNode2 child2 =
123 FlutterSemanticsNode2 child3 =
127 bridge->AddFlutterSemanticsNodeUpdate(child3);
128 bridge->AddFlutterSemanticsNodeUpdate(child2);
129 bridge->AddFlutterSemanticsNodeUpdate(root);
130 bridge->AddFlutterSemanticsNodeUpdate(child1);
131 bridge->AddFlutterSemanticsNodeUpdate(child4);
132 bridge->CommitUpdates();
134 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(12).lock();
135 auto child1_node = bridge->GetFlutterPlatformNodeDelegateFromID(34).lock();
136 auto child2_node = bridge->GetFlutterPlatformNodeDelegateFromID(56).lock();
137 auto child3_node = bridge->GetFlutterPlatformNodeDelegateFromID(78).lock();
138 auto child4_node = bridge->GetFlutterPlatformNodeDelegateFromID(90).lock();
140 EXPECT_EQ(bridge->GetRootAsAXNode()->id(), 12);
141 EXPECT_EQ(bridge->RootDelegate()->GetName(),
"root");
143 EXPECT_EQ(root_node->GetChildCount(), 2);
144 EXPECT_EQ(root_node->GetData().child_ids[0], 34);
145 EXPECT_EQ(root_node->GetData().child_ids[1], 56);
146 EXPECT_EQ(root_node->GetName(),
"root");
148 EXPECT_EQ(child1_node->GetChildCount(), 0);
149 EXPECT_EQ(child1_node->GetName(),
"child 1");
151 EXPECT_EQ(child2_node->GetChildCount(), 1);
152 EXPECT_EQ(child2_node->GetData().child_ids[0], 78);
153 EXPECT_EQ(child2_node->GetName(),
"child 2");
155 EXPECT_EQ(child3_node->GetChildCount(), 1);
156 EXPECT_EQ(child3_node->GetData().child_ids[0], 90);
157 EXPECT_EQ(child3_node->GetName(),
"child 3");
159 EXPECT_EQ(child4_node->GetChildCount(), 0);
160 EXPECT_EQ(child4_node->GetName(),
"child 4");
163 TEST(AccessibilityBridgeTest, CanFireChildrenChangedCorrectly) {
164 std::shared_ptr<TestAccessibilityBridge> bridge =
165 std::make_shared<TestAccessibilityBridge>();
167 std::vector<int32_t> children{1};
171 bridge->AddFlutterSemanticsNodeUpdate(root);
172 bridge->AddFlutterSemanticsNodeUpdate(child1);
174 bridge->CommitUpdates();
176 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
177 auto child1_node = bridge->GetFlutterPlatformNodeDelegateFromID(1).lock();
178 EXPECT_EQ(root_node->GetChildCount(), 1);
179 EXPECT_EQ(root_node->GetData().child_ids[0], 1);
180 EXPECT_EQ(root_node->GetName(),
"root");
182 EXPECT_EQ(child1_node->GetChildCount(), 0);
183 EXPECT_EQ(child1_node->GetName(),
"child 1");
184 bridge->accessibility_events.clear();
187 root.child_count = 2;
188 int32_t new_children[] = {1, 2};
189 root.children_in_traversal_order = new_children;
193 bridge->AddFlutterSemanticsNodeUpdate(root);
194 bridge->AddFlutterSemanticsNodeUpdate(child2);
195 bridge->CommitUpdates();
197 root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
199 EXPECT_EQ(root_node->GetChildCount(), 2);
200 EXPECT_EQ(root_node->GetData().child_ids[0], 1);
201 EXPECT_EQ(root_node->GetData().child_ids[1], 2);
202 EXPECT_EQ(bridge->accessibility_events.size(),
size_t{2});
203 std::set<ui::AXEventGenerator::Event> actual_event{
204 bridge->accessibility_events.begin(), bridge->accessibility_events.end()};
205 EXPECT_THAT(actual_event,
206 Contains(ui::AXEventGenerator::Event::CHILDREN_CHANGED));
207 EXPECT_THAT(actual_event,
208 Contains(ui::AXEventGenerator::Event::SUBTREE_CREATED));
211 TEST(AccessibilityBridgeTest, CanHandleSelectionChangeCorrectly) {
212 std::shared_ptr<TestAccessibilityBridge> bridge =
213 std::make_shared<TestAccessibilityBridge>();
215 auto flags = FlutterSemanticsFlags{
216 .is_focused = FlutterTristate::kFlutterTristateTrue,
217 .is_text_field =
true,
219 root.flags2 = &flags;
221 bridge->AddFlutterSemanticsNodeUpdate(root);
222 bridge->CommitUpdates();
224 const ui::AXTreeData& tree = bridge->GetAXTreeData();
225 EXPECT_EQ(tree.sel_anchor_object_id, ui::AXNode::kInvalidAXID);
226 bridge->accessibility_events.clear();
229 root.text_selection_base = 0;
230 root.text_selection_extent = 5;
231 bridge->AddFlutterSemanticsNodeUpdate(root);
233 bridge->CommitUpdates();
235 EXPECT_EQ(tree.sel_anchor_object_id, 0);
236 EXPECT_EQ(tree.sel_anchor_offset, 0);
237 EXPECT_EQ(tree.sel_focus_object_id, 0);
238 EXPECT_EQ(tree.sel_focus_offset, 5);
239 ASSERT_EQ(bridge->accessibility_events.size(),
size_t{2});
240 EXPECT_EQ(bridge->accessibility_events[0],
241 ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED);
242 EXPECT_EQ(bridge->accessibility_events[1],
243 ui::AXEventGenerator::Event::OTHER_ATTRIBUTE_CHANGED);
246 TEST(AccessibilityBridgeTest, DoesNotAssignEditableRootToSelectableText) {
247 std::shared_ptr<TestAccessibilityBridge> bridge =
248 std::make_shared<TestAccessibilityBridge>();
250 auto flags = FlutterSemanticsFlags{
251 .is_text_field =
true,
252 .is_read_only =
true,
254 root.flags2 = &flags;
256 bridge->AddFlutterSemanticsNodeUpdate(root);
257 bridge->CommitUpdates();
259 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
261 EXPECT_FALSE(root_node->GetData().GetBoolAttribute(
262 ax::mojom::BoolAttribute::kEditableRoot));
265 TEST(AccessibilityBridgeTest, SwitchHasSwitchRole) {
266 std::shared_ptr<TestAccessibilityBridge> bridge =
267 std::make_shared<TestAccessibilityBridge>();
269 auto flags = FlutterSemanticsFlags{
270 .is_enabled = FlutterTristate::kFlutterTristateTrue,
271 .is_toggled = FlutterTristate::kFlutterTristateFalse,
274 root.flags2 = &flags;
275 bridge->AddFlutterSemanticsNodeUpdate(root);
276 bridge->CommitUpdates();
278 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
279 EXPECT_EQ(root_node->GetData().role, ax::mojom::Role::kSwitch);
282 TEST(AccessibilityBridgeTest, SliderHasSliderRole) {
283 std::shared_ptr<TestAccessibilityBridge> bridge =
284 std::make_shared<TestAccessibilityBridge>();
286 auto flags = FlutterSemanticsFlags{
287 .is_enabled = FlutterTristate::kFlutterTristateTrue,
288 .is_focused = FlutterTristate::kFlutterTristateFalse,
292 root.flags2 = &flags;
294 bridge->AddFlutterSemanticsNodeUpdate(root);
295 bridge->CommitUpdates();
297 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
298 EXPECT_EQ(root_node->GetData().role, ax::mojom::Role::kSlider);
306 TEST(AccessibilityBridgeTest, CanSetCheckboxChecked) {
307 std::shared_ptr<TestAccessibilityBridge> bridge =
308 std::make_shared<TestAccessibilityBridge>();
310 auto flags = FlutterSemanticsFlags{
311 .is_checked = FlutterCheckState::kFlutterCheckStateTrue,
314 root.flags2 = &flags;
315 bridge->AddFlutterSemanticsNodeUpdate(root);
316 bridge->CommitUpdates();
318 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
319 EXPECT_EQ(root_node->GetData().role, ax::mojom::Role::kCheckBox);
320 EXPECT_EQ(root_node->GetData().GetCheckedState(),
321 ax::mojom::CheckedState::kTrue);
325 TEST(AccessibilityBridgeTest, CanReparentNode) {
326 std::shared_ptr<TestAccessibilityBridge> bridge =
327 std::make_shared<TestAccessibilityBridge>();
329 std::vector<int32_t> root_children{1};
330 std::vector<int32_t> child1_children{2};
332 FlutterSemanticsNode2 child1 =
336 bridge->AddFlutterSemanticsNodeUpdate(root);
337 bridge->AddFlutterSemanticsNodeUpdate(child1);
338 bridge->AddFlutterSemanticsNodeUpdate(child2);
339 bridge->CommitUpdates();
340 bridge->accessibility_events.clear();
343 child1.child_count = 0;
344 child1.children_in_traversal_order =
nullptr;
346 int32_t new_root_children[] = {1, 2};
347 root.child_count = 2;
348 root.children_in_traversal_order = new_root_children;
350 bridge->AddFlutterSemanticsNodeUpdate(root);
351 bridge->AddFlutterSemanticsNodeUpdate(child1);
352 bridge->AddFlutterSemanticsNodeUpdate(child2);
353 bridge->CommitUpdates();
355 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(0).lock();
356 auto child1_node = bridge->GetFlutterPlatformNodeDelegateFromID(1).lock();
357 auto child2_node = bridge->GetFlutterPlatformNodeDelegateFromID(2).lock();
359 EXPECT_EQ(root_node->GetChildCount(), 2);
360 EXPECT_EQ(root_node->GetData().child_ids[0], 1);
361 EXPECT_EQ(root_node->GetData().child_ids[1], 2);
362 EXPECT_EQ(root_node->GetName(),
"root");
364 EXPECT_EQ(child1_node->GetChildCount(), 0);
365 EXPECT_EQ(child1_node->GetName(),
"child 1");
367 EXPECT_EQ(child2_node->GetChildCount(), 0);
368 EXPECT_EQ(child2_node->GetName(),
"child 2");
370 ASSERT_EQ(bridge->accessibility_events.size(),
size_t{5});
373 EXPECT_THAT(bridge->accessibility_events,
374 Contains(ui::AXEventGenerator::Event::CHILDREN_CHANGED).Times(2));
375 EXPECT_THAT(bridge->accessibility_events,
376 Contains(ui::AXEventGenerator::Event::SUBTREE_CREATED).Times(1));
381 bridge->accessibility_events,
382 Contains(ui::AXEventGenerator::Event::OTHER_ATTRIBUTE_CHANGED).Times(1));
383 EXPECT_THAT(bridge->accessibility_events,
384 Contains(ui::AXEventGenerator::Event::ROLE_CHANGED).Times(1));
388 TEST(AccessibilityBridgeTest, CanReparentMultipleNodes) {
389 std::shared_ptr<TestAccessibilityBridge> bridge =
390 std::make_shared<TestAccessibilityBridge>();
393 int32_t intermediary1_id = 1;
394 int32_t intermediary2_id = 2;
395 int32_t leaf1_id = 3;
396 int32_t leaf2_id = 4;
397 int32_t leaf3_id = 5;
399 std::vector<int32_t> root_children{intermediary1_id, intermediary2_id};
400 std::vector<int32_t> intermediary1_children{leaf1_id};
401 std::vector<int32_t> intermediary2_children{leaf2_id, leaf3_id};
402 FlutterSemanticsNode2 root =
405 intermediary1_id,
"intermediary 1", &intermediary1_children);
407 intermediary2_id,
"intermediary 2", &intermediary2_children);
412 bridge->AddFlutterSemanticsNodeUpdate(root);
413 bridge->AddFlutterSemanticsNodeUpdate(intermediary1);
414 bridge->AddFlutterSemanticsNodeUpdate(intermediary2);
415 bridge->AddFlutterSemanticsNodeUpdate(leaf1);
416 bridge->AddFlutterSemanticsNodeUpdate(leaf2);
417 bridge->AddFlutterSemanticsNodeUpdate(leaf3);
418 bridge->CommitUpdates();
419 bridge->accessibility_events.clear();
422 int32_t new_intermediary1_children[] = {leaf2_id, leaf3_id};
423 intermediary1.child_count = 2;
424 intermediary1.children_in_traversal_order = new_intermediary1_children;
426 int32_t new_intermediary2_children[] = {leaf1_id};
427 intermediary2.child_count = 1;
428 intermediary2.children_in_traversal_order = new_intermediary2_children;
430 bridge->AddFlutterSemanticsNodeUpdate(intermediary1);
431 bridge->AddFlutterSemanticsNodeUpdate(intermediary2);
432 bridge->AddFlutterSemanticsNodeUpdate(leaf1);
433 bridge->AddFlutterSemanticsNodeUpdate(leaf2);
434 bridge->AddFlutterSemanticsNodeUpdate(leaf3);
435 bridge->CommitUpdates();
437 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(root_id).lock();
438 auto intermediary1_node =
439 bridge->GetFlutterPlatformNodeDelegateFromID(intermediary1_id).lock();
440 auto intermediary2_node =
441 bridge->GetFlutterPlatformNodeDelegateFromID(intermediary2_id).lock();
443 bridge->GetFlutterPlatformNodeDelegateFromID(leaf1_id).lock();
445 bridge->GetFlutterPlatformNodeDelegateFromID(leaf2_id).lock();
447 bridge->GetFlutterPlatformNodeDelegateFromID(leaf3_id).lock();
449 EXPECT_EQ(root_node->GetChildCount(), 2);
450 EXPECT_EQ(root_node->GetData().child_ids[0], intermediary1_id);
451 EXPECT_EQ(root_node->GetData().child_ids[1], intermediary2_id);
452 EXPECT_EQ(root_node->GetName(),
"root");
454 EXPECT_EQ(intermediary1_node->GetChildCount(), 2);
455 EXPECT_EQ(intermediary1_node->GetData().child_ids[0], leaf2_id);
456 EXPECT_EQ(intermediary1_node->GetData().child_ids[1], leaf3_id);
457 EXPECT_EQ(intermediary1_node->GetName(),
"intermediary 1");
459 EXPECT_EQ(intermediary2_node->GetChildCount(), 1);
460 EXPECT_EQ(intermediary2_node->GetData().child_ids[0], leaf1_id);
461 EXPECT_EQ(intermediary2_node->GetName(),
"intermediary 2");
463 EXPECT_EQ(leaf1_node->GetChildCount(), 0);
464 EXPECT_EQ(leaf1_node->GetName(),
"leaf 1");
466 EXPECT_EQ(leaf2_node->GetChildCount(), 0);
467 EXPECT_EQ(leaf2_node->GetName(),
"leaf 2");
469 EXPECT_EQ(leaf3_node->GetChildCount(), 0);
470 EXPECT_EQ(leaf3_node->GetName(),
"leaf 3");
474 ASSERT_EQ(bridge->accessibility_events.size(),
size_t{5});
475 EXPECT_THAT(bridge->accessibility_events,
476 Contains(ui::AXEventGenerator::Event::CHILDREN_CHANGED).Times(2));
477 EXPECT_THAT(bridge->accessibility_events,
478 Contains(ui::AXEventGenerator::Event::SUBTREE_CREATED).Times(3));
482 TEST(AccessibilityBridgeTest, CanReparentNodeWithChild) {
483 std::shared_ptr<TestAccessibilityBridge> bridge =
484 std::make_shared<TestAccessibilityBridge>();
487 int32_t intermediary1_id = 1;
488 int32_t intermediary2_id = 2;
489 int32_t leaf1_id = 3;
491 std::vector<int32_t> root_children{intermediary1_id, intermediary2_id};
492 std::vector<int32_t> intermediary1_children{leaf1_id};
493 FlutterSemanticsNode2 root =
496 intermediary1_id,
"intermediary 1", &intermediary1_children);
497 FlutterSemanticsNode2 intermediary2 =
501 bridge->AddFlutterSemanticsNodeUpdate(root);
502 bridge->AddFlutterSemanticsNodeUpdate(intermediary1);
503 bridge->AddFlutterSemanticsNodeUpdate(intermediary2);
504 bridge->AddFlutterSemanticsNodeUpdate(leaf1);
505 bridge->CommitUpdates();
506 bridge->accessibility_events.clear();
509 int32_t new_root_children[] = {intermediary2_id};
510 root.child_count = 1;
511 root.children_in_traversal_order = new_root_children;
513 int32_t new_intermediary2_children[] = {intermediary1_id};
514 intermediary2.child_count = 1;
515 intermediary2.children_in_traversal_order = new_intermediary2_children;
517 bridge->AddFlutterSemanticsNodeUpdate(root);
518 bridge->AddFlutterSemanticsNodeUpdate(intermediary1);
519 bridge->AddFlutterSemanticsNodeUpdate(intermediary2);
520 bridge->AddFlutterSemanticsNodeUpdate(leaf1);
521 bridge->CommitUpdates();
523 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(root_id).lock();
524 auto intermediary1_node =
525 bridge->GetFlutterPlatformNodeDelegateFromID(intermediary1_id).lock();
526 auto intermediary2_node =
527 bridge->GetFlutterPlatformNodeDelegateFromID(intermediary2_id).lock();
529 bridge->GetFlutterPlatformNodeDelegateFromID(leaf1_id).lock();
531 EXPECT_EQ(root_node->GetChildCount(), 1);
532 EXPECT_EQ(root_node->GetData().child_ids[0], intermediary2_id);
533 EXPECT_EQ(root_node->GetName(),
"root");
535 EXPECT_EQ(intermediary2_node->GetChildCount(), 1);
536 EXPECT_EQ(intermediary2_node->GetData().child_ids[0], intermediary1_id);
537 EXPECT_EQ(intermediary2_node->GetName(),
"intermediary 2");
539 EXPECT_EQ(intermediary1_node->GetChildCount(), 1);
540 EXPECT_EQ(intermediary1_node->GetData().child_ids[0], leaf1_id);
541 EXPECT_EQ(intermediary1_node->GetName(),
"intermediary 1");
543 EXPECT_EQ(leaf1_node->GetChildCount(), 0);
544 EXPECT_EQ(leaf1_node->GetName(),
"leaf 1");
546 ASSERT_EQ(bridge->accessibility_events.size(),
size_t{5});
548 EXPECT_THAT(bridge->accessibility_events,
549 Contains(ui::AXEventGenerator::Event::CHILDREN_CHANGED).Times(2));
550 EXPECT_THAT(bridge->accessibility_events,
551 Contains(ui::AXEventGenerator::Event::SUBTREE_CREATED).Times(1));
556 bridge->accessibility_events,
557 Contains(ui::AXEventGenerator::Event::OTHER_ATTRIBUTE_CHANGED).Times(1));
558 EXPECT_THAT(bridge->accessibility_events,
559 Contains(ui::AXEventGenerator::Event::ROLE_CHANGED).Times(1));
562 TEST(AccessibilityBridgeTest, AXTreeManagerTest) {
563 std::shared_ptr<TestAccessibilityBridge> bridge =
564 std::make_shared<TestAccessibilityBridge>();
566 ui::AXTreeID tree_id = bridge->GetTreeID();
567 ui::AXTreeManager* manager =
568 ui::AXTreeManagerMap::GetInstance().GetManager(tree_id);
569 ASSERT_EQ(manager,
static_cast<ui::AXTreeManager*
>(bridge.get()));
572 TEST(AccessibilityBridgeTest, LineBreakingObjectTest) {
573 std::shared_ptr<TestAccessibilityBridge> bridge =
574 std::make_shared<TestAccessibilityBridge>();
576 const int32_t root_id = 0;
580 bridge->AddFlutterSemanticsNodeUpdate(root);
581 bridge->CommitUpdates();
583 auto root_node = bridge->GetFlutterPlatformNodeDelegateFromID(root_id).lock();
584 auto root_data = root_node->GetData();
585 EXPECT_TRUE(root_data.HasBoolAttribute(
586 ax::mojom::BoolAttribute::kIsLineBreakingObject));
587 EXPECT_TRUE(root_data.GetBoolAttribute(
588 ax::mojom::BoolAttribute::kIsLineBreakingObject));
TEST(AccessibilityBridgeTest, BasicTest)
FlutterSemanticsNode2 CreateSemanticsNode(int32_t id, const char *label, const std::vector< int32_t > *children=nullptr)
FlutterSemanticsFlags kEmptyFlags