Changeset 156761 in webkit
- Timestamp:
- Oct 1, 2013 9:20:06 PM (11 years ago)
- Location:
- trunk/Source
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r156760 r156761 1 2013-10-01 Andreas Kling <akling@apple.com> 2 3 Move mouse event dispatch from Node to Element. 4 <https://webkit.org/b/122203> 5 6 Reviewed by Anders Carlsson. 7 8 We never dispatch mouse events on text or other non-element nodes, 9 so move the related logic to using Element. 10 11 Node::dispatchMouseEvent() moves to Element. I also changed the 12 relatedTarget argument to be an Element* since the related target 13 is never a Node either. 14 15 Most of this patch is *Node -> *Element renames in EventHandler. 16 1 17 2013-10-01 Gyuyoung Kim <gyuyoung.kim@samsung.com> 2 18 -
trunk/Source/WebCore/WebCore.exp.in
r156688 r156761 186 186 __ZN7WebCore12EventHandler23handleMouseReleaseEventERKNS_18PlatformMouseEventE 187 187 __ZN7WebCore12EventHandler24logicalScrollRecursivelyENS_22ScrollLogicalDirectionENS_17ScrollGranularityEPNS_4NodeE 188 __ZN7WebCore12EventHandler 27setCapturingMouseEventsNodeEN3WTF10PassRefPtrINS_4NodeEEE188 __ZN7WebCore12EventHandler30setCapturingMouseEventsElementEN3WTF10PassRefPtrINS_7ElementEEE 189 189 __ZN7WebCore12EventHandler31passMouseMovedEventToScrollbarsERKNS_18PlatformMouseEventE 190 190 __ZN7WebCore12EventHandler33sendFakeEventsAfterWidgetTrackingEP7NSEvent -
trunk/Source/WebCore/dom/Element.cpp
r156622 r156761 241 241 } 242 242 243 bool Element::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicString& eventType, int detail, Element* relatedTarget) 244 { 245 return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(MouseEvent::create(eventType, document().defaultView(), event, detail, relatedTarget))); 246 } 247 243 248 bool Element::dispatchWheelEvent(const PlatformWheelEvent& event) 244 249 { -
trunk/Source/WebCore/dom/Element.h
r156622 r156761 44 44 class IntSize; 45 45 class Locale; 46 class PlatformKeyboardEvent; 47 class PlatformMouseEvent; 46 48 class PlatformWheelEvent; 47 49 class PseudoElement; … … 533 535 void setSavedLayerScrollOffset(const IntSize&); 534 536 537 bool dispatchMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType, int clickCount = 0, Element* relatedTarget = nullptr); 535 538 bool dispatchWheelEvent(const PlatformWheelEvent&); 536 539 bool dispatchKeyEvent(const PlatformKeyboardEvent&); -
trunk/Source/WebCore/dom/Node.cpp
r156683 r156761 2111 2111 } 2112 2112 2113 bool Node::dispatchMouseEvent(const PlatformMouseEvent& event, const AtomicString& eventType,2114 int detail, Node* relatedTarget)2115 {2116 return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(MouseEvent::create(eventType, document().defaultView(), event, detail, relatedTarget)));2117 }2118 2119 2113 #if ENABLE(GESTURE_EVENTS) 2120 2114 bool Node::dispatchGestureEvent(const PlatformGestureEvent& event) -
trunk/Source/WebCore/dom/Node.h
r156683 r156761 71 71 class NodeListsNodeData; 72 72 class NodeRareData; 73 class PlatformKeyboardEvent;74 class PlatformMouseEvent;75 73 class QualifiedName; 76 74 class RadioNodeList; … … 544 542 bool dispatchDOMActivateEvent(int detail, PassRefPtr<Event> underlyingEvent); 545 543 546 bool dispatchMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType, int clickCount = 0, Node* relatedTarget = 0);547 544 #if ENABLE(GESTURE_EVENTS) 548 545 bool dispatchGestureEvent(const PlatformGestureEvent&); -
trunk/Source/WebCore/html/HTMLPlugInElement.cpp
r156622 r156761 97 97 if (m_isCapturingMouseEvents) { 98 98 if (Frame* frame = document().frame()) 99 frame->eventHandler().setCapturingMouseEvents Node(0);99 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 100 100 m_isCapturingMouseEvents = false; 101 101 } -
trunk/Source/WebCore/html/shadow/MediaControlElements.cpp
r156622 r156761 111 111 m_lastDragEventLocation = eventLocation; 112 112 113 frame->eventHandler().setCapturingMouseEvents Node(this);113 frame->eventHandler().setCapturingMouseEventsElement(this); 114 114 115 115 m_isBeingDragged = true; … … 138 138 return; 139 139 140 frame->eventHandler().setCapturingMouseEvents Node(0);140 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 141 141 } 142 142 -
trunk/Source/WebCore/html/shadow/SliderThumbElement.cpp
r156147 r156761 322 322 { 323 323 if (Frame* frame = document().frame()) { 324 frame->eventHandler().setCapturingMouseEvents Node(this);324 frame->eventHandler().setCapturingMouseEventsElement(this); 325 325 m_inDragMode = true; 326 326 } … … 333 333 334 334 if (Frame* frame = document().frame()) 335 frame->eventHandler().setCapturingMouseEvents Node(0);335 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 336 336 m_inDragMode = false; 337 337 if (renderer()) … … 399 399 if (m_inDragMode) { 400 400 if (Frame* frame = document().frame()) 401 frame->eventHandler().setCapturingMouseEvents Node(0);401 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 402 402 } 403 403 } -
trunk/Source/WebCore/html/shadow/SpinButtonElement.cpp
r156241 r156761 121 121 if (!m_capturing) { 122 122 if (Frame* frame = document().frame()) { 123 frame->eventHandler().setCapturingMouseEvents Node(this);123 frame->eventHandler().setCapturingMouseEventsElement(this); 124 124 m_capturing = true; 125 125 if (Page* page = document().page()) … … 197 197 if (m_capturing) { 198 198 if (Frame* frame = document().frame()) { 199 frame->eventHandler().setCapturingMouseEvents Node(0);199 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 200 200 m_capturing = false; 201 201 if (Page* page = document().page()) -
trunk/Source/WebCore/html/shadow/TextControlInnerElements.cpp
r156147 r156761 202 202 if (m_capturing) { 203 203 if (Frame* frame = document().frame()) 204 frame->eventHandler().setCapturingMouseEvents Node(0);204 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 205 205 } 206 206 } … … 219 219 if (renderer() && renderer()->visibleToHitTesting()) { 220 220 if (Frame* frame = document().frame()) { 221 frame->eventHandler().setCapturingMouseEvents Node(this);221 frame->eventHandler().setCapturingMouseEventsElement(this); 222 222 m_capturing = true; 223 223 } … … 230 230 if (m_capturing) { 231 231 if (Frame* frame = document().frame()) { 232 frame->eventHandler().setCapturingMouseEvents Node(0);232 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 233 233 m_capturing = false; 234 234 } … … 306 306 if (renderer() && renderer()->visibleToHitTesting()) { 307 307 if (Frame* frame = document().frame()) { 308 frame->eventHandler().setCapturingMouseEvents Node(this);308 frame->eventHandler().setCapturingMouseEventsElement(this); 309 309 m_capturing = true; 310 310 } … … 319 319 if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { 320 320 if (Frame* frame = document().frame()) { 321 frame->eventHandler().setCapturingMouseEvents Node(0);321 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 322 322 m_capturing = false; 323 323 } … … 417 417 if (m_capturing) { 418 418 if (Frame* frame = document().frame()) 419 frame->eventHandler().setCapturingMouseEvents Node(0);419 frame->eventHandler().setCapturingMouseEventsElement(nullptr); 420 420 } 421 421 -
trunk/Source/WebCore/page/EventHandler.cpp
r156715 r156761 334 334 #endif 335 335 , m_resizeLayer(0) 336 , m_eventHandlerWillResetCapturingMouseEvents Node(0)336 , m_eventHandlerWillResetCapturingMouseEventsElement(nullptr) 337 337 , m_clickCount(0) 338 338 , m_mousePositionIsUnknown(true) … … 389 389 #endif 390 390 m_resizeLayer = 0; 391 m_ nodeUnderMouse = 0;392 m_last NodeUnderMouse = 0;391 m_elementUnderMouse = nullptr; 392 m_lastElementUnderMouse = nullptr; 393 393 #if ENABLE(SVG) 394 394 m_instanceUnderMouse = 0; … … 410 410 m_mousePressed = false; 411 411 m_capturesDragging = false; 412 m_capturingMouseEvents Node = 0;412 m_capturingMouseEventsElement = nullptr; 413 413 m_latchedWheelEventElement = nullptr; 414 414 m_previousWheelScrolledElement = nullptr; … … 1378 1378 #endif 1379 1379 && m_frame.selection().isCaretOrRange() 1380 && !m_capturingMouseEvents Node) {1380 && !m_capturingMouseEventsElement) { 1381 1381 return iBeam; 1382 1382 } … … 1556 1556 m_capturesDragging = subframe->eventHandler().capturesDragging(); 1557 1557 if (m_mousePressed && m_capturesDragging) { 1558 m_capturingMouseEvents Node = mev.targetNode();1559 m_eventHandlerWillResetCapturingMouseEvents Node= true;1558 m_capturingMouseEventsElement = subframe->ownerElement(); 1559 m_eventHandlerWillResetCapturingMouseEventsElement = true; 1560 1560 } 1561 1561 invalidateClick(); … … 1656 1656 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); 1657 1657 Frame* subframe = subframeForHitTestResult(mev); 1658 if (m_eventHandlerWillResetCapturingMouseEvents Node)1659 m_capturingMouseEvents Node = 0;1658 if (m_eventHandlerWillResetCapturingMouseEventsElement) 1659 m_capturingMouseEventsElement = nullptr; 1660 1660 if (subframe && passMousePressEventToSubframe(mev, subframe)) 1661 1661 return true; … … 1792 1792 1793 1793 bool swallowEvent = false; 1794 RefPtr<Frame> newSubframe = m_capturingMouseEvents Node.get() ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);1794 RefPtr<Frame> newSubframe = m_capturingMouseEventsElement.get() ? subframeForTargetNode(m_capturingMouseEventsElement.get()) : subframeForHitTestResult(mev); 1795 1795 1796 1796 // We want mouseouts to happen first, from the inside out. First send a move event to the last subframe so that it will fire mouseouts. … … 1897 1897 bool cancelable = true; 1898 1898 bool setUnder = false; 1899 return !dispatchMouseEvent(eventNames().mouseupEvent, m_last NodeUnderMouse.get(), cancelable, m_clickCount, mouseEvent, setUnder);1899 return !dispatchMouseEvent(eventNames().mouseupEvent, m_lastElementUnderMouse.get(), cancelable, m_clickCount, mouseEvent, setUnder); 1900 1900 } 1901 1901 1902 1902 HitTestRequest request(HitTestRequest::Release | HitTestRequest::DisallowShadowContent); 1903 1903 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); 1904 Frame* subframe = m_capturingMouseEvents Node.get() ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev);1905 if (m_eventHandlerWillResetCapturingMouseEvents Node)1906 m_capturingMouseEvents Node = 0;1904 Frame* subframe = m_capturingMouseEventsElement.get() ? subframeForTargetNode(m_capturingMouseEventsElement.get()) : subframeForHitTestResult(mev); 1905 if (m_eventHandlerWillResetCapturingMouseEventsElement) 1906 m_capturingMouseEventsElement = nullptr; 1907 1907 if (subframe && passMouseReleaseEventToSubframe(mev, subframe)) 1908 1908 return true; … … 2190 2190 stopAutoscrollTimer(); 2191 2191 m_dragTarget = 0; 2192 m_capturingMouseEvents Node = 0;2192 m_capturingMouseEventsElement = nullptr; 2193 2193 m_shouldOnlyFireDragOverEvent = false; 2194 2194 #if PLATFORM(MAC) … … 2198 2198 #endif // ENABLE(DRAG_SUPPORT) 2199 2199 2200 void EventHandler::setCapturingMouseEvents Node(PassRefPtr<Node> n)2201 { 2202 m_capturingMouseEvents Node = n;2203 m_eventHandlerWillResetCapturingMouseEvents Node= false;2200 void EventHandler::setCapturingMouseEventsElement(PassRefPtr<Element> element) 2201 { 2202 m_capturingMouseEventsElement = element; 2203 m_eventHandlerWillResetCapturingMouseEventsElement = false; 2204 2204 } 2205 2205 … … 2230 2230 void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMouseEvent& mouseEvent, bool fireMouseOverOut) 2231 2231 { 2232 Node* result = targetNode; 2233 2234 // If we're capturing, we always go right to that node. 2235 if (m_capturingMouseEventsNode) 2236 result = m_capturingMouseEventsNode.get(); 2237 else { 2238 // If the target node is a text node, dispatch on the parent node - rdar://4196646 2239 if (result && result->isTextNode()) 2240 result = result->parentOrShadowHostElement(); 2241 } 2242 m_nodeUnderMouse = result; 2232 Element* targetElement = nullptr; 2233 2234 // If we're capturing, we always go right to that element. 2235 if (m_capturingMouseEventsElement) 2236 targetElement = m_capturingMouseEventsElement.get(); 2237 else if (targetNode) { 2238 // If the target node is a non-element, dispatch on the parent. <rdar://problem/4196646> 2239 if (!targetNode->isElementNode()) 2240 targetElement = targetNode->parentOrShadowHostElement(); 2241 else 2242 targetElement = toElement(targetNode); 2243 } 2244 2245 m_elementUnderMouse = targetElement; 2243 2246 #if ENABLE(SVG) 2244 m_instanceUnderMouse = instanceAssociatedWithShadowTreeElement( result);2247 m_instanceUnderMouse = instanceAssociatedWithShadowTreeElement(targetElement); 2245 2248 2246 2249 // <use> shadow tree elements may have been recloned, update node under mouse in any case … … 2265 2268 2266 2269 SVGElement* shadowTreeElement = instance->shadowTreeElement(); 2267 if (!shadowTreeElement->inDocument() || m_last NodeUnderMouse == shadowTreeElement)2270 if (!shadowTreeElement->inDocument() || m_lastElementUnderMouse == shadowTreeElement) 2268 2271 continue; 2269 2272 2270 m_last NodeUnderMouse = shadowTreeElement;2273 m_lastElementUnderMouse = shadowTreeElement; 2271 2274 m_lastInstanceUnderMouse = instance; 2272 2275 break; … … 2278 2281 // Fire mouseout/mouseover if the mouse has shifted to a different node. 2279 2282 if (fireMouseOverOut) { 2280 RenderLayer* layerForLastNode = layerForNode(m_last NodeUnderMouse.get());2281 RenderLayer* layerForNodeUnderMouse = layerForNode(m_ nodeUnderMouse.get());2283 RenderLayer* layerForLastNode = layerForNode(m_lastElementUnderMouse.get()); 2284 RenderLayer* layerForNodeUnderMouse = layerForNode(m_elementUnderMouse.get()); 2282 2285 Page* page = m_frame.page(); 2283 2286 2284 if (m_last NodeUnderMouse && (!m_nodeUnderMouse || &m_nodeUnderMouse->document() != m_frame.document())) {2287 if (m_lastElementUnderMouse && (!m_elementUnderMouse || &m_elementUnderMouse->document() != m_frame.document())) { 2285 2288 // The mouse has moved between frames. 2286 if (Frame* frame = m_last NodeUnderMouse->document().frame()) {2289 if (Frame* frame = m_lastElementUnderMouse->document().frame()) { 2287 2290 if (FrameView* frameView = frame->view()) 2288 2291 frameView->mouseExitedContentArea(); … … 2290 2293 } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) { 2291 2294 // The mouse has moved between layers. 2292 if (Frame* frame = m_last NodeUnderMouse->document().frame()) {2295 if (Frame* frame = m_lastElementUnderMouse->document().frame()) { 2293 2296 if (FrameView* frameView = frame->view()) { 2294 2297 if (frameView->containsScrollableArea(layerForLastNode)) … … 2298 2301 } 2299 2302 2300 if (m_ nodeUnderMouse && (!m_lastNodeUnderMouse || &m_lastNodeUnderMouse->document() != m_frame.document())) {2303 if (m_elementUnderMouse && (!m_lastElementUnderMouse || &m_lastElementUnderMouse->document() != m_frame.document())) { 2301 2304 // The mouse has moved between frames. 2302 if (Frame* frame = m_ nodeUnderMouse->document().frame()) {2305 if (Frame* frame = m_elementUnderMouse->document().frame()) { 2303 2306 if (FrameView* frameView = frame->view()) 2304 2307 frameView->mouseEnteredContentArea(); … … 2306 2309 } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) { 2307 2310 // The mouse has moved between layers. 2308 if (Frame* frame = m_ nodeUnderMouse->document().frame()) {2311 if (Frame* frame = m_elementUnderMouse->document().frame()) { 2309 2312 if (FrameView* frameView = frame->view()) { 2310 2313 if (frameView->containsScrollableArea(layerForNodeUnderMouse)) … … 2314 2317 } 2315 2318 2316 if (m_last NodeUnderMouse && &m_lastNodeUnderMouse->document() != m_frame.document()) {2317 m_last NodeUnderMouse = 0;2319 if (m_lastElementUnderMouse && &m_lastElementUnderMouse->document() != m_frame.document()) { 2320 m_lastElementUnderMouse = nullptr; 2318 2321 m_lastScrollbarUnderMouse = 0; 2319 2322 #if ENABLE(SVG) … … 2322 2325 } 2323 2326 2324 if (m_last NodeUnderMouse != m_nodeUnderMouse) {2327 if (m_lastElementUnderMouse != m_elementUnderMouse) { 2325 2328 // send mouseout event to the old node 2326 if (m_last NodeUnderMouse)2327 m_last NodeUnderMouse->dispatchMouseEvent(mouseEvent, eventNames().mouseoutEvent, 0, m_nodeUnderMouse.get());2329 if (m_lastElementUnderMouse) 2330 m_lastElementUnderMouse->dispatchMouseEvent(mouseEvent, eventNames().mouseoutEvent, 0, m_elementUnderMouse.get()); 2328 2331 // send mouseover event to the new node 2329 if (m_ nodeUnderMouse)2330 m_ nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventNames().mouseoverEvent, 0, m_lastNodeUnderMouse.get());2331 } 2332 m_last NodeUnderMouse = m_nodeUnderMouse;2332 if (m_elementUnderMouse) 2333 m_elementUnderMouse->dispatchMouseEvent(mouseEvent, eventNames().mouseoverEvent, 0, m_lastElementUnderMouse.get()); 2334 } 2335 m_lastElementUnderMouse = m_elementUnderMouse; 2333 2336 #if ENABLE(SVG) 2334 m_lastInstanceUnderMouse = instanceAssociatedWithShadowTreeElement(m_ nodeUnderMouse.get());2337 m_lastInstanceUnderMouse = instanceAssociatedWithShadowTreeElement(m_elementUnderMouse.get()); 2335 2338 #endif 2336 2339 } … … 2346 2349 bool swallowEvent = false; 2347 2350 2348 if (m_ nodeUnderMouse)2349 swallowEvent = !(m_ nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount));2351 if (m_elementUnderMouse) 2352 swallowEvent = !(m_elementUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount)); 2350 2353 2351 2354 if (!swallowEvent && eventType == eventNames().mousedownEvent) { … … 2364 2367 // from form fields before the button click is processed. 2365 2368 2366 Element* element; 2367 if (m_nodeUnderMouse) 2368 element = m_nodeUnderMouse->isElementNode() ? toElement(m_nodeUnderMouse.get()) : m_nodeUnderMouse->parentOrShadowHostElement(); 2369 else 2370 element = 0; 2369 Element* element = m_elementUnderMouse.get(); 2371 2370 2372 2371 // Walk up the DOM tree to search for an element to focus. -
trunk/Source/WebCore/page/EventHandler.h
r156622 r156761 139 139 void setMousePressed(bool pressed) { m_mousePressed = pressed; } 140 140 141 void setCapturingMouseEvents Node(PassRefPtr<Node>); // A caller is responsible for resetting capturing nodeto 0.141 void setCapturingMouseEventsElement(PassRefPtr<Element>); // A caller is responsible for resetting capturing element to 0. 142 142 143 143 #if ENABLE(DRAG_SUPPORT) … … 449 449 RenderLayer* m_resizeLayer; 450 450 451 RefPtr< Node> m_capturingMouseEventsNode;452 bool m_eventHandlerWillResetCapturingMouseEvents Node;453 454 RefPtr< Node> m_nodeUnderMouse;455 RefPtr< Node> m_lastNodeUnderMouse;451 RefPtr<Element> m_capturingMouseEventsElement; 452 bool m_eventHandlerWillResetCapturingMouseEventsElement; 453 454 RefPtr<Element> m_elementUnderMouse; 455 RefPtr<Element> m_lastElementUnderMouse; 456 456 RefPtr<Frame> m_lastMouseMoveEventSubframe; 457 457 RefPtr<Scrollbar> m_lastScrollbarUnderMouse; -
trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp
r156397 r156761 616 616 m_mouseDownWasInUnavailablePluginIndicator = isInUnavailablePluginIndicator(mouseEvent); 617 617 if (m_mouseDownWasInUnavailablePluginIndicator) { 618 frame().eventHandler().setCapturingMouseEvents Node(&element);618 frame().eventHandler().setCapturingMouseEventsElement(&element); 619 619 element.setIsCapturingMouseEvents(true); 620 620 setUnavailablePluginIndicatorIsPressed(true); … … 624 624 if (event->type() == eventNames().mouseupEvent && static_cast<MouseEvent*>(event)->button() == LeftButton) { 625 625 if (m_unavailablePluginIndicatorIsPressed) { 626 frame().eventHandler().setCapturingMouseEvents Node(0);626 frame().eventHandler().setCapturingMouseEventsElement(nullptr); 627 627 element.setIsCapturingMouseEvents(false); 628 628 setUnavailablePluginIndicatorIsPressed(false); -
trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp
r156550 r156761 884 884 if (currentEvent->type() == WebEvent::MouseDown) { 885 885 focusPluginElement(); 886 frame()->eventHandler().setCapturingMouseEvents Node(m_pluginElement.get());886 frame()->eventHandler().setCapturingMouseEventsElement(m_pluginElement.get()); 887 887 } else if (currentEvent->type() == WebEvent::MouseUp) 888 frame()->eventHandler().setCapturingMouseEvents Node(0);888 frame()->eventHandler().setCapturingMouseEventsElement(nullptr); 889 889 890 890 didHandleEvent = m_plugin->handleMouseEvent(static_cast<const WebMouseEvent&>(*currentEvent));
Note: See TracChangeset
for help on using the changeset viewer.