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