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