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

Side by Side Diff: content/browser/accessibility/browser_accessibility_android.cc

Issue 1654193002: Include a role description string in node info for Android accessibility. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update all Android test expectations Created 4 years, 10 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 "content/browser/accessibility/browser_accessibility_android.h" 5 #include "content/browser/accessibility/browser_accessibility_android.h"
6 6
7 #include "base/i18n/break_iterator.h" 7 #include "base/i18n/break_iterator.h"
8 #include "base/strings/string_number_conversions.h"
8 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
9 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "content/app/strings/grit/content_strings.h"
11 #include "content/browser/accessibility/browser_accessibility_manager_android.h" 13 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
12 #include "content/common/accessibility_messages.h" 14 #include "content/common/accessibility_messages.h"
15 #include "content/public/common/content_client.h"
13 16
14 namespace { 17 namespace {
15 18
16 // These are enums from android.text.InputType in Java: 19 // These are enums from android.text.InputType in Java:
17 enum { 20 enum {
18 ANDROID_TEXT_INPUTTYPE_TYPE_NULL = 0, 21 ANDROID_TEXT_INPUTTYPE_TYPE_NULL = 0,
19 ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME = 0x4, 22 ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME = 0x4,
20 ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE = 0x14, 23 ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE = 0x14,
21 ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME = 0x24, 24 ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME = 0x24,
22 ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER = 0x2, 25 ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER = 0x2,
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 url = url.substr(slash_index + 1); 403 url = url.substr(slash_index + 1);
401 size_t dot_index = url.rfind('.'); 404 size_t dot_index = url.rfind('.');
402 if (dot_index != std::string::npos) 405 if (dot_index != std::string::npos)
403 url = url.substr(0, dot_index); 406 url = url.substr(0, dot_index);
404 text = url; 407 text = url;
405 } 408 }
406 409
407 return text; 410 return text;
408 } 411 }
409 412
413 base::string16 BrowserAccessibilityAndroid::GetRoleDescription() const {
414 content::ContentClient* content_client = content::GetContentClient();
415
416 // As a special case, if we have a heading level return a string like
417 // "heading level 1", etc.
418 if (GetRole() == ui::AX_ROLE_HEADING) {
419 int level = GetIntAttribute(ui::AX_ATTR_HIERARCHICAL_LEVEL);
420 if (level >= 1 && level <= 6) {
421 std::vector<base::string16> values;
422 values.push_back(base::IntToString16(level));
423 return base::ReplaceStringPlaceholders(
424 content_client->GetLocalizedString(IDS_AX_ROLE_HEADING_WITH_LEVEL),
425 values, nullptr);
426 }
427 }
428
429 int message_id = -1;
430 switch (GetRole()) {
431 case ui::AX_ROLE_ABBR:
432 // No role description.
433 break;
434 case ui::AX_ROLE_ALERT_DIALOG:
435 message_id = IDS_AX_ROLE_ALERT_DIALOG;
436 break;
437 case ui::AX_ROLE_ALERT:
438 message_id = IDS_AX_ROLE_ALERT;
439 break;
440 case ui::AX_ROLE_ANNOTATION:
441 // No role description.
442 break;
443 case ui::AX_ROLE_APPLICATION:
444 message_id = IDS_AX_ROLE_APPLICATION;
445 break;
446 case ui::AX_ROLE_ARTICLE:
447 message_id = IDS_AX_ROLE_ARTICLE;
448 break;
449 case ui::AX_ROLE_BANNER:
450 message_id = IDS_AX_ROLE_BANNER;
451 break;
452 case ui::AX_ROLE_BLOCKQUOTE:
453 message_id = IDS_AX_ROLE_BLOCKQUOTE;
454 break;
455 case ui::AX_ROLE_BUSY_INDICATOR:
456 message_id = IDS_AX_ROLE_BUSY_INDICATOR;
457 break;
458 case ui::AX_ROLE_BUTTON:
459 message_id = IDS_AX_ROLE_BUTTON;
460 break;
461 case ui::AX_ROLE_BUTTON_DROP_DOWN:
462 message_id = IDS_AX_ROLE_BUTTON_DROP_DOWN;
463 break;
464 case ui::AX_ROLE_CANVAS:
465 // No role description.
466 break;
467 case ui::AX_ROLE_CAPTION:
468 // No role description.
469 break;
470 case ui::AX_ROLE_CELL:
471 message_id = IDS_AX_ROLE_CELL;
472 break;
473 case ui::AX_ROLE_CHECK_BOX:
474 message_id = IDS_AX_ROLE_CHECK_BOX;
475 break;
476 case ui::AX_ROLE_CLIENT:
477 // No role description.
478 break;
479 case ui::AX_ROLE_COLOR_WELL:
480 message_id = IDS_AX_ROLE_COLOR_WELL;
481 break;
482 case ui::AX_ROLE_COLUMN_HEADER:
483 message_id = IDS_AX_ROLE_COLUMN_HEADER;
484 break;
485 case ui::AX_ROLE_COLUMN:
486 // No role description.
487 break;
488 case ui::AX_ROLE_COMBO_BOX:
489 message_id = IDS_AX_ROLE_COMBO_BOX;
490 break;
491 case ui::AX_ROLE_COMPLEMENTARY:
492 message_id = IDS_AX_ROLE_COMPLEMENTARY;
493 break;
494 case ui::AX_ROLE_CONTENT_INFO:
495 message_id = IDS_AX_ROLE_CONTENT_INFO;
496 break;
497 case ui::AX_ROLE_DATE:
498 message_id = IDS_AX_ROLE_DATE;
499 break;
500 case ui::AX_ROLE_DATE_TIME:
501 message_id = IDS_AX_ROLE_DATE_TIME;
502 break;
503 case ui::AX_ROLE_DEFINITION:
504 message_id = IDS_AX_ROLE_DEFINITION;
505 break;
506 case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL:
507 message_id = IDS_AX_ROLE_DEFINITION;
508 break;
509 case ui::AX_ROLE_DESCRIPTION_LIST:
510 // No role description.
511 break;
512 case ui::AX_ROLE_DESCRIPTION_LIST_TERM:
513 // No role description.
514 break;
515 case ui::AX_ROLE_DESKTOP:
516 // No role description.
517 break;
518 case ui::AX_ROLE_DETAILS:
519 // No role description.
520 break;
521 case ui::AX_ROLE_DIALOG:
522 message_id = IDS_AX_ROLE_DIALOG;
523 break;
524 case ui::AX_ROLE_DIRECTORY:
525 message_id = IDS_AX_ROLE_DIRECTORY;
526 break;
527 case ui::AX_ROLE_DISCLOSURE_TRIANGLE:
528 message_id = IDS_AX_ROLE_DISCLOSURE_TRIANGLE;
529 break;
530 case ui::AX_ROLE_DIV:
531 // No role description.
532 break;
533 case ui::AX_ROLE_DOCUMENT:
534 message_id = IDS_AX_ROLE_DOCUMENT;
535 break;
536 case ui::AX_ROLE_EMBEDDED_OBJECT:
537 message_id = IDS_AX_ROLE_EMBEDDED_OBJECT;
538 break;
539 case ui::AX_ROLE_FIGCAPTION:
540 // No role description.
541 break;
542 case ui::AX_ROLE_FIGURE:
543 message_id = IDS_AX_ROLE_GRAPHIC;
544 break;
545 case ui::AX_ROLE_FOOTER:
546 message_id = IDS_AX_ROLE_FOOTER;
547 break;
548 case ui::AX_ROLE_FORM:
549 // No role description.
550 break;
551 case ui::AX_ROLE_GRID:
552 message_id = IDS_AX_ROLE_TABLE;
553 break;
554 case ui::AX_ROLE_GROUP:
555 // No role description.
556 break;
557 case ui::AX_ROLE_HEADING:
558 // Note that code above this switch statement handles headings with
559 // a level, returning a string like "heading level 1", etc.
560 message_id = IDS_AX_ROLE_HEADING;
561 break;
562 case ui::AX_ROLE_IFRAME:
563 // No role description.
564 break;
565 case ui::AX_ROLE_IFRAME_PRESENTATIONAL:
566 // No role description.
567 break;
568 case ui::AX_ROLE_IGNORED:
569 // No role description.
570 break;
571 case ui::AX_ROLE_IMAGE_MAP_LINK:
572 message_id = IDS_AX_ROLE_LINK;
573 break;
574 case ui::AX_ROLE_IMAGE_MAP:
575 message_id = IDS_AX_ROLE_GRAPHIC;
576 break;
577 case ui::AX_ROLE_IMAGE:
578 message_id = IDS_AX_ROLE_GRAPHIC;
579 break;
580 case ui::AX_ROLE_INLINE_TEXT_BOX:
581 // No role description.
582 break;
583 case ui::AX_ROLE_INPUT_TIME:
584 message_id = IDS_AX_ROLE_INPUT_TIME;
585 break;
586 case ui::AX_ROLE_LABEL_TEXT:
587 // No role description.
588 break;
589 case ui::AX_ROLE_LEGEND:
590 // No role description.
591 break;
592 case ui::AX_ROLE_LINE_BREAK:
593 // No role description.
594 break;
595 case ui::AX_ROLE_LINK:
596 message_id = IDS_AX_ROLE_LINK;
597 break;
598 case ui::AX_ROLE_LIST_BOX_OPTION:
599 // No role description.
600 break;
601 case ui::AX_ROLE_LIST_BOX:
602 message_id = IDS_AX_ROLE_LIST_BOX;
603 break;
604 case ui::AX_ROLE_LIST_ITEM:
605 // No role description.
606 break;
607 case ui::AX_ROLE_LIST_MARKER:
608 // No role description.
609 break;
610 case ui::AX_ROLE_LIST:
611 // No role description.
612 break;
613 case ui::AX_ROLE_LOCATION_BAR:
614 // No role description.
615 break;
616 case ui::AX_ROLE_LOG:
617 message_id = IDS_AX_ROLE_LOG;
618 break;
619 case ui::AX_ROLE_MAIN:
620 message_id = IDS_AX_ROLE_MAIN_CONTENT;
621 break;
622 case ui::AX_ROLE_MARK:
623 message_id = IDS_AX_ROLE_MARK;
624 break;
625 case ui::AX_ROLE_MARQUEE:
626 message_id = IDS_AX_ROLE_MARQUEE;
627 break;
628 case ui::AX_ROLE_MATH:
629 message_id = IDS_AX_ROLE_MATH;
630 break;
631 case ui::AX_ROLE_MENU_BAR:
632 message_id = IDS_AX_ROLE_MENU_BAR;
633 break;
634 case ui::AX_ROLE_MENU_BUTTON:
635 message_id = IDS_AX_ROLE_MENU_BUTTON;
636 break;
637 case ui::AX_ROLE_MENU_ITEM:
638 message_id = IDS_AX_ROLE_MENU_ITEM;
639 break;
640 case ui::AX_ROLE_MENU_ITEM_CHECK_BOX:
641 message_id = IDS_AX_ROLE_CHECK_BOX;
642 break;
643 case ui::AX_ROLE_MENU_ITEM_RADIO:
644 message_id = IDS_AX_ROLE_RADIO;
645 break;
646 case ui::AX_ROLE_MENU_LIST_OPTION:
647 // No role description.
648 break;
649 case ui::AX_ROLE_MENU_LIST_POPUP:
650 // No role description.
651 break;
652 case ui::AX_ROLE_MENU:
653 message_id = IDS_AX_ROLE_MENU;
654 break;
655 case ui::AX_ROLE_METER:
656 message_id = IDS_AX_ROLE_METER;
657 break;
658 case ui::AX_ROLE_NAVIGATION:
659 message_id = IDS_AX_ROLE_NAVIGATIONAL_LINK;
660 break;
661 case ui::AX_ROLE_NOTE:
662 message_id = IDS_AX_ROLE_NOTE;
663 break;
664 case ui::AX_ROLE_OUTLINE:
665 message_id = IDS_AX_ROLE_OUTLINE;
666 break;
667 case ui::AX_ROLE_PANE:
668 // No role description.
669 break;
670 case ui::AX_ROLE_PARAGRAPH:
671 // No role description.
672 break;
673 case ui::AX_ROLE_POP_UP_BUTTON:
674 message_id = IDS_AX_ROLE_POP_UP_BUTTON;
675 break;
676 case ui::AX_ROLE_PRE:
677 // No role description.
678 break;
679 case ui::AX_ROLE_PRESENTATIONAL:
680 // No role description.
681 break;
682 case ui::AX_ROLE_PROGRESS_INDICATOR:
683 message_id = IDS_AX_ROLE_PROGRESS_INDICATOR;
684 break;
685 case ui::AX_ROLE_RADIO_BUTTON:
686 message_id = IDS_AX_ROLE_RADIO;
687 break;
688 case ui::AX_ROLE_RADIO_GROUP:
689 message_id = IDS_AX_ROLE_RADIO_GROUP;
690 break;
691 case ui::AX_ROLE_REGION:
692 message_id = IDS_AX_ROLE_REGION;
693 break;
694 case ui::AX_ROLE_ROOT_WEB_AREA:
695 // No role description.
696 break;
697 case ui::AX_ROLE_ROW_HEADER:
698 message_id = IDS_AX_ROLE_ROW_HEADER;
699 break;
700 case ui::AX_ROLE_ROW:
701 // No role description.
702 break;
703 case ui::AX_ROLE_RUBY:
704 // No role description.
705 break;
706 case ui::AX_ROLE_RULER:
707 message_id = IDS_AX_ROLE_RULER;
708 break;
709 case ui::AX_ROLE_SVG_ROOT:
710 message_id = IDS_AX_ROLE_GRAPHIC;
711 break;
712 case ui::AX_ROLE_SCROLL_AREA:
713 // No role description.
714 break;
715 case ui::AX_ROLE_SCROLL_BAR:
716 message_id = IDS_AX_ROLE_SCROLL_BAR;
717 break;
718 case ui::AX_ROLE_SEAMLESS_WEB_AREA:
719 // No role description.
720 break;
721 case ui::AX_ROLE_SEARCH:
722 message_id = IDS_AX_ROLE_SEARCH;
723 break;
724 case ui::AX_ROLE_SEARCH_BOX:
725 message_id = IDS_AX_ROLE_SEARCH_BOX;
726 break;
727 case ui::AX_ROLE_SLIDER:
728 message_id = IDS_AX_ROLE_SLIDER;
729 break;
730 case ui::AX_ROLE_SLIDER_THUMB:
731 // No role description.
732 break;
733 case ui::AX_ROLE_SPIN_BUTTON_PART:
734 // No role description.
735 break;
736 case ui::AX_ROLE_SPIN_BUTTON:
737 message_id = IDS_AX_ROLE_SPIN_BUTTON;
738 break;
739 case ui::AX_ROLE_SPLITTER:
740 message_id = IDS_AX_ROLE_SPLITTER;
741 break;
742 case ui::AX_ROLE_STATIC_TEXT:
743 // No role description.
744 break;
745 case ui::AX_ROLE_STATUS:
746 message_id = IDS_AX_ROLE_STATUS;
747 break;
748 case ui::AX_ROLE_SWITCH:
749 message_id = IDS_AX_ROLE_SWITCH;
750 break;
751 case ui::AX_ROLE_TAB_GROUP:
752 // No role description.
753 break;
754 case ui::AX_ROLE_TAB_LIST:
755 message_id = IDS_AX_ROLE_TAB_LIST;
756 break;
757 case ui::AX_ROLE_TAB_PANEL:
758 message_id = IDS_AX_ROLE_TAB_PANEL;
759 break;
760 case ui::AX_ROLE_TAB:
761 message_id = IDS_AX_ROLE_TAB;
762 break;
763 case ui::AX_ROLE_TABLE_HEADER_CONTAINER:
764 // No role description.
765 break;
766 case ui::AX_ROLE_TABLE:
767 message_id = IDS_AX_ROLE_TABLE;
768 break;
769 case ui::AX_ROLE_TEXT_FIELD:
770 // No role description.
771 break;
772 case ui::AX_ROLE_TIME:
773 message_id = IDS_AX_ROLE_TIME;
774 break;
775 case ui::AX_ROLE_TIMER:
776 message_id = IDS_AX_ROLE_TIMER;
777 break;
778 case ui::AX_ROLE_TITLE_BAR:
779 // No role description.
780 break;
781 case ui::AX_ROLE_TOGGLE_BUTTON:
782 message_id = IDS_AX_ROLE_TOGGLE_BUTTON;
783 break;
784 case ui::AX_ROLE_TOOLBAR:
785 message_id = IDS_AX_ROLE_TOOLBAR;
786 break;
787 case ui::AX_ROLE_TREE_GRID:
788 message_id = IDS_AX_ROLE_TREE_GRID;
789 break;
790 case ui::AX_ROLE_TREE_ITEM:
791 message_id = IDS_AX_ROLE_TREE_ITEM;
792 break;
793 case ui::AX_ROLE_TREE:
794 message_id = IDS_AX_ROLE_TREE;
795 break;
796 case ui::AX_ROLE_UNKNOWN:
797 // No role description.
798 break;
799 case ui::AX_ROLE_TOOLTIP:
800 message_id = IDS_AX_ROLE_TOOLTIP;
801 break;
802 case ui::AX_ROLE_WEB_AREA:
803 // No role description.
804 break;
805 case ui::AX_ROLE_WEB_VIEW:
806 // No role description.
807 break;
808 case ui::AX_ROLE_WINDOW:
809 // No role description.
810 break;
811 }
812
813 if (message_id != -1)
814 return content_client->GetLocalizedString(message_id);
815
816 return base::string16();
817 }
818
410 int BrowserAccessibilityAndroid::GetItemIndex() const { 819 int BrowserAccessibilityAndroid::GetItemIndex() const {
411 int index = 0; 820 int index = 0;
412 switch (GetRole()) { 821 switch (GetRole()) {
413 case ui::AX_ROLE_LIST_ITEM: 822 case ui::AX_ROLE_LIST_ITEM:
414 case ui::AX_ROLE_LIST_BOX_OPTION: 823 case ui::AX_ROLE_LIST_BOX_OPTION:
415 case ui::AX_ROLE_TREE_ITEM: 824 case ui::AX_ROLE_TREE_ITEM:
416 index = GetIntAttribute(ui::AX_ATTR_POS_IN_SET) - 1; 825 index = GetIntAttribute(ui::AX_ATTR_POS_IN_SET) - 1;
417 break; 826 break;
418 case ui::AX_ROLE_SLIDER: 827 case ui::AX_ROLE_SLIDER:
419 case ui::AX_ROLE_PROGRESS_INDICATOR: { 828 case ui::AX_ROLE_PROGRESS_INDICATOR: {
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 int BrowserAccessibilityAndroid::CountChildrenWithRole(ui::AXRole role) const { 1380 int BrowserAccessibilityAndroid::CountChildrenWithRole(ui::AXRole role) const {
972 int count = 0; 1381 int count = 0;
973 for (uint32_t i = 0; i < PlatformChildCount(); i++) { 1382 for (uint32_t i = 0; i < PlatformChildCount(); i++) {
974 if (PlatformGetChild(i)->GetRole() == role) 1383 if (PlatformGetChild(i)->GetRole() == role)
975 count++; 1384 count++;
976 } 1385 }
977 return count; 1386 return count;
978 } 1387 }
979 1388
980 } // namespace content 1389 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698