diff options
Diffstat (limited to 'views')
-rw-r--r-- | views/controls/native_control.cc | 2 | ||||
-rw-r--r-- | views/view.h | 7 | ||||
-rw-r--r-- | views/view_gtk.cc | 13 | ||||
-rw-r--r-- | views/view_unittest.cc | 2 | ||||
-rw-r--r-- | views/view_win.cc | 28 | ||||
-rw-r--r-- | views/views_delegate.h | 9 |
6 files changed, 50 insertions, 11 deletions
diff --git a/views/controls/native_control.cc b/views/controls/native_control.cc index 39d62b7..942a093 100644 --- a/views/controls/native_control.cc +++ b/views/controls/native_control.cc @@ -270,7 +270,7 @@ void NativeControl::Focus() { if (container_) { DCHECK(container_->GetControl()); ::SetFocus(container_->GetControl()); - NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS); + NotifyAccessibilityEvent(AccessibilityTypes::EVENT_FOCUS, false); } } diff --git a/views/view.h b/views/view.h index 22c38d0..c5268c2 100644 --- a/views/view.h +++ b/views/view.h @@ -558,9 +558,14 @@ class View : public AcceleratorTarget { // TODO(klink): Move all this out to a AccessibleInfo wrapper class. // Notify the platform specific accessibility client of changes in the user - // interface. + // 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 diff --git a/views/view_gtk.cc b/views/view_gtk.cc index 049dfe8..d74598d 100644 --- a/views/view_gtk.cc +++ b/views/view_gtk.cc @@ -7,6 +7,7 @@ #include <gtk/gtk.h> #include "base/logging.h" +#include "views/views_delegate.h" namespace views { @@ -21,7 +22,17 @@ int View::GetMenuShowDelay() { } void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type) { - // Not implemented on GTK. + NotifyAccessibilityEvent(event_type, true); +} + +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. } ViewAccessibilityWrapper* View::GetViewAccessibilityWrapper() { diff --git a/views/view_unittest.cc b/views/view_unittest.cc index 008a2a5..baca2c3 100644 --- a/views/view_unittest.cc +++ b/views/view_unittest.cc @@ -686,6 +686,8 @@ class TestViewsDelegate : public views::ViewsDelegate { bool* maximized) const { return false; } + virtual void NotifyAccessibilityEvent( + views::View* view, AccessibilityTypes::Event event_type) {} virtual HICON GetDefaultWindowIcon() const { return NULL; } diff --git a/views/view_win.cc b/views/view_win.cc index 3079b5c..bbbe90e 100644 --- a/views/view_win.cc +++ b/views/view_win.cc @@ -11,6 +11,7 @@ #include "views/accessibility/view_accessibility.h" #include "views/accessibility/view_accessibility_wrapper.h" #include "views/border.h" +#include "views/views_delegate.h" #include "views/widget/root_view.h" #include "views/widget/widget.h" #include "views/widget/widget_win.h" @@ -30,15 +31,26 @@ int View::GetMenuShowDelay() { return delay; } -// Notifies accessibility clients of the event_type on this view. -// Clients will call get_accChild found in ViewAccessibility with the supplied -// child id we generate here to retrieve the IAccessible associated with this -// view. void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type) { - 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); + NotifyAccessibilityEvent(event_type, true); +} + +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); + } } ViewAccessibilityWrapper* View::GetViewAccessibilityWrapper() { diff --git a/views/views_delegate.h b/views/views_delegate.h index bc05b45..27e4498 100644 --- a/views/views_delegate.h +++ b/views/views_delegate.h @@ -11,6 +11,8 @@ #include <windows.h> #endif +#include "views/accessibility/accessibility_types.h" + class Clipboard; namespace gfx { @@ -19,6 +21,8 @@ class Rect; namespace views { +class View; + // ViewsDelegate is an interface implemented by an object using the views // framework. It is used to obtain various high level application utilities // and perform some actions such as window placement saving. @@ -48,6 +52,11 @@ class ViewsDelegate { virtual bool GetSavedMaximizedState(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; + #if defined(OS_WIN) // Retrieves the default window icon to use for windows if none is specified. virtual HICON GetDefaultWindowIcon() const = 0; |