[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

eric at webkit.org eric at webkit.org
Wed Dec 22 11:47:38 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 6f428d175ba757780318abdecc8a07c5515b9d35
Author: eric at webkit.org <eric at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Aug 6 22:20:36 2010 +0000

    2010-08-06  Eric Seidel  <eric at webkit.org>
    
            Reviewed by Chris Fleizach.
    
            Make AX Code use more specific RenderObject subclass types
            https://bugs.webkit.org/show_bug.cgi?id=43632
    
            No functional change, thus no tests.
    
            * accessibility/AXObjectCache.cpp:
            (WebCore::nodeHasRole):
             - Make this take a String instead of AtomicString, to avoid
               thrashing the atomic string hash.
               It would be better to take a const char* here, except
               one caller passes nullAtom.
            (WebCore::createFromRenderer):
             - Split this out from getOrCreate to make it simpler.
             - No longer needs to deal with setting a "result"
               pointer and can instead just return.
             - I've also made this function use RenderBoxModelObject*
               where appropriate.
            (WebCore::AXObjectCache::getOrCreate):
            * accessibility/AXObjectCache.h:
            * accessibility/AccessibilityImageMapLink.cpp:
            (WebCore::AccessibilityImageMapLink::AccessibilityImageMapLink):
             - Fix style.
            * accessibility/AccessibilityMenuList.cpp:
            (WebCore::AccessibilityMenuList::AccessibilityMenuList):
             - Use a more specific type.
            (WebCore::AccessibilityMenuList::renderer):
            * accessibility/AccessibilityMenuList.h:
            (WebCore::AccessibilityMenuList::create):
            * accessibility/AccessibilityMenuListPopup.cpp:
             - Need RenderMenuList.h since renderer() is a RenderMenuList*
            * accessibility/AccessibilityObject.cpp:
            (WebCore::renderListItemContainerForNode):
            * accessibility/AccessibilityRenderObject.cpp:
            (WebCore::AccessibilityRenderObject::renderBoxModelObject):
             - New helper function, similar to Node::renderBoxModelObject()
            (WebCore::isInlineWithContinuation):
            (WebCore::AccessibilityRenderObject::isNativeImage):
            (WebCore::AccessibilityRenderObject::isAttachment):
            (WebCore::AccessibilityRenderObject::isMultiSelectable):
            (WebCore::AccessibilityRenderObject::isReadOnly):
            (WebCore::AccessibilityRenderObject::isFieldset):
            (WebCore::AccessibilityRenderObject::actionElement):
            (WebCore::AccessibilityRenderObject::stringValue):
            (WebCore::AccessibilityRenderObject::accessibilityIsIgnored):
            (WebCore::AccessibilityRenderObject::setValue):
            (WebCore::AccessibilityRenderObject::widget):
            (WebCore::AccessibilityRenderObject::visiblePositionForPoint):
            (WebCore::AccessibilityRenderObject::doAccessibilityHitTest):
            (WebCore::AccessibilityRenderObject::renderObjectIsObservable):
            (WebCore::AccessibilityRenderObject::determineAccessibilityRole):
            (WebCore::AccessibilityRenderObject::addChildren):
            (WebCore::msaaRoleForRenderer):
            * accessibility/AccessibilityRenderObject.h:
            * accessibility/AccessibilityTable.cpp:
            (WebCore::AccessibilityTable::isTableExposableThroughAccessibility):
            * accessibility/AccessibilityTable.h:
             - Remove unneeded "using namespace std".
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64874 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 1ea6a8c..4c82a7f 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,65 @@
+2010-08-06  Eric Seidel  <eric at webkit.org>
+
+        Reviewed by Chris Fleizach.
+
+        Make AX Code use more specific RenderObject subclass types
+        https://bugs.webkit.org/show_bug.cgi?id=43632
+
+        No functional change, thus no tests.
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::nodeHasRole):
+         - Make this take a String instead of AtomicString, to avoid
+           thrashing the atomic string hash.
+           It would be better to take a const char* here, except
+           one caller passes nullAtom.
+        (WebCore::createFromRenderer):
+         - Split this out from getOrCreate to make it simpler.
+         - No longer needs to deal with setting a "result"
+           pointer and can instead just return.
+         - I've also made this function use RenderBoxModelObject*
+           where appropriate.
+        (WebCore::AXObjectCache::getOrCreate):
+        * accessibility/AXObjectCache.h:
+        * accessibility/AccessibilityImageMapLink.cpp:
+        (WebCore::AccessibilityImageMapLink::AccessibilityImageMapLink):
+         - Fix style.
+        * accessibility/AccessibilityMenuList.cpp:
+        (WebCore::AccessibilityMenuList::AccessibilityMenuList):
+         - Use a more specific type.
+        (WebCore::AccessibilityMenuList::renderer):
+        * accessibility/AccessibilityMenuList.h:
+        (WebCore::AccessibilityMenuList::create):
+        * accessibility/AccessibilityMenuListPopup.cpp:
+         - Need RenderMenuList.h since renderer() is a RenderMenuList*
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::renderListItemContainerForNode):
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::renderBoxModelObject):
+         - New helper function, similar to Node::renderBoxModelObject()
+        (WebCore::isInlineWithContinuation):
+        (WebCore::AccessibilityRenderObject::isNativeImage):
+        (WebCore::AccessibilityRenderObject::isAttachment):
+        (WebCore::AccessibilityRenderObject::isMultiSelectable):
+        (WebCore::AccessibilityRenderObject::isReadOnly):
+        (WebCore::AccessibilityRenderObject::isFieldset):
+        (WebCore::AccessibilityRenderObject::actionElement):
+        (WebCore::AccessibilityRenderObject::stringValue):
+        (WebCore::AccessibilityRenderObject::accessibilityIsIgnored):
+        (WebCore::AccessibilityRenderObject::setValue):
+        (WebCore::AccessibilityRenderObject::widget):
+        (WebCore::AccessibilityRenderObject::visiblePositionForPoint):
+        (WebCore::AccessibilityRenderObject::doAccessibilityHitTest):
+        (WebCore::AccessibilityRenderObject::renderObjectIsObservable):
+        (WebCore::AccessibilityRenderObject::determineAccessibilityRole):
+        (WebCore::AccessibilityRenderObject::addChildren):
+        (WebCore::msaaRoleForRenderer):
+        * accessibility/AccessibilityRenderObject.h:
+        * accessibility/AccessibilityTable.cpp:
+        (WebCore::AccessibilityTable::isTableExposableThroughAccessibility):
+        * accessibility/AccessibilityTable.h:
+         - Remove unneeded "using namespace std".
+
 2010-08-06  Tony Gentilcore  <tonyg at chromium.org>
 
         Reviewed by Eric Seidel.
