Reviewed by John Sullivan.
authorharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Aug 2006 23:05:43 +0000 (23:05 +0000)
committerharrison <harrison@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Aug 2006 23:05:43 +0000 (23:05 +0000)
        <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.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@15930 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/bridge/mac/WebCoreAXObject.mm
WebCore/html/HTMLSelectElement.cpp
WebCore/rendering/RenderMenuList.cpp
WebCore/rendering/RenderMenuList.h
WebCore/rendering/RenderObject.h

index d3697a6..c79b84c 100644 (file)
@@ -1,5 +1,80 @@
 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.
 
         <rdar://problem/4527201> REGRESSION: AXTextMarkerRangeForUnorderedTextMarkers returns out of order range
index ed3deac..ecd5c30 100644 (file)
@@ -26,9 +26,6 @@
 #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"
@@ -161,6 +160,7 @@ using namespace HTMLNames;
         if (elt->getHTMLEventListener(clickEvent) || elt->getHTMLEventListener(mousedownEvent) || elt->getHTMLEventListener(mouseupEvent))
             return static_cast<Element*>(elt);
     }
+
     return 0;
 }
 
@@ -174,7 +174,7 @@ using namespace HTMLNames;
             return input;
     }
 
-    if ([self isImageButton])
+    if ([self isImageButton] || m_renderer->isMenuList())
         return static_cast<Element*>(m_renderer->element());
 
     Element * elt = [self anchorElement];
@@ -188,6 +188,7 @@ using namespace HTMLNames;
 {
     if (!m_renderer || !m_renderer->firstChild())
         return nil;
+
     return m_renderer->document()->axObjectCache()->get(m_renderer->firstChild());
 }
 
@@ -195,6 +196,7 @@ using namespace HTMLNames;
 {
     if (!m_renderer || !m_renderer->lastChild())
         return nil;
+
     return m_renderer->document()->axObjectCache()->get(m_renderer->lastChild());
 }
 
@@ -202,6 +204,7 @@ using namespace HTMLNames;
 {
     if (!m_renderer || !m_renderer->previousSibling())
         return nil;
+
     return m_renderer->document()->axObjectCache()->get(m_renderer->previousSibling());
 }
 
@@ -209,6 +212,7 @@ using namespace HTMLNames;
 {
     if (!m_renderer || !m_renderer->nextSibling())
         return nil;
+
     return m_renderer->document()->axObjectCache()->get(m_renderer->nextSibling());
 }
 
@@ -219,6 +223,7 @@ using namespace HTMLNames;
 
     if (!m_renderer || !m_renderer->parent())
         return nil;
+
     return m_renderer->document()->axObjectCache()->get(m_renderer->parent());
 }
 
@@ -227,8 +232,8 @@ using namespace HTMLNames;
     WebCoreAXObject* obj = [self parentObject];
     if ([obj accessibilityIsIgnored])
         return [obj parentObjectUnignored];
-    else
-        return obj;
+
+    return obj;
 }
 
 -(void)addChildrenToArray:(NSMutableArray*)array
@@ -281,7 +286,6 @@ using namespace HTMLNames;
     
     // assert that a widget is a replaced element that is not an image
     ASSERT(!result || (m_renderer->isReplaced() && !m_renderer->isImage()));
-    
     return result;
 }
 
@@ -293,7 +297,7 @@ using namespace HTMLNames;
     Widget* widget = renderWidget->widget();
     if (widget)
          return widget->getView();
-    
+
     return nil;
 }
 
@@ -335,6 +339,9 @@ using namespace HTMLNames;
             return NSAccessibilityTextFieldRole;
     }
     
+    if (m_renderer->isMenuList())
+        return NSAccessibilityPopUpButtonRole;
+
     if (m_renderer->isBlockFlow())
         return NSAccessibilityGroupRole;
     if ([self isAttachment])
@@ -347,7 +354,7 @@ using namespace HTMLNames;
 {
     if ([self isAttachment])
         return [[self attachmentView] accessibilityAttributeValue:NSAccessibilitySubroleAttribute];
-    
+
     return nil;
 }
 
@@ -368,6 +375,9 @@ using namespace HTMLNames;
     if ([role isEqualToString:NSAccessibilityButtonRole])
         return NSAccessibilityRoleDescription(NSAccessibilityButtonRole, nil);
     
+    if ([role isEqualToString:NSAccessibilityPopUpButtonRole])
+        return NSAccessibilityRoleDescription(NSAccessibilityPopUpButtonRole, nil);
+   
     if ([role isEqualToString:NSAccessibilityStaticTextRole])
         return NSAccessibilityRoleDescription(NSAccessibilityStaticTextRole, nil);
 
@@ -446,6 +456,8 @@ using namespace HTMLNames;
         }
     }
 
+    // return nil for anonymous text because it is non-trivial to get
+    // the actual text and, so far, that is not needed
     return nil;
 }
 
