Home | History | Annotate | Download | only in accessibility
      1 /*
      2  * Copyright (C) 2011 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  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "core/accessibility/AccessibilitySpinButton.h"
     28 
     29 #include "core/accessibility/AXObjectCache.h"
     30 #include "core/rendering/RenderObject.h"
     31 
     32 namespace WebCore {
     33 
     34 PassRefPtr<AccessibilitySpinButton> AccessibilitySpinButton::create()
     35 {
     36     return adoptRef(new AccessibilitySpinButton);
     37 }
     38 
     39 AccessibilitySpinButton::AccessibilitySpinButton()
     40     : m_spinButtonElement(0)
     41 {
     42 }
     43 
     44 AccessibilitySpinButton::~AccessibilitySpinButton()
     45 {
     46 }
     47 
     48 LayoutRect AccessibilitySpinButton::elementRect() const
     49 {
     50     ASSERT(m_spinButtonElement);
     51 
     52     if (!m_spinButtonElement || !m_spinButtonElement->renderer())
     53         return LayoutRect();
     54 
     55     Vector<FloatQuad> quads;
     56     m_spinButtonElement->renderer()->absoluteFocusRingQuads(quads);
     57 
     58     return boundingBoxForQuads(m_spinButtonElement->renderer(), quads);
     59 }
     60 
     61 void AccessibilitySpinButton::addChildren()
     62 {
     63     m_haveChildren = true;
     64 
     65     AccessibilitySpinButtonPart* incrementor = static_cast<AccessibilitySpinButtonPart*>(axObjectCache()->getOrCreate(SpinButtonPartRole));
     66     incrementor->setIsIncrementor(true);
     67     incrementor->setParent(this);
     68     m_children.append(incrementor);
     69 
     70     AccessibilitySpinButtonPart* decrementor = static_cast<AccessibilitySpinButtonPart*>(axObjectCache()->getOrCreate(SpinButtonPartRole));
     71     decrementor->setIsIncrementor(false);
     72     decrementor->setParent(this);
     73     m_children.append(decrementor);
     74 }
     75 
     76 void AccessibilitySpinButton::step(int amount)
     77 {
     78     ASSERT(m_spinButtonElement);
     79     if (!m_spinButtonElement)
     80         return;
     81 
     82     m_spinButtonElement->step(amount);
     83 }
     84 
     85 // AccessibilitySpinButtonPart
     86 
     87 AccessibilitySpinButtonPart::AccessibilitySpinButtonPart()
     88     : m_isIncrementor(false)
     89 {
     90 }
     91 
     92 PassRefPtr<AccessibilitySpinButtonPart> AccessibilitySpinButtonPart::create()
     93 {
     94     return adoptRef(new AccessibilitySpinButtonPart);
     95 }
     96 
     97 LayoutRect AccessibilitySpinButtonPart::elementRect() const
     98 {
     99     // FIXME: This logic should exist in the render tree or elsewhere, but there is no
    100     // relationship that exists that can be queried.
    101 
    102     LayoutRect parentRect = parentObject()->elementRect();
    103     if (m_isIncrementor)
    104         parentRect.setHeight(parentRect.height() / 2);
    105     else {
    106         parentRect.setY(parentRect.y() + parentRect.height() / 2);
    107         parentRect.setHeight(parentRect.height() / 2);
    108     }
    109 
    110     return parentRect;
    111 }
    112 
    113 bool AccessibilitySpinButtonPart::press() const
    114 {
    115     if (!m_parent || !m_parent->isSpinButton())
    116         return false;
    117 
    118     AccessibilitySpinButton* spinButton = toAccessibilitySpinButton(parentObject());
    119     if (m_isIncrementor)
    120         spinButton->step(1);
    121     else
    122         spinButton->step(-1);
    123 
    124     return true;
    125 }
    126 
    127 } // namespace WebCore
    128