diff --git a/shell/platform/fuchsia/flutter/accessibility_bridge.cc b/shell/platform/fuchsia/flutter/accessibility_bridge.cc index ea3b646c53c9f..8d87d5cdb8a8e 100644 --- a/shell/platform/fuchsia/flutter/accessibility_bridge.cc +++ b/shell/platform/fuchsia/flutter/accessibility_bridge.cc @@ -115,6 +115,36 @@ fuchsia::accessibility::semantics::States AccessibilityBridge::GetNodeStates( return states; } +std::vector +AccessibilityBridge::GetNodeActions(const flutter::SemanticsNode& node, + size_t* additional_size) const { + std::vector node_actions; + + if (node.HasAction(flutter::SemanticsAction::kTap)) { + node_actions.push_back(fuchsia::accessibility::semantics::Action::DEFAULT); + } + if (node.HasAction(flutter::SemanticsAction::kLongPress)) { + node_actions.push_back( + fuchsia::accessibility::semantics::Action::SECONDARY); + } + if (node.HasAction(flutter::SemanticsAction::kShowOnScreen)) { + node_actions.push_back( + fuchsia::accessibility::semantics::Action::SHOW_ON_SCREEN); + } + if (node.HasAction(flutter::SemanticsAction::kIncrease)) { + node_actions.push_back( + fuchsia::accessibility::semantics::Action::INCREMENT); + } + if (node.HasAction(flutter::SemanticsAction::kDecrease)) { + node_actions.push_back( + fuchsia::accessibility::semantics::Action::DECREMENT); + } + + *additional_size += + node_actions.size() * sizeof(fuchsia::accessibility::semantics::Action); + return node_actions; +} + std::unordered_set AccessibilityBridge::GetDescendants( int32_t node_id) const { std::unordered_set descendents; @@ -227,6 +257,7 @@ void AccessibilityBridge::AddSemanticsNodeUpdate( .set_transform(GetNodeTransform(flutter_node)) .set_attributes(GetNodeAttributes(flutter_node, &this_node_size)) .set_states(GetNodeStates(flutter_node, &this_node_size)) + .set_actions(GetNodeActions(flutter_node, &this_node_size)) .set_child_ids(child_ids); this_node_size += kNodeIdSize * flutter_node.childrenInTraversalOrder.size(); diff --git a/shell/platform/fuchsia/flutter/accessibility_bridge.h b/shell/platform/fuchsia/flutter/accessibility_bridge.h index 6888f13327527..cbbed7c94be80 100644 --- a/shell/platform/fuchsia/flutter/accessibility_bridge.h +++ b/shell/platform/fuchsia/flutter/accessibility_bridge.h @@ -145,6 +145,12 @@ class AccessibilityBridge const flutter::SemanticsNode& node, size_t* additional_size) const; + // Derives the set of supported actions for a Fuchsia semantics node from + // a Flutter semantics node. + std::vector GetNodeActions( + const flutter::SemanticsNode& node, + size_t* additional_size) const; + // Gets the set of reachable descendants from the given node id. std::unordered_set GetDescendants(int32_t node_id) const; diff --git a/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc b/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc index e9b466fb8e1c2..5f1c6623ff58e 100644 --- a/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc +++ b/shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc @@ -237,6 +237,36 @@ TEST_F(AccessibilityBridgeTest, PopulatesHiddenState) { EXPECT_FALSE(semantics_manager_.UpdateOverflowed()); } +TEST_F(AccessibilityBridgeTest, PopulatesActions) { + flutter::SemanticsNode node0; + node0.id = 0; + node0.actions |= static_cast(flutter::SemanticsAction::kTap); + node0.actions |= static_cast(flutter::SemanticsAction::kLongPress); + node0.actions |= static_cast(flutter::SemanticsAction::kShowOnScreen); + node0.actions |= static_cast(flutter::SemanticsAction::kIncrease); + node0.actions |= static_cast(flutter::SemanticsAction::kDecrease); + + accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}}); + RunLoopUntilIdle(); + + EXPECT_EQ(0, semantics_manager_.DeleteCount()); + EXPECT_EQ(1, semantics_manager_.UpdateCount()); + EXPECT_EQ(1, semantics_manager_.CommitCount()); + EXPECT_EQ(1u, semantics_manager_.LastUpdatedNodes().size()); + const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u); + EXPECT_EQ(fuchsia_node.actions().size(), 5u); + EXPECT_EQ(fuchsia_node.actions().at(0u), + fuchsia::accessibility::semantics::Action::DEFAULT); + EXPECT_EQ(fuchsia_node.actions().at(1u), + fuchsia::accessibility::semantics::Action::SECONDARY); + EXPECT_EQ(fuchsia_node.actions().at(2u), + fuchsia::accessibility::semantics::Action::SHOW_ON_SCREEN); + EXPECT_EQ(fuchsia_node.actions().at(3u), + fuchsia::accessibility::semantics::Action::INCREMENT); + EXPECT_EQ(fuchsia_node.actions().at(4u), + fuchsia::accessibility::semantics::Action::DECREMENT); +} + TEST_F(AccessibilityBridgeTest, TruncatesLargeLabel) { // Test that labels which are too long are truncated. flutter::SemanticsNode node0;