[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