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