diff options
author | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-17 21:09:13 +0000 |
---|---|---|
committer | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-17 21:09:13 +0000 |
commit | 6a04ac2239221e2b64fe256507f136533cd541d3 (patch) | |
tree | 2fcc7d3e1f028b0278e43e9b0618861e870577f7 /views | |
parent | 8ec7bcff01381b7555f4dd1acc7184623dff5fd9 (diff) | |
download | chromium_src-6a04ac2239221e2b64fe256507f136533cd541d3.zip chromium_src-6a04ac2239221e2b64fe256507f136533cd541d3.tar.gz chromium_src-6a04ac2239221e2b64fe256507f136533cd541d3.tar.bz2 |
Provide accessibility support for Window_win.
TEST=Ensure that the About Chrome dialog has proper accessibility role.
BUG=none
Review URL: http://codereview.chromium.org/1838002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47454 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/accessibility/accessibility_types.h | 4 | ||||
-rw-r--r-- | views/accessibility/view_accessibility.cc | 102 | ||||
-rw-r--r-- | views/accessibility/view_accessibility.h | 18 | ||||
-rw-r--r-- | views/accessibility/view_accessibility_wrapper.h | 2 | ||||
-rw-r--r-- | views/window/dialog_delegate.h | 9 | ||||
-rw-r--r-- | views/window/window_delegate.h | 11 | ||||
-rw-r--r-- | views/window/window_win.cc | 50 | ||||
-rw-r--r-- | views/window/window_win.h | 5 |
8 files changed, 139 insertions, 62 deletions
diff --git a/views/accessibility/accessibility_types.h b/views/accessibility/accessibility_types.h index 83c7aa7..882b8a1 100644 --- a/views/accessibility/accessibility_types.h +++ b/views/accessibility/accessibility_types.h @@ -5,6 +5,8 @@ #ifndef VIEWS_ACCESSIBILITY_ACCESSIBILITY_TYPES_H_ #define VIEWS_ACCESSIBILITY_ACCESSIBILITY_TYPES_H_ +#include "base/basictypes.h" + //////////////////////////////////////////////////////////////////////////////// // // AccessibilityTypes @@ -15,7 +17,6 @@ //////////////////////////////////////////////////////////////////////////////// class AccessibilityTypes { public: - // This defines states of the supported accessibility roles in our // Views (e.g. used in View::GetAccessibleState). Any interface using roles @@ -41,6 +42,7 @@ class AccessibilityTypes { ROLE_CHECKBUTTON, ROLE_CLIENT, ROLE_COMBOBOX, + ROLE_DIALOG, ROLE_GRAPHIC, ROLE_GROUPING, ROLE_LINK, diff --git a/views/accessibility/view_accessibility.cc b/views/accessibility/view_accessibility.cc index 2854c15..c440e53 100644 --- a/views/accessibility/view_accessibility.cc +++ b/views/accessibility/view_accessibility.cc @@ -702,6 +702,56 @@ void ViewAccessibility::SetState(VARIANT* msaa_state, views::View* view) { msaa_state->lVal |= MSAAState(state); } +// IAccessible functions not supported. + +HRESULT ViewAccessibility::accDoDefaultAction(VARIANT var_id) { + return E_NOTIMPL; +} + +STDMETHODIMP ViewAccessibility::get_accSelection(VARIANT* selected) { + if (selected) + selected->vt = VT_EMPTY; + return E_NOTIMPL; +} + +STDMETHODIMP ViewAccessibility::accSelect(LONG flagsSelect, VARIANT var_id) { + return E_NOTIMPL; +} + +STDMETHODIMP ViewAccessibility::get_accHelp(VARIANT var_id, BSTR* help) { + if (help) + *help = NULL; + return E_NOTIMPL; +} + +STDMETHODIMP ViewAccessibility::get_accHelpTopic(BSTR* help_file, + VARIANT var_id, + LONG* topic_id) { + if (help_file) { + *help_file = NULL; + } + if (topic_id) { + *topic_id = static_cast<LONG>(-1); + } + return E_NOTIMPL; +} + +STDMETHODIMP ViewAccessibility::put_accName(VARIANT var_id, BSTR put_name) { + // Deprecated. + return E_NOTIMPL; +} + +STDMETHODIMP ViewAccessibility::put_accValue(VARIANT var_id, BSTR put_val) { + if (V_VT(&var_id) == VT_BSTR) { + if (!lstrcmpi(var_id.bstrVal, kViewsUninitializeAccessibilityInstance)) { + view_ = NULL; + return S_OK; + } + } + // Deprecated. + return E_NOTIMPL; +} + int32 ViewAccessibility::MSAARole(AccessibilityTypes::Role role) { switch (role) { case AccessibilityTypes::ROLE_APPLICATION: @@ -714,6 +764,8 @@ int32 ViewAccessibility::MSAARole(AccessibilityTypes::Role role) { return ROLE_SYSTEM_CHECKBUTTON; case AccessibilityTypes::ROLE_COMBOBOX: return ROLE_SYSTEM_COMBOBOX; + case AccessibilityTypes::ROLE_DIALOG: + return ROLE_SYSTEM_DIALOG; case AccessibilityTypes::ROLE_GRAPHIC: return ROLE_SYSTEM_GRAPHIC; case AccessibilityTypes::ROLE_GROUPING: @@ -774,56 +826,6 @@ int32 ViewAccessibility::MSAAState(AccessibilityTypes::State state) { return msaa_state; } -// IAccessible functions not supported. - -HRESULT ViewAccessibility::accDoDefaultAction(VARIANT var_id) { - return E_NOTIMPL; -} - -STDMETHODIMP ViewAccessibility::get_accSelection(VARIANT* selected) { - if (selected) - selected->vt = VT_EMPTY; - return E_NOTIMPL; -} - -STDMETHODIMP ViewAccessibility::accSelect(LONG flagsSelect, VARIANT var_id) { - return E_NOTIMPL; -} - -STDMETHODIMP ViewAccessibility::get_accHelp(VARIANT var_id, BSTR* help) { - if (help) - *help = NULL; - return E_NOTIMPL; -} - -STDMETHODIMP ViewAccessibility::get_accHelpTopic(BSTR* help_file, - VARIANT var_id, - LONG* topic_id) { - if (help_file) { - *help_file = NULL; - } - if (topic_id) { - *topic_id = static_cast<LONG>(-1); - } - return E_NOTIMPL; -} - -STDMETHODIMP ViewAccessibility::put_accName(VARIANT var_id, BSTR put_name) { - // Deprecated. - return E_NOTIMPL; -} - -STDMETHODIMP ViewAccessibility::put_accValue(VARIANT var_id, BSTR put_val) { - if (V_VT(&var_id) == VT_BSTR) { - if (!lstrcmpi(var_id.bstrVal, kViewsUninitializeAccessibilityInstance)) { - view_ = NULL; - return S_OK; - } - } - // Deprecated. - return E_NOTIMPL; -} - HRESULT ViewAccessibility::GetNativeIAccessibleInterface( views::NativeViewHost* native_host, IDispatch** disp_child) { if (!native_host || !disp_child) { diff --git a/views/accessibility/view_accessibility.h b/views/accessibility/view_accessibility.h index b7a6dad..0224dfa07 100644 --- a/views/accessibility/view_accessibility.h +++ b/views/accessibility/view_accessibility.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -103,6 +103,14 @@ class ATL_NO_VTABLE ViewAccessibility STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name); STDMETHODIMP put_accValue(VARIANT var_id, BSTR put_val); + // Returns a conversion from the Role (as defined in accessibility_types.h) + // to an MSAA role. + static int32 MSAARole(AccessibilityTypes::Role role); + + // Returns a conversion from the State (as defined in accessibility_types.h) + // to MSAA states set. + static int32 MSAAState(AccessibilityTypes::State state); + private: // Checks to see if child_id is within the child bounds of view. Returns true // if the child is within the bounds, false otherwise. @@ -128,14 +136,6 @@ class ATL_NO_VTABLE ViewAccessibility // Helper function which sets applicable states of view. void SetState(VARIANT* msaa_state, views::View* view); - // Returns a conversion from the Role (as defined in accessibility_types.h) - // to an MSAA role. - int32 MSAARole(AccessibilityTypes::Role role); - - // Returns a conversion from the State (as defined in accessibility_types.h) - // to MSAA states set. - int32 MSAAState(AccessibilityTypes::State state); - // Returns the IAccessible interface for a native view if applicable. // Returns S_OK on success. HRESULT GetNativeIAccessibleInterface(views::NativeViewHost* native_host, diff --git a/views/accessibility/view_accessibility_wrapper.h b/views/accessibility/view_accessibility_wrapper.h index 619c91d..c6aa08e 100644 --- a/views/accessibility/view_accessibility_wrapper.h +++ b/views/accessibility/view_accessibility_wrapper.h @@ -6,6 +6,8 @@ #define VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_WRAPPER_H_ #include <atlcomcli.h> +// Necessary to define OleAcc GUID's used in window_win.cc. +#include <initguid.h> #include <oleacc.h> #include "base/basictypes.h" diff --git a/views/window/dialog_delegate.h b/views/window/dialog_delegate.h index ebfde24..da120e7 100644 --- a/views/window/dialog_delegate.h +++ b/views/window/dialog_delegate.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -6,6 +6,7 @@ #define VIEWS_WINDOW_DIALOG_DELEGATE_H_ #include "app/message_box_flags.h" +#include "views/accessibility/accessibility_types.h" #include "views/window/dialog_client_view.h" #include "views/window/window_delegate.h" @@ -115,6 +116,12 @@ class DialogDelegate : public WindowDelegate { // A helper for accessing the DialogClientView object contained by this // delegate's Window. DialogClientView* GetDialogClientView() const; + + private: + // Overridden from WindowDelegate: + AccessibilityTypes::Role accessible_role() const { + return AccessibilityTypes::ROLE_DIALOG; + } }; } // namespace views diff --git a/views/window/window_delegate.h b/views/window/window_delegate.h index 30174c8..a5144d0 100644 --- a/views/window/window_delegate.h +++ b/views/window/window_delegate.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -8,6 +8,7 @@ #include <string> #include "base/scoped_ptr.h" +#include "views/accessibility/accessibility_types.h" class SkBitmap; @@ -54,6 +55,14 @@ class WindowDelegate { return false; } + virtual AccessibilityTypes::Role accessible_role() const { + return AccessibilityTypes::ROLE_WINDOW; + } + + virtual AccessibilityTypes::State accessible_state() const { + return 0; + } + // Returns the text to be displayed in the window title. virtual std::wstring GetWindowTitle() const { return L""; diff --git a/views/window/window_win.cc b/views/window/window_win.cc index 64a2115..c9efbff 100644 --- a/views/window/window_win.cc +++ b/views/window/window_win.cc @@ -17,6 +17,7 @@ #include "gfx/font.h" #include "gfx/icon_util.h" #include "gfx/path.h" +#include "views/accessibility/view_accessibility.h" #include "views/widget/root_view.h" #include "views/window/client_view.h" #include "views/window/custom_frame_view.h" @@ -410,6 +411,9 @@ void WindowWin::UpdateWindowTitle() { if (base::i18n::AdjustStringForLocaleDirection(window_title, &localized_text)) window_title.assign(localized_text); SetWindowText(GetNativeView(), window_title.c_str()); + + // Also update the accessibility name. + UpdateAccessibleName(window_title); } void WindowWin::UpdateWindowIcon() { @@ -542,6 +546,8 @@ void WindowWin::Init(HWND parent, const gfx::Rect& bounds) { WidgetWin::SetContentsView(non_client_view_); UpdateWindowTitle(); + UpdateAccessibleRole(); + UpdateAccessibleState(); SetInitialBounds(bounds); @@ -1392,6 +1398,50 @@ void WindowWin::ResetWindowRegion(bool force) { DeleteObject(current_rgn); } +void WindowWin::UpdateAccessibleName(std::wstring name) { + ScopedComPtr<IAccPropServices> pAccPropServices; + HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, + IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); + if (SUCCEEDED(hr)) { + VARIANT var; + var.vt = VT_BSTR; + var.bstrVal = SysAllocString(name.c_str()); + hr = pAccPropServices->SetHwndProp(GetNativeView(), OBJID_CLIENT, + CHILDID_SELF, PROPID_ACC_NAME, var); + } +} + +void WindowWin::UpdateAccessibleRole() { + ScopedComPtr<IAccPropServices> pAccPropServices; + HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, + IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); + if (SUCCEEDED(hr)) { + VARIANT var; + AccessibilityTypes::Role role = window_delegate_->accessible_role(); + if (role) { + var.vt = VT_I4; + var.lVal = ViewAccessibility::MSAARole(role); + hr = pAccPropServices->SetHwndProp(GetNativeView(), OBJID_CLIENT, + CHILDID_SELF, PROPID_ACC_ROLE, var); + } + } +} + +void WindowWin::UpdateAccessibleState() { + ScopedComPtr<IAccPropServices> pAccPropServices; + HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, + IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices)); + if (SUCCEEDED(hr)) { + VARIANT var; + AccessibilityTypes::State state = window_delegate_->accessible_state(); + if (state) { + var.lVal = ViewAccessibility::MSAAState(state); + hr = pAccPropServices->SetHwndProp(GetNativeView(), OBJID_CLIENT, + CHILDID_SELF, PROPID_ACC_STATE, var); + } + } +} + void WindowWin::ProcessNCMousePress(const CPoint& point, int flags) { CPoint temp = point; MapWindowPoints(HWND_DESKTOP, GetNativeView(), &temp, 1); diff --git a/views/window/window_win.h b/views/window/window_win.h index 02812aa..c1b1630 100644 --- a/views/window/window_win.h +++ b/views/window/window_win.h @@ -191,6 +191,11 @@ class WindowWin : public WidgetWin, // frame windows. void ResetWindowRegion(bool force); + // Update accessibility information via our WindowDelegate. + void UpdateAccessibleName(std::wstring name); + void UpdateAccessibleRole(); + void UpdateAccessibleState(); + // Converts a non-client mouse down message to a regular ChromeViews event // and handle it. |point| is the mouse position of the message in screen // coords. |flags| are flags that would be passed with a WM_L/M/RBUTTON* |