Index: ui/accessibility/ax_tree_serializer.h |
diff --git a/ui/accessibility/ax_tree_serializer.h b/ui/accessibility/ax_tree_serializer.h |
index c5f2c0dd8fc745fc21fdbbf1ebdd2466b675fa9c..9c735e0118db1d9cb21b351a16b4b92b78e73ddf 100644 |
--- a/ui/accessibility/ax_tree_serializer.h |
+++ b/ui/accessibility/ax_tree_serializer.h |
@@ -172,10 +172,13 @@ AXTreeSerializer<AXSourceNode>::~AXTreeSerializer() { |
template<typename AXSourceNode> |
void AXTreeSerializer<AXSourceNode>::Reset() { |
- if (client_root_) { |
- DeleteClientSubtree(client_root_); |
- client_root_ = NULL; |
- } |
+ if (!client_root_) |
+ return; |
+ |
+ DeleteClientSubtree(client_root_); |
+ client_id_map_.erase(client_root_->id); |
+ delete client_root_; |
+ client_root_ = NULL; |
} |
template<typename AXSourceNode> |
@@ -305,9 +308,7 @@ void AXTreeSerializer<AXSourceNode>::SerializeChanges( |
// If there's no LCA, just tell the client to destroy the whole |
// tree and then we'll serialize everything from the new root. |
out_update->node_id_to_clear = client_root_->id; |
- DeleteClientSubtree(client_root_); |
- client_id_map_.erase(client_root_->id); |
- client_root_ = NULL; |
+ Reset(); |
} else if (need_delete) { |
// Otherwise, if we need to reserialize a subtree, first we need |
// to delete those nodes in our client tree so that |
@@ -318,6 +319,7 @@ void AXTreeSerializer<AXSourceNode>::SerializeChanges( |
for (size_t i = 0; i < client_lca->children.size(); ++i) { |
client_id_map_.erase(client_lca->children[i]->id); |
DeleteClientSubtree(client_lca->children[i]); |
+ delete client_lca->children[i]; |
} |
client_lca->children.clear(); |
} |
@@ -342,6 +344,7 @@ void AXTreeSerializer<AXSourceNode>::DeleteClientSubtree( |
for (size_t i = 0; i < client_node->children.size(); ++i) { |
client_id_map_.erase(client_node->children[i]->id); |
DeleteClientSubtree(client_node->children[i]); |
+ delete client_node->children[i]; |
} |
client_node->children.clear(); |
} |
@@ -365,10 +368,7 @@ void AXTreeSerializer<AXSourceNode>::SerializeChangedNodes( |
int id = tree_->GetId(node); |
ClientTreeNode* client_node = ClientTreeNodeById(id); |
if (!client_node) { |
- if (client_root_) { |
- client_id_map_.erase(client_root_->id); |
- DeleteClientSubtree(client_root_); |
- } |
+ Reset(); |
client_root_ = new ClientTreeNode(); |
client_node = client_root_; |
client_node->id = id; |
@@ -408,6 +408,7 @@ void AXTreeSerializer<AXSourceNode>::SerializeChangedNodes( |
if (new_child_ids.find(old_child_id) == new_child_ids.end()) { |
client_id_map_.erase(old_child_id); |
DeleteClientSubtree(old_child); |
+ delete old_child; |
} else { |
client_child_id_map[old_child_id] = old_child; |
} |