summaryrefslogtreecommitdiffstats
path: root/chrome/browser/accessibility
diff options
context:
space:
mode:
authordtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-13 18:50:10 +0000
committerdtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-13 18:50:10 +0000
commit1dbadbd465e5cce4031dd20eb901ac7da2d67668 (patch)
tree83f16e5657ccc3a17c6059f72dbba171fce8c478 /chrome/browser/accessibility
parentfd21468f5e0b3d8523a6ad93e337e27632c2b1b6 (diff)
downloadchromium_src-1dbadbd465e5cce4031dd20eb901ac7da2d67668.zip
chromium_src-1dbadbd465e5cce4031dd20eb901ac7da2d67668.tar.gz
chromium_src-1dbadbd465e5cce4031dd20eb901ac7da2d67668.tar.bz2
Refactoring of BrowserAccessibility (Mac) to use cross platform base classes.
BUG=none TEST=passing unit tests. Review URL: http://codereview.chromium.org/3696003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62431 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/accessibility')
-rw-r--r--chrome/browser/accessibility/browser_accessibility.h8
-rw-r--r--chrome/browser/accessibility/browser_accessibility_mac.h59
-rw-r--r--chrome/browser/accessibility/browser_accessibility_mac.mm27
-rw-r--r--chrome/browser/accessibility/browser_accessibility_manager.cc7
-rw-r--r--chrome/browser/accessibility/browser_accessibility_manager_mac.h33
-rw-r--r--chrome/browser/accessibility/browser_accessibility_manager_mac.mm80
6 files changed, 212 insertions, 2 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility.h b/chrome/browser/accessibility/browser_accessibility.h
index bdf374e..62cffb5 100644
--- a/chrome/browser/accessibility/browser_accessibility.h
+++ b/chrome/browser/accessibility/browser_accessibility.h
@@ -15,7 +15,9 @@
#include "webkit/glue/webaccessibility.h"
class BrowserAccessibilityManager;
-#if defined(OS_WIN)
+#if defined(OS_MACOSX)
+class BrowserAccessibilityMac;
+#elif defined(OS_WIN)
class BrowserAccessibilityWin;
#endif
@@ -97,7 +99,9 @@ class BrowserAccessibility {
int32 index_in_parent() const { return index_in_parent_; }
WebKit::WebRect location() const { return location_; }
-#if defined(OS_WIN)
+#if defined(OS_MACOSX)
+ BrowserAccessibilityMac* toBrowserAccessibilityMac();
+#elif defined(OS_WIN)
BrowserAccessibilityWin* toBrowserAccessibilityWin();
#endif
diff --git a/chrome/browser/accessibility/browser_accessibility_mac.h b/chrome/browser/accessibility/browser_accessibility_mac.h
new file mode 100644
index 0000000..136be99
--- /dev/null
+++ b/chrome/browser/accessibility/browser_accessibility_mac.h
@@ -0,0 +1,59 @@
+// 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.
+
+#ifndef CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MAC_H_
+#define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MAC_H_
+#pragma once
+
+#include <map>
+#include <utility>
+#include <vector>
+
+#include "chrome/browser/accessibility/browser_accessibility.h"
+
+@class BrowserAccessibilityCocoa;
+
+class BrowserAccessibilityMac : public BrowserAccessibility {
+ public:
+ // Implementation of BrowserAccessibility.
+ virtual void Initialize();
+ virtual void ReleaseReference();
+
+ // Accessers that allow the cocoa wrapper to read these values.
+ const string16& name() const { return name_; }
+ const string16& value() const { return value_; }
+ const std::map<int32, string16>& attributes() const { return attributes_; }
+
+ const std::vector<std::pair<string16, string16> >& html_attributes() const {
+ return html_attributes_;
+ }
+
+ int32 role() const { return role_; }
+ int32 state() const { return state_; }
+ const string16& role_name() const { return role_name_; }
+
+ // Accesser and setter for
+ // the BrowserAccessibilityCocoa associated with us.
+ BrowserAccessibilityCocoa* native_view() const {
+ return browser_accessibility_cocoa_;
+ }
+
+ void native_view(BrowserAccessibilityCocoa* v) {
+ browser_accessibility_cocoa_ = v;
+ }
+
+ private:
+ // This gives BrowserAccessibility::Create access to the class constructor.
+ friend class BrowserAccessibility;
+
+ BrowserAccessibilityMac();
+
+ // Allows access to the BrowserAccessibilityCocoa which wraps this.
+ // BrowserAccessibility. We only initialize this member if the accessibility
+ // API requests this object.
+ BrowserAccessibilityCocoa* browser_accessibility_cocoa_;
+ DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityMac);
+};
+
+#endif // CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MAC_H_
diff --git a/chrome/browser/accessibility/browser_accessibility_mac.mm b/chrome/browser/accessibility/browser_accessibility_mac.mm
new file mode 100644
index 0000000..1a6c1d4
--- /dev/null
+++ b/chrome/browser/accessibility/browser_accessibility_mac.mm
@@ -0,0 +1,27 @@
+// 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.
+
+#import "chrome/browser/accessibility/browser_accessibility_mac.h"
+
+// Static.
+BrowserAccessibility* BrowserAccessibility::Create() {
+ return new BrowserAccessibilityMac();
+}
+
+BrowserAccessibilityMac::BrowserAccessibilityMac() {
+}
+
+// TODO(dtseng): ensure we create BrowserAccessibilityCocoa here
+// (RenderWidgetHostViewCocoa to BrowserAccessibilityManagerMac refactoring).
+void BrowserAccessibilityMac::Initialize() {
+}
+
+// TODO(dtseng): ensure we cleanup BrowserAccessibilityCocoa and this class.
+// (RenderWidgetHostViewCocoa to BrowserAccessibilityManagerMac refactoring).
+void BrowserAccessibilityMac::ReleaseReference() {
+}
+
+BrowserAccessibilityMac* BrowserAccessibility::toBrowserAccessibilityMac() {
+ return static_cast<BrowserAccessibilityMac*>(this);
+}
diff --git a/chrome/browser/accessibility/browser_accessibility_manager.cc b/chrome/browser/accessibility/browser_accessibility_manager.cc
index c663666..eb17e6e 100644
--- a/chrome/browser/accessibility/browser_accessibility_manager.cc
+++ b/chrome/browser/accessibility/browser_accessibility_manager.cc
@@ -140,6 +140,13 @@ void BrowserAccessibilityManager::OnAccessibilityObjectFocusChange(
focus_ = new_browser_acc;
if (delegate_ && delegate_->HasFocus())
GotFocus();
+ // Mac currently does not have a BrowserAccessibilityDelegate.
+ else if (!delegate_) {
+ NotifyAccessibilityEvent(
+ ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_FOCUS_CHANGED,
+ focus_);
+ }
}
void BrowserAccessibilityManager::OnAccessibilityObjectLoadComplete(
diff --git a/chrome/browser/accessibility/browser_accessibility_manager_mac.h b/chrome/browser/accessibility/browser_accessibility_manager_mac.h
new file mode 100644
index 0000000..892de15
--- /dev/null
+++ b/chrome/browser/accessibility/browser_accessibility_manager_mac.h
@@ -0,0 +1,33 @@
+// 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.
+
+#ifndef CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_MAC_H_
+#define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_MAC_H_
+#pragma once
+
+#import <Cocoa/Cocoa.h>
+
+#include "chrome/browser/accessibility/browser_accessibility_manager.h"
+
+class BrowserAccessibilityManagerMac : public BrowserAccessibilityManager {
+ public:
+ // Implementation of BrowserAccessibilityManager.
+ virtual void NotifyAccessibilityEvent(
+ ViewHostMsg_AccessibilityNotification_Params::NotificationType n,
+ BrowserAccessibility* node);
+
+ private:
+ // This gives BrowserAccessibilityManager::Create access to the class
+ // constructor.
+ friend class BrowserAccessibilityManager;
+
+ BrowserAccessibilityManagerMac(gfx::NativeView parent_view,
+ const webkit_glue::WebAccessibility& src,
+ BrowserAccessibilityDelegate* delegate,
+ BrowserAccessibilityFactory* factory);
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManagerMac);
+};
+
+#endif // CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_MAC_H_
diff --git a/chrome/browser/accessibility/browser_accessibility_manager_mac.mm b/chrome/browser/accessibility/browser_accessibility_manager_mac.mm
new file mode 100644
index 0000000..8aadf8b
--- /dev/null
+++ b/chrome/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -0,0 +1,80 @@
+// 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/accessibility/browser_accessibility_manager_mac.h"
+
+#include "chrome/browser/accessibility/browser_accessibility_mac.h"
+#import "chrome/browser/cocoa/browser_accessibility.h"
+// TODO(dtseng): move to delegate?
+#import "chrome/browser/renderer_host/render_widget_host_view_mac.h"
+
+// static
+BrowserAccessibilityManager* BrowserAccessibilityManager::Create(
+ gfx::NativeView parent_view,
+ const WebAccessibility& src,
+ BrowserAccessibilityDelegate* delegate,
+ BrowserAccessibilityFactory* factory) {
+ return new BrowserAccessibilityManagerMac(
+ parent_view, src, delegate, factory);
+}
+
+BrowserAccessibility* BrowserAccessibilityFactory::Create() {
+ return BrowserAccessibility::Create();
+}
+
+BrowserAccessibilityManagerMac::BrowserAccessibilityManagerMac(
+ gfx::NativeView parent_window,
+ const webkit_glue::WebAccessibility& src,
+ BrowserAccessibilityDelegate* delegate,
+ BrowserAccessibilityFactory* factory)
+ : BrowserAccessibilityManager(parent_window, src, delegate, factory) {
+}
+
+void BrowserAccessibilityManagerMac::NotifyAccessibilityEvent(
+ ViewHostMsg_AccessibilityNotification_Params::NotificationType n,
+ BrowserAccessibility* node) {
+ // TODO(dtseng): support all notifications.
+ NSString* event_id = @"";
+ switch (n) {
+ case ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_CHECK_STATE_CHANGED:
+ return;
+ case ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_CHILDREN_CHANGED:
+ event_id = NSAccessibilityValueChangedNotification;
+ if (GetRoot() == node)
+ [((RenderWidgetHostViewCocoa*)GetParentView())
+ setAccessibilityTreeRoot:GetRoot()];
+ else
+ [node->GetParent()->toBrowserAccessibilityMac()->native_view()
+ updateDescendants];
+ break;
+ case ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_FOCUS_CHANGED:
+ event_id = NSAccessibilityFocusedUIElementChangedNotification;
+ if (GetRoot() == node)
+ [((RenderWidgetHostViewCocoa*)GetParentView())
+ setAccessibilityTreeRoot:GetRoot()];
+ else
+ [node->GetParent()->toBrowserAccessibilityMac()->native_view()
+ updateDescendants];
+ break;
+ case ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_LOAD_COMPLETE:
+ [((RenderWidgetHostViewCocoa*)GetParentView())
+ setAccessibilityTreeRoot:GetRoot()];
+ return;
+ case ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_VALUE_CHANGED:
+ event_id = NSAccessibilityValueChangedNotification;
+ break;
+ case ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED:
+ return;
+ }
+ BrowserAccessibilityCocoa* native_node = node->toBrowserAccessibilityMac()->
+ native_view();
+ DCHECK(native_node);
+ NSAccessibilityPostNotification(native_node, event_id);
+}