Changeset 118645 in webkit
- Timestamp:
- May 27, 2012, 9:39:30 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-expected.txt (modified) (1 diff)
-
LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching.html (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/dom/EventDispatcher.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r118633 r118645 1 2012-05-27 Hayato Ito <hayato@chromium.org> 2 3 Support multiple shadow roots in event dispatching. 4 https://bugs.webkit.org/show_bug.cgi?id=87470 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 1 11 2012-05-27 Takashi Sakamoto <tasak@google.com> 2 12 -
trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching-expected.txt
r118320 r118645 322 322 @B (target: child-of-inactive-content) (related: A) 323 323 @top (target: child-of-inactive-content) (related: A) 324 325 326 Composed Shadow Tree will be: 327 DIV id=sandbox 328 DIV id=top 329 DIV id=A 330 DIV id=B 331 DIV id=D 332 DIV id=F 333 334 335 Moving mouse from B to A 336 337 mouseout 338 @B (target: B) (related: A) 339 @C (target: C) (related: A) 340 @older-shadow-root (target: C) (related: A) 341 @E (target: E) (related: A) 342 @younger-shadow-root (target: E) (related: A) 343 @A (target: B) (related: A) 344 @top (target: B) (related: A) 345 346 mouseover 347 @A (target: A) (related: B) 348 @top (target: A) (related: B) 349 350 Moving mouse from A/D to A//F 351 352 mouseout 353 @D (target: D) (related: A) 354 @older-shadow-root (target: D) (related: A) 355 @E (target: E) (related: F) 356 @younger-shadow-root (target: E) (related: F) 357 358 mouseover 359 @F (target: F) (related: E) 360 @younger-shadow-root (target: F) (related: E) 361 362 Moving mouse from B to A//F 363 364 mouseout 365 @B (target: B) (related: A) 366 @C (target: C) (related: A) 367 @older-shadow-root (target: C) (related: A) 368 @E (target: E) (related: F) 369 @younger-shadow-root (target: E) (related: F) 370 @A (target: B) (related: A) 371 @top (target: B) (related: A) 372 373 mouseover 374 @F (target: F) (related: E) 375 @younger-shadow-root (target: F) (related: E) 376 @A (target: A) (related: B) 377 @top (target: A) (related: B) 324 378 PASS successfullyParsed is true 325 379 -
trunk/LayoutTests/fast/dom/shadow/shadow-dom-event-dispatching.html
r118320 r118645 226 226 } 227 227 228 // Hosting multiple shadow roots 229 function prepareDOMTree8(parent) 230 { 231 parent.appendChild( 232 createDOM('div', {'id': 'top'}, 233 createDOM('div', {'id': 'A'}, 234 createShadowRoot( 235 createDOM('content', {'id': 'C'}), 236 createDOM('div', {'id': 'D'})), 237 createShadowRoot( 238 createDOM('shadow', {'id': 'E'}), 239 createDOM('div', {'id': 'F'})), 240 createDOM('div', {'id': 'B'})))); 241 242 addEventListeners(['top', 'A', 'B', 'A/', 'A/C', 'A/D', 'A//', 'A//E', 'A//F']); 243 getNodeInShadowTreeStack('A/').id = 'older-shadow-root'; 244 getNodeInShadowTreeStack('A//').id = 'younger-shadow-root'; 245 parent.offsetLeft; 246 debug('\n\nComposed Shadow Tree will be:\n' + dumpComposedShadowTree(parent)); 247 } 248 228 249 function debugDispatchedEvent(eventType) 229 250 { … … 318 339 319 340 sandbox.innerHTML = ''; 341 prepareDOMTree8(sandbox); 342 343 moveMouse('B', 'A'); 344 moveMouse('A/D', 'A//F'); 345 moveMouse('B', 'A//F'); 320 346 } 321 347 -
trunk/Source/WebCore/ChangeLog
r118644 r118645 1 2012-05-27 Hayato Ito <hayato@chromium.org> 2 3 Support multiple shadow roots in event dispatching. 4 https://bugs.webkit.org/show_bug.cgi?id=87470 5 6 Reviewed by Dimitri Glazkov. 7 8 The current implementation does not set event's target correctly 9 if an event happens on DOM tree with multiple shadow roots. So 10 this patch updates an event re-targeting algorithm so that it 11 works even if it is applied to multiple shadow roots. 12 13 Tests: fast/dom/shadow/shadow-dom-event-dispatching.html 14 15 * dom/ComposedShadowTreeWalker.cpp: 16 (WebCore::ComposedShadowTreeWalker::traverseParentIncludingInsertionPointAndShadowRoot): 17 * dom/EventDispatcher.cpp: 18 (WebCore::EventDispatcher::ensureEventAncestors): 19 1 20 2012-05-27 Benjamin Poulain <benjamin@webkit.org> 2 21 -
trunk/Source/WebCore/dom/EventDispatcher.cpp
r117957 r118645 200 200 if (m_ancestorsInitialized) 201 201 return; 202 203 ComposedShadowTreeWalker ancestorWalker(m_node.get());204 EventTarget* originalTarget = eventTargetRespectingSVGTargetRules(ancestorWalker.get());205 m_ancestors.append(EventContext(m_node.get(), originalTarget, originalTarget));206 202 m_ancestorsInitialized = true; 207 208 if (!m_node->inDocument()) 209 return; 210 203 bool inDocument = m_node->inDocument(); 204 bool isSVGElement = m_node->isSVGElement(); 211 205 Vector<EventTarget*> targetStack; 212 targetStack.append(originalTarget); 213 while (true) { 214 if (ancestorWalker.get()->isShadowRoot()) { 215 if (determineDispatchBehavior(event, toShadowRoot(ancestorWalker.get())) == StayInsideShadowDOM) 216 return; 217 ancestorWalker.parentIncludingInsertionPointAndShadowRoot(); 218 if (!ancestorWalker.get()) 219 return; 220 if (!m_node->isSVGElement()) { 221 targetStack.removeLast(); 222 if (targetStack.isEmpty()) 223 targetStack.append(ancestorWalker.get()); 224 } 225 } else { 226 ancestorWalker.parentIncludingInsertionPointAndShadowRoot(); 227 if (!ancestorWalker.get()) 228 return; 229 if (isInsertionPoint(ancestorWalker.get()) && toInsertionPoint(ancestorWalker.get())->isActive()) 230 targetStack.append(ancestorWalker.get()); 231 } 232 m_ancestors.append(EventContext(ancestorWalker.get(), eventTargetRespectingSVGTargetRules(ancestorWalker.get()), targetStack.last())); 206 for (ComposedShadowTreeWalker walker(m_node.get()); walker.get(); walker.parentIncludingInsertionPointAndShadowRoot()) { 207 Node* node = walker.get(); 208 if (isActiveInsertionPoint(node) || targetStack.isEmpty()) 209 targetStack.append(eventTargetRespectingSVGTargetRules(node)); 210 m_ancestors.append(EventContext(node, eventTargetRespectingSVGTargetRules(node), targetStack.last())); 211 if (!inDocument) 212 return; 213 if (!node->isShadowRoot()) 214 continue; 215 if (determineDispatchBehavior(event, toShadowRoot(node)) == StayInsideShadowDOM) 216 return; 217 if (!isSVGElement && !targetStack.isEmpty()) 218 targetStack.removeLast(); 233 219 } 234 220 }
Note:
See TracChangeset
for help on using the changeset viewer.