17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_android.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager_android.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/common/accessibility_messages.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/common/accessibility_node_data.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace { 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// These are enums from android.text.InputType in Java: 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum { 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_NULL = 0, 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME = 0x4, 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE = 0x14, 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME = 0x24, 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER = 0x2, 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_PHONE = 0x3, 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT = 0x1, 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_URI = 0x11, 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EDIT_TEXT = 0xa1, 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EMAIL = 0xd1, 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_PASSWORD = 0xe1 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// These are enums from android.view.View in Java: 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum { 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_NONE = 0, 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_POLITE = 1, 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// These are enums from 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// android.view.accessibility.AccessibilityNodeInfo.RangeInfo in Java: 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum { 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT = 1 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content { 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BrowserAccessibility* BrowserAccessibility::Create() { 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return new BrowserAccessibilityAndroid(); 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BrowserAccessibilityAndroid::BrowserAccessibilityAndroid() { 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) first_time_ = true; 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsNative() const { 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool BrowserAccessibilityAndroid::PlatformIsLeaf() const { 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (child_count() == 0) 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Iframes are always allowed to contain children. 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsIframe() || 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) role() == blink::WebAXRoleRootWebArea || 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) role() == blink::WebAXRoleWebArea) { 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If it has a focusable child, we definitely can't leave out children. 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasFocusableChild()) 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Headings with text can drop their children. 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 name = GetText(); 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (role() == blink::WebAXRoleHeading && !name.empty()) 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Focusable nodes with text can drop their children. 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (HasState(blink::WebAXStateFocusable) && !name.empty()) 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Nodes with only static text as children can drop their children. 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasOnlyStaticTextChildren()) 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return BrowserAccessibility::PlatformIsLeaf(); 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsCheckable() const { 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool checkable = false; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_aria_pressed_defined; 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_mixed; 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (role() == blink::WebAXRoleCheckBox || 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) role() == blink::WebAXRoleRadioButton || 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_aria_pressed_defined) { 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch checkable = true; 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (HasState(blink::WebAXStateChecked)) 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch checkable = true; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return checkable; 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsChecked() const { 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return HasState(blink::WebAXStateChecked); 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsClickable() const { 1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return (PlatformIsLeaf() && !GetText().empty()); 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsCollection() const { 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return (role() == blink::WebAXRoleGrid || 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleList || 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleListBox || 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTable || 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTree); 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsCollectionItem() const { 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return (role() == blink::WebAXRoleCell || 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleColumnHeader || 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleDescriptionListTerm || 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleListBoxOption || 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleListItem || 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleRowHeader || 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTreeItem); 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsContentInvalid() const { 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string invalid; 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetHtmlAttribute("aria-invalid", &invalid); 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsDismissable() const { 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; // No concept of "dismissable" on the web currently. 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsEnabled() const { 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return HasState(blink::WebAXStateEnabled); 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsFocusable() const { 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool focusable = HasState(blink::WebAXStateFocusable); 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsIframe() || 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) role() == blink::WebAXRoleWebArea) { 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch focusable = false; 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return focusable; 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsFocused() const { 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return manager()->GetFocus(manager()->GetRoot()) == this; 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsHeading() const { 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return (role() == blink::WebAXRoleColumnHeader || 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleHeading || 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleRowHeader); 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsHierarchical() const { 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return (role() == blink::WebAXRoleList || 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTree); 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsMultiLine() const { 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return role() == blink::WebAXRoleTextArea; 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsPassword() const { 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return HasState(blink::WebAXStateProtected); 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsRangeType() const { 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return (role() == blink::WebAXRoleProgressIndicator || 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleScrollBar || 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleSlider); 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsScrollable() const { 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int dummy; 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_X_MAX, &dummy); 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsSelected() const { 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return HasState(blink::WebAXStateSelected); 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsVisibleToUser() const { 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return !HasState(blink::WebAXStateInvisible); 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::CanOpenPopup() const { 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return HasState(blink::WebAXStateHaspopup); 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char* BrowserAccessibilityAndroid::GetClassName() const { 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* class_name = NULL; 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch(role()) { 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleEditableText: 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleSpinButton: 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleTextArea: 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleTextField: 2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.EditText"; 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleSlider: 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.SeekBar"; 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleComboBox: 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.Spinner"; 2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleButton: 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleMenuButton: 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRolePopUpButton: 2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.Button"; 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleCheckBox: 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.CheckBox"; 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleRadioButton: 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.RadioButton"; 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleToggleButton: 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.ToggleButton"; 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleCanvas: 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleImage: 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.Image"; 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleProgressIndicator: 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.ProgressBar"; 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleTabList: 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.TabWidget"; 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleGrid: 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleTable: 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.GridView"; 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleList: 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleListBox: 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.ListView"; 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 247d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) case blink::WebAXRoleDialog: 248d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) class_name = "android.app.Dialog"; 249d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) break; 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) default: 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.view.View"; 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return class_name; 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityAndroid::GetText() const { 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsIframe() || 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) role() == blink::WebAXRoleWebArea) { 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 description = GetString16Attribute( 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_DESCRIPTION); 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text; 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!name().empty()) 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) text = base::UTF8ToUTF16(name()); 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (!description.empty()) 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch text = description; 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (!value().empty()) 2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) text = base::UTF8ToUTF16(value()); 2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is called from PlatformIsLeaf, so don't call PlatformChildCount 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // from within this! 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (text.empty() && HasOnlyStaticTextChildren()) { 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (uint32 i = 0; i < child_count(); i++) { 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserAccessibility* child = children()[i]; 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch text += static_cast<BrowserAccessibilityAndroid*>(child)->GetText(); 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch(role()) { 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleImageMapLink: 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleLink: 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!text.empty()) 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch text += ASCIIToUTF16(" "); 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch text += ASCIIToUTF16("Link"); 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleHeading: 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Only append "heading" if this node already has text. 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!text.empty()) 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch text += ASCIIToUTF16(" Heading"); 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return text; 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetItemIndex() const { 3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int index = 0; 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch(role()) { 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleListItem: 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleListBoxOption: 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case blink::WebAXRoleTreeItem: 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index = index_in_parent(); 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleSlider: 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleProgressIndicator: { 3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float value_for_range; 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (GetFloatAttribute( 3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &value_for_range)) { 3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index = static_cast<int>(value_for_range); 3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return index; 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetItemCount() const { 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int count = 0; 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) switch(role()) { 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleList: 325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleListBox: 3260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) count = PlatformChildCount(); 3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleSlider: 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case blink::WebAXRoleProgressIndicator: { 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float max_value_for_range; 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (GetFloatAttribute(AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE, 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &max_value_for_range)) { 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) count = static_cast<int>(max_value_for_range); 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return count; 3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetScrollX() const { 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_X, &value); 344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetScrollY() const { 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_Y, &value); 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetMaxScrollX() const { 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_X_MAX, &value); 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetMaxScrollY() const { 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetIntAttribute(AccessibilityNodeData::ATTR_SCROLL_Y_MAX, &value); 362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeFromIndex() const { 3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t index = 0; 3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (index < old_value_.length() && 3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index < new_value_.length() && 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[index] == new_value_[index]) { 3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index++; 3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return index; 3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeAddedCount() const { 3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t old_len = old_value_.length(); 3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t new_len = new_value_.length(); 3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t left = 0; 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (left < old_len && 3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left < new_len && 3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[left] == new_value_[left]) { 3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left++; 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t right = 0; 3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (right < old_len && 3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right < new_len && 3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[old_len - right - 1] == new_value_[new_len - right - 1]) { 3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right++; 3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (new_len - left - right); 3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeRemovedCount() const { 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t old_len = old_value_.length(); 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t new_len = new_value_.length(); 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t left = 0; 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (left < old_len && 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left < new_len && 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[left] == new_value_[left]) { 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left++; 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t right = 0; 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (right < old_len && 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right < new_len && 4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[old_len - right - 1] == new_value_[new_len - right - 1]) { 4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right++; 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (old_len - left - right); 4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityAndroid::GetTextChangeBeforeText() const { 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return old_value_; 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetSelectionStart() const { 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int sel_start = 0; 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_START, &sel_start); 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return sel_start; 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetSelectionEnd() const { 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int sel_end = 0; 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &sel_end); 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return sel_end; 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetEditableTextLength() const { 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value().length(); 4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidInputType() const { 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string html_tag = GetStringAttribute( 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AccessibilityNodeData::ATTR_HTML_TAG); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (html_tag != "input") 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_NULL; 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string type; 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!GetHtmlAttribute("type", &type)) 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT; 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (type == "" || type == "text" || type == "search") 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT; 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "date") 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE; 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "datetime" || type == "datetime-local") 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME; 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "email") 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EMAIL; 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "month") 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE; 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "number") 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER; 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "password") 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_PASSWORD; 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "tel") 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_PHONE; 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "time") 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME; 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "url") 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_URI; 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "week") 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME; 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_NULL; 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidLiveRegionType() const { 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string live = GetStringAttribute( 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) AccessibilityNodeData::ATTR_LIVE_STATUS); 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (live == "polite") 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_POLITE; 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (live == "assertive") 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_ASSERTIVE; 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_NONE; 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidRangeType() const { 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT; 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowCount() const { 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (role() == blink::WebAXRoleGrid || 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTable) { 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return CountChildrenWithRole(blink::WebAXRoleRow); 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (role() == blink::WebAXRoleList || 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleListBox || 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTree) { 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return PlatformChildCount(); 491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 0; 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnCount() const { 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (role() == blink::WebAXRoleGrid || 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTable) { 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return CountChildrenWithRole(blink::WebAXRoleColumn); 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 0; 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowIndex() const { 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (role() == blink::WebAXRoleListItem || 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleListBoxOption || 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) role() == blink::WebAXRoleTreeItem) { 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return index_in_parent(); 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX); 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowSpan() const { 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN); 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnIndex() const { 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX); 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnSpan() const { 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetIntAttribute(AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN); 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeMin() const { 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetFloatAttribute(AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE); 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeMax() const { 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetFloatAttribute(AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE); 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeCurrentValue() const { 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetFloatAttribute(AccessibilityNodeData::ATTR_VALUE_FOR_RANGE); 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::HasFocusableChild() const { 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is called from PlatformIsLeaf, so don't call PlatformChildCount 540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // from within this! 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (uint32 i = 0; i < child_count(); i++) { 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserAccessibility* child = children()[i]; 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child->HasState(blink::WebAXStateFocusable)) 5447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (static_cast<BrowserAccessibilityAndroid*>(child)->HasFocusableChild()) 5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 5477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::HasOnlyStaticTextChildren() const { 552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is called from PlatformIsLeaf, so don't call PlatformChildCount 553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // from within this! 554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (uint32 i = 0; i < child_count(); i++) { 555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserAccessibility* child = children()[i]; 556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child->role() != blink::WebAXRoleStaticText) 5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 5607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsIframe() const { 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 html_tag = GetString16Attribute( 5643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_HTML_TAG); 5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return html_tag == ASCIIToUTF16("iframe"); 5667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void BrowserAccessibilityAndroid::PostInitialize() { 5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BrowserAccessibility::PostInitialize(); 5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsEditableText()) { 572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (base::UTF8ToUTF16(value()) != new_value_) { 5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_ = new_value_; 574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new_value_ = base::UTF8ToUTF16(value()); 5757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (role() == blink::WebAXRoleAlert && first_time_) 579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->NotifyAccessibilityEvent(blink::WebAXEventAlert, this); 5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 live; 5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetString16Attribute( 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS, &live)) { 5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NotifyLiveRegionUpdate(live); 5857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) first_time_ = false; 5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BrowserAccessibilityAndroid::NotifyLiveRegionUpdate( 591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16& aria_live) { 5927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!EqualsASCII(aria_live, aria_strings::kAriaLivePolite) && 5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) !EqualsASCII(aria_live, aria_strings::kAriaLiveAssertive)) 5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = GetText(); 5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (cached_text_ != text) { 5987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!text.empty()) { 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->NotifyAccessibilityEvent(blink::WebAXEventShow, 6007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) this); 6017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cached_text_ = text; 6037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::CountChildrenWithRole( 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebAXRole role) const { 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int count = 0; 609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (uint32 i = 0; i < PlatformChildCount(); i++) { 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (PlatformGetChild(i)->role() == role) 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) count++; 612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return count; 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace content 617