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