OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |