extension_accessibility_api.h revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2010 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_EXTENSIONS_EXTENSION_ACCESSIBILITY_API_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_ACCESSIBILITY_API_H_
7
8#include <string>
9#include <vector>
10
11#include "base/callback.h"
12#include "base/singleton.h"
13#include "chrome/browser/accessibility_events.h"
14#include "chrome/browser/extensions/extension_function.h"
15#include "chrome/common/notification_service.h"
16#include "chrome/common/notification_registrar.h"
17
18// Observes the profile and routes accessibility notifications as events
19// to the extension system.
20class ExtensionAccessibilityEventRouter : public NotificationObserver {
21 public:
22  // Single instance of the event router.
23  static ExtensionAccessibilityEventRouter* GetInstance();
24
25  // Safe to call multiple times.
26  void ObserveProfile(Profile* profile);
27
28  // Get the dict representing the last control that received an
29  // OnControlFocus event.
30  DictionaryValue* last_focused_control_dict() {
31    return &last_focused_control_dict_;
32  }
33
34  // Accessibility support is disabled until an extension expicitly enables
35  // it, so that this extension api has no impact on Chrome's performance
36  // otherwise.  These methods handle enabling, disabling, querying the
37  // status, and installing callbacks to execute when accessibility support
38  // is enabled or disabled.
39  void SetAccessibilityEnabled(bool enabled);
40  bool IsAccessibilityEnabled() const;
41  typedef Callback0::Type Callback;
42  void AddOnEnabledListener(Callback* callback);
43  void AddOnDisabledListener(Callback* callback);
44
45 private:
46  friend struct DefaultSingletonTraits<ExtensionAccessibilityEventRouter>;
47
48  ExtensionAccessibilityEventRouter()
49      : enabled_(false) {}
50  virtual ~ExtensionAccessibilityEventRouter();
51
52  // NotificationObserver::Observe.
53  virtual void Observe(NotificationType type,
54                       const NotificationSource& source,
55                       const NotificationDetails& details);
56
57  void OnWindowOpened(const AccessibilityWindowInfo* details);
58  void OnWindowClosed(const AccessibilityWindowInfo* details);
59  void OnControlFocused(const AccessibilityControlInfo* details);
60  void OnControlAction(const AccessibilityControlInfo* details);
61  void OnTextChanged(const AccessibilityControlInfo* details);
62  void OnMenuOpened(const AccessibilityMenuInfo* details);
63  void OnMenuClosed(const AccessibilityMenuInfo* details);
64
65  void DispatchEvent(Profile* profile,
66                     const char* event_name,
67                     const std::string& json_args);
68
69  // Used for tracking registrations to history service notifications.
70  NotificationRegistrar registrar_;
71
72  DictionaryValue last_focused_control_dict_;
73
74  bool enabled_;
75  std::vector<Callback*> on_enabled_listeners_;
76  std::vector<Callback*> on_disabled_listeners_;
77
78  DISALLOW_COPY_AND_ASSIGN(ExtensionAccessibilityEventRouter);
79};
80
81// API function that enables or disables accessibility support.  Event
82// listeners are only installed when accessibility support is enabled, to
83// minimize the impact.
84class SetAccessibilityEnabledFunction : public SyncExtensionFunction {
85  virtual ~SetAccessibilityEnabledFunction() {}
86  virtual bool RunImpl();
87  DECLARE_EXTENSION_FUNCTION_NAME(
88      "experimental.accessibility.setAccessibilityEnabled")
89};
90
91// API function that returns the most recent focused control.
92class GetFocusedControlFunction : public SyncExtensionFunction {
93  virtual ~GetFocusedControlFunction() {}
94  virtual bool RunImpl();
95  DECLARE_EXTENSION_FUNCTION_NAME(
96      "experimental.accessibility.getFocusedControl")
97};
98
99#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_ACCESSIBILITY_API_H_
100