15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Apple Inc. All Rights Reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 27bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/accessibility/AXMenuList.h" 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/accessibility/AXMenuListPopup.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderMenuList.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)AXMenuList::AXMenuList(RenderMenuList* renderer) 36bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) : AXRenderObject(renderer) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)PassRefPtr<AXMenuList> AXMenuList::create(RenderMenuList* renderer) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return adoptRef(new AXMenuList(renderer)); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool AXMenuList::press() const 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) RenderMenuList* menuList = toRenderMenuList(m_renderer); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (menuList->popupIsVisible()) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuList->hidePopup(); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuList->showPopup(); 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void AXMenuList::addChildren() 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_haveChildren = true; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) AXObjectCache* cache = m_renderer->document().axObjectCache(); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) AXObject* list = cache->getOrCreate(MenuListPopupRole); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!list) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 65bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) toAXMockObject(list)->setParent(this); 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (list->accessibilityIsIgnored()) { 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cache->remove(list->axObjectID()); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_children.append(list); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) list->addChildren(); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void AXMenuList::childrenChanged() 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_children.isEmpty()) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_children.size() == 1); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_children[0]->childrenChanged(); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool AXMenuList::isCollapsed() const 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return !toRenderMenuList(m_renderer)->popupIsVisible(); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 90bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool AXMenuList::canSetFocusAttribute() const 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node()) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return !toElement(node())->isDisabledFormControl(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void AXMenuList::didUpdateActiveOption(int optionIndex) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Document> document(m_renderer->document()); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AXObjectCache* cache = document->axObjectCache(); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AccessibilityChildrenVector& childObjects = children(); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!childObjects.isEmpty()) { 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(childObjects.size() == 1); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(childObjects[0]->isMenuListPopup()); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (childObjects[0]->isMenuListPopup()) { 109bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (AXMenuListPopup* popup = toAXMenuListPopup(childObjects[0].get())) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) popup->didUpdateActiveOption(optionIndex); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cache->postNotification(this, document.get(), AXObjectCache::AXMenuListValueChanged, true, PostSynchronously); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 118