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 ENABLE(ACCESSIBILITY)
namespace WebCore {
bool AccessibilityObject::accessibilityIgnoreAttachment() const
{
return false;
}
AccessibilityObjectInclusion AccessibilityObject::accessibilityPlatformIncludesObject() const
{
AccessibilityObject* parent = parentObject();
if (!parent)
return AccessibilityObjectInclusion::DefaultBehavior;
if (ariaRoleAttribute() != AccessibilityRole::Unknown)
return AccessibilityObjectInclusion::DefaultBehavior;
AccessibilityRole role = roleValue();
if (role == AccessibilityRole::SliderThumb)
return AccessibilityObjectInclusion::IgnoreObject;
if (isGroup() && parent->isList())
return AccessibilityObjectInclusion::IncludeObject;
if (parent->isPasswordField() || parent->isTextControl())
return AccessibilityObjectInclusion::IgnoreObject;
if (role == AccessibilityRole::Cell || role == AccessibilityRole::Table || role == AccessibilityRole::ColumnHeader || role == AccessibilityRole::RowHeader)
return AccessibilityObjectInclusion::IncludeObject;
if (role == AccessibilityRole::StaticText)
return ariaRoleAttribute() != AccessibilityRole::Unknown ? AccessibilityObjectInclusion::DefaultBehavior : AccessibilityObjectInclusion::IgnoreObject;
if (role == AccessibilityRole::ListItem)
return AccessibilityObjectInclusion::IncludeObject;
if (role == AccessibilityRole::ListMarker)
return AccessibilityObjectInclusion::IgnoreObject;
if (role == AccessibilityRole::Unknown)
return AccessibilityObjectInclusion::IgnoreObject;
if (role == AccessibilityRole::Inline)
return AccessibilityObjectInclusion::IncludeObject;
RenderObject* renderObject = renderer();
if (!renderObject)
return AccessibilityObjectInclusion::DefaultBehavior;
if (role == AccessibilityRole::Paragraph) {
auto child = childrenOfType<RenderBlock>(downcast<RenderElement>(*renderObject)).first();
return child ? AccessibilityObjectInclusion::IncludeObject : AccessibilityObjectInclusion::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 AccessibilityObjectInclusion::IncludeObject;
}
return AccessibilityObjectInclusion::DefaultBehavior;
}
if (renderObject->isAnonymousBlock()) {
if (parent->isMenuItem())
return AccessibilityObjectInclusion::IgnoreObject;
if (parent->isHeading())
return AccessibilityObjectInclusion::IgnoreObject;
if (parent->isListItem())
return AccessibilityObjectInclusion::IgnoreObject;
if (parent->isLink())
return AccessibilityObjectInclusion::IgnoreObject;
if (parent->roleValue() == AccessibilityRole::Paragraph)
return AccessibilityObjectInclusion::IgnoreObject;
return AccessibilityObjectInclusion::DefaultBehavior;
}
Node* node = renderObject->node();
if (!node)
return AccessibilityObjectInclusion::DefaultBehavior;
if (is<HTMLSpanElement>(node) && !canSetFocusAttribute() && !hasAttributesRequiredForInclusion() && !supportsARIAAttributes())
return AccessibilityObjectInclusion::IgnoreObject;
if (is<TextControlInnerTextElement>(node))
return AccessibilityObjectInclusion::IgnoreObject;
return AccessibilityObjectInclusion::DefaultBehavior;
}
bool AccessibilityObject::allowsTextRanges() const
{
if (isTextControl() || isWebArea() || isGroup() || isLink() || isHeading() || isListItem() || isTableCell())
return true;
AccessibilityRole role = roleValue();
return role == AccessibilityRole::Paragraph || role == AccessibilityRole::Label || role == AccessibilityRole::Div || role == AccessibilityRole::Form || role == AccessibilityRole::Pre;
}
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).text().length();
if (!textLength && allowsTextRanges())
textLength = textUnderElement(AccessibilityTextUnderElementMode(AccessibilityTextUnderElementMode::TextUnderElementModeIncludeAllChildren)).length();
return textLength;
}
}
#endif // ENABLE(ACCESSIBILITY)