Home | History | Annotate | Download | only in accessibility
      1 /*
      2  * Copyright (C) 2009 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     14  *     its contributors may be used to endorse or promote products derived
     15  *     from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 #include "config.h"
     30 #include "core/accessibility/AccessibilitySlider.h"
     31 
     32 #include "core/accessibility/AXObjectCache.h"
     33 #include "core/html/HTMLInputElement.h"
     34 #include "core/html/shadow/SliderThumbElement.h"
     35 
     36 namespace WebCore {
     37 
     38 using namespace HTMLNames;
     39 
     40 AccessibilitySlider::AccessibilitySlider(RenderObject* renderer)
     41     : AccessibilityRenderObject(renderer)
     42 {
     43 }
     44 
     45 PassRefPtr<AccessibilitySlider> AccessibilitySlider::create(RenderObject* renderer)
     46 {
     47     return adoptRef(new AccessibilitySlider(renderer));
     48 }
     49 
     50 AccessibilityOrientation AccessibilitySlider::orientation() const
     51 {
     52     // Default to horizontal in the unknown case.
     53     if (!m_renderer)
     54         return AccessibilityOrientationHorizontal;
     55 
     56     RenderStyle* style = m_renderer->style();
     57     if (!style)
     58         return AccessibilityOrientationHorizontal;
     59 
     60     ControlPart styleAppearance = style->appearance();
     61     switch (styleAppearance) {
     62     case SliderThumbHorizontalPart:
     63     case SliderHorizontalPart:
     64     case MediaSliderPart:
     65     case MediaFullScreenVolumeSliderPart:
     66         return AccessibilityOrientationHorizontal;
     67 
     68     case SliderThumbVerticalPart:
     69     case SliderVerticalPart:
     70     case MediaVolumeSliderPart:
     71         return AccessibilityOrientationVertical;
     72 
     73     default:
     74         return AccessibilityOrientationHorizontal;
     75     }
     76 }
     77 
     78 void AccessibilitySlider::addChildren()
     79 {
     80     ASSERT(!m_haveChildren);
     81 
     82     m_haveChildren = true;
     83 
     84     AXObjectCache* cache = m_renderer->document()->axObjectCache();
     85 
     86     AccessibilitySliderThumb* thumb = static_cast<AccessibilitySliderThumb*>(cache->getOrCreate(SliderThumbRole));
     87     thumb->setParent(this);
     88 
     89     // Before actually adding the value indicator to the hierarchy,
     90     // allow the platform to make a final decision about it.
     91     if (thumb->accessibilityIsIgnored())
     92         cache->remove(thumb->axObjectID());
     93     else
     94         m_children.append(thumb);
     95 }
     96 
     97 const AtomicString& AccessibilitySlider::getAttribute(const QualifiedName& attribute) const
     98 {
     99     return element()->getAttribute(attribute);
    100 }
    101 
    102 AccessibilityObject* AccessibilitySlider::elementAccessibilityHitTest(const IntPoint& point) const
    103 {
    104     if (m_children.size()) {
    105         ASSERT(m_children.size() == 1);
    106         if (m_children[0]->elementRect().contains(point))
    107             return m_children[0].get();
    108     }
    109 
    110     return axObjectCache()->getOrCreate(m_renderer);
    111 }
    112 
    113 float AccessibilitySlider::valueForRange() const
    114 {
    115     return element()->value().toFloat();
    116 }
    117 
    118 float AccessibilitySlider::maxValueForRange() const
    119 {
    120     return static_cast<float>(element()->maximum());
    121 }
    122 
    123 float AccessibilitySlider::minValueForRange() const
    124 {
    125     return static_cast<float>(element()->minimum());
    126 }
    127 
    128 void AccessibilitySlider::setValue(const String& value)
    129 {
    130     HTMLInputElement* input = element();
    131 
    132     if (input->value() == value)
    133         return;
    134 
    135     input->setValue(value);
    136 
    137     // Fire change event manually, as RenderSlider::setValueForPosition does.
    138     input->dispatchFormControlChangeEvent();
    139 }
    140 
    141 HTMLInputElement* AccessibilitySlider::element() const
    142 {
    143     return toHTMLInputElement(m_renderer->node());
    144 }
    145 
    146 
    147 AccessibilitySliderThumb::AccessibilitySliderThumb()
    148 {
    149 }
    150 
    151 PassRefPtr<AccessibilitySliderThumb> AccessibilitySliderThumb::create()
    152 {
    153     return adoptRef(new AccessibilitySliderThumb());
    154 }
    155 
    156 LayoutRect AccessibilitySliderThumb::elementRect() const
    157 {
    158     if (!m_parent)
    159         return LayoutRect();
    160 
    161     RenderObject* sliderRenderer = m_parent->renderer();
    162     if (!sliderRenderer || !sliderRenderer->isSlider())
    163         return LayoutRect();
    164     return sliderThumbElementOf(sliderRenderer->node())->boundingBox();
    165 }
    166 
    167 bool AccessibilitySliderThumb::computeAccessibilityIsIgnored() const
    168 {
    169     return accessibilityIsIgnoredByDefault();
    170 }
    171 
    172 } // namespace WebCore
    173