Changeset 67246 in webkit


Ignore:
Timestamp:
Sep 10, 2010 3:42:32 PM (14 years ago)
Author:
pkasting@chromium.org
Message:

2010-09-109 Peter Kasting <pkasting@google.com>

Reviewed by Darin Adler.

Cleanup and simplification in advance of making middle clicks not send a
click event.
https://bugs.webkit.org/show_bug.cgi?id=22382

  • editing/DeleteButton.cpp:

(WebCore::DeleteButton::defaultEventHandler): Removed unneeded code to
check if the event is a MouseEvent. Any click event will do.

  • html/HTMLAnchorElement.cpp:

(WebCore::appendServerMapMousePosition): Added. Factors out the
modifications to the URL to add the mouse position to make the default
event handler function easier to read.
(WebCore::HTMLAnchorElement::defaultEventHandler): Reorganized to make
the enter key logic separate from the link clicking logic and simplify
the function. This makes minor functional changes like not calling
FrameLoader::urlSelected() for fake "keydown" events constructed from
JavaScript.
(WebCore::HTMLAnchorElement::isLiveLink): Refactored to use new shared
implementation in treatLinkAsLiveForEventType().
(WebCore::eventType): Factors out event type calculation (for
treatLinkAsLiveForEventType()) from the default event handler to make it
easier to read.
(WebCore::HTMLAnchorElement::treatLinkAsLiveForEventType):
Implementation of the portions of isLiveLink() that are common with the
checks defaultEventHandler() wants to do.
(WebCore::isEnterKeyKeydownEvent): Added. Shared by the default
event handlers for all three anchor elements.
(WebCore::isMiddleMouseButtonEvent): Added. Shared by the isLinkClick
function below and some code in SVG. Later we can make this private to
this source file once we remove the unneeded SVG code.
(WebCore::isLinkClick): Added. Shared by the default event handlers for
all three anchor elements.
(WebCore::handleLinkClick): Ditto.

  • html/HTMLAnchorElement.h: Added the new functions.
  • svg/SVGAElement.cpp:

(WebCore::SVGAElement::defaultEventHandler): Removed lots of unneeded
logic and streamlined the code to more closely match the
HTMLAnchorElement code and share functions with it.

  • wml/WMLAElement.cpp:

(WebCore::WMLAElement::defaultEventHandler): Ditto.

