| Index: ui/accessibility/ax_tree.cc
|
| diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
|
| index ecfbae83005f21f4c19b24707a69c18fce6c4889..bb67a479e1cfc765e73077c9a76366e94524eb33 100644
|
| --- a/ui/accessibility/ax_tree.cc
|
| +++ b/ui/accessibility/ax_tree.cc
|
| @@ -88,11 +88,11 @@ bool AXTree::Unserialize(const AXTreeUpdate& update) {
|
| return false;
|
| }
|
| if (node == root_) {
|
| - DestroyNodeAndSubtree(root_);
|
| + DestroySubtree(root_);
|
| root_ = NULL;
|
| } else {
|
| for (int i = 0; i < node->child_count(); ++i)
|
| - DestroyNodeAndSubtree(node->ChildAtIndex(i));
|
| + DestroySubtree(node->ChildAtIndex(i));
|
| std::vector<AXNode*> children;
|
| node->SwapChildren(children);
|
| update_state.pending_nodes.insert(node);
|
| @@ -114,17 +114,25 @@ bool AXTree::Unserialize(const AXTreeUpdate& update) {
|
| }
|
|
|
| if (delegate_) {
|
| + std::set<AXNode*>& new_nodes = update_state.new_nodes;
|
| + std::vector<AXTreeDelegate::Change> changes;
|
| + changes.reserve(update.nodes.size());
|
| for (size_t i = 0; i < update.nodes.size(); ++i) {
|
| AXNode* node = GetFromId(update.nodes[i].id);
|
| - if (update_state.new_nodes.find(node) != update_state.new_nodes.end()) {
|
| - delegate_->OnNodeCreationFinished(node);
|
| - update_state.new_nodes.erase(node);
|
| + if (new_nodes.find(node) != new_nodes.end()) {
|
| + if (new_nodes.find(node->parent()) == new_nodes.end()) {
|
| + changes.push_back(
|
| + AXTreeDelegate::Change(node, AXTreeDelegate::SUBTREE_CREATED));
|
| + } else {
|
| + changes.push_back(
|
| + AXTreeDelegate::Change(node, AXTreeDelegate::NODE_CREATED));
|
| + }
|
| } else {
|
| - delegate_->OnNodeChangeFinished(node);
|
| + changes.push_back(
|
| + AXTreeDelegate::Change(node, AXTreeDelegate::NODE_CHANGED));
|
| }
|
| }
|
| - if (root_->id() != old_root_id)
|
| - delegate_->OnRootChanged(root_);
|
| + delegate_->OnAtomicUpdateFinished(root_->id() != old_root_id, changes);
|
| }
|
|
|
| return true;
|
| @@ -176,7 +184,7 @@ bool AXTree::UpdateNode(
|
| // anymore.
|
| if (!DeleteOldChildren(node, src.child_ids)) {
|
| if (new_root)
|
| - DestroyNodeAndSubtree(new_root);
|
| + DestroySubtree(new_root);
|
| return false;
|
| }
|
|
|
| @@ -191,13 +199,19 @@ bool AXTree::UpdateNode(
|
| if (src.role == AX_ROLE_ROOT_WEB_AREA &&
|
| (!root_ || root_->id() != src.id)) {
|
| if (root_)
|
| - DestroyNodeAndSubtree(root_);
|
| + DestroySubtree(root_);
|
| root_ = node;
|
| }
|
|
|
| return success;
|
| }
|
|
|
| +void AXTree::DestroySubtree(AXNode* node) {
|
| + if (delegate_)
|
| + delegate_->OnSubtreeWillBeDeleted(node);
|
| + DestroyNodeAndSubtree(node);
|
| +}
|
| +
|
| void AXTree::DestroyNodeAndSubtree(AXNode* node) {
|
| id_map_.erase(node->id());
|
| for (int i = 0; i < node->child_count(); ++i)
|
| @@ -226,7 +240,7 @@ bool AXTree::DeleteOldChildren(AXNode* node,
|
| for (size_t i = 0; i < old_children.size(); ++i) {
|
| int old_id = old_children[i]->id();
|
| if (new_child_id_set.find(old_id) == new_child_id_set.end())
|
| - DestroyNodeAndSubtree(old_children[i]);
|
| + DestroySubtree(old_children[i]);
|
| }
|
|
|
| return true;
|
|
|