AccessibilityObjectAtk.cpp [plain text]
#include "config.h"
#include "AccessibilityObject.h"
#include "HTMLSpanElement.h"
#include "RenderBlock.h"
#include "RenderInline.h"
#include "RenderIterator.h"
#include "RenderTableCell.h"
#include "RenderText.h"
#include "TextControlInnerElements.h"
#include <glib-object.h>
#if HAVE(ACCESSIBILITY)
namespace WebCore {
bool AccessibilityObject::accessibilityIgnoreAttachment() const
{
return false;
}
AccessibilityObjectInclusion AccessibilityObject::accessibilityPlatformIncludesObject() const
{
AccessibilityObject* parent = parentObject();
if (!parent)
return DefaultBehavior;
AccessibilityRole role = roleValue();
if (role == SliderThumbRole)
return IgnoreObject;
if (isGroup() && parent->isList())
return IncludeObject;
if (parent->isPasswordField() || parent->isTextControl())
return IgnoreObject;
if (role == CellRole || role == TableRole || role == ColumnHeaderRole || role == RowHeaderRole)
return IncludeObject;
if (role == StaticTextRole)
return ariaRoleAttribute() != UnknownRole ? DefaultBehavior : IgnoreObject;
if (role == ListItemRole)
return IncludeObject;
if (role == ListMarkerRole)
return IgnoreObject;
if (role == UnknownRole)
return IgnoreObject;
if (role == InlineRole)
return IncludeObject;
RenderObject* renderObject = renderer();
if (!renderObject)
return DefaultBehavior;
if (role == ParagraphRole) {
auto child = childrenOfType<RenderBlock>(downcast<RenderElement>(*renderObject)).first();
return child ? IncludeObject : DefaultBehavior;
}
if (is<RenderTableCell>(renderObject)) {
for (const auto& child : childrenOfType<RenderObject>(downcast<RenderElement>(*renderObject))) {
if (is<RenderInline>(child) || is<RenderText>(child) || is<HTMLSpanElement>(child.node()))
return IncludeObject;
}
return DefaultBehavior;
}
if (renderObject->isAnonymousBlock()) {
if (parent->isMenuItem())
return IgnoreObject;
if (parent->isHeading())
return IgnoreObject;
if (parent->isListItem())
return IgnoreObject;
if (parent->isLink())
return IgnoreObject;
if (parent->roleValue() == ParagraphRole)
return IgnoreObject;
return DefaultBehavior;
}
Node* node = renderObject->node();
if (!node)
return DefaultBehavior;
if (is<HTMLSpanElement>(node) && !canSetFocusAttribute() && !hasAttributesRequiredForInclusion() && !supportsARIAAttributes())
return IgnoreObject;
if (is<TextControlInnerTextElement>(node))
return IgnoreObject;
return DefaultBehavior;
}
AccessibilityObjectWrapper* AccessibilityObject::wrapper() const
{
return m_wrapper;
}
void AccessibilityObject::setWrapper(AccessibilityObjectWrapper* wrapper)
{
if (wrapper == m_wrapper)
return;
if (m_wrapper)
g_object_unref(m_wrapper);
m_wrapper = wrapper;
if (m_wrapper)
g_object_ref(m_wrapper);
}
bool AccessibilityObject::allowsTextRanges() const
{
if (isTextControl() || isWebArea() || isGroup() || isLink() || isHeading() || isListItem() || isTableCell())
return true;
AccessibilityRole role = roleValue();
return role == ParagraphRole || role == LabelRole || role == DivRole || role == FormRole || role == PreRole;
}
unsigned AccessibilityObject::getLengthForTextRange() const
{
unsigned textLength = text().length();
if (textLength)
return textLength;
Node* node = this->node();
RenderObject* renderer = node ? node->renderer() : nullptr;
if (is<RenderText>(renderer))
textLength = downcast<RenderText>(*renderer).textLength();
if (!textLength && allowsTextRanges())
textLength = textUnderElement(AccessibilityTextUnderElementMode(AccessibilityTextUnderElementMode::TextUnderElementModeIncludeAllChildren)).length();
return textLength;
}
}
#endif // HAVE(ACCESSIBILITY)