Changeset 123064 in webkit
- Timestamp:
- Jul 18, 2012 7:39:57 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r123062 r123064 1 2012-07-18 Hayato Ito <hayato@chromium.org> 2 3 [Shadow] A 'selectstart' event fired on distributed nodes should not be stopped at shadow boundary of the parent shadow host. 4 https://bugs.webkit.org/show_bug.cgi?id=90508 5 6 Reviewed by Dimitri Glazkov. 7 8 * fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt: 9 * fast/dom/shadow/events-stopped-at-shadow-boundary.html: 10 1 11 2012-07-18 Julien Chaffraix <jchaffraix@webkit.org> 2 12 -
trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary-expected.txt
r122801 r123064 39 39 @host (target: host) 40 40 @top (target: host) 41 42 An event fired on a distributed child should not be stopped at the shadow boundary of its host (host2), but should be stopped at the nearest shadow boundary (host1). 43 44 selectstart 45 @distributed-child (target: distributed-child) 46 @content (target: distributed-child) 47 @parent-of-content (target: distributed-child) 48 @host2 (target: distributed-child) 41 49 PASS successfullyParsed is true 42 50 -
trunk/LayoutTests/fast/dom/shadow/events-stopped-at-shadow-boundary.html
r122801 r123064 63 63 } 64 64 65 function testEventsShoudBeStoppedAtShadowBoundary() 66 { 67 var sandbox = document.getElementById('sandbox'); 68 sandbox.innerHTML = ''; 69 sandbox.appendChild( 70 createDOM('div', {'id': 'top'}, 71 createDOM('div', {'id': 'host'}, 72 createShadowRoot( 73 createDOM('div', {'id': 'parent-of-target'}, 74 createDOM('div', {'id': 'target'})), 75 createDOM('div', {'id': 'parent-of-content'}, 76 createDOM('content', {'id': 'content'}))), 77 createDOM('div', {'id': 'distributed-child'})))); 78 document.body.offsetLeft; 79 80 addEventListeners(['top', 'host', 'host/parent-of-target', 'host/target', 'host/parent-of-content', 'host/content', 'distributed-child']); 81 82 for (var i = 0; i < events.length; ++i) { 83 eventRecords = {}; 84 var event = document.createEvent('UIEvent'); 85 event.initEvent(events[i], true, false); 86 getNodeInShadowTreeStack('host/target').dispatchEvent(event); 87 dumpDispatchedEvent(events[i]); 88 } 89 90 } 91 92 function testEventsFiredOnDistributedNodesShouldNotBeStoppedAtShadowBoundary() 93 { 94 var sandbox = document.getElementById('sandbox'); 95 sandbox.innerHTML = ''; 96 sandbox.appendChild( 97 createDOM('div', {'id': 'host1'}, 98 createShadowRoot( 99 createDOM('div', {'id': 'host2'}, 100 createShadowRoot( 101 createDOM('div', {'id': 'parent-of-content'}, 102 createDOM('content', {'id': 'content'}))), 103 createDOM('div', {'id': 'distributed-child'}))))); 104 document.body.offsetLeft; 105 106 addEventListeners(['host1', 'host1/host2', 'host1/host2/parent-of-content', 'host1/host2/content', 'host1/distributed-child']); 107 108 debug('\nAn event fired on a distributed child should not be stopped at the shadow boundary of its host (host2), but should be stopped at the nearest shadow boundary (host1).'); 109 eventRecords = {}; 110 var event = document.createEvent('UIEvent'); 111 event.initEvent('selectstart', true, false); 112 getNodeInShadowTreeStack('host1/distributed-child').dispatchEvent(event); 113 dumpDispatchedEvent('selectstart'); 114 } 115 65 116 function test() 66 117 { … … 68 119 testRunner.dumpAsText(); 69 120 70 var sandbox = document.getElementById('sandbox'); 71 sandbox.appendChild( 72 createDOM('div', {'id': 'top'}, 73 createDOM('div', {'id': 'host'}, 74 createShadowRoot( 75 createDOM('div', {'id': 'parent-of-target'}, 76 createDOM('div', {'id': 'target'})))))); 77 78 addEventListeners(['top', 'host', 'host/parent-of-target', 'host/target']); 79 80 for (var i = 0; i < events.length; ++i) { 81 var event = document.createEvent('UIEvent'); 82 event.initEvent(events[i], true, false); 83 getNodeInShadowTreeStack('host/target').dispatchEvent(event); 84 dumpDispatchedEvent(events[i]); 85 } 121 testEventsShoudBeStoppedAtShadowBoundary() 122 testEventsFiredOnDistributedNodesShouldNotBeStoppedAtShadowBoundary(); 86 123 } 87 88 124 test(); 89 125 </script> -
trunk/Source/WebCore/ChangeLog
r123062 r123064 1 2012-07-18 Hayato Ito <hayato@chromium.org> 2 3 [Shadow] A 'selectstart' event fired on distributed nodes should not be stopped at shadow boundary of the parent shadow host. 4 https://bugs.webkit.org/show_bug.cgi?id=90508 5 6 Reviewed by Dimitri Glazkov. 7 8 We should not stop some kinds of events at the shadow boundary of a shadow host if the 9 event is fired on distributed nodes. 10 11 See the spec for such kinds of events. 12 http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#events-that-are-always-stopped 13 14 Test: fast/dom/shadow/events-stopped-at-shadow-boundary.html 15 16 * dom/EventDispatcher.cpp: 17 (WebCore::EventDispatcher::ensureEventAncestors): 18 (WebCore::inTheSameScope): 19 (WebCore): 20 (WebCore::EventDispatcher::determineDispatchBehavior): 21 * dom/EventDispatcher.h: 22 (EventDispatcher): 23 1 24 2012-07-18 Julien Chaffraix <jchaffraix@webkit.org> 2 25 -
trunk/Source/WebCore/dom/EventDispatcher.cpp
r122801 r123064 229 229 if (!node->isShadowRoot()) 230 230 continue; 231 if (determineDispatchBehavior(event, toShadowRoot(node) ) == StayInsideShadowDOM)231 if (determineDispatchBehavior(event, toShadowRoot(node), targetStack.last()) == StayInsideShadowDOM) 232 232 return; 233 233 if (!isSVGElement) { … … 348 348 } 349 349 350 EventDispatchBehavior EventDispatcher::determineDispatchBehavior(Event* event, ShadowRoot* shadowRoot) 350 static inline bool inTheSameScope(ShadowRoot* shadowRoot, EventTarget* target) 351 { 352 return target->toNode() && target->toNode()->treeScope()->rootNode() == shadowRoot; 353 } 354 355 EventDispatchBehavior EventDispatcher::determineDispatchBehavior(Event* event, ShadowRoot* shadowRoot, EventTarget* target) 351 356 { 352 357 #if ENABLE(FULLSCREEN_API) && ENABLE(VIDEO) … … 367 372 // See https://bugs.webkit.org/show_bug.cgi?id=52195 for details. 368 373 const AtomicString eventType = event->type(); 369 if (eventType == eventNames().abortEvent 374 if (inTheSameScope(shadowRoot, target) 375 && (eventType == eventNames().abortEvent 370 376 || eventType == eventNames().changeEvent 371 377 || eventType == eventNames().resetEvent … … 373 379 || eventType == eventNames().scrollEvent 374 380 || eventType == eventNames().selectEvent 375 || eventType == eventNames().selectstartEvent) 381 || eventType == eventNames().selectstartEvent)) 376 382 return StayInsideShadowDOM; 377 383 -
trunk/Source/WebCore/dom/EventDispatcher.h
r117723 r123064 76 76 EventDispatcher(Node*); 77 77 78 EventDispatchBehavior determineDispatchBehavior(Event*, ShadowRoot* );78 EventDispatchBehavior determineDispatchBehavior(Event*, ShadowRoot*, EventTarget*); 79 79 80 80 void ensureEventAncestors(Event*);
Note: See TracChangeset
for help on using the changeset viewer.