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