summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
Diffstat (limited to 'views')
-rw-r--r--views/controls/native_control.cc2
-rw-r--r--views/view.h7
-rw-r--r--views/view_gtk.cc13
-rw-r--r--views/view_unittest.cc2
-rw-r--r--views/view_win.cc28
-rw-r--r--views/views_delegate.h9
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;