1 /*
2 * Copyright (C) 2008 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 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "config.h"
30 #include "core/accessibility/AXListBox.h"
31
32 #include "core/accessibility/AXListBoxOption.h"
33 #include "core/accessibility/AXObjectCache.h"
34 #include "core/html/HTMLSelectElement.h"
35 #include "core/rendering/RenderListBox.h"
36
37
38 namespace WebCore {
39
40 using namespace HTMLNames;
41
AXListBox(RenderObject * renderer)42 AXListBox::AXListBox(RenderObject* renderer)
43 : AXRenderObject(renderer)
44 {
45 }
46
~AXListBox()47 AXListBox::~AXListBox()
48 {
49 }
50
create(RenderObject * renderer)51 PassRefPtr<AXListBox> AXListBox::create(RenderObject* renderer)
52 {
53 return adoptRef(new AXListBox(renderer));
54 }
55
addChildren()56 void AXListBox::addChildren()
57 {
58 Node* selectNode = m_renderer->node();
59 if (!selectNode)
60 return;
61
62 m_haveChildren = true;
63
64 const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems = toHTMLSelectElement(selectNode)->listItems();
65 unsigned length = listItems.size();
66 for (unsigned i = 0; i < length; i++) {
67 // The cast to HTMLElement below is safe because the only other possible listItem type
68 // would be a WMLElement, but WML builds don't use accessibility features at all.
69 AXObject* listOption = listBoxOptionAXObject(listItems[i]);
70 if (listOption && !listOption->accessibilityIsIgnored())
71 m_children.append(listOption);
72 }
73 }
74
listBoxOptionAXObject(HTMLElement * element) const75 AXObject* AXListBox::listBoxOptionAXObject(HTMLElement* element) const
76 {
77 // skip hr elements
78 if (!element || isHTMLHRElement(*element))
79 return 0;
80
81 AXObject* listBoxObject = m_renderer->document().axObjectCache()->getOrCreate(ListBoxOptionRole);
82 toAXListBoxOption(listBoxObject)->setHTMLElement(element);
83
84 return listBoxObject;
85 }
86
elementAccessibilityHitTest(const IntPoint & point) const87 AXObject* AXListBox::elementAccessibilityHitTest(const IntPoint& point) const
88 {
89 // the internal HTMLSelectElement methods for returning a listbox option at a point
90 // ignore optgroup elements.
91 if (!m_renderer)
92 return 0;
93
94 Node* node = m_renderer->node();
95 if (!node)
96 return 0;
97
98 LayoutRect parentRect = elementRect();
99
100 AXObject* listBoxOption = 0;
101 unsigned length = m_children.size();
102 for (unsigned i = 0; i < length; i++) {
103 LayoutRect rect = toRenderListBox(m_renderer)->itemBoundingBoxRect(parentRect.location(), i);
104 // The cast to HTMLElement below is safe because the only other possible listItem type
105 // would be a WMLElement, but WML builds don't use accessibility features at all.
106 if (rect.contains(point)) {
107 listBoxOption = m_children[i].get();
108 break;
109 }
110 }
111
112 if (listBoxOption && !listBoxOption->accessibilityIsIgnored())
113 return listBoxOption;
114
115 return axObjectCache()->getOrCreate(m_renderer);
116 }
117
118 } // namespace WebCore
119