+2006-08-17 David Harrison <harrison@apple.com>
+
+ Reviewed by John Sullivan.
+
+ <rdar://problem/4671069> REGRESSION: Popup buttons in web pages aren't exposed as AXPopupButtons
+
+ Accessorized RenderMenuList objects.
+
+ * bridge/mac/WebCoreAXObject.mm:
+ (-[WebCoreAXObject mouseButtonListener]):
+ Trivial formatting.
+
+ (-[WebCoreAXObject actionElement]):
+ Return the HTMLSelectElement.
+
+ (-[WebCoreAXObject firstChild]):
+ (-[WebCoreAXObject lastChild]):
+ (-[WebCoreAXObject previousSibling]):
+ (-[WebCoreAXObject nextSibling]):
+ (-[WebCoreAXObject parentObject]):
+ (-[WebCoreAXObject parentObjectUnignored]):
+ (-[WebCoreAXObject isAttachment]):
+ (-[WebCoreAXObject attachmentView]):
+ Trivial formatting.
+
+ (-[WebCoreAXObject role]):
+ Return NSAccessibilityPopUpButtonRole.
+
+ (-[WebCoreAXObject subrole]):
+ Trivial formatting.
+
+ (-[WebCoreAXObject roleDescription]):
+ Return NSAccessibilityPopUpButtonRole.
+
+ (-[WebCoreAXObject textUnderElement]):
+ Trivial formatting.
+
+ (-[WebCoreAXObject value]):
+ Return the RenderMenuList::text().
+
+ (-[WebCoreAXObject position]):
+ Trivial formatting.
+
+ (-[WebCoreAXObject accessibilityIsIgnored]):
+ - Ignore popup menu items because AppKit does.
+ - Remove redundant check for buttonTag (earlier isControl() check suffices).
+
+ (-[WebCoreAXObject accessibilityAttributeNames]):
+ (-[WebCoreAXObject accessibilityActionNames]):
+ (-[WebCoreAXObject accessibilityAttributeValue:]):
+ Trivial formatting.
+
+ (-[WebCoreAXObject doAXTextMarkerRangeForUnorderedTextMarkers:]):
+ Removed old debugging code that is no longer needed.
+ Trivial formatting.
+
+ (-[WebCoreAXObject doAXSentenceTextMarkerRangeForTextMarker:]):
+ (-[WebCoreAXObject doAXParagraphTextMarkerRangeForTextMarker:]):
+ (-[WebCoreAXObject removeAXObjectID]):
+ Trivial formatting.
+
+ * html/HTMLSelectElement.cpp:
+ (WebCore::HTMLSelectElement::accessKeyAction):
+ Call click() instead of focus().
+
+ * rendering/RenderMenuList.cpp:
+ (WebCore::RenderMenuList::text):
+ Added for easy access to popup's current text.
+
+ * rendering/RenderMenuList.h:
+ (WebCore::RenderMenuList::isMenuList):
+ * rendering/RenderObject.h:
+ (WebCore::RenderObject::isMenuList):
+ Added so popups can be identified.
+
2006-08-17 David Harrison <harrison@apple.com>
Reviewed by Maciej.
#include "config.h"
#import "WebCoreAXObject.h"
-// need this until accesstool supports arrays of markers
-#define MARKERARRAY_SELF_TEST 0
-
#import "DOMInternal.h"
#import "Document.h"
#import "EventNames.h"
#import "HTMLInputElement.h"
#import "HTMLMapElement.h"
#import "HTMLNames.h"
+#import "HTMLSelectElement.h"
#import "RenderImage.h"
#import "RenderListMarker.h"
+#import "RenderMenuList.h"
#import "RenderTheme.h"
#import "RenderView.h"
#import "RenderWidget.h"
if (elt->getHTMLEventListener(clickEvent) || elt->getHTMLEventListener(mousedownEvent) || elt->getHTMLEventListener(mouseupEvent))
return static_cast<Element*>(elt);
}
+
return 0;
}
return input;
}
- if ([self isImageButton])
+ if ([self isImageButton] || m_renderer->isMenuList())
return static_cast<Element*>(m_renderer->element());
Element * elt = [self anchorElement];
{
if (!m_renderer || !m_renderer->firstChild())
return nil;
+
return m_renderer->document()->axObjectCache()->get(m_renderer->firstChild());
}
{
if (!m_renderer || !m_renderer->lastChild())
return nil;
+
return m_renderer->document()->axObjectCache()->get(m_renderer->lastChild());
}
{
if (!m_renderer || !m_renderer->previousSibling())
return nil;
+
return m_renderer->document()->axObjectCache()->get(m_renderer->previousSibling());
}
{
if (!m_renderer || !m_renderer->nextSibling())
return nil;
+
return m_renderer->document()->axObjectCache()->get(m_renderer->nextSibling());
}
if (!m_renderer || !m_renderer->parent())
return nil;
+
return m_renderer->document()->axObjectCache()->get(m_renderer->parent());
}
WebCoreAXObject* obj = [self parentObject];
if ([obj accessibilityIsIgnored])
return [obj parentObjectUnignored];
- else
- return obj;
+
+ return obj;
}
-(void)addChildrenToArray:(NSMutableArray*)array
// assert that a widget is a replaced element that is not an image
ASSERT(!result || (m_renderer->isReplaced() && !m_renderer->isImage()));
-
return result;
}
Widget* widget = renderWidget->widget();
if (widget)
return widget->getView();
-
+
return nil;
}
return NSAccessibilityTextFieldRole;
}
+ if (m_renderer->isMenuList())
+ return NSAccessibilityPopUpButtonRole;
+
if (m_renderer->isBlockFlow())
return NSAccessibilityGroupRole;
if ([self isAttachment])
{
if ([self isAttachment])
return [[self attachmentView] accessibilityAttributeValue:NSAccessibilitySubroleAttribute];
-
+
return nil;
}
if ([role isEqualToString:NSAccessibilityButtonRole])
return NSAccessibilityRoleDescription(NSAccessibilityButtonRole, nil);
+ if ([role isEqualToString:NSAccessibilityPopUpButtonRole])
+ return NSAccessibilityRoleDescription(NSAccessibilityPopUpButtonRole, nil);
+
if ([role isEqualToString:NSAccessibilityStaticTextRole])
return NSAccessibilityRoleDescription(NSAccessibilityStaticTextRole, nil);
}
}
+ // return nil for anonymous text because it is non-trivial to get
+ // the actual text and, so far, that is not needed
return nil;
}
if (m_renderer->isText())
return [self textUnderElement];
+ if (m_renderer->isMenuList())
+ return static_cast<RenderMenuList*>(m_renderer)->text();
+
if (m_renderer->isListMarker())
return static_cast<RenderListMarker*>(m_renderer)->text().getNSString();
NSView* view = m_renderer->view()->frameView()->getDocumentView();
point = [[view window] convertBaseToScreen: [view convertPoint: point toView:nil]];
}
+
return [NSValue valueWithPoint: point];
}
-(BOOL)accessibilityIsIgnored
{
+ // ignore invisible element
if (!m_renderer || m_renderer->style()->visibility() != VISIBLE)
return YES;
+ // ignore popup menu items because AppKit does
+ for (RenderObject* parent = m_renderer->parent(); parent; parent = parent->parent()) {
+ if (parent->isMenuList())
+ return YES;
+ }
+
// NOTE: BRs always have text boxes now, so the text box check here can be removed
if (m_renderer->isText())
return m_renderer->isBR() || !static_cast<RenderText*>(m_renderer)->firstTextBox();
if (m_areaElement || (m_renderer->element() && m_renderer->element()->isLink()))
return NO;
- // All controls must be examined.
+ // all controls are accessible
if (m_renderer->element() && m_renderer->element()->isControl())
return NO;
if (m_renderer->isBlockFlow() && m_renderer->childrenInline())
return !static_cast<RenderBlock*>(m_renderer)->firstLineBox() && ![self mouseButtonListener];
- return (!m_renderer->isListMarker() && !m_renderer->isRenderView() &&
- !m_renderer->isImage() &&
- !(m_renderer->element() && m_renderer->element()->isHTMLElement() &&
- m_renderer->element()->hasTagName(buttonTag)));
+ return (!m_renderer->isListMarker() && !m_renderer->isRenderView() && !m_renderer->isImage());
}
- (NSArray *)accessibilityAttributeNames
if (m_renderer && m_renderer->isRenderView())
return webAreaAttrs;
+
if (m_areaElement || (m_renderer && !m_renderer->isImage() && m_renderer->element() && m_renderer->element()->isLink()))
return anchorAttrs;
+
return attributes;
}
actions = [[NSArray alloc] initWithObjects: NSAccessibilityPressAction, nil];
return actions;
}
+
return nil;
}
}
}
- if ([attributeName isEqualToString: @"AXVisited"]) {
+ if ([attributeName isEqualToString: @"AXVisited"])
return [NSNumber numberWithBool: m_renderer->style()->pseudoState() == PseudoVisited];
- }
if ([attributeName isEqualToString: NSAccessibilityTitleAttribute])
return [self title];
- (id)doAXTextMarkerRangeForUnorderedTextMarkers: (NSArray *) markers
{
-#if defined(MARKERARRAY_SELF_TEST) && MARKERARRAY_SELF_TEST
- WebCoreTextMarkerRange *tmr = [self getSelectedTextMarkerRange];
- WebCoreTextMarker *tm1 = AXTextMarkerRangeCopyEndMarker(tmr);
- WebCoreTextMarker *tm2 = AXTextMarkerRangeCopyStartMarker(tmr);
- markers = [NSArray arrayWithObjects: (id) tm1, (id) tm2, nil];
-#endif
// get and validate the markers
if ([markers count] < 2)
return nil;
VisiblePosition visiblePos = [self visiblePositionForTextMarker:textMarker];
VisiblePosition startPosition = startOfSentence(visiblePos);
VisiblePosition endPosition = endOfSentence(startPosition);
-
return (id) [self textMarkerRangeFromVisiblePositions:startPosition andEndPos:endPosition];
}
VisiblePosition visiblePos = [self visiblePositionForTextMarker:textMarker];
VisiblePosition startPosition = startOfParagraph(visiblePos);
VisiblePosition endPosition = endOfParagraph(startPosition);
-
return (id) [self textMarkerRangeFromVisiblePositions:startPosition andEndPos:endPosition];
}
{
if (!m_id)
return;
+
m_renderer->document()->axObjectCache()->removeAXID(self);
}