Index: chrome/browser/accessibility/browser_accessibility_win.cc |
=================================================================== |
--- chrome/browser/accessibility/browser_accessibility_win.cc (revision 62773) |
+++ chrome/browser/accessibility/browser_accessibility_win.cc (working copy) |
@@ -53,15 +53,31 @@ |
return S_OK; |
} |
-STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left, LONG y_top, |
- VARIANT* child) { |
+STDMETHODIMP BrowserAccessibilityWin::accHitTest( |
+ LONG x_left, LONG y_top, VARIANT* child) { |
if (!instance_active_) |
return E_FAIL; |
if (!child) |
return E_INVALIDARG; |
- return E_NOTIMPL; |
+ gfx::Point point(x_left, y_top); |
+ if (!GetBoundsRect().Contains(point)) { |
+ // Return S_FALSE and VT_EMPTY when the outside the object's boundaries. |
+ child->vt = VT_EMPTY; |
+ return S_FALSE; |
+ } |
+ |
+ BrowserAccessibility* result = BrowserAccessibilityForPoint(point); |
+ if (result == this) { |
+ // Point is within this object. |
+ child->vt = VT_I4; |
+ child->lVal = CHILDID_SELF; |
+ } else { |
+ child->vt = VT_DISPATCH; |
+ child->pdispVal = result->toBrowserAccessibilityWin()->NewReference(); |
+ } |
+ return S_OK; |
} |
STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, LONG* y_top, |
@@ -77,17 +93,12 @@ |
if (!target) |
return E_INVALIDARG; |
- // Find the top left corner of the containing window in screen coords, and |
- // adjust the output position by this amount. |
- HWND parent_hwnd = manager_->GetParentView(); |
- POINT top_left = {0, 0}; |
- ::ClientToScreen(parent_hwnd, &top_left); |
+ gfx::Rect bounds = target->GetBoundsRect(); |
+ *x_left = bounds.x(); |
+ *y_top = bounds.y(); |
+ *width = bounds.width(); |
+ *height = bounds.height(); |
- *x_left = target->location_.x + top_left.x; |
- *y_top = target->location_.y + top_left.y; |
- *width = target->location_.width; |
- *height = target->location_.height; |
- |
return S_OK; |
} |
@@ -1156,22 +1167,6 @@ |
return manager_->GetFromChildID(child_id)->toBrowserAccessibilityWin(); |
} |
-bool BrowserAccessibilityWin::HasAttribute( |
- WebAccessibility::Attribute attribute) { |
- return (attributes_.find(attribute) != attributes_.end()); |
-} |
- |
-bool BrowserAccessibilityWin::GetAttribute( |
- WebAccessibility::Attribute attribute, string16* value) { |
- std::map<int32, string16>::iterator iter = attributes_.find(attribute); |
- if (iter != attributes_.end()) { |
- *value = iter->second; |
- return true; |
- } |
- |
- return false; |
-} |
- |
HRESULT BrowserAccessibilityWin::GetAttributeAsBstr( |
WebAccessibility::Attribute attribute, BSTR* value_bstr) { |
string16 str; |
@@ -1188,19 +1183,6 @@ |
return S_OK; |
} |
-bool BrowserAccessibilityWin::GetAttributeAsInt( |
- WebAccessibility::Attribute attribute, int* value_int) { |
- string16 value_str; |
- |
- if (!GetAttribute(attribute, &value_str)) |
- return false; |
- |
- if (!base::StringToInt(value_str, value_int)) |
- return false; |
- |
- return true; |
-} |
- |
string16 BrowserAccessibilityWin::Escape(string16 str) { |
return EscapeQueryParamValueUTF8(str, false); |
} |