summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/accessibility/browser_accessibility.cc18
-rw-r--r--content/browser/accessibility/browser_accessibility.h5
-rw-r--r--content/browser/accessibility/browser_accessibility_cocoa.mm20
-rw-r--r--content/browser/accessibility/browser_accessibility_manager.cc20
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) {