| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/accessibility/browser_accessibility_android.h" | 5 #include "content/browser/accessibility/browser_accessibility_android.h" |
| 6 | 6 |
| 7 #include "base/i18n/break_iterator.h" | 7 #include "base/i18n/break_iterator.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 if (BrowserAccessibility::PlatformIsLeaf()) | 98 if (BrowserAccessibility::PlatformIsLeaf()) |
| 99 return true; | 99 return true; |
| 100 | 100 |
| 101 // Iframes are always allowed to contain children. | 101 // Iframes are always allowed to contain children. |
| 102 if (IsIframe() || | 102 if (IsIframe() || |
| 103 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || | 103 GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || |
| 104 GetRole() == ui::AX_ROLE_WEB_AREA) { | 104 GetRole() == ui::AX_ROLE_WEB_AREA) { |
| 105 return false; | 105 return false; |
| 106 } | 106 } |
| 107 | 107 |
| 108 // If it has a focusable child, we definitely can't leave out children. | |
| 109 if (HasFocusableChild()) | |
| 110 return false; | |
| 111 | |
| 112 // Date and time controls should drop their children. | 108 // Date and time controls should drop their children. |
| 113 switch (GetRole()) { | 109 switch (GetRole()) { |
| 114 case ui::AX_ROLE_DATE: | 110 case ui::AX_ROLE_DATE: |
| 115 case ui::AX_ROLE_DATE_TIME: | 111 case ui::AX_ROLE_DATE_TIME: |
| 116 case ui::AX_ROLE_INPUT_TIME: | 112 case ui::AX_ROLE_INPUT_TIME: |
| 117 return true; | 113 return true; |
| 118 default: | 114 default: |
| 119 break; | 115 break; |
| 120 } | 116 } |
| 121 | 117 |
| 118 // If it has a focusable child, we definitely can't leave out children. |
| 119 if (HasFocusableNonOptionChild()) |
| 120 return false; |
| 121 |
| 122 BrowserAccessibilityManagerAndroid* manager_android = | 122 BrowserAccessibilityManagerAndroid* manager_android = |
| 123 static_cast<BrowserAccessibilityManagerAndroid*>(manager()); | 123 static_cast<BrowserAccessibilityManagerAndroid*>(manager()); |
| 124 if (manager_android->prune_tree_for_screen_reader()) { | 124 if (manager_android->prune_tree_for_screen_reader()) { |
| 125 // Headings with text can drop their children. | 125 // Headings with text can drop their children. |
| 126 base::string16 name = GetText(); | 126 base::string16 name = GetText(); |
| 127 if (GetRole() == ui::AX_ROLE_HEADING && !name.empty()) | 127 if (GetRole() == ui::AX_ROLE_HEADING && !name.empty()) |
| 128 return true; | 128 return true; |
| 129 | 129 |
| 130 // Focusable nodes with text can drop their children. | 130 // Focusable nodes with text can drop their children. |
| 131 if (HasState(ui::AX_STATE_FOCUSABLE) && !name.empty()) | 131 if (HasState(ui::AX_STATE_FOCUSABLE) && !name.empty()) |
| (...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1325 return; | 1325 return; |
| 1326 while (iter.Advance()) { | 1326 while (iter.Advance()) { |
| 1327 if (iter.IsWord()) { | 1327 if (iter.IsWord()) { |
| 1328 word_starts->push_back(iter.prev()); | 1328 word_starts->push_back(iter.prev()); |
| 1329 word_ends->push_back(iter.pos()); | 1329 word_ends->push_back(iter.pos()); |
| 1330 } | 1330 } |
| 1331 } | 1331 } |
| 1332 } | 1332 } |
| 1333 } | 1333 } |
| 1334 | 1334 |
| 1335 bool BrowserAccessibilityAndroid::HasFocusableChild() const { | 1335 bool BrowserAccessibilityAndroid::HasFocusableNonOptionChild() const { |
| 1336 // This is called from PlatformIsLeaf, so don't call PlatformChildCount | 1336 // This is called from PlatformIsLeaf, so don't call PlatformChildCount |
| 1337 // from within this! | 1337 // from within this! |
| 1338 for (uint32_t i = 0; i < InternalChildCount(); i++) { | 1338 for (uint32_t i = 0; i < InternalChildCount(); i++) { |
| 1339 BrowserAccessibility* child = InternalGetChild(i); | 1339 BrowserAccessibility* child = InternalGetChild(i); |
| 1340 if (child->HasState(ui::AX_STATE_FOCUSABLE)) | 1340 if (child->HasState(ui::AX_STATE_FOCUSABLE) && |
| 1341 child->GetRole() != ui::AX_ROLE_MENU_LIST_OPTION) |
| 1341 return true; | 1342 return true; |
| 1342 if (static_cast<BrowserAccessibilityAndroid*>(child)->HasFocusableChild()) | 1343 if (static_cast<BrowserAccessibilityAndroid*>(child) |
| 1344 ->HasFocusableNonOptionChild()) |
| 1343 return true; | 1345 return true; |
| 1344 } | 1346 } |
| 1345 return false; | 1347 return false; |
| 1346 } | 1348 } |
| 1347 | 1349 |
| 1348 bool BrowserAccessibilityAndroid::HasNonEmptyValue() const { | 1350 bool BrowserAccessibilityAndroid::HasNonEmptyValue() const { |
| 1349 return IsEditableText() && !GetValue().empty(); | 1351 return IsEditableText() && !GetValue().empty(); |
| 1350 } | 1352 } |
| 1351 | 1353 |
| 1352 bool BrowserAccessibilityAndroid::HasOnlyTextChildren() const { | 1354 bool BrowserAccessibilityAndroid::HasOnlyTextChildren() const { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1426 int BrowserAccessibilityAndroid::CountChildrenWithRole(ui::AXRole role) const { | 1428 int BrowserAccessibilityAndroid::CountChildrenWithRole(ui::AXRole role) const { |
| 1427 int count = 0; | 1429 int count = 0; |
| 1428 for (uint32_t i = 0; i < PlatformChildCount(); i++) { | 1430 for (uint32_t i = 0; i < PlatformChildCount(); i++) { |
| 1429 if (PlatformGetChild(i)->GetRole() == role) | 1431 if (PlatformGetChild(i)->GetRole() == role) |
| 1430 count++; | 1432 count++; |
| 1431 } | 1433 } |
| 1432 return count; | 1434 return count; |
| 1433 } | 1435 } |
| 1434 | 1436 |
| 1435 } // namespace content | 1437 } // namespace content |
| OLD | NEW |