summaryrefslogtreecommitdiffstats
path: root/WebCore/accessibility/mac
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2010-02-02 14:57:50 +0000
committerSteve Block <steveblock@google.com>2010-02-04 15:06:55 +0000
commitd0825bca7fe65beaee391d30da42e937db621564 (patch)
tree7461c49eb5844ffd1f35d1ba2c8b7584c1620823 /WebCore/accessibility/mac
parent3db770bd97c5a59b6c7574ca80a39e5a51c1defd (diff)
downloadexternal_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')
-rw-r--r--WebCore/accessibility/mac/AXObjectCacheMac.mm15
-rw-r--r--WebCore/accessibility/mac/AccessibilityObjectMac.mm21
-rw-r--r--WebCore/accessibility/mac/AccessibilityObjectWrapper.h3
-rw-r--r--WebCore/accessibility/mac/AccessibilityObjectWrapper.mm146
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)