diff options
Diffstat (limited to 'chrome')
12 files changed, 152 insertions, 209 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility.h b/chrome/browser/accessibility/browser_accessibility.h index 62cffb5..6e6b8fb 100644 --- a/chrome/browser/accessibility/browser_accessibility.h +++ b/chrome/browser/accessibility/browser_accessibility.h @@ -15,8 +15,8 @@ #include "webkit/glue/webaccessibility.h" class BrowserAccessibilityManager; -#if defined(OS_MACOSX) -class BrowserAccessibilityMac; +#if defined(OS_MACOSX) && __OBJC__ +@class BrowserAccessibilityCocoa; #elif defined(OS_WIN) class BrowserAccessibilityWin; #endif @@ -91,16 +91,26 @@ class BrowserAccessibility { BrowserAccessibility* new_acc); // Accessors + const std::map<int32, string16>& attributes() const { return attributes_; } int32 child_id() const { return child_id_; } const std::vector<BrowserAccessibility*>& children() const { return children_; } - int32 renderer_id() const { return renderer_id_; } + const std::vector<std::pair<string16, string16> >& html_attributes() const { + return html_attributes_; + } int32 index_in_parent() const { return index_in_parent_; } WebKit::WebRect location() const { return location_; } + BrowserAccessibilityManager* manager() const { return manager_; } + const string16& name() const { return name_; } + int32 renderer_id() const { return renderer_id_; } + int32 role() const { return role_; } + const string16& role_name() const { return role_name_; } + int32 state() const { return state_; } + const string16& value() const { return value_; } -#if defined(OS_MACOSX) - BrowserAccessibilityMac* toBrowserAccessibilityMac(); +#if defined(OS_MACOSX) && __OBJC__ + BrowserAccessibilityCocoa* toBrowserAccessibilityCocoa(); #elif defined(OS_WIN) BrowserAccessibilityWin* toBrowserAccessibilityWin(); #endif diff --git a/chrome/browser/cocoa/browser_accessibility.h b/chrome/browser/accessibility/browser_accessibility_cocoa.h index 7a6fdb4..170c713 100644 --- a/chrome/browser/cocoa/browser_accessibility.h +++ b/chrome/browser/accessibility/browser_accessibility_cocoa.h @@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_COCOA_BROWSER_ACCESSIBILITY_H_ -#define CHROME_BROWSER_COCOA_BROWSER_ACCESSIBILITY_H_ +#ifndef CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_COCOA_H_ +#define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_COCOA_H_ #pragma once #import <Cocoa/Cocoa.h> #import "base/scoped_nsobject.h" -#include "chrome/browser/accessibility/browser_accessibility_mac.h" -#import "chrome/browser/cocoa/browser_accessibility_delegate.h" +#import "chrome/browser/accessibility/browser_accessibility_delegate_mac.h" +#include "chrome/browser/accessibility/browser_accessibility.h" // BrowserAccessibilityCocoa is a cocoa wrapper around the BrowserAccessibility // object. The renderer converts webkit's accessibility tree into a @@ -20,10 +20,6 @@ @private BrowserAccessibility* browserAccessibility_; id<BrowserAccessibilityDelegateCocoa> delegate_; - scoped_nsobject<NSMutableArray> children_; - // The parent of the accessibility object. This can be another - // BrowserAccessibilityCocoa or a RenderWidgetHostViewCocoa. - id parent_; // weak } // This creates a cocoa browser accessibility object around @@ -31,16 +27,10 @@ // used to communicate with the host renderer. None of these // parameters can be null. - (id)initWithObject:(BrowserAccessibility*)accessibility - delegate:(id<BrowserAccessibilityDelegateCocoa>)delegate - parent:(id)parent; - -// Updates children from backing BrowserAccessibility. -- (NSArray*)updateChildren; -// Updates all descendants from the backing BrowserAccessibility. -- (void)updateDescendants; - -@property(nonatomic, readonly) BrowserAccessibility* browserAccessibility; + delegate:(id<BrowserAccessibilityDelegateCocoa>)delegate; +// Backing source of accessibility info. +@property(nonatomic, assign) BrowserAccessibility* browserAccessibility; // Children is an array of BrowserAccessibility objects, representing // the accessibility children of this object. @property(nonatomic, readonly) NSArray* children; @@ -59,4 +49,4 @@ @end -#endif // CHROME_BROWSER_COCOA_BROWSER_ACCESSIBILITY_H_ +#endif // CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_COCOA_H_ diff --git a/chrome/browser/cocoa/browser_accessibility.mm b/chrome/browser/accessibility/browser_accessibility_cocoa.mm index abef731..0a52a05 100644 --- a/chrome/browser/cocoa/browser_accessibility.mm +++ b/chrome/browser/accessibility/browser_accessibility_cocoa.mm @@ -4,7 +4,7 @@ #include <execinfo.h> -#import "chrome/browser/cocoa/browser_accessibility.h" +#import "chrome/browser/accessibility/browser_accessibility_cocoa.h" #include "app/l10n_util_mac.h" #include "base/string16.h" @@ -58,72 +58,52 @@ static const RoleEntry roles[] = { // GetState checks the bitmask used in webaccessibility.h to check // if the given state was set on the accessibility object. bool GetState(BrowserAccessibility* accessibility, int state) { - // TODO(dtseng): add accesser. - return ((accessibility->toBrowserAccessibilityMac()->state() >> - state) & 1); + return ((accessibility->state() >> state) & 1); } } // namespace @implementation BrowserAccessibilityCocoa +@synthesize browserAccessibility = browserAccessibility_; + - (id)initWithObject:(BrowserAccessibility*)accessibility - delegate:(id<BrowserAccessibilityDelegateCocoa>)delegate - parent:(id)parent { + delegate:(id<BrowserAccessibilityDelegateCocoa>)delegate { if ((self = [super init])) { browserAccessibility_ = accessibility; - parent_ = parent; delegate_ = delegate; - // Set the proper native view for the new object? - browserAccessibility_->toBrowserAccessibilityMac()->native_view(self); } return self; } -- (BrowserAccessibility*)browserAccessibility { - return browserAccessibility_; +// Deletes our associated BrowserAccessibilityMac. +- (void)dealloc { + if (browserAccessibility_) { + delete browserAccessibility_; + browserAccessibility_ = NULL; + } + + [super dealloc]; } // Returns an array of BrowserAccessibilityCocoa objects, representing the // accessibility children of this object. - (NSArray*)children { - if (!children_.get()) { - return [self updateChildren]; - } else { - return children_.get(); - } -} - -- (NSArray*)updateChildren { - children_.reset( - [[NSMutableArray alloc] - initWithCapacity:browserAccessibility_->GetChildCount()]); + NSMutableArray* ret = [[[NSMutableArray alloc] + initWithCapacity:browserAccessibility_->GetChildCount()] autorelease]; for (uint32 index = 0; index < browserAccessibility_->GetChildCount(); ++index) { - scoped_nsobject<BrowserAccessibilityCocoa> child( - [[BrowserAccessibilityCocoa alloc] - initWithObject:browserAccessibility_->GetChild(index) - delegate:delegate_ - parent:self]); - [children_ addObject:child]; + [ret addObject: + browserAccessibility_->GetChild(index)->toBrowserAccessibilityCocoa()]; } - return children_; -} - -- (void)updateDescendants { - NSArray* newChildren = [self updateChildren]; - for (uint32 i = 0; i < [newChildren count]; ++i) { - [(BrowserAccessibilityCocoa*)[newChildren objectAtIndex:i] - updateDescendants]; - } + return ret; } // Returns whether or not this node should be ignored in the // accessibility tree. - (BOOL)isIgnored { - return browserAccessibility_->toBrowserAccessibilityMac()->role() == - WebAccessibility::ROLE_IGNORED; + return browserAccessibility_->role() == WebAccessibility::ROLE_IGNORED; } // The origin of this accessibility object in the page's document. @@ -138,8 +118,7 @@ bool GetState(BrowserAccessibility* accessibility, int state) { - (NSString*)role { NSString* role = NSAccessibilityUnknownRole; WebAccessibility::Role value = - static_cast<WebAccessibility::Role>( browserAccessibility_-> - toBrowserAccessibilityMac()->role()); + static_cast<WebAccessibility::Role>( browserAccessibility_->role()); const size_t numRoles = sizeof(roles) / sizeof(roles[0]); for (size_t i = 0; i < numRoles; ++i) { if (roles[i].value == value) { @@ -174,14 +153,12 @@ bool GetState(BrowserAccessibility* accessibility, int state) { // Returns the accessibility value for the given attribute. If the value isn't // supported this will return nil. - (id)accessibilityAttributeValue:(NSString*)attribute { - BrowserAccessibilityMac* browserAccessibilityMac = browserAccessibility_-> - toBrowserAccessibilityMac(); if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) { return [self role]; } if ([attribute isEqualToString:NSAccessibilityDescriptionAttribute]) { return NSStringForWebAccessibilityAttribute( - browserAccessibilityMac->attributes(), + browserAccessibility_->attributes(), WebAccessibility::ATTR_DESCRIPTION); } if ([attribute isEqualToString:NSAccessibilityPositionAttribute]) { @@ -198,20 +175,25 @@ bool GetState(BrowserAccessibility* accessibility, int state) { return [self children]; } if ([attribute isEqualToString:NSAccessibilityParentAttribute]) { - if (parent_) { - return NSAccessibilityUnignoredAncestor(parent_); + // A nil parent means we're the root. + if (browserAccessibility_->GetParent()) { + return NSAccessibilityUnignoredAncestor( + browserAccessibility_->GetParent()->toBrowserAccessibilityCocoa()); + } else { + // Hook back up to RenderWidgetHostViewCocoa. + return browserAccessibility_->manager()->GetParentView(); } } if ([attribute isEqualToString:NSAccessibilityTitleAttribute]) { - return base::SysUTF16ToNSString(browserAccessibilityMac->name()); + return base::SysUTF16ToNSString(browserAccessibility_->name()); } if ([attribute isEqualToString:NSAccessibilityHelpAttribute]) { return NSStringForWebAccessibilityAttribute( - browserAccessibilityMac->attributes(), + browserAccessibility_->attributes(), WebAccessibility::ATTR_HELP); } if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { - return base::SysUTF16ToNSString(browserAccessibilityMac->value()); + return base::SysUTF16ToNSString(browserAccessibility_->value()); } if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) { return [self roleDescription]; diff --git a/chrome/browser/cocoa/browser_accessibility_delegate.h b/chrome/browser/accessibility/browser_accessibility_delegate_mac.h index 3ee821c..18eb49b 100644 --- a/chrome/browser/cocoa/browser_accessibility_delegate.h +++ b/chrome/browser/accessibility/browser_accessibility_delegate_mac.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_COCOA_BROWSER_ACCESSIBILITY_DELEGATE_H_ -#define CHROME_BROWSER_COCOA_BROWSER_ACCESSIBILITY_DELEGATE_H_ +#ifndef CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_DELEGATE_MAC_H_ +#define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_DELEGATE_MAC_H_ #pragma once @class BrowserAccessibilityCocoa; @@ -20,4 +20,4 @@ - (NSWindow*)window; @end -#endif // CHROME_BROWSER_COCOA_BROWSER_ACCESSIBILITY_DELEGATE_H_ +#endif // CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_DELEGATE_MAC_H_ diff --git a/chrome/browser/accessibility/browser_accessibility_mac.h b/chrome/browser/accessibility/browser_accessibility_mac.h index 136be99..1e83fd8 100644 --- a/chrome/browser/accessibility/browser_accessibility_mac.h +++ b/chrome/browser/accessibility/browser_accessibility_mac.h @@ -10,6 +10,7 @@ #include <utility> #include <vector> +#include "base/scoped_nsobject.h" #include "chrome/browser/accessibility/browser_accessibility.h" @class BrowserAccessibilityCocoa; @@ -20,29 +21,11 @@ class BrowserAccessibilityMac : public 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. + // 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; @@ -50,8 +33,8 @@ class BrowserAccessibilityMac : public BrowserAccessibility { BrowserAccessibilityMac(); // Allows access to the BrowserAccessibilityCocoa which wraps this. - // BrowserAccessibility. We only initialize this member if the accessibility - // API requests this object. + // BrowserAccessibility. + // We own this object. BrowserAccessibilityCocoa* browser_accessibility_cocoa_; DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityMac); }; diff --git a/chrome/browser/accessibility/browser_accessibility_mac.mm b/chrome/browser/accessibility/browser_accessibility_mac.mm index 1a6c1d4..4df23c6 100644 --- a/chrome/browser/accessibility/browser_accessibility_mac.mm +++ b/chrome/browser/accessibility/browser_accessibility_mac.mm @@ -2,26 +2,47 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#import <Cocoa/Cocoa.h> + #import "chrome/browser/accessibility/browser_accessibility_mac.h" +#import "chrome/browser/accessibility/browser_accessibility_cocoa.h" +#import "chrome/browser/accessibility/browser_accessibility_delegate_mac.h" +#include "chrome/browser/accessibility/browser_accessibility_manager.h" +#import "chrome/browser/renderer_host/render_widget_host_view_mac.h" + + // Static. BrowserAccessibility* BrowserAccessibility::Create() { return new BrowserAccessibilityMac(); } -BrowserAccessibilityMac::BrowserAccessibilityMac() { +BrowserAccessibilityMac::BrowserAccessibilityMac() + : browser_accessibility_cocoa_(NULL) { } -// TODO(dtseng): ensure we create BrowserAccessibilityCocoa here -// (RenderWidgetHostViewCocoa to BrowserAccessibilityManagerMac refactoring). void BrowserAccessibilityMac::Initialize() { + if (browser_accessibility_cocoa_) + return; + + // We take ownership of the cocoa obj here. + browser_accessibility_cocoa_ = [[BrowserAccessibilityCocoa alloc] + initWithObject:this + delegate:(RenderWidgetHostViewCocoa*)manager_->GetParentView()]; } -// TODO(dtseng): ensure we cleanup BrowserAccessibilityCocoa and this class. -// (RenderWidgetHostViewCocoa to BrowserAccessibilityManagerMac refactoring). void BrowserAccessibilityMac::ReleaseReference() { + if (browser_accessibility_cocoa_) { + // Relinquish ownership of the cocoa obj. + [browser_accessibility_cocoa_ release]; + browser_accessibility_cocoa_ = nil; + // At this point, other processes may have a reference to + // browser_accessibility_cocoa_. When the retain count hits zero, it will + // destroy us in dealloc. + } } -BrowserAccessibilityMac* BrowserAccessibility::toBrowserAccessibilityMac() { - return static_cast<BrowserAccessibilityMac*>(this); +BrowserAccessibilityCocoa* BrowserAccessibility::toBrowserAccessibilityCocoa() { + return static_cast<BrowserAccessibilityMac*>(this)-> + native_view(); } diff --git a/chrome/browser/cocoa/browser_accessibility_unittest.mm b/chrome/browser/accessibility/browser_accessibility_mac_unittest.mm index 27bee1a..266182f 100644 --- a/chrome/browser/cocoa/browser_accessibility_unittest.mm +++ b/chrome/browser/accessibility/browser_accessibility_mac_unittest.mm @@ -4,16 +4,17 @@ #import <Cocoa/Cocoa.h> +#include "base/scoped_ptr.h"; #include "base/string_util.h" #include "base/utf_string_conversions.h" -#include "chrome/browser/accessibility/browser_accessibility_mac.h" -#include "chrome/browser/cocoa/browser_accessibility.h" +#include "chrome/browser/accessibility/browser_accessibility_cocoa.h" +#include "chrome/browser/accessibility/browser_accessibility_manager.h" #include "chrome/browser/cocoa/cocoa_test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" @interface MockAccessibilityDelegate : - NSObject<BrowserAccessibilityDelegateCocoa> + NSView<BrowserAccessibilityDelegateCocoa> - (NSPoint)accessibilityPointInScreen:(BrowserAccessibilityCocoa*)accessibility; - (void)doDefaultAction:(int32)accessibilityObjectId; @@ -65,45 +66,21 @@ class BrowserAccessibilityTest : public CocoaTest { child2.location.width = 250; child2.location.height = 100; - // TODO(dtseng): use BrowserAccessibilityManagerMac once it manages - // these objects. - BrowserAccessibility* rootBrowserAccessibility = - BrowserAccessibility::Create(); - BrowserAccessibility* child1BrowserAccessibility = - BrowserAccessibility::Create(); - BrowserAccessibility* child2BrowserAccessibility = - BrowserAccessibility::Create(); - - rootBrowserAccessibility->Initialize(NULL, - NULL, - 0, - 0, - root); - child1BrowserAccessibility->Initialize(NULL, - NULL, - 0, - 0, - child1); - child2BrowserAccessibility->Initialize(NULL, - NULL, - 0, - 0, - child2); - - rootBrowserAccessibility->AddChild(child1BrowserAccessibility); - rootBrowserAccessibility->AddChild(child2BrowserAccessibility); + root.children.push_back(child1); + root.children.push_back(child2); delegate_.reset([[MockAccessibilityDelegate alloc] init]); - accessibility_.reset( - [[BrowserAccessibilityCocoa alloc] - initWithObject:rootBrowserAccessibility - delegate:delegate_ - parent:delegate_]); + manager_.reset( + BrowserAccessibilityManager::Create(delegate_, root, NULL)); + // The manager still owns this object. + accessibility_ = manager_->GetRoot()->toBrowserAccessibilityCocoa(); } protected: scoped_nsobject<MockAccessibilityDelegate> delegate_; - scoped_nsobject<BrowserAccessibilityCocoa> accessibility_; + // We do not own this object. + BrowserAccessibilityCocoa* accessibility_; + scoped_ptr<BrowserAccessibilityManager> manager_; }; // Standard hit test. diff --git a/chrome/browser/accessibility/browser_accessibility_manager_mac.mm b/chrome/browser/accessibility/browser_accessibility_manager_mac.mm index 8aadf8b..6e39cd1f 100644 --- a/chrome/browser/accessibility/browser_accessibility_manager_mac.mm +++ b/chrome/browser/accessibility/browser_accessibility_manager_mac.mm @@ -4,10 +4,7 @@ #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" +#import "chrome/browser/accessibility/browser_accessibility_cocoa.h" // static BrowserAccessibilityManager* BrowserAccessibilityManager::Create( @@ -27,54 +24,42 @@ BrowserAccessibilityManagerMac::BrowserAccessibilityManagerMac( gfx::NativeView parent_window, const webkit_glue::WebAccessibility& src, BrowserAccessibilityDelegate* delegate, - BrowserAccessibilityFactory* factory) + BrowserAccessibilityFactory* factory) : BrowserAccessibilityManager(parent_window, src, delegate, factory) { } void BrowserAccessibilityManagerMac::NotifyAccessibilityEvent( ViewHostMsg_AccessibilityNotification_Params::NotificationType n, BrowserAccessibility* node) { - // TODO(dtseng): support all notifications. + // Refer to AXObjectCache.mm (webkit). NSString* event_id = @""; switch (n) { case ViewHostMsg_AccessibilityNotification_Params:: NOTIFICATION_TYPE_CHECK_STATE_CHANGED: + // Does not exist on Mac. 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; + // TODO(dtseng): no clear equivalent on Mac. + return; 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; + event_id = @"AXLoadComplete"; + break; case ViewHostMsg_AccessibilityNotification_Params:: NOTIFICATION_TYPE_VALUE_CHANGED: event_id = NSAccessibilityValueChangedNotification; break; case ViewHostMsg_AccessibilityNotification_Params:: NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED: - return; + event_id = NSAccessibilitySelectedTextChangedNotification; + break; } - BrowserAccessibilityCocoa* native_node = node->toBrowserAccessibilityMac()-> - native_view(); + BrowserAccessibilityCocoa* native_node = node->toBrowserAccessibilityCocoa(); DCHECK(native_node); - NSAccessibilityPostNotification(native_node, event_id); + NSAccessibilityPostNotification(native_node, event_id); } diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h index b9e41f9..45af5c0 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.h +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h @@ -13,10 +13,9 @@ #include "base/scoped_ptr.h" #include "base/task.h" #include "base/time.h" +#include "chrome/browser/accessibility/browser_accessibility_delegate_mac.h" #include "chrome/browser/accessibility/browser_accessibility_manager.h" #include "chrome/browser/cocoa/base_view.h" -#include "chrome/browser/cocoa/browser_accessibility.h" -#include "chrome/browser/cocoa/browser_accessibility_delegate.h" #include "chrome/browser/renderer_host/accelerated_surface_container_manager_mac.h" #include "chrome/browser/renderer_host/render_widget_host_view.h" #include "chrome/common/edit_command.h" @@ -50,9 +49,6 @@ class RWHVMEditCommandHelper; BOOL closeOnDeactivate_; scoped_ptr<RWHVMEditCommandHelper> editCommand_helper_; - // TODO(dtseng): refactor to BrowserAccessibilityManagerMac. - scoped_nsobject<NSArray> accessibilityChildren_; - // These are part of the magic tooltip code from WebKit's WebHTMLView: id trackingRectOwner_; // (not retained) void *trackingRectUserData_; @@ -144,8 +140,6 @@ class RWHVMEditCommandHelper; - (void)renderWidgetHostWasResized; // Cancel ongoing composition (abandon the marked text). - (void)cancelComposition; -// Set the new accessibility tree. -- (void)setAccessibilityTreeRoot:(BrowserAccessibility*) treeRoot; // Confirm ongoing composition. - (void)confirmComposition; // Enables or disables plugin IME for the given plugin. diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm index 3281a0e..ffc4a92 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm @@ -18,6 +18,8 @@ #include "base/string_util.h" #include "base/sys_info.h" #include "base/sys_string_conversions.h" +#import "chrome/browser/accessibility/browser_accessibility_cocoa.h" +#include "chrome/browser/accessibility/browser_accessibility_state.h" #include "chrome/browser/browser_thread.h" #include "chrome/browser/browser_trial.h" #import "chrome/browser/cocoa/rwhvm_editcommand_helper.h" @@ -447,8 +449,10 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) render_widget_host_->set_view(this); // Turn on accessibility only if VoiceOver is running. - if (IsVoiceOverRunning()) + if (IsVoiceOverRunning()) { + Singleton<BrowserAccessibilityState>()->OnScreenReaderDetected(); render_widget_host_->EnableRendererAccessibility(); + } } RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { @@ -1186,9 +1190,6 @@ void RenderWidgetHostViewMac::OnAccessibilityNotifications( empty_document.state = 0; browser_accessibility_manager_.reset( BrowserAccessibilityManager::Create(cocoa_view_, empty_document, NULL)); - // TODO(dtseng): refactor to BrowserAccessibilityManagerMac. - [cocoa_view_ - setAccessibilityTreeRoot:browser_accessibility_manager_->GetRoot()]; } browser_accessibility_manager_->OnAccessibilityNotifications(params); } @@ -1802,19 +1803,6 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) { return ([event type] == NSKeyDown) ? YES : NO; } -// Create the BrowserAccessibility tree from the WebAccessibility tree passed -// from the renderer. -// TODO(dtseng): refactor to BrowserAccessibilityManagerMac. -- (void)setAccessibilityTreeRoot:(BrowserAccessibility*) treeRoot { - BrowserAccessibilityCocoa* root = - [[BrowserAccessibilityCocoa alloc] initWithObject:treeRoot - delegate:self - parent:self]; - [root autorelease]; - accessibilityChildren_.reset([[NSArray alloc] initWithObjects:root, nil]); - [root updateDescendants]; -} - - (NSArray *)accessibilityArrayAttributeValues:(NSString *)attribute index:(NSUInteger)index maxCount:(NSUInteger)maxCount { @@ -1832,23 +1820,28 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) { } - (id)accessibilityAttributeValue:(NSString *)attribute { - if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) { - // TODO(dtseng): refactor to BrowserAccessibilityManagerMac. - return accessibilityChildren_.get(); - } else if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) { - return NSAccessibilityScrollAreaRole; - } + BrowserAccessibilityManager* manager = + renderWidgetHostView_->browser_accessibility_manager_.get(); + if ([attribute isEqualToString:NSAccessibilityChildrenAttribute] && + manager) { + return [NSArray arrayWithObjects:manager-> + GetRoot()->toBrowserAccessibilityCocoa(), nil]; + } else if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) { + return NSAccessibilityScrollAreaRole; + } id ret = [super accessibilityAttributeValue:attribute]; return ret; } - (id)accessibilityHitTest:(NSPoint)point { + if (!renderWidgetHostView_->browser_accessibility_manager_.get()) + return self; NSPoint pointInWindow = [[self window] convertScreenToBase:point]; NSPoint localPoint = [self convertPoint:pointInWindow fromView:nil]; localPoint.y = NSHeight([self bounds]) - localPoint.y; - if ([accessibilityChildren_ count] == 0) - return self; - BrowserAccessibilityCocoa* root = [accessibilityChildren_ objectAtIndex:0]; + BrowserAccessibilityCocoa* root = renderWidgetHostView_-> + browser_accessibility_manager_-> + GetRoot()->toBrowserAccessibilityCocoa(); id obj = [root accessibilityHitTest:localPoint]; return obj; } @@ -1858,7 +1851,15 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) { } - (NSUInteger)accessibilityIndexOfChild:(id)child { - return [accessibilityChildren_ indexOfObject:child]; + BrowserAccessibilityManager* manager = + renderWidgetHostView_->browser_accessibility_manager_.get(); + // Only child is root. + if (manager && + manager->GetRoot()->toBrowserAccessibilityCocoa() == child) { + return 0; + } else { + return NSNotFound; + } } - (id)accessibilityFocusedUIElement { @@ -1869,7 +1870,7 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) { DCHECK(focused_item); if (focused_item) { BrowserAccessibilityCocoa* focused_item_cocoa = - focused_item->toBrowserAccessibilityMac()->native_view(); + focused_item->toBrowserAccessibilityCocoa(); DCHECK(focused_item_cocoa); if (focused_item_cocoa) return focused_item_cocoa; diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index fe756da..811059f 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -63,16 +63,19 @@ 'browser/about_flags.h', 'browser/accessibility/browser_accessibility.cc', 'browser/accessibility/browser_accessibility.h', - 'browser/accessibility/browser_accessibility_state.cc', - 'browser/accessibility/browser_accessibility_state.h', + 'browser/accessibility/browser_accessibility_cocoa.h', + 'browser/accessibility/browser_accessibility_cocoa.mm', + 'browser/accessibility/browser_accessibility_delegate_mac.h', + 'browser/accessibility/browser_accessibility_mac.h', + 'browser/accessibility/browser_accessibility_mac.mm', 'browser/accessibility/browser_accessibility_manager.cc', 'browser/accessibility/browser_accessibility_manager.h', 'browser/accessibility/browser_accessibility_manager_mac.h', 'browser/accessibility/browser_accessibility_manager_mac.mm', - 'browser/accessibility/browser_accessibility_mac.h', - 'browser/accessibility/browser_accessibility_mac.mm', 'browser/accessibility/browser_accessibility_manager_win.cc', 'browser/accessibility/browser_accessibility_manager_win.h', + 'browser/accessibility/browser_accessibility_state.cc', + 'browser/accessibility/browser_accessibility_state.h', 'browser/accessibility/browser_accessibility_win.cc', 'browser/accessibility/browser_accessibility_win.h', 'browser/accessibility_events.h', @@ -809,9 +812,6 @@ 'browser/cocoa/base_bubble_controller.mm', 'browser/cocoa/base_view.h', 'browser/cocoa/base_view.mm', - 'browser/cocoa/browser_accessibility.h', - 'browser/cocoa/browser_accessibility.mm', - 'browser/cocoa/browser_accessibility_delegate.h', 'browser/cocoa/browser_window_factory.mm', 'browser/cocoa/bookmarks/bookmark_all_tabs_controller.h', 'browser/cocoa/bookmarks/bookmark_all_tabs_controller.mm', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index a3c77f8..8b660da 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -975,6 +975,7 @@ 'app/chrome_dll.rc', # All unittests in browser, common, renderer and service. 'browser/about_flags_unittest.cc', + 'browser/accessibility/browser_accessibility_mac_unittest.mm', 'browser/accessibility/browser_accessibility_win_unittest.cc', 'browser/app_controller_mac_unittest.mm', 'browser/autocomplete_history_manager_unittest.cc', @@ -1113,7 +1114,6 @@ 'browser/cocoa/bookmarks/bookmark_model_observer_for_cocoa_unittest.mm', 'browser/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm', 'browser/cocoa/bookmarks/bookmark_tree_browser_cell_unittest.mm', - 'browser/cocoa/browser_accessibility_unittest.mm', 'browser/cocoa/browser_frame_view_unittest.mm', 'browser/cocoa/browser_window_cocoa_unittest.mm', 'browser/cocoa/browser_window_controller_unittest.mm', |