summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-14 06:56:33 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-14 06:56:33 +0000
commit79e549faf26611d5ac05bc4f7fefd4a71a23fcb2 (patch)
treee7c50ebe8d193233ce2b06bbf5751bb9e82115b7 /views
parent36096983abafe5aa7a1df56904db3c0c8fa9ee2e (diff)
downloadchromium_src-79e549faf26611d5ac05bc4f7fefd4a71a23fcb2.zip
chromium_src-79e549faf26611d5ac05bc4f7fefd4a71a23fcb2.tar.gz
chromium_src-79e549faf26611d5ac05bc4f7fefd4a71a23fcb2.tar.bz2
Re-land: Refactor Views accessibility.
BUG=74988 TEST=none Review URL: http://codereview.chromium.org/6581010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78006 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r--views/accessibility/accessibility_types.h104
-rw-r--r--views/accessibility/native_view_accessibility_win.cc (renamed from views/accessibility/view_accessibility.cc)143
-rw-r--r--views/accessibility/native_view_accessibility_win.h (renamed from views/accessibility/view_accessibility.h)33
-rw-r--r--views/controls/button/button.cc20
-rw-r--r--views/controls/button/button.h7
-rw-r--r--views/controls/button/button_dropdown.cc16
-rw-r--r--views/controls/button/button_dropdown.h4
-rw-r--r--views/controls/button/checkbox.cc11
-rw-r--r--views/controls/button/checkbox.h3
-rw-r--r--views/controls/button/custom_button.cc19
-rw-r--r--views/controls/button/custom_button.h2
-rw-r--r--views/controls/button/menu_button.cc16
-rw-r--r--views/controls/button/menu_button.h4
-rw-r--r--views/controls/button/native_button_gtk.cc4
-rw-r--r--views/controls/button/native_button_win.cc26
-rw-r--r--views/controls/button/radio_button.cc6
-rw-r--r--views/controls/button/radio_button.h14
-rw-r--r--views/controls/combobox/combobox.cc23
-rw-r--r--views/controls/combobox/combobox.h26
-rw-r--r--views/controls/image_view.cc7
-rw-r--r--views/controls/image_view.h9
-rw-r--r--views/controls/label.cc12
-rw-r--r--views/controls/label.h5
-rw-r--r--views/controls/label_unittest.cc13
-rw-r--r--views/controls/link.cc6
-rw-r--r--views/controls/link.h16
-rw-r--r--views/controls/menu/menu_controller.cc6
-rw-r--r--views/controls/menu/menu_item_view.cc19
-rw-r--r--views/controls/menu/menu_item_view.h9
-rw-r--r--views/controls/menu/menu_scroll_view_container.cc16
-rw-r--r--views/controls/menu/menu_scroll_view_container.h6
-rw-r--r--views/controls/menu/submenu_view.cc51
-rw-r--r--views/controls/menu/submenu_view.h4
-rw-r--r--views/controls/native/native_view_host.cc3
-rw-r--r--views/controls/native_control.cc6
-rw-r--r--views/controls/native_control_gtk.cc6
-rw-r--r--views/controls/native_control_win.cc8
-rw-r--r--views/controls/progress_bar.cc10
-rw-r--r--views/controls/progress_bar.h8
-rw-r--r--views/controls/progress_bar_unittest.cc17
-rw-r--r--views/controls/resize_area.cc5
-rw-r--r--views/controls/resize_area.h13
-rw-r--r--views/controls/scrollbar/scroll_bar.cc5
-rw-r--r--views/controls/scrollbar/scroll_bar.h2
-rw-r--r--views/controls/separator.cc5
-rw-r--r--views/controls/separator.h11
-rw-r--r--views/controls/single_split_view.cc10
-rw-r--r--views/controls/single_split_view.h7
-rw-r--r--views/controls/tabbed_pane/tabbed_pane.cc18
-rw-r--r--views/controls/tabbed_pane/tabbed_pane.h24
-rw-r--r--views/controls/textfield/native_textfield_gtk.cc9
-rw-r--r--views/controls/textfield/native_textfield_win.cc8
-rw-r--r--views/controls/textfield/textfield.cc32
-rw-r--r--views/controls/textfield/textfield.h14
-rw-r--r--views/controls/tree/tree_view.cc10
-rw-r--r--views/controls/tree/tree_view.h3
-rw-r--r--views/test/test_views_delegate.h16
-rw-r--r--views/view.cc49
-rw-r--r--views/view.h66
-rw-r--r--views/view_gtk.cc16
-rw-r--r--views/view_win.cc29
-rw-r--r--views/views.gyp9
-rw-r--r--views/views_delegate.h6
-rw-r--r--views/widget/root_view.cc5
-rw-r--r--views/widget/root_view.h2
-rw-r--r--views/widget/widget.h12
-rw-r--r--views/widget/widget_gtk.cc13
-rw-r--r--views/widget/widget_gtk.h4
-rw-r--r--views/widget/widget_win.cc24
-rw-r--r--views/widget/widget_win.h9
-rw-r--r--views/window/client_view.cc5
-rw-r--r--views/window/client_view.h2
-rw-r--r--views/window/dialog_delegate.cc4
-rw-r--r--views/window/dialog_delegate.h6
-rw-r--r--views/window/native_window.h6
-rw-r--r--views/window/non_client_view.cc14
-rw-r--r--views/window/non_client_view.h22
-rw-r--r--views/window/window.cc4
-rw-r--r--views/window/window_delegate.cc6
-rw-r--r--views/window/window_delegate.h6
-rw-r--r--views/window/window_gtk.cc4
-rw-r--r--views/window/window_gtk.h4
-rw-r--r--views/window/window_win.cc11
-rw-r--r--views/window/window_win.h4
84 files changed, 606 insertions, 646 deletions
diff --git a/views/accessibility/accessibility_types.h b/views/accessibility/accessibility_types.h
deleted file mode 100644
index e55996e..0000000
--- a/views/accessibility/accessibility_types.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// 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.
-
-#ifndef VIEWS_ACCESSIBILITY_ACCESSIBILITY_TYPES_H_
-#define VIEWS_ACCESSIBILITY_ACCESSIBILITY_TYPES_H_
-#pragma once
-
-#include "base/basictypes.h"
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// AccessibilityTypes
-//
-// Provides enumerations used to preserve platform-independence in accessibility
-// functions used in various Views, both in Browser\Views and Views.
-//
-////////////////////////////////////////////////////////////////////////////////
-class AccessibilityTypes {
- public:
-
- // This defines states of the supported accessibility roles in our
- // Views (e.g. used in View::GetAccessibleState). Any interface using roles
- // must provide a conversion to its own roles (see e.g.
- // ViewAccessibility::get_accState and ViewAccessibility::MSAAState).
- typedef uint32 State;
- enum StateFlag {
- STATE_CHECKED = 1 << 0,
- STATE_COLLAPSED = 1 << 1,
- STATE_DEFAULT = 1 << 2,
- STATE_EXPANDED = 1 << 3,
- STATE_HASPOPUP = 1 << 4,
- STATE_HOTTRACKED = 1 << 5,
- STATE_INVISIBLE = 1 << 6,
- STATE_LINKED = 1 << 7,
- STATE_OFFSCREEN = 1 << 8,
- STATE_PRESSED = 1 << 9,
- STATE_PROTECTED = 1 << 10,
- STATE_READONLY = 1 << 11,
- STATE_SELECTED = 1 << 12,
- STATE_FOCUSED = 1 << 13,
- STATE_UNAVAILABLE = 1 << 14
- };
-
- // This defines an enumeration of the supported accessibility roles in our
- // Views (e.g. used in View::GetAccessibleRole). Any interface using roles
- // must provide a conversion to its own roles (see e.g.
- // ViewAccessibility::get_accRole and ViewAccessibility::MSAARole).
- enum Role {
- ROLE_ALERT,
- ROLE_APPLICATION,
- ROLE_BUTTONDROPDOWN,
- ROLE_BUTTONMENU,
- ROLE_CHECKBUTTON,
- ROLE_CLIENT,
- ROLE_COMBOBOX,
- ROLE_DIALOG,
- ROLE_GRAPHIC,
- ROLE_GROUPING,
- ROLE_LINK,
- ROLE_MENUBAR,
- ROLE_MENUITEM,
- ROLE_MENUPOPUP,
- ROLE_OUTLINE,
- ROLE_OUTLINEITEM,
- ROLE_PAGETAB,
- ROLE_PAGETABLIST,
- ROLE_PANE,
- ROLE_PROGRESSBAR,
- ROLE_PUSHBUTTON,
- ROLE_RADIOBUTTON,
- ROLE_SCROLLBAR,
- ROLE_SEPARATOR,
- ROLE_STATICTEXT,
- ROLE_TEXT,
- ROLE_TITLEBAR,
- ROLE_TOOLBAR,
- ROLE_WINDOW
- };
-
- // This defines an enumeration of the supported accessibility events in our
- // Views (e.g. used in View::NotifyAccessibilityEvent). Any interface using
- // events must provide a conversion to its own events (see e.g.
- // ViewAccessibility::MSAAEvent).
- enum Event {
- EVENT_ALERT,
- EVENT_FOCUS,
- EVENT_MENUSTART,
- EVENT_MENUEND,
- EVENT_MENUPOPUPSTART,
- EVENT_MENUPOPUPEND,
- EVENT_NAME_CHANGED,
- EVENT_TEXT_CHANGED,
- EVENT_SELECTION_CHANGED,
- EVENT_VALUE_CHANGED
- };
-
- private:
- // Do not instantiate this class.
- AccessibilityTypes() {}
- ~AccessibilityTypes() {}
-};
-
-#endif // VIEWS_ACCESSIBILITY_ACCESSIBILITY_TYPES_H_
diff --git a/views/accessibility/view_accessibility.cc b/views/accessibility/native_view_accessibility_win.cc
index ae9f889..603573f 100644
--- a/views/accessibility/view_accessibility.cc
+++ b/views/accessibility/native_view_accessibility_win.cc
@@ -1,28 +1,36 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
-#include "views/accessibility/view_accessibility.h"
+#include "views/accessibility/native_view_accessibility_win.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/view_prop.h"
#include "views/controls/button/native_button.h"
#include "views/widget/widget.h"
#include "views/widget/widget_win.h"
+using ui::AccessibilityTypes;
+
+namespace views {
+
const char kViewsNativeHostPropForAccessibility[] =
"Views_NativeViewHostHWNDForAccessibility";
// static
-scoped_refptr<ViewAccessibility> ViewAccessibility::Create(views::View* view) {
- CComObject<ViewAccessibility>* instance = NULL;
- HRESULT hr = CComObject<ViewAccessibility>::CreateInstance(&instance);
+scoped_refptr<NativeViewAccessibilityWin> NativeViewAccessibilityWin::Create(
+ views::View* view) {
+ CComObject<NativeViewAccessibilityWin>* instance = NULL;
+ HRESULT hr = CComObject<NativeViewAccessibilityWin>::CreateInstance(
+ &instance);
DCHECK(SUCCEEDED(hr));
instance->set_view(view);
- return scoped_refptr<ViewAccessibility>(instance);
+ return scoped_refptr<NativeViewAccessibilityWin>(instance);
}
// static
-IAccessible* ViewAccessibility::GetAccessibleForView(views::View* view) {
+IAccessible* NativeViewAccessibilityWin::GetAccessibleForView(
+ views::View* view) {
IAccessible* accessible = NULL;
// First, check to see if the view is a native view.
@@ -43,18 +51,18 @@ IAccessible* ViewAccessibility::GetAccessibleForView(views::View* view) {
}
}
- // Finally, use our ViewAccessibility implementation.
- return view->GetViewAccessibility();
+ // Finally, use our NativeViewAccessibilityWin implementation.
+ return view->GetNativeViewAccessibilityWin();
}
-ViewAccessibility::ViewAccessibility() : view_(NULL) {
+NativeViewAccessibilityWin::NativeViewAccessibilityWin() : view_(NULL) {
}
-ViewAccessibility::~ViewAccessibility() {
+NativeViewAccessibilityWin::~NativeViewAccessibilityWin() {
}
// TODO(ctguil): Handle case where child View is not contained by parent.
-STDMETHODIMP ViewAccessibility::accHitTest(
+STDMETHODIMP NativeViewAccessibilityWin::accHitTest(
LONG x_left, LONG y_top, VARIANT* child) {
if (!child)
return E_INVALIDARG;
@@ -84,7 +92,7 @@ STDMETHODIMP ViewAccessibility::accHitTest(
return S_OK;
}
-HRESULT ViewAccessibility::accDoDefaultAction(VARIANT var_id) {
+HRESULT NativeViewAccessibilityWin::accDoDefaultAction(VARIANT var_id) {
if (!IsValidId(var_id))
return E_INVALIDARG;
@@ -100,7 +108,7 @@ HRESULT ViewAccessibility::accDoDefaultAction(VARIANT var_id) {
return DISP_E_MEMBERNOTFOUND;
}
-STDMETHODIMP ViewAccessibility::accLocation(
+STDMETHODIMP NativeViewAccessibilityWin::accLocation(
LONG* x_left, LONG* y_top, LONG* width, LONG* height, VARIANT var_id) {
if (!IsValidId(var_id) || !x_left || !y_top || !width || !height)
return E_INVALIDARG;
@@ -112,8 +120,8 @@ STDMETHODIMP ViewAccessibility::accLocation(
*width = view_->width();
*height = view_->height();
gfx::Point topleft(view_->bounds().origin());
- views::View::ConvertPointToScreen(view_->parent() ? view_->parent() : view_,
- &topleft);
+ views::View::ConvertPointToScreen(
+ view_->parent() ? view_->parent() : view_, &topleft);
*x_left = topleft.x();
*y_top = topleft.y();
} else {
@@ -122,8 +130,8 @@ STDMETHODIMP ViewAccessibility::accLocation(
return S_OK;
}
-STDMETHODIMP ViewAccessibility::accNavigate(LONG nav_dir, VARIANT start,
- VARIANT* end) {
+STDMETHODIMP NativeViewAccessibilityWin::accNavigate(
+ LONG nav_dir, VARIANT start, VARIANT* end) {
if (start.vt != VT_I4 || !end)
return E_INVALIDARG;
@@ -223,7 +231,7 @@ STDMETHODIMP ViewAccessibility::accNavigate(LONG nav_dir, VARIANT start,
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accChild(VARIANT var_child,
+STDMETHODIMP NativeViewAccessibilityWin::get_accChild(VARIANT var_child,
IDispatch** disp_child) {
if (var_child.vt != VT_I4 || !disp_child)
return E_INVALIDARG;
@@ -266,7 +274,7 @@ STDMETHODIMP ViewAccessibility::get_accChild(VARIANT var_child,
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accChildCount(LONG* child_count) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accChildCount(LONG* child_count) {
if (!child_count || !view_)
return E_INVALIDARG;
@@ -277,7 +285,7 @@ STDMETHODIMP ViewAccessibility::get_accChildCount(LONG* child_count) {
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accDefaultAction(
+STDMETHODIMP NativeViewAccessibilityWin::get_accDefaultAction(
VARIANT var_id, BSTR* def_action) {
if (!IsValidId(var_id) || !def_action)
return E_INVALIDARG;
@@ -285,7 +293,9 @@ STDMETHODIMP ViewAccessibility::get_accDefaultAction(
if (!view_)
return E_FAIL;
- string16 temp_action = view_->GetAccessibleDefaultAction();
+ ui::AccessibleViewState state;
+ view_->GetAccessibleState(&state);
+ string16 temp_action = state.default_action;
if (!temp_action.empty()) {
*def_action = SysAllocString(temp_action.c_str());
@@ -296,7 +306,8 @@ STDMETHODIMP ViewAccessibility::get_accDefaultAction(
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accDescription(VARIANT var_id, BSTR* desc) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accDescription(
+ VARIANT var_id, BSTR* desc) {
if (!IsValidId(var_id) || !desc)
return E_INVALIDARG;
@@ -315,7 +326,7 @@ STDMETHODIMP ViewAccessibility::get_accDescription(VARIANT var_id, BSTR* desc) {
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accFocus(VARIANT* focus_child) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accFocus(VARIANT* focus_child) {
if (!focus_child)
return E_INVALIDARG;
@@ -342,7 +353,7 @@ STDMETHODIMP ViewAccessibility::get_accFocus(VARIANT* focus_child) {
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accKeyboardShortcut(
+STDMETHODIMP NativeViewAccessibilityWin::get_accKeyboardShortcut(
VARIANT var_id, BSTR* acc_key) {
if (!IsValidId(var_id) || !acc_key)
return E_INVALIDARG;
@@ -350,7 +361,9 @@ STDMETHODIMP ViewAccessibility::get_accKeyboardShortcut(
if (!view_)
return E_FAIL;
- string16 temp_key = view_->GetAccessibleKeyboardShortcut();
+ ui::AccessibleViewState state;
+ view_->GetAccessibleState(&state);
+ string16 temp_key = state.keyboard_shortcut;
if (!temp_key.empty()) {
*acc_key = SysAllocString(temp_key.c_str());
@@ -361,17 +374,18 @@ STDMETHODIMP ViewAccessibility::get_accKeyboardShortcut(
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accName(VARIANT var_id, BSTR* name) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accName(
+ VARIANT var_id, BSTR* name) {
if (!IsValidId(var_id) || !name)
return E_INVALIDARG;
if (!view_)
return E_FAIL;
- string16 temp_name;
-
// Retrieve the current view's name.
- view_->GetAccessibleName(&temp_name);
+ ui::AccessibleViewState state;
+ view_->GetAccessibleState(&state);
+ string16 temp_name = state.name;
if (!temp_name.empty()) {
// Return name retrieved.
*name = SysAllocString(temp_name.c_str());
@@ -383,7 +397,8 @@ STDMETHODIMP ViewAccessibility::get_accName(VARIANT var_id, BSTR* name) {
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accParent(IDispatch** disp_parent) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accParent(
+ IDispatch** disp_parent) {
if (!disp_parent)
return E_INVALIDARG;
@@ -400,9 +415,9 @@ STDMETHODIMP ViewAccessibility::get_accParent(IDispatch** disp_parent) {
return S_FALSE;
}
- // For a View that has no parent (e.g. root), point the accessible parent to
- // the default implementation, to interface with Windows' hierarchy and to
- // support calls from e.g. WindowFromAccessibleObject.
+ // For a View that has no parent (e.g. root), point the accessible parent
+ // to the default implementation, to interface with Windows' hierarchy
+ // and to support calls from e.g. WindowFromAccessibleObject.
HRESULT hr =
::AccessibleObjectFromWindow(view_->GetWidget()->GetNativeView(),
OBJID_WINDOW, IID_IAccessible,
@@ -421,19 +436,23 @@ STDMETHODIMP ViewAccessibility::get_accParent(IDispatch** disp_parent) {
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accRole(VARIANT var_id, VARIANT* role) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accRole(
+ VARIANT var_id, VARIANT* role) {
if (!IsValidId(var_id) || !role)
return E_INVALIDARG;
if (!view_)
return E_FAIL;
+ ui::AccessibleViewState state;
+ view_->GetAccessibleState(&state);
role->vt = VT_I4;
- role->lVal = MSAARole(view_->GetAccessibleRole());
+ role->lVal = MSAARole(state.role);
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accState(VARIANT var_id, VARIANT* state) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accState(
+ VARIANT var_id, VARIANT* state) {
if (!IsValidId(var_id) || !state)
return E_INVALIDARG;
@@ -452,7 +471,8 @@ STDMETHODIMP ViewAccessibility::get_accState(VARIANT var_id, VARIANT* state) {
return S_OK;
}
-STDMETHODIMP ViewAccessibility::get_accValue(VARIANT var_id, BSTR* value) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accValue(
+ VARIANT var_id, BSTR* value) {
if (!IsValidId(var_id) || !value)
return E_INVALIDARG;
@@ -460,7 +480,9 @@ STDMETHODIMP ViewAccessibility::get_accValue(VARIANT var_id, BSTR* value) {
return E_FAIL;
// Retrieve the current view's value.
- string16 temp_value = view_->GetAccessibleValue();
+ ui::AccessibleViewState state;
+ view_->GetAccessibleState(&state);
+ string16 temp_value = state.value;
if (!temp_value.empty()) {
// Return value retrieved.
@@ -476,7 +498,7 @@ STDMETHODIMP ViewAccessibility::get_accValue(VARIANT var_id, BSTR* value) {
// Helper functions.
-bool ViewAccessibility::IsNavDirNext(int nav_dir) const {
+bool NativeViewAccessibilityWin::IsNavDirNext(int nav_dir) const {
if (nav_dir == NAVDIR_RIGHT || nav_dir == NAVDIR_DOWN ||
nav_dir == NAVDIR_NEXT) {
return true;
@@ -484,8 +506,8 @@ bool ViewAccessibility::IsNavDirNext(int nav_dir) const {
return false;
}
-bool ViewAccessibility::IsValidNav(int nav_dir, int start_id, int lower_bound,
- int upper_bound) const {
+bool NativeViewAccessibilityWin::IsValidNav(
+ int nav_dir, int start_id, int lower_bound, int upper_bound) const {
if (IsNavDirNext(nav_dir)) {
if ((start_id + 1) > upper_bound) {
return false;
@@ -498,13 +520,14 @@ bool ViewAccessibility::IsValidNav(int nav_dir, int start_id, int lower_bound,
return true;
}
-bool ViewAccessibility::IsValidId(const VARIANT& child) const {
+bool NativeViewAccessibilityWin::IsValidId(const VARIANT& child) const {
// View accessibility returns an IAccessible for each view so we only support
// the CHILDID_SELF id.
return (VT_I4 == child.vt) && (CHILDID_SELF == child.lVal);
}
-void ViewAccessibility::SetState(VARIANT* msaa_state, views::View* view) {
+void NativeViewAccessibilityWin::SetState(
+ VARIANT* msaa_state, views::View* view) {
// Ensure the output param is initialized to zero.
msaa_state->lVal = 0;
@@ -524,28 +547,32 @@ void ViewAccessibility::SetState(VARIANT* msaa_state, views::View* view) {
msaa_state->lVal |= STATE_SYSTEM_FOCUSED;
// Add on any view-specific states.
- msaa_state->lVal |= MSAAState(view->GetAccessibleState());
+ ui::AccessibleViewState view_state;
+ view->GetAccessibleState(&view_state);
+ msaa_state->lVal |= MSAAState(view_state.state);
}
// IAccessible functions not supported.
-STDMETHODIMP ViewAccessibility::get_accSelection(VARIANT* selected) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accSelection(VARIANT* selected) {
if (selected)
selected->vt = VT_EMPTY;
return E_NOTIMPL;
}
-STDMETHODIMP ViewAccessibility::accSelect(LONG flagsSelect, VARIANT var_id) {
+STDMETHODIMP NativeViewAccessibilityWin::accSelect(
+ LONG flagsSelect, VARIANT var_id) {
return E_NOTIMPL;
}
-STDMETHODIMP ViewAccessibility::get_accHelp(VARIANT var_id, BSTR* help) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accHelp(
+ VARIANT var_id, BSTR* help) {
if (help)
*help = NULL;
return E_NOTIMPL;
}
-STDMETHODIMP ViewAccessibility::get_accHelpTopic(
+STDMETHODIMP NativeViewAccessibilityWin::get_accHelpTopic(
BSTR* help_file, VARIANT var_id, LONG* topic_id) {
if (help_file) {
*help_file = NULL;
@@ -556,17 +583,19 @@ STDMETHODIMP ViewAccessibility::get_accHelpTopic(
return E_NOTIMPL;
}
-STDMETHODIMP ViewAccessibility::put_accName(VARIANT var_id, BSTR put_name) {
+STDMETHODIMP NativeViewAccessibilityWin::put_accName(
+ VARIANT var_id, BSTR put_name) {
// Deprecated.
return E_NOTIMPL;
}
-STDMETHODIMP ViewAccessibility::put_accValue(VARIANT var_id, BSTR put_val) {
+STDMETHODIMP NativeViewAccessibilityWin::put_accValue(
+ VARIANT var_id, BSTR put_val) {
// Deprecated.
return E_NOTIMPL;
}
-int32 ViewAccessibility::MSAAEvent(AccessibilityTypes::Event event) {
+int32 NativeViewAccessibilityWin::MSAAEvent(AccessibilityTypes::Event event) {
switch (event) {
case AccessibilityTypes::EVENT_ALERT:
return EVENT_SYSTEM_ALERT;
@@ -595,7 +624,7 @@ int32 ViewAccessibility::MSAAEvent(AccessibilityTypes::Event event) {
}
}
-int32 ViewAccessibility::MSAARole(AccessibilityTypes::Role role) {
+int32 NativeViewAccessibilityWin::MSAARole(AccessibilityTypes::Role role) {
switch (role) {
case AccessibilityTypes::ROLE_ALERT:
return ROLE_SYSTEM_ALERT;
@@ -660,7 +689,7 @@ return ROLE_SYSTEM_ALERT;
}
}
-int32 ViewAccessibility::MSAAState(AccessibilityTypes::State state) {
+int32 NativeViewAccessibilityWin::MSAAState(AccessibilityTypes::State state) {
int32 msaa_state = 0;
if (state & AccessibilityTypes::STATE_CHECKED)
msaa_state |= STATE_SYSTEM_CHECKED;
@@ -696,7 +725,7 @@ int32 ViewAccessibility::MSAAState(AccessibilityTypes::State state) {
}
// static
-HRESULT ViewAccessibility::GetNativeIAccessibleInterface(
+HRESULT NativeViewAccessibilityWin::GetNativeIAccessibleInterface(
views::NativeViewHost* native_host, IAccessible** accessible) {
if (!native_host || !accessible)
return E_INVALIDARG;
@@ -712,7 +741,7 @@ HRESULT ViewAccessibility::GetNativeIAccessibleInterface(
}
// static
-HRESULT ViewAccessibility::GetNativeIAccessibleInterface(
+HRESULT NativeViewAccessibilityWin::GetNativeIAccessibleInterface(
HWND native_view_window , IAccessible** accessible) {
if (IsWindow(native_view_window)) {
LRESULT ret = SendMessage(native_view_window, WM_GETOBJECT, 0,
@@ -723,3 +752,5 @@ HRESULT ViewAccessibility::GetNativeIAccessibleInterface(
return E_FAIL;
}
+
+} // namespace views
diff --git a/views/accessibility/view_accessibility.h b/views/accessibility/native_view_accessibility_win.h
index 9e2d7b8..2e947e1 100644
--- a/views/accessibility/view_accessibility.h
+++ b/views/accessibility/native_view_accessibility_win.h
@@ -1,9 +1,9 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
-#ifndef VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_H_
-#define VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_H_
+#ifndef VIEWS_ACCESSIBILITY_NATIVE_VIEW_ACCESSIBILITY_WIN_H_
+#define VIEWS_ACCESSIBILITY_NATIVE_VIEW_ACCESSIBILITY_WIN_H_
#pragma once
#include <atlbase.h>
@@ -12,34 +12,37 @@
#include <oleacc.h>
#include "base/scoped_ptr.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "views/controls/native/native_view_host.h"
#include "views/view.h"
+namespace views {
+
////////////////////////////////////////////////////////////////////////////////
//
-// ViewAccessibility
+// NativeViewAccessibilityWin
//
// Class implementing the MSAA IAccessible COM interface for a generic View,
// providing accessibility to be used by screen readers and other assistive
// technology (AT).
//
////////////////////////////////////////////////////////////////////////////////
-class ATL_NO_VTABLE ViewAccessibility
+class ATL_NO_VTABLE NativeViewAccessibilityWin
: public CComObjectRootEx<CComMultiThreadModel>,
public IDispatchImpl<IAccessible, &IID_IAccessible, &LIBID_Accessibility> {
public:
- BEGIN_COM_MAP(ViewAccessibility)
+ BEGIN_COM_MAP(NativeViewAccessibilityWin)
COM_INTERFACE_ENTRY2(IDispatch, IAccessible)
COM_INTERFACE_ENTRY(IAccessible)
END_COM_MAP()
// Create method for view accessibility.
- static scoped_refptr<ViewAccessibility> Create(views::View* view);
+ static scoped_refptr<NativeViewAccessibilityWin> Create(views::View* view);
// Returns the IAccessible interface for a view.
static IAccessible* GetAccessibleForView(views::View* view);
- virtual ~ViewAccessibility();
+ virtual ~NativeViewAccessibilityWin();
void set_view(views::View* view) { view_ = view; }
@@ -112,18 +115,18 @@ class ATL_NO_VTABLE ViewAccessibility
// Returns a conversion from the event (as defined in accessibility_types.h)
// to an MSAA event.
- static int32 MSAAEvent(AccessibilityTypes::Event event);
+ static int32 MSAAEvent(ui::AccessibilityTypes::Event event);
// Returns a conversion from the Role (as defined in accessibility_types.h)
// to an MSAA role.
- static int32 MSAARole(AccessibilityTypes::Role role);
+ static int32 MSAARole(ui::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);
+ static int32 MSAAState(ui::AccessibilityTypes::State state);
private:
- ViewAccessibility();
+ NativeViewAccessibilityWin();
// Determines navigation direction for accNavigate, based on left, up and
// previous being mapped all to previous and right, down, next being mapped
@@ -157,9 +160,11 @@ class ATL_NO_VTABLE ViewAccessibility
// Member View needed for view-specific calls.
views::View* view_;
- DISALLOW_COPY_AND_ASSIGN(ViewAccessibility);
+ DISALLOW_COPY_AND_ASSIGN(NativeViewAccessibilityWin);
};
extern const char kViewsNativeHostPropForAccessibility[];
-#endif // VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_H_
+} // namespace views
+
+#endif // VIEWS_ACCESSIBILITY_NATIVE_VIEW_ACCESSIBILITY_WIN_H_
diff --git a/views/controls/button/button.cc b/views/controls/button/button.cc
index 7b6cc75..6d18204 100644
--- a/views/controls/button/button.cc
+++ b/views/controls/button/button.cc
@@ -3,7 +3,9 @@
// found in the LICENSE file.
#include "views/controls/button/button.h"
+
#include "base/utf_string_conversions.h"
+#include "ui/base/accessibility/accessible_view_state.h"
namespace views {
@@ -18,8 +20,12 @@ void Button::SetTooltipText(const std::wstring& tooltip_text) {
TooltipTextChanged();
}
-void Button::SetAccessibleKeyboardShortcut(const std::wstring& shortcut) {
- accessible_shortcut_ = WideToUTF16Hack(shortcut);
+void Button::SetAccessibleName(const string16& name) {
+ accessible_name_ = name;
+}
+
+void Button::SetAccessibleKeyboardShortcut(const string16& shortcut) {
+ accessible_shortcut_ = shortcut;
}
////////////////////////////////////////////////////////////////////////////////
@@ -33,12 +39,10 @@ bool Button::GetTooltipText(const gfx::Point& p, std::wstring* tooltip) {
return true;
}
-string16 Button::GetAccessibleKeyboardShortcut() {
- return accessible_shortcut_;
-}
-
-AccessibilityTypes::Role Button::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_PUSHBUTTON;
+void Button::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON;
+ state->name = accessible_name_;
+ state->keyboard_shortcut = accessible_shortcut_;
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/views/controls/button/button.h b/views/controls/button/button.h
index 263e45f..0c9c6c7 100644
--- a/views/controls/button/button.h
+++ b/views/controls/button/button.h
@@ -36,13 +36,13 @@ class Button : public View {
int mouse_event_flags() const { return mouse_event_flags_; }
- void SetAccessibleKeyboardShortcut(const std::wstring& shortcut);
+ void SetAccessibleName(const string16& name);
+ void SetAccessibleKeyboardShortcut(const string16& shortcut);
// Overridden from View:
virtual bool GetTooltipText(const gfx::Point& p,
std::wstring* tooltip) OVERRIDE;
- virtual string16 GetAccessibleKeyboardShortcut() OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
// Construct the Button with a Listener. The listener can be NULL. This can be
@@ -61,6 +61,7 @@ class Button : public View {
string16 tooltip_text_;
// Accessibility data.
+ string16 accessible_name_;
string16 accessible_shortcut_;
// The id tag associated with this button. Used to disambiguate buttons in
diff --git a/views/controls/button/button_dropdown.cc b/views/controls/button/button_dropdown.cc
index d2f69e2..a5f7ab1 100644
--- a/views/controls/button/button_dropdown.cc
+++ b/views/controls/button/button_dropdown.cc
@@ -8,6 +8,7 @@
#include "base/message_loop.h"
#include "base/utf_string_conversions.h"
#include "grit/app_strings.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/l10n/l10n_util.h"
#include "views/controls/menu/view_menu_delegate.h"
#include "views/widget/widget.h"
@@ -165,16 +166,11 @@ void ButtonDropDown::ShowDropDownMenu(gfx::NativeView window) {
//
////////////////////////////////////////////////////////////////////////////////
-string16 ButtonDropDown::GetAccessibleDefaultAction() {
- return l10n_util::GetStringUTF16(IDS_APP_ACCACTION_PRESS);
-}
-
-AccessibilityTypes::Role ButtonDropDown::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_BUTTONDROPDOWN;
-}
-
-AccessibilityTypes::State ButtonDropDown::GetAccessibleState() {
- return AccessibilityTypes::STATE_HASPOPUP;
+void ButtonDropDown::GetAccessibleState(ui::AccessibleViewState* state) {
+ CustomButton::GetAccessibleState(state);
+ state->role = ui::AccessibilityTypes::ROLE_BUTTONDROPDOWN;
+ state->default_action = l10n_util::GetStringUTF16(IDS_APP_ACCACTION_PRESS);
+ state->state = ui::AccessibilityTypes::STATE_HASPOPUP;
}
} // namespace views
diff --git a/views/controls/button/button_dropdown.h b/views/controls/button/button_dropdown.h
index 07b8276..32f2c5c 100644
--- a/views/controls/button/button_dropdown.h
+++ b/views/controls/button/button_dropdown.h
@@ -26,9 +26,7 @@ class ButtonDropDown : public ImageButton {
virtual ~ButtonDropDown();
// Accessibility accessors, overridden from View.
- virtual string16 GetAccessibleDefaultAction() OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
- virtual AccessibilityTypes::State GetAccessibleState() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
private:
// Overridden from CustomButton
diff --git a/views/controls/button/checkbox.cc b/views/controls/button/checkbox.cc
index 719dfd8..2a34cc5 100644
--- a/views/controls/button/checkbox.cc
+++ b/views/controls/button/checkbox.cc
@@ -5,6 +5,7 @@
#include "views/controls/button/checkbox.h"
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/gfx/canvas.h"
#include "views/controls/label.h"
@@ -158,12 +159,10 @@ void Checkbox::OnBlur() {
label_->set_paint_as_focused(false);
}
-AccessibilityTypes::Role Checkbox::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_CHECKBUTTON;
-}
-
-AccessibilityTypes::State Checkbox::GetAccessibleState() {
- return checked() ? AccessibilityTypes::STATE_CHECKED : 0;
+void Checkbox::GetAccessibleState(ui::AccessibleViewState* state) {
+ Button::GetAccessibleState(state);
+ state->role = ui::AccessibilityTypes::ROLE_CHECKBUTTON;
+ state->state = checked() ? ui::AccessibilityTypes::STATE_CHECKED : 0;
}
std::string Checkbox::GetClassName() const {
diff --git a/views/controls/button/checkbox.h b/views/controls/button/checkbox.h
index 71d218d..801b0fd 100644
--- a/views/controls/button/checkbox.h
+++ b/views/controls/button/checkbox.h
@@ -57,8 +57,7 @@ class Checkbox : public NativeButton {
virtual void OnBlur() OVERRIDE;
// Accessibility accessors, overridden from View.
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
- virtual AccessibilityTypes::State GetAccessibleState() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Overridden from NativeButton:
virtual void SetLabel(const std::wstring& label) OVERRIDE;
diff --git a/views/controls/button/custom_button.cc b/views/controls/button/custom_button.cc
index 1696d14..04ee51a 100644
--- a/views/controls/button/custom_button.cc
+++ b/views/controls/button/custom_button.cc
@@ -4,9 +4,11 @@
#include "views/controls/button/custom_button.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/animation/throb_animation.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "views/screen.h"
+#include "views/widget/widget.h"
namespace views {
@@ -57,24 +59,23 @@ void CustomButton::SetAnimationDuration(int duration) {
////////////////////////////////////////////////////////////////////////////////
// CustomButton, View overrides:
-AccessibilityTypes::State CustomButton::GetAccessibleState() {
- int state = 0;
+void CustomButton::GetAccessibleState(ui::AccessibleViewState* state) {
+ Button::GetAccessibleState(state);
switch (state_) {
case BS_HOT:
- state = AccessibilityTypes::STATE_HOTTRACKED;
+ state->state = ui::AccessibilityTypes::STATE_HOTTRACKED;
break;
case BS_PUSHED:
- state = AccessibilityTypes::STATE_PRESSED;
+ state->state = ui::AccessibilityTypes::STATE_PRESSED;
break;
case BS_DISABLED:
- state = AccessibilityTypes::STATE_UNAVAILABLE;
+ state->state = ui::AccessibilityTypes::STATE_UNAVAILABLE;
break;
case BS_NORMAL:
case BS_COUNT:
// No additional accessibility state set for this button state.
break;
}
- return state;
}
void CustomButton::SetEnabled(bool enabled) {
@@ -248,8 +249,10 @@ void CustomButton::SetHotTracked(bool flag) {
if (state_ != BS_DISABLED)
SetState(flag ? BS_HOT : BS_NORMAL);
- if (flag)
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS);
+ if (flag && GetWidget()) {
+ GetWidget()->NotifyAccessibilityEvent(
+ this, ui::AccessibilityTypes::EVENT_FOCUS, true);
+ }
}
bool CustomButton::IsHotTracked() const {
diff --git a/views/controls/button/custom_button.h b/views/controls/button/custom_button.h
index 8dafcf5..6dcabc9 100644
--- a/views/controls/button/custom_button.h
+++ b/views/controls/button/custom_button.h
@@ -48,7 +48,7 @@ class CustomButton : public Button,
void SetAnimationDuration(int duration);
// Overridden from View:
- virtual AccessibilityTypes::State GetAccessibleState() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
virtual void SetEnabled(bool enabled) OVERRIDE;
virtual bool IsEnabled() const OVERRIDE;
virtual bool IsFocusable() const OVERRIDE;
diff --git a/views/controls/button/menu_button.cc b/views/controls/button/menu_button.cc
index 5c23d86..a3859ba 100644
--- a/views/controls/button/menu_button.cc
+++ b/views/controls/button/menu_button.cc
@@ -7,6 +7,7 @@
#include "base/utf_string_conversions.h"
#include "grit/app_strings.h"
#include "grit/app_resources.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
@@ -260,16 +261,11 @@ void MenuButton::OnMouseExited(const MouseEvent& event) {
//
////////////////////////////////////////////////////////////////////////////////
-string16 MenuButton::GetAccessibleDefaultAction() {
- return l10n_util::GetStringUTF16(IDS_APP_ACCACTION_PRESS);
-}
-
-AccessibilityTypes::Role MenuButton::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_BUTTONMENU;
-}
-
-AccessibilityTypes::State MenuButton::GetAccessibleState() {
- return AccessibilityTypes::STATE_HASPOPUP;
+void MenuButton::GetAccessibleState(ui::AccessibleViewState* state) {
+ CustomButton::GetAccessibleState(state);
+ state->role = ui::AccessibilityTypes::ROLE_BUTTONMENU;
+ state->default_action = l10n_util::GetStringUTF16(IDS_APP_ACCACTION_PRESS);
+ state->state = ui::AccessibilityTypes::STATE_HASPOPUP;
}
std::string MenuButton::GetClassName() const {
diff --git a/views/controls/button/menu_button.h b/views/controls/button/menu_button.h
index 610d74a..eb5ca9c 100644
--- a/views/controls/button/menu_button.h
+++ b/views/controls/button/menu_button.h
@@ -58,9 +58,7 @@ class MenuButton : public TextButton {
virtual bool OnKeyReleased(const KeyEvent& e);
// Accessibility accessors, overridden from View.
- virtual string16 GetAccessibleDefaultAction() OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
- virtual AccessibilityTypes::State GetAccessibleState() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Returns views/MenuButton.
virtual std::string GetClassName() const;
diff --git a/views/controls/button/native_button_gtk.cc b/views/controls/button/native_button_gtk.cc
index a217249..bcd7a22 100644
--- a/views/controls/button/native_button_gtk.cc
+++ b/views/controls/button/native_button_gtk.cc
@@ -158,8 +158,8 @@ void NativeCheckboxGtk::OnClicked() {
if (deliver_click_event_) {
SyncCheckState();
NativeButtonGtk::OnClicked();
- checkbox()->NotifyAccessibilityEvent(
- AccessibilityTypes::EVENT_VALUE_CHANGED);
+ GetWidget()->NotifyAccessibilityEvent(
+ checkbox(), ui::AccessibilityTypes::EVENT_VALUE_CHANGED, true);
}
}
diff --git a/views/controls/button/native_button_win.cc b/views/controls/button/native_button_win.cc
index fbba56a..2783c84 100644
--- a/views/controls/button/native_button_win.cc
+++ b/views/controls/button/native_button_win.cc
@@ -11,6 +11,7 @@
#include "base/win/scoped_comptr.h"
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "views/controls/button/checkbox.h"
#include "views/controls/button/native_button.h"
#include "views/controls/button/radio_button.h"
@@ -71,18 +72,19 @@ void NativeButtonWin::UpdateDefault() {
}
void NativeButtonWin::UpdateAccessibleName() {
- string16 name;
- if (native_button_->GetAccessibleName(&name)) {
- base::win::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(native_view(), OBJID_WINDOW,
- CHILDID_SELF, PROPID_ACC_NAME, var);
- }
+ ui::AccessibleViewState state;
+ native_button_->GetAccessibleState(&state);
+ string16 name = state.name;
+ base::win::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(native_view(), OBJID_WINDOW,
+ CHILDID_SELF, PROPID_ACC_NAME, var);
}
}
diff --git a/views/controls/button/radio_button.cc b/views/controls/button/radio_button.cc
index 4074da4..f162f2c 100644
--- a/views/controls/button/radio_button.cc
+++ b/views/controls/button/radio_button.cc
@@ -5,6 +5,7 @@
#include "views/controls/button/radio_button.h"
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "views/widget/root_view.h"
namespace views {
@@ -60,8 +61,9 @@ void RadioButton::SetChecked(bool checked) {
////////////////////////////////////////////////////////////////////////////////
// RadioButton, View overrides:
-AccessibilityTypes::Role RadioButton::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_RADIOBUTTON;
+void RadioButton::GetAccessibleState(ui::AccessibleViewState* state) {
+ Checkbox::GetAccessibleState(state);
+ state->role = ui::AccessibilityTypes::ROLE_RADIOBUTTON;
}
View* RadioButton::GetSelectedViewForGroup(int group_id) {
diff --git a/views/controls/button/radio_button.h b/views/controls/button/radio_button.h
index 7ea35f5..5ff6f76 100644
--- a/views/controls/button/radio_button.h
+++ b/views/controls/button/radio_button.h
@@ -22,16 +22,18 @@ class RadioButton : public Checkbox {
virtual ~RadioButton();
// Overridden from Checkbox:
- virtual void SetChecked(bool checked);
+ virtual void SetChecked(bool checked) OVERRIDE;
// Overridden from View:
- virtual AccessibilityTypes::Role GetAccessibleRole();
- virtual View* GetSelectedViewForGroup(int group_id);
- virtual bool IsGroupFocusTraversable() const;
- virtual void OnMouseReleased(const MouseEvent& event, bool canceled);
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
+ virtual View* GetSelectedViewForGroup(int group_id) OVERRIDE;
+ virtual bool IsGroupFocusTraversable() const OVERRIDE;
+ virtual void OnMouseReleased(const MouseEvent& event, bool canceled)
+ OVERRIDE;
protected:
- virtual std::string GetClassName() const;
+ // Overridden from View:
+ virtual std::string GetClassName() const OVERRIDE;
// Overridden from NativeButton:
virtual NativeButtonWrapper* CreateWrapper();
diff --git a/views/controls/combobox/combobox.cc b/views/controls/combobox/combobox.cc
index 552c69b..e7c1700 100644
--- a/views/controls/combobox/combobox.cc
+++ b/views/controls/combobox/combobox.cc
@@ -6,10 +6,12 @@
#include "base/logging.h"
#include "base/utf_string_conversions.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/base/models/combobox_model.h"
#include "views/controls/combobox/native_combobox_wrapper.h"
#include "views/controls/native/native_view_host.h"
+#include "views/widget/widget.h"
using ui::ComboboxModel; // TODO(beng): remove
@@ -50,7 +52,14 @@ void Combobox::SelectionChanged() {
selected_item_ = native_wrapper_->GetSelectedItem();
if (listener_)
listener_->ItemChanged(this, prev_selected_item, selected_item_);
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_VALUE_CHANGED, false);
+ if (GetWidget()) {
+ GetWidget()->NotifyAccessibilityEvent(
+ this, ui::AccessibilityTypes::EVENT_VALUE_CHANGED, false);
+ }
+}
+
+void Combobox::SetAccessibleName(const string16& name) {
+ accessible_name_ = name;
}
////////////////////////////////////////////////////////////////////////////////
@@ -90,12 +99,12 @@ void Combobox::OnPaintFocusBorder(gfx::Canvas* canvas) {
View::OnPaintFocusBorder(canvas);
}
-AccessibilityTypes::Role Combobox::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_COMBOBOX;
-}
-
-string16 Combobox::GetAccessibleValue() {
- return model_->GetItemAt(selected_item_);
+void Combobox::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_COMBOBOX;
+ state->name = accessible_name_;
+ state->value = model_->GetItemAt(selected_item_);
+ state->index = selected_item();
+ state->count = model()->GetItemCount();
}
void Combobox::OnFocus() {
diff --git a/views/controls/combobox/combobox.h b/views/controls/combobox/combobox.h
index 1de06d6..c50fadd 100644
--- a/views/controls/combobox/combobox.h
+++ b/views/controls/combobox/combobox.h
@@ -58,20 +58,23 @@ class Combobox : public View {
// Accessor for |model_|.
ComboboxModel* model() const { return model_; }
+ // Set the accessible name of the combo box.
+ void SetAccessibleName(const string16& name);
+
// Overridden from View:
- virtual gfx::Size GetPreferredSize();
- virtual void Layout();
- virtual void SetEnabled(bool enabled);
- virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& e);
- virtual void OnPaintFocusBorder(gfx::Canvas* canvas);
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
- virtual string16 GetAccessibleValue() OVERRIDE;
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
+ virtual void Layout() OVERRIDE;
+ virtual void SetEnabled(bool enabled) OVERRIDE;
+ virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& e) OVERRIDE;
+ virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
- virtual void OnFocus();
+ // Overridden from View:
+ virtual void OnFocus() OVERRIDE;
virtual void ViewHierarchyChanged(bool is_add, View* parent,
- View* child);
- virtual std::string GetClassName() const;
+ View* child) OVERRIDE;
+ virtual std::string GetClassName() const OVERRIDE;
// The object that actually implements the native combobox.
NativeComboboxWrapper* native_wrapper_;
@@ -86,6 +89,9 @@ class Combobox : public View {
// The current selection.
int selected_item_;
+ // The accessible name of the text field.
+ string16 accessible_name_;
+
DISALLOW_COPY_AND_ASSIGN(Combobox);
};
diff --git a/views/controls/image_view.cc b/views/controls/image_view.cc
index 7f05e97..bc86e55 100644
--- a/views/controls/image_view.cc
+++ b/views/controls/image_view.cc
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "base/utf_string_conversions.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/insets.h"
@@ -126,8 +127,9 @@ void ImageView::OnPaint(gfx::Canvas* canvas) {
}
}
-AccessibilityTypes::Role ImageView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_GRAPHIC;
+void ImageView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_GRAPHIC;
+ state->name = tooltip_text_;
}
void ImageView::SetHorizontalAlignment(Alignment ha) {
@@ -154,7 +156,6 @@ ImageView::Alignment ImageView::GetVerticalAlignment() {
void ImageView::SetTooltipText(const std::wstring& tooltip) {
tooltip_text_ = WideToUTF16Hack(tooltip);
- SetAccessibleName(WideToUTF16Hack(tooltip));
}
std::wstring ImageView::GetTooltipText() {
diff --git a/views/controls/image_view.h b/views/controls/image_view.h
index b1791ac..cde4bfd 100644
--- a/views/controls/image_view.h
+++ b/views/controls/image_view.h
@@ -75,10 +75,11 @@ class ImageView : public View {
std::wstring GetTooltipText();
// Overriden from View
- virtual gfx::Size GetPreferredSize();
- virtual void OnPaint(gfx::Canvas* canvas);
- virtual AccessibilityTypes::Role GetAccessibleRole();
- virtual bool GetTooltipText(const gfx::Point& p, std::wstring* tooltip);
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
+ virtual bool GetTooltipText(const gfx::Point& p, std::wstring* tooltip)
+ OVERRIDE;
private:
// Compute the image origin given the desired size and the receiver alignment
diff --git a/views/controls/label.cc b/views/controls/label.cc
index a428bcd..21510af 100644
--- a/views/controls/label.cc
+++ b/views/controls/label.cc
@@ -12,6 +12,7 @@
#include "base/string_split.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/text/text_elider.h"
#include "ui/gfx/canvas_skia.h"
@@ -106,7 +107,6 @@ void Label::SetText(const std::wstring& text) {
text_ = WideToUTF16Hack(text);
url_set_ = false;
text_size_valid_ = false;
- SetAccessibleName(WideToUTF16Hack(text));
PreferredSizeChanged();
SchedulePaint();
}
@@ -258,12 +258,10 @@ void Label::SizeToFit(int max_width) {
SizeToPreferredSize();
}
-AccessibilityTypes::Role Label::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_STATICTEXT;
-}
-
-AccessibilityTypes::State Label::GetAccessibleState() {
- return AccessibilityTypes::STATE_READONLY;
+void Label::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_STATICTEXT;
+ state->state = ui::AccessibilityTypes::STATE_READONLY;
+ state->name = text_;
}
void Label::SetHasFocusBorder(bool has_focus_border) {
diff --git a/views/controls/label.h b/views/controls/label.h
index a3bef8f..0a2118e 100644
--- a/views/controls/label.h
+++ b/views/controls/label.h
@@ -76,7 +76,7 @@ class Label : public View {
virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE;
// Set the font.
- void SetFont(const gfx::Font& font);
+ virtual void SetFont(const gfx::Font& font);
// Set the label text.
void SetText(const std::wstring& text);
@@ -177,8 +177,7 @@ class Label : public View {
void SizeToFit(int max_width);
// Accessibility accessors, overridden from View.
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
- virtual AccessibilityTypes::State GetAccessibleState() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Gets/sets the flag to determine whether the label should be collapsed when
// it's hidden (not visible). If this flag is true, the label will return a
diff --git a/views/controls/label_unittest.cc b/views/controls/label_unittest.cc
index 6d2ba91..a7b2ac2 100644
--- a/views/controls/label_unittest.cc
+++ b/views/controls/label_unittest.cc
@@ -5,6 +5,7 @@
#include "base/i18n/rtl.h"
#include "base/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/canvas.h"
#include "views/border.h"
@@ -159,13 +160,11 @@ TEST(LabelTest, Accessibility) {
string16 test_text(ASCIIToUTF16("My special text."));
label.SetText(UTF16ToWideHack(test_text));
- EXPECT_EQ(AccessibilityTypes::ROLE_STATICTEXT, label.GetAccessibleRole());
-
- string16 name;
- EXPECT_TRUE(label.GetAccessibleName(&name));
- EXPECT_EQ(test_text, name);
-
- EXPECT_TRUE(AccessibilityTypes::STATE_READONLY & label.GetAccessibleState());
+ ui::AccessibleViewState state;
+ label.GetAccessibleState(&state);
+ EXPECT_EQ(ui::AccessibilityTypes::ROLE_STATICTEXT, state.role);
+ EXPECT_EQ(test_text, state.name);
+ EXPECT_TRUE(ui::AccessibilityTypes::STATE_READONLY & state.state);
}
TEST(LabelTest, SingleLineSizing) {
diff --git a/views/controls/link.cc b/views/controls/link.cc
index de7512b..c6e22f1 100644
--- a/views/controls/link.cc
+++ b/views/controls/link.cc
@@ -9,6 +9,7 @@
#endif
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/font.h"
@@ -148,8 +149,9 @@ bool Link::SkipDefaultKeyEventProcessing(const KeyEvent& e) {
(e.key_code() == ui::VKEY_RETURN);
}
-AccessibilityTypes::Role Link::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_LINK;
+void Link::GetAccessibleState(ui::AccessibleViewState* state) {
+ Label::GetAccessibleState(state);
+ state->role = ui::AccessibilityTypes::ROLE_LINK;
}
void Link::SetFont(const gfx::Font& font) {
diff --git a/views/controls/link.h b/views/controls/link.h
index 4c9cb8f..e616317 100644
--- a/views/controls/link.h
+++ b/views/controls/link.h
@@ -46,16 +46,16 @@ class Link : public Label {
const LinkController* GetController();
// Overridden from View:
- virtual bool OnMousePressed(const MouseEvent& event);
- virtual bool OnMouseDragged(const MouseEvent& event);
+ virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
+ virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE;
virtual void OnMouseReleased(const MouseEvent& event,
- bool canceled);
- virtual bool OnKeyPressed(const KeyEvent& e);
- virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& e);
+ bool canceled) OVERRIDE;
+ virtual bool OnKeyPressed(const KeyEvent& e) OVERRIDE;
+ virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& e) OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
- // Accessibility accessors, overridden from View:
- virtual AccessibilityTypes::Role GetAccessibleRole();
- virtual void SetFont(const gfx::Font& font);
+ // Overridden from Label:
+ virtual void SetFont(const gfx::Font& font) OVERRIDE;
// Set whether the link is enabled.
virtual void SetEnabled(bool f);
diff --git a/views/controls/menu/menu_controller.cc b/views/controls/menu/menu_controller.cc
index c192e42..62f41e5 100644
--- a/views/controls/menu/menu_controller.cc
+++ b/views/controls/menu/menu_controller.cc
@@ -766,8 +766,10 @@ void MenuController::SetSelection(MenuItemView* menu_item,
// Notify an accessibility focus event on all menu items except for the root.
if (menu_item &&
(MenuDepth(menu_item) != 1 ||
- menu_item->GetType() != MenuItemView::SUBMENU))
- menu_item->NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS);
+ menu_item->GetType() != MenuItemView::SUBMENU)) {
+ menu_item->GetWidget()->NotifyAccessibilityEvent(
+ menu_item, ui::AccessibilityTypes::EVENT_FOCUS, true);
+ }
}
// static
diff --git a/views/controls/menu/menu_item_view.cc b/views/controls/menu/menu_item_view.cc
index d1fd85af..3ff7f2b 100644
--- a/views/controls/menu/menu_item_view.cc
+++ b/views/controls/menu/menu_item_view.cc
@@ -6,6 +6,7 @@
#include "base/utf_string_conversions.h"
#include "grit/app_strings.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/models/menu_model.h"
#include "ui/gfx/canvas.h"
@@ -116,27 +117,23 @@ bool MenuItemView::GetTooltipText(const gfx::Point& p, std::wstring* tooltip) {
return false;
}
-AccessibilityTypes::Role MenuItemView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_MENUITEM;
-}
-
-AccessibilityTypes::State MenuItemView::GetAccessibleState() {
- int state = 0;
+void MenuItemView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_MENUITEM;
+ state->name = accessible_name_;
switch (GetType()) {
case SUBMENU:
- state |= AccessibilityTypes::STATE_HASPOPUP;
+ state->state |= ui::AccessibilityTypes::STATE_HASPOPUP;
break;
case CHECKBOX:
case RADIO:
- state |= GetDelegate()->IsItemChecked(GetCommand()) ?
- AccessibilityTypes::STATE_CHECKED : 0;
+ state->state |= GetDelegate()->IsItemChecked(GetCommand()) ?
+ ui::AccessibilityTypes::STATE_CHECKED : 0;
break;
case NORMAL:
case SEPARATOR:
// No additional accessibility states currently for these menu states.
break;
}
- return state;
}
// static
@@ -328,7 +325,7 @@ SubmenuView* MenuItemView::GetSubmenu() const {
void MenuItemView::SetTitle(const std::wstring& title) {
title_ = WideToUTF16Hack(title);
- SetAccessibleName(GetAccessibleNameForMenuItem(title_, GetAcceleratorText()));
+ accessible_name_ = GetAccessibleNameForMenuItem(title_, GetAcceleratorText());
pref_size_.SetSize(0, 0); // Triggers preferred size recalculation.
}
diff --git a/views/controls/menu/menu_item_view.h b/views/controls/menu/menu_item_view.h
index 128852f..73304cd 100644
--- a/views/controls/menu/menu_item_view.h
+++ b/views/controls/menu/menu_item_view.h
@@ -93,9 +93,9 @@ class MenuItemView : public View {
virtual ~MenuItemView();
// Overridden from View:
- virtual bool GetTooltipText(const gfx::Point& p, std::wstring* tooltip);
- virtual AccessibilityTypes::Role GetAccessibleRole();
- virtual AccessibilityTypes::State GetAccessibleState();
+ virtual bool GetTooltipText(const gfx::Point& p, std::wstring* tooltip)
+ OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Returns the preferred height of menu items. This is only valid when the
// menu is about to be shown.
@@ -392,6 +392,9 @@ class MenuItemView : public View {
// Title.
string16 title_;
+ // Accessible name (doesn't include accelerators, etc.).
+ string16 accessible_name_;
+
// Icon.
SkBitmap icon_;
diff --git a/views/controls/menu/menu_scroll_view_container.cc b/views/controls/menu/menu_scroll_view_container.cc
index 28ce10a..0797522 100644
--- a/views/controls/menu/menu_scroll_view_container.cc
+++ b/views/controls/menu/menu_scroll_view_container.cc
@@ -10,6 +10,7 @@
#include <Vssym32.h>
#endif
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/gfx/canvas_skia.h"
#include "ui/gfx/color_utils.h"
#include "views/border.h"
@@ -162,7 +163,8 @@ class MenuScrollViewContainer::MenuScrollView : public View {
// MenuScrollViewContainer ----------------------------------------------------
-MenuScrollViewContainer::MenuScrollViewContainer(SubmenuView* content_view) {
+MenuScrollViewContainer::MenuScrollViewContainer(SubmenuView* content_view)
+ : content_view_(content_view) {
scroll_up_button_ = new MenuScrollButton(content_view, true);
scroll_down_button_ = new MenuScrollButton(content_view, false);
AddChildView(scroll_up_button_);
@@ -259,14 +261,16 @@ gfx::Size MenuScrollViewContainer::GetPreferredSize() {
return prefsize;
}
-AccessibilityTypes::Role MenuScrollViewContainer::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_MENUBAR;
-}
+void MenuScrollViewContainer::GetAccessibleState(
+ ui::AccessibleViewState* state) {
+ // Get the name from the submenu view.
+ content_view_->GetAccessibleState(state);
-AccessibilityTypes::State MenuScrollViewContainer::GetAccessibleState() {
+ // Now change the role.
+ state->role = ui::AccessibilityTypes::ROLE_MENUBAR;
// Some AT (like NVDA) will not process focus events on menu item children
// unless a parent claims to be focused.
- return AccessibilityTypes::STATE_FOCUSED;
+ state->state = ui::AccessibilityTypes::STATE_FOCUSED;
}
void MenuScrollViewContainer::OnBoundsChanged(
diff --git a/views/controls/menu/menu_scroll_view_container.h b/views/controls/menu/menu_scroll_view_container.h
index d6ca679..a94b50d 100644
--- a/views/controls/menu/menu_scroll_view_container.h
+++ b/views/controls/menu/menu_scroll_view_container.h
@@ -27,8 +27,7 @@ class MenuScrollViewContainer : public View {
virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE;
virtual void Layout() OVERRIDE;
virtual gfx::Size GetPreferredSize() OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
- virtual AccessibilityTypes::State GetAccessibleState() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
// View override.
@@ -44,6 +43,9 @@ class MenuScrollViewContainer : public View {
// The scroll view.
MenuScrollView* scroll_view_;
+ // The content view.
+ SubmenuView* content_view_;
+
DISALLOW_COPY_AND_ASSIGN(MenuScrollViewContainer);
};
diff --git a/views/controls/menu/submenu_view.cc b/views/controls/menu/submenu_view.cc
index 9e2214a..e6d11bd 100644
--- a/views/controls/menu/submenu_view.cc
+++ b/views/controls/menu/submenu_view.cc
@@ -4,12 +4,14 @@
#include "views/controls/menu/submenu_view.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/gfx/canvas.h"
#include "views/controls/menu/menu_config.h"
#include "views/controls/menu/menu_controller.h"
#include "views/controls/menu/menu_host.h"
#include "views/controls/menu/menu_scroll_view_container.h"
#include "views/widget/root_view.h"
+#include "views/widget/widget.h"
// Height of the drop indicator. This should be an even number.
static const int kDropIndicatorHeight = 2;
@@ -121,8 +123,11 @@ gfx::Size SubmenuView::GetPreferredSize() {
height + insets.height());
}
-AccessibilityTypes::Role SubmenuView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_MENUPOPUP;
+void SubmenuView::GetAccessibleState(ui::AccessibleViewState* state) {
+ // Inherit most of the state from the parent menu item, except the role.
+ if (GetMenuItem())
+ GetMenuItem()->GetAccessibleState(state);
+ state->role = ui::AccessibilityTypes::ROLE_MENUPOPUP;
}
void SubmenuView::PaintChildren(gfx::Canvas* canvas) {
@@ -225,10 +230,14 @@ void SubmenuView::ShowAt(gfx::NativeWindow parent,
if (host_) {
host_->ShowMenuHost(do_capture);
- GetScrollViewContainer()->NotifyAccessibilityEvent(
- AccessibilityTypes::EVENT_MENUSTART);
-
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_MENUPOPUPSTART);
+ GetScrollViewContainer()->GetWidget()->NotifyAccessibilityEvent(
+ GetScrollViewContainer(),
+ ui::AccessibilityTypes::EVENT_MENUSTART,
+ true);
+ GetWidget()->NotifyAccessibilityEvent(
+ this,
+ ui::AccessibilityTypes::EVENT_MENUPOPUPSTART,
+ true);
return;
}
@@ -239,10 +248,14 @@ void SubmenuView::ShowAt(gfx::NativeWindow parent,
ScrollRectToVisible(gfx::Rect(gfx::Point(), gfx::Size(1, 1)));
host_->InitMenuHost(parent, bounds, scroll_view_container_, do_capture);
- GetScrollViewContainer()->NotifyAccessibilityEvent(
- AccessibilityTypes::EVENT_MENUSTART);
-
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_MENUPOPUPSTART);
+ GetScrollViewContainer()->GetWidget()->NotifyAccessibilityEvent(
+ GetScrollViewContainer(),
+ ui::AccessibilityTypes::EVENT_MENUSTART,
+ true);
+ GetWidget()->NotifyAccessibilityEvent(
+ this,
+ ui::AccessibilityTypes::EVENT_MENUPOPUPSTART,
+ true);
}
void SubmenuView::Reposition(const gfx::Rect& bounds) {
@@ -252,10 +265,14 @@ void SubmenuView::Reposition(const gfx::Rect& bounds) {
void SubmenuView::Close() {
if (host_) {
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_MENUPOPUPEND);
-
- GetScrollViewContainer()->NotifyAccessibilityEvent(
- AccessibilityTypes::EVENT_MENUEND);
+ GetWidget()->NotifyAccessibilityEvent(
+ this,
+ ui::AccessibilityTypes::EVENT_MENUPOPUPEND,
+ true);
+ GetScrollViewContainer()->GetWidget()->NotifyAccessibilityEvent(
+ GetScrollViewContainer(),
+ ui::AccessibilityTypes::EVENT_MENUEND,
+ true);
host_->DestroyMenuHost();
host_ = NULL;
@@ -300,12 +317,6 @@ MenuScrollViewContainer* SubmenuView::GetScrollViewContainer() {
scroll_view_container_ = new MenuScrollViewContainer(this);
// Otherwise MenuHost would delete us.
scroll_view_container_->set_parent_owned(false);
-
- // Use the parent menu item accessible name for the menu view.
- string16 accessible_name;
- GetMenuItem()->GetAccessibleName(&accessible_name);
- scroll_view_container_->SetAccessibleName(accessible_name);
- SetAccessibleName(accessible_name);
}
return scroll_view_container_;
}
diff --git a/views/controls/menu/submenu_view.h b/views/controls/menu/submenu_view.h
index 61e42b5..8eb41f2 100644
--- a/views/controls/menu/submenu_view.h
+++ b/views/controls/menu/submenu_view.h
@@ -54,7 +54,7 @@ class SubmenuView : public View {
virtual gfx::Size GetPreferredSize() OVERRIDE;
// Override from View.
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Painting.
virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE;
@@ -64,7 +64,7 @@ class SubmenuView : public View {
int* formats,
std::set<OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
virtual bool AreDropTypesRequired() OVERRIDE;
- virtual bool CanDrop(const OSExchangeData& data);
+ virtual bool CanDrop(const OSExchangeData& data) OVERRIDE;
virtual void OnDragEntered(const DropTargetEvent& event) OVERRIDE;
virtual int OnDragUpdated(const DropTargetEvent& event) OVERRIDE;
virtual void OnDragExited() OVERRIDE;
diff --git a/views/controls/native/native_view_host.cc b/views/controls/native/native_view_host.cc
index 73ecb64..6a00743 100644
--- a/views/controls/native/native_view_host.cc
+++ b/views/controls/native/native_view_host.cc
@@ -180,7 +180,8 @@ std::string NativeViewHost::GetClassName() const {
void NativeViewHost::OnFocus() {
native_wrapper_->SetFocus();
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS);
+ GetWidget()->NotifyAccessibilityEvent(
+ this, ui::AccessibilityTypes::EVENT_FOCUS, true);
}
bool NativeViewHost::ContainsNativeView(gfx::NativeView native_view) const {
diff --git a/views/controls/native_control.cc b/views/controls/native_control.cc
index 34e243e..7dd01f3 100644
--- a/views/controls/native_control.cc
+++ b/views/controls/native_control.cc
@@ -12,6 +12,7 @@
#include "base/logging.h"
#include "base/scoped_ptr.h"
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/base/keycodes/keyboard_code_conversion_win.h"
#include "ui/base/l10n/l10n_util_win.h"
@@ -281,7 +282,10 @@ void NativeControl::OnFocus() {
if (container_) {
DCHECK(container_->GetControl());
::SetFocus(container_->GetControl());
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS, false);
+ if (GetWidget()) {
+ GetWidget()->NotifyAccessibilityEvent(
+ this, ui::AccessibilityTypes::EVENT_FOCUS, false);
+ }
}
}
diff --git a/views/controls/native_control_gtk.cc b/views/controls/native_control_gtk.cc
index a17c4cb..88035c1 100644
--- a/views/controls/native_control_gtk.cc
+++ b/views/controls/native_control_gtk.cc
@@ -7,7 +7,9 @@
#include <gtk/gtk.h>
#include "base/logging.h"
+#include "ui/base/accessibility/accessibility_types.h"
#include "views/focus/focus_manager.h"
+#include "views/widget/widget.h"
namespace views {
@@ -66,8 +68,8 @@ void NativeControlGtk::VisibilityChanged(View* starting_from, bool is_visible) {
void NativeControlGtk::OnFocus() {
DCHECK(native_view());
gtk_widget_grab_focus(native_view());
-
- parent()->NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS);
+ GetWidget()->NotifyAccessibilityEvent(
+ parent(), ui::AccessibilityTypes::EVENT_FOCUS, true);
}
void NativeControlGtk::NativeControlCreated(GtkWidget* native_control) {
diff --git a/views/controls/native_control_win.cc b/views/controls/native_control_win.cc
index 7e7312b..76bc5aa 100644
--- a/views/controls/native_control_win.cc
+++ b/views/controls/native_control_win.cc
@@ -7,10 +7,12 @@
#include <windowsx.h>
#include "base/logging.h"
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/base/l10n/l10n_util_win.h"
#include "ui/base/view_prop.h"
#include "ui/base/win/hwnd_util.h"
#include "views/focus/focus_manager.h"
+#include "views/widget/widget.h"
using ui::ViewProp;
@@ -112,8 +114,10 @@ void NativeControlWin::OnFocus() {
parent_view->HasFocus();
// Send the accessibility focus notification.
- parent_view->NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS,
- send_native_event);
+ if (parent_view->GetWidget()) {
+ parent_view->GetWidget()->NotifyAccessibilityEvent(
+ parent_view, ui::AccessibilityTypes::EVENT_FOCUS, send_native_event);
+ }
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/views/controls/progress_bar.cc b/views/controls/progress_bar.cc
index a6aabb1..e460e27 100644
--- a/views/controls/progress_bar.cc
+++ b/views/controls/progress_bar.cc
@@ -11,6 +11,7 @@
#include "base/utf_string_conversions.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
#include "third_party/skia/include/effects/SkBlurMaskFilter.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/gfx/canvas_skia.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/font.h"
@@ -310,12 +311,9 @@ void ProgressBar::SetEnabled(bool enabled) {
// TODO(denisromanov): Need to switch progress bar color here?
}
-AccessibilityTypes::Role ProgressBar::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_PROGRESSBAR;
-}
-
-AccessibilityTypes::State ProgressBar::GetAccessibleState() {
- return AccessibilityTypes::STATE_READONLY;
+void ProgressBar::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_PROGRESSBAR;
+ state->state = ui::AccessibilityTypes::STATE_READONLY;
}
} // namespace views
diff --git a/views/controls/progress_bar.h b/views/controls/progress_bar.h
index b2f1202..4366519 100644
--- a/views/controls/progress_bar.h
+++ b/views/controls/progress_bar.h
@@ -52,14 +52,14 @@ class ProgressBar : public View {
virtual void SetTooltipText(const std::wstring& tooltip_text);
// Gets the tooltip text if has been specified with SetTooltipText().
- virtual bool GetTooltipText(const gfx::Point& p, std::wstring* tooltip);
+ virtual bool GetTooltipText(const gfx::Point& p, std::wstring* tooltip)
+ OVERRIDE;
// Sets the enabled state.
- virtual void SetEnabled(bool enabled);
+ virtual void SetEnabled(bool enabled) OVERRIDE;
// Accessibility accessors, overridden from View.
- virtual AccessibilityTypes::Role GetAccessibleRole();
- virtual AccessibilityTypes::State GetAccessibleState();
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Maximum value of progress.
static const int kMaxProgress;
diff --git a/views/controls/progress_bar_unittest.cc b/views/controls/progress_bar_unittest.cc
index 55acfd4..c7fc4df 100644
--- a/views/controls/progress_bar_unittest.cc
+++ b/views/controls/progress_bar_unittest.cc
@@ -5,6 +5,7 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "views/controls/progress_bar.h"
namespace views {
@@ -48,17 +49,11 @@ TEST(ProgressBarTest, Accessibility) {
ProgressBar bar;
bar.SetProgress(62);
- EXPECT_EQ(AccessibilityTypes::ROLE_PROGRESSBAR, bar.GetAccessibleRole());
-
- string16 name;
- EXPECT_FALSE(bar.GetAccessibleName(&name));
- EXPECT_EQ(string16(), name);
- string16 accessible_name = ASCIIToUTF16("My progress bar");
- bar.SetAccessibleName(accessible_name);
- EXPECT_TRUE(bar.GetAccessibleName(&name));
- EXPECT_EQ(accessible_name, name);
-
- EXPECT_TRUE(AccessibilityTypes::STATE_READONLY & bar.GetAccessibleState());
+ ui::AccessibleViewState state;
+ bar.GetAccessibleState(&state);
+ EXPECT_EQ(ui::AccessibilityTypes::ROLE_PROGRESSBAR, state.role);
+ EXPECT_EQ(string16(), state.name);
+ EXPECT_TRUE(ui::AccessibilityTypes::STATE_READONLY & state.state);
}
} // namespace views
diff --git a/views/controls/resize_area.cc b/views/controls/resize_area.cc
index b3897bb..0769cf9 100644
--- a/views/controls/resize_area.cc
+++ b/views/controls/resize_area.cc
@@ -5,6 +5,7 @@
#include "views/controls/resize_area.h"
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/resource/resource_bundle.h"
#if defined(OS_LINUX)
@@ -74,8 +75,8 @@ void ResizeArea::OnMouseReleased(const views::MouseEvent& event,
ReportResizeAmount(canceled ? initial_position_ : event.x(), true);
}
-AccessibilityTypes::Role ResizeArea::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_SEPARATOR;
+void ResizeArea::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_SEPARATOR;
}
void ResizeArea::ReportResizeAmount(int resize_amount, bool last_update) {
diff --git a/views/controls/resize_area.h b/views/controls/resize_area.h
index 9adb60c..cf9bea7 100644
--- a/views/controls/resize_area.h
+++ b/views/controls/resize_area.h
@@ -41,13 +41,14 @@ class ResizeArea : public View {
virtual ~ResizeArea();
// Overridden from views::View:
- virtual std::string GetClassName() const;
+ virtual std::string GetClassName() const OVERRIDE;
virtual gfx::NativeCursor GetCursorForPoint(ui::EventType event_type,
- const gfx::Point& p);
- virtual bool OnMousePressed(const views::MouseEvent& event);
- virtual bool OnMouseDragged(const views::MouseEvent& event);
- virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled);
- virtual AccessibilityTypes::Role GetAccessibleRole();
+ const gfx::Point& p) OVERRIDE;
+ virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE;
+ virtual bool OnMouseDragged(const views::MouseEvent& event) OVERRIDE;
+ virtual void OnMouseReleased(const views::MouseEvent& event, bool canceled)
+ OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
private:
// Report the amount the user resized by to the delegate, accounting for
diff --git a/views/controls/scrollbar/scroll_bar.cc b/views/controls/scrollbar/scroll_bar.cc
index 94360bb..880a42a 100644
--- a/views/controls/scrollbar/scroll_bar.cc
+++ b/views/controls/scrollbar/scroll_bar.cc
@@ -5,6 +5,7 @@
#include "views/controls/scrollbar/scroll_bar.h"
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
namespace views {
@@ -22,8 +23,8 @@ ScrollBar::ScrollBar(bool is_horiz) : is_horiz_(is_horiz),
ScrollBar::~ScrollBar() {
}
-AccessibilityTypes::Role ScrollBar::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_SCROLLBAR;
+void ScrollBar::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_SCROLLBAR;
}
bool ScrollBar::IsHorizontal() const {
diff --git a/views/controls/scrollbar/scroll_bar.h b/views/controls/scrollbar/scroll_bar.h
index faed881..d7f187b 100644
--- a/views/controls/scrollbar/scroll_bar.h
+++ b/views/controls/scrollbar/scroll_bar.h
@@ -60,7 +60,7 @@ class ScrollBar : public View {
virtual ~ScrollBar();
// Overridden from View:
- virtual AccessibilityTypes::Role GetAccessibleRole();
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Return whether this scrollbar is horizontal
bool IsHorizontal() const;
diff --git a/views/controls/separator.cc b/views/controls/separator.cc
index 1a3ca70..bc1f522 100644
--- a/views/controls/separator.cc
+++ b/views/controls/separator.cc
@@ -5,6 +5,7 @@
#include "views/controls/separator.h"
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#if defined(OS_LINUX)
#include "views/controls/native_control_gtk.h"
#elif defined(OS_WIN)
@@ -92,8 +93,8 @@ std::string Separator::GetClassName() const {
return kViewClassName;
}
-AccessibilityTypes::Role Separator::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_SEPARATOR;
+void Separator::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_SEPARATOR;
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/views/controls/separator.h b/views/controls/separator.h
index 186d84f..6c4d9c4 100644
--- a/views/controls/separator.h
+++ b/views/controls/separator.h
@@ -24,14 +24,15 @@ class Separator : public View {
virtual ~Separator();
// Overridden from View:
- virtual void Layout();
- virtual gfx::Size GetPreferredSize();
- virtual AccessibilityTypes::Role GetAccessibleRole();
+ virtual void Layout() OVERRIDE;
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
+ // Overridden from View:
virtual void ViewHierarchyChanged(bool is_add, View* parent,
- View* child);
- virtual std::string GetClassName() const;
+ View* child) OVERRIDE;
+ virtual std::string GetClassName() const OVERRIDE;
private:
void CreateNativeWrapper();
diff --git a/views/controls/single_split_view.cc b/views/controls/single_split_view.cc
index 7522667..76e924e 100644
--- a/views/controls/single_split_view.cc
+++ b/views/controls/single_split_view.cc
@@ -9,6 +9,7 @@
#endif
#include "skia/ext/skia_utils_win.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/gfx/canvas.h"
#include "views/background.h"
@@ -58,8 +59,9 @@ void SingleSplitView::Layout() {
View::Layout();
}
-AccessibilityTypes::Role SingleSplitView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_GROUPING;
+void SingleSplitView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_GROUPING;
+ state->name = accessible_name_;
}
gfx::Size SingleSplitView::GetPreferredSize() {
@@ -143,6 +145,10 @@ void SingleSplitView::CalculateChildrenBounds(
}
}
+void SingleSplitView::SetAccessibleName(const string16& name) {
+ accessible_name_ = name;
+}
+
bool SingleSplitView::OnMousePressed(const MouseEvent& event) {
if (!IsPointInDivider(event.location()))
return false;
diff --git a/views/controls/single_split_view.h b/views/controls/single_split_view.h
index 5b7f477..de4ccf5 100644
--- a/views/controls/single_split_view.h
+++ b/views/controls/single_split_view.h
@@ -41,7 +41,7 @@ class SingleSplitView : public views::View {
virtual void Layout() OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// SingleSplitView's preferred size is the sum of the preferred widths
// and the max of the heights.
@@ -74,6 +74,8 @@ class SingleSplitView : public views::View {
gfx::Rect* leading_bounds,
gfx::Rect* trailing_bounds) const;
+ void SetAccessibleName(const string16& name);
+
protected:
// View overrides.
virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE;
@@ -129,6 +131,9 @@ class SingleSplitView : public views::View {
// Observer to notify about user initiated handle movements. Not own by us.
Observer* observer_;
+ // The accessible name of this view.
+ string16 accessible_name_;
+
DISALLOW_COPY_AND_ASSIGN(SingleSplitView);
};
diff --git a/views/controls/tabbed_pane/tabbed_pane.cc b/views/controls/tabbed_pane/tabbed_pane.cc
index eb9f971..1091407 100644
--- a/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/views/controls/tabbed_pane/tabbed_pane.cc
@@ -5,11 +5,13 @@
#include "views/controls/tabbed_pane/tabbed_pane.h"
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
// TODO(avi): remove when not needed
#include "base/utf_string_conversions.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "views/controls/native/native_view_host.h"
#include "views/controls/tabbed_pane/native_tabbed_pane_wrapper.h"
+#include "views/widget/widget.h"
namespace views {
@@ -38,7 +40,6 @@ void TabbedPane::AddTabAtIndex(int index,
bool select_if_first_tab) {
native_tabbed_pane_->AddTabAtIndex(index, title, contents,
select_if_first_tab);
- contents->SetAccessibleName(WideToUTF16Hack(title));
PreferredSizeChanged();
}
@@ -60,6 +61,10 @@ void TabbedPane::SelectTabAt(int index) {
native_tabbed_pane_->SelectTabAt(index);
}
+void TabbedPane::SetAccessibleName(const string16& name) {
+ accessible_name_ = name;
+}
+
int TabbedPane::GetTabCount() {
return native_tabbed_pane_->GetTabCount();
}
@@ -118,8 +123,10 @@ void TabbedPane::OnFocus() {
native_tabbed_pane_->SetFocus();
View* selected_tab = GetSelectedTab();
- if (selected_tab)
- selected_tab->NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS);
+ if (selected_tab) {
+ selected_tab->GetWidget()->NotifyAccessibilityEvent(
+ selected_tab, ui::AccessibilityTypes::EVENT_FOCUS, true);
+ }
}
else
View::OnFocus(); // Will focus the RootView window (so we still get
@@ -131,8 +138,9 @@ void TabbedPane::OnPaintFocusBorder(gfx::Canvas* canvas) {
View::OnPaintFocusBorder(canvas);
}
-AccessibilityTypes::Role TabbedPane::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_PAGETABLIST;
+void TabbedPane::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_PAGETABLIST;
+ state->name = accessible_name_;
}
gfx::Size TabbedPane::GetPreferredSize() {
diff --git a/views/controls/tabbed_pane/tabbed_pane.h b/views/controls/tabbed_pane/tabbed_pane.h
index 4fdb727..a968d36 100644
--- a/views/controls/tabbed_pane/tabbed_pane.h
+++ b/views/controls/tabbed_pane/tabbed_pane.h
@@ -14,7 +14,6 @@ class NativeTabbedPaneWrapper;
// The TabbedPane class is a view that shows tabs. When the user clicks on a
// tab, the associated view is displayed.
-
class TabbedPane : public View {
public:
TabbedPane();
@@ -63,16 +62,20 @@ class TabbedPane : public View {
Listener* listener() const { return listener_; }
+ void SetAccessibleName(const string16& name);
+
// View overrides:
- virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child);
+ virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child)
+ OVERRIDE;
// Handles Ctrl+Tab and Ctrl+Shift+Tab navigation of pages.
- virtual bool AcceleratorPressed(const views::Accelerator& accelerator);
- virtual std::string GetClassName() const;
- virtual void Layout();
- virtual void OnFocus();
- virtual void OnPaintFocusBorder(gfx::Canvas* canvas);
- virtual AccessibilityTypes::Role GetAccessibleRole();
- virtual gfx::Size GetPreferredSize();
+ virtual bool AcceleratorPressed(const views::Accelerator& accelerator)
+ OVERRIDE;
+ virtual std::string GetClassName() const OVERRIDE;
+ virtual void Layout() OVERRIDE;
+ virtual void OnFocus() OVERRIDE;
+ virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
NativeTabbedPaneWrapper* native_wrapper() const {
return native_tabbed_pane_;
@@ -96,6 +99,9 @@ class TabbedPane : public View {
// The listener we notify about tab selection changes.
Listener* listener_;
+ // The accessible name of this view.
+ string16 accessible_name_;
+
DISALLOW_COPY_AND_ASSIGN(TabbedPane);
};
diff --git a/views/controls/textfield/native_textfield_gtk.cc b/views/controls/textfield/native_textfield_gtk.cc
index 918b207..a71d679 100644
--- a/views/controls/textfield/native_textfield_gtk.cc
+++ b/views/controls/textfield/native_textfield_gtk.cc
@@ -433,7 +433,8 @@ gboolean NativeTextfieldGtk::OnChanged() {
TextfieldController* controller = textfield_->GetController();
if (controller)
controller->ContentsChanged(textfield_, GetText());
- textfield_->NotifyAccessibilityEvent(AccessibilityTypes::EVENT_TEXT_CHANGED);
+ textfield_->GetWidget()->NotifyAccessibilityEvent(
+ textfield_, ui::AccessibilityTypes::EVENT_TEXT_CHANGED, true);
return false;
}
@@ -448,7 +449,8 @@ gboolean NativeTextfieldGtk::OnMoveCursorHandler(
}
gboolean NativeTextfieldGtk::OnMoveCursor() {
- textfield_->NotifyAccessibilityEvent(AccessibilityTypes::EVENT_TEXT_CHANGED);
+ textfield_->GetWidget()->NotifyAccessibilityEvent(
+ textfield_, ui::AccessibilityTypes::EVENT_TEXT_CHANGED, true);
return false;
}
@@ -461,7 +463,8 @@ gboolean NativeTextfieldGtk::OnMouseUpHandler(
}
gboolean NativeTextfieldGtk::OnMouseUp() {
- textfield_->NotifyAccessibilityEvent(AccessibilityTypes::EVENT_TEXT_CHANGED);
+ textfield_->GetWidget()->NotifyAccessibilityEvent(
+ textfield_, ui::AccessibilityTypes::EVENT_TEXT_CHANGED, true);
return false;
}
diff --git a/views/controls/textfield/native_textfield_win.cc b/views/controls/textfield/native_textfield_win.cc
index 8296e26..443cc6e 100644
--- a/views/controls/textfield/native_textfield_win.cc
+++ b/views/controls/textfield/native_textfield_win.cc
@@ -12,6 +12,7 @@
#include "base/win/windows_version.h"
#include "grit/app_strings.h"
#include "skia/ext/skia_utils_win.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/base/keycodes/keyboard_code_conversion_win.h"
@@ -443,10 +444,11 @@ void NativeTextfieldWin::InitializeAccessibilityInfo() {
// We expect it to be a Label preceeding this view (if it exists).
string16 name;
View* label_view = parent->GetChildViewAt(label_index);
- if (label_view->GetClassName() == Label::kViewClassName &&
- label_view->GetAccessibleName(&name)) {
+ if (label_view->GetClassName() == Label::kViewClassName) {
+ ui::AccessibleViewState state;
+ label_view->GetAccessibleState(&state);
hr = pAccPropServices->SetHwndPropStr(m_hWnd, OBJID_CLIENT,
- CHILDID_SELF, PROPID_ACC_NAME, name.c_str());
+ CHILDID_SELF, PROPID_ACC_NAME, state.name.c_str());
}
}
}
diff --git a/views/controls/textfield/textfield.cc b/views/controls/textfield/textfield.cc
index b5ab72a..7716fc0 100644
--- a/views/controls/textfield/textfield.cc
+++ b/views/controls/textfield/textfield.cc
@@ -12,6 +12,7 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/gfx/insets.h"
#include "views/controls/native/native_view_host.h"
@@ -259,6 +260,10 @@ size_t Textfield::GetCursorPosition() const {
return native_wrapper_->GetCursorPosition();
}
+void Textfield::SetAccessibleName(const string16& name) {
+ accessible_name_ = name;
+}
+
////////////////////////////////////////////////////////////////////////////////
// Textfield, View overrides:
@@ -339,31 +344,20 @@ void Textfield::OnBlur() {
native_wrapper_->HandleBlur();
}
-AccessibilityTypes::Role Textfield::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_TEXT;
-}
-
-AccessibilityTypes::State Textfield::GetAccessibleState() {
- int state = 0;
+void Textfield::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_TEXT;
+ state->name = accessible_name_;
if (read_only())
- state |= AccessibilityTypes::STATE_READONLY;
+ state->state |= ui::AccessibilityTypes::STATE_READONLY;
if (IsPassword())
- state |= AccessibilityTypes::STATE_PROTECTED;
- return state;
-}
+ state->state |= ui::AccessibilityTypes::STATE_PROTECTED;
+ state->value = text_;
-void Textfield::GetSelectionBounds(int* start_index, int* end_index) {
DCHECK(native_wrapper_);
TextRange range;
native_wrapper_->GetSelectedRange(&range);
- *start_index = range.start();
- *end_index = range.end();
-}
-
-string16 Textfield::GetAccessibleValue() {
- if (!text_.empty())
- return text_;
- return string16();
+ state->selection_start = range.start();
+ state->selection_end = range.end();
}
void Textfield::SetEnabled(bool enabled) {
diff --git a/views/controls/textfield/textfield.h b/views/controls/textfield/textfield.h
index 23ec627..046919b6 100644
--- a/views/controls/textfield/textfield.h
+++ b/views/controls/textfield/textfield.h
@@ -183,6 +183,9 @@ class Textfield : public View {
// only and has to be called after the wrapper is created.
size_t GetCursorPosition() const;
+ // Set the accessible name of the text field.
+ void SetAccessibleName(const string16& name);
+
#ifdef UNIT_TEST
gfx::NativeView GetTestingHandle() const {
return native_wrapper_ ? native_wrapper_->GetTestingHandle() : NULL;
@@ -205,13 +208,7 @@ class Textfield : public View {
virtual bool OnKeyReleased(const views::KeyEvent& e) OVERRIDE;
virtual void OnFocus() OVERRIDE;
virtual void OnBlur() OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
- virtual AccessibilityTypes::State GetAccessibleState() OVERRIDE;
- virtual string16 GetAccessibleValue() OVERRIDE;
-
- // TODO(dmazzoni): Remove this when refactoring views accessibility code.
- // http://crbug.com/74988
- void GetSelectionBounds(int* start_index, int* end_index);
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
virtual void ViewHierarchyChanged(bool is_add, View* parent,
@@ -279,6 +276,9 @@ class Textfield : public View {
// Text to display when empty.
string16 text_to_display_when_empty_;
+ // The accessible name of the text field.
+ string16 accessible_name_;
+
DISALLOW_COPY_AND_ASSIGN(Textfield);
};
diff --git a/views/controls/tree/tree_view.cc b/views/controls/tree/tree_view.cc
index b0f850ff..7afb8cb 100644
--- a/views/controls/tree/tree_view.cc
+++ b/views/controls/tree/tree_view.cc
@@ -11,6 +11,7 @@
#include "base/stl_util-inl.h"
#include "base/win/win_util.h"
#include "grit/app_resources.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/base/keycodes/keyboard_code_conversion_win.h"
#include "ui/base/resource/resource_bundle.h"
@@ -54,12 +55,9 @@ TreeView::~TreeView() {
Cleanup();
}
-AccessibilityTypes::Role TreeView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_OUTLINE;
-}
-
-AccessibilityTypes::State TreeView::GetAccessibleState() {
- return AccessibilityTypes::STATE_READONLY;
+void TreeView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_OUTLINE;
+ state->state = ui::AccessibilityTypes::STATE_READONLY;
}
void TreeView::SetModel(TreeModel* model) {
diff --git a/views/controls/tree/tree_view.h b/views/controls/tree/tree_view.h
index c15207f..4f56975 100644
--- a/views/controls/tree/tree_view.h
+++ b/views/controls/tree/tree_view.h
@@ -79,8 +79,7 @@ class TreeView : public NativeControl, ui::TreeModelObserver {
}
// Overridden from View:
- virtual AccessibilityTypes::Role GetAccessibleRole();
- virtual AccessibilityTypes::State GetAccessibleState();
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Edits the specified node. This cancels the current edit and expands
// all parents of node.
diff --git a/views/test/test_views_delegate.h b/views/test/test_views_delegate.h
index 9aaee21..55febf6 100644
--- a/views/test/test_views_delegate.h
+++ b/views/test/test_views_delegate.h
@@ -6,6 +6,7 @@
#define VIEWS_TEST_TEST_VIEWS_DELEGATE_H_
#include "base/scoped_ptr.h"
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/base/clipboard/clipboard.h"
#include "views/views_delegate.h"
@@ -23,16 +24,18 @@ class TestViewsDelegate : public views::ViewsDelegate {
virtual void SaveWindowPlacement(views::Window* window,
const std::wstring& window_name,
const gfx::Rect& bounds,
- bool maximized) {
- }
+ bool maximized) OVERRIDE { }
virtual bool GetSavedWindowBounds(views::Window* window,
const std::wstring& window_name,
gfx::Rect* bounds) const;
+
virtual bool GetSavedMaximizedState(views::Window* window,
const std::wstring& window_name,
bool* maximized) const;
+
virtual void NotifyAccessibilityEvent(
- views::View* view, AccessibilityTypes::Event event_type) {}
+ views::View* view, ui::AccessibilityTypes::Event event_type) OVERRIDE {}
+
virtual void NotifyMenuItemFocused(
const std::wstring& menu_name,
const std::wstring& menu_item_name,
@@ -40,12 +43,13 @@ class TestViewsDelegate : public views::ViewsDelegate {
int item_count,
bool has_submenu) {}
#if defined(OS_WIN)
- virtual HICON GetDefaultWindowIcon() const {
+ virtual HICON GetDefaultWindowIcon() const OVERRIDE {
return NULL;
}
#endif
- virtual void AddRef() {}
- virtual void ReleaseRef() {}
+
+ virtual void AddRef() OVERRIDE {}
+ virtual void ReleaseRef() OVERRIDE {}
private:
mutable scoped_ptr<ui::Clipboard> clipboard_;
diff --git a/views/view.cc b/views/view.cc
index aede253..7a706992 100644
--- a/views/view.cc
+++ b/views/view.cc
@@ -11,6 +11,7 @@
#include "base/scoped_ptr.h"
#include "base/utf_string_conversions.h"
#include "third_party/skia/include/core/SkRect.h"
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/gfx/canvas_skia.h"
#include "ui/gfx/path.h"
@@ -26,7 +27,7 @@
#if defined(OS_WIN)
#include "base/win/scoped_gdi_object.h"
-#include "views/accessibility/view_accessibility.h"
+#include "views/accessibility/native_view_accessibility_win.h"
#endif
#if defined(OS_LINUX)
#include "ui/base/gtk/scoped_handle_gtk.h"
@@ -95,8 +96,8 @@ View::~View() {
}
#if defined(OS_WIN)
- if (view_accessibility_.get())
- view_accessibility_->set_view(NULL);
+ if (native_view_accessibility_win_.get())
+ native_view_accessibility_win_->set_view(NULL);
#endif
}
@@ -1009,45 +1010,6 @@ bool View::ExceededDragThreshold(int delta_x, int delta_y) {
abs(delta_y) > GetVerticalDragThreshold());
}
-// Accessibility ---------------------------------------------------------------
-
-void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type) {
- NotifyAccessibilityEvent(event_type, true);
-}
-
-string16 View::GetAccessibleDefaultAction() {
- return string16();
-}
-
-string16 View::GetAccessibleKeyboardShortcut() {
- return string16();
-}
-
-bool View::GetAccessibleName(string16* name) {
- DCHECK(name);
-
- if (accessible_name_.empty())
- return false;
- *name = accessible_name_;
- return true;
-}
-
-AccessibilityTypes::Role View::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_CLIENT;
-}
-
-AccessibilityTypes::State View::GetAccessibleState() {
- return 0;
-}
-
-string16 View::GetAccessibleValue() {
- return string16();
-}
-
-void View::SetAccessibleName(const string16& name) {
- accessible_name_ = name;
-}
-
// Scrolling -------------------------------------------------------------------
void View::ScrollRectToVisible(const gfx::Rect& rect) {
@@ -1179,7 +1141,8 @@ void View::OnFocus() {
// TODO(beng): Investigate whether it's possible for us to move this to
// Focus().
// Notify assistive technologies of the focus change.
- NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS);
+ GetWidget()->NotifyAccessibilityEvent(
+ this, ui::AccessibilityTypes::EVENT_FOCUS, true);
}
void View::OnBlur() {
diff --git a/views/view.h b/views/view.h
index f0939a3..d19570d 100644
--- a/views/view.h
+++ b/views/view.h
@@ -20,13 +20,11 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/rect.h"
#include "views/accelerator.h"
-#include "views/accessibility/accessibility_types.h"
#include "views/background.h"
#include "views/border.h"
using ui::OSExchangeData;
-class ViewAccessibility;
namespace gfx {
class Canvas;
@@ -35,6 +33,7 @@ class Path;
}
namespace ui {
+struct AccessibleViewState;
class ThemeProvider;
class Transform;
}
@@ -52,6 +51,10 @@ class ScrollView;
class Widget;
class Window;
+#if defined(OS_WIN)
+class NativeViewAccessibilityWin;
+#endif
+
// ContextMenuController is responsible for showing the context menu for a
// View. To use a ContextMenuController invoke SetContextMenuController on a
// View. When the appropriate user gesture occurs ShowContextMenu is invoked
@@ -529,7 +532,7 @@ class View : public AcceleratorTarget {
const Border* border() const { return border_.get(); }
// Get the theme provider from the parent widget.
- ThemeProvider* GetThemeProvider() const;
+ virtual ThemeProvider* GetThemeProvider() const;
// RTL painting --------------------------------------------------------------
@@ -870,51 +873,15 @@ class View : public AcceleratorTarget {
static bool ExceededDragThreshold(int delta_x, int delta_y);
// Accessibility -------------------------------------------------------------
- // TODO(ctguil): Move all this out to a AccessibleInfo wrapper class.
-
- // Notify the platform specific accessibility client of changes in the user
- // interface. This will always raise native notifications.
- virtual void NotifyAccessibilityEvent(AccessibilityTypes::Event event_type);
-
- // Raise an accessibility notification with an option to also raise a native
- // notification.
- virtual void NotifyAccessibilityEvent(AccessibilityTypes::Event event_type,
- bool send_native_event);
-
- // Returns the MSAA default action of the current view. The string returned
- // describes the default action that will occur when executing
- // IAccessible::DoDefaultAction. For instance, default action of a button is
- // 'Press'.
- virtual string16 GetAccessibleDefaultAction();
-
- // Returns a string containing the mnemonic, or the keyboard shortcut, for a
- // given control.
- virtual string16 GetAccessibleKeyboardShortcut();
- // Returns a brief, identifying string, containing a unique, readable name of
- // a given control. Sets the input string appropriately, and returns true if
- // successful.
- bool GetAccessibleName(string16* name);
+ // Modifies |state| to reflect the current accessible state of this view.
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) { }
- // Returns the accessibility role of the current view. The role is what
- // assistive technologies (ATs) use to determine what behavior to expect from
- // a given control.
- virtual AccessibilityTypes::Role GetAccessibleRole();
-
- // Returns the accessibility state of the current view.
- virtual AccessibilityTypes::State GetAccessibleState();
-
- // Returns the current value associated with a view.
- virtual string16 GetAccessibleValue();
-
- // Assigns a string name to the given control. Needed as a View does not know
- // which name will be associated with it until it is created to be a
- // certain type.
- void SetAccessibleName(const string16& name);
-
- // Returns an instance of the (platform-specific) accessibility interface for
- // the View.
- ViewAccessibility* GetViewAccessibility();
+#if defined(OS_WIN)
+ // Returns an instance of the Windows-specific accessibility interface
+ // for this View.
+ NativeViewAccessibilityWin* GetNativeViewAccessibilityWin();
+#endif
// Scrolling -----------------------------------------------------------------
// TODO(beng): Figure out if this can live somewhere other than View, i.e.
@@ -1400,12 +1367,9 @@ class View : public AcceleratorTarget {
// Accessibility -------------------------------------------------------------
- // Name for this view, which can be retrieved by accessibility APIs.
- string16 accessible_name_;
-
#if defined(OS_WIN)
- // The accessibility implementation for this View.
- scoped_refptr<ViewAccessibility> view_accessibility_;
+ // The Windows-specific accessibility implementation for this View.
+ scoped_refptr<NativeViewAccessibilityWin> native_view_accessibility_win_;
#endif
DISALLOW_COPY_AND_ASSIGN(View);
diff --git a/views/view_gtk.cc b/views/view_gtk.cc
index b666338..5155099 100644
--- a/views/view_gtk.cc
+++ b/views/view_gtk.cc
@@ -7,25 +7,9 @@
#include <gtk/gtk.h>
#include "base/logging.h"
-#include "views/views_delegate.h"
namespace views {
-void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type,
- bool send_native_event) {
- // Send the notification to the delegate.
- if (ViewsDelegate::views_delegate)
- ViewsDelegate::views_delegate->NotifyAccessibilityEvent(this, event_type);
-
- // In the future if we add native GTK accessibility support, the
- // notification should be sent here.
-}
-
-ViewAccessibility* View::GetViewAccessibility() {
- NOTIMPLEMENTED();
- return NULL;
-}
-
int View::GetHorizontalDragThreshold() {
static bool determined_threshold = false;
static int drag_threshold = 8;
diff --git a/views/view_win.cc b/views/view_win.cc
index 2c213c2..011b319 100644
--- a/views/view_win.cc
+++ b/views/view_win.cc
@@ -13,7 +13,7 @@
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/path.h"
-#include "views/accessibility/view_accessibility.h"
+#include "views/accessibility/native_view_accessibility_win.h"
#include "views/border.h"
#include "views/views_delegate.h"
#include "views/widget/root_view.h"
@@ -22,28 +22,11 @@
namespace views {
-void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type,
- bool send_native_event) {
- // Send the notification to the delegate.
- if (ViewsDelegate::views_delegate)
- ViewsDelegate::views_delegate->NotifyAccessibilityEvent(this, event_type);
-
- // Now call the Windows-specific method to notify MSAA clients of this
- // event. The widget gives us a temporary unique child ID to associate
- // with this view so that clients can call get_accChild in ViewAccessibility
- // to retrieve the IAccessible associated with this view.
- if (send_native_event) {
- WidgetWin* view_widget = static_cast<WidgetWin*>(GetWidget());
- int child_id = view_widget->AddAccessibilityViewEvent(this);
- ::NotifyWinEvent(ViewAccessibility::MSAAEvent(event_type),
- view_widget->GetNativeView(), OBJID_CLIENT, child_id);
- }
-}
-
-ViewAccessibility* View::GetViewAccessibility() {
- if (!view_accessibility_.get())
- view_accessibility_.swap(ViewAccessibility::Create(this));
- return view_accessibility_.get();
+NativeViewAccessibilityWin* View::GetNativeViewAccessibilityWin() {
+ if (!native_view_accessibility_win_.get())
+ native_view_accessibility_win_.swap(
+ NativeViewAccessibilityWin::Create(this));
+ return native_view_accessibility_win_.get();
}
int View::GetHorizontalDragThreshold() {
diff --git a/views/views.gyp b/views/views.gyp
index e99ee7d..13d81b9 100644
--- a/views/views.gyp
+++ b/views/views.gyp
@@ -74,9 +74,8 @@
# All .cc, .h under views, except unittests
'accelerator.cc',
'accelerator.h',
- 'accessibility/accessibility_types.h',
- 'accessibility/view_accessibility.cc',
- 'accessibility/view_accessibility.h',
+ 'accessibility/native_view_accessibility_win.cc',
+ 'accessibility/native_view_accessibility_win.h',
'animation/bounds_animator.cc',
'animation/bounds_animator.h',
'background.cc',
@@ -393,9 +392,7 @@
'../build/linux/system.gyp:xext',
],
'sources!': [
- 'accessibility/accessible_wrapper.cc',
- 'accessibility/view_accessibility.cc',
- 'accessibility/view_accessibility_wrapper.cc',
+ 'accessibility/native_view_accessibility_win.cc',
'controls/scrollbar/bitmap_scroll_bar.cc',
'controls/combo_box.cc',
'controls/hwnd_view.cc',
diff --git a/views/views_delegate.h b/views/views_delegate.h
index 5c775c8..9df7327 100644
--- a/views/views_delegate.h
+++ b/views/views_delegate.h
@@ -11,7 +11,7 @@
#include <windows.h>
#endif
-#include "views/accessibility/accessibility_types.h"
+#include "ui/base/accessibility/accessibility_types.h"
namespace gfx {
class Rect;
@@ -58,10 +58,8 @@ class ViewsDelegate {
const std::wstring& window_name,
bool* maximized) const = 0;
- // Notify the delegate that an accessibility event has happened in
- // a particular view.
virtual void NotifyAccessibilityEvent(
- views::View* view, AccessibilityTypes::Event event_type) = 0;
+ views::View* view, ui::AccessibilityTypes::Event event_type) = 0;
// For accessibility, notify the delegate that a menu item was focused
// so that alternate feedback (speech / magnified text) can be provided.
diff --git a/views/widget/root_view.cc b/views/widget/root_view.cc
index d6864cf..484ceba 100644
--- a/views/widget/root_view.cc
+++ b/views/widget/root_view.cc
@@ -8,6 +8,7 @@
#include "base/logging.h"
#include "base/message_loop.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/keycodes/keyboard_codes.h"
#include "ui/gfx/canvas_skia.h"
@@ -408,8 +409,8 @@ std::string RootView::GetClassName() const {
return kViewClassName;
}
-AccessibilityTypes::Role RootView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_APPLICATION;
+void RootView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_APPLICATION;
}
void RootView::OnPaint(gfx::Canvas* canvas) {
diff --git a/views/widget/root_view.h b/views/widget/root_view.h
index e6d5bcb..d9634b2 100644
--- a/views/widget/root_view.h
+++ b/views/widget/root_view.h
@@ -117,7 +117,7 @@ class RootView : public View,
#endif
virtual bool IsVisibleInRootView() const OVERRIDE;
virtual std::string GetClassName() const OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
// Overridden from View:
diff --git a/views/widget/widget.h b/views/widget/widget.h
index e5dc678..684cade 100644
--- a/views/widget/widget.h
+++ b/views/widget/widget.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/scoped_ptr.h"
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/gfx/native_widget_types.h"
#include "views/focus/focus_manager.h"
#include "views/widget/native_widget_delegate.h"
@@ -252,6 +253,17 @@ class Widget : public internal::NativeWidgetDelegate,
void SetFocusTraversableParent(FocusTraversable* parent);
void SetFocusTraversableParentView(View* parent_view);
+ // Notifies assistive technology that an accessibility event has
+ // occurred on |view|, such as when the view is focused or when its
+ // value changes. Pass true for |send_native_event| except for rare
+ // cases where the view is a native control that's already sending a
+ // native accessibility event and the duplicate event would cause
+ // problems.
+ virtual void NotifyAccessibilityEvent(
+ View* view,
+ ui::AccessibilityTypes::Event event_type,
+ bool send_native_event) = 0;
+
NativeWidget* native_widget() { return native_widget_; }
// Overridden from NativeWidgetDelegate:
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index afe6abe..ec9ef0c 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -21,6 +21,7 @@
#include "ui/base/x/x11_util.h"
#include "ui/gfx/canvas_skia_paint.h"
#include "ui/gfx/path.h"
+#include "views/views_delegate.h"
#include "views/focus/view_storage.h"
#include "views/widget/drop_target_gtk.h"
#include "views/widget/gtk_views_fixed.h"
@@ -620,6 +621,18 @@ void WidgetGtk::ViewHierarchyChanged(bool is_add, View* parent, View* child) {
drop_target_->ResetTargetViewIfEquals(child);
}
+void WidgetGtk::NotifyAccessibilityEvent(
+ View* view,
+ ui::AccessibilityTypes::Event event_type,
+ bool send_native_event) {
+ // Send the notification to the delegate.
+ if (ViewsDelegate::views_delegate)
+ ViewsDelegate::views_delegate->NotifyAccessibilityEvent(view, event_type);
+
+ // In the future if we add native GTK accessibility support, the
+ // notification should be sent here.
+}
+
void WidgetGtk::ClearNativeFocus() {
DCHECK(type_ != TYPE_CHILD);
if (!GetNativeView()) {
diff --git a/views/widget/widget_gtk.h b/views/widget/widget_gtk.h
index 308a5c0..142f2cd 100644
--- a/views/widget/widget_gtk.h
+++ b/views/widget/widget_gtk.h
@@ -158,6 +158,10 @@ class WidgetGtk : public Widget,
virtual const Window* GetWindow() const;
virtual void ViewHierarchyChanged(bool is_add, View *parent,
View *child);
+ virtual void NotifyAccessibilityEvent(
+ View* view,
+ ui::AccessibilityTypes::Event event_type,
+ bool send_native_event);
// Clears the focus on the native widget having the focus.
virtual void ClearNativeFocus();
diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc
index b1ba188..783c5ca 100644
--- a/views/widget/widget_win.cc
+++ b/views/widget/widget_win.cc
@@ -21,7 +21,7 @@
#include "ui/gfx/canvas_skia.h"
#include "ui/gfx/native_theme_win.h"
#include "ui/gfx/path.h"
-#include "views/accessibility/view_accessibility.h"
+#include "views/accessibility/native_view_accessibility_win.h"
#include "views/controls/native_control_win.h"
#include "views/focus/accelerator_handler.h"
#include "views/focus/focus_util_win.h"
@@ -401,6 +401,26 @@ void WidgetWin::SetCursor(gfx::NativeCursor cursor) {
}
}
+void WidgetWin::NotifyAccessibilityEvent(
+ View* view,
+ ui::AccessibilityTypes::Event event_type,
+ bool send_native_event) {
+ // Send the notification to the delegate.
+ if (ViewsDelegate::views_delegate)
+ ViewsDelegate::views_delegate->NotifyAccessibilityEvent(view, event_type);
+
+ // Now call the Windows-specific method to notify MSAA clients of this
+ // event. The widget gives us a temporary unique child ID to associate
+ // with this view so that clients can call get_accChild in
+ // NativeViewAccessibilityWin to retrieve the IAccessible associated
+ // with this view.
+ if (send_native_event) {
+ int child_id = AddAccessibilityViewEvent(view);
+ ::NotifyWinEvent(NativeViewAccessibilityWin::MSAAEvent(event_type),
+ GetNativeView(), OBJID_CLIENT, child_id);
+ }
+}
+
////////////////////////////////////////////////////////////////////////////////
// WidgetWin, MessageLoop::Observer implementation:
@@ -582,7 +602,7 @@ LRESULT WidgetWin::OnGetObject(UINT uMsg, WPARAM w_param, LPARAM l_param) {
if (OBJID_CLIENT == l_param) {
// Retrieve MSAA dispatch object for the root view.
base::win::ScopedComPtr<IAccessible> root(
- ViewAccessibility::GetAccessibleForView(GetRootView()));
+ NativeViewAccessibilityWin::GetAccessibleForView(GetRootView()));
// Create a reference that MSAA will marshall to the client.
reference_result = LresultFromObject(IID_IAccessible, w_param,
diff --git a/views/widget/widget_win.h b/views/widget/widget_win.h
index 15b63f6..67816e0 100644
--- a/views/widget/widget_win.h
+++ b/views/widget/widget_win.h
@@ -103,8 +103,9 @@ class WidgetWin : public ui::WindowImpl,
}
// Obtain the view event with the given MSAA child id. Used in
- // ViewAccessibility::get_accChild to support requests for children of
- // windowless controls. May return NULL (see ViewHierarchyChanged).
+ // NativeViewAccessibilityWin::get_accChild to support requests for
+ // children of windowless controls. May return NULL
+ // (see ViewHierarchyChanged).
View* GetAccessibilityViewEventAt(int id);
// Add a view that has recently fired an accessibility event. Returns a MSAA
@@ -127,6 +128,10 @@ class WidgetWin : public ui::WindowImpl,
virtual const Window* GetWindow() const OVERRIDE;
virtual void ViewHierarchyChanged(bool is_add, View *parent,
View *child) OVERRIDE;
+ virtual void NotifyAccessibilityEvent(
+ View* view,
+ ui::AccessibilityTypes::Event event_type,
+ bool send_native_event);
BOOL IsWindow() const {
return ::IsWindow(GetNativeView());
diff --git a/views/window/client_view.cc b/views/window/client_view.cc
index 6ec3f90..cb52607 100644
--- a/views/window/client_view.cc
+++ b/views/window/client_view.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/logging.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "views/window/client_view.h"
#if defined(OS_LINUX)
#include "views/window/hit_test.h"
@@ -69,8 +70,8 @@ void ClientView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
// NonClientView::Layout.
}
-AccessibilityTypes::Role ClientView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_CLIENT;
+void ClientView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_CLIENT;
}
} // namespace views
diff --git a/views/window/client_view.h b/views/window/client_view.h
index b50eafa..052037f 100644
--- a/views/window/client_view.h
+++ b/views/window/client_view.h
@@ -63,7 +63,7 @@ class ClientView : public View {
virtual void ViewHierarchyChanged(
bool is_add, View* parent, View* child) OVERRIDE;
virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
// Accessors for private data members.
Window* window() const { return window_; }
diff --git a/views/window/dialog_delegate.cc b/views/window/dialog_delegate.cc
index 84feb9b..d815a67 100644
--- a/views/window/dialog_delegate.cc
+++ b/views/window/dialog_delegate.cc
@@ -98,8 +98,8 @@ DialogClientView* DialogDelegate::GetDialogClientView() const {
return window()->client_view()->AsDialogClientView();
}
-AccessibilityTypes::Role DialogDelegate::accessible_role() const {
- return AccessibilityTypes::ROLE_DIALOG;
+ui::AccessibilityTypes::Role DialogDelegate::GetAccessibleRole() const {
+ return ui::AccessibilityTypes::ROLE_DIALOG;
}
} // namespace views
diff --git a/views/window/dialog_delegate.h b/views/window/dialog_delegate.h
index 1b8e8a4..f28ea03 100644
--- a/views/window/dialog_delegate.h
+++ b/views/window/dialog_delegate.h
@@ -6,8 +6,8 @@
#define VIEWS_WINDOW_DIALOG_DELEGATE_H_
#pragma once
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/base/message_box_flags.h"
-#include "views/accessibility/accessibility_types.h"
#include "views/window/dialog_client_view.h"
#include "views/window/window_delegate.h"
@@ -108,9 +108,9 @@ class DialogDelegate : public WindowDelegate {
// delegate's Window.
DialogClientView* GetDialogClientView() const;
- private:
+ protected:
// Overridden from WindowDelegate:
- virtual AccessibilityTypes::Role accessible_role() const;
+ virtual ui::AccessibilityTypes::Role GetAccessibleRole() const OVERRIDE;
};
} // namespace views
diff --git a/views/window/native_window.h b/views/window/native_window.h
index 9236689..7e4bd6a 100644
--- a/views/window/native_window.h
+++ b/views/window/native_window.h
@@ -6,8 +6,8 @@
#define VIEWS_WIDGET_NATIVE_WINDOW_H_
#pragma once
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/gfx/native_widget_types.h"
-#include "views/accessibility/accessibility_types.h"
class SkBitmap;
@@ -72,8 +72,8 @@ class NativeWindow {
// Update native accessibility properties on the native window.
virtual void SetAccessibleName(const std::wstring& name) = 0;
- virtual void SetAccessibleRole(AccessibilityTypes::Role role) = 0;
- virtual void SetAccessibleState(AccessibilityTypes::State state) = 0;
+ virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) = 0;
+ virtual void SetAccessibleState(ui::AccessibilityTypes::State state) = 0;
virtual NativeWidget* AsNativeWidget() = 0;
virtual const NativeWidget* AsNativeWidget() const = 0;
diff --git a/views/window/non_client_view.cc b/views/window/non_client_view.cc
index 387a431..021914f 100644
--- a/views/window/non_client_view.cc
+++ b/views/window/non_client_view.cc
@@ -4,6 +4,7 @@
#include "views/window/non_client_view.h"
+#include "ui/base/accessibility/accessible_view_state.h"
#include "views/widget/root_view.h"
#include "views/widget/widget.h"
#include "views/window/client_view.h"
@@ -126,6 +127,10 @@ void NonClientView::LayoutFrameView() {
frame_view_->Layout();
}
+void NonClientView::SetAccessibleName(const string16& name) {
+ accessible_name_ = name;
+}
+
////////////////////////////////////////////////////////////////////////////////
// NonClientView, View overrides:
@@ -179,8 +184,9 @@ views::View* NonClientView::GetEventHandlerForPoint(const gfx::Point& point) {
return View::GetEventHandlerForPoint(point);
}
-AccessibilityTypes::Role NonClientView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_WINDOW;
+void NonClientView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_WINDOW;
+ state->name = accessible_name_;
}
////////////////////////////////////////////////////////////////////////////////
@@ -256,8 +262,8 @@ bool NonClientFrameView::ShouldPaintAsActive() const {
return GetWindow()->IsActive() || paint_as_active_;
}
-AccessibilityTypes::Role NonClientFrameView::GetAccessibleRole() {
- return AccessibilityTypes::ROLE_WINDOW;
+void NonClientFrameView::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_WINDOW;
}
void NonClientFrameView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
diff --git a/views/window/non_client_view.h b/views/window/non_client_view.h
index f1420a1..b0b9137 100644
--- a/views/window/non_client_view.h
+++ b/views/window/non_client_view.h
@@ -71,7 +71,7 @@ class NonClientFrameView : public View {
// Overridden from View:
virtual bool HitTest(const gfx::Point& l) const OVERRIDE;
- virtual AccessibilityTypes::Role GetAccessibleRole() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
@@ -209,16 +209,21 @@ class NonClientView : public View {
// of a window resize message.
void LayoutFrameView();
+ // Set the accessible name of this view.
+ void SetAccessibleName(const string16& name);
+
// NonClientView, View overrides:
- virtual gfx::Size GetPreferredSize();
- virtual gfx::Size GetMinimumSize();
- virtual void Layout();
- virtual AccessibilityTypes::Role GetAccessibleRole();
+ virtual gfx::Size GetPreferredSize() OVERRIDE;
+ virtual gfx::Size GetMinimumSize() OVERRIDE;
+ virtual void Layout() OVERRIDE;
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
protected:
// NonClientView, View overrides:
- virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child);
- virtual views::View* GetEventHandlerForPoint(const gfx::Point& point);
+ virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child)
+ OVERRIDE;
+ virtual views::View* GetEventHandlerForPoint(const gfx::Point& point)
+ OVERRIDE;
private:
// The frame that hosts this NonClientView.
@@ -234,6 +239,9 @@ class NonClientView : public View {
// dynamically as the system settings change.
scoped_ptr<NonClientFrameView> frame_view_;
+ // The accessible name of this view.
+ string16 accessible_name_;
+
DISALLOW_COPY_AND_ASSIGN(NonClientView);
};
diff --git a/views/window/window.cc b/views/window/window.cc
index 6ac43f6..f2313ed 100644
--- a/views/window/window.cc
+++ b/views/window/window.cc
@@ -287,8 +287,8 @@ void Window::OnNativeWindowCreated(const gfx::Rect& bounds) {
non_client_view_);
UpdateWindowTitle();
- native_window_->SetAccessibleRole(window_delegate_->accessible_role());
- native_window_->SetAccessibleState(window_delegate_->accessible_state());
+ native_window_->SetAccessibleRole(window_delegate_->GetAccessibleRole());
+ native_window_->SetAccessibleState(window_delegate_->GetAccessibleState());
SetInitialBounds(bounds);
}
diff --git a/views/window/window_delegate.cc b/views/window/window_delegate.cc
index 843fc70..b29b052 100644
--- a/views/window/window_delegate.cc
+++ b/views/window/window_delegate.cc
@@ -36,11 +36,11 @@ bool WindowDelegate::IsModal() const {
return false;
}
-AccessibilityTypes::Role WindowDelegate::accessible_role() const {
- return AccessibilityTypes::ROLE_WINDOW;
+ui::AccessibilityTypes::Role WindowDelegate::GetAccessibleRole() const {
+ return ui::AccessibilityTypes::ROLE_WINDOW;
}
-AccessibilityTypes::State WindowDelegate::accessible_state() const {
+ui::AccessibilityTypes::State WindowDelegate::GetAccessibleState() const {
return 0;
}
diff --git a/views/window/window_delegate.h b/views/window/window_delegate.h
index 0e69e30..9888317a 100644
--- a/views/window/window_delegate.h
+++ b/views/window/window_delegate.h
@@ -9,7 +9,7 @@
#include <string>
#include "base/scoped_ptr.h"
-#include "views/accessibility/accessibility_types.h"
+#include "ui/base/accessibility/accessibility_types.h"
class SkBitmap;
@@ -53,9 +53,9 @@ class WindowDelegate {
// opened it. Only windows with WindowType == DIALOG can be modal.
virtual bool IsModal() const;
- virtual AccessibilityTypes::Role accessible_role() const;
+ virtual ui::AccessibilityTypes::Role GetAccessibleRole() const;
- virtual AccessibilityTypes::State accessible_state() const;
+ virtual ui::AccessibilityTypes::State GetAccessibleState() const;
// Returns the title to be read with screen readers.
virtual std::wstring GetAccessibleWindowTitle() const;
diff --git a/views/window/window_gtk.cc b/views/window/window_gtk.cc
index cfd393d..28bbd6c 100644
--- a/views/window/window_gtk.cc
+++ b/views/window/window_gtk.cc
@@ -291,10 +291,10 @@ void WindowGtk::SetWindowIcons(const SkBitmap& window_icon,
void WindowGtk::SetAccessibleName(const std::wstring& name) {
}
-void WindowGtk::SetAccessibleRole(AccessibilityTypes::Role role) {
+void WindowGtk::SetAccessibleRole(ui::AccessibilityTypes::Role role) {
}
-void WindowGtk::SetAccessibleState(AccessibilityTypes::State state) {
+void WindowGtk::SetAccessibleState(ui::AccessibilityTypes::State state) {
}
NativeWidget* WindowGtk::AsNativeWidget() {
diff --git a/views/window/window_gtk.h b/views/window/window_gtk.h
index 60c9b4b..23d0bce 100644
--- a/views/window/window_gtk.h
+++ b/views/window/window_gtk.h
@@ -57,8 +57,8 @@ class WindowGtk : public WidgetGtk, public NativeWindow, public Window {
virtual void SetWindowIcons(const SkBitmap& window_icon,
const SkBitmap& app_icon) OVERRIDE;
virtual void SetAccessibleName(const std::wstring& name) OVERRIDE;
- virtual void SetAccessibleRole(AccessibilityTypes::Role role) OVERRIDE;
- virtual void SetAccessibleState(AccessibilityTypes::State state) OVERRIDE;
+ virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) OVERRIDE;
+ virtual void SetAccessibleState(ui::AccessibilityTypes::State state) OVERRIDE;
virtual NativeWidget* AsNativeWidget() OVERRIDE;
virtual const NativeWidget* AsNativeWidget() const OVERRIDE;
virtual Window* GetWindow() OVERRIDE;
diff --git a/views/window/window_win.cc b/views/window/window_win.cc
index 863c56a..32583e3 100644
--- a/views/window/window_win.cc
+++ b/views/window/window_win.cc
@@ -11,6 +11,7 @@
#include "base/win/scoped_gdi_object.h"
#include "base/win/win_util.h"
#include "base/win/windows_version.h"
+#include "ui/base/accessibility/accessibility_types.h"
#include "ui/base/keycodes/keyboard_code_conversion_win.h"
#include "ui/base/l10n/l10n_util_win.h"
#include "ui/base/theme_provider.h"
@@ -19,7 +20,7 @@
#include "ui/gfx/font.h"
#include "ui/gfx/icon_util.h"
#include "ui/gfx/path.h"
-#include "views/accessibility/view_accessibility.h"
+#include "views/accessibility/native_view_accessibility_win.h"
#include "views/widget/root_view.h"
#include "views/window/client_view.h"
#include "views/window/custom_frame_view.h"
@@ -954,7 +955,7 @@ void WindowWin::SetAccessibleName(const std::wstring& name) {
}
}
-void WindowWin::SetAccessibleRole(AccessibilityTypes::Role role) {
+void WindowWin::SetAccessibleRole(ui::AccessibilityTypes::Role role) {
base::win::ScopedComPtr<IAccPropServices> pAccPropServices;
HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER,
IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices));
@@ -962,21 +963,21 @@ void WindowWin::SetAccessibleRole(AccessibilityTypes::Role role) {
VARIANT var;
if (role) {
var.vt = VT_I4;
- var.lVal = ViewAccessibility::MSAARole(role);
+ var.lVal = NativeViewAccessibilityWin::MSAARole(role);
hr = pAccPropServices->SetHwndProp(GetNativeView(), OBJID_CLIENT,
CHILDID_SELF, PROPID_ACC_ROLE, var);
}
}
}
-void WindowWin::SetAccessibleState(AccessibilityTypes::State state) {
+void WindowWin::SetAccessibleState(ui::AccessibilityTypes::State state) {
base::win::ScopedComPtr<IAccPropServices> pAccPropServices;
HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER,
IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices));
if (SUCCEEDED(hr)) {
VARIANT var;
if (state) {
- var.lVal = ViewAccessibility::MSAAState(state);
+ var.lVal = NativeViewAccessibilityWin::MSAAState(state);
hr = pAccPropServices->SetHwndProp(GetNativeView(), OBJID_CLIENT,
CHILDID_SELF, PROPID_ACC_STATE, var);
}
diff --git a/views/window/window_win.h b/views/window/window_win.h
index dbe8ad2..222608a 100644
--- a/views/window/window_win.h
+++ b/views/window/window_win.h
@@ -146,8 +146,8 @@ class WindowWin : public WidgetWin,
virtual void SetWindowIcons(const SkBitmap& window_icon,
const SkBitmap& app_icon) OVERRIDE;
virtual void SetAccessibleName(const std::wstring& name) OVERRIDE;
- virtual void SetAccessibleRole(AccessibilityTypes::Role role) OVERRIDE;
- virtual void SetAccessibleState(AccessibilityTypes::State state) OVERRIDE;
+ virtual void SetAccessibleRole(ui::AccessibilityTypes::Role role) OVERRIDE;
+ virtual void SetAccessibleState(ui::AccessibilityTypes::State state) OVERRIDE;
virtual NativeWidget* AsNativeWidget() OVERRIDE;
virtual const NativeWidget* AsNativeWidget() const OVERRIDE;
virtual void SetWindowBounds(const gfx::Rect& bounds,