diff options
Diffstat (limited to 'Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp')
-rw-r--r-- | Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp | 104 |
1 files changed, 81 insertions, 23 deletions
diff --git a/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp b/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp index 1dac10988..c14177cfc 100644 --- a/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp +++ b/Source/WebCore/accessibility/AccessibilityProgressIndicator.cpp @@ -21,11 +21,12 @@ #include "config.h" #include "AccessibilityProgressIndicator.h" -#if ENABLE(PROGRESS_ELEMENT) || ENABLE(METER_ELEMENT) +#include "AXObjectCache.h" #include "FloatConversion.h" #include "HTMLMeterElement.h" #include "HTMLNames.h" #include "HTMLProgressElement.h" +#include "LocalizedStrings.h" #include "RenderMeter.h" #include "RenderObject.h" #include "RenderProgress.h" @@ -34,17 +35,15 @@ namespace WebCore { using namespace HTMLNames; -#if ENABLE(PROGRESS_ELEMENT) AccessibilityProgressIndicator::AccessibilityProgressIndicator(RenderProgress* renderer) : AccessibilityRenderObject(renderer) { } -PassRefPtr<AccessibilityProgressIndicator> AccessibilityProgressIndicator::create(RenderProgress* renderer) +Ref<AccessibilityProgressIndicator> AccessibilityProgressIndicator::create(RenderProgress* renderer) { - return adoptRef(new AccessibilityProgressIndicator(renderer)); + return adoptRef(*new AccessibilityProgressIndicator(renderer)); } -#endif #if ENABLE(METER_ELEMENT) AccessibilityProgressIndicator::AccessibilityProgressIndicator(RenderMeter* renderer) @@ -52,9 +51,9 @@ AccessibilityProgressIndicator::AccessibilityProgressIndicator(RenderMeter* rend { } -PassRefPtr<AccessibilityProgressIndicator> AccessibilityProgressIndicator::create(RenderMeter* renderer) +Ref<AccessibilityProgressIndicator> AccessibilityProgressIndicator::create(RenderMeter* renderer) { - return adoptRef(new AccessibilityProgressIndicator(renderer)); + return adoptRef(*new AccessibilityProgressIndicator(renderer)); } #endif @@ -63,18 +62,46 @@ bool AccessibilityProgressIndicator::computeAccessibilityIsIgnored() const return accessibilityIsIgnoredByDefault(); } +String AccessibilityProgressIndicator::valueDescription() const +{ + // If the author has explicitly provided a value through aria-valuetext, use it. + String description = AccessibilityRenderObject::valueDescription(); + if (!description.isEmpty()) + return description; + +#if ENABLE(METER_ELEMENT) + if (!m_renderer->isMeter()) + return String(); + + HTMLMeterElement* meter = meterElement(); + if (!meter) + return String(); + + // The HTML spec encourages authors to include a textual representation of the meter's state in + // the element's contents. We'll fall back on that if there is not a more accessible alternative. + AccessibilityObject* axMeter = axObjectCache()->getOrCreate(meter); + if (is<AccessibilityNodeObject>(axMeter)) { + description = downcast<AccessibilityNodeObject>(axMeter)->accessibilityDescriptionForChildren(); + if (!description.isEmpty()) + return description; + } + + return meter->textContent(); +#endif + + return String(); +} + float AccessibilityProgressIndicator::valueForRange() const { if (!m_renderer) return 0.0; -#if ENABLE(PROGRESS_ELEMENT) if (m_renderer->isProgress()) { HTMLProgressElement* progress = progressElement(); if (progress && progress->position() >= 0) return narrowPrecisionToFloat(progress->value()); } -#endif #if ENABLE(METER_ELEMENT) if (m_renderer->isMeter()) { @@ -92,12 +119,10 @@ float AccessibilityProgressIndicator::maxValueForRange() const if (!m_renderer) return 0.0; -#if ENABLE(PROGRESS_ELEMENT) if (m_renderer->isProgress()) { if (HTMLProgressElement* progress = progressElement()) return narrowPrecisionToFloat(progress->max()); } -#endif #if ENABLE(METER_ELEMENT) if (m_renderer->isMeter()) { @@ -114,10 +139,8 @@ float AccessibilityProgressIndicator::minValueForRange() const if (!m_renderer) return 0.0; -#if ENABLE(PROGRESS_ELEMENT) if (m_renderer->isProgress()) return 0.0; -#endif #if ENABLE(METER_ELEMENT) if (m_renderer->isMeter()) { @@ -129,27 +152,62 @@ float AccessibilityProgressIndicator::minValueForRange() const return 0.0; } -#if ENABLE(PROGRESS_ELEMENT) HTMLProgressElement* AccessibilityProgressIndicator::progressElement() const { - if (!m_renderer->isProgress()) - return 0; + if (!is<RenderProgress>(*m_renderer)) + return nullptr; - return toRenderProgress(m_renderer)->progressElement(); + return downcast<RenderProgress>(*m_renderer).progressElement(); } -#endif #if ENABLE(METER_ELEMENT) HTMLMeterElement* AccessibilityProgressIndicator::meterElement() const { - if (!m_renderer->isMeter()) - return 0; + if (!is<RenderMeter>(*m_renderer)) + return nullptr; - return toRenderMeter(m_renderer)->meterElement(); + return downcast<RenderMeter>(*m_renderer).meterElement(); +} + +String AccessibilityProgressIndicator::gaugeRegionValueDescription() const +{ +#if PLATFORM(COCOA) + if (!m_renderer || !m_renderer->isMeter()) + return String(); + + // Only expose this when the author has explicitly specified the following attributes. + if (!hasAttribute(lowAttr) && !hasAttribute(highAttr) && !hasAttribute(optimumAttr)) + return String(); + + if (HTMLMeterElement* element = meterElement()) { + switch (element->gaugeRegion()) { + case HTMLMeterElement::GaugeRegionOptimum: + return AXMeterGaugeRegionOptimumText(); + case HTMLMeterElement::GaugeRegionSuboptimal: + return AXMeterGaugeRegionSuboptimalText(); + case HTMLMeterElement::GaugeRegionEvenLessGood: + return AXMeterGaugeRegionLessGoodText(); + default: + break; + } + } +#endif + return String(); } #endif -} // namespace WebCore +Element* AccessibilityProgressIndicator::element() const +{ + if (m_renderer->isProgress()) + return progressElement(); + +#if ENABLE(METER_ELEMENT) + if (m_renderer->isMeter()) + return meterElement(); +#endif -#endif // ENABLE(PROGRESS_ELEMENT) || ENABLE(METER_ELEMENT) + return AccessibilityObject::element(); +} + +} // namespace WebCore |