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