diff options
author | Steve Block <steveblock@google.com> | 2010-02-02 14:57:50 +0000 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2010-02-04 15:06:55 +0000 |
commit | d0825bca7fe65beaee391d30da42e937db621564 (patch) | |
tree | 7461c49eb5844ffd1f35d1ba2c8b7584c1620823 /WebCore/accessibility/mac | |
parent | 3db770bd97c5a59b6c7574ca80a39e5a51c1defd (diff) | |
download | external_webkit-d0825bca7fe65beaee391d30da42e937db621564.zip external_webkit-d0825bca7fe65beaee391d30da42e937db621564.tar.gz external_webkit-d0825bca7fe65beaee391d30da42e937db621564.tar.bz2 |
Merge webkit.org at r54127 : Initial merge by git
Change-Id: Ib661abb595522f50ea406f72d3a0ce17f7193c82
Diffstat (limited to 'WebCore/accessibility/mac')
4 files changed, 135 insertions, 50 deletions
diff --git a/WebCore/accessibility/mac/AXObjectCacheMac.mm b/WebCore/accessibility/mac/AXObjectCacheMac.mm index bf1b22c..6f886fe 100644 --- a/WebCore/accessibility/mac/AXObjectCacheMac.mm +++ b/WebCore/accessibility/mac/AXObjectCacheMac.mm @@ -35,6 +35,10 @@ #import <wtf/PassRefPtr.h> +#ifndef NSAccessibilityLiveRegionChangedNotification +#define NSAccessibilityLiveRegionChangedNotification @"AXLiveRegionChanged" +#endif + // The simple Cocoa calls in this file don't throw exceptions. namespace WebCore { @@ -66,9 +70,6 @@ void AXObjectCache::postPlatformNotification(AccessibilityObject* obj, AXNotific else macNotification = NSAccessibilityFocusedUIElementChangedNotification; break; - case AXCheckedStateChanged: - macNotification = "AXCheckedStateChanged"; - break; case AXFocusedUIElementChanged: macNotification = NSAccessibilityFocusedUIElementChangedNotification; break; @@ -87,11 +88,19 @@ void AXObjectCache::postPlatformNotification(AccessibilityObject* obj, AXNotific case AXValueChanged: macNotification = NSAccessibilityValueChangedNotification; break; + case AXLiveRegionChanged: + macNotification = NSAccessibilityLiveRegionChangedNotification; + break; + // Does not exist on Mac. + case AXCheckedStateChanged: default: return; } NSAccessibilityPostNotification(obj->wrapper(), macNotification); + + // Used by DRT to know when notifications are posted. + [obj->wrapper() accessibilityPostedNotification:macNotification]; } void AXObjectCache::handleFocusedUIElementChanged(RenderObject*, RenderObject*) diff --git a/WebCore/accessibility/mac/AccessibilityObjectMac.mm b/WebCore/accessibility/mac/AccessibilityObjectMac.mm index 722b03e..1807a9b 100644 --- a/WebCore/accessibility/mac/AccessibilityObjectMac.mm +++ b/WebCore/accessibility/mac/AccessibilityObjectMac.mm @@ -43,24 +43,9 @@ bool AccessibilityObject::accessibilityIgnoreAttachment() const AccessibilityObjectPlatformInclusion AccessibilityObject::accessibilityPlatformIncludesObject() const { - // Determine if this is in a tree. If so, we apply special behavior to make it work like an AXOutline. - AccessibilityObject* axObj = parentObject(); - bool isInTree = false; - while (axObj) { - if (axObj->isTree()) { - isInTree = true; - break; - } - axObj = axObj->parentObjectUnignored(); - } - - // If the object is in a tree, only tree items should be exposed (and the children of tree items). - if (isInTree) { - AccessibilityRole role = roleValue(); - if (role != TreeItemRole && role != StaticTextRole) - return IgnoreObject; - } - + if (isMenuListPopup() || isMenuListOption()) + return IgnoreObject; + return DefaultBehavior; } diff --git a/WebCore/accessibility/mac/AccessibilityObjectWrapper.h b/WebCore/accessibility/mac/AccessibilityObjectWrapper.h index 910305b..1f0a9e3 100644 --- a/WebCore/accessibility/mac/AccessibilityObjectWrapper.h +++ b/WebCore/accessibility/mac/AccessibilityObjectWrapper.h @@ -52,6 +52,9 @@ class VisiblePosition; - (void)detach; - (WebCore::AccessibilityObject*)accessibilityObject; +// Used to inform an element when a notification is posted for it. Used by DRT. +- (void)accessibilityPostedNotification:(NSString *)notification; + - (NSView*)attachmentView; @end diff --git a/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm b/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm index 6099b3d..b53b167 100644 --- a/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm +++ b/WebCore/accessibility/mac/AccessibilityObjectWrapper.mm @@ -32,6 +32,7 @@ #if HAVE(ACCESSIBILITY) #import "AXObjectCache.h" +#import "AccessibilityARIAGridRow.h" #import "AccessibilityListBox.h" #import "AccessibilityList.h" #import "AccessibilityRenderObject.h" @@ -131,6 +132,26 @@ using namespace std; #define NSAccessibilityDropEffectsAttribute @"AXDropEffects" #endif +#ifndef NSAccessibilityARIALiveAttribute +#define NSAccessibilityARIALiveAttribute @"AXARIALive" +#endif + +#ifndef NSAccessibilityARIAAtomicAttribute +#define NSAccessibilityARIAAtomicAttribute @"AXARIAAtomic" +#endif + +#ifndef NSAccessibilityARIARelevantAttribute +#define NSAccessibilityARIARelevantAttribute @"AXARIARelevant" +#endif + +#ifndef NSAccessibilityARIABusyAttribute +#define NSAccessibilityARIABusyAttribute @"AXARIABusy" +#endif + +#ifndef NSAccessibilityLoadingProgressAttribute +#define NSAccessibilityLoadingProgressAttribute @"AXLoadingProgress" +#endif + #ifdef BUILDING_ON_TIGER typedef unsigned NSUInteger; #define NSAccessibilityValueDescriptionAttribute @"AXValueDescription" @@ -171,7 +192,7 @@ typedef unsigned NSUInteger; - (void)detach { // Send unregisterUniqueIdForUIElement unconditionally because if it is - // ever accidently not done (via other bugs in our AX implementation) you + // ever accidentally not done (via other bugs in our AX implementation) you // end up with a crash like <rdar://problem/4273149>. It is safe and not // expensive to send even if the object is not registered. [self unregisterUniqueIdForUIElement]; @@ -417,7 +438,7 @@ static void AXAttributeStringSetHeadingLevel(NSMutableAttributedString* attrStri static void AXAttributeStringSetElement(NSMutableAttributedString* attrString, NSString* attribute, AccessibilityObject* object, NSRange range) { if (object && object->isAccessibilityRenderObject()) { - // make a serialiazable AX object + // make a serializable AX object RenderObject* renderer = static_cast<AccessibilityRenderObject*>(object)->renderer(); if (!renderer) @@ -599,6 +620,20 @@ static WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(VisiblePositi if (m_object->supportsARIADropping()) [additional addObject:NSAccessibilityDropEffectsAttribute]; + if (m_object->isDataTable() && static_cast<AccessibilityTable*>(m_object)->supportsSelectedRows()) + [additional addObject:NSAccessibilitySelectedRowsAttribute]; + + if (m_object->supportsARIALiveRegion()) { + [additional addObject:NSAccessibilityARIALiveAttribute]; + [additional addObject:NSAccessibilityARIARelevantAttribute]; + } + + // If an object is a child of a live region, then add these + if (m_object->isInsideARIALiveRegion()) { + [additional addObject:NSAccessibilityARIAAtomicAttribute]; + [additional addObject:NSAccessibilityARIABusyAttribute]; + } + return additional; } @@ -686,6 +721,7 @@ static WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(VisiblePositi [tempArray addObject:@"AXLinkUIElements"]; [tempArray addObject:@"AXLoaded"]; [tempArray addObject:@"AXLayoutCount"]; + [tempArray addObject:NSAccessibilityLoadingProgressAttribute]; [tempArray addObject:NSAccessibilityURLAttribute]; webAreaAttrs = [[NSArray alloc] initWithArray:tempArray]; [tempArray release]; @@ -863,7 +899,6 @@ static WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(VisiblePositi } if (outlineRowAttrs == nil) { tempArray = [[NSMutableArray alloc] initWithArray:tableRowAttrs]; - [tempArray addObject:NSAccessibilityIndexAttribute]; [tempArray addObject:NSAccessibilityDisclosingAttribute]; [tempArray addObject:NSAccessibilityDisclosedByRowAttribute]; [tempArray addObject:NSAccessibilityDisclosureLevelAttribute]; @@ -888,12 +923,17 @@ static WebCoreTextMarkerRange* textMarkerRangeFromVisiblePositions(VisiblePositi else if (m_object->isDataTable()) objectAttributes = tableAttrs; - else if (m_object->isTableRow()) - objectAttributes = tableRowAttrs; else if (m_object->isTableColumn()) objectAttributes = tableColAttrs; else if (m_object->isTableCell()) objectAttributes = tableCellAttrs; + else if (m_object->isTableRow()) { + // An ARIA table row can be collapsed and expanded, so it needs the extra attributes. + if (m_object->isARIATreeGridRow()) + objectAttributes = outlineRowAttrs; + else + objectAttributes = tableRowAttrs; + } else if (m_object->isTree()) objectAttributes = outlineAttrs; @@ -1392,15 +1432,17 @@ static NSString* roleValueToNSString(AccessibilityRole value) if (m_object->isWebArea()) { - if ([attributeName isEqualToString: @"AXLinkUIElements"]) { + if ([attributeName isEqualToString:@"AXLinkUIElements"]) { AccessibilityObject::AccessibilityChildrenVector links; static_cast<AccessibilityRenderObject*>(m_object)->getDocumentLinks(links); return convertToNSArray(links); } - if ([attributeName isEqualToString: @"AXLoaded"]) - return [NSNumber numberWithBool: m_object->isLoaded()]; - if ([attributeName isEqualToString: @"AXLayoutCount"]) - return [NSNumber numberWithInt: m_object->layoutCount()]; + if ([attributeName isEqualToString:@"AXLoaded"]) + return [NSNumber numberWithBool:m_object->isLoaded()]; + if ([attributeName isEqualToString:@"AXLayoutCount"]) + return [NSNumber numberWithInt:m_object->layoutCount()]; + if ([attributeName isEqualToString:NSAccessibilityLoadingProgressAttribute]) + return [NSNumber numberWithDouble:m_object->estimatedLoadingProgress()]; } if (m_object->isTextControl()) { @@ -1568,9 +1610,14 @@ static NSString* roleValueToNSString(AccessibilityRole value) return convertToNSArray(static_cast<AccessibilityTable*>(m_object)->columns()); } + if ([attributeName isEqualToString:NSAccessibilitySelectedRowsAttribute]) { + AccessibilityObject::AccessibilityChildrenVector selectedChildrenCopy; + m_object->selectedChildren(selectedChildrenCopy); + return convertToNSArray(selectedChildrenCopy); + } + // HTML tables don't support these if ([attributeName isEqualToString:NSAccessibilitySelectedColumnsAttribute] || - [attributeName isEqualToString:NSAccessibilitySelectedRowsAttribute] || [attributeName isEqualToString:NSAccessibilitySelectedCellsAttribute]) return nil; @@ -1600,11 +1647,6 @@ static NSString* roleValueToNSString(AccessibilityRole value) } } - if (m_object->isTableRow()) { - if ([attributeName isEqualToString:NSAccessibilityIndexAttribute]) - return [NSNumber numberWithInt:static_cast<AccessibilityTableRow*>(m_object)->rowIndex()]; - } - if (m_object->isTableColumn()) { if ([attributeName isEqualToString:NSAccessibilityIndexAttribute]) return [NSNumber numberWithInt:static_cast<AccessibilityTableColumn*>(m_object)->columnIndex()]; @@ -1652,8 +1694,8 @@ static NSString* roleValueToNSString(AccessibilityRole value) return [NSArray array]; } - if (m_object->isTreeItem()) { - if ([attributeName isEqualToString:NSAccessibilityIndexAttribute]) { + if ([attributeName isEqualToString:NSAccessibilityIndexAttribute]) { + if (m_object->isTreeItem()) { AccessibilityObject* parent = m_object->parentObject(); for (; parent && !parent->isTree(); parent = parent->parentObject()) { } @@ -1671,16 +1713,28 @@ static NSString* roleValueToNSString(AccessibilityRole value) return nil; } - - // The rows that are considered inside this row. - if ([attributeName isEqualToString:NSAccessibilityDisclosedRowsAttribute]) { + if (m_object->isTableRow()) { + if ([attributeName isEqualToString:NSAccessibilityIndexAttribute]) + return [NSNumber numberWithInt:static_cast<AccessibilityTableRow*>(m_object)->rowIndex()]; + } + } + + // The rows that are considered inside this row. + if ([attributeName isEqualToString:NSAccessibilityDisclosedRowsAttribute]) { + if (m_object->isTreeItem()) { AccessibilityObject::AccessibilityChildrenVector rowsCopy; m_object->ariaTreeItemDisclosedRows(rowsCopy); return convertToNSArray(rowsCopy); + } else if (m_object->isARIATreeGridRow()) { + AccessibilityObject::AccessibilityChildrenVector rowsCopy; + static_cast<AccessibilityARIAGridRow*>(m_object)->disclosedRows(rowsCopy); + return convertToNSArray(rowsCopy); } - - // The row that contains this row. It should be the same as the first parent that is a treeitem. - if ([attributeName isEqualToString:NSAccessibilityDisclosedByRowAttribute]) { + } + + // The row that contains this row. It should be the same as the first parent that is a treeitem. + if ([attributeName isEqualToString:NSAccessibilityDisclosedByRowAttribute]) { + if (m_object->isTreeItem()) { AccessibilityObject* parent = m_object->parentObject(); while (parent) { if (parent->isTreeItem()) @@ -1691,12 +1745,18 @@ static NSString* roleValueToNSString(AccessibilityRole value) parent = parent->parentObject(); } return nil; + } else if (m_object->isARIATreeGridRow()) { + AccessibilityObject* row = static_cast<AccessibilityARIAGridRow*>(m_object)->disclosedByRow(); + if (!row) + return nil; + return row->wrapper(); } - if ([attributeName isEqualToString:NSAccessibilityDisclosureLevelAttribute]) - return [NSNumber numberWithInt:m_object->hierarchicalLevel()]; - if ([attributeName isEqualToString:NSAccessibilityDisclosingAttribute]) - return [NSNumber numberWithBool:m_object->isExpanded()]; } + + if ([attributeName isEqualToString:NSAccessibilityDisclosureLevelAttribute]) + return [NSNumber numberWithInt:m_object->hierarchicalLevel()]; + if ([attributeName isEqualToString:NSAccessibilityDisclosingAttribute]) + return [NSNumber numberWithBool:m_object->isExpanded()]; if ((m_object->isListBox() || m_object->isList()) && [attributeName isEqualToString:NSAccessibilityOrientationAttribute]) return NSAccessibilityVerticalOrientationValue; @@ -1790,6 +1850,16 @@ static NSString* roleValueToNSString(AccessibilityRole value) return dropEffectsArray; } + // ARIA Live region attributes. + if ([attributeName isEqualToString:NSAccessibilityARIALiveAttribute]) + return m_object->ariaLiveRegionStatus(); + if ([attributeName isEqualToString:NSAccessibilityARIARelevantAttribute]) + return m_object->ariaLiveRegionRelevant(); + if ([attributeName isEqualToString:NSAccessibilityARIAAtomicAttribute]) + return [NSNumber numberWithBool:m_object->ariaLiveRegionAtomic()]; + if ([attributeName isEqualToString:NSAccessibilityARIABusyAttribute]) + return [NSNumber numberWithBool:m_object->ariaLiveRegionBusy()]; + // this is used only by DumpRenderTree for testing if ([attributeName isEqualToString:@"AXClickPoint"]) return [NSValue valueWithPoint:m_object->clickPoint()]; @@ -2153,7 +2223,7 @@ static NSString* roleValueToNSString(AccessibilityRole value) else if ([attributeName isEqualToString:NSAccessibilitySelectedRowsAttribute]) { AccessibilityObject::AccessibilityChildrenVector selectedRows; convertToVector(array, selectedRows); - if (m_object->isTree()) + if (m_object->isTree() || m_object->isDataTable()) m_object->setSelectedRows(selectedRows); } else if ([attributeName isEqualToString:NSAccessibilityGrabbedAttribute]) m_object->setARIAGrabbed([number boolValue]); @@ -2587,6 +2657,24 @@ static RenderObject* rendererForView(NSView* view) return [super accessibilityArrayAttributeValues:attribute index:index maxCount:maxCount]; } +// These are used by DRT so that it can know when notifications are sent. +// Since they are static, only one callback can be installed at a time (that's all DRT should need). +typedef void (*AXPostedNotificationCallback)(id element, NSString* notification, void* context); +static AXPostedNotificationCallback AXNotificationCallback = 0; +static void* AXPostedNotificationContext = 0; + +- (void)accessibilitySetPostedNotificationCallback:(AXPostedNotificationCallback)function withContext:(void*)context +{ + AXNotificationCallback = function; + AXPostedNotificationContext = context; +} + +- (void)accessibilityPostedNotification:(NSString *)notification +{ + if (AXNotificationCallback) + AXNotificationCallback(self, notification, AXPostedNotificationContext); +} + @end #endif // HAVE(ACCESSIBILITY) |