accessibility_extension_api.h revision f2477e01787aa58f445919b809d89e252beef54f
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/base/accessibility/accessibility_types.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::AccessibilityTypes::Event,
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  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::AccessibilityTypes::Event event,
51                         const AccessibilityWindowInfo* info);
52
53  // Route a menu-related accessibility event.
54  void HandleMenuEvent(ui::AccessibilityTypes::Event event,
55                       const AccessibilityMenuInfo* info);
56
57  // Route a control-related accessibility event.
58  void HandleControlEvent(ui::AccessibilityTypes::Event 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 OnTextChanged(const AccessibilityControlInfo* details);
81  void OnMenuOpened(const AccessibilityMenuInfo* details);
82  void OnMenuClosed(const AccessibilityMenuInfo* details);
83
84  void DispatchEvent(Profile* profile,
85                     const char* event_name,
86                     scoped_ptr<base::ListValue> event_args);
87
88  DictionaryValue last_focused_control_dict_;
89
90  bool enabled_;
91
92  // For testing.
93  ControlEventCallback control_event_callback_;
94
95  DISALLOW_COPY_AND_ASSIGN(ExtensionAccessibilityEventRouter);
96};
97
98// API function that enables or disables accessibility support.  Event
99// listeners are only installed when accessibility support is enabled, to
100// minimize the impact.
101class AccessibilitySetAccessibilityEnabledFunction
102    : public ChromeSyncExtensionFunction {
103  virtual ~AccessibilitySetAccessibilityEnabledFunction() {}
104  virtual bool RunImpl() OVERRIDE;
105  DECLARE_EXTENSION_FUNCTION(
106      "experimental.accessibility.setAccessibilityEnabled",
107      EXPERIMENTAL_ACCESSIBILITY_SETACCESSIBILITYENABLED)
108};
109
110// API function that enables or disables web content accessibility support.
111class AccessibilitySetNativeAccessibilityEnabledFunction
112    : public ChromeSyncExtensionFunction {
113  virtual ~AccessibilitySetNativeAccessibilityEnabledFunction() {}
114  virtual bool RunImpl() OVERRIDE;
115  DECLARE_EXTENSION_FUNCTION(
116      "experimental.accessibility.setNativeAccessibilityEnabled",
117      EXPERIMENTAL_ACCESSIBILITY_SETNATIVEACCESSIBILITYENABLED)
118};
119
120// API function that returns the most recent focused control.
121class AccessibilityGetFocusedControlFunction
122    : public ChromeSyncExtensionFunction {
123  virtual ~AccessibilityGetFocusedControlFunction() {}
124  virtual bool RunImpl() OVERRIDE;
125  DECLARE_EXTENSION_FUNCTION(
126      "experimental.accessibility.getFocusedControl",
127      EXPERIMENTAL_ACCESSIBILITY_GETFOCUSEDCONTROL)
128};
129
130// API function that returns alerts being shown on the give tab.
131class AccessibilityGetAlertsForTabFunction
132    : public ChromeSyncExtensionFunction {
133  virtual ~AccessibilityGetAlertsForTabFunction() {}
134  virtual bool RunImpl() OVERRIDE;
135  DECLARE_EXTENSION_FUNCTION(
136      "experimental.accessibility.getAlertsForTab",
137      EXPERIMENTAL_ACCESSIBILITY_GETALERTSFORTAB)
138};
139
140#endif  // CHROME_BROWSER_ACCESSIBILITY_ACCESSIBILITY_EXTENSION_API_H_
141