Index: chrome/browser/browser_accessibility.cc |
=================================================================== |
--- chrome/browser/browser_accessibility.cc (revision 12107) |
+++ chrome/browser/browser_accessibility.cc (working copy) |
@@ -6,8 +6,9 @@ |
#include "base/logging.h" |
#include "chrome/browser/browser_accessibility_manager.h" |
-#include "chrome/common/accessibility.h" |
+using webkit_glue::WebAccessibility; |
+ |
BrowserAccessibility::BrowserAccessibility() |
: iaccessible_id_(-1), |
instance_active_(true) { |
@@ -24,8 +25,8 @@ |
if (var_id.vt != VT_I4) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_ACCDODEFAULTACTION, var_id, |
- NULL, NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_DODEFAULTACTION, |
+ var_id, NULL, NULL)) { |
return E_FAIL; |
} |
@@ -55,8 +56,8 @@ |
POINT p = {x_left, y_top}; |
::ScreenToClient(parent_hwnd(), &p); |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_ACCHITTEST, EmptyVariant(), |
- p.x, p.y)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_HITTEST, |
+ EmptyVariant(), p.x, p.y)) { |
return E_FAIL; |
} |
@@ -67,7 +68,7 @@ |
} |
if (response().output_long1 == -1) { |
- if (CreateInstance(IID_IAccessible, response().iaccessible_id, |
+ if (CreateInstance(IID_IAccessible, response().object_id, |
reinterpret_cast<void**>(&child->pdispVal)) == S_OK) { |
child->vt = VT_DISPATCH; |
// Increment the reference count for the retrieved interface. |
@@ -96,8 +97,8 @@ |
return E_INVALIDARG; |
} |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_ACCLOCATION, var_id, NULL, |
- NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_LOCATION, var_id, |
+ NULL, NULL)) { |
return E_FAIL; |
} |
@@ -138,8 +139,8 @@ |
return E_INVALIDARG; |
} |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_ACCNAVIGATE, start, nav_dir, |
- NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_NAVIGATE, start, |
+ nav_dir, NULL)) { |
return E_FAIL; |
} |
@@ -150,7 +151,7 @@ |
} |
if (response().output_long1 == -1) { |
- if (CreateInstance(IID_IAccessible, response().iaccessible_id, |
+ if (CreateInstance(IID_IAccessible, response().object_id, |
reinterpret_cast<void**>(&end->pdispVal)) == S_OK) { |
end->vt = VT_DISPATCH; |
// Increment the reference count for the retrieved interface. |
@@ -180,8 +181,8 @@ |
if (var_child.lVal == CHILDID_SELF && iaccessible_id_ != 0) |
return S_OK; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCCHILD, var_child, NULL, |
- NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_GETCHILD, var_child, |
+ NULL, NULL)) { |
return E_FAIL; |
} |
@@ -193,7 +194,7 @@ |
// Retrieve the IUnknown interface for the parent view, and assign the |
// IDispatch returned. |
- if (CreateInstance(IID_IAccessible, response().iaccessible_id, |
+ if (CreateInstance(IID_IAccessible, response().object_id, |
reinterpret_cast<void**>(disp_child)) == S_OK) { |
// Increment the reference count for the retrieved interface. |
(*disp_child)->AddRef(); |
@@ -212,7 +213,7 @@ |
if (!child_count) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCCHILDCOUNT, |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_CHILDCOUNT, |
EmptyVariant(), NULL, NULL)) { |
return E_FAIL; |
} |
@@ -231,8 +232,8 @@ |
if (var_id.vt != VT_I4 || !def_action) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCDEFAULTACTION, var_id, |
- NULL, NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_DEFAULTACTION, |
+ var_id, NULL, NULL)) { |
return E_FAIL; |
} |
@@ -257,7 +258,7 @@ |
if (var_id.vt != VT_I4 || !desc) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCDESCRIPTION, var_id, |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_DESCRIPTION, var_id, |
NULL, NULL)) { |
return E_FAIL; |
} |
@@ -282,8 +283,8 @@ |
if (!focus_child) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCFOCUS, EmptyVariant(), |
- NULL, NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_GETFOCUSEDCHILD, |
+ EmptyVariant(), NULL, NULL)) { |
return E_FAIL; |
} |
@@ -294,7 +295,7 @@ |
} |
if (response().output_long1 == -1) { |
- if (CreateInstance(IID_IAccessible, response().iaccessible_id, |
+ if (CreateInstance(IID_IAccessible, response().object_id, |
reinterpret_cast<void**>(&focus_child->pdispVal)) == S_OK) { |
focus_child->vt = VT_DISPATCH; |
// Increment the reference count for the retrieved interface. |
@@ -319,12 +320,12 @@ |
if (var_id.vt != VT_I4 || !help) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCHELP, var_id, NULL, |
- NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_HELPTEXT, var_id, |
+ NULL, NULL)) { |
return E_FAIL; |
} |
- if (!response().return_code) { |
+ if (!response().return_code || response().output_string.empty()) { |
// No string found. |
return S_FALSE; |
} |
@@ -345,7 +346,7 @@ |
if (var_id.vt != VT_I4 || !acc_key) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCKEYBOARDSHORTCUT, |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_KEYBOARDSHORTCUT, |
var_id, NULL, NULL)) { |
return E_FAIL; |
} |
@@ -370,7 +371,7 @@ |
if (var_id.vt != VT_I4 || !name) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCNAME, var_id, NULL, |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_NAME, var_id, NULL, |
NULL)) { |
return E_FAIL; |
} |
@@ -411,8 +412,8 @@ |
return S_OK; |
} |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCPARENT, EmptyVariant(), |
- NULL, NULL)) { |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_GETPARENT, |
+ EmptyVariant(), NULL, NULL)) { |
return E_FAIL; |
} |
@@ -423,7 +424,7 @@ |
// Retrieve the IUnknown interface for the parent view, and assign the |
// IDispatch returned. |
- if (CreateInstance(IID_IAccessible, response().iaccessible_id, |
+ if (CreateInstance(IID_IAccessible, response().object_id, |
reinterpret_cast<void**>(disp_parent)) == S_OK) { |
// Increment the reference count for the retrieved interface. |
(*disp_parent)->AddRef(); |
@@ -442,14 +443,13 @@ |
if (var_id.vt != VT_I4 || !role) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCROLE, var_id, NULL, |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_ROLE, var_id, NULL, |
NULL)) { |
return E_FAIL; |
} |
role->vt = VT_I4; |
- role->lVal = response().output_long1; |
- |
+ role->lVal = MSAARole(response().output_long1); |
return S_OK; |
} |
@@ -463,14 +463,13 @@ |
if (var_id.vt != VT_I4 || !state) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCSTATE, var_id, NULL, |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_STATE, var_id, NULL, |
NULL)) { |
return E_FAIL; |
} |
state->vt = VT_I4; |
- state->lVal = response().output_long1; |
- |
+ state->lVal = MSAAState(response().output_long1); |
return S_OK; |
} |
@@ -483,12 +482,12 @@ |
if (var_id.vt != VT_I4 || !value) |
return E_INVALIDARG; |
- if (!RequestAccessibilityInfo(IACCESSIBLE_FUNC_GET_ACCVALUE, var_id, NULL, |
+ if (!RequestAccessibilityInfo(WebAccessibility::FUNCTION_VALUE, var_id, NULL, |
NULL)) { |
- return E_FAIL; |
+ return E_FAIL; |
} |
- if (!response().return_code) { |
+ if (!response().return_code || response().output_string.empty()) { |
// No string found. |
return S_FALSE; |
} |
@@ -501,7 +500,7 @@ |
STDMETHODIMP BrowserAccessibility::accSelect(LONG flags_select, |
VARIANT var_id) { |
- return DISP_E_MEMBERNOTFOUND; |
+ return E_NOTIMPL; |
} |
STDMETHODIMP BrowserAccessibility::get_accHelpTopic(BSTR* help_file, |
@@ -513,22 +512,22 @@ |
if (topic_id) { |
*topic_id = static_cast<LONG>(-1); |
} |
- return DISP_E_MEMBERNOTFOUND; |
+ return E_NOTIMPL; |
} |
STDMETHODIMP BrowserAccessibility::get_accSelection(VARIANT* selected) { |
if (selected) |
selected->vt = VT_EMPTY; |
- return DISP_E_MEMBERNOTFOUND; |
+ return E_NOTIMPL; |
} |
STDMETHODIMP BrowserAccessibility::put_accName(VARIANT var_id, BSTR put_name) { |
- return DISP_E_MEMBERNOTFOUND; |
+ return E_NOTIMPL; |
} |
STDMETHODIMP BrowserAccessibility::put_accValue(VARIANT var_id, BSTR put_val) { |
- return DISP_E_MEMBERNOTFOUND; |
+ return E_NOTIMPL; |
} |
STDMETHODIMP BrowserAccessibility::CreateInstance(REFIID iid, |
@@ -543,14 +542,102 @@ |
VARIANT var_id, LONG input1, |
LONG input2) { |
return BrowserAccessibilityManager::GetInstance()->RequestAccessibilityInfo( |
- iaccessible_id(), instance_id(), iaccessible_func_id, var_id, input1, |
+ iaccessible_id(), instance_id(), iaccessible_func_id, var_id.lVal, input1, |
input2); |
} |
-const AccessibilityOutParams& BrowserAccessibility::response() { |
+const WebAccessibility::OutParams& BrowserAccessibility::response() { |
return BrowserAccessibilityManager::GetInstance()->response(); |
} |
HWND BrowserAccessibility::parent_hwnd() { |
return BrowserAccessibilityManager::GetInstance()->parent_hwnd(instance_id()); |
} |
+ |
+long BrowserAccessibility::MSAARole(long browser_accessibility_role) { |
+ switch (browser_accessibility_role) { |
+ case WebAccessibility::ROLE_PUSHBUTTON : |
+ return ROLE_SYSTEM_PUSHBUTTON; |
+ case WebAccessibility::ROLE_RADIOBUTTON : |
+ return ROLE_SYSTEM_RADIOBUTTON; |
+ case WebAccessibility::ROLE_CHECKBUTTON : |
+ return ROLE_SYSTEM_CHECKBUTTON; |
+ case WebAccessibility::ROLE_SLIDER : |
+ return ROLE_SYSTEM_SLIDER; |
+ case WebAccessibility::ROLE_PAGETABLIST : |
+ return ROLE_SYSTEM_PAGETABLIST; |
+ case WebAccessibility::ROLE_TEXT : |
+ return ROLE_SYSTEM_TEXT; |
+ case WebAccessibility::ROLE_STATICTEXT : |
+ return ROLE_SYSTEM_STATICTEXT; |
+ case WebAccessibility::ROLE_OUTLINE : |
+ return ROLE_SYSTEM_OUTLINE; |
+ case WebAccessibility::ROLE_COLUMN : |
+ return ROLE_SYSTEM_COLUMN; |
+ case WebAccessibility::ROLE_ROW : |
+ return ROLE_SYSTEM_ROW; |
+ case WebAccessibility::ROLE_GROUPING : |
+ return ROLE_SYSTEM_GROUPING; |
+ case WebAccessibility::ROLE_LIST : |
+ return ROLE_SYSTEM_LIST; |
+ case WebAccessibility::ROLE_TABLE : |
+ return ROLE_SYSTEM_TABLE; |
+ case WebAccessibility::ROLE_LINK : |
+ return ROLE_SYSTEM_LINK; |
+ case WebAccessibility::ROLE_GRAPHIC : |
+ return ROLE_SYSTEM_GRAPHIC; |
+ case WebAccessibility::ROLE_CLIENT : |
+ default: |
+ // This is the default role for MSAA. |
+ return ROLE_SYSTEM_CLIENT; |
+ } |
+} |
+ |
+long BrowserAccessibility::MSAAState(long browser_accessibility_state) { |
+ long state = 0; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_LINKED) & 1) |
+ state |= STATE_SYSTEM_LINKED; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_HOTTRACKED) & 1) |
+ state |= STATE_SYSTEM_HOTTRACKED; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_UNAVAILABLE) & 1) |
+ state |= STATE_SYSTEM_UNAVAILABLE; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_READONLY) & 1) |
+ state |= STATE_SYSTEM_READONLY; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_OFFSCREEN) & 1) |
+ state |= STATE_SYSTEM_OFFSCREEN; |
+ |
+ if ((browser_accessibility_state >> |
+ WebAccessibility::STATE_MULTISELECTABLE) & 1) { |
+ state |= STATE_SYSTEM_MULTISELECTABLE; |
+ } |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_PROTECTED) & 1) |
+ state |= STATE_SYSTEM_PROTECTED; |
+ |
+ if ((browser_accessibility_state >> |
+ WebAccessibility::STATE_INDETERMINATE) & 1) { |
+ state |= STATE_SYSTEM_INDETERMINATE; |
+ } |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_CHECKED) & 1) |
+ state |= STATE_SYSTEM_CHECKED; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_PRESSED) & 1) |
+ state |= STATE_SYSTEM_PRESSED; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSED) & 1) |
+ state |= STATE_SYSTEM_FOCUSED; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_TRAVERSED) & 1) |
+ state |= STATE_SYSTEM_TRAVERSED; |
+ |
+ if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSABLE) & 1) |
+ state |= STATE_SYSTEM_FOCUSABLE; |
+ |
+ return state; |
+} |