summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/accessibility/browser_accessibility_manager_win.cc6
-rw-r--r--content/browser/accessibility/browser_accessibility_manager_win.h7
-rw-r--r--ui/accessibility/platform/ax_platform_node_win.cc34
-rw-r--r--ui/accessibility/platform/ax_platform_node_win.h18
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>,