| 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;
|
| +}
|
|
|