diff options
author | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-18 23:53:41 +0000 |
---|---|---|
committer | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-18 23:53:41 +0000 |
commit | 9870326b1412b1f3804eed8d9b6402ac60ddf8f0 (patch) | |
tree | 46225afad011decdd6b138dba35836636dee33db /views/accessibility | |
parent | 23b060ece7a2db1ef5b4802d4903f93edb538ae3 (diff) | |
download | chromium_src-9870326b1412b1f3804eed8d9b6402ac60ddf8f0.zip chromium_src-9870326b1412b1f3804eed8d9b6402ac60ddf8f0.tar.gz chromium_src-9870326b1412b1f3804eed8d9b6402ac60ddf8f0.tar.bz2 |
Keep a cache of all views that have sent notifications. This ensures that AccessibleObjectFromEvent works properly.
BUG=9601
TEST=none
Review URL: http://codereview.chromium.org/2823009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50302 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/accessibility')
-rw-r--r-- | views/accessibility/accessibility_types.h | 12 | ||||
-rw-r--r-- | views/accessibility/view_accessibility.cc | 38 | ||||
-rw-r--r-- | views/accessibility/view_accessibility.h | 4 |
3 files changed, 52 insertions, 2 deletions
diff --git a/views/accessibility/accessibility_types.h b/views/accessibility/accessibility_types.h index 882b8a1..7dd991c 100644 --- a/views/accessibility/accessibility_types.h +++ b/views/accessibility/accessibility_types.h @@ -64,6 +64,18 @@ class AccessibilityTypes { 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_FOCUS, + EVENT_MENUSTART, + EVENT_MENUEND, + EVENT_MENUPOPUPSTART, + EVENT_MENUPOPUPEND + }; + private: // Do not instantiate this class. AccessibilityTypes() {} diff --git a/views/accessibility/view_accessibility.cc b/views/accessibility/view_accessibility.cc index 67aaaf2..2dad53d 100644 --- a/views/accessibility/view_accessibility.cc +++ b/views/accessibility/view_accessibility.cc @@ -290,9 +290,24 @@ STDMETHODIMP ViewAccessibility::get_accChild(VARIANT var_child, // Check to see if child is out-of-bounds. if (IsValidChild((var_child.lVal - 1), view_)) { child_view = view_->GetChildViewAt(var_child.lVal - 1); + + // Parents handle leaf IAccessible's. + if (child_view && child_view->GetChildViewCount() == 0) + return S_FALSE; } else { - // Child is located elsewhere in the hierarchy, get ID and adjust for MSAA. - child_view = view_->GetViewByID(static_cast<int>(var_child.lVal)); + // Child is located elsewhere in this view's subtree. + // Positive child id's are 1-based indexes so you can iterate over all + // children, and negative values are direct references to objects. + // Note that we return full IAccessible's for leafs that have + // negative child id's. + if (var_child.lVal > 0) { + child_view = view_->GetViewByID(static_cast<int>(var_child.lVal)); + } else { + // Retrieve it from our cache of views that have fired events. + views::WidgetWin* view_widget = + static_cast<views::WidgetWin*>(view_->GetWidget()); + child_view = view_widget->GetAccessibilityViewEventAt(var_child.lVal); + } } if (!child_view) { @@ -756,6 +771,25 @@ STDMETHODIMP ViewAccessibility::put_accValue(VARIANT var_id, BSTR put_val) { return E_NOTIMPL; } +int32 ViewAccessibility::MSAAEvent(AccessibilityTypes::Event event) { + switch (event) { + case AccessibilityTypes::EVENT_FOCUS: + return EVENT_OBJECT_FOCUS; + case AccessibilityTypes::EVENT_MENUSTART: + return EVENT_SYSTEM_MENUSTART; + case AccessibilityTypes::EVENT_MENUEND: + return EVENT_SYSTEM_MENUEND; + case AccessibilityTypes::EVENT_MENUPOPUPSTART: + return EVENT_SYSTEM_MENUPOPUPSTART; + case AccessibilityTypes::EVENT_MENUPOPUPEND: + return EVENT_SYSTEM_MENUPOPUPEND; + default: + // Not supported or invalid event. + NOTREACHED(); + return -1; + } +} + int32 ViewAccessibility::MSAARole(AccessibilityTypes::Role role) { switch (role) { case AccessibilityTypes::ROLE_APPLICATION: diff --git a/views/accessibility/view_accessibility.h b/views/accessibility/view_accessibility.h index d2472fb..4bb168c 100644 --- a/views/accessibility/view_accessibility.h +++ b/views/accessibility/view_accessibility.h @@ -103,6 +103,10 @@ class ATL_NO_VTABLE ViewAccessibility STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name); STDMETHODIMP put_accValue(VARIANT var_id, BSTR put_val); + // Returns a conversion from the event (as defined in accessibility_types.h) + // to an MSAA event. + static int32 MSAAEvent(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); |