Index: content/browser/accessibility/browser_accessibility_manager.cc |
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc |
index 1e368c6f8d8e7cf6691f96c52c30713537b5d071..00295843e7cdb09c32b6f93042fb8e306bcd708c 100644 |
--- a/content/browser/accessibility/browser_accessibility_manager.cc |
+++ b/content/browser/accessibility/browser_accessibility_manager.cc |
@@ -290,10 +290,24 @@ BrowserAccessibility* BrowserAccessibilityManager::GetActiveDescendantFocus( |
BrowserAccessibility* BrowserAccessibilityManager::GetFocus( |
BrowserAccessibility* root) { |
- if (focus_ && (!root || focus_->IsDescendantOf(root->node()))) |
- return GetFromAXNode(focus_); |
+ if (!focus_) |
+ return NULL; |
- return NULL; |
+ if (root && !focus_->IsDescendantOf(root->node())) |
+ return NULL; |
+ |
+ if (!delegate()) |
+ return NULL; |
+ |
+ BrowserAccessibility* obj = GetFromAXNode(focus_); |
+ if (obj->HasBoolAttribute(ui::AX_ATTR_IS_AX_TREE_HOST)) { |
+ BrowserAccessibilityManager* child_manager = |
+ delegate()->AccessibilityGetChildFrame(obj->GetId()); |
+ if (child_manager) |
+ return child_manager->GetFocus(child_manager->GetRoot()); |
+ } |
+ |
+ return obj; |
} |
void BrowserAccessibilityManager::SetFocus(ui::AXNode* node, bool notify) { |
@@ -348,8 +362,9 @@ void BrowserAccessibilityManager::SetTextSelection( |
} |
gfx::Rect BrowserAccessibilityManager::GetViewBounds() { |
- if (delegate_) |
- return delegate_->AccessibilityGetViewBounds(); |
+ BrowserAccessibilityDelegate* delegate = GetDelegateFromRootManager(); |
+ if (delegate) |
+ return delegate->AccessibilityGetViewBounds(); |
return gfx::Rect(); |
} |
@@ -419,6 +434,14 @@ void BrowserAccessibilityManager::OnNodeChangeFinished(ui::AXNode* node) { |
GetFromAXNode(node)->OnUpdateFinished(); |
} |
+BrowserAccessibilityDelegate* |
+ BrowserAccessibilityManager::GetDelegateFromRootManager() { |
+ BrowserAccessibilityManager* manager = this; |
+ while (manager->GetRoot()->GetParent()) |
+ manager = manager->GetRoot()->GetParent()->manager(); |
+ return manager->delegate(); |
+} |
+ |
ui::AXTreeUpdate BrowserAccessibilityManager::SnapshotAXTreeForTesting() { |
scoped_ptr<ui::AXTreeSource<const ui::AXNode*> > tree_source( |
tree_->CreateTreeSource()); |