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 #ifndef UI_ACCESSIBILITY_AX_TREE_H_ | 5 #ifndef UI_ACCESSIBILITY_AX_TREE_H_ |
6 #define UI_ACCESSIBILITY_AX_TREE_H_ | 6 #define UI_ACCESSIBILITY_AX_TREE_H_ |
7 | 7 |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
11 #include "ui/accessibility/ax_export.h" | 11 #include "ui/accessibility/ax_export.h" |
12 #include "ui/accessibility/ax_tree_update.h" | 12 #include "ui/accessibility/ax_tree_update.h" |
13 | 13 |
14 namespace ui { | 14 namespace ui { |
15 | 15 |
16 class AXNode; | 16 class AXNode; |
17 struct AXTreeUpdateState; | 17 struct AXTreeUpdateState; |
18 | 18 |
19 // Used when you want to be notified when changes happen to the tree. | 19 // Used when you want to be notified when changes happen to the tree. |
20 // | 20 // |
21 // Some of the notifications are called in the middle of an update operation. | 21 // Some of the notifications are called in the middle of an update operation. |
22 // Be careful, as the tree may be in an inconsistent state at this time; | 22 // Be careful, as the tree may be in an inconsistent state at this time; |
23 // don't walk the parents and children at this time: | 23 // don't walk the parents and children at this time: |
24 // OnNodeWillBeDeleted | 24 // OnNodeWillBeDeleted |
| 25 // OnSubtreeWillBeDeleted |
25 // OnNodeCreated | 26 // OnNodeCreated |
26 // OnNodeChanged | 27 // OnNodeChanged |
27 // | 28 // |
28 // Other notifications are called at the end of an atomic update operation. | 29 // In addition, one additional notification is fired at the end of an |
29 // From these, it's safe to walk the tree and do any initialization that | 30 // atomic update, and it provides a vector of nodes that were added or |
30 // assumes the tree is in a consistent state. | 31 // changed, for final postprocessing: |
31 // OnNodeCreationFinished | 32 // OnAtomicUpdateFinished |
32 // OnNodeChangeFinished | 33 // |
33 // OnRootChanged | |
34 class AX_EXPORT AXTreeDelegate { | 34 class AX_EXPORT AXTreeDelegate { |
35 public: | 35 public: |
36 AXTreeDelegate(); | 36 AXTreeDelegate(); |
37 virtual ~AXTreeDelegate(); | 37 virtual ~AXTreeDelegate(); |
38 | 38 |
39 // Called just before a node is deleted. Its id and data will be valid, | 39 // Called just before a node is deleted. Its id and data will be valid, |
40 // but its links to parents and children are invalid. This is called | 40 // but its links to parents and children are invalid. This is called |
41 // in the middle of an update, the tree may be in an invalid state! | 41 // in the middle of an update, the tree may be in an invalid state! |
42 virtual void OnNodeWillBeDeleted(AXNode* node) = 0; | 42 virtual void OnNodeWillBeDeleted(AXNode* node) = 0; |
43 | 43 |
| 44 // Same as OnNodeWillBeDeleted, but only called once for an entire subtree. |
| 45 // This is called in the middle of an update, the tree may be in an |
| 46 // invalid state! |
| 47 virtual void OnSubtreeWillBeDeleted(AXNode* node) = 0; |
| 48 |
44 // Called immediately after a new node is created. The tree may be in | 49 // Called immediately after a new node is created. The tree may be in |
45 // the middle of an update, don't walk the parents and children now. | 50 // the middle of an update, don't walk the parents and children now. |
46 virtual void OnNodeCreated(AXNode* node) = 0; | 51 virtual void OnNodeCreated(AXNode* node) = 0; |
47 | 52 |
48 // Called when a node changes its data or children. The tree may be in | 53 // Called when a node changes its data or children. The tree may be in |
49 // the middle of an update, don't walk the parents and children now. | 54 // the middle of an update, don't walk the parents and children now. |
50 virtual void OnNodeChanged(AXNode* node) = 0; | 55 virtual void OnNodeChanged(AXNode* node) = 0; |
51 | 56 |
52 // Called for each new node at the end of an update operation, | 57 enum ChangeType { |
53 // when the tree is in a consistent state. | 58 NODE_CREATED, |
54 virtual void OnNodeCreationFinished(AXNode* node) = 0; | 59 SUBTREE_CREATED, |
| 60 NODE_CHANGED |
| 61 }; |
55 | 62 |
56 // Called for each existing node that changed at the end of an update | 63 struct Change { |
57 // operation, when the tree is in a consistent state. | 64 Change(AXNode* node, ChangeType type) { |
58 virtual void OnNodeChangeFinished(AXNode* node) = 0; | 65 this->node = node; |
| 66 this->type = type; |
| 67 } |
| 68 AXNode *node; |
| 69 ChangeType type; |
| 70 }; |
59 | 71 |
60 // Called at the end of an update operation when the root node changes. | 72 // Called at the end of the update operation. Every node that was added |
61 virtual void OnRootChanged(AXNode* new_root) = 0; | 73 // or changed will be included in |changes|, along with an enum indicating |
| 74 // the type of change - either (1) a node was created, (2) a node was created |
| 75 // and it's the root of a new subtree, or (3) a node was changed. Finally, |
| 76 // a bool indicates if the root of the tree was changed or not. |
| 77 virtual void OnAtomicUpdateFinished(bool root_changed, |
| 78 const std::vector<Change>& changes) = 0; |
62 }; | 79 }; |
63 | 80 |
64 // AXTree is a live, managed tree of AXNode objects that can receive | 81 // AXTree is a live, managed tree of AXNode objects that can receive |
65 // updates from another AXTreeSource via AXTreeUpdates, and it can be | 82 // updates from another AXTreeSource via AXTreeUpdates, and it can be |
66 // used as a source for sending updates to another client tree. | 83 // used as a source for sending updates to another client tree. |
67 // It's designed to be subclassed to implement support for native | 84 // It's designed to be subclassed to implement support for native |
68 // accessibility APIs on a specific platform. | 85 // accessibility APIs on a specific platform. |
69 class AX_EXPORT AXTree { | 86 class AX_EXPORT AXTree { |
70 public: | 87 public: |
71 AXTree(); | 88 AXTree(); |
(...skipping 18 matching lines...) Expand all Loading... |
90 const std::string& error() { return error_; } | 107 const std::string& error() { return error_; } |
91 | 108 |
92 private: | 109 private: |
93 AXNode* CreateNode(AXNode* parent, int32 id, int32 index_in_parent); | 110 AXNode* CreateNode(AXNode* parent, int32 id, int32 index_in_parent); |
94 | 111 |
95 // This is called from within Unserialize(), it returns true on success. | 112 // This is called from within Unserialize(), it returns true on success. |
96 bool UpdateNode(const AXNodeData& src, AXTreeUpdateState* update_state); | 113 bool UpdateNode(const AXNodeData& src, AXTreeUpdateState* update_state); |
97 | 114 |
98 void OnRootChanged(); | 115 void OnRootChanged(); |
99 | 116 |
| 117 // Notify the delegate that the subtree rooted at |node| will be destroyed, |
| 118 // then call DestroyNodeAndSubtree on it. |
| 119 void DestroySubtree(AXNode* node); |
| 120 |
100 // Call Destroy() on |node|, and delete it from the id map, and then | 121 // Call Destroy() on |node|, and delete it from the id map, and then |
101 // call recursively on all nodes in its subtree. | 122 // call recursively on all nodes in its subtree. |
102 void DestroyNodeAndSubtree(AXNode* node); | 123 void DestroyNodeAndSubtree(AXNode* node); |
103 | 124 |
104 // Iterate over the children of |node| and for each child, destroy the | 125 // Iterate over the children of |node| and for each child, destroy the |
105 // child and its subtree if its id is not in |new_child_ids|. Returns | 126 // child and its subtree if its id is not in |new_child_ids|. Returns |
106 // true on success, false on fatal error. | 127 // true on success, false on fatal error. |
107 bool DeleteOldChildren(AXNode* node, | 128 bool DeleteOldChildren(AXNode* node, |
108 const std::vector<int32> new_child_ids); | 129 const std::vector<int32> new_child_ids); |
109 | 130 |
110 // Iterate over |new_child_ids| and populate |new_children| with | 131 // Iterate over |new_child_ids| and populate |new_children| with |
111 // pointers to child nodes, reusing existing nodes already in the tree | 132 // pointers to child nodes, reusing existing nodes already in the tree |
112 // if they exist, and creating otherwise. Reparenting is disallowed, so | 133 // if they exist, and creating otherwise. Reparenting is disallowed, so |
113 // if the id already exists as the child of another node, that's an | 134 // if the id already exists as the child of another node, that's an |
114 // error. Returns true on success, false on fatal error. | 135 // error. Returns true on success, false on fatal error. |
115 bool CreateNewChildVector(AXNode* node, | 136 bool CreateNewChildVector(AXNode* node, |
116 const std::vector<int32> new_child_ids, | 137 const std::vector<int32> new_child_ids, |
117 std::vector<AXNode*>* new_children, | 138 std::vector<AXNode*>* new_children, |
118 AXTreeUpdateState* update_state); | 139 AXTreeUpdateState* update_state); |
119 | 140 |
120 AXTreeDelegate* delegate_; | 141 AXTreeDelegate* delegate_; |
121 AXNode* root_; | 142 AXNode* root_; |
122 base::hash_map<int32, AXNode*> id_map_; | 143 base::hash_map<int32, AXNode*> id_map_; |
123 std::string error_; | 144 std::string error_; |
124 }; | 145 }; |
125 | 146 |
126 } // namespace ui | 147 } // namespace ui |
127 | 148 |
128 #endif // UI_ACCESSIBILITY_AX_TREE_H_ | 149 #endif // UI_ACCESSIBILITY_AX_TREE_H_ |
OLD | NEW |