Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1252)

Unified Diff: chrome/browser/extensions/extension_accessibility_api.cc

Issue 402099: Add an accessibility API for events raised outside of the web content. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_accessibility_api.cc
===================================================================
--- chrome/browser/extensions/extension_accessibility_api.cc (revision 0)
+++ chrome/browser/extensions/extension_accessibility_api.cc (revision 0)
@@ -0,0 +1,181 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_tabs_module.h"
+
+#include "base/json/json_writer.h"
+#include "base/string_util.h"
+#include "base/values.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/browser_window.h"
+#include "chrome/browser/extensions/extension_accessibility_api.h"
+#include "chrome/browser/extensions/extension_accessibility_api_constants.h"
+#include "chrome/browser/extensions/extension_function_dispatcher.h"
+#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extensions_service.h"
+#include "chrome/browser/profile.h"
+#include "chrome/common/extensions/extension.h"
+
+namespace keys = extension_accessibility_api_constants;
+
+// Returns the AccessibilityControlInfo serialized into a JSON string,
+// consisting of an array of a single object of type AccessibilityObject,
+// as defined in the accessibility extension api's json schema.
+std::string ControlInfoToJsonString(const AccessibilityControlInfo* info) {
+ ListValue args;
+ DictionaryValue* dict = new DictionaryValue();
+ info->SerializeToDict(dict);
+ args.Append(dict);
+ std::string json_args;
+ base::JSONWriter::Write(&args, false, &json_args);
+ return json_args;
+}
+
+ExtensionAccessibilityEventRouter*
+ ExtensionAccessibilityEventRouter::GetInstance() {
+ return Singleton<ExtensionAccessibilityEventRouter>::get();
+}
+
+void ExtensionAccessibilityEventRouter::ObserveProfile(Profile* profile) {
+ last_focused_control_dict_.Clear();
+
+ if (registrar_.IsEmpty()) {
+ registrar_.Add(this,
+ NotificationType::ACCESSIBILITY_WINDOW_OPENED,
+ NotificationService::AllSources());
+ registrar_.Add(this,
+ NotificationType::ACCESSIBILITY_WINDOW_CLOSED,
+ NotificationService::AllSources());
+ registrar_.Add(this,
+ NotificationType::ACCESSIBILITY_CONTROL_FOCUSED,
+ NotificationService::AllSources());
+ registrar_.Add(this,
+ NotificationType::ACCESSIBILITY_CONTROL_ACTION,
+ NotificationService::AllSources());
+ registrar_.Add(this,
+ NotificationType::ACCESSIBILITY_TEXT_CHANGED,
+ NotificationService::AllSources());
+ }
+}
+
+void ExtensionAccessibilityEventRouter::Observe(
+ NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ switch (type.value) {
+ case NotificationType::ACCESSIBILITY_WINDOW_OPENED:
+ OnWindowOpened(Details<const AccessibilityWindowInfo>(details).ptr());
+ break;
+ case NotificationType::ACCESSIBILITY_WINDOW_CLOSED:
+ OnWindowClosed(Details<const AccessibilityWindowInfo>(details).ptr());
+ break;
+ case NotificationType::ACCESSIBILITY_CONTROL_FOCUSED:
+ OnControlFocused(Details<const AccessibilityControlInfo>(details).ptr());
+ break;
+ case NotificationType::ACCESSIBILITY_CONTROL_ACTION:
+ OnControlAction(Details<const AccessibilityControlInfo>(details).ptr());
+ break;
+ case NotificationType::ACCESSIBILITY_TEXT_CHANGED:
+ OnTextChanged(Details<const AccessibilityControlInfo>(details).ptr());
+ break;
+ default:
+ NOTREACHED();
+ }
+}
+
+void ExtensionAccessibilityEventRouter::SetAccessibilityEnabled(bool enabled) {
+ if (enabled_ != enabled) {
+ enabled_ = enabled;
+ if (enabled_) {
+ for (unsigned int i = 0; i < on_enabled_listeners_.size(); i++) {
+ on_enabled_listeners_[i]->Run();
+ }
+ } else {
+ for (unsigned int i = 0; i < on_disabled_listeners_.size(); i++) {
+ on_disabled_listeners_[i]->Run();
+ }
+ }
+ }
+}
+
+bool ExtensionAccessibilityEventRouter::IsAccessibilityEnabled() const {
+ return enabled_;
+}
+
+void ExtensionAccessibilityEventRouter::AddOnEnabledListener(
+ Callback* callback) {
+ on_enabled_listeners_.push_back(callback);
+}
+
+void ExtensionAccessibilityEventRouter::AddOnDisabledListener(
+ Callback* callback) {
+ on_disabled_listeners_.push_back(callback);
+}
+
+void ExtensionAccessibilityEventRouter::OnWindowOpened(
+ const AccessibilityWindowInfo* info) {
+ std::string json_args = ControlInfoToJsonString(info);
+ DispatchEvent(info->profile(), keys::kOnWindowOpened, json_args);
+}
+
+void ExtensionAccessibilityEventRouter::OnWindowClosed(
+ const AccessibilityWindowInfo* info) {
+ std::string json_args = ControlInfoToJsonString(info);
+ DispatchEvent(info->profile(), keys::kOnWindowClosed, json_args);
+}
+
+void ExtensionAccessibilityEventRouter::OnControlFocused(
+ const AccessibilityControlInfo* info) {
+ last_focused_control_dict_.Clear();
+ info->SerializeToDict(&last_focused_control_dict_);
+ std::string json_args = ControlInfoToJsonString(info);
+ DispatchEvent(info->profile(), keys::kOnControlFocused, json_args);
+}
+
+void ExtensionAccessibilityEventRouter::OnControlAction(
+ const AccessibilityControlInfo* info) {
+ std::string json_args = ControlInfoToJsonString(info);
+ DispatchEvent(info->profile(), keys::kOnControlAction, json_args);
+}
+
+void ExtensionAccessibilityEventRouter::OnTextChanged(
+ const AccessibilityControlInfo* info) {
+ std::string json_args = ControlInfoToJsonString(info);
+ DispatchEvent(info->profile(), keys::kOnTextChanged, json_args);
+}
+
+void ExtensionAccessibilityEventRouter::DispatchEvent(
+ Profile* profile,
+ const char* event_name,
+ const std::string& json_args) {
+ if (enabled_ && profile && profile->GetExtensionMessageService()) {
+ profile->GetExtensionMessageService()->
+ DispatchEventToRenderers(event_name, json_args);
+ }
+}
+
+bool SetAccessibilityEnabledFunction::RunImpl() {
+ bool enabled;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetAsBoolean(&enabled));
+ ExtensionAccessibilityEventRouter::GetInstance()
+ ->SetAccessibilityEnabled(enabled);
+ return true;
+}
+
+bool GetFocusedControlFunction::RunImpl() {
+ // Get the serialized dict from the last focused control and return it.
+ // However, if the dict is empty, that means we haven't seen any focus
+ // events yet, so return null instead.
+ ExtensionAccessibilityEventRouter *accessibility_event_router =
+ ExtensionAccessibilityEventRouter::GetInstance();
+ DictionaryValue *last_focused_control_dict =
+ accessibility_event_router->last_focused_control_dict();
+ if (last_focused_control_dict->size()) {
+ result_.reset(last_focused_control_dict->DeepCopyWithoutEmptyChildren());
+ } else {
+ result_.reset(Value::CreateNullValue());
+ }
+ return true;
+}
Property changes on: chrome/browser/extensions/extension_accessibility_api.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698