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 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 "AccessibilityImageMapLink.h"
31
32#include "AXObjectCache.h"
33#include "AccessibilityRenderObject.h"
34#include "Document.h"
35#include "HTMLNames.h"
36#include "RenderBoxModelObject.h"
37
38namespace WebCore {
39
40using namespace HTMLNames;
41
42AccessibilityImageMapLink::AccessibilityImageMapLink()
43    : m_areaElement(0)
44    , m_mapElement(0)
45{
46}
47
48AccessibilityImageMapLink::~AccessibilityImageMapLink()
49{
50}
51
52PassRefPtr<AccessibilityImageMapLink> AccessibilityImageMapLink::create()
53{
54    return adoptRef(new AccessibilityImageMapLink());
55}
56
57AccessibilityObject* AccessibilityImageMapLink::parentObject() const
58{
59    if (m_parent)
60        return m_parent;
61
62    if (!m_mapElement.get() || !m_mapElement->renderer())
63        return 0;
64
65    return m_mapElement->document().axObjectCache()->getOrCreate(m_mapElement->renderer());
66}
67
68AccessibilityRole AccessibilityImageMapLink::roleValue() const
69{
70    if (!m_areaElement)
71        return WebCoreLinkRole;
72
73    const AtomicString& ariaRole = getAttribute(roleAttr);
74    if (!ariaRole.isEmpty())
75        return AccessibilityObject::ariaRoleToWebCoreRole(ariaRole);
76
77    return WebCoreLinkRole;
78}
79
80Element* AccessibilityImageMapLink::actionElement() const
81{
82    return anchorElement();
83}
84
85Element* AccessibilityImageMapLink::anchorElement() const
86{
87    return m_areaElement.get();
88}
89
90URL AccessibilityImageMapLink::url() const
91{
92    if (!m_areaElement.get())
93        return URL();
94
95    return m_areaElement->href();
96}
97
98void AccessibilityImageMapLink::accessibilityText(Vector<AccessibilityText>& textOrder)
99{
100    String description = accessibilityDescription();
101    if (!description.isEmpty())
102        textOrder.append(AccessibilityText(description, AlternativeText));
103
104    const AtomicString& titleText = getAttribute(titleAttr);
105    if (!titleText.isEmpty())
106        textOrder.append(AccessibilityText(titleText, TitleTagText));
107
108    const AtomicString& summary = getAttribute(summaryAttr);
109    if (!summary.isEmpty())
110        textOrder.append(AccessibilityText(summary, SummaryText));
111}
112
113String AccessibilityImageMapLink::accessibilityDescription() const
114{
115    const AtomicString& ariaLabel = getAttribute(aria_labelAttr);
116    if (!ariaLabel.isEmpty())
117        return ariaLabel;
118    const AtomicString& alt = getAttribute(altAttr);
119    if (!alt.isEmpty())
120        return alt;
121
122    return String();
123}
124
125String AccessibilityImageMapLink::title() const
126{
127    const AtomicString& title = getAttribute(titleAttr);
128    if (!title.isEmpty())
129        return title;
130    const AtomicString& summary = getAttribute(summaryAttr);
131    if (!summary.isEmpty())
132        return summary;
133
134    return String();
135}
136
137RenderElement* AccessibilityImageMapLink::imageMapLinkRenderer() const
138{
139    if (!m_mapElement || !m_areaElement)
140        return nullptr;
141
142    RenderElement* renderer = nullptr;
143    if (m_parent && m_parent->isAccessibilityRenderObject())
144        renderer = toRenderElement(toAccessibilityRenderObject(m_parent)->renderer());
145    else
146        renderer = m_mapElement->renderer();
147
148    return renderer;
149}
150
151void AccessibilityImageMapLink::detachFromParent()
152{
153    AccessibilityMockObject::detachFromParent();
154    m_areaElement = nullptr;
155    m_mapElement = nullptr;
156}
157
158Path AccessibilityImageMapLink::elementPath() const
159{
160    auto renderer = imageMapLinkRenderer();
161    if (!renderer)
162        return Path();
163
164    return m_areaElement->computePath(renderer);
165}
166
167LayoutRect AccessibilityImageMapLink::elementRect() const
168{
169    auto renderer = imageMapLinkRenderer();
170    if (!renderer)
171        return LayoutRect();
172
173    return m_areaElement->computeRect(renderer);
174}
175
176String AccessibilityImageMapLink::stringValueForMSAA() const
177{
178    return url();
179}
180
181String AccessibilityImageMapLink::nameForMSAA() const
182{
183    return accessibilityDescription();
184}
185
186} // namespace WebCore
187