Index: ui/accessibility/ax_tree_serializer_unittest.cc |
diff --git a/ui/accessibility/ax_tree_serializer_unittest.cc b/ui/accessibility/ax_tree_serializer_unittest.cc |
index 733e289f0f5616107caa42c11d1d721db561a5c2..8db1937450dc139e840a9c5ff276e4f56919da27 100644 |
--- a/ui/accessibility/ax_tree_serializer_unittest.cc |
+++ b/ui/accessibility/ax_tree_serializer_unittest.cc |
@@ -179,4 +179,69 @@ TEST_F(AXTreeSerializerTest, ReparentingUpdatesSubtree) { |
EXPECT_EQ(5, update.nodes[3].id); |
} |
+// A variant of AXTreeSource that returns true for IsValid() for one |
+// particular id. |
+class AXTreeSourceWithInvalidId : public AXTreeSource<const AXNode*> { |
+ public: |
+ AXTreeSourceWithInvalidId(AXTree* tree, int invalid_id) |
+ : tree_(tree), |
+ invalid_id_(invalid_id) {} |
+ ~AXTreeSourceWithInvalidId() override {} |
+ |
+ // AXTreeSource implementation. |
+ AXNode* GetRoot() const override { return tree_->root(); } |
+ AXNode* GetFromId(int32 id) const override { return tree_->GetFromId(id); } |
+ int32 GetId(const AXNode* node) const override { return node->id(); } |
+ void GetChildren(const AXNode* node, |
+ std::vector<const AXNode*>* out_children) const override { |
+ for (int i = 0; i < node->child_count(); ++i) |
+ out_children->push_back(node->ChildAtIndex(i)); |
+ } |
+ AXNode* GetParent(const AXNode* node) const override { |
+ return node->parent(); |
+ } |
+ bool IsValid(const AXNode* node) const override { |
+ return node != NULL && node->id() != invalid_id_; |
+ } |
+ bool IsEqual(const AXNode* node1, const AXNode* node2) const override { |
+ return node1 == node2; |
+ } |
+ const AXNode* GetNull() const override { return NULL; } |
+ void SerializeNode(const AXNode* node, AXNodeData* out_data) const override { |
+ *out_data = node->data(); |
+ if (node->id() == invalid_id_) |
+ out_data->id = -1; |
+ } |
+ |
+ private: |
+ AXTree* tree_; |
+ int invalid_id_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AXTreeSourceWithInvalidId); |
+}; |
+ |
+// Test that the serializer skips invalid children. |
+TEST(AXTreeSerializerInvalidTest, InvalidChild) { |
+ // (1 (2 3)) |
+ AXTreeUpdate treedata; |
+ treedata.nodes.resize(3); |
+ treedata.nodes[0].id = 1; |
+ treedata.nodes[0].role = AX_ROLE_ROOT_WEB_AREA; |
+ treedata.nodes[0].child_ids.push_back(2); |
+ treedata.nodes[0].child_ids.push_back(3); |
+ treedata.nodes[1].id = 2; |
+ treedata.nodes[2].id = 3; |
+ |
+ AXTree tree(treedata); |
+ AXTreeSourceWithInvalidId source(&tree, 3); |
+ |
+ AXTreeSerializer<const AXNode*> serializer(&source); |
+ AXTreeUpdate update; |
+ serializer.SerializeChanges(tree.root(), &update); |
+ |
+ ASSERT_EQ(2U, update.nodes.size()); |
+ EXPECT_EQ(1, update.nodes[0].id); |
+ EXPECT_EQ(2, update.nodes[1].id); |
+} |
+ |
} // namespace ui |