Changeset 67246 in webkit
- Timestamp:
- Sep 10, 2010 3:42:32 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r67245 r67246 1 2010-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 1 45 2010-09-10 Tony Gentilcore <tonyg@chromium.org> 2 46 -
trunk/WebCore/editing/DeleteButton.cpp
r61293 r67246 51 51 void DeleteButton::defaultEventHandler(Event* event) 52 52 { 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; 61 57 } 62 58 -
trunk/WebCore/html/HTMLAnchorElement.cpp
r65468 r67246 3 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 4 4 * (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. 6 6 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) 7 7 * … … 106 106 } 107 107 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); 108 static 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 137 void HTMLAnchorElement::defaultEventHandler(Event* event) 138 { 139 if (isLink()) { 140 if (focused() && isEnterKeyKeydownEvent(event) && treatLinkAsLiveForEventType(NonMouseEvent)) { 141 event->setDefaultHandled(); 142 dispatchSimulatedClick(event); 124 143 return; 125 144 } 126 145 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 128 153 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; 160 164 } 161 165 } 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 transforms183 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 clicked204 // for the LiveWhenNotFocused editable link behavior205 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 happen212 // after mouse out events.213 m_rootEditableElementForSelectionOnMouseDown = 0;214 m_wasShiftKeyDownOnMouseDown = false;215 }216 166 } 217 167 218 HTMLElement::defaultEventHandler(ev t);168 HTMLElement::defaultEventHandler(event); 219 169 } 220 170 … … 513 463 bool HTMLAnchorElement::isLiveLink() const 514 464 { 515 if (!isLink()) 516 return false; 465 return isLink() && treatLinkAsLiveForEventType(m_wasShiftKeyDownOnMouseDown ? MouseEventWithShiftKey : MouseEventWithoutShiftKey); 466 } 467 468 HTMLAnchorElement::EventType HTMLAnchorElement::eventType(Event* event) 469 { 470 if (!event->isMouseEvent()) 471 return NonMouseEvent; 472 return static_cast<MouseEvent*>(event)->shiftKey() ? MouseEventWithShiftKey : MouseEventWithoutShiftKey; 473 } 474 475 bool HTMLAnchorElement::treatLinkAsLiveForEventType(EventType eventType) const 476 { 517 477 if (!isContentEditable()) 518 478 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; 540 499 } 541 } 542 543 } 500 501 ASSERT_NOT_REACHED(); 502 return false; 503 } 504 505 bool isEnterKeyKeydownEvent(Event* event) 506 { 507 return event->type() == eventNames().keydownEvent && event->isKeyboardEvent() && static_cast<KeyboardEvent*>(event)->keyIdentifier() == "Enter"; 508 } 509 510 bool isMiddleMouseButtonEvent(Event* event) 511 { 512 return event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == MiddleButton; 513 } 514 515 bool isLinkClick(Event* event) 516 { 517 return event->type() == eventNames().clickEvent && (!event->isMouseEvent() || static_cast<MouseEvent*>(event)->button() != RightButton); 518 } 519 520 void 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 3 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 4 4 * (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. 6 6 * 7 7 * This library is free software; you can redistribute it and/or … … 110 110 virtual bool draggable() const; 111 111 112 enum EventType { 113 MouseEventWithoutShiftKey, 114 MouseEventWithShiftKey, 115 NonMouseEvent, 116 }; 117 static EventType eventType(Event*); 118 bool treatLinkAsLiveForEventType(EventType) const; 119 112 120 RefPtr<Element> m_rootEditableElementForSelectionOnMouseDown; 113 121 bool m_wasShiftKeyDownOnMouseDown; … … 115 123 }; 116 124 125 // Functions shared with the other anchor elements (SVG and WML). 126 127 bool isEnterKeyKeydownEvent(Event*); 128 bool isMiddleMouseButtonEvent(Event*); 129 bool isLinkClick(Event*); 130 void handleLinkClick(Event*, Document*, const String& url, const String& target, bool hideReferrer = false); 131 117 132 } // namespace WebCore 118 133 -
trunk/WebCore/svg/SVGAElement.cpp
r66498 r67246 3 3 * Copyright (C) 2004, 2005, 2007 Rob Buis <buis@kde.org> 4 4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 5 * Copyright (C) 2010 Apple Inc. All rights reserved. 5 6 * 6 7 * This library is free software; you can redistribute it and/or … … 34 35 #include "FrameLoader.h" 35 36 #include "FrameLoaderTypes.h" 37 #include "HTMLAnchorElement.h" 36 38 #include "KeyboardEvent.h" 37 39 #include "MouseEvent.h" … … 126 128 } 127 129 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); 130 void SVGAElement::defaultEventHandler(Event* event) 131 { 132 if (isLink()) { 133 if (focused() && isEnterKeyKeydownEvent(event)) { 134 event->setDefaultHandled(); 135 dispatchSimulatedClick(event); 141 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 160 if (!evt->defaultPrevented()) { 138 139 if (isLinkClick(event)) { 161 140 String url = deprecatedParseURL(href()); 141 162 142 #if ENABLE(SVG_ANIMATION) 163 if (url .startsWith("#")) {143 if (url[0] == '#') { 164 144 Element* targetElement = document()->getElementById(url.substring(1)); 165 145 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(); 170 148 return; 171 149 } 172 150 } 173 151 #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; 176 167 } 177 178 evt->setDefaultHandled(); 179 } 180 181 SVGStyledTransformableElement::defaultEventHandler(evt); 168 } 169 170 SVGStyledTransformableElement::defaultEventHandler(event); 182 171 } 183 172 -
trunk/WebCore/wml/WMLAElement.cpp
r66498 r67246 5 5 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 6 * (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. 8 8 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) 9 9 * … … 36 36 #include "Frame.h" 37 37 #include "FrameLoader.h" 38 #include "HTMLAnchorElement.h" 38 39 #include "HTMLNames.h" 39 40 #include "KeyboardEvent.h" … … 120 121 void WMLAElement::defaultEventHandler(Event* event) 121 122 { 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)) { 142 125 event->setDefaultHandled(); 143 126 dispatchSimulatedClick(event); 144 127 return; 145 128 } 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; 150 133 } 151 152 event->setDefaultHandled();153 134 } 154 135
Note: See TracChangeset
for help on using the changeset viewer.