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

Side by Side Diff: ui/accessibility/ax_tree.cc

Issue 2323103002: Add fuzzer for AXTree and fix a couple of bugs it found. (Closed)
Patch Set: Created 4 years, 3 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
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 #include "ui/accessibility/ax_tree.h" 5 #include "ui/accessibility/ax_tree.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 update_state->new_nodes.insert(node); 213 update_state->new_nodes.insert(node);
214 node->SetData(src); 214 node->SetData(src);
215 } 215 }
216 216
217 if (delegate_) 217 if (delegate_)
218 delegate_->OnNodeChanged(this, node); 218 delegate_->OnNodeChanged(this, node);
219 219
220 // First, delete nodes that used to be children of this node but aren't 220 // First, delete nodes that used to be children of this node but aren't
221 // anymore. 221 // anymore.
222 if (!DeleteOldChildren(node, src.child_ids, update_state)) { 222 if (!DeleteOldChildren(node, src.child_ids, update_state)) {
223 if (update_state->new_root) 223 if (update_state->new_root) {
224 DestroySubtree(update_state->new_root, update_state); 224 DestroySubtree(root_, update_state);
225 root_ = nullptr;
226 }
225 return false; 227 return false;
226 } 228 }
227 229
228 // Now build a new children vector, reusing nodes when possible, 230 // Now build a new children vector, reusing nodes when possible,
229 // and swap it in. 231 // and swap it in.
230 std::vector<AXNode*> new_children; 232 std::vector<AXNode*> new_children;
231 bool success = CreateNewChildVector( 233 bool success = CreateNewChildVector(
232 node, src.child_ids, &new_children, update_state); 234 node, src.child_ids, &new_children, update_state);
233 node->SwapChildren(new_children); 235 node->SwapChildren(new_children);
234 236
235 // Update the root of the tree if needed. 237 // Update the root of the tree if needed.
236 if (is_new_root) { 238 if (is_new_root) {
237 // Make sure root_ always points to something valid or null_, even inside 239 // Make sure root_ always points to something valid or null_, even inside
238 // DestroySubtree. 240 // DestroySubtree.
239 AXNode* old_root = root_; 241 AXNode* old_root = root_;
240 root_ = node; 242 root_ = node;
241 if (old_root) 243 if (old_root && old_root != node)
242 DestroySubtree(old_root, update_state); 244 DestroySubtree(old_root, update_state);
243 } 245 }
244 246
245 return success; 247 return success;
246 } 248 }
247 249
248 void AXTree::DestroySubtree(AXNode* node, 250 void AXTree::DestroySubtree(AXNode* node,
249 AXTreeUpdateState* update_state) { 251 AXTreeUpdateState* update_state) {
250 if (delegate_) 252 if (delegate_)
251 delegate_->OnSubtreeWillBeDeleted(this, node); 253 delegate_->OnSubtreeWillBeDeleted(this, node);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 update_state->pending_nodes.insert(child); 322 update_state->pending_nodes.insert(child);
321 update_state->new_nodes.insert(child); 323 update_state->new_nodes.insert(child);
322 } 324 }
323 new_children->push_back(child); 325 new_children->push_back(child);
324 } 326 }
325 327
326 return success; 328 return success;
327 } 329 }
328 330
329 } // namespace ui 331 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698