1 /**
2 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
3 *
4 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
5 * (C) 1999 Antti Koivisto (koivisto@kde.org)
6 * (C) 2000 Simon Hausmann <hausmann@kde.org>
7 * Copyright (C) 2003, 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
8 * (C) 2006 Graham Dennis (graham.dennis@gmail.com)
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Library General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Library General Public License for more details.
19 *
20 * You should have received a copy of the GNU Library General Public License
21 * along with this library; see the file COPYING.LIB. If not, write to
22 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 * Boston, MA 02110-1301, USA.
24 *
25 */
26
27 #include "config.h"
28
29 #if ENABLE(WML)
30 #include "WMLAElement.h"
31
32 #include "Attribute.h"
33 #include "Event.h"
34 #include "EventHandler.h"
35 #include "EventNames.h"
36 #include "Frame.h"
37 #include "FrameLoader.h"
38 #include "HTMLAnchorElement.h"
39 #include "HTMLNames.h"
40 #include "HTMLParserIdioms.h"
41 #include "KeyboardEvent.h"
42 #include "MouseEvent.h"
43 #include "RenderBox.h"
44 #include "ResourceHandle.h"
45 #include "WMLNames.h"
46
47 namespace WebCore {
48
49 using namespace WMLNames;
50
WMLAElement(const QualifiedName & tagName,Document * doc)51 WMLAElement::WMLAElement(const QualifiedName& tagName, Document* doc)
52 : WMLElement(tagName, doc)
53 {
54 }
55
create(const QualifiedName & tagName,Document * document)56 PassRefPtr<WMLAElement> WMLAElement::create(const QualifiedName& tagName, Document* document)
57 {
58 return adoptRef(new WMLAElement(tagName, document));
59 }
60
parseMappedAttribute(Attribute * attr)61 void WMLAElement::parseMappedAttribute(Attribute* attr)
62 {
63 if (attr->name() == HTMLNames::hrefAttr) {
64 bool wasLink = isLink();
65 setIsLink(!attr->isNull());
66 if (wasLink != isLink())
67 setNeedsStyleRecalc();
68 if (isLink() && document()->isDNSPrefetchEnabled()) {
69 String value = attr->value();
70 if (protocolIs(value, "http") || protocolIs(value, "https") || value.startsWith("//"))
71 ResourceHandle::prepareForURL(document()->completeURL(value));
72 }
73 } else if (attr->name() == HTMLNames::nameAttr
74 || attr->name() == HTMLNames::titleAttr
75 || attr->name() == HTMLNames::relAttr) {
76 // Do nothing.
77 } else
78 WMLElement::parseMappedAttribute(attr);
79 }
80
supportsFocus() const81 bool WMLAElement::supportsFocus() const
82 {
83 return isLink() || WMLElement::supportsFocus();
84 }
85
isMouseFocusable() const86 bool WMLAElement::isMouseFocusable() const
87 {
88 return false;
89 }
90
isKeyboardFocusable(KeyboardEvent * event) const91 bool WMLAElement::isKeyboardFocusable(KeyboardEvent* event) const
92 {
93 if (!isFocusable())
94 return false;
95
96 if (!document()->frame())
97 return false;
98
99 if (!document()->frame()->eventHandler()->tabsToLinks(event))
100 return false;
101
102 if (!renderer() || !renderer()->isBoxModelObject())
103 return false;
104
105 // Before calling absoluteRects, check for the common case where the renderer
106 // is non-empty, since this is a faster check and almost always returns true.
107 RenderBoxModelObject* box = toRenderBoxModelObject(renderer());
108 if (!box->borderBoundingBox().isEmpty())
109 return true;
110
111 Vector<IntRect> rects;
112 FloatPoint absPos = renderer()->localToAbsolute();
113 renderer()->absoluteRects(rects, absPos.x(), absPos.y());
114 size_t n = rects.size();
115 for (size_t i = 0; i < n; ++i)
116 if (!rects[i].isEmpty())
117 return true;
118
119 return false;
120 }
121
defaultEventHandler(Event * event)122 void WMLAElement::defaultEventHandler(Event* event)
123 {
124 if (isLink()) {
125 if (focused() && isEnterKeyKeydownEvent(event)) {
126 event->setDefaultHandled();
127 dispatchSimulatedClick(event);
128 return;
129 }
130
131 if (isLinkClick(event)) {
132 handleLinkClick(event, document(), stripLeadingAndTrailingHTMLSpaces(getAttribute(HTMLNames::hrefAttr)), target(), event);
133 return;
134 }
135 }
136
137 WMLElement::defaultEventHandler(event);
138 }
139
accessKeyAction(bool sendToAnyElement)140 void WMLAElement::accessKeyAction(bool sendToAnyElement)
141 {
142 // send the mouse button events if the caller specified sendToAnyElement
143 dispatchSimulatedClick(0, sendToAnyElement);
144 }
145
isURLAttribute(Attribute * attr) const146 bool WMLAElement::isURLAttribute(Attribute *attr) const
147 {
148 return attr->name() == HTMLNames::hrefAttr;
149 }
150
target() const151 String WMLAElement::target() const
152 {
153 return getAttribute(HTMLNames::targetAttr);
154 }
155
156 }
157
158 #endif
159