diff --git a/WebCore/accessibility/AXObjectCache.cpp b/WebCore/accessibility/AXObjectCache.cpp
index 750c611..907bb15 100644
--- a/WebCore/accessibility/AXObjectCache.cpp
+++ b/WebCore/accessibility/AXObjectCache.cpp
@@ -59,8 +59,13 @@
 #endif
 #include "InputElement.h"
 #include "Page.h"
-#include "RenderObject.h"
+#include "RenderListBox.h"
+#include "RenderMenuList.h"
+#include "RenderTable.h"
+#include "RenderTableCell.h"
+#include "RenderTableRow.h"
 #include "RenderProgress.h"
+#include "RenderSlider.h"
 #include "RenderView.h"
 
 #include <wtf/PassRefPtr.h>
@@ -160,80 +165,87 @@ AccessibilityObject* AXObjectCache::get(RenderObject* renderer)
     
     return obj;
 }
-    
-bool AXObjectCache::nodeHasRole(Node* node, const AtomicString& role)
+
+// FIXME: This probably belongs on Node.
+// FIXME: This should take a const char*, but one caller passes nullAtom.
+bool nodeHasRole(Node* node, const String& role)
 {
     if (!node || !node->isElementNode())
         return false;
-    
+
     return equalIgnoringCase(static_cast<Element*>(node)->getAttribute(roleAttr), role);
 }
 
