From c17c290e4856b2985c6bd97a41ca10e4e18c2d75 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 12 Jun 2020 17:02:07 -0700 Subject: [PATCH 1/2] test to make sure it fails --- .../flutter/accessibility_bridge_unittest.cc | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc b/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc index e0bcb91de48b3..e9b466fb8e1c2 100644 --- a/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc +++ b/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc @@ -515,6 +515,41 @@ TEST_F(AccessibilityBridgeTest, HitTest) { EXPECT_EQ(hit_node_id, 4u); } +TEST_F(AccessibilityBridgeTest, HitTestOverlapping) { + // Tests that the first node in hit test order wins, even if a later node + // would be able to recieve the hit. + flutter::SemanticsNode node0; + node0.id = 0; + node0.rect.setLTRB(0, 0, 100, 100); + + flutter::SemanticsNode node1; + node1.id = 1; + node1.rect.setLTRB(0, 0, 100, 100); + + flutter::SemanticsNode node2; + node2.id = 2; + node2.rect.setLTRB(25, 10, 45, 20); + + node0.childrenInTraversalOrder = {1, 2}; + node0.childrenInHitTestOrder = {2, 1}; + + accessibility_bridge_->AddSemanticsNodeUpdate({ + {0, node0}, + {1, node1}, + {2, node2}, + }); + RunLoopUntilIdle(); + + uint32_t hit_node_id; + auto callback = [&hit_node_id](fuchsia::accessibility::semantics::Hit hit) { + EXPECT_TRUE(hit.has_node_id()); + hit_node_id = hit.node_id(); + }; + + accessibility_bridge_->HitTest({30, 15}, callback); + EXPECT_EQ(hit_node_id, 2u); +} + TEST_F(AccessibilityBridgeTest, Actions) { flutter::SemanticsNode node0; node0.id = 0; From ed0125d361dab8400a9bd5c5ca833ab4ded07185 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Fri, 12 Jun 2020 17:20:10 -0700 Subject: [PATCH 2/2] fix --- shell/platform/fuchsia/flutter/accessibility_bridge.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/shell/platform/fuchsia/flutter/accessibility_bridge.cc b/shell/platform/fuchsia/flutter/accessibility_bridge.cc index 71b035258dbe7..ea3b646c53c9f 100644 --- a/shell/platform/fuchsia/flutter/accessibility_bridge.cc +++ b/shell/platform/fuchsia/flutter/accessibility_bridge.cc @@ -384,11 +384,13 @@ std::optional AccessibilityBridge::GetHitNode(int32_t node_id, !node.screen_rect.contains(x, y)) { return {}; } - auto hit = node_id; for (int32_t child_id : node.children_in_hit_test_order) { - hit = GetHitNode(child_id, x, y).value_or(hit); + auto candidate = GetHitNode(child_id, x, y); + if (candidate) { + return candidate; + } } - return hit; + return node_id; } // |fuchsia::accessibility::semantics::SemanticListener|