diff options
4 files changed, 55 insertions, 8 deletions
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 0a3719d..8cc30d13 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc @@ -184,7 +184,7 @@ gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const { // Walk up the parent chain. Every time we encounter a Web Area, offset // based on the scroll bars and then offset based on the origin of that // nested web area. - BrowserAccessibility* parent = GetParent(); + BrowserAccessibility* parent = GetParentForBoundsCalculation(); bool need_to_offset_web_area = (GetRole() == ui::AX_ROLE_WEB_AREA || GetRole() == ui::AX_ROLE_ROOT_WEB_AREA); @@ -213,7 +213,7 @@ gfx::Rect BrowserAccessibility::GetLocalBoundsRect() const { } need_to_offset_web_area = true; } - parent = parent->GetParent(); + parent = parent->GetParentForBoundsCalculation(); } return bounds; @@ -723,4 +723,18 @@ int BrowserAccessibility::GetStaticTextLenRecursive() const { return len; } +BrowserAccessibility* BrowserAccessibility::GetParentForBoundsCalculation() + const { + if (!node_ || !manager_) + return NULL; + ui::AXNode* parent = node_->parent(); + if (parent) + return manager_->GetFromAXNode(parent); + + if (!manager_->delegate()) + return NULL; + + return manager_->delegate()->AccessibilityGetParentFrame(); +} + } // namespace content diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index e399b86..37f2fe0 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h @@ -267,6 +267,11 @@ class CONTENT_EXPORT BrowserAccessibility { // including this object if it's static text. int GetStaticTextLenRecursive() const; + // Similar to GetParent(), but includes nodes that are the host of a + // subtree rather than skipping over them - because they contain important + // bounds offsets. + BrowserAccessibility* GetParentForBoundsCalculation() const; + std::string name_; std::string value_; diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index 1b72065..0c50cc6 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm @@ -25,6 +25,7 @@ extern "C" void NSAccessibilityUnregisterUniqueIdForUIElement(id element); using ui::AXNodeData; using content::BrowserAccessibility; +using content::BrowserAccessibilityDelegate; using content::BrowserAccessibilityManager; using content::BrowserAccessibilityManagerMac; using content::ContentClient; @@ -534,9 +535,22 @@ NSDictionary* attributeToMethodNameMap = nil; if (!browserAccessibility_) return NSZeroPoint; - gfx::Rect bounds(origin.x, origin.y, size.width, size.height); - gfx::Point point = [self delegate]->AccessibilityOriginInScreen(bounds); - return NSMakePoint(point.x(), point.y()); + // Get the delegate for the topmost BrowserAccessibilityManager, because + // that's the only one that can convert points to their origin in the screen. + BrowserAccessibilityManager* manager = browserAccessibility_->manager(); + BrowserAccessibility* root = manager->GetRoot(); + while (root->GetParent()) + root = root->GetParent()->manager()->GetRoot(); + manager = root->manager(); + BrowserAccessibilityDelegate* delegate = manager->delegate(); + + if (delegate) { + gfx::Rect bounds(origin.x, origin.y, size.width, size.height); + gfx::Point point = delegate->AccessibilityOriginInScreen(bounds); + return NSMakePoint(point.x(), point.y()); + } else { + return NSZeroPoint; + } } // Returns a string indicating the NSAccessibility role of this object. diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 1e368c6..0bc4260 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) { |