-AccessibilityObject* AXObjectCache::getOrCreate(RenderObject* renderer)
+static PassRefPtr<AccessibilityObject> createFromRenderer(RenderObject* renderer)
 {
-    if (!renderer)
-        return 0;
-    
-    AccessibilityObject* obj = get(renderer);
+    // FIXME: How could renderer->node() ever not be an Element?
+    Node* node = renderer->node();
+
+    // If the node is aria role="list" or the aria role is empty and its a
+    // ul/ol/dl type (it shouldn't be a list if aria says otherwise).
+    if (node && ((nodeHasRole(node, "list") || nodeHasRole(node, "directory"))
+                      || (nodeHasRole(node, nullAtom) && (node->hasTagName(ulTag) || node->hasTagName(olTag) || node->hasTagName(dlTag)))))
+        return AccessibilityList::create(renderer);
+
+    // aria tables
+    if (nodeHasRole(node, "grid") || nodeHasRole(node, "treegrid"))
+        return AccessibilityARIAGrid::create(renderer);
+    if (nodeHasRole(node, "row"))
+        return AccessibilityARIAGridRow::create(renderer);
+    if (nodeHasRole(node, "gridcell") || nodeHasRole(node, "columnheader") || nodeHasRole(node, "rowheader"))
+        return AccessibilityARIAGridCell::create(renderer);
 
-    if (!obj) {
-        Node* node = renderer->node();
-        RefPtr<AccessibilityObject> newObj = 0;
-        if (renderer->isListBox())
-            newObj = AccessibilityListBox::create(renderer);
-        else if (renderer->isMenuList())
-            newObj = AccessibilityMenuList::create(renderer);
+#if ENABLE(VIDEO)
+    // media controls
+    if (node && node->isMediaControlElement())
+        return AccessibilityMediaControl::create(renderer);
+#endif
 
-        // If the node is aria role="list" or the aria role is empty and its a ul/ol/dl type (it shouldn't be a list if aria says otherwise). 
-        else if (node && ((nodeHasRole(node, "list") || nodeHasRole(node, "directory"))
-                          || (nodeHasRole(node, nullAtom) && (node->hasTagName(ulTag) || node->hasTagName(olTag) || node->hasTagName(dlTag)))))
-            newObj = AccessibilityList::create(renderer);
-        
-        // aria tables
-        else if (nodeHasRole(node, "grid") || nodeHasRole(node, "treegrid"))
-            newObj = AccessibilityARIAGrid::create(renderer);
-        else if (nodeHasRole(node, "row"))
-            newObj = AccessibilityARIAGridRow::create(renderer);
-        else if (nodeHasRole(node, "gridcell") || nodeHasRole(node, "columnheader") || nodeHasRole(node, "rowheader"))
-            newObj = AccessibilityARIAGridCell::create(renderer);
+    if (renderer->isBoxModelObject()) {
+        RenderBoxModelObject* cssBox = toRenderBoxModelObject(renderer);
+        if (cssBox->isListBox())
+            return AccessibilityListBox::create(toRenderListBox(cssBox));
+        if (cssBox->isMenuList())
+            return AccessibilityMenuList::create(toRenderMenuList(cssBox));
 
         // standard tables
-        else if (renderer->isTable())
-            newObj = AccessibilityTable::create(renderer);
-        else if (renderer->isTableRow())
-            newObj = AccessibilityTableRow::create(renderer);
-        else if (renderer->isTableCell())
-            newObj = AccessibilityTableCell::create(renderer);
-
-#if ENABLE(VIDEO)
-        // media controls
-        else if (renderer->node() && renderer->node()->isMediaControlElement())
-            newObj = AccessibilityMediaControl::create(renderer);
-#endif
+        if (cssBox->isTable())
+            return AccessibilityTable::create(toRenderTable(cssBox));
+        if (cssBox->isTableRow())
+            return AccessibilityTableRow::create(toRenderTableRow(cssBox));
+        if (cssBox->isTableCell())
+            return AccessibilityTableCell::create(toRenderTableCell(cssBox));
 
 #if ENABLE(PROGRESS_TAG)
         // progress bar
-        else if (renderer->isProgress())
-            newObj = AccessibilityProgressIndicator::create(toRenderProgress(renderer));
+        if (cssBox->isProgress())
+            return AccessibilityProgressIndicator::create(toRenderProgress(cssBox));
 #endif
 
         // input type=range
-        else if (renderer->isSlider())
-            newObj = AccessibilitySlider::create(renderer);
-
-        else
-            newObj = AccessibilityRenderObject::create(renderer);
-        
-        obj = newObj.get();
-        
-        getAXID(obj);
-        
-        m_renderObjectMapping.set(renderer, obj->axObjectID());
-        m_objects.set(obj->axObjectID(), obj);    
-        attachWrapper(obj);
+        if (cssBox->isSlider())
+            return AccessibilitySlider::create(toRenderSlider(cssBox));
     }
-    
-    return obj;
+
+    return AccessibilityRenderObject::create(renderer);
+}
+
+AccessibilityObject* AXObjectCache::getOrCreate(RenderObject* renderer)
+{
+    if (!renderer)
+        return 0;
+
+    if (AccessibilityObject* obj = get(renderer))
+        return obj;
+
+    RefPtr<AccessibilityObject> newObj = createFromRenderer(renderer);
+
+    getAXID(newObj.get());
+
+    m_renderObjectMapping.set(renderer, newObj->axObjectID());
+    m_objects.set(newObj->axObjectID(), newObj);
+    attachWrapper(newObj.get());
+    return newObj.get();
 }
 
 AccessibilityObject* AXObjectCache::getOrCreate(AccessibilityRole role)
diff --git a/WebCore/accessibility/AXObjectCache.h b/WebCore/accessibility/AXObjectCache.h
index f18d08a..d643cbc 100644
--- a/WebCore/accessibility/AXObjectCache.h
+++ b/WebCore/accessibility/AXObjectCache.h
@@ -124,8 +124,6 @@ public:
     void postNotification(RenderObject*, AXNotification, bool postToElement, PostType = PostAsynchronously);
     void postNotification(AccessibilityObject*, Document*, AXNotification, bool postToElement, PostType = PostAsynchronously);
 
-    bool nodeHasRole(Node*, const AtomicString& role);
-
 protected:
     void postPlatformNotification(AccessibilityObject*, AXNotification);
 
@@ -146,6 +144,8 @@ private:
     AXID getAXID(AccessibilityObject*);
 };
 
