AccessibilityLabel.cpp [plain text]
#include "config.h"
#include "AccessibilityLabel.h"
#include "AXObjectCache.h"
#include "HTMLNames.h"
namespace WebCore {
using namespace HTMLNames;
AccessibilityLabel::AccessibilityLabel(RenderObject* renderer)
: AccessibilityRenderObject(renderer)
{
}
AccessibilityLabel::~AccessibilityLabel() = default;
Ref<AccessibilityLabel> AccessibilityLabel::create(RenderObject* renderer)
{
return adoptRef(*new AccessibilityLabel(renderer));
}
bool AccessibilityLabel::computeAccessibilityIsIgnored() const
{
return accessibilityIsIgnoredByDefault();
}
String AccessibilityLabel::stringValue() const
{
if (containsOnlyStaticText())
return textUnderElement();
return AccessibilityNodeObject::stringValue();
}
static bool childrenContainOnlyStaticText(const AccessibilityObject::AccessibilityChildrenVector& children)
{
if (!children.size())
return false;
for (const auto& child : children) {
if (child->roleValue() == AccessibilityRole::StaticText)
continue;
if (child->roleValue() == AccessibilityRole::Group) {
if (!childrenContainOnlyStaticText(child->children()))
return false;
} else
return false;
}
return true;
}
bool AccessibilityLabel::containsOnlyStaticText() const
{
if (m_containsOnlyStaticTextDirty)
return childrenContainOnlyStaticText(m_children);
return m_containsOnlyStaticText;
}
static bool childrenContainUnrelatedControls(const AccessibilityObject::AccessibilityChildrenVector& children, AccessibilityObject* controlForLabel)
{
if (!children.size())
return false;
for (const auto& child : children) {
if (child->isControl()) {
if (child == controlForLabel)
continue;
return true;
}
if (childrenContainUnrelatedControls(child->children(), controlForLabel))
return true;
}
return false;
}
bool AccessibilityLabel::containsUnrelatedControls() const
{
if (containsOnlyStaticText())
return false;
return childrenContainUnrelatedControls(m_children, correspondingControlForLabelElement());
}
void AccessibilityLabel::updateChildrenIfNecessary()
{
AccessibilityRenderObject::updateChildrenIfNecessary();
if (m_containsOnlyStaticTextDirty)
m_containsOnlyStaticText = childrenContainOnlyStaticText(m_children);
m_containsOnlyStaticTextDirty = false;
}
void AccessibilityLabel::clearChildren()
{
AccessibilityRenderObject::clearChildren();
m_containsOnlyStaticText = false;
m_containsOnlyStaticTextDirty = false;
}
void AccessibilityLabel::insertChild(AccessibilityObject* object, unsigned index)
{
AccessibilityRenderObject::insertChild(object, index);
m_containsOnlyStaticTextDirty = true;
}
}