diff options
Diffstat (limited to 'chromium/content/browser/accessibility/browser_accessibility_android.cc')
-rw-r--r-- | chromium/content/browser/accessibility/browser_accessibility_android.cc | 76 |
1 files changed, 49 insertions, 27 deletions
diff --git a/chromium/content/browser/accessibility/browser_accessibility_android.cc b/chromium/content/browser/accessibility/browser_accessibility_android.cc index c219569e5e4..2aae62b5648 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_android.cc +++ b/chromium/content/browser/accessibility/browser_accessibility_android.cc @@ -55,8 +55,6 @@ enum { ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT = 1 }; namespace content { -const float kContentInvalidTimeoutMillisecs = 6000.0; - // static BrowserAccessibility* BrowserAccessibility::Create() { return new BrowserAccessibilityAndroid(); @@ -176,20 +174,6 @@ bool BrowserAccessibilityAndroid::IsCollectionItem() const { } bool BrowserAccessibilityAndroid::IsContentInvalid() const { - if (IsFocused()) { - // When a node has focus, only report that it's invalid for a short period - // of time. Otherwise it's annoying to hear the invalid message every time - // a character is entered. - if (content_invalid_timer_.Elapsed().InMillisecondsF() < - kContentInvalidTimeoutMillisecs) { - bool invalid_state = - HasIntAttribute(ax::mojom::IntAttribute::kInvalidState) && - GetData().GetInvalidState() != ax::mojom::InvalidState::kFalse; - if (invalid_state) - return true; - } - return false; - } return HasIntAttribute(ax::mojom::IntAttribute::kInvalidState) && GetData().GetInvalidState() != ax::mojom::InvalidState::kFalse; } @@ -269,6 +253,10 @@ bool BrowserAccessibilityAndroid::IsMultiLine() const { return HasState(ax::mojom::State::kMultiline); } +bool BrowserAccessibilityAndroid::IsMultiselectable() const { + return HasState(ax::mojom::State::kMultiselectable); +} + bool BrowserAccessibilityAndroid::IsRangeType() const { return (GetRole() == ax::mojom::Role::kProgressIndicator || GetRole() == ax::mojom::Role::kMeter || @@ -378,7 +366,7 @@ BrowserAccessibilityAndroid::GetSoleInterestingNodeFromSubtree() const { } bool BrowserAccessibilityAndroid::AreInlineTextBoxesLoaded() const { - if (GetRole() == ax::mojom::Role::kStaticText) + if (IsText()) return InternalChildCount() > 0; // Return false if any descendant needs to load inline text boxes. @@ -550,6 +538,47 @@ base::string16 BrowserAccessibilityAndroid::GetHint() const { return base::JoinString(strings, base::ASCIIToUTF16(" ")); } +base::string16 BrowserAccessibilityAndroid::GetStateDescription() const { + // For multiselectable state, generate a state description + if (IsMultiselectable()) + return GetMultiselectableStateDescription(); + + // Otherwise we will not use state description + return base::string16(); +} + +base::string16 BrowserAccessibilityAndroid::GetMultiselectableStateDescription() + const { + content::ContentClient* content_client = content::GetContentClient(); + + // Count the number of children and selected children. + int child_count = 0; + int selected_count = 0; + for (PlatformChildIterator it = PlatformChildrenBegin(); + it != PlatformChildrenEnd(); ++it) { + child_count++; + BrowserAccessibilityAndroid* child = + static_cast<BrowserAccessibilityAndroid*>(it.get()); + if (child->IsSelected()) + selected_count++; + } + + // If none are selected, return special case. + if (!selected_count) + return content_client->GetLocalizedString( + IDS_AX_MULTISELECTABLE_STATE_DESCRIPTION_NONE); + + // Generate a state description of the form: "multiselectable, x of y + // selected.". + std::vector<base::string16> values; + values.push_back(base::NumberToString16(selected_count)); + values.push_back(base::NumberToString16(child_count)); + return base::ReplaceStringPlaceholders( + content_client->GetLocalizedString( + IDS_AX_MULTISELECTABLE_STATE_DESCRIPTION), + values, nullptr); +} + std::string BrowserAccessibilityAndroid::GetRoleString() const { return ui::ToString(GetRole()); } @@ -964,8 +993,6 @@ base::string16 BrowserAccessibilityAndroid::GetRoleDescription() const { message_id = IDS_AX_ROLE_MENU_BAR; break; case ax::mojom::Role::kMenuButton: - message_id = IDS_AX_ROLE_MENU_BUTTON; - break; case ax::mojom::Role::kMenuItem: message_id = IDS_AX_ROLE_MENU_ITEM; break; @@ -1724,7 +1751,7 @@ void BrowserAccessibilityAndroid::GetSuggestions( BrowserAccessibility* node = InternalGetFirstChild(); int start_offset = 0; while (node && node != this) { - if (node->IsTextOnlyObject()) { + if (node->IsText()) { const std::vector<int32_t>& marker_types = node->GetData().GetIntListAttribute( ax::mojom::IntListAttribute::kMarkerTypes); @@ -1801,7 +1828,7 @@ bool BrowserAccessibilityAndroid::HasOnlyTextChildren() const { // This is called from IsLeaf, so don't call PlatformChildCount // from within this! for (auto it = InternalChildrenBegin(); it != InternalChildrenEnd(); ++it) { - if (!it->IsTextOnlyObject()) + if (!it->IsText()) return false; } return true; @@ -1812,8 +1839,7 @@ bool BrowserAccessibilityAndroid::HasOnlyTextAndImageChildren() const { // from within this! for (auto it = InternalChildrenBegin(); it != InternalChildrenEnd(); ++it) { BrowserAccessibility* child = it.get(); - if (child->GetRole() != ax::mojom::Role::kStaticText && - !ui::IsImageOrVideo(child->GetRole())) { + if (!child->IsText() && !ui::IsImageOrVideo(child->GetRole())) { return false; } } @@ -1908,8 +1934,4 @@ base::string16 BrowserAccessibilityAndroid::GetContentInvalidErrorMessage() return base::string16(); } -void BrowserAccessibilityAndroid::ResetContentInvalidTimer() { - content_invalid_timer_ = base::ElapsedTimer(); -} - } // namespace content |