| 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 4e88ac09fceff405867d870dfe52a7b36cb87fb9..092a948ecd96a1a27d9d3389952be464a472917e 100644
|
| --- a/content/browser/accessibility/browser_accessibility_win.cc
|
| +++ b/content/browser/accessibility/browser_accessibility_win.cc
|
| @@ -27,6 +27,8 @@ const GUID GUID_ISimpleDOM = {
|
| 0x0c539790, 0x12e4, 0x11cf,
|
| 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8};
|
|
|
| +const char16 BrowserAccessibilityWin::kEmbeddedCharacter[] = L"\xfffc";
|
| +
|
| //
|
| // BrowserAccessibilityRelation
|
| //
|
| @@ -1752,13 +1754,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) {
|
| if (!n_characters)
|
| return E_INVALIDARG;
|
|
|
| - if (role_ == WebAccessibility::ROLE_TEXT_FIELD ||
|
| - role_ == WebAccessibility::ROLE_TEXTAREA) {
|
| - *n_characters = value_.length();
|
| - } else {
|
| - *n_characters = name_.length();
|
| - }
|
| -
|
| + *n_characters = TextForIAccessibleText().length();
|
| return S_OK;
|
| }
|
|
|
| @@ -2073,6 +2069,62 @@ STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index,
|
| }
|
|
|
| //
|
| +// IAccessibleHypertext methods.
|
| +//
|
| +
|
| +STDMETHODIMP BrowserAccessibilityWin::get_nHyperlinks(long* hyperlink_count) {
|
| + if (!instance_active_)
|
| + return E_FAIL;
|
| +
|
| + if (!hyperlink_count)
|
| + return E_INVALIDARG;
|
| +
|
| + *hyperlink_count = hyperlink_offset_to_index_.size();
|
| + return S_OK;
|
| +}
|
| +
|
| +STDMETHODIMP BrowserAccessibilityWin::get_hyperlink(
|
| + long index,
|
| + IAccessibleHyperlink** hyperlink) {
|
| + if (!instance_active_)
|
| + return E_FAIL;
|
| +
|
| + if (!hyperlink ||
|
| + index < 0 ||
|
| + index >= static_cast<long>(hyperlinks_.size())) {
|
| + return E_INVALIDARG;
|
| + }
|
| +
|
| + BrowserAccessibilityWin* child =
|
| + children_[hyperlinks_[index]]->toBrowserAccessibilityWin();
|
| + *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference());
|
| + return S_OK;
|
| +}
|
| +
|
| +STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex(
|
| + long char_index,
|
| + long* hyperlink_index) {
|
| + if (!instance_active_)
|
| + return E_FAIL;
|
| +
|
| + if (!hyperlink_index)
|
| + return E_INVALIDARG;
|
| +
|
| + *hyperlink_index = -1;
|
| +
|
| + 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.
|
| //
|
|
|
| @@ -2468,6 +2520,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 ||
|
| @@ -2494,12 +2549,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;
|
| @@ -2537,8 +2587,8 @@ HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface(
|
| //
|
|
|
| // Initialize this object and mark it as active.
|
| -void BrowserAccessibilityWin::Initialize() {
|
| - BrowserAccessibility::Initialize();
|
| +void BrowserAccessibilityWin::PreInitialize() {
|
| + BrowserAccessibility::PreInitialize();
|
|
|
| InitRoleAndState();
|
|
|
| @@ -2657,7 +2707,25 @@ void BrowserAccessibilityWin::Initialize() {
|
| }
|
| }
|
|
|
| -void BrowserAccessibilityWin::SendNodeUpdateEvents() {
|
| +void BrowserAccessibilityWin::PostInitialize() {
|
| + BrowserAccessibility::PostInitialize();
|
| +
|
| + // Construct the hypertext for this node.
|
| + hyperlink_offset_to_index_.clear();
|
| + hyperlinks_.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()] = hyperlinks_.size();
|
| + hypertext_ += kEmbeddedCharacter;
|
| + hyperlinks_.push_back(i);
|
| + }
|
| + }
|
| + DCHECK_EQ(hyperlink_offset_to_index_.size(), hyperlinks_.size());
|
| +
|
| // Fire an event when an alert first appears.
|
| if (role_ == WebAccessibility::ROLE_ALERT && first_time_)
|
| manager_->NotifyAccessibilityEvent(ViewHostMsg_AccEvent::ALERT, this);
|
| @@ -2788,8 +2856,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_;
|
| }
|
| }
|
|
|
|
|