Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: ui/accessibility/ax_tree_serializer.h

Issue 966833002: Fix a case where AXTreeSerializer didn't handle reparenting. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_SERIALIZER_H_ 5 #ifndef UI_ACCESSIBILITY_AX_TREE_SERIALIZER_H_
6 #define UI_ACCESSIBILITY_AX_TREE_SERIALIZER_H_ 6 #define UI_ACCESSIBILITY_AX_TREE_SERIALIZER_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"
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 } 285 }
286 286
287 template<typename AXSourceNode> 287 template<typename AXSourceNode>
288 void AXTreeSerializer<AXSourceNode>::SerializeChanges( 288 void AXTreeSerializer<AXSourceNode>::SerializeChanges(
289 AXSourceNode node, 289 AXSourceNode node,
290 AXTreeUpdate* out_update) { 290 AXTreeUpdate* out_update) {
291 // If the node isn't in the client tree, we need to serialize starting 291 // If the node isn't in the client tree, we need to serialize starting
292 // with the LCA. 292 // with the LCA.
293 AXSourceNode lca = LeastCommonAncestor(node); 293 AXSourceNode lca = LeastCommonAncestor(node);
294 294
295 if (client_root_) { 295 bool need_delete;
296 bool need_delete = false; 296 do {
297 if (tree_->IsValid(lca)) { 297 need_delete = false;
298 // Check for any reparenting within this subtree - if there is 298 if (client_root_) {
299 // any, we need to delete and reserialize the whole subtree 299 if (tree_->IsValid(lca)) {
300 // that contains the old and new parents of the reparented node. 300 // Check for any reparenting within this subtree - if there is
301 if (AnyDescendantWasReparented(lca, &lca)) 301 // any, we need to delete and reserialize the whole subtree
302 need_delete = true; 302 // that contains the old and new parents of the reparented node.
David Tseng 2015/02/27 19:00:47 Mention something about what's happening with the
303 if (AnyDescendantWasReparented(lca, &lca))
304 need_delete = true;
305 }
306
307 if (!tree_->IsValid(lca)) {
308 // If there's no LCA, just tell the client to destroy the whole
309 // tree and then we'll serialize everything from the new root.
310 out_update->node_id_to_clear = client_root_->id;
311 Reset();
312 } else if (need_delete) {
313 // Otherwise, if we need to reserialize a subtree, first we need
314 // to delete those nodes in our client tree so that
315 // SerializeChangedNodes() will be sure to send them again.
316 out_update->node_id_to_clear = tree_->GetId(lca);
317 ClientTreeNode* client_lca = ClientTreeNodeById(tree_->GetId(lca));
318 CHECK(client_lca);
319
320 for (size_t i = 0; i < client_lca->children.size(); ++i) {
David Tseng 2015/02/27 19:00:46 I actually think we should call DeleteClientSubtre
321 client_id_map_.erase(client_lca->children[i]->id);
322 DeleteClientSubtree(client_lca->children[i]);
David Tseng 2015/02/27 19:19:43 nit: not for this cl, but this really should be s/
323 delete client_lca->children[i];
324 }
325 client_lca->children.clear();
326 }
303 } 327 }
304 328
305 if (!tree_->IsValid(lca)) { 329 // If we deleted a client subtree, we have to call
306 // If there's no LCA, just tell the client to destroy the whole 330 // AnyDescendantWasReparented again because the computed LCA may be
307 // tree and then we'll serialize everything from the new root. 331 // different now.
David Tseng 2015/02/27 19:00:47 Not sure I like this comment here. Maybe put it ou
308 out_update->node_id_to_clear = client_root_->id; 332 } while (need_delete);
309 Reset();
310 } else if (need_delete) {
311 // Otherwise, if we need to reserialize a subtree, first we need
312 // to delete those nodes in our client tree so that
313 // SerializeChangedNodes() will be sure to send them again.
314 out_update->node_id_to_clear = tree_->GetId(lca);
315 ClientTreeNode* client_lca = ClientTreeNodeById(tree_->GetId(lca));
316 CHECK(client_lca);
317 for (size_t i = 0; i < client_lca->children.size(); ++i) {
318 client_id_map_.erase(client_lca->children[i]->id);
319 DeleteClientSubtree(client_lca->children[i]);
320 delete client_lca->children[i];
321 }
322 client_lca->children.clear();
323 }
324 }
325 333
326 // Serialize from the LCA, or from the root if there isn't one. 334 // Serialize from the LCA, or from the root if there isn't one.
327 if (!tree_->IsValid(lca)) 335 if (!tree_->IsValid(lca))
328 lca = tree_->GetRoot(); 336 lca = tree_->GetRoot();
329 SerializeChangedNodes(lca, out_update); 337 SerializeChangedNodes(lca, out_update);
330 } 338 }
331 339
332 template<typename AXSourceNode> 340 template<typename AXSourceNode>
333 void AXTreeSerializer<AXSourceNode>::DeleteClientSubtree(AXSourceNode node) { 341 void AXTreeSerializer<AXSourceNode>::DeleteClientSubtree(AXSourceNode node) {
334 ClientTreeNode* client_node = ClientTreeNodeById(tree_->GetId(node)); 342 ClientTreeNode* client_node = ClientTreeNodeById(tree_->GetId(node));
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 } 464 }
457 465
458 // Serialize all of the new children, recursively. 466 // Serialize all of the new children, recursively.
459 for (size_t i = 0; i < children_to_serialize.size(); ++i) 467 for (size_t i = 0; i < children_to_serialize.size(); ++i)
460 SerializeChangedNodes(children_to_serialize[i], out_update); 468 SerializeChangedNodes(children_to_serialize[i], out_update);
461 } 469 }
462 470
463 } // namespace ui 471 } // namespace ui
464 472
465 #endif // UI_ACCESSIBILITY_AX_TREE_SERIALIZER_H_ 473 #endif // UI_ACCESSIBILITY_AX_TREE_SERIALIZER_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698