OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) 2004, 2005, 2007 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2007 Rob Buis <buis@kde.org> |
4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> |
| 5 * Copyright (C) 2010 Apple Inc. All rights reserved. |
5 * | 6 * |
6 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
7 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
8 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
9 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
10 * | 11 * |
11 * This library is distributed in the hope that it will be useful, | 12 * This library is distributed in the hope that it will be useful, |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 * Library General Public License for more details. | 15 * Library General Public License for more details. |
(...skipping 11 matching lines...) Expand all Loading... |
26 | 27 |
27 #include "Attr.h" | 28 #include "Attr.h" |
28 #include "Attribute.h" | 29 #include "Attribute.h" |
29 #include "CSSHelper.h" | 30 #include "CSSHelper.h" |
30 #include "Document.h" | 31 #include "Document.h" |
31 #include "EventHandler.h" | 32 #include "EventHandler.h" |
32 #include "EventNames.h" | 33 #include "EventNames.h" |
33 #include "Frame.h" | 34 #include "Frame.h" |
34 #include "FrameLoader.h" | 35 #include "FrameLoader.h" |
35 #include "FrameLoaderTypes.h" | 36 #include "FrameLoaderTypes.h" |
| 37 #include "HTMLAnchorElement.h" |
36 #include "KeyboardEvent.h" | 38 #include "KeyboardEvent.h" |
37 #include "MouseEvent.h" | 39 #include "MouseEvent.h" |
38 #include "PlatformMouseEvent.h" | 40 #include "PlatformMouseEvent.h" |
39 #include "RenderSVGInline.h" | 41 #include "RenderSVGInline.h" |
40 #include "RenderSVGTransformableContainer.h" | 42 #include "RenderSVGTransformableContainer.h" |
41 #include "ResourceRequest.h" | 43 #include "ResourceRequest.h" |
42 #include "SVGNames.h" | 44 #include "SVGNames.h" |
43 #include "SVGSMILElement.h" | 45 #include "SVGSMILElement.h" |
44 #include "XLinkNames.h" | 46 #include "XLinkNames.h" |
45 | 47 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 } | 120 } |
119 | 121 |
120 RenderObject* SVGAElement::createRenderer(RenderArena* arena, RenderStyle*) | 122 RenderObject* SVGAElement::createRenderer(RenderArena* arena, RenderStyle*) |
121 { | 123 { |
122 if (static_cast<SVGElement*>(parent())->isTextContent()) | 124 if (static_cast<SVGElement*>(parent())->isTextContent()) |
123 return new (arena) RenderSVGInline(this); | 125 return new (arena) RenderSVGInline(this); |
124 | 126 |
125 return new (arena) RenderSVGTransformableContainer(this); | 127 return new (arena) RenderSVGTransformableContainer(this); |
126 } | 128 } |
127 | 129 |
128 void SVGAElement::defaultEventHandler(Event* evt) | 130 void SVGAElement::defaultEventHandler(Event* event) |
129 { | 131 { |
130 if (isLink() && (evt->type() == eventNames().clickEvent || (evt->type() == e
ventNames().keydownEvent && focused()))) { | 132 if (isLink()) { |
131 MouseEvent* e = 0; | 133 if (focused() && isEnterKeyKeydownEvent(event)) { |
132 if (evt->type() == eventNames().clickEvent && evt->isMouseEvent()) | 134 event->setDefaultHandled(); |
133 e = static_cast<MouseEvent*>(evt); | 135 dispatchSimulatedClick(event); |
134 | |
135 KeyboardEvent* k = 0; | |
136 if (evt->type() == eventNames().keydownEvent && evt->isKeyboardEvent()) | |
137 k = static_cast<KeyboardEvent*>(evt); | |
138 | |
139 if (e && e->button() == RightButton) { | |
140 SVGStyledTransformableElement::defaultEventHandler(evt); | |
141 return; | 136 return; |
142 } | 137 } |
143 | |
144 if (k) { | |
145 if (k->keyIdentifier() != "Enter") { | |
146 SVGStyledTransformableElement::defaultEventHandler(evt); | |
147 return; | |
148 } | |
149 evt->setDefaultHandled(); | |
150 dispatchSimulatedClick(evt); | |
151 return; | |
152 } | |
153 | |
154 String target = this->target(); | |
155 if (e && e->button() == MiddleButton) | |
156 target = "_blank"; | |
157 else if (target.isEmpty()) // if target is empty, default to "_self" or
use xlink:target if set | |
158 target = (getAttribute(XLinkNames::showAttr) == "new") ? "_blank" :
"_self"; | |
159 | 138 |
160 if (!evt->defaultPrevented()) { | 139 if (isLinkClick(event)) { |
161 String url = deprecatedParseURL(href()); | 140 String url = deprecatedParseURL(href()); |
| 141 |
162 #if ENABLE(SVG_ANIMATION) | 142 #if ENABLE(SVG_ANIMATION) |
163 if (url.startsWith("#")) { | 143 if (url[0] == '#') { |
164 Element* targetElement = document()->getElementById(url.substrin
g(1)); | 144 Element* targetElement = document()->getElementById(url.substrin
g(1)); |
165 if (SVGSMILElement::isSMILElement(targetElement)) { | 145 if (SVGSMILElement::isSMILElement(targetElement)) { |
166 SVGSMILElement* timed = static_cast<SVGSMILElement*>(targetE
lement); | 146 static_cast<SVGSMILElement*>(targetElement)->beginByLinkActi
vation(); |
167 timed->beginByLinkActivation(); | 147 event->setDefaultHandled(); |
168 evt->setDefaultHandled(); | |
169 SVGStyledTransformableElement::defaultEventHandler(evt); | |
170 return; | 148 return; |
171 } | 149 } |
172 } | 150 } |
173 #endif | 151 #endif |
174 if (document()->frame()) | 152 |
175 document()->frame()->loader()->urlSelected(document()->completeU
RL(url), target, evt, false, false, true, SendReferrer); | 153 // FIXME: Why does the SVG anchor element have this special logic |
| 154 // for middle click that the HTML anchor element does not have? |
| 155 // Making a middle click open a link in a new window or tab is |
| 156 // properly handled at the client level, not inside WebKit; this |
| 157 // code should be deleted. |
| 158 String target = isMiddleMouseButtonEvent(event) ? "_blank" : this->t
arget(); |
| 159 |
| 160 // FIXME: It's not clear why setting target to "_self" is ever |
| 161 // helpful. |
| 162 if (target.isEmpty()) |
| 163 target = (getAttribute(XLinkNames::showAttr) == "new") ? "_blank
" : "_self"; |
| 164 |
| 165 handleLinkClick(event, document(), url, target); |
| 166 return; |
176 } | 167 } |
177 | |
178 evt->setDefaultHandled(); | |
179 } | 168 } |
180 | 169 |
181 SVGStyledTransformableElement::defaultEventHandler(evt); | 170 SVGStyledTransformableElement::defaultEventHandler(event); |
182 } | 171 } |
183 | 172 |
184 bool SVGAElement::supportsFocus() const | 173 bool SVGAElement::supportsFocus() const |
185 { | 174 { |
186 if (isContentEditable()) | 175 if (isContentEditable()) |
187 return SVGStyledTransformableElement::supportsFocus(); | 176 return SVGStyledTransformableElement::supportsFocus(); |
188 return true; | 177 return true; |
189 } | 178 } |
190 | 179 |
191 bool SVGAElement::isFocusable() const | 180 bool SVGAElement::isFocusable() const |
(...skipping 28 matching lines...) Expand all Loading... |
220 return false; | 209 return false; |
221 if (parent() && parent()->isSVGElement()) | 210 if (parent() && parent()->isSVGElement()) |
222 return parent()->childShouldCreateRenderer(child); | 211 return parent()->childShouldCreateRenderer(child); |
223 | 212 |
224 return SVGElement::childShouldCreateRenderer(child); | 213 return SVGElement::childShouldCreateRenderer(child); |
225 } | 214 } |
226 | 215 |
227 } // namespace WebCore | 216 } // namespace WebCore |
228 | 217 |
229 #endif // ENABLE(SVG) | 218 #endif // ENABLE(SVG) |
OLD | NEW |