diff options
4 files changed, 64 insertions, 1 deletions
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index a02cc9a..a60b749 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc @@ -47,6 +47,7 @@ BrowserAccessibilityManagerWin::BrowserAccessibilityManagerWin( inside_on_window_focused_(false) { ui::win::CreateATLModuleIfNeeded(); Initialize(initial_tree); + ui::GetIAccessible2UsageObserverList().AddObserver(this); } BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() { @@ -59,6 +60,7 @@ BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() { tracked_scroll_object_->Release(); tracked_scroll_object_ = NULL; } + ui::GetIAccessible2UsageObserverList().RemoveObserver(this); } // static @@ -151,6 +153,10 @@ void BrowserAccessibilityManagerWin::MaybeCallNotifyWinEvent( ::NotifyWinEvent(event, hwnd, OBJID_CLIENT, child_id); } +void BrowserAccessibilityManagerWin::OnIAccessible2Used() { + BrowserAccessibilityStateImpl::GetInstance()->OnScreenReaderDetected(); +} + void BrowserAccessibilityManagerWin::OnWindowFocused() { // Make sure we don't call this recursively. if (inside_on_window_focused_) diff --git a/content/browser/accessibility/browser_accessibility_manager_win.h b/content/browser/accessibility/browser_accessibility_manager_win.h index b9da9a1..b505a63 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.h +++ b/content/browser/accessibility/browser_accessibility_manager_win.h @@ -11,13 +11,15 @@ #include "base/memory/scoped_ptr.h" #include "base/win/scoped_comptr.h" #include "content/browser/accessibility/browser_accessibility_manager.h" +#include "ui/accessibility/platform/ax_platform_node_win.h" namespace content { class BrowserAccessibilityWin; // Manages a tree of BrowserAccessibilityWin objects. class CONTENT_EXPORT BrowserAccessibilityManagerWin - : public BrowserAccessibilityManager { + : public BrowserAccessibilityManager, + public ui::IAccessible2UsageObserver { public: BrowserAccessibilityManagerWin( const ui::AXTreeUpdate& initial_tree, @@ -37,6 +39,9 @@ class CONTENT_EXPORT BrowserAccessibilityManagerWin // Calls NotifyWinEvent if the parent window's IAccessible pointer is known. void MaybeCallNotifyWinEvent(DWORD event, BrowserAccessibility* node); + // IAccessible2UsageObserver + void OnIAccessible2Used() override; + // BrowserAccessibilityManager methods void OnWindowFocused() override; void UserIsReloading() override; diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 574ffab..79c135d 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc @@ -106,8 +106,31 @@ void UnregisterNegativeUniqueId(LONG unique_id) { g_unique_id_win_map.Get().erase(unique_id); } +base::LazyInstance<base::ObserverList<IAccessible2UsageObserver>> + g_iaccessible2_usage_observer_list = LAZY_INSTANCE_INITIALIZER; + } // namespace +// +// IAccessible2UsageObserver +// + +IAccessible2UsageObserver::IAccessible2UsageObserver() { +} + +IAccessible2UsageObserver::~IAccessible2UsageObserver() { +} + +// static +base::ObserverList<IAccessible2UsageObserver>& + GetIAccessible2UsageObserverList() { + return g_iaccessible2_usage_observer_list.Get(); +} + +// +// AXPlatformNode::Create +// + // static AXPlatformNode* AXPlatformNode::Create(AXPlatformNodeDelegate* delegate) { // Make sure ATL is initialized in this module. @@ -129,6 +152,10 @@ AXPlatformNode* AXPlatformNode::FromNativeViewAccessible( return ax_platform_node.get(); } +// +// AXPlatformNodeWin +// + AXPlatformNodeWin::AXPlatformNodeWin() : unique_id_win_(GetNextNegativeUniqueIdForWinAccessibility(this)) { } @@ -876,6 +903,13 @@ STDMETHODIMP AXPlatformNodeWin::scrollSubstringToPoint( STDMETHODIMP AXPlatformNodeWin::QueryService( REFGUID guidService, REFIID riid, void** object) { COM_OBJECT_VALIDATE_1_ARG(object); + + if (riid == IID_IAccessible2) { + FOR_EACH_OBSERVER(IAccessible2UsageObserver, + GetIAccessible2UsageObserverList(), + OnIAccessible2Used()); + } + if (guidService == IID_IAccessible || guidService == IID_IAccessible2 || guidService == IID_IAccessible2_2 || diff --git a/ui/accessibility/platform/ax_platform_node_win.h b/ui/accessibility/platform/ax_platform_node_win.h index 5d26421..3979272 100644 --- a/ui/accessibility/platform/ax_platform_node_win.h +++ b/ui/accessibility/platform/ax_platform_node_win.h @@ -9,11 +9,29 @@ #include <atlcom.h> #include <oleacc.h> +#include "base/observer_list.h" #include "third_party/iaccessible2/ia2_api_all.h" +#include "ui/accessibility/ax_export.h" +#include "ui/accessibility/ax_text_utils.h" #include "ui/accessibility/platform/ax_platform_node_base.h" namespace ui { +// A simple interface for a class that wants to be notified when IAccessible2 +// is used by a client, a strong indication that full accessibility support +// should be enabled. +class AX_EXPORT IAccessible2UsageObserver { + public: + IAccessible2UsageObserver(); + virtual ~IAccessible2UsageObserver(); + virtual void OnIAccessible2Used() = 0; +}; + +// Get an observer list that allows modules across the codebase to +// listen to when usage of IAccessible2 is detected. +extern AX_EXPORT base::ObserverList<IAccessible2UsageObserver>& + GetIAccessible2UsageObserverList(); + class __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2")) AXPlatformNodeWin : public CComObjectRootEx<CComMultiThreadModel>, |