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

Side by Side Diff: chrome/browser/ui/aura/accessibility/automation_manager_aura.cc

Issue 2929673002: Add null check when reporting changed nodes to an AX tree. (Closed)
Patch Set: Fix underlying issue too Created 3 years, 6 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 | ui/accessibility/ax_tree.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/ui/aura/accessibility/automation_manager_aura.h" 5 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/memory/singleton.h" 9 #include "base/memory/singleton.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 141
142 if (!context) { 142 if (!context) {
143 LOG(WARNING) << "Accessibility notification but no browser context"; 143 LOG(WARNING) << "Accessibility notification but no browser context";
144 return; 144 return;
145 } 145 }
146 146
147 if (processing_events_) { 147 if (processing_events_) {
148 pending_events_.push_back(std::make_pair(aura_obj, event_type)); 148 pending_events_.push_back(std::make_pair(aura_obj, event_type));
149 return; 149 return;
150 } 150 }
151
152 // Avoid sending events on objects that aren't connected via a chain
153 // of ancestors all the way the root desktop node. The most common
David Tseng 2017/06/21 15:44:46 nit: to the
dmazzoni 2017/06/23 19:48:51 Done.
154 // case we're trying to avoid is where an object is part of an
155 // invisible subtree; the object itself thinks it's visible, but one
David Tseng 2017/06/21 16:09:50 One more note: if this is true, then I think View:
dmazzoni 2017/06/23 19:48:51 I don't think that's robust. The problem is that
156 // of its ancestors is invisible so not part of the automation
157 // tree. If we don't do this check, we can end up serializing an
158 // update that can't be unserialized.
159 views::AXAuraObjWrapper* root = current_tree_->GetRoot();
160 views::AXAuraObjWrapper* walker = aura_obj;
161 while (walker != root) {
162 views::AXAuraObjWrapper* parent = walker->GetParent();
163 if (!parent)
David Tseng 2017/06/21 15:44:46 I can see why this happens, but I think the detach
dmazzoni 2017/06/23 19:48:51 Yes, this was the location change, but I think it
164 return;
165 std::vector<views::AXAuraObjWrapper*> children;
166 walker->GetChildren(&children);
167 bool found = false;
168 for (size_t i = 0; i < children.size(); ++i) {
169 if (children[i] == walker) {
David Tseng 2017/06/21 16:09:50 Also, this doesn't make sense to me. Did you mean
dmazzoni 2017/06/23 19:48:51 You're right. The code above should have called pa
170 found = true;
171 break;
172 }
173 }
174 if (!found)
175 return;
176 }
177
151 processing_events_ = true; 178 processing_events_ = true;
152 179
153 ExtensionMsg_AccessibilityEventParams params; 180 ExtensionMsg_AccessibilityEventParams params;
154 if (!current_tree_serializer_->SerializeChanges(aura_obj, &params.update)) { 181 if (!current_tree_serializer_->SerializeChanges(aura_obj, &params.update)) {
155 LOG(ERROR) << "Unable to serialize one accessibility event."; 182 LOG(ERROR) << "Unable to serialize one accessibility event.";
156 return; 183 return;
157 } 184 }
158 185
159 // Make sure the focused node is serialized. 186 // Make sure the focused node is serialized.
160 views::AXAuraObjWrapper* focus = 187 views::AXAuraObjWrapper* focus =
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 } 255 }
229 } 256 }
230 257
231 // Otherwise, fire the event directly on the Window. 258 // Otherwise, fire the event directly on the Window.
232 views::AXAuraObjWrapper* window_wrapper = 259 views::AXAuraObjWrapper* window_wrapper =
233 views::AXAuraObjCache::GetInstance()->GetOrCreate(window); 260 views::AXAuraObjCache::GetInstance()->GetOrCreate(window);
234 if (window_wrapper) 261 if (window_wrapper)
235 SendEvent(nullptr, window_wrapper, action.hit_test_event_to_fire); 262 SendEvent(nullptr, window_wrapper, action.hit_test_event_to_fire);
236 #endif 263 #endif
237 } 264 }
OLDNEW
« no previous file with comments | « no previous file | ui/accessibility/ax_tree.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698