Location:
trunk/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r67245 r67246  
     12010-09-109  Peter Kasting  <pkasting@google.com>
     2
     3        Reviewed by Darin Adler.
     4
     5        Cleanup and simplification in advance of making middle clicks not send a
     6        click event.
     7        https://bugs.webkit.org/show_bug.cgi?id=22382
     8
     9        * editing/DeleteButton.cpp:
     10        (WebCore::DeleteButton::defaultEventHandler): Removed unneeded code to
     11        check if the event is a MouseEvent. Any click event will do.
     12        * html/HTMLAnchorElement.cpp:
     13        (WebCore::appendServerMapMousePosition): Added. Factors out the
     14        modifications to the URL to add the mouse position to make the default
     15        event handler function easier to read.
     16        (WebCore::HTMLAnchorElement::defaultEventHandler): Reorganized to make
     17        the enter key logic separate from the link clicking logic and simplify
     18        the function.  This makes minor functional changes like not calling
     19        FrameLoader::urlSelected() for fake "keydown" events constructed from
     20        JavaScript.
     21        (WebCore::HTMLAnchorElement::isLiveLink): Refactored to use new shared
     22        implementation in treatLinkAsLiveForEventType().
     23        (WebCore::eventType): Factors out event type calculation (for
     24        treatLinkAsLiveForEventType()) from the default event handler to make it
     25        easier to read.
     26        (WebCore::HTMLAnchorElement::treatLinkAsLiveForEventType):
     27        Implementation of the portions of isLiveLink() that are common with the
     28        checks defaultEventHandler() wants to do.
     29        (WebCore::isEnterKeyKeydownEvent): Added. Shared by the default
     30        event handlers for all three anchor elements.
     31        (WebCore::isMiddleMouseButtonEvent): Added. Shared by the isLinkClick
     32        function below and some code in SVG. Later we can make this private to
     33        this source file once we remove the unneeded SVG code.
     34        (WebCore::isLinkClick): Added. Shared by the default event handlers for
     35        all three anchor elements.
     36        (WebCore::handleLinkClick): Ditto.
     37        * html/HTMLAnchorElement.h: Added the new functions.
     38        * svg/SVGAElement.cpp:
     39        (WebCore::SVGAElement::defaultEventHandler): Removed lots of unneeded
     40        logic and streamlined the code to more closely match the
     41        HTMLAnchorElement code and share functions with it.
     42        * wml/WMLAElement.cpp:
     43        (WebCore::WMLAElement::defaultEventHandler): Ditto.
     44
    1452010-09-10  Tony Gentilcore  <tonyg@chromium.org>
    246
  • trunk/WebCore/editing/DeleteButton.cpp

    r61293 r67246  
    5151void DeleteButton::defaultEventHandler(Event* event)
    5252{
    53     // FIXME: Is it really import to check the type of the event?
    54     // Seems OK to respond to any event named click even if it does not have the correct type.
    55     if (event->isMouseEvent()) {
    56         if (event->type() == eventNames().clickEvent) {
    57             document()->frame()->editor()->deleteButtonController()->deleteTarget();
    58             event->setDefaultHandled();
    59             // FIXME: Shouldn't we return here instead of falling through?
    60         }
     53    if (event->type() == eventNames().clickEvent) {
     54        document()->frame()->editor()->deleteButtonController()->deleteTarget();
     55        event->setDefaultHandled();
     56        return;
    6157    }
    6258
  • trunk/WebCore/html/HTMLAnchorElement.cpp

    r65468 r67246  
    33 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
    44 *           (C) 2000 Simon Hausmann <hausmann@kde.org>
    5  * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
     5 * Copyright (C) 2003, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
    66 *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
    77 *
     
    106106}
    107107
    108 void HTMLAnchorElement::defaultEventHandler(Event* evt)
    109 {
    110     // React on clicks and on keypresses.
    111     // Don't make this KEYUP_EVENT again, it makes khtml follow links it shouldn't,
    112     // when pressing Enter in the combo.
    113     if (isLink() && (evt->type() == eventNames().clickEvent || (evt->type() == eventNames().keydownEvent && focused()))) {
    114         MouseEvent* e = 0;
    115         if (evt->type() == eventNames().clickEvent && evt->isMouseEvent())
    116             e = static_cast<MouseEvent*>(evt);
    117 
    118         KeyboardEvent* k = 0;
    119         if (evt->type() == eventNames().keydownEvent && evt->isKeyboardEvent())
    120             k = static_cast<KeyboardEvent*>(evt);
    121 
    122         if (e && e->button() == RightButton) {
    123             HTMLElement::defaultEventHandler(evt);
     108static void appendServerMapMousePosition(String& url, Event* event)
     109{
     110    if (!event->isMouseEvent())
     111        return;
     112
     113    ASSERT(event->target());
     114    Node* target = event->target()->toNode();
     115    ASSERT(target);
     116    if (!target->hasTagName(imgTag))
     117        return;
     118
     119    HTMLImageElement* imageElement = static_cast<HTMLImageElement*>(event->target()->toNode());
     120    if (!imageElement || !imageElement->isServerMap())
     121        return;
     122
     123    RenderImage* renderer = toRenderImage(imageElement->renderer());
     124    if (!renderer)
     125        return;
     126
     127    // FIXME: This should probably pass true for useTransforms.
     128    FloatPoint absolutePosition = renderer->absoluteToLocal(FloatPoint(static_cast<MouseEvent*>(event)->pageX(), static_cast<MouseEvent*>(event)->pageY()));
     129    int x = absolutePosition.x();
     130    int y = absolutePosition.y();
     131    url += "?";
     132    url += String::number(x);
     133    url += ",";
     134    url += String::number(y);
     135}
     136
     137void HTMLAnchorElement::defaultEventHandler(Event* event)
     138{
     139    if (isLink()) {
     140        if (focused() && isEnterKeyKeydownEvent(event) && treatLinkAsLiveForEventType(NonMouseEvent)) {
     141            event->setDefaultHandled();
     142            dispatchSimulatedClick(event);
    124143            return;
    125144        }
    126145
    127         // If the link is editable, then we need to check the settings to see whether or not to follow the link
     146        if (isLinkClick(event) && treatLinkAsLiveForEventType(eventType(event))) {
     147            String url = deprecatedParseURL(getAttribute(hrefAttr));
     148            appendServerMapMousePosition(url, event);
     149            handleLinkClick(event, document(), url, getAttribute(targetAttr), hasRel(RelationNoReferrer));
     150            return;
     151        }
     152
    128153        if (isContentEditable()) {
    129             EditableLinkBehavior editableLinkBehavior = EditableLinkDefaultBehavior;
    130             if (Settings* settings = document()->settings())
    131                 editableLinkBehavior = settings->editableLinkBehavior();
    132                
    133             switch (editableLinkBehavior) {
    134                 // Always follow the link (Safari 2.0 behavior)
    135                 default:
    136                 case EditableLinkDefaultBehavior:
    137                 case EditableLinkAlwaysLive:
    138                     break;
    139 
    140                 case EditableLinkNeverLive:
    141                     HTMLElement::defaultEventHandler(evt);
    142                     return;
    143 
    144                 // If the selection prior to clicking on this link resided in the same editable block as this link,
    145                 // and the shift key isn't pressed, we don't want to follow the link
    146                 case EditableLinkLiveWhenNotFocused:
    147                     if (e && !e->shiftKey() && m_rootEditableElementForSelectionOnMouseDown == rootEditableElement()) {
    148                         HTMLElement::defaultEventHandler(evt);
    149                         return;
    150                     }
    151                     break;
    152 
    153                 // Only follow the link if the shift key is down (WinIE/Firefox behavior)
    154                 case EditableLinkOnlyLiveWithShiftKey:
    155                     if (e && !e->shiftKey()) {
    156                         HTMLElement::defaultEventHandler(evt);
    157                         return;
    158                     }
    159                     break;
     154            // This keeps track of the editable block that the selection was in (if it was in one) just before the link was clicked
     155            // for the LiveWhenNotFocused editable link behavior
     156            if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() != RightButton && document()->frame() && document()->frame()->selection()) {
     157                m_rootEditableElementForSelectionOnMouseDown = document()->frame()->selection()->rootEditableElement();
     158                m_wasShiftKeyDownOnMouseDown = static_cast<MouseEvent*>(event)->shiftKey();
     159            } else if (event->type() == eventNames().mouseoverEvent) {
     160                // These are cleared on mouseover and not mouseout because their values are needed for drag events,
     161                // but drag events happen after mouse out events.
     162                m_rootEditableElementForSelectionOnMouseDown = 0;
     163                m_wasShiftKeyDownOnMouseDown = false;
    160164            }
    161165        }
    162 
    163         if (k) {
    164             if (k->keyIdentifier() != "Enter") {
    165                 HTMLElement::defaultEventHandler(evt);
    166                 return;
    167             }
    168             evt->setDefaultHandled();
    169             dispatchSimulatedClick(evt);
    170             return;
    171         }
    172 
    173         String url = deprecatedParseURL(getAttribute(hrefAttr));
    174 
    175         ASSERT(evt->target());
    176         ASSERT(evt->target()->toNode());
    177         if (evt->target()->toNode()->hasTagName(imgTag)) {
    178             HTMLImageElement* img = static_cast<HTMLImageElement*>(evt->target()->toNode());
    179             if (img && img->isServerMap()) {
    180                 RenderImage* r = toRenderImage(img->renderer());
    181                 if (r && e) {
    182                     // FIXME: broken with transforms
    183                     FloatPoint absPos = r->localToAbsolute();
    184                     int x = e->pageX() - absPos.x();
    185                     int y = e->pageY() - absPos.y();
    186                     url += "?";
    187                     url += String::number(x);
    188                     url += ",";
    189                     url += String::number(y);
    190                 } else {
    191                     evt->setDefaultHandled();
    192                     HTMLElement::defaultEventHandler(evt);
    193                     return;
    194                 }
    195             }
    196         }
    197 
    198         if (!evt->defaultPrevented() && document()->frame())
    199             document()->frame()->loader()->urlSelected(document()->completeURL(url), getAttribute(targetAttr), evt, false, false, true, hasRel(RelationNoReferrer) ? NoReferrer : SendReferrer);
    200 
    201         evt->setDefaultHandled();
    202     } else if (isLink() && isContentEditable()) {
    203         // This keeps track of the editable block that the selection was in (if it was in one) just before the link was clicked
    204         // for the LiveWhenNotFocused editable link behavior
    205         if (evt->type() == eventNames().mousedownEvent && evt->isMouseEvent() && static_cast<MouseEvent*>(evt)->button() != RightButton && document()->frame() && document()->frame()->selection()) {
    206             MouseEvent* e = static_cast<MouseEvent*>(evt);
    207 
    208             m_rootEditableElementForSelectionOnMouseDown = document()->frame()->selection()->rootEditableElement();
    209             m_wasShiftKeyDownOnMouseDown = e && e->shiftKey();
    210         } else if (evt->type() == eventNames().mouseoverEvent) {
    211             // These are cleared on mouseover and not mouseout because their values are needed for drag events, but these happen
    212             // after mouse out events.
    213             m_rootEditableElementForSelectionOnMouseDown = 0;
    214             m_wasShiftKeyDownOnMouseDown = false;
    215         }
    216166    }
    217167
    218     HTMLElement::defaultEventHandler(evt);
     168    HTMLElement::defaultEventHandler(event);
    219169}
    220170
     
    513463bool HTMLAnchorElement::isLiveLink() const
    514464{
    515     if (!isLink())
    516         return false;
     465    return isLink() && treatLinkAsLiveForEventType(m_wasShiftKeyDownOnMouseDown ? MouseEventWithShiftKey : MouseEventWithoutShiftKey);
     466}
     467
     468HTMLAnchorElement::EventType HTMLAnchorElement::eventType(Event* event)
     469{
     470    if (!event->isMouseEvent())
     471        return NonMouseEvent;
     472    return static_cast<MouseEvent*>(event)->shiftKey() ? MouseEventWithShiftKey : MouseEventWithoutShiftKey;
     473}
     474
     475bool HTMLAnchorElement::treatLinkAsLiveForEventType(EventType eventType) const
     476{
    517477    if (!isContentEditable())
    518478        return true;
    519    
    520     EditableLinkBehavior editableLinkBehavior = EditableLinkDefaultBehavior;
    521     if (Settings* settings = document()->settings())
    522         editableLinkBehavior = settings->editableLinkBehavior();
    523        
    524     switch (editableLinkBehavior) {
    525         default:
    526         case EditableLinkDefaultBehavior:
    527         case EditableLinkAlwaysLive:
    528             return true;
    529 
    530         case EditableLinkNeverLive:
    531             return false;
    532 
    533         // Don't set the link to be live if the current selection is in the same editable block as
    534         // this link or if the shift key is down
    535         case EditableLinkLiveWhenNotFocused:
    536             return m_wasShiftKeyDownOnMouseDown || m_rootEditableElementForSelectionOnMouseDown != rootEditableElement();
    537            
    538         case EditableLinkOnlyLiveWithShiftKey:
    539             return m_wasShiftKeyDownOnMouseDown;
     479
     480    Settings* settings = document()->settings();
     481    if (!settings)
     482        return true;
     483
     484    switch (settings->editableLinkBehavior()) {
     485    case EditableLinkDefaultBehavior:
     486    case EditableLinkAlwaysLive:
     487        return true;
     488
     489    case EditableLinkNeverLive:
     490        return false;
     491
     492    // If the selection prior to clicking on this link resided in the same editable block as this link,
     493    // and the shift key isn't pressed, we don't want to follow the link.
     494    case EditableLinkLiveWhenNotFocused:
     495        return eventType == MouseEventWithShiftKey || (eventType == MouseEventWithoutShiftKey && m_rootEditableElementForSelectionOnMouseDown != rootEditableElement());
     496
     497    case EditableLinkOnlyLiveWithShiftKey:
     498        return eventType == MouseEventWithShiftKey;
    540499    }
    541 }
    542 
    543 }
     500
     501    ASSERT_NOT_REACHED();
     502    return false;
     503}
     504
     505bool isEnterKeyKeydownEvent(Event* event)
     506{
     507    return event->type() == eventNames().keydownEvent && event->isKeyboardEvent() && static_cast<KeyboardEvent*>(event)->keyIdentifier() == "Enter";
     508}
     509
     510bool isMiddleMouseButtonEvent(Event* event)
     511{
     512    return event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == MiddleButton;
     513}
     514
     515bool isLinkClick(Event* event)
     516{
     517    return event->type() == eventNames().clickEvent && (!event->isMouseEvent() || static_cast<MouseEvent*>(event)->button() != RightButton);
     518}
     519
     520void handleLinkClick(Event* event, Document* document, const String& url, const String& target, bool hideReferrer)
     521{
     522    event->setDefaultHandled();
     523
     524    Frame* frame = document->frame();
     525    if (!frame)
     526        return;
     527    frame->loader()->urlSelected(document->completeURL(url), target, event, false, false, true, hideReferrer ? NoReferrer : SendReferrer);
     528}
     529
     530}
  • trunk/WebCore/html/HTMLAnchorElement.h

    r66057 r67246  
    33 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
    44 *           (C) 2000 Simon Hausmann <hausmann@kde.org>
    5  * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
     5 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
    66 *
    77 * This library is free software; you can redistribute it and/or
     
    110110    virtual bool draggable() const;
    111111
     112    enum EventType {
     113        MouseEventWithoutShiftKey,
     114        MouseEventWithShiftKey,
     115        NonMouseEvent,
     116    };
     117    static EventType eventType(Event*);
     118    bool treatLinkAsLiveForEventType(EventType) const;
     119
    112120    RefPtr<Element> m_rootEditableElementForSelectionOnMouseDown;
    113121    bool m_wasShiftKeyDownOnMouseDown;
     
    115123};
    116124
     125// Functions shared with the other anchor elements (SVG and WML).
     126
     127bool isEnterKeyKeydownEvent(Event*);
     128bool isMiddleMouseButtonEvent(Event*);
     129bool isLinkClick(Event*);
     130void handleLinkClick(Event*, Document*, const String& url, const String& target, bool hideReferrer = false);
     131
    117132} // namespace WebCore
    118133
  • trunk/WebCore/svg/SVGAElement.cpp

    r66498 r67246  
    33 * Copyright (C) 2004, 2005, 2007 Rob Buis <buis@kde.org>
    44 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
     5 * Copyright (C) 2010 Apple Inc. All rights reserved.
    56 *
    67 * This library is free software; you can redistribute it and/or
     
    3435#include "FrameLoader.h"
    3536#include "FrameLoaderTypes.h"
     37#include "HTMLAnchorElement.h"
    3638#include "KeyboardEvent.h"
    3739#include "MouseEvent.h"
     
    126128}
    127129
    128 void SVGAElement::defaultEventHandler(Event* evt)
    129 {
    130     if (isLink() && (evt->type() == eventNames().clickEvent || (evt->type() == eventNames().keydownEvent && focused()))) {
    131         MouseEvent* e = 0;
    132         if (evt->type() == eventNames().clickEvent && evt->isMouseEvent())
    133             e = static_cast<MouseEvent*>(evt);
    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);
     130void SVGAElement::defaultEventHandler(Event* event)
     131{
     132    if (isLink()) {
     133        if (focused() && isEnterKeyKeydownEvent(event)) {
     134            event->setDefaultHandled();
     135            dispatchSimulatedClick(event);
    141136            return;
    142137        }
    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 
    160         if (!evt->defaultPrevented()) {
     138
     139        if (isLinkClick(event)) {
    161140            String url = deprecatedParseURL(href());
     141
    162142#if ENABLE(SVG_ANIMATION)
    163             if (url.startsWith("#")) {
     143            if (url[0] == '#') {
    164144                Element* targetElement = document()->getElementById(url.substring(1));
    165145                if (SVGSMILElement::isSMILElement(targetElement)) {
    166                     SVGSMILElement* timed = static_cast<SVGSMILElement*>(targetElement);
    167                     timed->beginByLinkActivation();
    168                     evt->setDefaultHandled();
    169                     SVGStyledTransformableElement::defaultEventHandler(evt);
     146                    static_cast<SVGSMILElement*>(targetElement)->beginByLinkActivation();
     147                    event->setDefaultHandled();
    170148                    return;
    171149                }
    172150            }
    173151#endif
    174             if (document()->frame())
    175                 document()->frame()->loader()->urlSelected(document()->completeURL(url), target, evt, false, false, true, SendReferrer);
     152
     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->target();
     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;
    176167        }
    177 
    178         evt->setDefaultHandled();
    179     }
    180 
    181     SVGStyledTransformableElement::defaultEventHandler(evt);
     168    }
     169
     170    SVGStyledTransformableElement::defaultEventHandler(event);
    182171}
    183172
  • trunk/WebCore/wml/WMLAElement.cpp

    r66498 r67246  
    55 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
    66 *           (C) 2000 Simon Hausmann <hausmann@kde.org>
    7  * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved.
     7 * Copyright (C) 2003, 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
    88 *           (C) 2006 Graham Dennis (graham.dennis@gmail.com)
    99 *
     
    3636#include "Frame.h"
    3737#include "FrameLoader.h"
     38#include "HTMLAnchorElement.h"
    3839#include "HTMLNames.h"
    3940#include "KeyboardEvent.h"
     
    120121void WMLAElement::defaultEventHandler(Event* event)
    121122{
    122     if (isLink() && (event->type() == eventNames().clickEvent || (event->type() == eventNames().keydownEvent && focused()))) {
    123         MouseEvent* e = 0;
    124         if (event->type() == eventNames().clickEvent && event->isMouseEvent())
    125             e = static_cast<MouseEvent*>(event);
    126 
    127         KeyboardEvent* k = 0;
    128         if (event->type() == eventNames().keydownEvent && event->isKeyboardEvent())
    129             k = static_cast<KeyboardEvent*>(event);
    130 
    131         if (e && e->button() == RightButton) {
    132             WMLElement::defaultEventHandler(event);
    133             return;
    134         }
    135 
    136         if (k) {
    137             if (k->keyIdentifier() != "Enter") {
    138                 WMLElement::defaultEventHandler(event);
    139                 return;
    140             }
    141 
     123    if (isLink()) {
     124        if (focused() && isEnterKeyKeydownEvent(event)) {
    142125            event->setDefaultHandled();
    143126            dispatchSimulatedClick(event);
    144127            return;
    145128        }
    146  
    147         if (!event->defaultPrevented() && document()->frame()) {
    148             KURL url = document()->completeURL(deprecatedParseURL(getAttribute(HTMLNames::hrefAttr)));
    149             document()->frame()->loader()->urlSelected(url, target(), event, false, false, true, SendReferrer);
     129
     130        if (isLinkClick(event)) {
     131            handleLinkClick(document(), deprecatedParseURL(getAttribute(HTMLNames::hrefAttr)), target(), event);
     132            return;
    150133        }
    151 
    152         event->setDefaultHandled();
    153134    }
    154135
Note: See TracChangeset for help on using the changeset viewer.