accessibility_extension_api.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_ACCESSIBILITY_ACCESSIBILITY_EXTENSION_API_H_
6#define CHROME_BROWSER_ACCESSIBILITY_ACCESSIBILITY_EXTENSION_API_H_
7
8#include <string>
9
10#include "base/compiler_specific.h"
11#include "base/memory/singleton.h"
12#include "base/values.h"
13#include "chrome/browser/accessibility/accessibility_events.h"
14#include "chrome/browser/extensions/chrome_extension_function.h"
15#include "ui/accessibility/ax_enums.h"
16
17namespace extensions {
18class ExtensionHost;
19} // namespace extensions
20
21// Observes the profile and routes accessibility notifications as events
22// to the extension system.
23class ExtensionAccessibilityEventRouter {
24 public:
25  typedef base::Callback<void(ui::AXEvent,
26                              const AccessibilityControlInfo*)>
27      ControlEventCallback;
28  // Single instance of the event router.
29  static ExtensionAccessibilityEventRouter* GetInstance();
30
31  // Get the dict representing the last control that received an
32  // OnControlFocus event.
33  base::DictionaryValue* last_focused_control_dict() {
34    return &last_focused_control_dict_;
35  }
36
37  // Accessibility support is disabled until an extension expicitly enables
38  // it, so that this extension api has no impact on Chrome's performance
39  // otherwise.  These methods handle enabling, disabling, and querying the
40  // status.
41  void SetAccessibilityEnabled(bool enabled);
42  bool IsAccessibilityEnabled() const;
43
44  // Set and remove callbacks (used for testing, to confirm that events are
45  // getting through).
46  void SetControlEventCallbackForTesting(ControlEventCallback callback);
47  void ClearControlEventCallback();
48
49  // Route a window-related accessibility event.
50  void HandleWindowEvent(ui::AXEvent event,
51                         const AccessibilityWindowInfo* info);
52
53  // Route a menu-related accessibility event.
54  void HandleMenuEvent(ui::AXEvent event,
55                       const AccessibilityMenuInfo* info);
56
57  // Route a control-related accessibility event.
58  void HandleControlEvent(ui::AXEvent event,
59                          const AccessibilityControlInfo* info);
60
61  void OnChromeVoxLoadStateChanged(
62      Profile* profile,
63      bool loading,
64      bool make_announcements);
65
66  static void DispatchEventToChromeVox(
67      Profile* profile,
68      const char* event_name,
69      scoped_ptr<base::ListValue> event_args);
70
71 private:
72  friend struct DefaultSingletonTraits<ExtensionAccessibilityEventRouter>;
73
74  ExtensionAccessibilityEventRouter();
75  virtual ~ExtensionAccessibilityEventRouter();
76
77  void OnWindowOpened(const AccessibilityWindowInfo* details);
78  void OnControlFocused(const AccessibilityControlInfo* details);
79  void OnControlAction(const AccessibilityControlInfo* details);
80  void OnControlHover(const AccessibilityControlInfo* details);
81  void OnTextChanged(const AccessibilityControlInfo* details);
82  void OnMenuOpened(const AccessibilityMenuInfo* details);
83  void OnMenuClosed(const AccessibilityMenuInfo* details);
84
85  void DispatchEvent(Profile* profile,
86                     const char* event_name,
87                     scoped_ptr<base::ListValue> event_args);
88
89  base::DictionaryValue last_focused_control_dict_;
90
91  bool enabled_;
92
93  // For testing.
94  ControlEventCallback control_event_callback_;
95
96  DISALLOW_COPY_AND_ASSIGN(ExtensionAccessibilityEventRouter);
97};
98
99// API function that enables or disables accessibility support.  Event
100// listeners are only installed when accessibility support is enabled, to
101// minimize the impact.
102class AccessibilityPrivateSetAccessibilityEnabledFunction
103    : public ChromeSyncExtensionFunction {
104  virtual ~AccessibilityPrivateSetAccessibilityEnabledFunction() {}
105  virtual bool RunSync() OVERRIDE;
106  DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.setAccessibilityEnabled",
107                             ACCESSIBILITY_PRIVATE_SETACCESSIBILITYENABLED)
108};
109
110// API function that enables or disables web content accessibility support.
111class AccessibilityPrivateSetNativeAccessibilityEnabledFunction
112    : public ChromeSyncExtensionFunction {
113  virtual ~AccessibilityPrivateSetNativeAccessibilityEnabledFunction() {}
114  virtual bool RunSync() OVERRIDE;
115  DECLARE_EXTENSION_FUNCTION(
116      "accessibilityPrivate.setNativeAccessibilityEnabled",
117      ACCESSIBILITY_PRIVATE_SETNATIVEACCESSIBILITYENABLED)
118};
119
120// API function that returns the most recent focused control.
121class AccessibilityPrivateGetFocusedControlFunction
122    : public ChromeSyncExtensionFunction {
123  virtual ~AccessibilityPrivateGetFocusedControlFunction() {}
124  virtual bool RunSync() OVERRIDE;
125  DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.getFocusedControl",
126                             ACCESSIBILITY_PRIVATE_GETFOCUSEDCONTROL)
127};
128
129// API function that returns alerts being shown on the give tab.
130class AccessibilityPrivateGetAlertsForTabFunction
131    : public ChromeSyncExtensionFunction {
132  virtual ~AccessibilityPrivateGetAlertsForTabFunction() {}
133  virtual bool RunSync() OVERRIDE;
134  DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.getAlertsForTab",
135                             ACCESSIBILITY_PRIVATE_GETALERTSFORTAB)
136};
137
138// API function that sets the location of the accessibility focus ring.
139class AccessibilityPrivateSetFocusRingFunction
140    : public ChromeSyncExtensionFunction {
141  virtual ~AccessibilityPrivateSetFocusRingFunction() {}
142  virtual bool RunSync() OVERRIDE;
143  DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.setFocusRing",
144                             ACCESSIBILITY_PRIVATE_SETFOCUSRING)
145};
146
147#endif  // CHROME_BROWSER_ACCESSIBILITY_ACCESSIBILITY_EXTENSION_API_H_
148