browser_accessibility_android.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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)
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool BrowserAccessibilityAndroid::PlatformIsLeaf() const {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (child_count() == 0)
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Iframes are always allowed to contain children.
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (IsIframe() ||
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_ROOT_WEB_AREA ||
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_WEB_AREA) {
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // If it has a focusable child, we definitely can't leave out children.
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (HasFocusableChild())
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Headings with text can drop their children.
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 name = GetText();
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (role() == ui::AX_ROLE_HEADING && !name.empty())
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Focusable nodes with text can drop their children.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (HasState(ui::AX_STATE_FOCUSABLE) && !name.empty())
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Nodes with only static text as children can drop their children.
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (HasOnlyStaticTextChildren())
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return BrowserAccessibility::PlatformIsLeaf();
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsCheckable() const {
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool checkable = false;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_aria_pressed_defined;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool is_mixed;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed);
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (role() == ui::AX_ROLE_CHECK_BOX ||
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_RADIO_BUTTON ||
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      is_aria_pressed_defined) {
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    checkable = true;
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (HasState(ui::AX_STATE_CHECKED))
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    checkable = true;
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return checkable;
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsChecked() const {
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return HasState(ui::AX_STATE_CHECKED);
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsClickable() const {
1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return (PlatformIsLeaf() && !GetText().empty());
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsCollection() const {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (role() == ui::AX_ROLE_GRID ||
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_LIST ||
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_LIST_BOX ||
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_TABLE ||
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_TREE);
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsCollectionItem() const {
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (role() == ui::AX_ROLE_CELL ||
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_COLUMN_HEADER ||
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_DESCRIPTION_LIST_TERM ||
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_LIST_BOX_OPTION ||
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_LIST_ITEM ||
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_ROW_HEADER ||
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_TREE_ITEM);
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsContentInvalid() const {
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string invalid;
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return GetHtmlAttribute("aria-invalid", &invalid);
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsDismissable() const {
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return false;  // No concept of "dismissable" on the web currently.
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsEnabled() const {
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return HasState(ui::AX_STATE_ENABLED);
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsFocusable() const {
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool focusable = HasState(ui::AX_STATE_FOCUSABLE);
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (IsIframe() ||
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_WEB_AREA) {
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    focusable = false;
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return focusable;
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsFocused() const {
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return manager()->GetFocus(manager()->GetRoot()) == this;
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsHeading() const {
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (role() == ui::AX_ROLE_COLUMN_HEADER ||
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_HEADING ||
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_ROW_HEADER);
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsHierarchical() const {
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (role() == ui::AX_ROLE_LIST ||
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_TREE);
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsMultiLine() const {
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return role() == ui::AX_ROLE_TEXT_AREA;
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsPassword() const {
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return HasState(ui::AX_STATE_PROTECTED);
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsRangeType() const {
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (role() == ui::AX_ROLE_PROGRESS_INDICATOR ||
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_SCROLL_BAR ||
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          role() == ui::AX_ROLE_SLIDER);
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsScrollable() const {
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int dummy;
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, &dummy);
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsSelected() const {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return HasState(ui::AX_STATE_SELECTED);
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool BrowserAccessibilityAndroid::IsVisibleToUser() const {
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return !HasState(ui::AX_STATE_INVISIBLE);
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool BrowserAccessibilityAndroid::CanOpenPopup() const {
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return HasState(ui::AX_STATE_HASPOPUP);
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char* BrowserAccessibilityAndroid::GetClassName() const {
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const char* class_name = NULL;
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch(role()) {
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_EDITABLE_TEXT:
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_SPIN_BUTTON:
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_TEXT_AREA:
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_TEXT_FIELD:
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.EditText";
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_SLIDER:
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.SeekBar";
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_COMBO_BOX:
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.Spinner";
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_BUTTON:
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_MENU_BUTTON:
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_POP_UP_BUTTON:
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.Button";
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_CHECK_BOX:
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.CheckBox";
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_RADIO_BUTTON:
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.RadioButton";
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_TOGGLE_BUTTON:
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.ToggleButton";
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_CANVAS:
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_IMAGE:
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.Image";
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_PROGRESS_INDICATOR:
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.ProgressBar";
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_TAB_LIST:
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.TabWidget";
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_GRID:
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_TABLE:
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.GridView";
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_LIST:
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_LIST_BOX:
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.widget.ListView";
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_DIALOG:
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      class_name = "android.app.Dialog";
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    default:
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      class_name = "android.view.View";
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return class_name;
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityAndroid::GetText() const {
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (IsIframe() ||
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_WEB_AREA) {
260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 description = GetString16Attribute(
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::AX_ATTR_DESCRIPTION);
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 text;
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!name().empty())
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    text = base::UTF8ToUTF16(name());
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else if (!description.empty())
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    text = description;
270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else if (!value().empty())
2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    text = base::UTF8ToUTF16(value());
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This is called from PlatformIsLeaf, so don't call PlatformChildCount
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // from within this!
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (text.empty() && HasOnlyStaticTextChildren()) {
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (uint32 i = 0; i < child_count(); i++) {
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      BrowserAccessibility* child = children()[i];
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      text += static_cast<BrowserAccessibilityAndroid*>(child)->GetText();
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  switch(role()) {
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_IMAGE_MAP_LINK:
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_LINK:
285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (!text.empty())
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        text += base::ASCIIToUTF16(" ");
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      text += base::ASCIIToUTF16("Link");
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_HEADING:
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      // Only append "heading" if this node already has text.
291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (!text.empty())
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        text += base::ASCIIToUTF16(" Heading");
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      break;
294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return text;
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetItemIndex() const {
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int index = 0;
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch(role()) {
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_LIST_ITEM:
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_LIST_BOX_OPTION:
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_TREE_ITEM:
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      index = index_in_parent();
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_SLIDER:
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_PROGRESS_INDICATOR: {
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      float value_for_range;
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (GetFloatAttribute(
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              ui::AX_ATTR_VALUE_FOR_RANGE, &value_for_range)) {
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        index = static_cast<int>(value_for_range);
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return index;
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetItemCount() const {
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int count = 0;
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch(role()) {
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_LIST:
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_LIST_BOX:
3250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      count = PlatformChildCount();
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_SLIDER:
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ui::AX_ROLE_PROGRESS_INDICATOR: {
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      float max_value_for_range;
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (GetFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE,
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            &max_value_for_range)) {
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        count = static_cast<int>(max_value_for_range);
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return count;
3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetScrollX() const {
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int value = 0;
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetIntAttribute(ui::AX_ATTR_SCROLL_X, &value);
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return value;
3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetScrollY() const {
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int value = 0;
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &value);
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return value;
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetMaxScrollX() const {
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int value = 0;
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetIntAttribute(ui::AX_ATTR_SCROLL_X_MAX, &value);
355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return value;
3567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetMaxScrollY() const {
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int value = 0;
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetIntAttribute(ui::AX_ATTR_SCROLL_Y_MAX, &value);
361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return value;
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeFromIndex() const {
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t index = 0;
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  while (index < old_value_.length() &&
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         index < new_value_.length() &&
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         old_value_[index] == new_value_[index]) {
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    index++;
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return index;
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeAddedCount() const {
3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t old_len = old_value_.length();
3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t new_len = new_value_.length();
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t left = 0;
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  while (left < old_len &&
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         left < new_len &&
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         old_value_[left] == new_value_[left]) {
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    left++;
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t right = 0;
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  while (right < old_len &&
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         right < new_len &&
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         old_value_[old_len - right - 1] == new_value_[new_len - right - 1]) {
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    right++;
3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return (new_len - left - right);
3907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetTextChangeRemovedCount() const {
3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t old_len = old_value_.length();
3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t new_len = new_value_.length();
3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t left = 0;
3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  while (left < old_len &&
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         left < new_len &&
3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         old_value_[left] == new_value_[left]) {
3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    left++;
4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  size_t right = 0;
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  while (right < old_len &&
4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         right < new_len &&
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)         old_value_[old_len - right - 1] == new_value_[new_len - right - 1]) {
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    right++;
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return (old_len - left - right);
4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityAndroid::GetTextChangeBeforeText() const {
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return old_value_;
4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetSelectionStart() const {
415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int sel_start = 0;
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, &sel_start);
417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return sel_start;
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetSelectionEnd() const {
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int sel_end = 0;
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &sel_end);
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return sel_end;
4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint BrowserAccessibilityAndroid::GetEditableTextLength() const {
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return value().length();
4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidInputType() const {
431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string html_tag = GetStringAttribute(
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::AX_ATTR_HTML_TAG);
433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (html_tag != "input")
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_NULL;
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string type;
437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!GetHtmlAttribute("type", &type))
438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT;
439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (type == "" || type == "text" || type == "search")
441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT;
442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "date")
443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE;
444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "datetime" || type == "datetime-local")
445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME;
446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "email")
447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_EMAIL;
448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "month")
449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_DATE;
450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "number")
451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_NUMBER;
452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "password")
453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_WEB_PASSWORD;
454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "tel")
455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_PHONE;
456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "time")
457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME_TIME;
458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "url")
459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT_URI;
460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (type == "week")
461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_TEXT_INPUTTYPE_TYPE_DATETIME;
462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return ANDROID_TEXT_INPUTTYPE_TYPE_NULL;
464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidLiveRegionType() const {
467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string live = GetStringAttribute(
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::AX_ATTR_LIVE_STATUS);
469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (live == "polite")
470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_POLITE;
471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  else if (live == "assertive")
472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_ASSERTIVE;
473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return ANDROID_VIEW_VIEW_ACCESSIBILITY_LIVE_REGION_NONE;
474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::AndroidRangeType() const {
477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return ANDROID_VIEW_ACCESSIBILITY_RANGE_TYPE_FLOAT;
478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowCount() const {
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (role() == ui::AX_ROLE_GRID ||
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_TABLE) {
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return CountChildrenWithRole(ui::AX_ROLE_ROW);
484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (role() == ui::AX_ROLE_LIST ||
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_LIST_BOX ||
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_TREE) {
489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return PlatformChildCount();
490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return 0;
493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnCount() const {
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (role() == ui::AX_ROLE_GRID ||
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_TABLE) {
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return CountChildrenWithRole(ui::AX_ROLE_COLUMN);
499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return 0;
501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowIndex() const {
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (role() == ui::AX_ROLE_LIST_ITEM ||
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_LIST_BOX_OPTION ||
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      role() == ui::AX_ROLE_TREE_ITEM) {
507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return index_in_parent();
508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX);
511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::RowSpan() const {
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN);
515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnIndex() const {
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX);
519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int BrowserAccessibilityAndroid::ColumnSpan() const {
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN);
523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeMin() const {
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE);
527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeMax() const {
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE);
531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float BrowserAccessibilityAndroid::RangeCurrentValue() const {
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE);
535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::HasFocusableChild() const {
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This is called from PlatformIsLeaf, so don't call PlatformChildCount
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // from within this!
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (uint32 i = 0; i < child_count(); i++) {
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserAccessibility* child = children()[i];
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (child->HasState(ui::AX_STATE_FOCUSABLE))
5437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return true;
5447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (static_cast<BrowserAccessibilityAndroid*>(child)->HasFocusableChild())
5457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return true;
5467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
5477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return false;
5487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::HasOnlyStaticTextChildren() const {
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // This is called from PlatformIsLeaf, so don't call PlatformChildCount
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // from within this!
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (uint32 i = 0; i < child_count(); i++) {
554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BrowserAccessibility* child = children()[i];
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (child->role() != ui::AX_ROLE_STATIC_TEXT)
5567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return false;
5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return true;
5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool BrowserAccessibilityAndroid::IsIframe() const {
562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 html_tag = GetString16Attribute(
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::AX_ATTR_HTML_TAG);
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return html_tag == base::ASCIIToUTF16("iframe");
5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void BrowserAccessibilityAndroid::PostInitialize() {
5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BrowserAccessibility::PostInitialize();
5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (IsEditableText()) {
571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (base::UTF8ToUTF16(value()) != new_value_) {
5727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      old_value_ = new_value_;
573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new_value_ = base::UTF8ToUTF16(value());
5747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
5757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
5767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (role() == ui::AX_ROLE_ALERT && first_time_)
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    manager()->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, this);
5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 live;
5813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (GetString16Attribute(
5825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::AX_ATTR_CONTAINER_LIVE_STATUS, &live)) {
5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    NotifyLiveRegionUpdate(live);
5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
5857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  first_time_ = false;
5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BrowserAccessibilityAndroid::NotifyLiveRegionUpdate(
590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16& aria_live) {
5917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!EqualsASCII(aria_live, aria_strings::kAriaLivePolite) &&
5927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      !EqualsASCII(aria_live, aria_strings::kAriaLiveAssertive))
5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 text = GetText();
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (cached_text_ != text) {
5977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!text.empty()) {
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      manager()->NotifyAccessibilityEvent(ui::AX_EVENT_SHOW,
5997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         this);
6007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
6017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    cached_text_ = text;
6027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
6037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
6047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int BrowserAccessibilityAndroid::CountChildrenWithRole(ui::AXRole role) const {
606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int count = 0;
607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (uint32 i = 0; i < PlatformChildCount(); i++) {
608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (PlatformGetChild(i)->role() == role)
609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      count++;
610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return count;
612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
615