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

Side by Side Diff: content/renderer/accessibility/blink_ax_tree_source.cc

Issue 2205083002: Optimize BlinkAXTreeSource by adding freeze/thaw for things like root, focus. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 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 "content/renderer/accessibility/blink_ax_tree_source.h" 5 #include "content/renderer/accessibility/blink_ax_tree_source.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 AXContentNodeData* dst) { 104 AXContentNodeData* dst) {
105 std::vector<int32_t> ids; 105 std::vector<int32_t> ids;
106 for(size_t i = 0; i < objects.size(); i++) 106 for(size_t i = 0; i < objects.size(); i++)
107 ids.push_back(objects[i].axID()); 107 ids.push_back(objects[i].axID());
108 if (ids.size() > 0) 108 if (ids.size() > 0)
109 dst->AddIntListAttribute(attr, ids); 109 dst->AddIntListAttribute(attr, ids);
110 } 110 }
111 111
112 } // namespace 112 } // namespace
113 113
114 ScopedFreezeBlinkAXTreeSource::ScopedFreezeBlinkAXTreeSource(
115 BlinkAXTreeSource* tree_source)
116 : tree_source_(tree_source) {
117 tree_source_->Freeze();
118 }
David Tseng 2016/09/07 18:59:27 nit: indent
dmazzoni 2016/09/08 05:26:43 I'm not 100% sure what indentation error you saw,
119
120 ScopedFreezeBlinkAXTreeSource::~ScopedFreezeBlinkAXTreeSource() {
121 tree_source_->Thaw();
122 }
123
114 BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame) 124 BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame)
115 : render_frame_(render_frame), 125 : render_frame_(render_frame),
116 accessibility_focus_id_(-1) { 126 accessibility_focus_id_(-1),
127 frozen_(false) {
117 } 128 }
118 129
119 BlinkAXTreeSource::~BlinkAXTreeSource() { 130 BlinkAXTreeSource::~BlinkAXTreeSource() {
120 } 131 }
121 132
133 void BlinkAXTreeSource::Freeze() {
134 CHECK(!frozen_);
135
136 if (render_frame_ && render_frame_->GetWebFrame())
137 document_ = render_frame_->GetWebFrame()->document();
138 else
139 document_ = WebDocument();
140
141 if (!explicit_root_.isNull())
142 root_ = explicit_root_;
143 else if (!document_.isNull())
144 root_ = document_.accessibilityObject();
145 else
146 root_ = WebAXObject();
147
148 if (!document_.isNull())
149 focus_ = document_.focusedAccessibilityObject();
150 else
151 focus_ = WebAXObject();
152
153 frozen_ = true;
154 }
155
David Tseng 2016/09/07 18:59:27 Could we move this to the beginning of the functio
dmazzoni 2016/09/08 05:26:43 Sure, done.
156 void BlinkAXTreeSource::Thaw() {
157 CHECK(frozen_);
158 frozen_ = false;
159 }
160
122 void BlinkAXTreeSource::SetRoot(blink::WebAXObject root) { 161 void BlinkAXTreeSource::SetRoot(blink::WebAXObject root) {
123 root_ = root; 162 CHECK(!frozen_);
163 explicit_root_ = root;
124 } 164 }
125 165
126 bool BlinkAXTreeSource::IsInTree(blink::WebAXObject node) const { 166 bool BlinkAXTreeSource::IsInTree(blink::WebAXObject node) const {
127 const blink::WebAXObject& root = GetRoot(); 167 CHECK(frozen_);
128 while (IsValid(node)) { 168 while (IsValid(node)) {
129 if (node.equals(root)) 169 if (node.equals(root_))
130 return true; 170 return true;
131 node = GetParent(node); 171 node = GetParent(node);
132 } 172 }
133 return false; 173 return false;
134 } 174 }
135 175
136 bool BlinkAXTreeSource::GetTreeData(AXContentTreeData* tree_data) const { 176 bool BlinkAXTreeSource::GetTreeData(AXContentTreeData* tree_data) const {
137 blink::WebDocument document = BlinkAXTreeSource::GetMainDocument(); 177 CHECK(frozen_);
138 const blink::WebAXObject& root = GetRoot(); 178 tree_data->doctype = "html";
179 tree_data->loaded = root_.isLoaded();
180 tree_data->loading_progress = root_.estimatedLoadingProgress();
181 tree_data->mimetype =
182 document_.isXHTMLDocument() ? "text/xhtml" : "text/html";
183 tree_data->title = document_.title().utf8();
184 tree_data->url = document_.url().string().utf8();
139 185
140 tree_data->doctype = "html"; 186 if (!focus_.isNull())
141 tree_data->loaded = root.isLoaded(); 187 tree_data->focus_id = focus_.axID();
142 tree_data->loading_progress = root.estimatedLoadingProgress();
143 tree_data->mimetype = document.isXHTMLDocument() ? "text/xhtml" : "text/html";
144 tree_data->title = document.title().utf8();
145 tree_data->url = document.url().string().utf8();
146
147 WebAXObject focus = document.focusedAccessibilityObject();
148 if (!focus.isNull())
149 tree_data->focus_id = focus.axID();
150 188
151 WebAXObject anchor_object, focus_object; 189 WebAXObject anchor_object, focus_object;
152 int anchor_offset, focus_offset; 190 int anchor_offset, focus_offset;
153 blink::WebAXTextAffinity anchor_affinity, focus_affinity; 191 blink::WebAXTextAffinity anchor_affinity, focus_affinity;
154 root.selection(anchor_object, anchor_offset, anchor_affinity, 192 root_.selection(anchor_object, anchor_offset, anchor_affinity,
155 focus_object, focus_offset, focus_affinity); 193 focus_object, focus_offset, focus_affinity);
156 if (!anchor_object.isNull() && !focus_object.isNull() && 194 if (!anchor_object.isNull() && !focus_object.isNull() &&
157 anchor_offset >= 0 && focus_offset >= 0) { 195 anchor_offset >= 0 && focus_offset >= 0) {
158 int32_t anchor_id = anchor_object.axID(); 196 int32_t anchor_id = anchor_object.axID();
159 int32_t focus_id = focus_object.axID(); 197 int32_t focus_id = focus_object.axID();
160 tree_data->sel_anchor_object_id = anchor_id; 198 tree_data->sel_anchor_object_id = anchor_id;
161 tree_data->sel_anchor_offset = anchor_offset; 199 tree_data->sel_anchor_offset = anchor_offset;
162 tree_data->sel_focus_object_id = focus_id; 200 tree_data->sel_focus_object_id = focus_id;
163 tree_data->sel_focus_offset = focus_offset; 201 tree_data->sel_focus_offset = focus_offset;
164 tree_data->sel_anchor_affinity = AXTextAffinityFromBlink(anchor_affinity); 202 tree_data->sel_anchor_affinity = AXTextAffinityFromBlink(anchor_affinity);
165 tree_data->sel_focus_affinity = AXTextAffinityFromBlink(focus_affinity); 203 tree_data->sel_focus_affinity = AXTextAffinityFromBlink(focus_affinity);
166 } 204 }
167 205
168 // Get the tree ID for this frame and the parent frame. 206 // Get the tree ID for this frame and the parent frame.
169 WebLocalFrame* web_frame = document.frame(); 207 WebLocalFrame* web_frame = document_.frame();
170 if (web_frame) { 208 if (web_frame) {
171 RenderFrame* render_frame = RenderFrame::FromWebFrame(web_frame); 209 RenderFrame* render_frame = RenderFrame::FromWebFrame(web_frame);
172 tree_data->routing_id = render_frame->GetRoutingID(); 210 tree_data->routing_id = render_frame->GetRoutingID();
173 211
174 // Get the tree ID for the parent frame. 212 // Get the tree ID for the parent frame.
175 blink::WebFrame* parent_web_frame = web_frame->parent(); 213 blink::WebFrame* parent_web_frame = web_frame->parent();
176 if (parent_web_frame) { 214 if (parent_web_frame) {
177 tree_data->parent_routing_id = 215 tree_data->parent_routing_id =
178 GetRoutingIdForFrameOrProxy(parent_web_frame); 216 GetRoutingIdForFrameOrProxy(parent_web_frame);
179 } 217 }
180 } 218 }
181 219
182 return true; 220 return true;
183 } 221 }
184 222
185 blink::WebAXObject BlinkAXTreeSource::GetRoot() const { 223 blink::WebAXObject BlinkAXTreeSource::GetRoot() const {
186 if (!root_.isNull()) 224 CHECK(frozen_);
187 return root_; 225 return root_;
188 return GetMainDocument().accessibilityObject();
189 } 226 }
190 227
191 blink::WebAXObject BlinkAXTreeSource::GetFromId(int32_t id) const { 228 blink::WebAXObject BlinkAXTreeSource::GetFromId(int32_t id) const {
192 return GetMainDocument().accessibilityObjectFromID(id); 229 return GetMainDocument().accessibilityObjectFromID(id);
193 } 230 }
194 231
195 int32_t BlinkAXTreeSource::GetId(blink::WebAXObject node) const { 232 int32_t BlinkAXTreeSource::GetId(blink::WebAXObject node) const {
196 return node.axID(); 233 return node.axID();
197 } 234 }
198 235
199 void BlinkAXTreeSource::GetChildren( 236 void BlinkAXTreeSource::GetChildren(
200 blink::WebAXObject parent, 237 blink::WebAXObject parent,
201 std::vector<blink::WebAXObject>* out_children) const { 238 std::vector<blink::WebAXObject>* out_children) const {
239 CHECK(frozen_);
240
202 if (parent.role() == blink::WebAXRoleStaticText) { 241 if (parent.role() == blink::WebAXRoleStaticText) {
203 blink::WebAXObject ancestor = parent; 242 blink::WebAXObject ancestor = parent;
204 while (!ancestor.isDetached()) { 243 while (!ancestor.isDetached()) {
205 int32_t focus_id = GetMainDocument().focusedAccessibilityObject().axID(); 244 int32_t focus_id = focus_.axID();
206 if (ancestor.axID() == accessibility_focus_id_ || 245 if (ancestor.axID() == accessibility_focus_id_ ||
207 (ancestor.axID() == focus_id && ancestor.isEditable())) { 246 (ancestor.axID() == focus_id && ancestor.isEditable())) {
208 parent.loadInlineTextBoxes(); 247 parent.loadInlineTextBoxes();
209 break; 248 break;
210 } 249 }
211 ancestor = ancestor.parentObject(); 250 ancestor = ancestor.parentObject();
212 } 251 }
213 } 252 }
214 253
215 bool is_iframe = false; 254 bool is_iframe = false;
(...skipping 12 matching lines...) Expand all
228 // As an exception, include children of an iframe element. 267 // As an exception, include children of an iframe element.
229 if (!is_iframe && !IsParentUnignoredOf(parent, child)) 268 if (!is_iframe && !IsParentUnignoredOf(parent, child))
230 continue; 269 continue;
231 270
232 out_children->push_back(child); 271 out_children->push_back(child);
233 } 272 }
234 } 273 }
235 274
236 blink::WebAXObject BlinkAXTreeSource::GetParent( 275 blink::WebAXObject BlinkAXTreeSource::GetParent(
237 blink::WebAXObject node) const { 276 blink::WebAXObject node) const {
277 CHECK(frozen_);
278
238 // Blink returns ignored objects when walking up the parent chain, 279 // Blink returns ignored objects when walking up the parent chain,
239 // we have to skip those here. Also, stop when we get to the root 280 // we have to skip those here. Also, stop when we get to the root
240 // element. 281 // element.
241 blink::WebAXObject root = GetRoot();
242 do { 282 do {
243 if (node.equals(root)) 283 if (node.equals(root_))
244 return blink::WebAXObject(); 284 return blink::WebAXObject();
245 node = node.parentObject(); 285 node = node.parentObject();
246 } while (!node.isDetached() && node.accessibilityIsIgnored()); 286 } while (!node.isDetached() && node.accessibilityIsIgnored());
247 287
248 return node; 288 return node;
249 } 289 }
250 290
251 bool BlinkAXTreeSource::IsValid(blink::WebAXObject node) const { 291 bool BlinkAXTreeSource::IsValid(blink::WebAXObject node) const {
252 return !node.isDetached(); // This also checks if it's null. 292 return !node.isDetached(); // This also checks if it's null.
253 } 293 }
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x()); 722 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x());
683 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y()); 723 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y());
684 724
685 const gfx::Point& maxScrollOffset = src.maximumScrollOffset(); 725 const gfx::Point& maxScrollOffset = src.maximumScrollOffset();
686 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, maxScrollOffset.x()); 726 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, maxScrollOffset.x());
687 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, maxScrollOffset.y()); 727 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, maxScrollOffset.y());
688 } 728 }
689 } 729 }
690 730
691 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { 731 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const {
692 if (render_frame_ && render_frame_->GetWebFrame()) 732 CHECK(frozen_);
693 return render_frame_->GetWebFrame()->document(); 733 return document_;
694 return WebDocument();
695 } 734 }
696 735
697 } // namespace content 736 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698