summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-17 21:09:13 +0000
committerctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-17 21:09:13 +0000
commit6a04ac2239221e2b64fe256507f136533cd541d3 (patch)
tree2fcc7d3e1f028b0278e43e9b0618861e870577f7 /views
parent8ec7bcff01381b7555f4dd1acc7184623dff5fd9 (diff)
downloadchromium_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.h4
-rw-r--r--views/accessibility/view_accessibility.cc102
-rw-r--r--views/accessibility/view_accessibility.h18
-rw-r--r--views/accessibility/view_accessibility_wrapper.h2
-rw-r--r--views/window/dialog_delegate.h9
-rw-r--r--views/window/window_delegate.h11
-rw-r--r--views/window/window_win.cc50
-rw-r--r--views/window/window_win.h5
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*