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) 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace { 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// These are enums from android.text.InputType in Java: 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum { 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_NULL = 0, 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME = 0x4, 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE = 0x14, 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME = 0x24, 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER = 0x2, 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_PHONE = 0x3, 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT = 0x1, 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_URI = 0x11, 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EDIT_TEXT = 0xa1, 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EMAIL = 0xd1, 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_PASSWORD = 0xe1 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// These are enums from android.view.View in Java: 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum { 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_NONE = 0, 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_POLITE = 1, 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// These are enums from 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// android.view.accessibility.AccessibilityNodeInfo.RangeInfo in Java: 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum { 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT = 1 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content { 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// static 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BrowserAccessibility* BrowserAccessibility::Create() { 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return new BrowserAccessibilityAndroid(); 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)BrowserAccessibilityAndroid::BrowserAccessibilityAndroid() { 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) first_time_ = true; 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsNative() const { 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserAccessibilityAndroid::OnLocationChanged() { 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manager()->NotifyAccessibilityEvent(ui::AX_EVENT_LOCATION_CHANGED, this); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool BrowserAccessibilityAndroid::PlatformIsLeaf() const { 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (InternalChildCount() == 0) 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Iframes are always allowed to contain children. 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsIframe() || 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_WEB_AREA) { 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If it has a focusable child, we definitely can't leave out children. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasFocusableChild()) 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Headings with text can drop their children. 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 name = GetText(); 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_HEADING && !name.empty()) 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Focusable nodes with text can drop their children. 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSABLE) && !name.empty()) 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Nodes with only static text as children can drop their children. 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasOnlyStaticTextChildren()) 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return BrowserAccessibility::PlatformIsLeaf(); 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsCheckable() const { 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool checkable = false; 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_aria_pressed_defined; 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool is_mixed; 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed); 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_CHECK_BOX || 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_RADIO_BUTTON || 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_aria_pressed_defined) { 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch checkable = true; 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_CHECKED)) 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch checkable = true; 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return checkable; 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsChecked() const { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return HasState(ui::AX_STATE_CHECKED); 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsClickable() const { 1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return (PlatformIsLeaf() && !GetText().empty()); 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsCollection() const { 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return (GetRole() == ui::AX_ROLE_GRID || 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST || 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST_BOX || 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TABLE || 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TREE); 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsCollectionItem() const { 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return (GetRole() == ui::AX_ROLE_CELL || 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_COLUMN_HEADER || 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_DESCRIPTION_LIST_TERM || 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST_BOX_OPTION || 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST_ITEM || 130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_ROW_HEADER || 131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TREE_ITEM); 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsContentInvalid() const { 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string invalid; 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetHtmlAttribute("aria-invalid", &invalid); 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsDismissable() const { 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; // No concept of "dismissable" on the web currently. 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsEnabled() const { 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return HasState(ui::AX_STATE_ENABLED); 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsFocusable() const { 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool focusable = HasState(ui::AX_STATE_FOCUSABLE); 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsIframe() || 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_WEB_AREA) { 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch focusable = false; 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return focusable; 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsFocused() const { 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return manager()->GetFocus(manager()->GetRoot()) == this; 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsHeading() const { 161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return (GetRole() == ui::AX_ROLE_COLUMN_HEADER || 162a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_HEADING || 163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_ROW_HEADER); 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsHierarchical() const { 167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return (GetRole() == ui::AX_ROLE_LIST || 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TREE); 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsLink() const { 172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return GetRole() == ui::AX_ROLE_LINK || 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_IMAGE_MAP_LINK; 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsMultiLine() const { 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return GetRole() == ui::AX_ROLE_TEXT_AREA; 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsPassword() const { 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return HasState(ui::AX_STATE_PROTECTED); 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsRangeType() const { 185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return (GetRole() == ui::AX_ROLE_PROGRESS_INDICATOR || 186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_SCROLL_BAR || 187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_SLIDER); 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsScrollable() const { 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int dummy; 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, &dummy); 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsSelected() const { 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return HasState(ui::AX_STATE_SELECTED); 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsVisibleToUser() const { 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return !HasState(ui::AX_STATE_INVISIBLE); 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::CanOpenPopup() const { 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return HasState(ui::AX_STATE_HASPOPUP); 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char* BrowserAccessibilityAndroid::GetClassName() const { 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* class_name = NULL; 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch switch(GetRole()) { 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_EDITABLE_TEXT: 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPIN_BUTTON: 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TEXT_AREA: 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TEXT_FIELD: 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.EditText"; 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SLIDER: 2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.SeekBar"; 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COMBO_BOX: 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.Spinner"; 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BUTTON: 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_BUTTON: 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_POP_UP_BUTTON: 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.Button"; 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CHECK_BOX: 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.CheckBox"; 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RADIO_BUTTON: 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.RadioButton"; 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TOGGLE_BUTTON: 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.ToggleButton"; 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CANVAS: 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IMAGE: 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.Image"; 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PROGRESS_INDICATOR: 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.ProgressBar"; 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TAB_LIST: 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.TabWidget"; 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_GRID: 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TABLE: 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.GridView"; 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST: 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_BOX: 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.widget.ListView"; 2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DIALOG: 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class_name = "android.app.Dialog"; 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case ui::AX_ROLE_ROOT_WEB_AREA: 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class_name = "android.webkit.WebView"; 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) break; 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) default: 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) class_name = "android.view.View"; 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return class_name; 2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityAndroid::GetText() const { 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (IsIframe() || 271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_WEB_AREA) { 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return base::string16(); 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // See comment in browser_accessibility_win.cc for details. 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The difference here is that we can only expose one accessible 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // name on Android, not 2 or 3 like on Windows or Mac. 2781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch 2791675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // First, always return the |value| attribute if this is an 2801675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // accessible text. 2811675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch if (!value().empty() && 2821675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch (GetRole() == ui::AX_ROLE_EDITABLE_TEXT || 2831675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch GetRole() == ui::AX_ROLE_TEXT_AREA || 2841675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch GetRole() == ui::AX_ROLE_TEXT_FIELD || 2851675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch HasState(ui::AX_STATE_EDITABLE))) { 2861675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch return base::UTF8ToUTF16(value()); 2871675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch } 2881675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch 2891675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // If there's no text value, the basic rule is: prefer description 2901675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // (aria-labelledby or aria-label), then help (title), then name 2911675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // (inner text), then value (control value). However, if 2921675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch // title_elem_id is set, that means there's a label element 29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // supplying the name and then name takes precedence over help. 29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // TODO(dmazzoni): clean this up by providing more granular labels in 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Blink, making the platform-specific mapping to accessible text simpler. 2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::string16 description = GetString16Attribute(ui::AX_ATTR_DESCRIPTION); 29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::string16 help = GetString16Attribute(ui::AX_ATTR_HELP); 29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int title_elem_id = GetIntAttribute( 29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::AX_ATTR_TITLE_UI_ELEMENT); 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text; 30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!description.empty()) 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch text = description; 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else if (title_elem_id && !name().empty()) 30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) text = base::UTF8ToUTF16(name()); 30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else if (!help.empty()) 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) text = help; 30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else if (!name().empty()) 30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) text = base::UTF8ToUTF16(name()); 309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (!value().empty()) 3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) text = base::UTF8ToUTF16(value()); 3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is called from PlatformIsLeaf, so don't call PlatformChildCount 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // from within this! 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (text.empty() && HasOnlyStaticTextChildren()) { 315a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (uint32 i = 0; i < InternalChildCount(); i++) { 316a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* child = InternalGetChild(i); 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch text += static_cast<BrowserAccessibilityAndroid*>(child)->GetText(); 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (text.empty() && IsLink()) { 3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::string16 url = GetString16Attribute(ui::AX_ATTR_URL); 3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Given a url like http://foo.com/bar/baz.png, just return the 3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // base name, e.g., "baz". 3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int trailing_slashes = 0; 3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch while (url.size() - trailing_slashes > 0 && 3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch url[url.size() - trailing_slashes - 1] == '/') { 3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch trailing_slashes++; 3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (trailing_slashes) 3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch url = url.substr(0, url.size() - trailing_slashes); 3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t slash_index = url.rfind('/'); 3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (slash_index != std::string::npos) 3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch url = url.substr(slash_index + 1); 3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t dot_index = url.rfind('.'); 3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (dot_index != std::string::npos) 3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch url = url.substr(0, dot_index); 3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch text = url; 3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return text; 3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetItemIndex() const { 3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int index = 0; 346a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch switch(GetRole()) { 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_ITEM: 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_BOX_OPTION: 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TREE_ITEM: 350a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch index = GetIndexInParent(); 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SLIDER: 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PROGRESS_INDICATOR: { 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float value_for_range; 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (GetFloatAttribute( 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_VALUE_FOR_RANGE, &value_for_range)) { 3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index = static_cast<int>(value_for_range); 3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return index; 3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetItemCount() const { 3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int count = 0; 367a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch switch(GetRole()) { 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST: 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_BOX: 3700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) count = PlatformChildCount(); 3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SLIDER: 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PROGRESS_INDICATOR: { 3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) float max_value_for_range; 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE, 3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &max_value_for_range)) { 3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) count = static_cast<int>(max_value_for_range); 3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return count; 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetScrollX() const { 3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_SCROLL_X, &value); 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetScrollY() const { 3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &value); 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetMaxScrollX() const { 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, &value); 400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetMaxScrollY() const { 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int value = 0; 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, &value); 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value; 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeFromIndex() const { 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t index = 0; 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (index < old_value_.length() && 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index < new_value_.length() && 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[index] == new_value_[index]) { 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) index++; 4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return index; 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeAddedCount() const { 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t old_len = old_value_.length(); 4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t new_len = new_value_.length(); 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t left = 0; 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (left < old_len && 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left < new_len && 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[left] == new_value_[left]) { 4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left++; 4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t right = 0; 4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (right < old_len && 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right < new_len && 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[old_len - right - 1] == new_value_[new_len - right - 1]) { 4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right++; 4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (new_len - left - right); 4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeRemovedCount() const { 4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t old_len = old_value_.length(); 4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t new_len = new_value_.length(); 4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t left = 0; 4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (left < old_len && 4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left < new_len && 4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[left] == new_value_[left]) { 4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) left++; 4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t right = 0; 4477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (right < old_len && 4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right < new_len && 4497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_[old_len - right - 1] == new_value_[new_len - right - 1]) { 4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) right++; 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (old_len - left - right); 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityAndroid::GetTextChangeBeforeText() const { 456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return old_value_; 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetSelectionStart() const { 460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int sel_start = 0; 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, &sel_start); 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return sel_start; 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetSelectionEnd() const { 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int sel_end = 0; 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &sel_end); 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return sel_end; 4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetEditableTextLength() const { 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return value().length(); 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidInputType() const { 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string html_tag = GetStringAttribute( 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_HTML_TAG); 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (html_tag != "input") 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_NULL; 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string type; 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!GetHtmlAttribute("type", &type)) 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT; 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (type == "" || type == "text" || type == "search") 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT; 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "date") 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE; 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "datetime" || type == "datetime-local") 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME; 491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "email") 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EMAIL; 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "month") 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE; 495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "number") 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER; 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "password") 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_PASSWORD; 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "tel") 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_PHONE; 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "time") 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME; 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "url") 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_URI; 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (type == "week") 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME; 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_TEXT_INPUTTYPE_TYPE_NULL; 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidLiveRegionType() const { 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string live = GetStringAttribute( 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_LIVE_STATUS); 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (live == "polite") 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_POLITE; 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else if (live == "assertive") 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_ASSERTIVE; 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_NONE; 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidRangeType() const { 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT; 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowCount() const { 526a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_GRID || 527a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TABLE) { 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return CountChildrenWithRole(ui::AX_ROLE_ROW); 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 531a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST || 532a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST_BOX || 533a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TREE) { 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return PlatformChildCount(); 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 0; 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnCount() const { 541a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_GRID || 542a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TABLE) { 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return CountChildrenWithRole(ui::AX_ROLE_COLUMN); 544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return 0; 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowIndex() const { 549a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST_ITEM || 550a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST_BOX_OPTION || 551a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TREE_ITEM) { 552a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return GetIndexInParent(); 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX); 556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowSpan() const { 5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN); 560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnIndex() const { 5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX); 564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnSpan() const { 5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN); 568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeMin() const { 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE); 572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeMax() const { 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE); 576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeCurrentValue() const { 5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE); 580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::HasFocusableChild() const { 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is called from PlatformIsLeaf, so don't call PlatformChildCount 584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // from within this! 585a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (uint32 i = 0; i < InternalChildCount(); i++) { 586a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* child = InternalGetChild(i); 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (child->HasState(ui::AX_STATE_FOCUSABLE)) 5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (static_cast<BrowserAccessibilityAndroid*>(child)->HasFocusableChild()) 5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 5917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::HasOnlyStaticTextChildren() const { 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is called from PlatformIsLeaf, so don't call PlatformChildCount 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // from within this! 598a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (uint32 i = 0; i < InternalChildCount(); i++) { 599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* child = InternalGetChild(i); 600a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (child->GetRole() != ui::AX_ROLE_STATIC_TEXT) 6017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 6027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsIframe() const { 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 html_tag = GetString16Attribute( 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_HTML_TAG); 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return html_tag == base::ASCIIToUTF16("iframe"); 6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserAccessibilityAndroid::OnDataChanged() { 6130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility::OnDataChanged(); 6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsEditableText()) { 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (base::UTF8ToUTF16(value()) != new_value_) { 6177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) old_value_ = new_value_; 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new_value_ = base::UTF8ToUTF16(value()); 6197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 622a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_ALERT && first_time_) 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager()->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, this); 6247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 live; 6263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetString16Attribute( 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CONTAINER_LIVE_STATUS, &live)) { 6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NotifyLiveRegionUpdate(live); 6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) first_time_ = false; 6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BrowserAccessibilityAndroid::NotifyLiveRegionUpdate( 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16& aria_live) { 6367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!EqualsASCII(aria_live, aria_strings::kAriaLivePolite) && 6377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) !EqualsASCII(aria_live, aria_strings::kAriaLiveAssertive)) 6387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 6397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = GetText(); 6417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (cached_text_ != text) { 6427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!text.empty()) { 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager()->NotifyAccessibilityEvent(ui::AX_EVENT_SHOW, 6447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) this); 6457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cached_text_ = text; 6477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 6487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int BrowserAccessibilityAndroid::CountChildrenWithRole(ui::AXRole role) const { 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int count = 0; 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (uint32 i = 0; i < PlatformChildCount(); i++) { 653a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (PlatformGetChild(i)->GetRole() == role) 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) count++; 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return count; 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace content 660