Index: chrome/views/accessibility/view_accessibility.cc |
=================================================================== |
--- chrome/views/accessibility/view_accessibility.cc (revision 14426) |
+++ chrome/views/accessibility/view_accessibility.cc (working copy) |
@@ -498,9 +498,11 @@ |
return E_INVALIDARG; |
} |
+ AccessibilityTypes::Role acc_role; |
+ |
if (var_id.lVal == CHILDID_SELF) { |
// Retrieve parent role. |
- if (!view_->GetAccessibleRole(role)) { |
+ if (!view_->GetAccessibleRole(&acc_role)) { |
return E_FAIL; |
} |
} else { |
@@ -508,15 +510,14 @@ |
return E_INVALIDARG; |
} |
// Retrieve child role. |
- if (!view_->GetChildViewAt(var_id.lVal - 1)->GetAccessibleRole(role)) { |
+ if (!view_->GetChildViewAt(var_id.lVal - 1)->GetAccessibleRole(&acc_role)) { |
+ role->vt = VT_EMPTY; |
return E_FAIL; |
} |
} |
- // Make sure that role is not empty, and has the proper type. |
- if (role->vt == VT_EMPTY) |
- return E_FAIL; |
- |
+ role->vt = VT_I4; |
+ role->lVal = MSAARole(acc_role); |
return S_OK; |
} |
@@ -577,37 +578,75 @@ |
return true; |
} |
-void ViewAccessibility::SetState(VARIANT* state, views::View* view) { |
+void ViewAccessibility::SetState(VARIANT* msaa_state, views::View* view) { |
// Default state; all views can have accessibility focus. |
- state->lVal |= STATE_SYSTEM_FOCUSABLE; |
+ msaa_state->lVal |= STATE_SYSTEM_FOCUSABLE; |
if (!view) |
return; |
if (!view->IsEnabled()) { |
- state->lVal |= STATE_SYSTEM_UNAVAILABLE; |
+ msaa_state->lVal |= STATE_SYSTEM_UNAVAILABLE; |
} |
if (!view->IsVisible()) { |
- state->lVal |= STATE_SYSTEM_INVISIBLE; |
+ msaa_state->lVal |= STATE_SYSTEM_INVISIBLE; |
} |
if (view->IsHotTracked()) { |
- state->lVal |= STATE_SYSTEM_HOTTRACKED; |
+ msaa_state->lVal |= STATE_SYSTEM_HOTTRACKED; |
} |
if (view->IsPushed()) { |
- state->lVal |= STATE_SYSTEM_PRESSED; |
+ msaa_state->lVal |= STATE_SYSTEM_PRESSED; |
} |
// Check both for actual View focus, as well as accessibility focus. |
views::View* parent = view->GetParent(); |
if (view->HasFocus() || |
(parent && parent->GetAccFocusedChildView() == view)) { |
- state->lVal |= STATE_SYSTEM_FOCUSED; |
+ msaa_state->lVal |= STATE_SYSTEM_FOCUSED; |
} |
// Add on any view-specific states. |
- view->GetAccessibleState(state); |
+ AccessibilityTypes::State state; |
+ view->GetAccessibleState(&state); |
+ |
+ msaa_state->lVal |= MSAAState(state); |
} |
+long ViewAccessibility::MSAARole(AccessibilityTypes::Role role) { |
+ switch (role) { |
+ case AccessibilityTypes::ROLE_APPLICATION : |
+ return ROLE_SYSTEM_APPLICATION; |
+ case AccessibilityTypes::ROLE_BUTTONDROPDOWN : |
+ return ROLE_SYSTEM_BUTTONDROPDOWN; |
+ case AccessibilityTypes::ROLE_GROUPING : |
+ return ROLE_SYSTEM_GROUPING; |
+ case AccessibilityTypes::ROLE_PAGETAB : |
+ return ROLE_SYSTEM_PAGETAB; |
+ case AccessibilityTypes::ROLE_PUSHBUTTON : |
+ return ROLE_SYSTEM_PUSHBUTTON; |
+ case AccessibilityTypes::ROLE_TEXT : |
+ return ROLE_SYSTEM_TEXT; |
+ case AccessibilityTypes::ROLE_TOOLBAR : |
+ return ROLE_SYSTEM_TOOLBAR; |
+ case AccessibilityTypes::ROLE_CLIENT : |
+ default: |
+ // This is the default role for MSAA. |
+ return ROLE_SYSTEM_CLIENT; |
+ } |
+} |
+ |
+long ViewAccessibility::MSAAState(AccessibilityTypes::State state) { |
+ switch (state) { |
+ case AccessibilityTypes::STATE_HASPOPUP : |
+ return STATE_SYSTEM_HASPOPUP; |
+ case AccessibilityTypes::STATE_READONLY : |
+ return STATE_SYSTEM_READONLY; |
+ default : |
+ // No default state in MSAA. |
+ return 0; |
+ } |
+} |
+ |
// IAccessible functions not supported. |
HRESULT ViewAccessibility::accDoDefaultAction(VARIANT var_id) { |