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

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

Issue 1435113003: Make use of new AX name calc in Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix ChromeVox and Automation API tests Created 5 years, 1 month 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 <set> 7 #include <set>
8 8
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr, 101 void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr,
102 WebVector<WebAXObject> objects, 102 WebVector<WebAXObject> objects,
103 AXContentNodeData* dst) { 103 AXContentNodeData* dst) {
104 std::vector<int32> ids; 104 std::vector<int32> ids;
105 for(size_t i = 0; i < objects.size(); i++) 105 for(size_t i = 0; i < objects.size(); i++)
106 ids.push_back(objects[i].axID()); 106 ids.push_back(objects[i].axID());
107 if (ids.size() > 0) 107 if (ids.size() > 0)
108 dst->AddIntListAttribute(attr, ids); 108 dst->AddIntListAttribute(attr, ids);
109 } 109 }
110 110
111 } // Anonymous namespace 111 std::string ToUTF8(const blink::WebString& str) {
112 return UTF16ToUTF8(base::StringPiece16(str));
113 }
114
115 } // namespace
112 116
113 BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame) 117 BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame)
114 : render_frame_(render_frame), 118 : render_frame_(render_frame),
115 accessibility_focus_id_(-1) { 119 accessibility_focus_id_(-1) {
116 } 120 }
117 121
118 BlinkAXTreeSource::~BlinkAXTreeSource() { 122 BlinkAXTreeSource::~BlinkAXTreeSource() {
119 } 123 }
120 124
121 void BlinkAXTreeSource::SetRoot(blink::WebAXObject root) { 125 void BlinkAXTreeSource::SetRoot(blink::WebAXObject root) {
(...skipping 17 matching lines...) Expand all
139 const blink::WebAXObject& root = GetRoot(); 143 const blink::WebAXObject& root = GetRoot();
140 144
141 tree_data.title = document.title().utf8(); 145 tree_data.title = document.title().utf8();
142 tree_data.url = document.url().spec(); 146 tree_data.url = document.url().spec();
143 tree_data.mimetype = document.isXHTMLDocument() ? "text/xhtml" : "text/html"; 147 tree_data.mimetype = document.isXHTMLDocument() ? "text/xhtml" : "text/html";
144 tree_data.loaded = root.isLoaded(); 148 tree_data.loaded = root.isLoaded();
145 tree_data.loading_progress = root.estimatedLoadingProgress(); 149 tree_data.loading_progress = root.estimatedLoadingProgress();
146 150
147 const WebDocumentType& doctype = document.doctype(); 151 const WebDocumentType& doctype = document.doctype();
148 if (!doctype.isNull()) 152 if (!doctype.isNull())
149 tree_data.doctype = UTF16ToUTF8(base::StringPiece16(doctype.name())); 153 tree_data.doctype = ToUTF8(doctype.name());
150 154
151 WebAXObject anchor_object, focus_object; 155 WebAXObject anchor_object, focus_object;
152 int anchor_offset, focus_offset; 156 int anchor_offset, focus_offset;
153 root.selection(anchor_object, anchor_offset, focus_object, focus_offset); 157 root.selection(anchor_object, anchor_offset, focus_object, focus_offset);
154 if (!anchor_object.isNull() && !focus_object.isNull() && 158 if (!anchor_object.isNull() && !focus_object.isNull() &&
155 anchor_offset >= 0 && focus_offset >= 0) { 159 anchor_offset >= 0 && focus_offset >= 0) {
156 int32 anchor_id = anchor_object.axID(); 160 int32 anchor_id = anchor_object.axID();
157 int32 focus_id = focus_object.axID(); 161 int32 focus_id = focus_object.axID();
158 tree_data.sel_anchor_object_id = anchor_id; 162 tree_data.sel_anchor_object_id = anchor_id;
159 tree_data.sel_anchor_offset = anchor_offset; 163 tree_data.sel_anchor_offset = anchor_offset;
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 blink::WebAXObject BlinkAXTreeSource::GetNull() const { 260 blink::WebAXObject BlinkAXTreeSource::GetNull() const {
257 return blink::WebAXObject(); 261 return blink::WebAXObject();
258 } 262 }
259 263
260 void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src, 264 void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src,
261 AXContentNodeData* dst) const { 265 AXContentNodeData* dst) const {
262 dst->role = AXRoleFromBlink(src.role()); 266 dst->role = AXRoleFromBlink(src.role());
263 dst->state = AXStateFromBlink(src); 267 dst->state = AXStateFromBlink(src);
264 dst->location = src.boundingBoxRect(); 268 dst->location = src.boundingBoxRect();
265 dst->id = src.axID(); 269 dst->id = src.axID();
266 std::string name = UTF16ToUTF8(base::StringPiece16(src.deprecatedTitle())); 270
271 blink::WebAXNameFrom nameFrom;
272 blink::WebVector<blink::WebAXObject> nameObjects;
273 blink::WebString web_name = src.name(nameFrom, nameObjects);
274 if (!web_name.isEmpty()) {
275 dst->AddStringAttribute(ui::AX_ATTR_NAME, ToUTF8(web_name));
276 dst->AddIntAttribute(ui::AX_ATTR_NAME_FROM, AXNameFromFromBlink(nameFrom));
277 AddIntListAttributeFromWebObjects(
278 ui::AX_ATTR_LABELLEDBY_IDS, nameObjects, dst);
279 }
280
281 blink::WebAXDescriptionFrom descriptionFrom;
282 blink::WebVector<blink::WebAXObject> descriptionObjects;
283 blink::WebString web_description = src.description(
aboxhall 2015/11/13 23:13:49 more spaces??
dmazzoni 2015/11/16 18:52:04 Same - the code looks fine to me. Is codereview.ch
aboxhall 2015/11/16 22:03:27 Super weird. Yeah, it looks fine now.
284 nameFrom, descriptionFrom, descriptionObjects);
285 if (!web_description.isEmpty()) {
286 dst->AddStringAttribute(ui::AX_ATTR_DESCRIPTION, ToUTF8(web_description));
287 dst->AddIntAttribute(ui::AX_ATTR_DESCRIPTION_FROM,
288 AXDescriptionFromFromBlink(descriptionFrom));
289 AddIntListAttributeFromWebObjects(
290 ui::AX_ATTR_DESCRIBEDBY_IDS, descriptionObjects, dst);
291 }
292
293 blink::WebString web_placeholder = src.placeholder(nameFrom, descriptionFrom);
294 if (!web_placeholder.isEmpty())
295 dst->AddStringAttribute(ui::AX_ATTR_PLACEHOLDER, ToUTF8(web_placeholder));
267 296
268 std::string value; 297 std::string value;
269 if (src.valueDescription().length()) { 298 if (src.valueDescription().length()) {
270 dst->AddStringAttribute(ui::AX_ATTR_VALUE, 299 dst->AddStringAttribute(ui::AX_ATTR_VALUE, ToUTF8(src.valueDescription()));
271 UTF16ToUTF8(base::StringPiece16(
272 src.valueDescription())));
273 } else { 300 } else {
274 dst->AddStringAttribute( 301 dst->AddStringAttribute(ui::AX_ATTR_VALUE, ToUTF8(src.stringValue()));
275 ui::AX_ATTR_VALUE,
276 UTF16ToUTF8(base::StringPiece16(src.stringValue())));
277 } 302 }
278 303
279 if (dst->role == ui::AX_ROLE_COLOR_WELL) 304 if (dst->role == ui::AX_ROLE_COLOR_WELL)
280 dst->AddIntAttribute(ui::AX_ATTR_COLOR_VALUE, src.colorValue()); 305 dst->AddIntAttribute(ui::AX_ATTR_COLOR_VALUE, src.colorValue());
281 306
282 307
283 // Text attributes. 308 // Text attributes.
284 if (src.backgroundColor()) 309 if (src.backgroundColor())
285 dst->AddIntAttribute(ui::AX_ATTR_BACKGROUND_COLOR, src.backgroundColor()); 310 dst->AddIntAttribute(ui::AX_ATTR_BACKGROUND_COLOR, src.backgroundColor());
286 311
287 if (src.color()) 312 if (src.color())
288 dst->AddIntAttribute(ui::AX_ATTR_COLOR, src.color()); 313 dst->AddIntAttribute(ui::AX_ATTR_COLOR, src.color());
289 314
290 // Font size is in pixels. 315 // Font size is in pixels.
291 if (src.fontSize()) 316 if (src.fontSize())
292 dst->AddFloatAttribute(ui::AX_ATTR_FONT_SIZE, src.fontSize()); 317 dst->AddFloatAttribute(ui::AX_ATTR_FONT_SIZE, src.fontSize());
293 318
294 if (src.invalidState()) { 319 if (src.invalidState()) {
295 dst->AddIntAttribute(ui::AX_ATTR_INVALID_STATE, 320 dst->AddIntAttribute(ui::AX_ATTR_INVALID_STATE,
296 AXInvalidStateFromBlink(src.invalidState())); 321 AXInvalidStateFromBlink(src.invalidState()));
297 } 322 }
298 if (src.invalidState() == blink::WebAXInvalidStateOther) { 323 if (src.invalidState() == blink::WebAXInvalidStateOther) {
299 dst->AddStringAttribute( 324 dst->AddStringAttribute(
300 ui::AX_ATTR_ARIA_INVALID_VALUE, 325 ui::AX_ATTR_ARIA_INVALID_VALUE, ToUTF8(src.ariaInvalidValue()));
301 UTF16ToUTF8(base::StringPiece16(src.ariaInvalidValue())));
302 } 326 }
303 327
304 if (src.textDirection()) { 328 if (src.textDirection()) {
305 dst->AddIntAttribute(ui::AX_ATTR_TEXT_DIRECTION, 329 dst->AddIntAttribute(ui::AX_ATTR_TEXT_DIRECTION,
306 AXTextDirectionFromBlink(src.textDirection())); 330 AXTextDirectionFromBlink(src.textDirection()));
307 } 331 }
308 332
309 if (src.textStyle()) { 333 if (src.textStyle()) {
310 dst->AddIntAttribute(ui::AX_ATTR_TEXT_STYLE, 334 dst->AddIntAttribute(ui::AX_ATTR_TEXT_STYLE,
311 AXTextStyleFromBlink(src.textStyle())); 335 AXTextStyleFromBlink(src.textStyle()));
(...skipping 18 matching lines...) Expand all
330 word_ends.reserve(src_word_starts.size()); 354 word_ends.reserve(src_word_starts.size());
331 for (size_t i = 0; i < src_word_starts.size(); ++i) { 355 for (size_t i = 0; i < src_word_starts.size(); ++i) {
332 word_starts.push_back(src_word_starts[i]); 356 word_starts.push_back(src_word_starts[i]);
333 word_ends.push_back(src_word_ends[i]); 357 word_ends.push_back(src_word_ends[i]);
334 } 358 }
335 dst->AddIntListAttribute(ui::AX_ATTR_WORD_STARTS, word_starts); 359 dst->AddIntListAttribute(ui::AX_ATTR_WORD_STARTS, word_starts);
336 dst->AddIntListAttribute(ui::AX_ATTR_WORD_ENDS, word_ends); 360 dst->AddIntListAttribute(ui::AX_ATTR_WORD_ENDS, word_ends);
337 } 361 }
338 362
339 if (src.accessKey().length()) { 363 if (src.accessKey().length()) {
340 dst->AddStringAttribute(ui::AX_ATTR_ACCESS_KEY, 364 dst->AddStringAttribute(ui::AX_ATTR_ACCESS_KEY, ToUTF8(src.accessKey()));
341 UTF16ToUTF8(base::StringPiece16(src.accessKey())));
342 } 365 }
343 366
344 if (src.actionVerb().length()) 367 if (src.actionVerb().length())
345 dst->AddStringAttribute( 368 dst->AddStringAttribute(ui::AX_ATTR_ACTION, ToUTF8(src.actionVerb()));
346 ui::AX_ATTR_ACTION,
347 UTF16ToUTF8(base::StringPiece16(src.actionVerb())));
348 if (src.ariaAutoComplete().length()) 369 if (src.ariaAutoComplete().length())
349 dst->AddStringAttribute( 370 dst->AddStringAttribute(
350 ui::AX_ATTR_AUTO_COMPLETE, 371 ui::AX_ATTR_AUTO_COMPLETE, ToUTF8(src.ariaAutoComplete()));
351 UTF16ToUTF8(base::StringPiece16(src.ariaAutoComplete())));
352 if (src.isAriaReadOnly()) 372 if (src.isAriaReadOnly())
353 dst->AddBoolAttribute(ui::AX_ATTR_ARIA_READONLY, true); 373 dst->AddBoolAttribute(ui::AX_ATTR_ARIA_READONLY, true);
354 if (src.isButtonStateMixed()) 374 if (src.isButtonStateMixed())
355 dst->AddBoolAttribute(ui::AX_ATTR_BUTTON_MIXED, true); 375 dst->AddBoolAttribute(ui::AX_ATTR_BUTTON_MIXED, true);
356 if (src.canSetValueAttribute()) 376 if (src.canSetValueAttribute())
357 dst->AddBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE, true); 377 dst->AddBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE, true);
358 if (src.deprecatedAccessibilityDescription().length()) {
359 dst->AddStringAttribute(
360 ui::AX_ATTR_DESCRIPTION,
361 UTF16ToUTF8(base::StringPiece16(
362 src.deprecatedAccessibilityDescription())));
363 }
364 if (src.hasComputedStyle()) { 378 if (src.hasComputedStyle()) {
365 dst->AddStringAttribute( 379 dst->AddStringAttribute(
366 ui::AX_ATTR_DISPLAY, 380 ui::AX_ATTR_DISPLAY, ToUTF8(src.computedStyleDisplay()));
367 UTF16ToUTF8(base::StringPiece16(src.computedStyleDisplay())));
368 }
369 if (src.deprecatedHelpText().length())
370 dst->AddStringAttribute(
371 ui::AX_ATTR_HELP,
372 UTF16ToUTF8(base::StringPiece16((src.deprecatedHelpText()))));
373 if (src.deprecatedPlaceholder().length()) {
374 dst->AddStringAttribute(
375 ui::AX_ATTR_PLACEHOLDER,
376 UTF16ToUTF8(base::StringPiece16(src.deprecatedPlaceholder())));
377 } 381 }
378 if (src.keyboardShortcut().length()) { 382 if (src.keyboardShortcut().length()) {
379 dst->AddStringAttribute( 383 dst->AddStringAttribute(
380 ui::AX_ATTR_SHORTCUT, 384 ui::AX_ATTR_SHORTCUT,
381 UTF16ToUTF8(base::StringPiece16(src.keyboardShortcut()))); 385 UTF16ToUTF8(base::StringPiece16(src.keyboardShortcut())));
382 } 386 }
383 if (!src.deprecatedTitleUIElement().isDetached()) {
384 dst->AddIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT,
385 src.deprecatedTitleUIElement().axID());
386 }
387 if (!src.ariaActiveDescendant().isDetached()) { 387 if (!src.ariaActiveDescendant().isDetached()) {
388 dst->AddIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID, 388 dst->AddIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID,
389 src.ariaActiveDescendant().axID()); 389 src.ariaActiveDescendant().axID());
390 } 390 }
391 391
392 if (!src.url().isEmpty()) 392 if (!src.url().isEmpty())
393 dst->AddStringAttribute(ui::AX_ATTR_URL, src.url().spec()); 393 dst->AddStringAttribute(ui::AX_ATTR_URL, src.url().spec());
394 394
395 if (dst->role == ui::AX_ROLE_HEADING) 395 if (dst->role == ui::AX_ROLE_HEADING)
396 dst->AddIntAttribute(ui::AX_ATTR_HIERARCHICAL_LEVEL, src.headingLevel()); 396 dst->AddIntAttribute(ui::AX_ATTR_HIERARCHICAL_LEVEL, src.headingLevel());
(...skipping 29 matching lines...) Expand all
426 // TODO(ctguil): The tagName in WebKit is lower cased but 426 // TODO(ctguil): The tagName in WebKit is lower cased but
427 // HTMLElement::nodeName calls localNameUpper. Consider adding 427 // HTMLElement::nodeName calls localNameUpper. Consider adding
428 // a WebElement method that returns the original lower cased tagName. 428 // a WebElement method that returns the original lower cased tagName.
429 dst->AddStringAttribute( 429 dst->AddStringAttribute(
430 ui::AX_ATTR_HTML_TAG, 430 ui::AX_ATTR_HTML_TAG,
431 base::ToLowerASCII(UTF16ToUTF8( 431 base::ToLowerASCII(UTF16ToUTF8(
432 base::StringPiece16(element.tagName())))); 432 base::StringPiece16(element.tagName()))));
433 for (unsigned i = 0; i < element.attributeCount(); ++i) { 433 for (unsigned i = 0; i < element.attributeCount(); ++i) {
434 std::string name = base::ToLowerASCII(UTF16ToUTF8( 434 std::string name = base::ToLowerASCII(UTF16ToUTF8(
435 base::StringPiece16(element.attributeLocalName(i)))); 435 base::StringPiece16(element.attributeLocalName(i))));
436 std::string value = 436 std::string value = ToUTF8(element.attributeValue(i));
437 UTF16ToUTF8(base::StringPiece16(element.attributeValue(i)));
438 dst->html_attributes.push_back(std::make_pair(name, value)); 437 dst->html_attributes.push_back(std::make_pair(name, value));
439 } 438 }
440 439
441 if (src.isEditable()) { 440 if (src.isEditable()) {
442 dst->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_START, src.selectionStart()); 441 dst->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_START, src.selectionStart());
443 dst->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_END, src.selectionEnd()); 442 dst->AddIntAttribute(ui::AX_ATTR_TEXT_SEL_END, src.selectionEnd());
444 443
445 WebVector<int> src_line_breaks; 444 WebVector<int> src_line_breaks;
446 src.lineBreaks(src_line_breaks); 445 src.lineBreaks(src_line_breaks);
447 if (src_line_breaks.size() > 0) { 446 if (src_line_breaks.size() > 0) {
448 std::vector<int32> line_breaks; 447 std::vector<int32> line_breaks;
449 line_breaks.reserve(src_line_breaks.size()); 448 line_breaks.reserve(src_line_breaks.size());
450 for (size_t i = 0; i < src_line_breaks.size(); ++i) 449 for (size_t i = 0; i < src_line_breaks.size(); ++i)
451 line_breaks.push_back(src_line_breaks[i]); 450 line_breaks.push_back(src_line_breaks[i]);
452 dst->AddIntListAttribute(ui::AX_ATTR_LINE_BREAKS, line_breaks); 451 dst->AddIntListAttribute(ui::AX_ATTR_LINE_BREAKS, line_breaks);
453 } 452 }
454 } 453 }
455 454
456 // ARIA role. 455 // ARIA role.
457 if (element.hasAttribute("role")) { 456 if (element.hasAttribute("role")) {
458 dst->AddStringAttribute( 457 dst->AddStringAttribute(
459 ui::AX_ATTR_ROLE, 458 ui::AX_ATTR_ROLE, ToUTF8(element.getAttribute("role")));
460 UTF16ToUTF8(base::StringPiece16(element.getAttribute("role"))));
461 } else { 459 } else {
462 std::string role = GetEquivalentAriaRoleString(dst->role); 460 std::string role = GetEquivalentAriaRoleString(dst->role);
463 if (!role.empty()) 461 if (!role.empty())
464 dst->AddStringAttribute(ui::AX_ATTR_ROLE, role); 462 dst->AddStringAttribute(ui::AX_ATTR_ROLE, role);
465 else if (dst->role == ui::AX_ROLE_TIME) 463 else if (dst->role == ui::AX_ROLE_TIME)
466 dst->AddStringAttribute(ui::AX_ATTR_ROLE, "time"); 464 dst->AddStringAttribute(ui::AX_ATTR_ROLE, "time");
467 } 465 }
468 466
469 // Browser plugin (used in a <webview>). 467 // Browser plugin (used in a <webview>).
470 BrowserPlugin* browser_plugin = BrowserPlugin::GetFromNode(element); 468 BrowserPlugin* browser_plugin = BrowserPlugin::GetFromNode(element);
(...skipping 18 matching lines...) Expand all
489 } 487 }
490 } 488 }
491 489
492 if (src.isInLiveRegion()) { 490 if (src.isInLiveRegion()) {
493 dst->AddBoolAttribute(ui::AX_ATTR_LIVE_ATOMIC, src.liveRegionAtomic()); 491 dst->AddBoolAttribute(ui::AX_ATTR_LIVE_ATOMIC, src.liveRegionAtomic());
494 dst->AddBoolAttribute(ui::AX_ATTR_LIVE_BUSY, src.liveRegionBusy()); 492 dst->AddBoolAttribute(ui::AX_ATTR_LIVE_BUSY, src.liveRegionBusy());
495 if (src.liveRegionBusy()) 493 if (src.liveRegionBusy())
496 dst->state |= (1 << ui::AX_STATE_BUSY); 494 dst->state |= (1 << ui::AX_STATE_BUSY);
497 if (!src.liveRegionStatus().isEmpty()) { 495 if (!src.liveRegionStatus().isEmpty()) {
498 dst->AddStringAttribute( 496 dst->AddStringAttribute(
499 ui::AX_ATTR_LIVE_STATUS, 497 ui::AX_ATTR_LIVE_STATUS, ToUTF8(src.liveRegionStatus()));
500 UTF16ToUTF8(base::StringPiece16(src.liveRegionStatus())));
501 } 498 }
502 dst->AddStringAttribute( 499 dst->AddStringAttribute(
503 ui::AX_ATTR_LIVE_RELEVANT, 500 ui::AX_ATTR_LIVE_RELEVANT, ToUTF8(src.liveRegionRelevant()));
504 UTF16ToUTF8(base::StringPiece16(src.liveRegionRelevant())));
505 dst->AddBoolAttribute(ui::AX_ATTR_CONTAINER_LIVE_ATOMIC, 501 dst->AddBoolAttribute(ui::AX_ATTR_CONTAINER_LIVE_ATOMIC,
506 src.containerLiveRegionAtomic()); 502 src.containerLiveRegionAtomic());
507 dst->AddBoolAttribute(ui::AX_ATTR_CONTAINER_LIVE_BUSY, 503 dst->AddBoolAttribute(ui::AX_ATTR_CONTAINER_LIVE_BUSY,
508 src.containerLiveRegionBusy()); 504 src.containerLiveRegionBusy());
509 dst->AddStringAttribute( 505 dst->AddStringAttribute(
510 ui::AX_ATTR_CONTAINER_LIVE_STATUS, 506 ui::AX_ATTR_CONTAINER_LIVE_STATUS,
511 UTF16ToUTF8(base::StringPiece16(src.containerLiveRegionStatus()))); 507 ToUTF8(src.containerLiveRegionStatus()));
512 dst->AddStringAttribute( 508 dst->AddStringAttribute(
513 ui::AX_ATTR_CONTAINER_LIVE_RELEVANT, 509 ui::AX_ATTR_CONTAINER_LIVE_RELEVANT,
514 UTF16ToUTF8(base::StringPiece16(src.containerLiveRegionRelevant()))); 510 ToUTF8(src.containerLiveRegionRelevant()));
515 } 511 }
516 512
517 if (dst->role == ui::AX_ROLE_PROGRESS_INDICATOR || 513 if (dst->role == ui::AX_ROLE_PROGRESS_INDICATOR ||
518 dst->role == ui::AX_ROLE_METER || 514 dst->role == ui::AX_ROLE_METER ||
519 dst->role == ui::AX_ROLE_SCROLL_BAR || 515 dst->role == ui::AX_ROLE_SCROLL_BAR ||
520 dst->role == ui::AX_ROLE_SLIDER || 516 dst->role == ui::AX_ROLE_SLIDER ||
521 dst->role == ui::AX_ROLE_SPIN_BUTTON) { 517 dst->role == ui::AX_ROLE_SPIN_BUTTON) {
522 dst->AddFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, src.valueForRange()); 518 dst->AddFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, src.valueForRange());
523 dst->AddFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE, 519 dst->AddFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE,
524 src.maxValueForRange()); 520 src.maxValueForRange());
525 dst->AddFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE, 521 dst->AddFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE,
526 src.minValueForRange()); 522 src.minValueForRange());
527 } 523 }
528 524
529 if (dst->role == ui::AX_ROLE_WEB_AREA) { 525 if (dst->role == ui::AX_ROLE_WEB_AREA)
530 dst->AddStringAttribute(ui::AX_ATTR_HTML_TAG, "#document"); 526 dst->AddStringAttribute(ui::AX_ATTR_HTML_TAG, "#document");
531 const WebDocument& document = src.document();
532 if (name.empty())
533 name = UTF16ToUTF8(base::StringPiece16(document.title()));
534 }
535 527
536 if (dst->role == ui::AX_ROLE_TABLE) { 528 if (dst->role == ui::AX_ROLE_TABLE) {
537 int column_count = src.columnCount(); 529 int column_count = src.columnCount();
538 int row_count = src.rowCount(); 530 int row_count = src.rowCount();
539 if (column_count > 0 && row_count > 0) { 531 if (column_count > 0 && row_count > 0) {
540 std::set<int32> unique_cell_id_set; 532 std::set<int32> unique_cell_id_set;
541 std::vector<int32> cell_ids; 533 std::vector<int32> cell_ids;
542 std::vector<int32> unique_cell_ids; 534 std::vector<int32> unique_cell_ids;
543 dst->AddIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, column_count); 535 dst->AddIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, column_count);
544 dst->AddIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, row_count); 536 dst->AddIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, row_count);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, src.cellRowIndex()); 579 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, src.cellRowIndex());
588 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN, src.cellRowSpan()); 580 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN, src.cellRowSpan());
589 } 581 }
590 582
591 if ((dst->role == ui::AX_ROLE_ROW_HEADER || 583 if ((dst->role == ui::AX_ROLE_ROW_HEADER ||
592 dst->role == ui::AX_ROLE_COLUMN_HEADER) && src.sortDirection()) { 584 dst->role == ui::AX_ROLE_COLUMN_HEADER) && src.sortDirection()) {
593 dst->AddIntAttribute(ui::AX_ATTR_SORT_DIRECTION, 585 dst->AddIntAttribute(ui::AX_ATTR_SORT_DIRECTION,
594 AXSortDirectionFromBlink(src.sortDirection())); 586 AXSortDirectionFromBlink(src.sortDirection()));
595 } 587 }
596 588
597 dst->AddStringAttribute(ui::AX_ATTR_NAME, name);
598
599 // Add the ids of *indirect* children - those who are children of this node, 589 // Add the ids of *indirect* children - those who are children of this node,
600 // but whose parent is *not* this node. One example is a table 590 // but whose parent is *not* this node. One example is a table
601 // cell, which is a child of both a row and a column. Because the cell's 591 // cell, which is a child of both a row and a column. Because the cell's
602 // parent is the row, the row adds it as a child, and the column adds it 592 // parent is the row, the row adds it as a child, and the column adds it
603 // as an indirect child. 593 // as an indirect child.
604 int child_count = src.childCount(); 594 int child_count = src.childCount();
605 for (int i = 0; i < child_count; ++i) { 595 for (int i = 0; i < child_count; ++i) {
606 WebAXObject child = src.childAt(i); 596 WebAXObject child = src.childAt(i);
607 std::vector<int32> indirect_child_ids; 597 std::vector<int32> indirect_child_ids;
608 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child)) 598 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child))
609 indirect_child_ids.push_back(child.axID()); 599 indirect_child_ids.push_back(child.axID());
610 if (indirect_child_ids.size() > 0) { 600 if (indirect_child_ids.size() > 0) {
611 dst->AddIntListAttribute( 601 dst->AddIntListAttribute(
612 ui::AX_ATTR_INDIRECT_CHILD_IDS, indirect_child_ids); 602 ui::AX_ATTR_INDIRECT_CHILD_IDS, indirect_child_ids);
613 } 603 }
614 } 604 }
615 605
616 WebVector<WebAXObject> controls; 606 WebVector<WebAXObject> controls;
617 if (src.ariaControls(controls)) 607 if (src.ariaControls(controls))
618 AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, controls, dst); 608 AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, controls, dst);
619 609
620 WebVector<WebAXObject> describedby;
621 if (src.deprecatedAriaDescribedby(describedby)) {
622 AddIntListAttributeFromWebObjects(
623 ui::AX_ATTR_DESCRIBEDBY_IDS, describedby, dst);
624 }
625
626 WebVector<WebAXObject> flowTo; 610 WebVector<WebAXObject> flowTo;
627 if (src.ariaFlowTo(flowTo)) 611 if (src.ariaFlowTo(flowTo))
628 AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, flowTo, dst); 612 AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, flowTo, dst);
629 613
630 WebVector<WebAXObject> labelledby;
631 if (src.deprecatedAriaLabelledby(labelledby)) {
632 AddIntListAttributeFromWebObjects(
633 ui::AX_ATTR_LABELLEDBY_IDS, labelledby, dst);
634 }
635
636 WebVector<WebAXObject> owns;
637 if (src.ariaOwns(owns))
638 AddIntListAttributeFromWebObjects(ui::AX_ATTR_OWNS_IDS, owns, dst);
639
640
641 if (src.isScrollableContainer()) { 614 if (src.isScrollableContainer()) {
642 const gfx::Point& scrollOffset = src.scrollOffset(); 615 const gfx::Point& scrollOffset = src.scrollOffset();
643 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X, scrollOffset.x()); 616 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X, scrollOffset.x());
644 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y, scrollOffset.y()); 617 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y, scrollOffset.y());
645 618
646 const gfx::Point& minScrollOffset = src.minimumScrollOffset(); 619 const gfx::Point& minScrollOffset = src.minimumScrollOffset();
647 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x()); 620 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x());
648 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y()); 621 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y());
649 622
650 const gfx::Point& maxScrollOffset = src.maximumScrollOffset(); 623 const gfx::Point& maxScrollOffset = src.maximumScrollOffset();
651 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, maxScrollOffset.x()); 624 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, maxScrollOffset.x());
652 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, maxScrollOffset.y()); 625 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, maxScrollOffset.y());
653 } 626 }
654 } 627 }
655 628
656 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { 629 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const {
657 if (render_frame_ && render_frame_->GetWebFrame()) 630 if (render_frame_ && render_frame_->GetWebFrame())
658 return render_frame_->GetWebFrame()->document(); 631 return render_frame_->GetWebFrame()->document();
659 return WebDocument(); 632 return WebDocument();
660 } 633 }
661 634
662 } // namespace content 635 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698