Home | History | Annotate | Download | only in accessibility
      1 /*
      2  * Copyright (C) 2010 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  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "core/accessibility/AXMenuListOption.h"
     28 
     29 #include "core/html/HTMLOptionElement.h"
     30 
     31 namespace blink {
     32 
     33 using namespace HTMLNames;
     34 
     35 AXMenuListOption::AXMenuListOption()
     36 {
     37 }
     38 
     39 void AXMenuListOption::setElement(HTMLElement* element)
     40 {
     41     ASSERT_ARG(element, isHTMLOptionElement(element));
     42     m_element = element;
     43 }
     44 
     45 Element* AXMenuListOption::actionElement() const
     46 {
     47     return m_element.get();
     48 }
     49 
     50 bool AXMenuListOption::isEnabled() const
     51 {
     52     // isDisabledFormControl() returns true if the parent <select> element is disabled,
     53     // which we don't want.
     54     return !toHTMLOptionElement(m_element)->ownElementDisabled();
     55 }
     56 
     57 bool AXMenuListOption::isVisible() const
     58 {
     59     if (!m_parent)
     60         return false;
     61 
     62     // In a single-option select with the popup collapsed, only the selected
     63     // item is considered visible.
     64     return !m_parent->isOffScreen() || isSelected();
     65 }
     66 
     67 bool AXMenuListOption::isOffScreen() const
     68 {
     69     // Invisible list options are considered to be offscreen.
     70     return !isVisible();
     71 }
     72 
     73 bool AXMenuListOption::isSelected() const
     74 {
     75     return toHTMLOptionElement(m_element)->selected();
     76 }
     77 
     78 void AXMenuListOption::setSelected(bool b)
     79 {
     80     if (!canSetSelectedAttribute())
     81         return;
     82 
     83     toHTMLOptionElement(m_element)->setSelected(b);
     84 }
     85 
     86 bool AXMenuListOption::canSetSelectedAttribute() const
     87 {
     88     return isEnabled();
     89 }
     90 
     91 bool AXMenuListOption::computeAccessibilityIsIgnored() const
     92 {
     93     return accessibilityIsIgnoredByDefault();
     94 }
     95 
     96 LayoutRect AXMenuListOption::elementRect() const
     97 {
     98     AXObject* parent = parentObject();
     99     ASSERT(parent->isMenuListPopup());
    100 
    101     AXObject* grandparent = parent->parentObject();
    102     ASSERT(grandparent->isMenuList());
    103 
    104     return grandparent->elementRect();
    105 }
    106 
    107 String AXMenuListOption::stringValue() const
    108 {
    109     return toHTMLOptionElement(m_element)->text();
    110 }
    111 
    112 } // namespace blink
    113