| Index: content/browser/accessibility/browser_accessibility_com_win.cc
|
| diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc
|
| index cc3d12509d8b5ee75518ff1ed5d00d6e3ff7b1b7..16b9d8e054d4e588278b13579121d2f1d9b2a9aa 100644
|
| --- a/content/browser/accessibility/browser_accessibility_com_win.cc
|
| +++ b/content/browser/accessibility/browser_accessibility_com_win.cc
|
| @@ -766,6 +766,20 @@ STDMETHODIMP BrowserAccessibilityComWin::get_accState(VARIANT var_id,
|
| return S_OK;
|
| }
|
|
|
| +bool BrowserAccessibilityComWin::IsRangeValueSupported() {
|
| + switch (ia_role()) {
|
| + case ROLE_SYSTEM_PROGRESSBAR:
|
| + case ROLE_SYSTEM_SLIDER:
|
| + case ROLE_SYSTEM_SPINBUTTON:
|
| + case ROLE_SYSTEM_SCROLLBAR:
|
| + return true;
|
| + case ROLE_SYSTEM_SEPARATOR:
|
| + return owner()->HasState(ui::AX_STATE_FOCUSABLE);
|
| + default:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| STDMETHODIMP BrowserAccessibilityComWin::get_accValue(VARIANT var_id,
|
| BSTR* value) {
|
| WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_VALUE);
|
| @@ -779,10 +793,8 @@ STDMETHODIMP BrowserAccessibilityComWin::get_accValue(VARIANT var_id,
|
| if (!target)
|
| return E_INVALIDARG;
|
|
|
| - if (target->ia_role() == ROLE_SYSTEM_PROGRESSBAR ||
|
| - target->ia_role() == ROLE_SYSTEM_SCROLLBAR ||
|
| - target->ia_role() == ROLE_SYSTEM_SLIDER) {
|
| - base::string16 value_text = target->GetValueText();
|
| + if (target->IsRangeValueSupported()) {
|
| + base::string16 value_text = target->GetRangeValueText();
|
| *value = SysAllocString(value_text.c_str());
|
| DCHECK(*value);
|
| return S_OK;
|
| @@ -3571,7 +3583,7 @@ STDMETHODIMP BrowserAccessibilityComWin::GetPatternProvider(
|
| if (id == UIA_ValuePatternId || id == UIA_TextPatternId) {
|
| if (owner()->HasState(ui::AX_STATE_EDITABLE)) {
|
| DVLOG(1) << "Returning UIA text provider";
|
| - base::win::UIATextProvider::CreateTextProvider(GetValueText(), true,
|
| + base::win::UIATextProvider::CreateTextProvider(GetRangeValueText(), true,
|
| provider);
|
| return S_OK;
|
| }
|
| @@ -3640,8 +3652,7 @@ HRESULT WINAPI BrowserAccessibilityComWin::InternalQueryInterface(
|
| return E_NOINTERFACE;
|
| }
|
| } else if (iid == IID_IAccessibleValue) {
|
| - if (ia_role != ROLE_SYSTEM_PROGRESSBAR &&
|
| - ia_role != ROLE_SYSTEM_SCROLLBAR && ia_role != ROLE_SYSTEM_SLIDER) {
|
| + if (!accessibility->IsRangeValueSupported()) {
|
| *object = NULL;
|
| return E_NOINTERFACE;
|
| }
|
| @@ -3915,15 +3926,25 @@ void BrowserAccessibilityComWin::UpdateStep1ComputeWinAttributes() {
|
| StringAttributeToIA2(ui::AX_ATTR_PLACEHOLDER, "placeholder");
|
|
|
| base::string16 value = owner()->GetValue();
|
| - // On Windows, the value of a document should be its url.
|
| - if (owner()->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
|
| - owner()->GetRole() == ui::AX_ROLE_WEB_AREA) {
|
| - value = base::UTF8ToUTF16(Manager()->GetTreeData().url);
|
| +
|
| + // Expose slider value.
|
| + if (IsRangeValueSupported()) {
|
| + value = GetRangeValueText();
|
| + SanitizeStringAttributeForIA2(value, &value);
|
| + win_attributes_->ia2_attributes.push_back(L"valuetext:" + value);
|
| + } else {
|
| + // On Windows, the value of a document should be its url.
|
| + if (owner()->GetRole() == ui::AX_ROLE_ROOT_WEB_AREA ||
|
| + owner()->GetRole() == ui::AX_ROLE_WEB_AREA) {
|
| + value = base::UTF8ToUTF16(Manager()->GetTreeData().url);
|
| + }
|
| + // 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 = owner()->GetString16Attribute(ui::AX_ATTR_URL);
|
| }
|
| - // 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 = owner()->GetString16Attribute(ui::AX_ATTR_URL);
|
| +
|
| win_attributes_->value = value;
|
|
|
| ClearOwnRelations();
|
| @@ -3948,14 +3969,6 @@ void BrowserAccessibilityComWin::UpdateStep1ComputeWinAttributes() {
|
| if (owner()->GetIntAttribute(ui::AX_ATTR_ERRORMESSAGE_ID, &error_message_id))
|
| AddRelation(IA2_RELATION_ERROR_MESSAGE, error_message_id);
|
|
|
| - // Expose slider value.
|
| - if (ia_role() == ROLE_SYSTEM_PROGRESSBAR ||
|
| - ia_role() == ROLE_SYSTEM_SCROLLBAR || ia_role() == ROLE_SYSTEM_SLIDER) {
|
| - base::string16 value_text = GetValueText();
|
| - SanitizeStringAttributeForIA2(value_text, &value_text);
|
| - win_attributes_->ia2_attributes.push_back(L"valuetext:" + value_text);
|
| - }
|
| -
|
| UpdateRequiredAttributes();
|
| // If this is a web area for a presentational iframe, give it a role of
|
| // something other than DOCUMENT so that the fact that it's a separate doc
|
| @@ -4683,9 +4696,9 @@ void BrowserAccessibilityComWin::GetSelectionOffsets(int* selection_start,
|
| ++(*largest_offset);
|
| }
|
|
|
| -base::string16 BrowserAccessibilityComWin::GetValueText() {
|
| +base::string16 BrowserAccessibilityComWin::GetRangeValueText() {
|
| float fval;
|
| - base::string16 result = value();
|
| + base::string16 result = owner()->GetValue();
|
|
|
| if (result.empty() && GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, &fval)) {
|
| result = base::UTF8ToUTF16(base::DoubleToString(fval));
|
|
|