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: |
David Tseng
2015/01/23 17:25:39
At least for |OnSubtreeWillBeDeleted|, it appears
dmazzoni
2015/01/23 23:00:17
Technically you're right that the parents and chil
| |
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. |
David Tseng
2015/01/23 17:25:39
Do you mean |OnAtomicUpdateFinished|?
dmazzoni
2015/01/23 23:00:17
Oops, yes - I meant to include that in the comment
| |
31 // OnNodeCreationFinished | |
32 // OnNodeChangeFinished | |
33 // OnRootChanged | |
34 class AX_EXPORT AXTreeDelegate { | 32 class AX_EXPORT AXTreeDelegate { |
35 public: | 33 public: |
36 AXTreeDelegate(); | 34 AXTreeDelegate(); |
37 virtual ~AXTreeDelegate(); | 35 virtual ~AXTreeDelegate(); |
38 | 36 |
39 // Called just before a node is deleted. Its id and data will be valid, | 37 // 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 | 38 // 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! | 39 // in the middle of an update, the tree may be in an invalid state! |
42 virtual void OnNodeWillBeDeleted(AXNode* node) = 0; | 40 virtual void OnNodeWillBeDeleted(AXNode* node) = 0; |
43 | 41 |
42 // Same as OnNodeWillBeDeleted, but only called once for an entire subtree. | |
43 // This is called in the middle of an update, the tree may be in an | |
44 // invalid state! | |
45 virtual void OnSubtreeWillBeDeleted(AXNode* node) = 0; | |
46 | |
44 // Called immediately after a new node is created. The tree may be in | 47 // 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. | 48 // the middle of an update, don't walk the parents and children now. |
46 virtual void OnNodeCreated(AXNode* node) = 0; | 49 virtual void OnNodeCreated(AXNode* node) = 0; |
47 | 50 |
48 // Called when a node changes its data or children. The tree may be in | 51 // 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. | 52 // the middle of an update, don't walk the parents and children now. |
50 virtual void OnNodeChanged(AXNode* node) = 0; | 53 virtual void OnNodeChanged(AXNode* node) = 0; |
51 | 54 |
52 // Called for each new node at the end of an update operation, | 55 enum ChangeType { |
53 // when the tree is in a consistent state. | 56 NODE_CREATED, |
54 virtual void OnNodeCreationFinished(AXNode* node) = 0; | 57 SUBTREE_CREATED, |
58 NODE_CHANGED | |
59 }; | |
55 | 60 |
56 // Called for each existing node that changed at the end of an update | 61 struct Change { |
57 // operation, when the tree is in a consistent state. | 62 Change(AXNode* node, ChangeType type) { |
58 virtual void OnNodeChangeFinished(AXNode* node) = 0; | 63 this->node = node; |
64 this->type = type; | |
65 } | |
66 AXNode *node; | |
67 ChangeType type; | |
68 }; | |
59 | 69 |
60 // Called at the end of an update operation when the root node changes. | 70 // Called at the end of the update operation. Every node that was added |
61 virtual void OnRootChanged(AXNode* new_root) = 0; | 71 // or changed will be included in |changes|, along with an enum indicating |
72 // the type of change - either (1) a node was created, (2) a node was created | |
73 // and it's the root of a new subtree, or (3) a node was changed. Finally, | |
74 // a bool indicates if the root of the tree was changed or not. | |
75 virtual void OnAtomicUpdateFinished(bool root_changed, | |
76 const std::vector<Change>& changes) = 0; | |
62 }; | 77 }; |
63 | 78 |
64 // AXTree is a live, managed tree of AXNode objects that can receive | 79 // AXTree is a live, managed tree of AXNode objects that can receive |
65 // updates from another AXTreeSource via AXTreeUpdates, and it can be | 80 // updates from another AXTreeSource via AXTreeUpdates, and it can be |
66 // used as a source for sending updates to another client tree. | 81 // used as a source for sending updates to another client tree. |
67 // It's designed to be subclassed to implement support for native | 82 // It's designed to be subclassed to implement support for native |
68 // accessibility APIs on a specific platform. | 83 // accessibility APIs on a specific platform. |
69 class AX_EXPORT AXTree { | 84 class AX_EXPORT AXTree { |
70 public: | 85 public: |
71 AXTree(); | 86 AXTree(); |
(...skipping 18 matching lines...) Expand all Loading... | |
90 const std::string& error() { return error_; } | 105 const std::string& error() { return error_; } |
91 | 106 |
92 private: | 107 private: |
93 AXNode* CreateNode(AXNode* parent, int32 id, int32 index_in_parent); | 108 AXNode* CreateNode(AXNode* parent, int32 id, int32 index_in_parent); |
94 | 109 |
95 // This is called from within Unserialize(), it returns true on success. | 110 // This is called from within Unserialize(), it returns true on success. |
96 bool UpdateNode(const AXNodeData& src, AXTreeUpdateState* update_state); | 111 bool UpdateNode(const AXNodeData& src, AXTreeUpdateState* update_state); |
97 | 112 |
98 void OnRootChanged(); | 113 void OnRootChanged(); |
99 | 114 |
115 // Notify the delegate that the subtree rooted at |node| will be destroyed, | |
116 // then call DestroyNodeAndSubtree on it. | |
117 void DestroySubtree(AXNode* node); | |
David Tseng
2015/01/23 17:25:39
Maybe call this NotifySubtreeWillBeDeleted?
dmazzoni
2015/01/23 23:00:17
It notifies and destroys
| |
118 | |
100 // Call Destroy() on |node|, and delete it from the id map, and then | 119 // Call Destroy() on |node|, and delete it from the id map, and then |
101 // call recursively on all nodes in its subtree. | 120 // call recursively on all nodes in its subtree. |
102 void DestroyNodeAndSubtree(AXNode* node); | 121 void DestroyNodeAndSubtree(AXNode* node); |
103 | 122 |
104 // Iterate over the children of |node| and for each child, destroy the | 123 // 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 | 124 // child and its subtree if its id is not in |new_child_ids|. Returns |
106 // true on success, false on fatal error. | 125 // true on success, false on fatal error. |
107 bool DeleteOldChildren(AXNode* node, | 126 bool DeleteOldChildren(AXNode* node, |
108 const std::vector<int32> new_child_ids); | 127 const std::vector<int32> new_child_ids); |
109 | 128 |
110 // Iterate over |new_child_ids| and populate |new_children| with | 129 // Iterate over |new_child_ids| and populate |new_children| with |
111 // pointers to child nodes, reusing existing nodes already in the tree | 130 // pointers to child nodes, reusing existing nodes already in the tree |
112 // if they exist, and creating otherwise. Reparenting is disallowed, so | 131 // 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 | 132 // if the id already exists as the child of another node, that's an |
114 // error. Returns true on success, false on fatal error. | 133 // error. Returns true on success, false on fatal error. |
115 bool CreateNewChildVector(AXNode* node, | 134 bool CreateNewChildVector(AXNode* node, |
116 const std::vector<int32> new_child_ids, | 135 const std::vector<int32> new_child_ids, |
117 std::vector<AXNode*>* new_children, | 136 std::vector<AXNode*>* new_children, |
118 AXTreeUpdateState* update_state); | 137 AXTreeUpdateState* update_state); |
119 | 138 |
120 AXTreeDelegate* delegate_; | 139 AXTreeDelegate* delegate_; |
121 AXNode* root_; | 140 AXNode* root_; |
122 base::hash_map<int32, AXNode*> id_map_; | 141 base::hash_map<int32, AXNode*> id_map_; |
123 std::string error_; | 142 std::string error_; |
124 }; | 143 }; |
125 | 144 |
126 } // namespace ui | 145 } // namespace ui |
127 | 146 |
128 #endif // UI_ACCESSIBILITY_AX_TREE_H_ | 147 #endif // UI_ACCESSIBILITY_AX_TREE_H_ |
OLD | NEW |