@@ -457,6 +469,9 @@ using namespace HTMLNames;
     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();
 
@@ -577,6 +592,7 @@ static IntRect boundingBoxRect(RenderObject* obj)
         NSView* view = m_renderer->view()->frameView()->getDocumentView();
         point = [[view window] convertBaseToScreen: [view convertPoint: point toView:nil]];
     }
+
     return [NSValue valueWithPoint: point];
 }
 
@@ -588,9 +604,16 @@ static IntRect boundingBoxRect(RenderObject* obj)
 
 -(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();
@@ -602,17 +625,14 @@ static IntRect boundingBoxRect(RenderObject* obj)
     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
@@ -687,8 +707,10 @@ static IntRect boundingBoxRect(RenderObject* obj)
     
     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;
 }
 
@@ -701,6 +723,7 @@ static IntRect boundingBoxRect(RenderObject* obj)
             actions = [[NSArray alloc] initWithObjects: NSAccessibilityPressAction, nil];
         return actions;
     }
+
     return nil;
 }
 
@@ -848,9 +871,8 @@ static IntRect boundingBoxRect(RenderObject* obj)
         }
     }
 
-    if ([attributeName isEqualToString: @"AXVisited"]) {
+    if ([attributeName isEqualToString: @"AXVisited"])
         return [NSNumber numberWithBool: m_renderer->style()->pseudoState() == PseudoVisited];
-    }
     
     if ([attributeName isEqualToString: NSAccessibilityTitleAttribute])
         return [self title];
@@ -1376,12 +1398,6 @@ static void AXAttributedStringAppendReplaced (NSMutableAttributedString *attrStr
 
 - (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;
@@ -1492,7 +1508,6 @@ static void AXAttributedStringAppendReplaced (NSMutableAttributedString *attrStr
     VisiblePosition visiblePos = [self visiblePositionForTextMarker:textMarker];
     VisiblePosition startPosition = startOfSentence(visiblePos);
     VisiblePosition endPosition = endOfSentence(startPosition);
-
     return (id) [self textMarkerRangeFromVisiblePositions:startPosition andEndPos:endPosition];
 }
 
@@ -1501,7 +1516,6 @@ static void AXAttributedStringAppendReplaced (NSMutableAttributedString *attrStr
     VisiblePosition visiblePos = [self visiblePositionForTextMarker:textMarker];
     VisiblePosition startPosition = startOfParagraph(visiblePos);
     VisiblePosition endPosition = endOfParagraph(startPosition);
-
     return (id) [self textMarkerRangeFromVisiblePositions:startPosition andEndPos:endPosition];
 }
 
@@ -1932,6 +1946,7 @@ static void AXAttributedStringAppendReplaced (NSMutableAttributedString *attrStr
 {
     if (!m_id)
         return;
+        
     m_renderer->document()->axObjectCache()->removeAXID(self);
 }
 
index b164d99..aba4f3a 100644 (file)
@@ -499,9 +499,11 @@ void HTMLSelectElement::defaultEventHandler(Event *evt)
     HTMLGenericFormElement::defaultEventHandler(evt);
 }
 
-void HTMLSelectElement::accessKeyAction(bool)
+void HTMLSelectElement::accessKeyAction(bool sendToAnyElement)
 {
-    focus();
+    // send the mouse button events iff the
+    // caller specified sendToAnyElement
+    click(sendToAnyElement);
 }
 
 void HTMLSelectElement::setMultiple(bool multiple)
index 86fafa7..8ae0130 100644 (file)
@@ -138,6 +138,12 @@ void RenderMenuList::setText(const String& s)
     }
 }
 
+
+String RenderMenuList::text()
+{
+    return m_buttonText ? m_buttonText->data() : String();
+}
+
 void RenderMenuList::paintObject(PaintInfo& i, int x, int y)
 {
     // Push a clip.
index 4fc8772..835a1d7 100644 (file)
@@ -33,6 +33,8 @@ class RenderMenuList : public RenderFlexibleBox {
 public:
     RenderMenuList(HTMLSelectElement*);
 
+    virtual bool isMenuList() const { return true; }
+
     virtual void addChild(RenderObject* newChild, RenderObject *beforeChild = 0);
     virtual void removeChild(RenderObject*);
     virtual bool createsAnonymousWrapper() const { return true; }
@@ -52,6 +54,8 @@ public:
     void setOptionsChanged(bool c) { m_optionsChanged = c; }
     void valueChanged(unsigned listIndex);
 
+    String text();
+
 private:
     void createInnerBlock();
     void setText(const String&);
index a75b995..51e5276 100644 (file)
@@ -269,6 +269,7 @@ public:
     virtual bool isTextField() const { return false; }
     virtual bool isFrameSet() const { return false; }
     virtual bool isApplet() const { return false; }
+    virtual bool isMenuList() const { return false; }
     
 #ifdef SVG_SUPPORT
     virtual bool isKCanvasContainer() const { return false; }