Index: content/browser/accessibility/browser_accessibility_manager_android.cc |
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc |
index 4a772dd885885f2e2df792d62e186d2d35a3b874..828c3c09de792ec5a5bb65eed1891b6337a03796 100644 |
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc |
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc |
@@ -56,20 +56,9 @@ bool SectionPredicate( |
bool AllInterestingNodesPredicate( |
BrowserAccessibility* start, BrowserAccessibility* node) { |
- // Focusable nodes should never be skipped. Note that IsFocusable() |
- // already skips over things like iframes and child frames that are |
- // technically focusable but shouldn't be exposed as focusable on Android. |
BrowserAccessibilityAndroid* android_node = |
static_cast<BrowserAccessibilityAndroid*>(node); |
- if (android_node->IsFocusable()) |
- return true; |
- |
- // If it's not focusable but has a control role, then it's interesting. |
- if (android_node->IsControl()) |
- return true; |
- |
- // Otherwise, the interesting nodes are leaf nodes with text. |
- return node->PlatformIsLeaf() && !node->GetText().empty(); |
+ return android_node->IsInterestingOnAndroid(); |
} |
void AddToPredicateMap(const char* search_key_ascii, |
@@ -710,19 +699,30 @@ void BrowserAccessibilityManagerAndroid::HandleHoverEvent( |
if (obj.is_null()) |
return; |
- BrowserAccessibilityAndroid* ancestor = |
- static_cast<BrowserAccessibilityAndroid*>(node->GetParent()); |
- while (ancestor && ancestor != GetRoot()) { |
- if (ancestor->PlatformIsLeaf() || |
- (ancestor->IsFocusable() && !ancestor->HasFocusableChild())) { |
- node = ancestor; |
- // Don't break - we want the highest ancestor that's focusable or a |
- // leaf node. |
- } |
- ancestor = static_cast<BrowserAccessibilityAndroid*>(ancestor->GetParent()); |
+ // First walk up to the nearest platform node, in case this node isn't |
+ // even exposed on the platform. |
+ node = node->GetClosestPlatformObject(); |
+ |
+ // If this node is uninteresting and just a wrapper around a sole |
+ // interesting descendant, prefer that descendant instead. |
+ const BrowserAccessibilityAndroid* android_node = |
+ static_cast<BrowserAccessibilityAndroid*>(node); |
+ const BrowserAccessibilityAndroid* sole_interesting_node = |
+ android_node->GetSoleInterestingNodeFromSubtree(); |
+ if (sole_interesting_node) |
+ android_node = sole_interesting_node; |
+ |
+ // Finally, if this node is still uninteresting, try to walk up to |
+ // find an interesting parent. |
+ while (android_node && !android_node->IsInterestingOnAndroid()) { |
+ android_node = static_cast<BrowserAccessibilityAndroid*>( |
+ android_node->GetParent()); |
} |
- Java_BrowserAccessibilityManager_handleHover(env, obj, node->unique_id()); |
+ if (android_node) { |
+ Java_BrowserAccessibilityManager_handleHover( |
+ env, obj, android_node->unique_id()); |
+ } |
} |
jint BrowserAccessibilityManagerAndroid::FindElementType( |