OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 #include "base/strings/string_number_conversions.h" | 6 #include "base/strings/string_number_conversions.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 #include "ui/accessibility/ax_node.h" | 8 #include "ui/accessibility/ax_node.h" |
9 #include "ui/accessibility/ax_serializable_tree.h" | 9 #include "ui/accessibility/ax_serializable_tree.h" |
10 #include "ui/accessibility/ax_tree.h" | 10 #include "ui/accessibility/ax_tree.h" |
11 #include "ui/accessibility/ax_tree_serializer.h" | 11 #include "ui/accessibility/ax_tree_serializer.h" |
12 | 12 |
13 namespace ui { | 13 namespace ui { |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 class FakeAXTreeDelegate : public AXTreeDelegate { | 17 class FakeAXTreeDelegate : public AXTreeDelegate { |
18 public: | 18 public: |
| 19 FakeAXTreeDelegate() : root_changed_(false) {} |
| 20 |
19 void OnNodeWillBeDeleted(AXNode* node) override { | 21 void OnNodeWillBeDeleted(AXNode* node) override { |
20 deleted_ids_.push_back(node->id()); | 22 deleted_ids_.push_back(node->id()); |
21 } | 23 } |
22 | 24 |
| 25 void OnSubtreeWillBeDeleted(AXNode* node) override { |
| 26 subtree_deleted_ids_.push_back(node->id()); |
| 27 } |
| 28 |
23 void OnNodeCreated(AXNode* node) override { | 29 void OnNodeCreated(AXNode* node) override { |
24 created_ids_.push_back(node->id()); | 30 created_ids_.push_back(node->id()); |
25 } | 31 } |
26 | 32 |
27 void OnNodeChanged(AXNode* node) override { | 33 void OnNodeChanged(AXNode* node) override { |
28 changed_ids_.push_back(node->id()); | 34 changed_ids_.push_back(node->id()); |
29 } | 35 } |
30 | 36 |
31 void OnNodeCreationFinished(AXNode* node) override { | 37 void OnAtomicUpdateFinished(bool root_changed, |
32 creation_finished_ids_.push_back(node->id()); | 38 const std::vector<Change>& changes) override { |
| 39 root_changed_ = root_changed; |
| 40 |
| 41 for (size_t i = 0; i < changes.size(); ++i) { |
| 42 int id = changes[i].node->id(); |
| 43 switch (changes[i].type) { |
| 44 case NODE_CREATED: |
| 45 node_creation_finished_ids_.push_back(id); |
| 46 break; |
| 47 case SUBTREE_CREATED: |
| 48 subtree_creation_finished_ids_.push_back(id); |
| 49 break; |
| 50 case NODE_CHANGED: |
| 51 change_finished_ids_.push_back(id); |
| 52 break; |
| 53 } |
| 54 } |
33 } | 55 } |
34 | 56 |
35 void OnNodeChangeFinished(AXNode* node) override { | 57 bool root_changed() const { return root_changed_; } |
36 change_finished_ids_.push_back(node->id()); | 58 const std::vector<int32>& deleted_ids() { return deleted_ids_; } |
| 59 const std::vector<int32>& subtree_deleted_ids() { |
| 60 return subtree_deleted_ids_; |
| 61 } |
| 62 const std::vector<int32>& created_ids() { return created_ids_; } |
| 63 const std::vector<int32>& node_creation_finished_ids() { |
| 64 return node_creation_finished_ids_; |
| 65 } |
| 66 const std::vector<int32>& subtree_creation_finished_ids() { |
| 67 return subtree_creation_finished_ids_; |
| 68 } |
| 69 const std::vector<int32>& change_finished_ids() { |
| 70 return change_finished_ids_; |
37 } | 71 } |
38 | 72 |
39 void OnRootChanged(AXNode* new_root) override { | |
40 new_root_ids_.push_back(new_root->id()); | |
41 } | |
42 | |
43 const std::vector<int32>& deleted_ids() { return deleted_ids_; } | |
44 const std::vector<int32>& created_ids() { return created_ids_; } | |
45 const std::vector<int32>& creation_finished_ids() { | |
46 return creation_finished_ids_; | |
47 } | |
48 const std::vector<int32>& new_root_ids() { return new_root_ids_; } | |
49 | |
50 private: | 73 private: |
| 74 bool root_changed_; |
51 std::vector<int32> deleted_ids_; | 75 std::vector<int32> deleted_ids_; |
| 76 std::vector<int32> subtree_deleted_ids_; |
52 std::vector<int32> created_ids_; | 77 std::vector<int32> created_ids_; |
53 std::vector<int32> creation_finished_ids_; | |
54 std::vector<int32> changed_ids_; | 78 std::vector<int32> changed_ids_; |
| 79 std::vector<int32> node_creation_finished_ids_; |
| 80 std::vector<int32> subtree_creation_finished_ids_; |
55 std::vector<int32> change_finished_ids_; | 81 std::vector<int32> change_finished_ids_; |
56 std::vector<int32> new_root_ids_; | |
57 }; | 82 }; |
58 | 83 |
59 } // namespace | 84 } // namespace |
60 | 85 |
61 TEST(AXTreeTest, SerializeSimpleAXTree) { | 86 TEST(AXTreeTest, SerializeSimpleAXTree) { |
62 AXNodeData root; | 87 AXNodeData root; |
63 root.id = 1; | 88 root.id = 1; |
64 root.role = AX_ROLE_ROOT_WEB_AREA; | 89 root.role = AX_ROLE_ROOT_WEB_AREA; |
65 root.state = (1 << AX_STATE_FOCUSABLE) | (1 << AX_STATE_FOCUSED); | 90 root.state = (1 << AX_STATE_FOCUSABLE) | (1 << AX_STATE_FOCUSED); |
66 root.location = gfx::Rect(0, 0, 800, 600); | 91 root.location = gfx::Rect(0, 0, 800, 600); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 update.nodes[0].child_ids.push_back(3); | 278 update.nodes[0].child_ids.push_back(3); |
254 update.nodes[0].child_ids.push_back(2); | 279 update.nodes[0].child_ids.push_back(2); |
255 update.nodes[1].id = 2; | 280 update.nodes[1].id = 2; |
256 update.nodes[2].id = 3; | 281 update.nodes[2].id = 3; |
257 EXPECT_FALSE(tree.Unserialize(update)); | 282 EXPECT_FALSE(tree.Unserialize(update)); |
258 ASSERT_EQ("Node 3 reparented from 2 to 1", tree.error()); | 283 ASSERT_EQ("Node 3 reparented from 2 to 1", tree.error()); |
259 } | 284 } |
260 | 285 |
261 TEST(AXTreeTest, TreeDelegateIsCalled) { | 286 TEST(AXTreeTest, TreeDelegateIsCalled) { |
262 AXTreeUpdate initial_state; | 287 AXTreeUpdate initial_state; |
263 initial_state.nodes.resize(1); | 288 initial_state.nodes.resize(2); |
264 initial_state.nodes[0].id = 1; | 289 initial_state.nodes[0].id = 1; |
265 initial_state.nodes[0].role = AX_ROLE_ROOT_WEB_AREA; | 290 initial_state.nodes[0].role = AX_ROLE_ROOT_WEB_AREA; |
| 291 initial_state.nodes[0].child_ids.push_back(2); |
| 292 initial_state.nodes[1].id = 2; |
266 | 293 |
267 AXTree tree(initial_state); | 294 AXTree tree(initial_state); |
268 AXTreeUpdate update; | 295 AXTreeUpdate update; |
269 update.node_id_to_clear = 1; | 296 update.node_id_to_clear = 1; |
270 update.nodes.resize(2); | 297 update.nodes.resize(2); |
271 update.nodes[0].id = 2; | 298 update.nodes[0].id = 3; |
272 update.nodes[0].role = AX_ROLE_ROOT_WEB_AREA; | 299 update.nodes[0].role = AX_ROLE_ROOT_WEB_AREA; |
273 update.nodes[0].child_ids.push_back(3); | 300 update.nodes[0].child_ids.push_back(4); |
274 update.nodes[1].id = 3; | 301 update.nodes[1].id = 4; |
275 | 302 |
276 FakeAXTreeDelegate fake_delegate; | 303 FakeAXTreeDelegate fake_delegate; |
277 tree.SetDelegate(&fake_delegate); | 304 tree.SetDelegate(&fake_delegate); |
278 | 305 |
279 EXPECT_TRUE(tree.Unserialize(update)); | 306 EXPECT_TRUE(tree.Unserialize(update)); |
280 | 307 |
281 ASSERT_EQ(1U, fake_delegate.deleted_ids().size()); | 308 ASSERT_EQ(2U, fake_delegate.deleted_ids().size()); |
282 EXPECT_EQ(1, fake_delegate.deleted_ids()[0]); | 309 EXPECT_EQ(2, fake_delegate.deleted_ids()[0]); |
| 310 EXPECT_EQ(1, fake_delegate.deleted_ids()[1]); |
| 311 |
| 312 ASSERT_EQ(1U, fake_delegate.subtree_deleted_ids().size()); |
| 313 EXPECT_EQ(1, fake_delegate.subtree_deleted_ids()[0]); |
283 | 314 |
284 ASSERT_EQ(2U, fake_delegate.created_ids().size()); | 315 ASSERT_EQ(2U, fake_delegate.created_ids().size()); |
285 EXPECT_EQ(2, fake_delegate.created_ids()[0]); | 316 EXPECT_EQ(3, fake_delegate.created_ids()[0]); |
286 EXPECT_EQ(3, fake_delegate.created_ids()[1]); | 317 EXPECT_EQ(4, fake_delegate.created_ids()[1]); |
287 | 318 |
288 ASSERT_EQ(2U, fake_delegate.creation_finished_ids().size()); | 319 ASSERT_EQ(1U, fake_delegate.subtree_creation_finished_ids().size()); |
289 EXPECT_EQ(2, fake_delegate.creation_finished_ids()[0]); | 320 EXPECT_EQ(3, fake_delegate.subtree_creation_finished_ids()[0]); |
290 EXPECT_EQ(3, fake_delegate.creation_finished_ids()[1]); | |
291 | 321 |
292 ASSERT_EQ(1U, fake_delegate.new_root_ids().size()); | 322 ASSERT_EQ(1U, fake_delegate.node_creation_finished_ids().size()); |
293 EXPECT_EQ(2, fake_delegate.new_root_ids()[0]); | 323 EXPECT_EQ(4, fake_delegate.node_creation_finished_ids()[0]); |
| 324 |
| 325 ASSERT_EQ(true, fake_delegate.root_changed()); |
294 | 326 |
295 tree.SetDelegate(NULL); | 327 tree.SetDelegate(NULL); |
296 } | 328 } |
297 | 329 |
298 } // namespace ui | 330 } // namespace ui |
OLD | NEW |