+bool nodeHasRole(Node*, const String& role);
+
 #if !HAVE(ACCESSIBILITY)
 inline void AXObjectCache::handleActiveDescendantChanged(RenderObject*) { }
 inline void AXObjectCache::handleAriaRoleChanged(RenderObject*) { }
diff --git a/WebCore/accessibility/AccessibilityImageMapLink.cpp b/WebCore/accessibility/AccessibilityImageMapLink.cpp
index 924ba21..9b77400 100644
--- a/WebCore/accessibility/AccessibilityImageMapLink.cpp
+++ b/WebCore/accessibility/AccessibilityImageMapLink.cpp
@@ -33,18 +33,15 @@
 #include "AccessibilityRenderObject.h"
 #include "Document.h"
 #include "HTMLNames.h"
-#include "IntRect.h"
-#include "RenderObject.h"
-
-using namespace std;
+#include "RenderBoxModelObject.h"
 
 namespace WebCore {
     
 using namespace HTMLNames;
 
 AccessibilityImageMapLink::AccessibilityImageMapLink()
-    : m_areaElement(0), 
-      m_mapElement(0)
+    : m_areaElement(0)
+    , m_mapElement(0)
 {
 }
 
diff --git a/WebCore/accessibility/AccessibilityMenuList.cpp b/WebCore/accessibility/AccessibilityMenuList.cpp
index 05cdf97..bde4cd4 100644
--- a/WebCore/accessibility/AccessibilityMenuList.cpp
+++ b/WebCore/accessibility/AccessibilityMenuList.cpp
@@ -32,10 +32,14 @@
 
 namespace WebCore {
 
-AccessibilityMenuList::AccessibilityMenuList(RenderObject* renderer)
+AccessibilityMenuList::AccessibilityMenuList(RenderMenuList* renderer)
     : AccessibilityRenderObject(renderer)
 {
-    ASSERT_ARG(renderer, renderer->isMenuList());
+}
+
+RenderMenuList* AccessibilityMenuList::renderer() const
+{
+    return toRenderMenuList(AccessibilityRenderObject::renderer());
 }
 
 bool AccessibilityMenuList::press() const
diff --git a/WebCore/accessibility/AccessibilityMenuList.h b/WebCore/accessibility/AccessibilityMenuList.h
index 376958f..4082f0a 100644
--- a/WebCore/accessibility/AccessibilityMenuList.h
+++ b/WebCore/accessibility/AccessibilityMenuList.h
@@ -33,16 +33,19 @@ namespace WebCore {
 class AccessibilityMenuList;
 class AccessibilityMenuListPopup;
 class HTMLOptionElement;
+class RenderMenuList;
 
 class AccessibilityMenuList : public AccessibilityRenderObject {
 public:
-    static PassRefPtr<AccessibilityMenuList> create(RenderObject* renderer) { return adoptRef(new AccessibilityMenuList(renderer)); }
+    static PassRefPtr<AccessibilityMenuList> create(RenderMenuList* renderer) { return adoptRef(new AccessibilityMenuList(renderer)); }
 
     virtual bool isCollapsed() const;
     virtual bool press() const;
 
+    RenderMenuList* renderer() const;
+
 private:
-    AccessibilityMenuList(RenderObject*);
+    AccessibilityMenuList(RenderMenuList*);
 
     virtual bool isMenuList() const { return true; }
     virtual AccessibilityRole roleValue() const { return PopUpButtonRole; }
diff --git a/WebCore/accessibility/AccessibilityMenuListPopup.cpp b/WebCore/accessibility/AccessibilityMenuListPopup.cpp
index 48c2fab..515e02f 100644
--- a/WebCore/accessibility/AccessibilityMenuListPopup.cpp
+++ b/WebCore/accessibility/AccessibilityMenuListPopup.cpp
@@ -31,7 +31,7 @@
 #include "AccessibilityMenuListOption.h"
 #include "HTMLNames.h"
 #include "HTMLSelectElement.h"
-#include "RenderObject.h"
+#include "RenderMenuList.h"
 
 namespace WebCore {
 
diff --git a/WebCore/accessibility/AccessibilityObject.cpp b/WebCore/accessibility/AccessibilityObject.cpp
index 30fba31..4b22335 100644
--- a/WebCore/accessibility/AccessibilityObject.cpp
+++ b/WebCore/accessibility/AccessibilityObject.cpp
@@ -416,14 +416,11 @@ static bool replacedNodeNeedsCharacter(Node* replacedNode)
 // Finds a RenderListItem parent give a node.
 static RenderListItem* renderListItemContainerForNode(Node* node)
 {
-    for (Node* stringNode = node; stringNode; stringNode = stringNode->parent()) {
-        RenderObject* renderObject = stringNode->renderer();
-        if (!renderObject || !renderObject->isListItem())
-            continue;
-        
-        return toRenderListItem(renderObject);
+    for (; node; node = node->parent()) {
+        RenderBoxModelObject* renderer = node->renderBoxModelObject();
+        if (renderer && renderer->isListItem())
+            return toRenderListItem(renderer);
     }
-    
     return 0;
 }
     
diff --git a/WebCore/accessibility/AccessibilityRenderObject.cpp b/WebCore/accessibility/AccessibilityRenderObject.cpp
index a5e1cc3..e399b6a 100644
--- a/WebCore/accessibility/AccessibilityRenderObject.cpp
+++ b/WebCore/accessibility/AccessibilityRenderObject.cpp
@@ -120,8 +120,19 @@ void AccessibilityRenderObject::detach()
     m_renderer = 0;    
 }
 
-static inline bool isInlineWithContinuation(RenderObject* renderer)
+RenderBoxModelObject* AccessibilityRenderObject::renderBoxModelObject() const
 {
+    if (!m_renderer || !m_renderer->isBoxModelObject())
+        return 0;
+    return toRenderBoxModelObject(m_renderer);
+}
+
+static inline bool isInlineWithContinuation(RenderObject* object)
+{
+    if (!object->isBoxModelObject())
+        return false;
+
+    RenderBoxModelObject* renderer = toRenderBoxModelObject(object);
     if (!renderer->isRenderInline())
         return false;
 
@@ -429,7 +440,7 @@ bool AccessibilityRenderObject::isTextControl() const
 
 bool AccessibilityRenderObject::isNativeImage() const
 {
-    return m_renderer->isImage();
+    return m_renderer->isBoxModelObject() && toRenderBoxModelObject(m_renderer)->isImage();
 }    
     
 bool AccessibilityRenderObject::isImage() const
@@ -439,12 +450,12 @@ bool AccessibilityRenderObject::isImage() const
 
 bool AccessibilityRenderObject::isAttachment() const
 {
-    if (!m_renderer)
+    RenderBoxModelObject* renderer = renderBoxModelObject();
+    if (!renderer)
         return false;
-    
     // Widgets are the replaced elements that we represent to AX as attachments
-    bool isWidget = m_renderer && m_renderer->isWidget();
-    ASSERT(!isWidget || (m_renderer->isReplaced() && !isImage()));
+    bool isWidget = renderer->isWidget();
+    ASSERT(!isWidget || (renderer->isReplaced() && !isImage()));
     return isWidget && ariaRoleAttribute() == UnknownRole;
 }
 
@@ -603,7 +614,7 @@ bool AccessibilityRenderObject::isMultiSelectable() const
     if (equalIgnoringCase(ariaMultiSelectable, "false"))
         return false;
     
-    if (!m_renderer->isListBox())
+    if (!m_renderer->isBoxModelObject() || !toRenderBoxModelObject(m_renderer)->isListBox())
         return false;
     return m_renderer->node() && static_cast<HTMLSelectElement*>(m_renderer->node())->multiple();
 }
@@ -628,11 +639,14 @@ bool AccessibilityRenderObject::isReadOnly() const
         return !frame->isContentEditable();
     }
 
-    if (m_renderer->isTextField())
-        return static_cast<HTMLInputElement*>(m_renderer->node())->readOnly();
-    if (m_renderer->isTextArea())
-        return static_cast<HTMLTextAreaElement*>(m_renderer->node())->readOnly();
-    
+    if (m_renderer->isBoxModelObject()) {
+        RenderBoxModelObject* box = toRenderBoxModelObject(m_renderer);
+        if (box->isTextField())
+            return static_cast<HTMLInputElement*>(box->node())->readOnly();
+        if (box->isTextArea())
+            return static_cast<HTMLTextAreaElement*>(box->node())->readOnly();
+    }
+
     return !m_renderer->node() || !m_renderer->node()->isContentEditable();
 }
 
@@ -699,10 +713,10 @@ bool AccessibilityRenderObject::isControl() const
 
 bool AccessibilityRenderObject::isFieldset() const
 {
-    if (!m_renderer)
+    RenderBoxModelObject* renderer = renderBoxModelObject();
+    if (!renderer)
         return false;
-    
-    return m_renderer->isFieldset();
+    return renderer->isFieldset();
 }
   
 bool AccessibilityRenderObject::isGroup() const
@@ -789,7 +803,7 @@ Element* AccessibilityRenderObject::actionElement() const
         } else if (node->hasTagName(buttonTag))
             return static_cast<Element*>(node);
     }
-            
+
     if (isFileUploadButton())
         return static_cast<Element*>(m_renderer->node());
             
@@ -799,7 +813,7 @@ Element* AccessibilityRenderObject::actionElement() const
     if (isImageButton())
         return static_cast<Element*>(m_renderer->node());
     
-    if (m_renderer->isMenuList())
+    if (m_renderer->isBoxModelObject() && toRenderBoxModelObject(m_renderer)->isMenuList())
         return static_cast<Element*>(m_renderer->node());
 
     AccessibilityRole role = roleValue();
@@ -1049,7 +1063,9 @@ String AccessibilityRenderObject::stringValue() const
 {
     if (!m_renderer || isPasswordField())
         return String();
-    
+
+    RenderBoxModelObject* cssBox = renderBoxModelObject();
+
     if (ariaRoleAttribute() == StaticTextRole) {
         String staticText = text();
         if (!staticText.length())
@@ -1060,7 +1076,7 @@ String AccessibilityRenderObject::stringValue() const
     if (m_renderer->isText())
         return textUnderElement();
     
-    if (m_renderer->isMenuList()) {
+    if (cssBox && cssBox->isMenuList()) {
         // RenderMenuList will go straight to the text() of its selected item.
         // This has to be overriden in the case where the selected item has an aria label
         SelectElement* selectNode = toSelectElement(static_cast<Element*>(m_renderer->node()));
@@ -1082,7 +1098,7 @@ String AccessibilityRenderObject::stringValue() const
     if (m_renderer->isListMarker())
         return toRenderListMarker(m_renderer)->text();
     
-    if (m_renderer->isRenderButton())
+    if (cssBox && cssBox->isRenderButton())
         return toRenderButton(m_renderer)->text();
 
     if (isWebArea()) {
@@ -1701,13 +1717,13 @@ bool AccessibilityRenderObject::accessibilityIsIgnored() const
     // An ARIA tree can only have tree items and static text as children.
     if (!isAllowedChildOfTree())
         return true;
-    
+
     // ignore popup menu items because AppKit does
     for (RenderObject* parent = m_renderer->parent(); parent; parent = parent->parent()) {
-        if (parent->isMenuList())
+        if (parent->isBoxModelObject() && toRenderBoxModelObject(parent)->isMenuList())
             return true;
     }
-    
+
     // find out if this element is inside of a label element.
     // if so, it may be ignored because it's the label for a checkbox or radio button
     AccessibilityObject* controlObject = correspondingControlForLabelElement();
@@ -2182,20 +2198,24 @@ void AccessibilityRenderObject::setSelectedRows(AccessibilityChildrenVector& sel
     
 void AccessibilityRenderObject::setValue(const String& string)
 {
-    if (!m_renderer)
+    if (!m_renderer || !m_renderer->node() || !m_renderer->node()->isElementNode())
         return;
-    
+    Element* element = static_cast<Element*>(m_renderer->node());
+
+    if (roleValue() == SliderRole)
+        element->setAttribute(aria_valuenowAttr, string);
+
+    if (!m_renderer->isBoxModelObject())
+        return;
+    RenderBoxModelObject* renderer = toRenderBoxModelObject(m_renderer);
+
     // FIXME: Do we want to do anything here for ARIA textboxes?
-    if (m_renderer->isTextField()) {
-        HTMLInputElement* input = static_cast<HTMLInputElement*>(m_renderer->node());
-        input->setValue(string);
-    } else if (m_renderer->isTextArea()) {
-        HTMLTextAreaElement* textArea = static_cast<HTMLTextAreaElement*>(m_renderer->node());
-        textArea->setValue(string);
-    } else if (roleValue() == SliderRole) {
-        Node* element = m_renderer->node();
-        if (element && element->isElementNode())
-            static_cast<Element*>(element)->setAttribute(aria_valuenowAttr, string);
+    if (renderer->isTextField()) {
+        // FIXME: This is not safe!  Other elements could have a TextField renderer.
+        static_cast<HTMLInputElement*>(element)->setValue(string);
+    } else if (renderer->isTextArea()) {
+        // FIXME: This is not safe!  Other elements could have a TextArea renderer.
+        static_cast<HTMLTextAreaElement*>(element)->setValue(string);
     }
 }
 
@@ -2255,7 +2275,7 @@ FrameView* AccessibilityRenderObject::topDocumentFrameView() const
 
 Widget* AccessibilityRenderObject::widget() const
 {
-    if (!m_renderer->isWidget())
+    if (!m_renderer->isBoxModelObject() || !toRenderBoxModelObject(m_renderer)->isWidget())
         return 0;
     return toRenderWidget(m_renderer)->widget();
 }
@@ -2516,12 +2536,12 @@ VisiblePosition AccessibilityRenderObject::visiblePositionForPoint(const IntPoin
             return VisiblePosition();
         
         pointResult = result.localPoint();
-        
+
         // done if hit something other than a widget
-        RenderObject* renderer = innerNode->renderer();
+        RenderBoxModelObject* renderer = innerNode->renderBoxModelObject();
         if (!renderer->isWidget())
             break;
-        
+
         // descend into widget (FRAME, IFRAME, OBJECT...)
         Widget* widget = toRenderWidget(renderer)->widget();
         if (!widget || !widget->isFrameView())
@@ -2706,13 +2726,13 @@ AccessibilityObject* AccessibilityRenderObject::doAccessibilityHitTest(const Int
     
     AccessibilityObject* result = obj->document()->axObjectCache()->getOrCreate(obj);
 
-    if (obj->isListBox()) {
+    if (obj->isBoxModelObject() && toRenderBoxModelObject(obj)->isListBox()) {
         // Make sure the children are initialized so that hit testing finds the right element.
         AccessibilityListBox* listBox = static_cast<AccessibilityListBox*>(result);
         listBox->updateChildrenIfNecessary();
         return listBox->doAccessibilityHitTest(point);
     }
-        
+
     if (result->accessibilityIsIgnored()) {
         // If this element is the label of a control, a hit test should return the control.
         AccessibilityObject* controlObject = result->correspondingControlForLabelElement();
@@ -2870,13 +2890,12 @@ bool AccessibilityRenderObject::renderObjectIsObservable(RenderObject* renderer)
         return true;
     
     // AX clients will listen for AXSelectedChildrenChanged on listboxes.
-    AXObjectCache* cache = axObjectCache();
     Node* node = renderer->node();
-    if (renderer->isListBox() || cache->nodeHasRole(node, "listbox"))
+    if (nodeHasRole(node, "listbox") || (renderer->isBoxModelObject() && toRenderBoxModelObject(renderer)->isListBox()))
         return true;
-    
+
     // Textboxes should send out notifications.
-    if (cache->nodeHasRole(node, "textbox"))
+    if (nodeHasRole(node, "textbox"))
         return true;
     
     return false;
@@ -2950,13 +2969,15 @@ AccessibilityRole AccessibilityRenderObject::determineAccessibilityRole()
     AccessibilityRole ariaRole = ariaRoleAttribute();
     if (ariaRole != UnknownRole)
         return ariaRole;
-    
+
+    RenderBoxModelObject* cssBox = renderBoxModelObject();
+
     if (node && node->isLink()) {
-        if (m_renderer->isImage())
+        if (cssBox && cssBox->isImage())
             return ImageMapRole;
         return WebCoreLinkRole;
     }
-    if (m_renderer->isListItem())
+    if (cssBox && cssBox->isListItem())
         return ListItemRole;
     if (m_renderer->isListMarker())
         return ListMarkerRole;
@@ -2964,23 +2985,23 @@ AccessibilityRole AccessibilityRenderObject::determineAccessibilityRole()
         return ButtonRole;
     if (m_renderer->isText())
         return StaticTextRole;
-    if (m_renderer->isImage()) {
+    if (cssBox && cssBox->isImage()) {
         if (node && node->hasTagName(inputTag))
             return ButtonRole;
         return ImageRole;
     }
     if (node && node->hasTagName(canvasTag))
         return ImageRole;
-    
-    if (m_renderer->isRenderView())
+
+    if (cssBox && cssBox->isRenderView())
         return WebAreaRole;
     
-    if (m_renderer->isTextField())
+    if (cssBox && cssBox->isTextField())
         return TextFieldRole;
     
-    if (m_renderer->isTextArea())
+    if (cssBox && cssBox->isTextArea())
         return TextAreaRole;
-    
+
     if (node && node->hasTagName(inputTag)) {
         HTMLInputElement* input = static_cast<HTMLInputElement*>(node);
         if (input->inputType() == HTMLInputElement::CHECKBOX)
@@ -2997,7 +3018,7 @@ AccessibilityRole AccessibilityRenderObject::determineAccessibilityRole()
     if (isFileUploadButton())
         return ButtonRole;
     
-    if (m_renderer->isMenuList())
+    if (cssBox && cssBox->isMenuList())
         return PopUpButtonRole;
     
     if (headingLevel())
@@ -3287,8 +3308,9 @@ void AccessibilityRenderObject::addChildren()
     }
     
     // for a RenderImage, add the <area> elements as individual accessibility objects
-    if (m_renderer->isRenderImage()) {
-        HTMLMapElement* map = toRenderImage(m_renderer)->imageMap();
+    RenderBoxModelObject* cssBox = renderBoxModelObject();
+    if (cssBox && cssBox->isRenderImage()) {
+        HTMLMapElement* map = toRenderImage(cssBox)->imageMap();
         if (map) {
             for (Node* current = map->firstChild(); current; current = current->traverseNextNode(map)) {
 
@@ -3605,7 +3627,7 @@ static AccessibilityRole msaaRoleForRenderer(const RenderObject* renderer)
     if (renderer->isText())
         return EditableTextRole;
 
-    if (renderer->isListItem())
+    if (renderer->isBoxModelObject() && toRenderBoxModelObject(renderer)->isListItem())
         return ListItemRole;
 
     return UnknownRole;
diff --git a/WebCore/accessibility/AccessibilityRenderObject.h b/WebCore/accessibility/AccessibilityRenderObject.h
index c05bc2d..77640db 100644
--- a/WebCore/accessibility/AccessibilityRenderObject.h
+++ b/WebCore/accessibility/AccessibilityRenderObject.h
@@ -1,3 +1,4 @@
+
 /*
  * Copyright (C) 2008 Apple Inc. All rights reserved.
  *
@@ -30,7 +31,7 @@
 #define AccessibilityRenderObject_h
 
 #include "AccessibilityObject.h"
-#include "RenderObject.h"
+#include <wtf/Forward.h>
 
 namespace WebCore {
     
@@ -165,6 +166,7 @@ public:
     
     void setRenderer(RenderObject* renderer) { m_renderer = renderer; }
     RenderObject* renderer() const { return m_renderer; }
+    RenderBoxModelObject* renderBoxModelObject() const;
     virtual Node* node() const;
 
     RenderView* topRenderer() const;
diff --git a/WebCore/accessibility/AccessibilityTable.cpp b/WebCore/accessibility/AccessibilityTable.cpp
index 04ecac3..7f7b6f2 100644
--- a/WebCore/accessibility/AccessibilityTable.cpp
+++ b/WebCore/accessibility/AccessibilityTable.cpp
@@ -43,8 +43,6 @@
 #include "RenderTableCell.h"
 #include "RenderTableSection.h"
 
-using namespace std;
-
 namespace WebCore {
 
 using namespace HTMLNames;
@@ -75,7 +73,7 @@ bool AccessibilityTable::isTableExposableThroughAccessibility()
     // <table> should be exposed as an AXTable. The goal
     // is to only show "data" tables
     
-    if (!m_renderer || !m_renderer->isTable())
+    if (!renderer())
         return false;
     
     // if the developer assigned an aria role to this, then we shouldn't 
@@ -196,7 +194,7 @@ bool AccessibilityTable::isTableExposableThroughAccessibility()
             // For the first 5 rows, cache the background color so we can check if this table has zebra-striped rows.
             if (row < 5 && row == alternatingRowColorCount) {
                 RenderObject* renderRow = cell->parent();
-                if (!renderRow || !renderRow->isTableRow())
+                if (!renderRow || !renderRow->isBoxModelObject() || !toRenderBoxModelObject(renderRow)->isTableRow())
                     continue;
                 RenderStyle* rowRenderStyle = renderRow->style();
                 if (!rowRenderStyle)
diff --git a/WebCore/accessibility/AccessibilityTable.h b/WebCore/accessibility/AccessibilityTable.h
index 42edf2a..c823561 100644
--- a/WebCore/accessibility/AccessibilityTable.h
+++ b/WebCore/accessibility/AccessibilityTable.h
@@ -50,7 +50,7 @@ protected:
 public:
     static PassRefPtr<AccessibilityTable> create(RenderObject*);
     virtual ~AccessibilityTable();
-    
+
     virtual bool isDataTable() const;
     virtual AccessibilityRole roleValue() const;
     virtual bool isAriaTable() const { return false; }
@@ -78,17 +78,17 @@ public:
 
     // an object that contains, as children, all the objects that act as headers
     AccessibilityObject* headerContainer();
-    
-protected:    
+
+protected:
     AccessibilityChildrenVector m_rows;
     AccessibilityChildrenVector m_columns;
-    
+
     AccessibilityTableHeaderContainer* m_headerContainer;
     mutable bool m_isAccessibilityTable;
-    
+
     bool isTableExposableThroughAccessibility();
 };
-    
+
 } // namespace WebCore 
 
 #endif // AccessibilityTable_h

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list