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

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 issue with ariaTextAlternative 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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr, 99 void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr,
100 WebVector<WebAXObject> objects, 100 WebVector<WebAXObject> objects,
101 AXContentNodeData* dst) { 101 AXContentNodeData* dst) {
102 std::vector<int32> ids; 102 std::vector<int32> ids;
103 for(size_t i = 0; i < objects.size(); i++) 103 for(size_t i = 0; i < objects.size(); i++)
104 ids.push_back(objects[i].axID()); 104 ids.push_back(objects[i].axID());
105 if (ids.size() > 0) 105 if (ids.size() > 0)
106 dst->AddIntListAttribute(attr, ids); 106 dst->AddIntListAttribute(attr, ids);
107 } 107 }
108 108
109 } // Anonymous namespace 109 } // namespace
110 110
111 BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame) 111 BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame)
112 : render_frame_(render_frame), 112 : render_frame_(render_frame),
113 accessibility_focus_id_(-1) { 113 accessibility_focus_id_(-1) {
114 } 114 }
115 115
116 BlinkAXTreeSource::~BlinkAXTreeSource() { 116 BlinkAXTreeSource::~BlinkAXTreeSource() {
117 } 117 }
118 118
119 void BlinkAXTreeSource::SetRoot(blink::WebAXObject root) { 119 void BlinkAXTreeSource::SetRoot(blink::WebAXObject root) {
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 blink::WebAXObject BlinkAXTreeSource::GetNull() const { 251 blink::WebAXObject BlinkAXTreeSource::GetNull() const {
252 return blink::WebAXObject(); 252 return blink::WebAXObject();
253 } 253 }
254 254
255 void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src, 255 void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src,
256 AXContentNodeData* dst) const { 256 AXContentNodeData* dst) const {
257 dst->role = AXRoleFromBlink(src.role()); 257 dst->role = AXRoleFromBlink(src.role());
258 dst->state = AXStateFromBlink(src); 258 dst->state = AXStateFromBlink(src);
259 dst->location = src.boundingBoxRect(); 259 dst->location = src.boundingBoxRect();
260 dst->id = src.axID(); 260 dst->id = src.axID();
261 std::string name = src.deprecatedTitle().utf8(); 261
262 blink::WebAXNameFrom nameFrom;
263 blink::WebVector<blink::WebAXObject> nameObjects;
264 blink::WebString web_name = src.name(nameFrom, nameObjects);
265 if (!web_name.isEmpty()) {
266 dst->AddStringAttribute(ui::AX_ATTR_NAME, web_name.utf8());
267 dst->AddIntAttribute(ui::AX_ATTR_NAME_FROM, AXNameFromFromBlink(nameFrom));
268 AddIntListAttributeFromWebObjects(
269 ui::AX_ATTR_LABELLEDBY_IDS, nameObjects, dst);
270 }
271
272 blink::WebAXDescriptionFrom descriptionFrom;
273 blink::WebVector<blink::WebAXObject> descriptionObjects;
274 blink::WebString web_description = src.description(
275 nameFrom, descriptionFrom, descriptionObjects);
276 if (!web_description.isEmpty()) {
277 dst->AddStringAttribute(ui::AX_ATTR_DESCRIPTION, web_description.utf8());
278 dst->AddIntAttribute(ui::AX_ATTR_DESCRIPTION_FROM,
279 AXDescriptionFromFromBlink(descriptionFrom));
280 AddIntListAttributeFromWebObjects(
281 ui::AX_ATTR_DESCRIBEDBY_IDS, descriptionObjects, dst);
282 }
283
284 blink::WebString web_placeholder = src.placeholder(nameFrom, descriptionFrom);
285 if (!web_placeholder.isEmpty())
286 dst->AddStringAttribute(ui::AX_ATTR_PLACEHOLDER, web_placeholder.utf8());
262 287
263 std::string value; 288 std::string value;
264 if (src.valueDescription().length()) { 289 if (src.valueDescription().length()) {
265 dst->AddStringAttribute(ui::AX_ATTR_VALUE, src.valueDescription().utf8()); 290 dst->AddStringAttribute(ui::AX_ATTR_VALUE, src.valueDescription().utf8());
266 } else { 291 } else {
267 dst->AddStringAttribute(ui::AX_ATTR_VALUE, src.stringValue().utf8()); 292 dst->AddStringAttribute(ui::AX_ATTR_VALUE, src.stringValue().utf8());
268 } 293 }
269 294
270 if (dst->role == ui::AX_ROLE_COLOR_WELL) 295 if (dst->role == ui::AX_ROLE_COLOR_WELL)
271 dst->AddIntAttribute(ui::AX_ATTR_COLOR_VALUE, src.colorValue()); 296 dst->AddIntAttribute(ui::AX_ATTR_COLOR_VALUE, src.colorValue());
272 297
273 298
274 // Text attributes. 299 // Text attributes.
275 if (src.backgroundColor()) 300 if (src.backgroundColor())
276 dst->AddIntAttribute(ui::AX_ATTR_BACKGROUND_COLOR, src.backgroundColor()); 301 dst->AddIntAttribute(ui::AX_ATTR_BACKGROUND_COLOR, src.backgroundColor());
277 302
278 if (src.color()) 303 if (src.color())
279 dst->AddIntAttribute(ui::AX_ATTR_COLOR, src.color()); 304 dst->AddIntAttribute(ui::AX_ATTR_COLOR, src.color());
280 305
281 // Font size is in pixels. 306 // Font size is in pixels.
282 if (src.fontSize()) 307 if (src.fontSize())
283 dst->AddFloatAttribute(ui::AX_ATTR_FONT_SIZE, src.fontSize()); 308 dst->AddFloatAttribute(ui::AX_ATTR_FONT_SIZE, src.fontSize());
284 309
285 if (src.invalidState()) { 310 if (src.invalidState()) {
286 dst->AddIntAttribute(ui::AX_ATTR_INVALID_STATE, 311 dst->AddIntAttribute(ui::AX_ATTR_INVALID_STATE,
287 AXInvalidStateFromBlink(src.invalidState())); 312 AXInvalidStateFromBlink(src.invalidState()));
288 } 313 }
289 if (src.invalidState() == blink::WebAXInvalidStateOther) { 314 if (src.invalidState() == blink::WebAXInvalidStateOther) {
290 dst->AddStringAttribute( 315 dst->AddStringAttribute(
291 ui::AX_ATTR_ARIA_INVALID_VALUE, 316 ui::AX_ATTR_ARIA_INVALID_VALUE, src.ariaInvalidValue().utf8());
292 src.ariaInvalidValue().utf8());
293 } 317 }
294 318
295 if (src.textDirection()) { 319 if (src.textDirection()) {
296 dst->AddIntAttribute(ui::AX_ATTR_TEXT_DIRECTION, 320 dst->AddIntAttribute(ui::AX_ATTR_TEXT_DIRECTION,
297 AXTextDirectionFromBlink(src.textDirection())); 321 AXTextDirectionFromBlink(src.textDirection()));
298 } 322 }
299 323
300 if (src.textStyle()) { 324 if (src.textStyle()) {
301 dst->AddIntAttribute(ui::AX_ATTR_TEXT_STYLE, 325 dst->AddIntAttribute(ui::AX_ATTR_TEXT_STYLE,
302 AXTextStyleFromBlink(src.textStyle())); 326 AXTextStyleFromBlink(src.textStyle()));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 if (src.ariaAutoComplete().length()) 361 if (src.ariaAutoComplete().length())
338 dst->AddStringAttribute( 362 dst->AddStringAttribute(
339 ui::AX_ATTR_AUTO_COMPLETE, 363 ui::AX_ATTR_AUTO_COMPLETE,
340 src.ariaAutoComplete().utf8()); 364 src.ariaAutoComplete().utf8());
341 if (src.isAriaReadOnly()) 365 if (src.isAriaReadOnly())
342 dst->AddBoolAttribute(ui::AX_ATTR_ARIA_READONLY, true); 366 dst->AddBoolAttribute(ui::AX_ATTR_ARIA_READONLY, true);
343 if (src.isButtonStateMixed()) 367 if (src.isButtonStateMixed())
344 dst->AddBoolAttribute(ui::AX_ATTR_BUTTON_MIXED, true); 368 dst->AddBoolAttribute(ui::AX_ATTR_BUTTON_MIXED, true);
345 if (src.canSetValueAttribute()) 369 if (src.canSetValueAttribute())
346 dst->AddBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE, true); 370 dst->AddBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE, true);
347 if (src.deprecatedAccessibilityDescription().length()) {
348 dst->AddStringAttribute(
349 ui::AX_ATTR_DESCRIPTION,
350 src.deprecatedAccessibilityDescription().utf8());
351 }
352 if (src.hasComputedStyle()) { 371 if (src.hasComputedStyle()) {
353 dst->AddStringAttribute( 372 dst->AddStringAttribute(
354 ui::AX_ATTR_DISPLAY, 373 ui::AX_ATTR_DISPLAY, src.computedStyleDisplay().utf8());
355 src.computedStyleDisplay().utf8());
356 }
357 if (src.deprecatedHelpText().length())
358 dst->AddStringAttribute(ui::AX_ATTR_HELP, src.deprecatedHelpText().utf8());
359 if (src.deprecatedPlaceholder().length()) {
360 dst->AddStringAttribute(
361 ui::AX_ATTR_PLACEHOLDER,
362 src.deprecatedPlaceholder().utf8());
363 } 374 }
364 if (src.keyboardShortcut().length()) { 375 if (src.keyboardShortcut().length()) {
365 dst->AddStringAttribute( 376 dst->AddStringAttribute(
366 ui::AX_ATTR_SHORTCUT, 377 ui::AX_ATTR_SHORTCUT,
367 src.keyboardShortcut().utf8()); 378 src.keyboardShortcut().utf8());
368 } 379 }
369 if (!src.deprecatedTitleUIElement().isDetached()) {
370 dst->AddIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT,
371 src.deprecatedTitleUIElement().axID());
372 }
373 if (!src.ariaActiveDescendant().isDetached()) { 380 if (!src.ariaActiveDescendant().isDetached()) {
374 dst->AddIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID, 381 dst->AddIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID,
375 src.ariaActiveDescendant().axID()); 382 src.ariaActiveDescendant().axID());
376 } 383 }
377 384
378 if (!src.url().isEmpty()) 385 if (!src.url().isEmpty())
379 dst->AddStringAttribute(ui::AX_ATTR_URL, src.url().spec()); 386 dst->AddStringAttribute(ui::AX_ATTR_URL, src.url().spec());
380 387
381 if (dst->role == ui::AX_ROLE_HEADING) 388 if (dst->role == ui::AX_ROLE_HEADING)
382 dst->AddIntAttribute(ui::AX_ATTR_HIERARCHICAL_LEVEL, src.headingLevel()); 389 dst->AddIntAttribute(ui::AX_ATTR_HIERARCHICAL_LEVEL, src.headingLevel());
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 dst->role == ui::AX_ROLE_SCROLL_BAR || 510 dst->role == ui::AX_ROLE_SCROLL_BAR ||
504 dst->role == ui::AX_ROLE_SLIDER || 511 dst->role == ui::AX_ROLE_SLIDER ||
505 dst->role == ui::AX_ROLE_SPIN_BUTTON) { 512 dst->role == ui::AX_ROLE_SPIN_BUTTON) {
506 dst->AddFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, src.valueForRange()); 513 dst->AddFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, src.valueForRange());
507 dst->AddFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE, 514 dst->AddFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE,
508 src.maxValueForRange()); 515 src.maxValueForRange());
509 dst->AddFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE, 516 dst->AddFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE,
510 src.minValueForRange()); 517 src.minValueForRange());
511 } 518 }
512 519
513 if (dst->role == ui::AX_ROLE_WEB_AREA) { 520 if (dst->role == ui::AX_ROLE_WEB_AREA)
514 dst->AddStringAttribute(ui::AX_ATTR_HTML_TAG, "#document"); 521 dst->AddStringAttribute(ui::AX_ATTR_HTML_TAG, "#document");
515 const WebDocument& document = src.document();
516 if (name.empty())
517 name = document.title().utf8();
518 }
519 522
520 if (dst->role == ui::AX_ROLE_TABLE) { 523 if (dst->role == ui::AX_ROLE_TABLE) {
521 int column_count = src.columnCount(); 524 int column_count = src.columnCount();
522 int row_count = src.rowCount(); 525 int row_count = src.rowCount();
523 if (column_count > 0 && row_count > 0) { 526 if (column_count > 0 && row_count > 0) {
524 std::set<int32> unique_cell_id_set; 527 std::set<int32> unique_cell_id_set;
525 std::vector<int32> cell_ids; 528 std::vector<int32> cell_ids;
526 std::vector<int32> unique_cell_ids; 529 std::vector<int32> unique_cell_ids;
527 dst->AddIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, column_count); 530 dst->AddIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, column_count);
528 dst->AddIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, row_count); 531 dst->AddIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, row_count);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, src.cellRowIndex()); 574 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, src.cellRowIndex());
572 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN, src.cellRowSpan()); 575 dst->AddIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN, src.cellRowSpan());
573 } 576 }
574 577
575 if ((dst->role == ui::AX_ROLE_ROW_HEADER || 578 if ((dst->role == ui::AX_ROLE_ROW_HEADER ||
576 dst->role == ui::AX_ROLE_COLUMN_HEADER) && src.sortDirection()) { 579 dst->role == ui::AX_ROLE_COLUMN_HEADER) && src.sortDirection()) {
577 dst->AddIntAttribute(ui::AX_ATTR_SORT_DIRECTION, 580 dst->AddIntAttribute(ui::AX_ATTR_SORT_DIRECTION,
578 AXSortDirectionFromBlink(src.sortDirection())); 581 AXSortDirectionFromBlink(src.sortDirection()));
579 } 582 }
580 583
581 dst->AddStringAttribute(ui::AX_ATTR_NAME, name);
582
583 // Add the ids of *indirect* children - those who are children of this node, 584 // Add the ids of *indirect* children - those who are children of this node,
584 // but whose parent is *not* this node. One example is a table 585 // but whose parent is *not* this node. One example is a table
585 // cell, which is a child of both a row and a column. Because the cell's 586 // cell, which is a child of both a row and a column. Because the cell's
586 // parent is the row, the row adds it as a child, and the column adds it 587 // parent is the row, the row adds it as a child, and the column adds it
587 // as an indirect child. 588 // as an indirect child.
588 int child_count = src.childCount(); 589 int child_count = src.childCount();
589 for (int i = 0; i < child_count; ++i) { 590 for (int i = 0; i < child_count; ++i) {
590 WebAXObject child = src.childAt(i); 591 WebAXObject child = src.childAt(i);
591 std::vector<int32> indirect_child_ids; 592 std::vector<int32> indirect_child_ids;
592 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child)) 593 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child))
593 indirect_child_ids.push_back(child.axID()); 594 indirect_child_ids.push_back(child.axID());
594 if (indirect_child_ids.size() > 0) { 595 if (indirect_child_ids.size() > 0) {
595 dst->AddIntListAttribute( 596 dst->AddIntListAttribute(
596 ui::AX_ATTR_INDIRECT_CHILD_IDS, indirect_child_ids); 597 ui::AX_ATTR_INDIRECT_CHILD_IDS, indirect_child_ids);
597 } 598 }
598 } 599 }
599 600
600 WebVector<WebAXObject> controls; 601 WebVector<WebAXObject> controls;
601 if (src.ariaControls(controls)) 602 if (src.ariaControls(controls))
602 AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, controls, dst); 603 AddIntListAttributeFromWebObjects(ui::AX_ATTR_CONTROLS_IDS, controls, dst);
603 604
604 WebVector<WebAXObject> describedby;
605 if (src.deprecatedAriaDescribedby(describedby)) {
606 AddIntListAttributeFromWebObjects(
607 ui::AX_ATTR_DESCRIBEDBY_IDS, describedby, dst);
608 }
609
610 WebVector<WebAXObject> flowTo; 605 WebVector<WebAXObject> flowTo;
611 if (src.ariaFlowTo(flowTo)) 606 if (src.ariaFlowTo(flowTo))
612 AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, flowTo, dst); 607 AddIntListAttributeFromWebObjects(ui::AX_ATTR_FLOWTO_IDS, flowTo, dst);
613 608
614 WebVector<WebAXObject> labelledby;
615 if (src.deprecatedAriaLabelledby(labelledby)) {
616 AddIntListAttributeFromWebObjects(
617 ui::AX_ATTR_LABELLEDBY_IDS, labelledby, dst);
618 }
619
620 WebVector<WebAXObject> owns;
621 if (src.ariaOwns(owns))
622 AddIntListAttributeFromWebObjects(ui::AX_ATTR_OWNS_IDS, owns, dst);
623
624
625 if (src.isScrollableContainer()) { 609 if (src.isScrollableContainer()) {
626 const gfx::Point& scrollOffset = src.scrollOffset(); 610 const gfx::Point& scrollOffset = src.scrollOffset();
627 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X, scrollOffset.x()); 611 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X, scrollOffset.x());
628 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y, scrollOffset.y()); 612 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y, scrollOffset.y());
629 613
630 const gfx::Point& minScrollOffset = src.minimumScrollOffset(); 614 const gfx::Point& minScrollOffset = src.minimumScrollOffset();
631 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x()); 615 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MIN, minScrollOffset.x());
632 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y()); 616 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MIN, minScrollOffset.y());
633 617
634 const gfx::Point& maxScrollOffset = src.maximumScrollOffset(); 618 const gfx::Point& maxScrollOffset = src.maximumScrollOffset();
635 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, maxScrollOffset.x()); 619 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, maxScrollOffset.x());
636 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, maxScrollOffset.y()); 620 dst->AddIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, maxScrollOffset.y());
637 } 621 }
638 } 622 }
639 623
640 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { 624 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const {
641 if (render_frame_ && render_frame_->GetWebFrame()) 625 if (render_frame_ && render_frame_->GetWebFrame())
642 return render_frame_->GetWebFrame()->document(); 626 return render_frame_->GetWebFrame()->document();
643 return WebDocument(); 627 return WebDocument();
644 } 628 }
645 629
646 } // namespace content 630 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698