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

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: Lollipop should extend KitKat 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 if (GetRole() == ui::AX_ROLE_HEADING) {
David Tseng 2016/02/02 18:38:57 Why not include this in the switch below?
dmazzoni 2016/02/03 17:55:07 Added a comment to clarify. I made this special ca
417 int level = GetIntAttribute(ui::AX_ATTR_HIERARCHICAL_LEVEL);
418 if (level >= 1 && level <= 6) {
David Tseng 2016/02/02 18:38:57 Can you check for the case when hierarchical level
dmazzoni 2016/02/03 17:55:06 I don't think we should crash in that case. The au
419 return content_client->GetLocalizedStringF(
420 IDS_AX_ROLE_HEADING_WITH_LEVEL,
421 base::IntToString16(level));
422 } else {
423 return content_client->GetLocalizedString(IDS_AX_ROLE_HEADING);
424 }
425 }
426
427 int message_id = -1;
428 switch (GetRole()) {
429 case ui::AX_ROLE_ABBR:
430 // No role description.
431 break;
432 case ui::AX_ROLE_ALERT_DIALOG:
433 message_id = IDS_AX_ROLE_ALERT_DIALOG;
434 break;
435 case ui::AX_ROLE_ALERT:
436 message_id = IDS_AX_ROLE_ALERT;
437 break;
438 case ui::AX_ROLE_ANNOTATION:
439 // No role description.
440 break;
441 case ui::AX_ROLE_APPLICATION:
442 message_id = IDS_AX_ROLE_APPLICATION;
443 break;
444 case ui::AX_ROLE_ARTICLE:
445 message_id = IDS_AX_ROLE_ARTICLE;
446 break;
447 case ui::AX_ROLE_BANNER:
448 message_id = IDS_AX_ROLE_BANNER;
449 break;
450 case ui::AX_ROLE_BLOCKQUOTE:
451 message_id = IDS_AX_ROLE_BLOCKQUOTE;
452 break;
453 case ui::AX_ROLE_BUSY_INDICATOR:
454 message_id = IDS_AX_ROLE_BUSY_INDICATOR;
455 break;
456 case ui::AX_ROLE_BUTTON:
457 message_id = IDS_AX_ROLE_BUTTON;
458 break;
459 case ui::AX_ROLE_BUTTON_DROP_DOWN:
460 message_id = IDS_AX_ROLE_BUTTON_DROP_DOWN;
461 break;
462 case ui::AX_ROLE_CANVAS:
463 // No role description.
464 break;
465 case ui::AX_ROLE_CAPTION:
466 // No role description.
467 break;
468 case ui::AX_ROLE_CELL:
469 message_id = IDS_AX_ROLE_CELL;
470 break;
471 case ui::AX_ROLE_CHECK_BOX:
472 message_id = IDS_AX_ROLE_CHECK_BOX;
473 break;
474 case ui::AX_ROLE_CLIENT:
475 // No role description.
476 break;
477 case ui::AX_ROLE_COLOR_WELL:
478 message_id = IDS_AX_ROLE_COLOR_WELL;
479 break;
480 case ui::AX_ROLE_COLUMN_HEADER:
481 message_id = IDS_AX_ROLE_COLUMN_HEADER;
482 break;
483 case ui::AX_ROLE_COLUMN:
484 // No role description.
485 break;
486 case ui::AX_ROLE_COMBO_BOX:
487 message_id = IDS_AX_ROLE_COMBO_BOX;
488 break;
489 case ui::AX_ROLE_COMPLEMENTARY:
490 message_id = IDS_AX_ROLE_COMPLEMENTARY;
491 break;
492 case ui::AX_ROLE_CONTENT_INFO:
493 message_id = IDS_AX_ROLE_CONTENT_INFO;
494 break;
495 case ui::AX_ROLE_DATE:
496 message_id = IDS_AX_ROLE_DATE;
497 break;
498 case ui::AX_ROLE_DATE_TIME:
499 message_id = IDS_AX_ROLE_DATE_TIME;
500 break;
501 case ui::AX_ROLE_DEFINITION:
502 message_id = IDS_AX_ROLE_DEFINITION;
503 break;
504 case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL:
505 message_id = IDS_AX_ROLE_DEFINITION;
506 break;
507 case ui::AX_ROLE_DESCRIPTION_LIST:
508 // No role description.
509 break;
510 case ui::AX_ROLE_DESCRIPTION_LIST_TERM:
511 // No role description.
512 break;
513 case ui::AX_ROLE_DESKTOP:
514 // No role description.
515 break;
516 case ui::AX_ROLE_DETAILS:
517 // No role description.
518 break;
519 case ui::AX_ROLE_DIALOG:
520 message_id = IDS_AX_ROLE_DIALOG;
521 break;
522 case ui::AX_ROLE_DIRECTORY:
523 message_id = IDS_AX_ROLE_DIRECTORY;
524 break;
525 case ui::AX_ROLE_DISCLOSURE_TRIANGLE:
526 message_id = IDS_AX_ROLE_DISCLOSURE_TRIANGLE;
527 break;
528 case ui::AX_ROLE_DIV:
529 // No role description.
530 break;
531 case ui::AX_ROLE_DOCUMENT:
532 message_id = IDS_AX_ROLE_DOCUMENT;
533 break;
534 case ui::AX_ROLE_EMBEDDED_OBJECT:
535 message_id = IDS_AX_ROLE_EMBEDDED_OBJECT;
536 break;
537 case ui::AX_ROLE_FIGCAPTION:
538 // No role description.
539 break;
540 case ui::AX_ROLE_FIGURE:
541 message_id = IDS_AX_ROLE_GRAPHIC;
542 break;
543 case ui::AX_ROLE_FOOTER:
544 message_id = IDS_AX_ROLE_FOOTER;
545 break;
546 case ui::AX_ROLE_FORM:
547 // No role description.
548 break;
549 case ui::AX_ROLE_GRID:
550 message_id = IDS_AX_ROLE_TABLE;
551 break;
552 case ui::AX_ROLE_GROUP:
553 // No role description.
554 break;
555 case ui::AX_ROLE_IFRAME:
556 // No role description.
557 break;
558 case ui::AX_ROLE_IFRAME_PRESENTATIONAL:
559 // No role description.
560 break;
561 case ui::AX_ROLE_IGNORED:
562 // No role description.
563 break;
564 case ui::AX_ROLE_IMAGE_MAP_LINK:
565 message_id = IDS_AX_ROLE_LINK;
566 break;
567 case ui::AX_ROLE_IMAGE_MAP:
568 message_id = IDS_AX_ROLE_GRAPHIC;
569 break;
570 case ui::AX_ROLE_IMAGE:
571 message_id = IDS_AX_ROLE_GRAPHIC;
572 break;
573 case ui::AX_ROLE_INLINE_TEXT_BOX:
574 // No role description.
575 break;
576 case ui::AX_ROLE_INPUT_TIME:
577 message_id = IDS_AX_ROLE_INPUT_TIME;
578 break;
579 case ui::AX_ROLE_LABEL_TEXT:
580 // No role description.
581 break;
582 case ui::AX_ROLE_LEGEND:
583 // No role description.
584 break;
585 case ui::AX_ROLE_LINE_BREAK:
586 // No role description.
587 break;
588 case ui::AX_ROLE_LINK:
589 message_id = IDS_AX_ROLE_LINK;
590 break;
591 case ui::AX_ROLE_LIST_BOX_OPTION:
592 // No role description.
593 break;
594 case ui::AX_ROLE_LIST_BOX:
595 message_id = IDS_AX_ROLE_LIST_BOX;
596 break;
597 case ui::AX_ROLE_LIST_ITEM:
598 // No role description.
599 break;
600 case ui::AX_ROLE_LIST_MARKER:
601 // No role description.
602 break;
603 case ui::AX_ROLE_LIST:
604 // No role description.
605 break;
606 case ui::AX_ROLE_LOCATION_BAR:
607 // No role description.
608 break;
609 case ui::AX_ROLE_LOG:
610 message_id = IDS_AX_ROLE_LOG;
611 break;
612 case ui::AX_ROLE_MAIN:
613 message_id = IDS_AX_ROLE_MAIN_CONTENT;
614 break;
615 case ui::AX_ROLE_MARK:
616 message_id = IDS_AX_ROLE_MARK;
617 break;
618 case ui::AX_ROLE_MARQUEE:
619 message_id = IDS_AX_ROLE_MARQUEE;
620 break;
621 case ui::AX_ROLE_MATH:
622 message_id = IDS_AX_ROLE_MATH;
623 break;
624 case ui::AX_ROLE_MENU_BAR:
625 message_id = IDS_AX_ROLE_MENU_BAR;
626 break;
627 case ui::AX_ROLE_MENU_BUTTON:
628 message_id = IDS_AX_ROLE_MENU_BUTTON;
629 break;
630 case ui::AX_ROLE_MENU_ITEM:
631 message_id = IDS_AX_ROLE_MENU_ITEM;
632 break;
633 case ui::AX_ROLE_MENU_ITEM_CHECK_BOX:
634 message_id = IDS_AX_ROLE_CHECK_BOX;
635 break;
636 case ui::AX_ROLE_MENU_ITEM_RADIO:
637 message_id = IDS_AX_ROLE_RADIO;
638 break;
639 case ui::AX_ROLE_MENU_LIST_OPTION:
640 // No role description.
641 break;
642 case ui::AX_ROLE_MENU_LIST_POPUP:
643 // No role description.
644 break;
645 case ui::AX_ROLE_MENU:
646 message_id = IDS_AX_ROLE_MENU;
647 break;
648 case ui::AX_ROLE_METER:
649 message_id = IDS_AX_ROLE_METER;
650 break;
651 case ui::AX_ROLE_NAVIGATION:
652 message_id = IDS_AX_ROLE_NAVIGATIONAL_LINK;
653 break;
654 case ui::AX_ROLE_NOTE:
655 message_id = IDS_AX_ROLE_NOTE;
656 break;
657 case ui::AX_ROLE_OUTLINE:
658 message_id = IDS_AX_ROLE_OUTLINE;
659 break;
660 case ui::AX_ROLE_PANE:
661 // No role description.
662 break;
663 case ui::AX_ROLE_PARAGRAPH:
664 // No role description.
665 break;
666 case ui::AX_ROLE_POP_UP_BUTTON:
667 message_id = IDS_AX_ROLE_POP_UP_BUTTON;
668 break;
669 case ui::AX_ROLE_PRE:
670 // No role description.
671 break;
672 case ui::AX_ROLE_PRESENTATIONAL:
673 // No role description.
674 break;
675 case ui::AX_ROLE_PROGRESS_INDICATOR:
676 message_id = IDS_AX_ROLE_PROGRESS_INDICATOR;
677 break;
678 case ui::AX_ROLE_RADIO_BUTTON:
679 message_id = IDS_AX_ROLE_RADIO;
680 break;
681 case ui::AX_ROLE_RADIO_GROUP:
682 message_id = IDS_AX_ROLE_RADIO_GROUP;
683 break;
684 case ui::AX_ROLE_REGION:
685 message_id = IDS_AX_ROLE_REGION;
686 break;
687 case ui::AX_ROLE_ROOT_WEB_AREA:
688 // No role description.
689 break;
690 case ui::AX_ROLE_ROW_HEADER:
691 message_id = IDS_AX_ROLE_ROW_HEADER;
692 break;
693 case ui::AX_ROLE_ROW:
694 // No role description.
695 break;
696 case ui::AX_ROLE_RUBY:
697 // No role description.
698 break;
699 case ui::AX_ROLE_RULER:
700 message_id = IDS_AX_ROLE_RULER;
701 break;
702 case ui::AX_ROLE_SVG_ROOT:
703 message_id = IDS_AX_ROLE_GRAPHIC;
704 break;
705 case ui::AX_ROLE_SCROLL_AREA:
706 // No role description.
707 break;
708 case ui::AX_ROLE_SCROLL_BAR:
709 message_id = IDS_AX_ROLE_SCROLL_BAR;
710 break;
711 case ui::AX_ROLE_SEAMLESS_WEB_AREA:
712 // No role description.
713 break;
714 case ui::AX_ROLE_SEARCH:
715 message_id = IDS_AX_ROLE_SEARCH;
716 break;
717 case ui::AX_ROLE_SEARCH_BOX:
718 message_id = IDS_AX_ROLE_SEARCH_BOX;
719 break;
720 case ui::AX_ROLE_SLIDER:
721 message_id = IDS_AX_ROLE_SLIDER;
722 break;
723 case ui::AX_ROLE_SLIDER_THUMB:
724 // No role description.
725 break;
726 case ui::AX_ROLE_SPIN_BUTTON_PART:
727 // No role description.
728 break;
729 case ui::AX_ROLE_SPIN_BUTTON:
730 message_id = IDS_AX_ROLE_SPIN_BUTTON;
731 break;
732 case ui::AX_ROLE_SPLITTER:
733 message_id = IDS_AX_ROLE_SPLITTER;
734 break;
735 case ui::AX_ROLE_STATIC_TEXT:
736 // No role description.
737 break;
738 case ui::AX_ROLE_STATUS:
739 message_id = IDS_AX_ROLE_STATUS;
740 break;
741 case ui::AX_ROLE_SWITCH:
742 message_id = IDS_AX_ROLE_SWITCH;
743 break;
744 case ui::AX_ROLE_TAB_GROUP:
745 // No role description.
746 break;
747 case ui::AX_ROLE_TAB_LIST:
748 message_id = IDS_AX_ROLE_TAB_LIST;
749 break;
750 case ui::AX_ROLE_TAB_PANEL:
751 message_id = IDS_AX_ROLE_TAB_PANEL;
752 break;
753 case ui::AX_ROLE_TAB:
754 message_id = IDS_AX_ROLE_TAB;
755 break;
756 case ui::AX_ROLE_TABLE_HEADER_CONTAINER:
757 // No role description.
758 break;
759 case ui::AX_ROLE_TABLE:
760 message_id = IDS_AX_ROLE_TABLE;
761 break;
762 case ui::AX_ROLE_TEXT_FIELD:
763 // No role description.
764 break;
765 case ui::AX_ROLE_TIME:
766 message_id = IDS_AX_ROLE_TIME;
767 break;
768 case ui::AX_ROLE_TIMER:
769 message_id = IDS_AX_ROLE_TIMER;
770 break;
771 case ui::AX_ROLE_TITLE_BAR:
772 // No role description.
773 break;
774 case ui::AX_ROLE_TOGGLE_BUTTON:
775 message_id = IDS_AX_ROLE_TOGGLE_BUTTON;
776 break;
777 case ui::AX_ROLE_TOOLBAR:
778 message_id = IDS_AX_ROLE_TOOLBAR;
779 break;
780 case ui::AX_ROLE_TREE_GRID:
781 message_id = IDS_AX_ROLE_TREE_GRID;
782 break;
783 case ui::AX_ROLE_TREE_ITEM:
784 message_id = IDS_AX_ROLE_TREE_ITEM;
785 break;
786 case ui::AX_ROLE_TREE:
787 message_id = IDS_AX_ROLE_TREE;
788 break;
789 case ui::AX_ROLE_UNKNOWN:
790 // No role description.
791 break;
792 case ui::AX_ROLE_TOOLTIP:
793 message_id = IDS_AX_ROLE_TOOLTIP;
794 break;
795 case ui::AX_ROLE_WEB_AREA:
796 // No role description.
797 break;
798 case ui::AX_ROLE_WEB_VIEW:
799 // No role description.
800 break;
801 case ui::AX_ROLE_WINDOW:
802 // No role description.
803 break;
804 }
805
806 if (message_id != -1)
807 return content_client->GetLocalizedString(message_id);
808
809 return base::string16();
810 }
811
410 int BrowserAccessibilityAndroid::GetItemIndex() const { 812 int BrowserAccessibilityAndroid::GetItemIndex() const {
411 int index = 0; 813 int index = 0;
412 switch (GetRole()) { 814 switch (GetRole()) {
413 case ui::AX_ROLE_LIST_ITEM: 815 case ui::AX_ROLE_LIST_ITEM:
414 case ui::AX_ROLE_LIST_BOX_OPTION: 816 case ui::AX_ROLE_LIST_BOX_OPTION:
415 case ui::AX_ROLE_TREE_ITEM: 817 case ui::AX_ROLE_TREE_ITEM:
416 index = GetIntAttribute(ui::AX_ATTR_POS_IN_SET) - 1; 818 index = GetIntAttribute(ui::AX_ATTR_POS_IN_SET) - 1;
417 break; 819 break;
418 case ui::AX_ROLE_SLIDER: 820 case ui::AX_ROLE_SLIDER:
419 case ui::AX_ROLE_PROGRESS_INDICATOR: { 821 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 { 1373 int BrowserAccessibilityAndroid::CountChildrenWithRole(ui::AXRole role) const {
972 int count = 0; 1374 int count = 0;
973 for (uint32_t i = 0; i < PlatformChildCount(); i++) { 1375 for (uint32_t i = 0; i < PlatformChildCount(); i++) {
974 if (PlatformGetChild(i)->GetRole() == role) 1376 if (PlatformGetChild(i)->GetRole() == role)
975 count++; 1377 count++;
976 } 1378 }
977 return count; 1379 return count;
978 } 1380 }
979 1381
980 } // namespace content 1382 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698