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 175ddfa6ff585c4db60cea4ed50feb24d4c3ed39..0ee584e861790897901a6d4783229753f7c6ff7e 100644 |
| --- a/content/browser/accessibility/browser_accessibility_win.cc |
| +++ b/content/browser/accessibility/browser_accessibility_win.cc |
| @@ -456,18 +456,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_accHelp(VARIANT var_id, BSTR* help) { |
| if (!help) |
| return E_INVALIDARG; |
| - BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); |
| - if (!target) |
| - return E_INVALIDARG; |
| - |
| - base::string16 help_str = target->help(); |
| - if (help_str.empty()) |
| - return S_FALSE; |
| - |
| - *help = SysAllocString(help_str.c_str()); |
| - |
| - DCHECK(*help); |
| - return S_OK; |
| + return S_FALSE; |
| } |
| STDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id, |
| @@ -498,19 +487,6 @@ STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) { |
| return E_INVALIDARG; |
| base::string16 name_str = target->name(); |
| - |
| - // If the name is empty, see if it's labeled by another element. |
| - if (name_str.empty()) { |
| - int title_elem_id; |
| - if (target->GetIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT, |
| - &title_elem_id)) { |
| - BrowserAccessibilityWin* title_elem = |
| - manager()->GetFromID(title_elem_id)->ToBrowserAccessibilityWin(); |
| - if (title_elem) |
| - name_str = title_elem->GetNameRecursive(); |
| - } |
| - } |
| - |
| if (name_str.empty()) |
| return S_FALSE; |
| @@ -2145,6 +2121,7 @@ STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset, |
| base::string16 substr = text_str.substr(start_offset, |
| end_offset - start_offset); |
| + |
| if (substr.empty()) |
| return S_FALSE; |
| @@ -3404,71 +3381,10 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() { |
| } |
| } |
| - // The calculation of the accessible name of an element has been |
| - // standardized in the HTML to Platform Accessibility APIs Implementation |
| - // Guide (http://www.w3.org/TR/html-aapi/). In order to return the |
| - // appropriate accessible name on Windows, we need to apply some logic |
| - // to the fields we get from WebKit. |
| - // |
| - // TODO(dmazzoni): move most of this logic into WebKit. |
| - // |
| - // WebKit gives us: |
| - // |
| - // name: the default name, e.g. inner text |
| - // title ui element: a reference to a <label> element on the same |
| - // page that labels this node. |
| - // description: accessible labels that override the default name: |
| - // aria-label or aria-labelledby or aria-describedby |
| - // help: the value of the "title" attribute |
| - // |
| - // On Windows, the logic we apply lets some fields take precedence and |
| - // always returns the primary name in "name" and the secondary name, |
| - // if any, in "description". |
| - |
| - int title_elem_id = GetIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT); |
| - base::string16 name = GetString16Attribute(ui::AX_ATTR_NAME); |
| - base::string16 description = GetString16Attribute(ui::AX_ATTR_DESCRIPTION); |
| - base::string16 help = GetString16Attribute(ui::AX_ATTR_HELP); |
| - base::string16 value = GetString16Attribute(ui::AX_ATTR_VALUE); |
| + win_attributes_->name = GetString16Attribute(ui::AX_ATTR_NAME); |
| + win_attributes_->description = GetString16Attribute(ui::AX_ATTR_DESCRIPTION); |
| - // WebKit annoyingly puts the title in the description if there's no other |
| - // description, which just confuses the rest of the logic. Put it back. |
| - // Now "help" is always the value of the "title" attribute, if present. |
| - base::string16 title_attr; |
| - if (GetHtmlAttribute("title", &title_attr) && |
| - description == title_attr && |
| - help.empty()) { |
| - help = description; |
| - description.clear(); |
| - } |
| - |
| - // Now implement the main logic: the descripion should become the name if |
|
aboxhall
2015/11/13 23:13:48
This is so great.
dmazzoni
2015/11/16 18:52:04
Yay for deleted code!
|
| - // it's nonempty, and the help should become the description if |
| - // there's no description - or the name if there's no name or description. |
| - if (!description.empty()) { |
| - name = description; |
| - description.clear(); |
| - } |
| - if (!help.empty() && description.empty()) { |
| - description = help; |
| - help.clear(); |
| - } |
| - if (!description.empty() && name.empty() && !title_elem_id) { |
| - name = description; |
| - description.clear(); |
| - } |
| - |
| - // If it's a text field, also consider the placeholder. |
| - base::string16 placeholder; |
| - if (GetRole() == ui::AX_ROLE_TEXT_FIELD && |
| - HasState(ui::AX_STATE_FOCUSABLE) && |
| - GetHtmlAttribute("placeholder", &placeholder)) { |
| - if (name.empty() && !title_elem_id) { |
| - name = placeholder; |
| - } else if (description.empty()) { |
| - description = placeholder; |
| - } |
| - } |
| + base::string16 value = GetString16Attribute(ui::AX_ATTR_VALUE); |
| // On Windows, the value of a document should be its url. |
| if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || |
| @@ -3476,26 +3392,11 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() { |
| value = base::UTF8ToUTF16(manager()->GetTreeData().url); |
| } |
| - // For certain roles (listbox option, static text, and list marker) |
| - // WebKit stores the main accessible text in the "value" - swap it so |
| - // that it's the "name". |
| - if (name.empty() && |
| - (GetRole() == ui::AX_ROLE_STATIC_TEXT || |
| - GetRole() == ui::AX_ROLE_LIST_MARKER || |
| - IsListBoxOptionOrMenuListOption())) { |
| - base::string16 tmp = value; |
| - value = name; |
| - name = tmp; |
| - } |
| - |
| // If this doesn't have a value and is linked then set its value to the url |
| // attribute. This allows screen readers to read an empty link's destination. |
| if (value.empty() && (ia_state() & STATE_SYSTEM_LINKED)) |
| value = GetString16Attribute(ui::AX_ATTR_URL); |
| - win_attributes_->name = name; |
| - win_attributes_->description = description; |
| - win_attributes_->help = help; |
| win_attributes_->value = value; |
| // Clear any old relationships between this node and other nodes. |
| @@ -3504,17 +3405,10 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() { |
| relations_.clear(); |
| // Handle title UI element. |
| - if (title_elem_id) { |
| - // Add a labelled by relationship. |
| - CComObject<BrowserAccessibilityRelation>* relation; |
| - HRESULT hr = CComObject<BrowserAccessibilityRelation>::CreateInstance( |
| - &relation); |
| - DCHECK(SUCCEEDED(hr)); |
| - relation->AddRef(); |
| - relation->Initialize(this, IA2_RELATION_LABELLED_BY); |
| - relation->AddTarget(title_elem_id); |
| - relations_.push_back(relation); |
| - } |
| + AddRelations(ui::AX_ATTR_CONTROLS_IDS, IA2_RELATION_CONTROLLER_FOR); |
| + AddRelations(ui::AX_ATTR_DESCRIBEDBY_IDS, IA2_RELATION_DESCRIBED_BY); |
| + AddRelations(ui::AX_ATTR_FLOWTO_IDS, IA2_RELATION_FLOWS_TO); |
| + AddRelations(ui::AX_ATTR_LABELLEDBY_IDS, IA2_RELATION_LABELLED_BY); |
| UpdateRequiredAttributes(); |
| // If this is a web area for a presentational iframe, give it a role of |
| @@ -3581,8 +3475,6 @@ void BrowserAccessibilityWin::UpdateStep3FireEvents(bool is_subtree_creation) { |
| manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_NAMECHANGE, this); |
| if (description() != old_win_attributes_->description) |
| manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_DESCRIPTIONCHANGE, this); |
| - if (help() != old_win_attributes_->help) |
| - manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_HELPCHANGE, this); |
| if (value() != old_win_attributes_->value) |
| manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_VALUECHANGE, this); |
| if (ia_state() != old_win_attributes_->ia_state) |
| @@ -4230,6 +4122,25 @@ void BrowserAccessibilityWin::UpdateRequiredAttributes() { |
| } |
| } |
| +void BrowserAccessibilityWin::AddRelations( |
| + ui::AXIntListAttribute src_attr, |
| + const base::string16& iaccessiblerelation_type) { |
| + if (!HasIntListAttribute(src_attr)) |
| + return; |
| + |
| + const std::vector<int32>& ids = GetIntListAttribute(src_attr); |
| + for (size_t i = 0; i < ids.size(); ++i) { |
| + CComObject<BrowserAccessibilityRelation>* relation; |
| + HRESULT hr = CComObject<BrowserAccessibilityRelation>::CreateInstance( |
| + &relation); |
| + DCHECK(SUCCEEDED(hr)); |
| + relation->AddRef(); |
| + relation->Initialize(this, iaccessiblerelation_type); |
| + relation->AddTarget(ids[i]); |
| + relations_.push_back(relation); |
| + } |
| +} |
| + |
| void BrowserAccessibilityWin::InitRoleAndState() { |
| int32 ia_role = 0; |
| int32 ia_state = 0; |