Chromium Code Reviews| 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 |