diff options
author | caitkp@chromium.org <caitkp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-17 13:52:20 +0000 |
---|---|---|
committer | caitkp@chromium.org <caitkp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-17 13:52:20 +0000 |
commit | def2730480a49c306729a5e932cc12d292157fe1 (patch) | |
tree | c0dbee2557227f4d50638dc040c0175dfc2196d2 /chrome/browser/accessibility | |
parent | 6b7ff7d13d0064f2154aca2f4172c811ac93efd4 (diff) | |
download | chromium_src-def2730480a49c306729a5e932cc12d292157fe1.zip chromium_src-def2730480a49c306729a5e932cc12d292157fe1.tar.gz chromium_src-def2730480a49c306729a5e932cc12d292157fe1.tar.bz2 |
Remove notifications from Accessibility API
TBR=darin@chromium.org
BUG=268984
TEST= no change
Review URL: https://chromiumcodereview.appspot.com/22922003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218171 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/accessibility')
4 files changed, 128 insertions, 89 deletions
diff --git a/chrome/browser/accessibility/accessibility_events.cc b/chrome/browser/accessibility/accessibility_events.cc index 53c8c8d..0b31906 100644 --- a/chrome/browser/accessibility/accessibility_events.cc +++ b/chrome/browser/accessibility/accessibility_events.cc @@ -5,7 +5,7 @@ #include "chrome/browser/accessibility/accessibility_events.h" #include "base/values.h" - +#include "chrome/browser/accessibility/accessibility_extension_api.h" #include "chrome/browser/accessibility/accessibility_extension_api_constants.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/profiles/profile.h" @@ -15,16 +15,40 @@ namespace keys = extension_accessibility_api_constants; -void SendAccessibilityNotification(int type, AccessibilityEventInfo* info) { +void SendControlAccessibilityNotification( + ui::AccessibilityTypes::Event event, + AccessibilityControlInfo* info) { + Profile *profile = info->profile(); + if (profile->ShouldSendAccessibilityEvents()) { + ExtensionAccessibilityEventRouter::GetInstance()->HandleControlEvent( + event, + info); + } +} + +void SendMenuAccessibilityNotification( + ui::AccessibilityTypes::Event event, + AccessibilityMenuInfo* info) { Profile *profile = info->profile(); if (profile->ShouldSendAccessibilityEvents()) { - content::NotificationService::current()->Notify( - type, - content::Source<Profile>(profile), - content::Details<AccessibilityEventInfo>(info)); + ExtensionAccessibilityEventRouter::GetInstance()->HandleMenuEvent( + event, + info); } } +void SendWindowAccessibilityNotification( + ui::AccessibilityTypes::Event event, + AccessibilityWindowInfo* info) { + Profile *profile = info->profile(); + if (profile->ShouldSendAccessibilityEvents()) { + ExtensionAccessibilityEventRouter::GetInstance()->HandleWindowEvent( + event, + info); + } +} + + AccessibilityControlInfo::AccessibilityControlInfo( Profile* profile, const std::string& name) : AccessibilityEventInfo(profile), diff --git a/chrome/browser/accessibility/accessibility_events.h b/chrome/browser/accessibility/accessibility_events.h index 6c5cf86..d028c7d 100644 --- a/chrome/browser/accessibility/accessibility_events.h +++ b/chrome/browser/accessibility/accessibility_events.h @@ -7,19 +7,31 @@ #include <string> #include "base/compiler_specific.h" +#include "ui/base/accessibility/accessibility_types.h" -class AccessibilityEventInfo; +class AccessibilityControlInfo; +class AccessibilityMenuInfo; +class AccessibilityWindowInfo; class Profile; namespace base { class DictionaryValue; } -// Use the NotificationService to post the given accessibility -// notification type with AccessibilityEventInfo details to any -// listeners. Will not send if the profile's pause level is nonzero -// (using profile->PauseAccessibilityEvents). -void SendAccessibilityNotification(int type, AccessibilityEventInfo* info); +// Notify the ExtensionAccessibilityEventRouter of the given accessibility +// event and AccessibilityEventInfo details. Will not send if the profile's +// pause level is nonzero (using profile->PauseAccessibilityEvents). +void SendControlAccessibilityNotification( + ui::AccessibilityTypes::Event event, + AccessibilityControlInfo* info); + +void SendMenuAccessibilityNotification( + ui::AccessibilityTypes::Event event, + AccessibilityMenuInfo* info); + +void SendWindowAccessibilityNotification( + ui::AccessibilityTypes::Event event, + AccessibilityWindowInfo* info); // Abstract parent class for accessibility event information passed to event // listeners. diff --git a/chrome/browser/accessibility/accessibility_extension_api.cc b/chrome/browser/accessibility/accessibility_extension_api.cc index 033a843..80f0bd52 100644 --- a/chrome/browser/accessibility/accessibility_extension_api.cc +++ b/chrome/browser/accessibility/accessibility_extension_api.cc @@ -8,7 +8,6 @@ #include "base/strings/string_number_conversions.h" #include "base/values.h" #include "chrome/browser/accessibility/accessibility_extension_api_constants.h" -#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/api/tabs/tabs_constants.h" #include "chrome/browser/extensions/event_router.h" #include "chrome/browser/extensions/extension_system.h" @@ -18,7 +17,6 @@ #include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_accessibility_state.h" -#include "content/public/browser/notification_service.h" #include "extensions/common/error_utils.h" namespace keys = extension_accessibility_api_constants; @@ -43,76 +41,74 @@ ExtensionAccessibilityEventRouter* ExtensionAccessibilityEventRouter::ExtensionAccessibilityEventRouter() : enabled_(false) { - registrar_.Add(this, - chrome::NOTIFICATION_ACCESSIBILITY_WINDOW_OPENED, - content::NotificationService::AllSources()); - registrar_.Add(this, - chrome::NOTIFICATION_ACCESSIBILITY_WINDOW_CLOSED, - content::NotificationService::AllSources()); - registrar_.Add(this, - chrome::NOTIFICATION_ACCESSIBILITY_CONTROL_FOCUSED, - content::NotificationService::AllSources()); - registrar_.Add(this, - chrome::NOTIFICATION_ACCESSIBILITY_CONTROL_ACTION, - content::NotificationService::AllSources()); - registrar_.Add(this, - chrome::NOTIFICATION_ACCESSIBILITY_TEXT_CHANGED, - content::NotificationService::AllSources()); - registrar_.Add(this, - chrome::NOTIFICATION_ACCESSIBILITY_MENU_OPENED, - content::NotificationService::AllSources()); - registrar_.Add(this, - chrome::NOTIFICATION_ACCESSIBILITY_MENU_CLOSED, - content::NotificationService::AllSources()); } ExtensionAccessibilityEventRouter::~ExtensionAccessibilityEventRouter() { + control_event_callback_.Reset(); } -void ExtensionAccessibilityEventRouter::Observe( - int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - switch (type) { - case chrome::NOTIFICATION_ACCESSIBILITY_WINDOW_OPENED: - OnWindowOpened( - content::Details<const AccessibilityWindowInfo>(details).ptr()); - break; - case chrome::NOTIFICATION_ACCESSIBILITY_WINDOW_CLOSED: - OnWindowClosed( - content::Details<const AccessibilityWindowInfo>(details).ptr()); - break; - case chrome::NOTIFICATION_ACCESSIBILITY_CONTROL_FOCUSED: - OnControlFocused( - content::Details<const AccessibilityControlInfo>(details).ptr()); - break; - case chrome::NOTIFICATION_ACCESSIBILITY_CONTROL_ACTION: - OnControlAction( - content::Details<const AccessibilityControlInfo>(details).ptr()); - break; - case chrome::NOTIFICATION_ACCESSIBILITY_TEXT_CHANGED: - OnTextChanged( - content::Details<const AccessibilityControlInfo>(details).ptr()); - break; - case chrome::NOTIFICATION_ACCESSIBILITY_MENU_OPENED: - OnMenuOpened( - content::Details<const AccessibilityMenuInfo>(details).ptr()); +void ExtensionAccessibilityEventRouter::SetAccessibilityEnabled(bool enabled) { + enabled_ = enabled; +} + +bool ExtensionAccessibilityEventRouter::IsAccessibilityEnabled() const { + return enabled_; +} + +void ExtensionAccessibilityEventRouter::SetControlEventCallbackForTesting( + ControlEventCallback control_event_callback) { + DCHECK(control_event_callback_.is_null()); + control_event_callback_ = control_event_callback; +} + +void ExtensionAccessibilityEventRouter::ClearControlEventCallback() { + control_event_callback_.Reset(); +} + +void ExtensionAccessibilityEventRouter::HandleWindowEvent( + ui::AccessibilityTypes::Event event, + const AccessibilityWindowInfo* info) { + if (event == ui::AccessibilityTypes::EVENT_ALERT) + OnWindowOpened(info); +} + +void ExtensionAccessibilityEventRouter::HandleMenuEvent( + ui::AccessibilityTypes::Event event, + const AccessibilityMenuInfo* info) { + switch (event) { + case ui::AccessibilityTypes::EVENT_MENUSTART: + case ui::AccessibilityTypes::EVENT_MENUPOPUPSTART: + OnMenuOpened(info); break; - case chrome::NOTIFICATION_ACCESSIBILITY_MENU_CLOSED: - OnMenuClosed( - content::Details<const AccessibilityMenuInfo>(details).ptr()); + case ui::AccessibilityTypes::EVENT_MENUEND: + case ui::AccessibilityTypes::EVENT_MENUPOPUPEND: + OnMenuClosed(info); break; default: NOTREACHED(); } } -void ExtensionAccessibilityEventRouter::SetAccessibilityEnabled(bool enabled) { - enabled_ = enabled; -} +void ExtensionAccessibilityEventRouter::HandleControlEvent( + ui::AccessibilityTypes::Event event, + const AccessibilityControlInfo* info) { + if (!control_event_callback_.is_null()) + control_event_callback_.Run(event, info); -bool ExtensionAccessibilityEventRouter::IsAccessibilityEnabled() const { - return enabled_; + switch (event) { + case ui::AccessibilityTypes::EVENT_TEXT_CHANGED: + case ui::AccessibilityTypes::EVENT_SELECTION_CHANGED: + OnTextChanged(info); + break; + case ui::AccessibilityTypes::EVENT_VALUE_CHANGED: + OnControlAction(info); + break; + case ui::AccessibilityTypes::EVENT_FOCUS: + OnControlFocused(info); + break; + default: + NOTREACHED(); + } } void ExtensionAccessibilityEventRouter::OnWindowOpened( @@ -121,12 +117,6 @@ void ExtensionAccessibilityEventRouter::OnWindowOpened( DispatchEvent(info->profile(), keys::kOnWindowOpened, args.Pass()); } -void ExtensionAccessibilityEventRouter::OnWindowClosed( - const AccessibilityWindowInfo* info) { - scoped_ptr<ListValue> args(ControlInfoToEventArguments(info)); - DispatchEvent(info->profile(), keys::kOnWindowClosed, args.Pass()); -} - void ExtensionAccessibilityEventRouter::OnControlFocused( const AccessibilityControlInfo* info) { last_focused_control_dict_.Clear(); diff --git a/chrome/browser/accessibility/accessibility_extension_api.h b/chrome/browser/accessibility/accessibility_extension_api.h index d1132c0..61c3930 100644 --- a/chrome/browser/accessibility/accessibility_extension_api.h +++ b/chrome/browser/accessibility/accessibility_extension_api.h @@ -12,13 +12,15 @@ #include "base/values.h" #include "chrome/browser/accessibility/accessibility_events.h" #include "chrome/browser/extensions/extension_function.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" +#include "ui/base/accessibility/accessibility_types.h" // Observes the profile and routes accessibility notifications as events // to the extension system. -class ExtensionAccessibilityEventRouter : public content::NotificationObserver { +class ExtensionAccessibilityEventRouter { public: + typedef base::Callback<void(ui::AccessibilityTypes::Event, + const AccessibilityControlInfo*)> + ControlEventCallback; // Single instance of the event router. static ExtensionAccessibilityEventRouter* GetInstance(); @@ -35,19 +37,30 @@ class ExtensionAccessibilityEventRouter : public content::NotificationObserver { void SetAccessibilityEnabled(bool enabled); bool IsAccessibilityEnabled() const; + // Set and remove callbacks (used for testing, to confirm that events are + // getting through). + void SetControlEventCallbackForTesting(ControlEventCallback callback); + void ClearControlEventCallback(); + + // Route a window-related accessibility event. + void HandleWindowEvent(ui::AccessibilityTypes::Event event, + const AccessibilityWindowInfo* info); + + // Route a menu-related accessibility event. + void HandleMenuEvent(ui::AccessibilityTypes::Event event, + const AccessibilityMenuInfo* info); + + // Route a control-related accessibility event. + void HandleControlEvent(ui::AccessibilityTypes::Event event, + const AccessibilityControlInfo* info); + private: friend struct DefaultSingletonTraits<ExtensionAccessibilityEventRouter>; ExtensionAccessibilityEventRouter(); virtual ~ExtensionAccessibilityEventRouter(); - // content::NotificationObserver::Observe. - virtual void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) OVERRIDE; - void OnWindowOpened(const AccessibilityWindowInfo* details); - void OnWindowClosed(const AccessibilityWindowInfo* details); void OnControlFocused(const AccessibilityControlInfo* details); void OnControlAction(const AccessibilityControlInfo* details); void OnTextChanged(const AccessibilityControlInfo* details); @@ -58,13 +71,13 @@ class ExtensionAccessibilityEventRouter : public content::NotificationObserver { const char* event_name, scoped_ptr<base::ListValue> event_args); - // Used for tracking registrations to history service notifications. - content::NotificationRegistrar registrar_; - DictionaryValue last_focused_control_dict_; bool enabled_; + // For testing. + ControlEventCallback control_event_callback_; + DISALLOW_COPY_AND_ASSIGN(ExtensionAccessibilityEventRouter); }; |