diff options
author | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-14 01:02:47 +0000 |
---|---|---|
committer | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-14 01:02:47 +0000 |
commit | 457af8d4fd866e1b40649a15943f9f7329cfcc38 (patch) | |
tree | 66e87dd380a09090cc9d66593af54cd0e955aedb /chrome/browser/accessibility | |
parent | 0e10cb5cb75c2ef241f46c0430b8fdc570518810 (diff) | |
download | chromium_src-457af8d4fd866e1b40649a15943f9f7329cfcc38.zip chromium_src-457af8d4fd866e1b40649a15943f9f7329cfcc38.tar.gz chromium_src-457af8d4fd866e1b40649a15943f9f7329cfcc38.tar.bz2 |
Support the AXRows and AXColumns attributes. We do this by examining the AX hieararchy exposed by webkit (specifically our own cache of it in BrowserAccessibility's). Table ax elements always have its associated rows and columns as immediate children.
I also looked into passing this information over from WebKit with a sample patch. It would involve exposing AccessibilityTable accessors within WebAccessibilityObject, adding additional members to WebAccessibility to be shipped over (renderer id's or elements themselves.
Presenting this alternative since it was easy to implement and can be generalized for Windows as well by pushing this up to BrowserAccessibility.
BUG=66719
TEST=manually with VoiceOver.
Review URL: http://codereview.chromium.org/5862004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85358 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/accessibility')
4 files changed, 56 insertions, 0 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility.h b/chrome/browser/accessibility/browser_accessibility.h index 9f28c27..9788b4e 100644 --- a/chrome/browser/accessibility/browser_accessibility.h +++ b/chrome/browser/accessibility/browser_accessibility.h @@ -138,6 +138,9 @@ class BrowserAccessibility { return html_attributes_; } int32 index_in_parent() const { return index_in_parent_; } + const std::vector<int32>& indirect_child_ids() const { + return indirect_child_ids_; + } gfx::Rect location() const { return location_; } BrowserAccessibilityManager* manager() const { return manager_; } const string16& name() const { return name_; } diff --git a/chrome/browser/accessibility/browser_accessibility_cocoa.mm b/chrome/browser/accessibility/browser_accessibility_cocoa.mm index d9e31d1..8afc33b 100644 --- a/chrome/browser/accessibility/browser_accessibility_cocoa.mm +++ b/chrome/browser/accessibility/browser_accessibility_cocoa.mm @@ -37,6 +37,7 @@ static const RoleEntry roles[] = { { WebAccessibility::ROLE_NONE, NSAccessibilityUnknownRole }, { WebAccessibility::ROLE_BUTTON, NSAccessibilityButtonRole }, { WebAccessibility::ROLE_CHECKBOX, NSAccessibilityCheckBoxRole }, + { WebAccessibility::ROLE_CELL, @"AXCell" }, { WebAccessibility::ROLE_COLUMN, NSAccessibilityColumnRole }, { WebAccessibility::ROLE_GRID, NSAccessibilityGridRole }, { WebAccessibility::ROLE_GROUP, NSAccessibilityGroupRole }, @@ -104,6 +105,17 @@ bool GetState(BrowserAccessibility* accessibility, int state) { else [children_ addObject:child]; } + + // Also, add indirect children (if any). + for (uint32 i = 0; + i < browserAccessibility_->indirect_child_ids().size(); + ++i) { + int32 child_id = browserAccessibility_->indirect_child_ids()[i]; + BrowserAccessibilityCocoa* child = + browserAccessibility_->manager()->GetFromRendererID(child_id)-> + toBrowserAccessibilityCocoa(); + [children_ addObject:child]; + } } return children_; } @@ -258,6 +270,25 @@ bool GetState(BrowserAccessibility* accessibility, int state) { GetState(browserAccessibility_, WebAccessibility::STATE_TRAVERSED)]; } + // AXTable attributes. + if ([[self role] isEqualToString:NSAccessibilityTableRole]) { + if ([attribute isEqualToString:NSAccessibilityRowsAttribute]) { + NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; + for (BrowserAccessibilityCocoa* child in [self children]) { + if ([[child role] isEqualToString:NSAccessibilityRowRole]) + [ret addObject:child]; + } + return ret; + } else if ([attribute isEqualToString:NSAccessibilityColumnsAttribute]) { + NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; + for (BrowserAccessibilityCocoa* child in [self children]) { + if ([[child role] isEqualToString:NSAccessibilityColumnRole]) + [ret addObject:child]; + } + return ret; + } + } + // AXWebArea attributes. if ([attribute isEqualToString:@"AXLoaded"]) return [NSNumber numberWithBool:YES]; @@ -424,6 +455,13 @@ bool GetState(BrowserAccessibility* accessibility, int state) { nil]]; // Specific role attributes. + if ([self role] == NSAccessibilityTableRole) { + [ret addObjectsFromArray:[NSArray arrayWithObjects: + NSAccessibilityColumnsAttribute, + NSAccessibilityRowsAttribute, + nil]]; + } + if ([self role] == @"AXWebArea") { [ret addObjectsFromArray:[NSArray arrayWithObjects: @"AXLoaded", diff --git a/chrome/browser/accessibility/browser_accessibility_manager.cc b/chrome/browser/accessibility/browser_accessibility_manager.cc index 36cbfd2..f46e056 100644 --- a/chrome/browser/accessibility/browser_accessibility_manager.cc +++ b/chrome/browser/accessibility/browser_accessibility_manager.cc @@ -86,6 +86,17 @@ BrowserAccessibility* BrowserAccessibilityManager::GetFromChildID( } } +BrowserAccessibility* BrowserAccessibilityManager::GetFromRendererID( + int32 renderer_id) { + base::hash_map<int32, int32>::iterator iter = + renderer_id_to_child_id_map_.find(renderer_id); + if (iter == renderer_id_to_child_id_map_.end()) + return NULL; + + int32 child_id = iter->second; + return GetFromChildID(child_id); +} + void BrowserAccessibilityManager::Remove(int32 child_id, int32 renderer_id) { child_id_map_.erase(child_id); renderer_id_to_child_id_map_.erase(renderer_id); diff --git a/chrome/browser/accessibility/browser_accessibility_manager.h b/chrome/browser/accessibility/browser_accessibility_manager.h index fa31185..1014f33 100644 --- a/chrome/browser/accessibility/browser_accessibility_manager.h +++ b/chrome/browser/accessibility/browser_accessibility_manager.h @@ -75,6 +75,10 @@ class BrowserAccessibilityManager { // does not make a new reference. BrowserAccessibility* GetFromChildID(int32 child_id); + // Return a pointer to the object corresponding to the given renderer_id, + // does not make a new reference. + BrowserAccessibility* GetFromRendererID(int32 renderer_id); + // Called to notify the accessibility manager that its associated native // view got focused. void GotFocus(); |