Modified: trunk/Source/WebCore/ChangeLog (97756 => 97757)
--- trunk/Source/WebCore/ChangeLog 2011-10-18 15:38:29 UTC (rev 97756)
+++ trunk/Source/WebCore/ChangeLog 2011-10-18 15:43:50 UTC (rev 97757)
@@ -3,6 +3,26 @@
AX: buttons of number type <input> controls are not fully accessible
https://bugs.webkit.org/show_bug.cgi?id=70241
+ Staged commit part 4.
+
+ Reviewed by Darin Adler.
+
+ * accessibility/AccessibilityMockObject.h:
+ (WebCore::AccessibilityMockObject::isMockObject):
+ (WebCore::AccessibilityMockObject::detachFromParent):
+ * accessibility/AccessibilityObject.cpp:
+ (WebCore::AccessibilityObject::elementAccessibilityHitTest):
+ * accessibility/mac/WebAccessibilityObjectWrapper.mm:
+ (-[WebAccessibilityObjectWrapper accessibilityActionNames]):
+ (-[WebAccessibilityObjectWrapper accessibilityAttributeNames]):
+ (-[WebAccessibilityObjectWrapper subrole]):
+ (-[WebAccessibilityObjectWrapper accessibilityAttributeValue:]):
+
+2011-10-18 Chris Fleizach <[email protected]>
+
+ AX: buttons of number type <input> controls are not fully accessible
+ https://bugs.webkit.org/show_bug.cgi?id=70241
+
Staged commit part 3. Committing the new spin button classes.
Reviewed by Darin Adler.
Modified: trunk/Source/WebCore/accessibility/AccessibilityMockObject.h (97756 => 97757)
--- trunk/Source/WebCore/accessibility/AccessibilityMockObject.h 2011-10-18 15:38:29 UTC (rev 97756)
+++ trunk/Source/WebCore/accessibility/AccessibilityMockObject.h 2011-10-18 15:43:50 UTC (rev 97757)
@@ -39,12 +39,15 @@
virtual AccessibilityObject* parentObject() const { return m_parent; }
virtual void setParent(AccessibilityObject* parent) { m_parent = parent; };
-
+
+protected:
+ AccessibilityObject* m_parent;
+
+private:
+ virtual bool isMockObject() const { return true; }
+
// Must be called when the parent object clears its children.
virtual void detachFromParent() { m_parent = 0; }
-
-protected:
- AccessibilityObject* m_parent;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (97756 => 97757)
--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp 2011-10-18 15:38:29 UTC (rev 97756)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp 2011-10-18 15:43:50 UTC (rev 97757)
@@ -1347,6 +1347,13 @@
if (widget && widget->isFrameView())
return axObjectCache()->getOrCreate(widget)->accessibilityHitTest(toPoint(point - widget->frameRect().location()));
}
+
+ // Check if there are any mock elements that need to be handled.
+ size_t count = m_children.size();
+ for (size_t k = 0; k < count; k++) {
+ if (m_children[k]->isMockObject() && m_children[k]->elementRect().contains(point))
+ return m_children[k]->elementAccessibilityHitTest(point);
+ }
return const_cast<AccessibilityObject*>(this);
}
Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm (97756 => 97757)
--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm 2011-10-18 15:38:29 UTC (rev 97756)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm 2011-10-18 15:43:50 UTC (rev 97757)
@@ -37,6 +37,7 @@
#import "AccessibilityListBox.h"
#import "AccessibilityRenderObject.h"
#import "AccessibilityScrollView.h"
+#import "AccessibilitySpinButton.h"
#import "AccessibilityTable.h"
#import "AccessibilityTableCell.h"
#import "AccessibilityTableColumn.h"
@@ -893,7 +894,7 @@
static NSArray* sliderActions = [[NSArray alloc] initWithObjects: NSAccessibilityIncrementAction, NSAccessibilityDecrementAction, nil];
NSArray *actions;
- if (m_object->actionElement())
+ if (m_object->actionElement() || m_object->isButton())
actions = actionElementActions;
else if (m_object->isMenuRelated())
actions = menuElementActions;
@@ -985,6 +986,7 @@
static NSArray* outlineRowAttrs = nil;
static NSArray* buttonAttrs = nil;
static NSArray* scrollViewAttrs = nil;
+ static NSArray* incrementorAttrs = nil;
NSMutableArray* tempArray;
if (attributes == nil) {
attributes = [[NSArray alloc] initWithObjects: NSAccessibilityRoleAttribute,
@@ -1131,6 +1133,13 @@
controlAttrs = [[NSArray alloc] initWithArray:tempArray];
[tempArray release];
}
+ if (incrementorAttrs == nil) {
+ tempArray = [[NSMutableArray alloc] initWithArray:attributes];
+ [tempArray addObject:NSAccessibilityIncrementButtonAttribute];
+ [tempArray addObject:NSAccessibilityDecrementButtonAttribute];
+ incrementorAttrs = [[NSArray alloc] initWithArray:tempArray];
+ [tempArray release];
+ }
if (buttonAttrs == nil) {
tempArray = [[NSMutableArray alloc] initWithArray:attributes];
// Buttons should not expose AXValue.
@@ -1293,6 +1302,8 @@
objectAttributes = tabListAttrs;
else if (m_object->isScrollView())
objectAttributes = scrollViewAttrs;
+ else if (m_object->isSpinButton())
+ objectAttributes = incrementorAttrs;
else if (m_object->isMenu())
objectAttributes = menuAttrs;
@@ -1516,7 +1527,8 @@
{ ParagraphRole, NSAccessibilityGroupRole },
{ LabelRole, NSAccessibilityGroupRole },
{ DivRole, NSAccessibilityGroupRole },
- { FormRole, NSAccessibilityGroupRole }
+ { FormRole, NSAccessibilityGroupRole },
+ { SpinButtonRole, NSAccessibilityIncrementorRole }
};
AccessibilityRoleMap& roleMap = *new AccessibilityRoleMap;
@@ -1555,6 +1567,13 @@
}
}
+ if (m_object->isSpinButtonPart()) {
+ if (toAccessibilitySpinButtonPart(m_object)->isIncrementor())
+ return NSAccessibilityIncrementArrowSubrole;
+
+ return NSAccessibilityDecrementArrowSubrole;
+ }
+
if (m_object->isTreeItem())
return NSAccessibilityOutlineRowSubrole;
@@ -1882,6 +1901,13 @@
return (NSURL*)url;
}
+ if (m_object->isSpinButton()) {
+ if ([attributeName isEqualToString:NSAccessibilityIncrementButtonAttribute])
+ return toAccessibilitySpinButton(m_object)->incrementButton()->wrapper();
+ if ([attributeName isEqualToString:NSAccessibilityDecrementButtonAttribute])
+ return toAccessibilitySpinButton(m_object)->decrementButton()->wrapper();
+ }
+
if ([attributeName isEqualToString: @"AXVisited"])
return [NSNumber numberWithBool: m_object->isVisited()];