diff options
author | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-13 18:50:10 +0000 |
---|---|---|
committer | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-13 18:50:10 +0000 |
commit | 1dbadbd465e5cce4031dd20eb901ac7da2d67668 (patch) | |
tree | 83f16e5657ccc3a17c6059f72dbba171fce8c478 /chrome/browser/accessibility | |
parent | fd21468f5e0b3d8523a6ad93e337e27632c2b1b6 (diff) | |
download | chromium_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')
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); +} |