Index: WebCore/svg/SVGAElement.cpp |
=================================================================== |
--- WebCore/svg/SVGAElement.cpp (revision 67261) |
+++ WebCore/svg/SVGAElement.cpp (working copy) |
@@ -2,6 +2,7 @@ |
* Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
* Copyright (C) 2004, 2005, 2007 Rob Buis <buis@kde.org> |
* Copyright (C) 2007 Eric Seidel <eric@webkit.org> |
+ * Copyright (C) 2010 Apple Inc. All rights reserved. |
* |
* This library is free software; you can redistribute it and/or |
* modify it under the terms of the GNU Library General Public |
@@ -33,6 +34,7 @@ |
#include "Frame.h" |
#include "FrameLoader.h" |
#include "FrameLoaderTypes.h" |
+#include "HTMLAnchorElement.h" |
#include "KeyboardEvent.h" |
#include "MouseEvent.h" |
#include "PlatformMouseEvent.h" |
@@ -125,60 +127,47 @@ |
return new (arena) RenderSVGTransformableContainer(this); |
} |
-void SVGAElement::defaultEventHandler(Event* evt) |
+void SVGAElement::defaultEventHandler(Event* event) |
{ |
- if (isLink() && (evt->type() == eventNames().clickEvent || (evt->type() == eventNames().keydownEvent && focused()))) { |
- MouseEvent* e = 0; |
- if (evt->type() == eventNames().clickEvent && evt->isMouseEvent()) |
- e = static_cast<MouseEvent*>(evt); |
- |
- KeyboardEvent* k = 0; |
- if (evt->type() == eventNames().keydownEvent && evt->isKeyboardEvent()) |
- k = static_cast<KeyboardEvent*>(evt); |
- |
- if (e && e->button() == RightButton) { |
- SVGStyledTransformableElement::defaultEventHandler(evt); |
+ if (isLink()) { |
+ if (focused() && isEnterKeyKeydownEvent(event)) { |
+ event->setDefaultHandled(); |
+ dispatchSimulatedClick(event); |
return; |
} |
- |
- if (k) { |
- if (k->keyIdentifier() != "Enter") { |
- SVGStyledTransformableElement::defaultEventHandler(evt); |
- return; |
- } |
- evt->setDefaultHandled(); |
- dispatchSimulatedClick(evt); |
- return; |
- } |
- |
- String target = this->target(); |
- if (e && e->button() == MiddleButton) |
- target = "_blank"; |
- else if (target.isEmpty()) // if target is empty, default to "_self" or use xlink:target if set |
- target = (getAttribute(XLinkNames::showAttr) == "new") ? "_blank" : "_self"; |
- if (!evt->defaultPrevented()) { |
+ if (isLinkClick(event)) { |
String url = deprecatedParseURL(href()); |
+ |
#if ENABLE(SVG_ANIMATION) |
- if (url.startsWith("#")) { |
+ if (url[0] == '#') { |
Element* targetElement = document()->getElementById(url.substring(1)); |
if (SVGSMILElement::isSMILElement(targetElement)) { |
- SVGSMILElement* timed = static_cast<SVGSMILElement*>(targetElement); |
- timed->beginByLinkActivation(); |
- evt->setDefaultHandled(); |
- SVGStyledTransformableElement::defaultEventHandler(evt); |
+ static_cast<SVGSMILElement*>(targetElement)->beginByLinkActivation(); |
+ event->setDefaultHandled(); |
return; |
} |
} |
#endif |
- if (document()->frame()) |
- document()->frame()->loader()->urlSelected(document()->completeURL(url), target, evt, false, false, true, SendReferrer); |
- } |
- evt->setDefaultHandled(); |
+ // FIXME: Why does the SVG anchor element have this special logic |
+ // for middle click that the HTML anchor element does not have? |
+ // Making a middle click open a link in a new window or tab is |
+ // properly handled at the client level, not inside WebKit; this |
+ // code should be deleted. |
+ String target = isMiddleMouseButtonEvent(event) ? "_blank" : this->target(); |
+ |
+ // FIXME: It's not clear why setting target to "_self" is ever |
+ // helpful. |
+ if (target.isEmpty()) |
+ target = (getAttribute(XLinkNames::showAttr) == "new") ? "_blank" : "_self"; |
+ |
+ handleLinkClick(event, document(), url, target); |
+ return; |
+ } |
} |
- SVGStyledTransformableElement::defaultEventHandler(evt); |
+ SVGStyledTransformableElement::defaultEventHandler(event); |
} |
bool SVGAElement::supportsFocus() const |