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