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 "AccessibilityMenuListPopup.h" 28d0825bca7fe65beaee391d30da42e937db621564Steve Block 29d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "AXObjectCache.h" 30d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "AccessibilityMenuList.h" 31d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "AccessibilityMenuListOption.h" 32d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLNames.h" 33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "HTMLSelectElement.h" 34dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "RenderMenuList.h" 35d0825bca7fe65beaee391d30da42e937db621564Steve Block 36d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace WebCore { 37d0825bca7fe65beaee391d30da42e937db621564Steve Block 38d0825bca7fe65beaee391d30da42e937db621564Steve Blockusing namespace HTMLNames; 39d0825bca7fe65beaee391d30da42e937db621564Steve Block 40d0825bca7fe65beaee391d30da42e937db621564Steve BlockAccessibilityMenuListPopup::AccessibilityMenuListPopup() 41d0825bca7fe65beaee391d30da42e937db621564Steve Block : m_menuList(0) 42d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 43d0825bca7fe65beaee391d30da42e937db621564Steve Block} 44d0825bca7fe65beaee391d30da42e937db621564Steve Block 45d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool AccessibilityMenuListPopup::isVisible() const 46d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 47d0825bca7fe65beaee391d30da42e937db621564Steve Block return false; 48d0825bca7fe65beaee391d30da42e937db621564Steve Block} 49d0825bca7fe65beaee391d30da42e937db621564Steve Block 50d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool AccessibilityMenuListPopup::isOffScreen() const 51d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 52d0825bca7fe65beaee391d30da42e937db621564Steve Block return m_menuList->isCollapsed(); 53d0825bca7fe65beaee391d30da42e937db621564Steve Block} 54d0825bca7fe65beaee391d30da42e937db621564Steve Block 55d0825bca7fe65beaee391d30da42e937db621564Steve BlockAccessibilityObject* AccessibilityMenuListPopup::parentObject() const 56d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 57d0825bca7fe65beaee391d30da42e937db621564Steve Block return m_menuList; 58d0825bca7fe65beaee391d30da42e937db621564Steve Block} 59d0825bca7fe65beaee391d30da42e937db621564Steve Block 60d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool AccessibilityMenuListPopup::isEnabled() const 61d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 62d0825bca7fe65beaee391d30da42e937db621564Steve Block return m_menuList->isEnabled(); 63d0825bca7fe65beaee391d30da42e937db621564Steve Block} 64d0825bca7fe65beaee391d30da42e937db621564Steve Block 65d0825bca7fe65beaee391d30da42e937db621564Steve BlockAccessibilityMenuListOption* AccessibilityMenuListPopup::menuListOptionAccessibilityObject(HTMLElement* element) const 66d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 67d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!element || !element->hasTagName(optionTag)) 68d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 69d0825bca7fe65beaee391d30da42e937db621564Steve Block 70d0825bca7fe65beaee391d30da42e937db621564Steve Block AccessibilityObject* object = m_menuList->renderer()->document()->axObjectCache()->getOrCreate(MenuListOptionRole); 71d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(object->isMenuListOption()); 72d0825bca7fe65beaee391d30da42e937db621564Steve Block 73d0825bca7fe65beaee391d30da42e937db621564Steve Block AccessibilityMenuListOption* option = static_cast<AccessibilityMenuListOption*>(object); 74d0825bca7fe65beaee391d30da42e937db621564Steve Block option->setElement(element); 75d0825bca7fe65beaee391d30da42e937db621564Steve Block 76d0825bca7fe65beaee391d30da42e937db621564Steve Block return option; 77d0825bca7fe65beaee391d30da42e937db621564Steve Block} 78d0825bca7fe65beaee391d30da42e937db621564Steve Block 79d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool AccessibilityMenuListPopup::press() const 80d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 81d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuList->press(); 82d0825bca7fe65beaee391d30da42e937db621564Steve Block return true; 83d0825bca7fe65beaee391d30da42e937db621564Steve Block} 84d0825bca7fe65beaee391d30da42e937db621564Steve Block 85d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid AccessibilityMenuListPopup::addChildren() 86d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 87d0825bca7fe65beaee391d30da42e937db621564Steve Block Node* selectNode = m_menuList->renderer()->node(); 88d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!selectNode) 89d0825bca7fe65beaee391d30da42e937db621564Steve Block return; 90d0825bca7fe65beaee391d30da42e937db621564Steve Block 91d0825bca7fe65beaee391d30da42e937db621564Steve Block m_haveChildren = true; 92d0825bca7fe65beaee391d30da42e937db621564Steve Block 93d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(selectNode->hasTagName(selectTag)); 94d0825bca7fe65beaee391d30da42e937db621564Steve Block 95d0825bca7fe65beaee391d30da42e937db621564Steve Block const Vector<Element*>& listItems = static_cast<HTMLSelectElement*>(selectNode)->listItems(); 96d0825bca7fe65beaee391d30da42e937db621564Steve Block unsigned length = listItems.size(); 97d0825bca7fe65beaee391d30da42e937db621564Steve Block for (unsigned i = 0; i < length; i++) { 98d0825bca7fe65beaee391d30da42e937db621564Steve Block // The cast to HTMLElement below is safe because the only other possible listItem type 99d0825bca7fe65beaee391d30da42e937db621564Steve Block // would be a WMLElement, but WML builds don't use accessbility features at all. 1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block AccessibilityMenuListOption* option = menuListOptionAccessibilityObject(toHTMLElement(listItems[i])); 101d0825bca7fe65beaee391d30da42e937db621564Steve Block if (option) { 102d0825bca7fe65beaee391d30da42e937db621564Steve Block option->setParent(this); 103d0825bca7fe65beaee391d30da42e937db621564Steve Block m_children.append(option); 104d0825bca7fe65beaee391d30da42e937db621564Steve Block } 105d0825bca7fe65beaee391d30da42e937db621564Steve Block } 106d0825bca7fe65beaee391d30da42e937db621564Steve Block} 107d0825bca7fe65beaee391d30da42e937db621564Steve Block 108d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid AccessibilityMenuListPopup::childrenChanged() 109d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 110d0825bca7fe65beaee391d30da42e937db621564Steve Block for (size_t i = m_children.size(); i > 0 ; --i) { 111d0825bca7fe65beaee391d30da42e937db621564Steve Block AccessibilityObject* child = m_children[i - 1].get(); 112d0825bca7fe65beaee391d30da42e937db621564Steve Block if (child->actionElement() && !child->actionElement()->attached()) { 113d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuList->renderer()->document()->axObjectCache()->remove(child->axObjectID()); 114d0825bca7fe65beaee391d30da42e937db621564Steve Block m_children.remove(i - 1); 115d0825bca7fe65beaee391d30da42e937db621564Steve Block } 116d0825bca7fe65beaee391d30da42e937db621564Steve Block } 117d0825bca7fe65beaee391d30da42e937db621564Steve Block} 118d0825bca7fe65beaee391d30da42e937db621564Steve Block 119d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid AccessibilityMenuListPopup::setMenuList(AccessibilityMenuList* menuList) 120d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 121d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_ARG(menuList, menuList); 122d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(!m_menuList); 123d0825bca7fe65beaee391d30da42e937db621564Steve Block m_menuList = menuList; 124d0825bca7fe65beaee391d30da42e937db621564Steve Block} 125d0825bca7fe65beaee391d30da42e937db621564Steve Block 126d0825bca7fe65beaee391d30da42e937db621564Steve Block} // namespace WebCore 127