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