String AccessibilityMathMLElement::stringValue() const { if (m_isAnonymousOperator) return textUnderElement(); return AccessibilityRenderObject::stringValue(); }
String AccessibilitySVGElement::accessibilityDescription() const { // According to the SVG Accessibility API Mappings spec, the order of priority is: // 1. aria-labelledby // 2. aria-label // 3. a direct child title element (selected according to language) // 4. xlink:title attribute // 5. for a use element, the accessible name calculated for the re-used content // 6. for text container elements, the text content String ariaDescription = ariaAccessibilityDescription(); if (!ariaDescription.isEmpty()) return ariaDescription; auto titleElements = childrenOfType<SVGTitleElement>(*element()); if (auto titleChild = childElementWithMatchingLanguage(titleElements)) return titleChild->textContent(); if (is<SVGAElement>(element())) { auto& xlinkTitle = element()->attributeWithoutSynchronization(XLinkNames::titleAttr); if (!xlinkTitle.isEmpty()) return xlinkTitle; } if (m_renderer->isSVGText()) { AccessibilityTextUnderElementMode mode; String text = textUnderElement(mode); if (!text.isEmpty()) return text; } if (is<SVGUseElement>(element())) { if (AccessibilityObject* target = targetForUseElement()) return target->accessibilityDescription(); } // FIXME: This is here to not break the svg-image.html test. But 'alt' is not // listed as a supported attribute of the 'image' element in the SVG spec: // https://www.w3.org/TR/SVG/struct.html#ImageElement if (m_renderer->isSVGImage()) { const AtomicString& alt = getAttribute(HTMLNames::altAttr); if (!alt.isNull()) return alt; } return String(); }
unsigned AccessibilityObject::getLengthForTextRange() const { unsigned textLength = text().length(); if (textLength) return textLength; // Gtk ATs need this for all text objects; not just text controls. Node* node = this->node(); RenderObject* renderer = node ? node->renderer() : 0; if (renderer && renderer->isText()) textLength = toRenderText(*renderer).textLength(); // Get the text length from the elements under the // accessibility object if the value is still zero. if (!textLength && allowsTextRanges()) textLength = textUnderElement(AccessibilityTextUnderElementMode(AccessibilityTextUnderElementMode::TextUnderElementModeIncludeAllChildren)).length(); return textLength; }
String AccessibilitySVGElement::helpText() const { // According to the SVG Accessibility API Mappings spec, the order of priority is: // 1. aria-describedby // 2. a direct child desc element // 3. for a use element, the accessible description calculated for the re-used content // 4. for text container elements, the text content, if not used for the name // 5. a direct child title element that provides a tooltip, if not used for the name String describedBy = ariaDescribedByAttribute(); if (!describedBy.isEmpty()) return describedBy; auto descriptionElements = childrenOfType<SVGDescElement>(*element()); if (auto descriptionChild = childElementWithMatchingLanguage(descriptionElements)) return descriptionChild->textContent(); if (is<SVGUseElement>(element())) { AccessibilityObject* target = targetForUseElement(); if (target) return target->helpText(); } String description = accessibilityDescription(); if (m_renderer->isSVGText()) { AccessibilityTextUnderElementMode mode; String text = textUnderElement(mode); if (!text.isEmpty() && text != description) return text; } auto titleElements = childrenOfType<SVGTitleElement>(*element()); if (auto titleChild = childElementWithMatchingLanguage(titleElements)) { if (titleChild->textContent() != description) return titleChild->textContent(); } return String(); }