Changeset 136818 in webkit
- Timestamp:
- Dec 6, 2012 12:52:47 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r136814 r136818 1 2012-12-06 Hayato Ito <hayato@chromium.org> 2 3 Event's relatedTarget re-targeting does not occur for manually fired mouse events created by event.initMouseEvent(). 4 https://bugs.webkit.org/show_bug.cgi?id=102681 5 6 Reviewed by Dimitri Glazkov. 7 8 * fast/dom/shadow/shadow-dom-event-dispatching-expected.txt: 9 * fast/dom/shadow/shadow-dom-event-dispatching.html: 10 * fast/events/dispatch-synthetic-mouseevent-expected.txt: Added. 11 * fast/events/dispatch-synthetic-mouseevent.html: Added. 12 1 13 2012-12-06 Zan Dobersek <zandobersek@gmail.com> 2 14 -
trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-expected.txt
r121040 r136818 436 436 @A (target: A) 437 437 @top (target: A) 438 439 440 Composed Shadow Tree will be: 441 DIV id=sandbox 442 DIV id=top 443 DIV id=host 444 DIV id=div1 445 DIV id=div2 446 447 448 mouseout 449 450 mouseover 451 @div2 (target: div2) (related: div1) 452 @shadow-root (target: div2) (related: div1) 453 454 455 Composed Shadow Tree will be: 456 DIV id=sandbox 457 DIV id=top 458 DIV id=host 459 DIV id=div1 460 461 462 mouseout 463 464 mouseover 465 @div1 (target: div1) (related: div1) 466 @shadow-root (target: div1) (related: div1) 438 467 PASS successfullyParsed is true 439 468 -
trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching.html
r131070 r136818 379 379 } 380 380 381 function testEventsFiredManually() 382 { 383 sandbox.innerHTML = ''; 384 sandbox.appendChild( 385 createDOM('div', {'id': 'top'}, 386 createDOM('div', {'id': 'host'}, 387 createShadowRoot( 388 createDOM('div', {'id': 'div1'}), 389 createDOM('div', {'id': 'div2'}))))); 390 391 addEventListeners(['top', 'host', 'host/', 'host/div1', 'host/div2']); 392 getNodeInShadowTreeStack('host/').id = 'shadow-root'; 393 showSandboxTree(); 394 395 var div1 = getNodeInShadowTreeStack('host/div1'); 396 var div2 = getNodeInShadowTreeStack('host/div2'); 397 398 clearEventRecords(); 399 var event = document.createEvent("MouseEvents"); 400 event.initMouseEvent("mouseover", true, false, window, 401 0, 10, 10, 10, 10, false, false, false, false, 0, div1); 402 div2.dispatchEvent(event); 403 404 debugDispatchedEvent('mouseout'); 405 debugDispatchedEvent('mouseover'); 406 } 407 408 function testEventsFiredManuallyWithRelatedTargetSameToTarget() 409 { 410 sandbox.innerHTML = ''; 411 sandbox.appendChild( 412 createDOM('div', {'id': 'top'}, 413 createDOM('div', {'id': 'host'}, 414 createShadowRoot( 415 createDOM('div', {'id': 'div1'}))))); 416 417 addEventListeners(['top', 'host', 'host/', 'host/div1']); 418 getNodeInShadowTreeStack('host/').id = 'shadow-root'; 419 showSandboxTree(); 420 421 var div1 = getNodeInShadowTreeStack('host/div1'); 422 423 clearEventRecords(); 424 var event = document.createEvent("MouseEvents"); 425 event.initMouseEvent("mouseover", true, false, window, 426 0, 10, 10, 10, 10, false, false, false, false, 0, div1); 427 div1.dispatchEvent(event); 428 429 debugDispatchedEvent('mouseout'); 430 debugDispatchedEvent('mouseover'); 431 } 432 381 433 function test() 382 434 { … … 394 446 testEventsOnNonDistributedNodes(); 395 447 testEventsOnFallbackElements(); 448 testEventsFiredManually(); 449 testEventsFiredManuallyWithRelatedTargetSameToTarget(); 396 450 } 397 451 -
trunk/Source/WebCore/ChangeLog
r136817 r136818 1 2012-12-06 Hayato Ito <hayato@chromium.org> 2 3 Event's relatedTarget re-targeting does not occur for manually fired mouse events created by event.initMouseEvent(). 4 https://bugs.webkit.org/show_bug.cgi?id=102681 5 6 Reviewed by Dimitri Glazkov. 7 8 Make sure that event's relatedTarget re-targeting occurs for mouse 9 events created by event.initMouseEvent(). Since user-generated 10 mouse events can have a relatedTarget which is same to the target 11 node, the algorithm which calculates event's ancestors is also 12 updated so that ancestors are not shrunk wrongly. 13 14 Test: fast/events/dispatch-synthetic-mouseevent.html 15 fast/dom/shadow/shadow-dom-event-dispatching.html 16 17 * dom/EventDispatcher.cpp: 18 (WebCore::EventRelatedTargetAdjuster::adjust): 19 * dom/MouseEvent.cpp: 20 (WebCore::MouseEventDispatchMediator::create): 21 (WebCore::MouseEventDispatchMediator::MouseEventDispatchMediator): 22 (WebCore::MouseEventDispatchMediator::dispatchEvent): 23 * dom/MouseEvent.h: 24 (WebCore::MouseEventDispatchMediator::isSyntheticMouseEvent): 25 (MouseEventDispatchMediator): 26 * dom/Node.cpp: 27 (WebCore::Node::dispatchEvent): 28 1 29 2012-12-06 Michael Pruett <michael@68k.org> 2 30 -
trunk/Source/WebCore/dom/EventDispatcher.cpp
r135690 r136818 63 63 void EventRelatedTargetAdjuster::adjust(Vector<EventContext>& ancestors) 64 64 { 65 // Synthetic mouse events can have a relatedTarget which is identical to the target. 66 bool targetIsIdenticalToToRelatedTarget = (m_node.get() == m_relatedTarget.get()); 67 65 68 Vector<EventTarget*> relatedTargetStack; 66 69 TreeScope* lastTreeScope = 0; … … 94 97 } 95 98 lastTreeScope = scope; 96 if (iter->target() == adjustedRelatedTarget) { 99 if (targetIsIdenticalToToRelatedTarget) { 100 if (m_node->treeScope()->rootNode() == iter->node()) { 101 ancestors.shrink(iter + 1 - ancestors.begin()); 102 break; 103 } 104 } else if (iter->target() == adjustedRelatedTarget) { 97 105 // Event dispatching should be stopped here. 98 106 ancestors.shrink(iter - ancestors.begin()); -
trunk/Source/WebCore/dom/MouseEvent.cpp
r135650 r136818 210 210 } 211 211 212 PassRefPtr<MouseEventDispatchMediator> MouseEventDispatchMediator::create(PassRefPtr<MouseEvent> mouseEvent )213 { 214 return adoptRef(new MouseEventDispatchMediator(mouseEvent ));215 } 216 217 MouseEventDispatchMediator::MouseEventDispatchMediator(PassRefPtr<MouseEvent> mouseEvent )218 : EventDispatchMediator(mouseEvent) 212 PassRefPtr<MouseEventDispatchMediator> MouseEventDispatchMediator::create(PassRefPtr<MouseEvent> mouseEvent, MouseEventType mouseEventType) 213 { 214 return adoptRef(new MouseEventDispatchMediator(mouseEvent, mouseEventType)); 215 } 216 217 MouseEventDispatchMediator::MouseEventDispatchMediator(PassRefPtr<MouseEvent> mouseEvent, MouseEventType mouseEventType) 218 : EventDispatchMediator(mouseEvent), m_mouseEventType(mouseEventType) 219 219 { 220 220 } … … 233 233 return true; // Shouldn't happen. 234 234 235 ASSERT(isSyntheticMouseEvent() || !event()->target() || event()->target() != event()->relatedTarget()); 236 235 237 EventTarget* relatedTarget = event()->relatedTarget(); 236 238 dispatcher->adjustRelatedTarget(event(), relatedTarget); … … 239 241 bool swallowEvent = event()->defaultHandled() || event()->defaultPrevented(); 240 242 241 if ( event()->type() != eventNames().clickEvent || event()->detail() != 2)243 if (isSyntheticMouseEvent() || event()->type() != eventNames().clickEvent || event()->detail() != 2) 242 244 return !swallowEvent; 245 243 246 // Special case: If it's a double click event, we also send the dblclick event. This is not part 244 247 // of the DOM specs, but is used for compatibility with the ondblclick="" attribute. This is treated -
trunk/Source/WebCore/dom/MouseEvent.h
r126256 r136818 116 116 class MouseEventDispatchMediator : public EventDispatchMediator { 117 117 public: 118 static PassRefPtr<MouseEventDispatchMediator> create(PassRefPtr<MouseEvent>); 118 enum MouseEventType { SyntheticMouseEvent, NonSyntheticMouseEvent}; 119 static PassRefPtr<MouseEventDispatchMediator> create(PassRefPtr<MouseEvent>, MouseEventType = NonSyntheticMouseEvent); 119 120 120 121 private: 121 explicit MouseEventDispatchMediator(PassRefPtr<MouseEvent> );122 explicit MouseEventDispatchMediator(PassRefPtr<MouseEvent>, MouseEventType); 122 123 MouseEvent* event() const; 123 124 124 125 virtual bool dispatchEvent(EventDispatcher*) const; 126 bool isSyntheticMouseEvent() const { return m_mouseEventType == SyntheticMouseEvent; } 127 MouseEventType m_mouseEventType; 125 128 }; 126 129 -
trunk/Source/WebCore/dom/Node.cpp
r136744 r136818 2482 2482 bool Node::dispatchEvent(PassRefPtr<Event> event) 2483 2483 { 2484 if (event->isMouseEvent()) 2485 return EventDispatcher::dispatchEvent(this, MouseEventDispatchMediator::create(adoptRef(toMouseEvent(event.leakRef())), MouseEventDispatchMediator::SyntheticMouseEvent)); 2484 2486 return EventDispatcher::dispatchEvent(this, EventDispatchMediator::create(event)); 2485 2487 }
Note: See TracChangeset
for help on using the changeset viewer.