Chromium Code Reviews| Index: content/browser/accessibility/browser_accessibility_win.cc |
| diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc |
| index 7be2664a02702c296276d210fcf0a0a2615275c4..77098368a0e61f64493b0962e057c6fa43f295f2 100644 |
| --- a/content/browser/accessibility/browser_accessibility_win.cc |
| +++ b/content/browser/accessibility/browser_accessibility_win.cc |
| @@ -1604,7 +1604,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { |
| role_ == WebAccessibility::ROLE_TEXTAREA) { |
| *n_characters = value_.length(); |
| } else { |
| - *n_characters = name_.length(); |
| + *n_characters = hypertext_.length(); |
|
dmazzoni
2011/10/28 17:33:53
Can this method use TextForIAccessibleText instead
David Tseng
2011/10/28 18:25:15
Done.
|
| } |
| return S_OK; |
| @@ -1849,6 +1849,51 @@ STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint( |
| } |
| // |
| +// IAccessibleHypertext methods. |
| +// |
| + |
| +STDMETHODIMP BrowserAccessibilityWin::get_nHyperlinks(long* hyperlink_count) { |
| + if (!instance_active_) |
| + return E_FAIL; |
| + |
| + *hyperlink_count = hyperlink_offset_to_index_.size(); |
|
dmazzoni
2011/10/28 17:33:53
Need to check all pointer arguments and return E_I
David Tseng
2011/10/28 18:25:15
Done.
|
| + return S_OK; |
| +} |
| + |
| +STDMETHODIMP BrowserAccessibilityWin::get_hyperlink( |
| + long index, |
| + IAccessibleHyperlink** hyperlink) { |
| + if (!instance_active_) |
| + return E_FAIL; |
| + |
| + if (index < 0 || index >= static_cast<long>(children().size()) || !hyperlink) |
|
dmazzoni
2011/10/28 17:33:53
You only have an embedded object character for non
David Tseng
2011/10/28 18:25:15
The documentation states that clients are supposed
dmazzoni
2011/11/01 05:08:34
Clients can also call nHyperlinks and iterate over
|
| + return E_INVALIDARG; |
| + |
| + *hyperlink = static_cast<IAccessibleHyperlink*>( |
| + children_[index]->toBrowserAccessibilityWin()->NewReference()); |
| + return S_OK; |
| +} |
| + |
| +STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex(long char_index, |
| + long* hyperlink_index) { |
| + *hyperlink_index = -1; |
| + |
| + if (!instance_active_) |
| + return E_FAIL; |
| + |
| + if (char_index < 0 || char_index >= static_cast<long>(hypertext_.size())) |
| + return E_INVALIDARG; |
| + |
| + std::map<int32, int32>::iterator it = |
| + hyperlink_offset_to_index_.find(char_index); |
| + if (it == hyperlink_offset_to_index_.end()) |
| + return E_FAIL; |
| + |
| + *hyperlink_index = it->second; |
| + return S_OK; |
| +} |
| + |
| +// |
| // IAccessibleValue methods. |
| // |
| @@ -2242,6 +2287,9 @@ STDMETHODIMP BrowserAccessibilityWin::QueryService( |
| if (guidService == IID_IAccessible || |
| guidService == IID_IAccessible2 || |
| + guidService == IID_IAccessibleAction || |
| + guidService == IID_IAccessibleHyperlink || |
| + guidService == IID_IAccessibleHypertext || |
| guidService == IID_IAccessibleImage || |
| guidService == IID_IAccessibleTable || |
| guidService == IID_IAccessibleTable2 || |
| @@ -2268,12 +2316,7 @@ HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface( |
| const _ATL_INTMAP_ENTRY* entries, |
| REFIID iid, |
| void** object) { |
| - if (iid == IID_IAccessibleText) { |
| - if (ia_role_ != ROLE_SYSTEM_LINK && ia_role_ != ROLE_SYSTEM_TEXT) { |
| - *object = NULL; |
| - return E_NOINTERFACE; |
| - } |
| - } else if (iid == IID_IAccessibleImage) { |
| + if (iid == IID_IAccessibleImage) { |
| if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { |
| *object = NULL; |
| return E_NOINTERFACE; |
| @@ -2417,6 +2460,19 @@ void BrowserAccessibilityWin::Initialize() { |
| relation->AddTarget(title_elem_id); |
| relations_.push_back(relation); |
| } |
| + |
| + // Construct the hypertext for this node. |
| + hyperlink_offset_to_index_.clear(); |
| + hypertext_.clear(); |
| + for (unsigned int i = 0; i < children().size(); ++i) { |
| + BrowserAccessibility* child = children()[i]; |
| + if (child->role() == WebAccessibility::ROLE_STATIC_TEXT) { |
| + hypertext_ += child->name(); |
| + } else { |
| + hyperlink_offset_to_index_[hypertext_.size()] = i; |
| + hypertext_ += L"\xfffc"; |
|
dmazzoni
2011/10/28 17:33:53
Define a constant for this
David Tseng
2011/10/28 18:25:15
Done.
|
| + } |
| + } |
| } |
| void BrowserAccessibilityWin::SendNodeUpdateEvents() { |
| @@ -2516,8 +2572,10 @@ string16 BrowserAccessibilityWin::Escape(const string16& str) { |
| const string16& BrowserAccessibilityWin::TextForIAccessibleText() { |
| if (IsEditableText()) { |
| return value_; |
| - } else { |
| + } else if (role_ == WebAccessibility::ROLE_STATIC_TEXT) { |
| return name_; |
| + } else { |
| + return hypertext_; |
| } |
| } |