Commit c0df9d16 authored by Sharon Yang's avatar Sharon Yang Committed by Commit Bot

[fuchsia] Use node id conversion functions instead of checked_cast

In AXTreeConverter, use ConvertToFuchsiaNodeId to handle node id edge
cases.

Test: AXTreeConverterTest
Bug: fuchsia:60692
Change-Id: I2fe50a5f522d2a58d8cb88bf3f086173a6c6ea62
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2466617
Commit-Queue: Sharon Yang <yangsharon@chromium.org>
Reviewed-by: default avatarSergey Ulanov <sergeyu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#816650}
parent c8a5f9e9
...@@ -220,9 +220,8 @@ void AccessibilityBridge::OnAtomicUpdateFinished( ...@@ -220,9 +220,8 @@ void AccessibilityBridge::OnAtomicUpdateFinished(
// deleted are already gone, which means that all updates collected here in // deleted are already gone, which means that all updates collected here in
// |to_update_| are going to be executed after |to_delete_|. // |to_update_| are going to be executed after |to_delete_|.
for (const ui::AXTreeObserver::Change& change : changes) { for (const ui::AXTreeObserver::Change& change : changes) {
ui::AXNodeData ax_data = change.node->data(); to_update_.push_back(
ax_data.id = ConvertToFuchsiaNodeId(change.node->id(), root_id_); AXNodeDataToSemanticNode(change.node->data(), root_id_));
to_update_.push_back(AXNodeDataToSemanticNode(ax_data));
} }
// TODO(https://crbug.com/1134737): Separate updates of atomic updates and // TODO(https://crbug.com/1134737): Separate updates of atomic updates and
// don't allow all of them to be in the same commit. // don't allow all of them to be in the same commit.
......
...@@ -175,11 +175,12 @@ std::vector<fuchsia::accessibility::semantics::Action> ConvertActions( ...@@ -175,11 +175,12 @@ std::vector<fuchsia::accessibility::semantics::Action> ConvertActions(
return fuchsia_actions; return fuchsia_actions;
} }
std::vector<uint32_t> ConvertChildIds(std::vector<int32_t> ids) { std::vector<uint32_t> ConvertChildIds(std::vector<int32_t> ids,
int32_t ax_root_id) {
std::vector<uint32_t> child_ids; std::vector<uint32_t> child_ids;
child_ids.reserve(ids.size()); child_ids.reserve(ids.size());
for (auto i : ids) { for (auto i : ids) {
child_ids.push_back(base::checked_cast<uint32_t>(i)); child_ids.push_back(ConvertToFuchsiaNodeId(i, ax_root_id));
} }
return child_ids; return child_ids;
} }
...@@ -207,14 +208,15 @@ fuchsia::ui::gfx::mat4 ConvertTransform(gfx::Transform* transform) { ...@@ -207,14 +208,15 @@ fuchsia::ui::gfx::mat4 ConvertTransform(gfx::Transform* transform) {
} // namespace } // namespace
fuchsia::accessibility::semantics::Node AXNodeDataToSemanticNode( fuchsia::accessibility::semantics::Node AXNodeDataToSemanticNode(
const ui::AXNodeData& node) { const ui::AXNodeData& node,
int32_t ax_root_id) {
fuchsia::accessibility::semantics::Node fuchsia_node; fuchsia::accessibility::semantics::Node fuchsia_node;
fuchsia_node.set_node_id(base::checked_cast<uint32_t>(node.id)); fuchsia_node.set_node_id(ConvertToFuchsiaNodeId(node.id, ax_root_id));
fuchsia_node.set_role(AxRoleToFuchsiaSemanticRole(node.role)); fuchsia_node.set_role(AxRoleToFuchsiaSemanticRole(node.role));
fuchsia_node.set_states(ConvertStates(node)); fuchsia_node.set_states(ConvertStates(node));
fuchsia_node.set_attributes(ConvertAttributes(node)); fuchsia_node.set_attributes(ConvertAttributes(node));
fuchsia_node.set_actions(ConvertActions(node)); fuchsia_node.set_actions(ConvertActions(node));
fuchsia_node.set_child_ids(ConvertChildIds(node.child_ids)); fuchsia_node.set_child_ids(ConvertChildIds(node.child_ids, ax_root_id));
fuchsia_node.set_location(ConvertBoundingBox(node.relative_bounds.bounds)); fuchsia_node.set_location(ConvertBoundingBox(node.relative_bounds.bounds));
if (node.relative_bounds.transform) { if (node.relative_bounds.transform) {
fuchsia_node.set_transform( fuchsia_node.set_transform(
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
// present. Those that are will be converted. The Fuchsia SemanticsManager // present. Those that are will be converted. The Fuchsia SemanticsManager
// accepts partial updates, so |node| does not require all fields to be set. // accepts partial updates, so |node| does not require all fields to be set.
WEB_ENGINE_EXPORT fuchsia::accessibility::semantics::Node WEB_ENGINE_EXPORT fuchsia::accessibility::semantics::Node
AXNodeDataToSemanticNode(const ui::AXNodeData& node); AXNodeDataToSemanticNode(const ui::AXNodeData& node, int32_t ax_root_id);
// Converts Fuchsia action of type |fuchsia_action| to an ax::mojom::Action of // Converts Fuchsia action of type |fuchsia_action| to an ax::mojom::Action of
// type |mojom_action|. Function will return true if |fuchsia_action| is // type |mojom_action|. Function will return true if |fuchsia_action| is
......
...@@ -42,9 +42,7 @@ ui::AXNodeData CreateAXNodeData(ax::mojom::Role role, ...@@ -42,9 +42,7 @@ ui::AXNodeData CreateAXNodeData(ax::mojom::Role role,
base::StringPiece description, base::StringPiece description,
ax::mojom::CheckedState checked_state) { ax::mojom::CheckedState checked_state) {
ui::AXNodeData node; ui::AXNodeData node;
// Important! ID must be set to zero here because its default value (-1), will node.id = 2;
// fail when getting converted to an unsigned int (Fuchsia's ID format).
node.id = 0;
node.role = role; node.role = role;
node.AddAction(action); node.AddAction(action);
node.AddIntAttribute(ax::mojom::IntAttribute::kCheckedState, node.AddIntAttribute(ax::mojom::IntAttribute::kCheckedState,
...@@ -129,10 +127,7 @@ TEST_F(AXTreeConverterTest, AllFieldsSetAndEqual) { ...@@ -129,10 +127,7 @@ TEST_F(AXTreeConverterTest, AllFieldsSetAndEqual) {
auto& source_node_data = nodes.first; auto& source_node_data = nodes.first;
auto& expected_node = nodes.second; auto& expected_node = nodes.second;
auto converted_node = AXNodeDataToSemanticNode(source_node_data); auto converted_node = AXNodeDataToSemanticNode(source_node_data, kRootId);
EXPECT_EQ(ConvertToFuchsiaNodeId(source_node_data.id, kRootId),
converted_node.node_id());
EXPECT_TRUE(fidl::Equals(converted_node, expected_node)); EXPECT_TRUE(fidl::Equals(converted_node, expected_node));
} }
...@@ -145,16 +140,15 @@ TEST_F(AXTreeConverterTest, SomeFieldsSetAndEqual) { ...@@ -145,16 +140,15 @@ TEST_F(AXTreeConverterTest, SomeFieldsSetAndEqual) {
source_node_data.role = ax::mojom::Role::kImage; source_node_data.role = ax::mojom::Role::kImage;
source_node_data.AddStringAttribute(ax::mojom::StringAttribute::kValue, source_node_data.AddStringAttribute(ax::mojom::StringAttribute::kValue,
kValue1); kValue1);
auto converted_node = AXNodeDataToSemanticNode(source_node_data); auto converted_node = AXNodeDataToSemanticNode(source_node_data, kRootId);
EXPECT_EQ(static_cast<uint32_t>(source_node_data.id),
converted_node.node_id());
Node expected_node; Node expected_node;
expected_node.set_node_id(static_cast<uint32_t>(source_node_data.id)); expected_node.set_node_id(
ConvertToFuchsiaNodeId(source_node_data.id, kRootId));
expected_node.set_actions( expected_node.set_actions(
std::vector<Action>{Action::SET_FOCUS, Action::SET_VALUE}); std::vector<Action>{Action::SET_FOCUS, Action::SET_VALUE});
expected_node.set_child_ids( expected_node.set_child_ids(
std::vector<uint32_t>{static_cast<uint32_t>(kChildId1)}); std::vector<uint32_t>{ConvertToFuchsiaNodeId(kChildId1, kRootId)});
expected_node.set_role(Role::IMAGE); expected_node.set_role(Role::IMAGE);
States states; States states;
states.set_hidden(false); states.set_hidden(false);
...@@ -178,9 +172,7 @@ TEST_F(AXTreeConverterTest, FieldMismatch) { ...@@ -178,9 +172,7 @@ TEST_F(AXTreeConverterTest, FieldMismatch) {
ax::mojom::Role::kHeader, ax::mojom::Action::kSetValue, ax::mojom::Role::kHeader, ax::mojom::Action::kSetValue,
std::vector<int32_t>{kChildId1, kChildId2, kChildId3}, relative_bounds, std::vector<int32_t>{kChildId1, kChildId2, kChildId3}, relative_bounds,
kLabel1, kDescription1, ax::mojom::CheckedState::kFalse); kLabel1, kDescription1, ax::mojom::CheckedState::kFalse);
auto converted_node = AXNodeDataToSemanticNode(source_node_data); auto converted_node = AXNodeDataToSemanticNode(source_node_data, kRootId);
EXPECT_EQ(static_cast<uint32_t>(source_node_data.id),
converted_node.node_id());
Attributes attributes; Attributes attributes;
attributes.set_label(kLabel1); attributes.set_label(kLabel1);
...@@ -206,13 +198,13 @@ TEST_F(AXTreeConverterTest, FieldMismatch) { ...@@ -206,13 +198,13 @@ TEST_F(AXTreeConverterTest, FieldMismatch) {
auto modified_node_data = source_node_data; auto modified_node_data = source_node_data;
modified_node_data.AddStringAttribute(ax::mojom::StringAttribute::kName, modified_node_data.AddStringAttribute(ax::mojom::StringAttribute::kName,
kLabel2); kLabel2);
converted_node = AXNodeDataToSemanticNode(modified_node_data); converted_node = AXNodeDataToSemanticNode(modified_node_data, kRootId);
EXPECT_FALSE(fidl::Equals(converted_node, expected_node)); EXPECT_FALSE(fidl::Equals(converted_node, expected_node));
// The same as above, this time changing |child_ids|. // The same as above, this time changing |child_ids|.
modified_node_data = source_node_data; modified_node_data = source_node_data;
modified_node_data.child_ids = std::vector<int32_t>{}; modified_node_data.child_ids = std::vector<int32_t>{};
converted_node = AXNodeDataToSemanticNode(modified_node_data); converted_node = AXNodeDataToSemanticNode(modified_node_data, kRootId);
EXPECT_FALSE(fidl::Equals(converted_node, expected_node)); EXPECT_FALSE(fidl::Equals(converted_node, expected_node));
} }
...@@ -228,7 +220,7 @@ TEST_F(AXTreeConverterTest, DefaultAction) { ...@@ -228,7 +220,7 @@ TEST_F(AXTreeConverterTest, DefaultAction) {
expected_node.mutable_actions()->begin(), expected_node.mutable_actions()->begin(),
fuchsia::accessibility::semantics::Action::DEFAULT); fuchsia::accessibility::semantics::Action::DEFAULT);
auto converted_node = AXNodeDataToSemanticNode(source_node_data); auto converted_node = AXNodeDataToSemanticNode(source_node_data, kRootId);
EXPECT_EQ(ConvertToFuchsiaNodeId(source_node_data.id, kRootId), EXPECT_EQ(ConvertToFuchsiaNodeId(source_node_data.id, kRootId),
converted_node.node_id()); converted_node.node_id());
...@@ -255,39 +247,39 @@ TEST_F(AXTreeConverterTest, ConvertRoles) { ...@@ -255,39 +247,39 @@ TEST_F(AXTreeConverterTest, ConvertRoles) {
node.id = 0; node.id = 0;
node.role = ax::mojom::Role::kButton; node.role = ax::mojom::Role::kButton;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::BUTTON, EXPECT_EQ(fuchsia::accessibility::semantics::Role::BUTTON,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kCheckBox; node.role = ax::mojom::Role::kCheckBox;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::CHECK_BOX, EXPECT_EQ(fuchsia::accessibility::semantics::Role::CHECK_BOX,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kHeader; node.role = ax::mojom::Role::kHeader;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::HEADER, EXPECT_EQ(fuchsia::accessibility::semantics::Role::HEADER,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kImage; node.role = ax::mojom::Role::kImage;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::IMAGE, EXPECT_EQ(fuchsia::accessibility::semantics::Role::IMAGE,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kLink; node.role = ax::mojom::Role::kLink;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::LINK, EXPECT_EQ(fuchsia::accessibility::semantics::Role::LINK,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kRadioButton; node.role = ax::mojom::Role::kRadioButton;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::RADIO_BUTTON, EXPECT_EQ(fuchsia::accessibility::semantics::Role::RADIO_BUTTON,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kSlider; node.role = ax::mojom::Role::kSlider;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::SLIDER, EXPECT_EQ(fuchsia::accessibility::semantics::Role::SLIDER,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kTextField; node.role = ax::mojom::Role::kTextField;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::TEXT_FIELD, EXPECT_EQ(fuchsia::accessibility::semantics::Role::TEXT_FIELD,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
node.role = ax::mojom::Role::kStaticText; node.role = ax::mojom::Role::kStaticText;
EXPECT_EQ(fuchsia::accessibility::semantics::Role::STATIC_TEXT, EXPECT_EQ(fuchsia::accessibility::semantics::Role::STATIC_TEXT,
AXNodeDataToSemanticNode(node).role()); AXNodeDataToSemanticNode(node, kRootId).role());
} }
} // namespace } // namespace
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment