Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 30b829e

Browse files
authored
Populates fuchsia node actions in semantics updates. (#20451)
1 parent ac8b9c4 commit 30b829e

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
lines changed

shell/platform/fuchsia/flutter/accessibility_bridge.cc

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,36 @@ fuchsia::accessibility::semantics::States AccessibilityBridge::GetNodeStates(
115115
return states;
116116
}
117117

118+
std::vector<fuchsia::accessibility::semantics::Action>
119+
AccessibilityBridge::GetNodeActions(const flutter::SemanticsNode& node,
120+
size_t* additional_size) const {
121+
std::vector<fuchsia::accessibility::semantics::Action> node_actions;
122+
123+
if (node.HasAction(flutter::SemanticsAction::kTap)) {
124+
node_actions.push_back(fuchsia::accessibility::semantics::Action::DEFAULT);
125+
}
126+
if (node.HasAction(flutter::SemanticsAction::kLongPress)) {
127+
node_actions.push_back(
128+
fuchsia::accessibility::semantics::Action::SECONDARY);
129+
}
130+
if (node.HasAction(flutter::SemanticsAction::kShowOnScreen)) {
131+
node_actions.push_back(
132+
fuchsia::accessibility::semantics::Action::SHOW_ON_SCREEN);
133+
}
134+
if (node.HasAction(flutter::SemanticsAction::kIncrease)) {
135+
node_actions.push_back(
136+
fuchsia::accessibility::semantics::Action::INCREMENT);
137+
}
138+
if (node.HasAction(flutter::SemanticsAction::kDecrease)) {
139+
node_actions.push_back(
140+
fuchsia::accessibility::semantics::Action::DECREMENT);
141+
}
142+
143+
*additional_size +=
144+
node_actions.size() * sizeof(fuchsia::accessibility::semantics::Action);
145+
return node_actions;
146+
}
147+
118148
std::unordered_set<int32_t> AccessibilityBridge::GetDescendants(
119149
int32_t node_id) const {
120150
std::unordered_set<int32_t> descendents;
@@ -227,6 +257,7 @@ void AccessibilityBridge::AddSemanticsNodeUpdate(
227257
.set_transform(GetNodeTransform(flutter_node))
228258
.set_attributes(GetNodeAttributes(flutter_node, &this_node_size))
229259
.set_states(GetNodeStates(flutter_node, &this_node_size))
260+
.set_actions(GetNodeActions(flutter_node, &this_node_size))
230261
.set_child_ids(child_ids);
231262
this_node_size +=
232263
kNodeIdSize * flutter_node.childrenInTraversalOrder.size();

shell/platform/fuchsia/flutter/accessibility_bridge.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ class AccessibilityBridge
145145
const flutter::SemanticsNode& node,
146146
size_t* additional_size) const;
147147

148+
// Derives the set of supported actions for a Fuchsia semantics node from
149+
// a Flutter semantics node.
150+
std::vector<fuchsia::accessibility::semantics::Action> GetNodeActions(
151+
const flutter::SemanticsNode& node,
152+
size_t* additional_size) const;
153+
148154
// Gets the set of reachable descendants from the given node id.
149155
std::unordered_set<int32_t> GetDescendants(int32_t node_id) const;
150156

shell/platform/fuchsia/flutter/accessibility_bridge_unittest.cc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,36 @@ TEST_F(AccessibilityBridgeTest, PopulatesHiddenState) {
237237
EXPECT_FALSE(semantics_manager_.UpdateOverflowed());
238238
}
239239

240+
TEST_F(AccessibilityBridgeTest, PopulatesActions) {
241+
flutter::SemanticsNode node0;
242+
node0.id = 0;
243+
node0.actions |= static_cast<int>(flutter::SemanticsAction::kTap);
244+
node0.actions |= static_cast<int>(flutter::SemanticsAction::kLongPress);
245+
node0.actions |= static_cast<int>(flutter::SemanticsAction::kShowOnScreen);
246+
node0.actions |= static_cast<int>(flutter::SemanticsAction::kIncrease);
247+
node0.actions |= static_cast<int>(flutter::SemanticsAction::kDecrease);
248+
249+
accessibility_bridge_->AddSemanticsNodeUpdate({{0, node0}});
250+
RunLoopUntilIdle();
251+
252+
EXPECT_EQ(0, semantics_manager_.DeleteCount());
253+
EXPECT_EQ(1, semantics_manager_.UpdateCount());
254+
EXPECT_EQ(1, semantics_manager_.CommitCount());
255+
EXPECT_EQ(1u, semantics_manager_.LastUpdatedNodes().size());
256+
const auto& fuchsia_node = semantics_manager_.LastUpdatedNodes().at(0u);
257+
EXPECT_EQ(fuchsia_node.actions().size(), 5u);
258+
EXPECT_EQ(fuchsia_node.actions().at(0u),
259+
fuchsia::accessibility::semantics::Action::DEFAULT);
260+
EXPECT_EQ(fuchsia_node.actions().at(1u),
261+
fuchsia::accessibility::semantics::Action::SECONDARY);
262+
EXPECT_EQ(fuchsia_node.actions().at(2u),
263+
fuchsia::accessibility::semantics::Action::SHOW_ON_SCREEN);
264+
EXPECT_EQ(fuchsia_node.actions().at(3u),
265+
fuchsia::accessibility::semantics::Action::INCREMENT);
266+
EXPECT_EQ(fuchsia_node.actions().at(4u),
267+
fuchsia::accessibility::semantics::Action::DECREMENT);
268+
}
269+
240270
TEST_F(AccessibilityBridgeTest, TruncatesLargeLabel) {
241271
// Test that labels which are too long are truncated.
242272
flutter::SemanticsNode node0;

0 commit comments

Comments
 (0)