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