Changeset 71934 in webkit
- Timestamp:
- Nov 12, 2010 11:49:40 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r71929 r71934 1 2010-11-05 Dimitri Glazkov <dglazkov@chromium.org> 2 3 Reviewed by Darin Adler. 4 5 Implement shadow DOM-aware event targeting and introduce EventContext to track the context of each event dispatch. 6 https://bugs.webkit.org/show_bug.cgi?id=46015 7 8 Added more test coverage around events crossing shadow DOM boundaries and tweaked existing tests. 9 10 * fast/events/shadow-boundary-crossing-2-expected.txt: Added. 11 * fast/events/shadow-boundary-crossing-2.html: Added. 12 * fast/events/shadow-boundary-crossing.html: Tuned to better reflect its point: 13 the event should indeed fire (it used to be swallowed), but its target 14 should be a non-shadow node. 15 * media/audio-delete-while-slider-thumb-clicked.html : Tweaked to actually click on 16 the scrubber thumb (it was off by 2 pixels). 17 1 18 2010-11-12 Mihai Parparita <mihaip@chromium.org> 2 19 -
trunk/LayoutTests/fast/events/shadow-boundary-crossing.html
r71278 r71934 3 3 <title></title> 4 4 <script type="text/javascript"> 5 var fired = false; 5 var success; 6 var target; 6 7 7 8 function selectStart(event) 8 9 { 9 fired = true;10 success = event.target == target; 10 11 } 11 12 … … 16 17 layoutTestController.dumpAsText(); 17 18 18 vartarget = document.getElementById("target");19 target = document.getElementById("target"); 19 20 var x = target.offsetLeft + target.offsetWidth / 2; 20 21 var y = target.offsetTop + target.offsetHeight / 2; … … 24 25 eventSender.mouseUp(); 25 26 26 document.getElementById("result").innerText = fired? "FAIL" : "PASS";27 document.getElementById("result").innerText = !success ? "FAIL" : "PASS"; 27 28 } 28 29 -
trunk/LayoutTests/media/audio-delete-while-slider-thumb-clicked.html
r71278 r71934 51 51 var audio = document.getElementById('audio'); 52 52 53 var middle= audio.offsetLeft + (audio.offsetWidth / 2);54 var bottom = audio.offsetTop + audio.offsetHeight;53 var center = audio.offsetLeft + (audio.offsetWidth / 2); 54 var middle = audio.offsetTop + (audio.offsetHeight / 2); 55 55 56 var x = middle+ 16 + 16 + 8;57 var y = bottom - 8;56 var x = center + 16 + 16 + 8; 57 var y = middle; 58 58 59 59 // drag slider, leave the mouse down -
trunk/WebCore/Android.mk
r71512 r71934 133 133 dom/ErrorEvent.cpp \ 134 134 dom/Event.cpp \ 135 dom/EventContext.cpp \ 135 136 dom/EventNames.cpp \ 136 137 dom/EventTarget.cpp \ … … 193 194 dom/WebKitTransitionEvent.cpp \ 194 195 dom/WheelEvent.cpp \ 196 dom/WindowEventContext.cpp \ 195 197 dom/XMLDocumentParser.cpp \ 196 198 dom/XMLDocumentParserLibxml2.cpp \ -
trunk/WebCore/CMakeLists.txt
r71802 r71934 826 826 dom/ErrorEvent.cpp 827 827 dom/Event.cpp 828 dom/EventContext.cpp 828 829 dom/EventNames.cpp 829 830 dom/EventTarget.cpp … … 883 884 dom/WebKitTransitionEvent.cpp 884 885 dom/WheelEvent.cpp 886 dom/WindowEventContext.cpp 885 887 dom/XMLDocumentParser.cpp 886 888 dom/XMLDocumentParserLibxml2.cpp -
trunk/WebCore/ChangeLog
r71933 r71934 1 2010-11-05 Dimitri Glazkov <dglazkov@chromium.org> 2 3 Reviewed by Darin Adler. 4 5 Implement shadow DOM-aware event targeting and introduce EventContext to track the context of each event dispatch. 6 https://bugs.webkit.org/show_bug.cgi?id=46015 7 8 Test: fast/events/shadow-boundary-crossing-2.html 9 10 This patch adds the notion of EventContext (and a very similar-acting WindowEventContext, specifically 11 for DOMWindow), an abstraction that carries information around dispatching an event for any given Node. 12 13 This abstraction is necessary to ensure that events, fired from shadow DOM nodes are properly retargeted to 14 appear as if they are coming from their host, thus never exposing the shadow DOM nodes to the world outside. 15 16 * Android.mk: Added EventContext, WindowEventContext files. 17 * CMakeLists.txt: Ditto. 18 * GNUmakefile.am: Ditto. 19 * WebCore.gypi: Ditto. 20 * WebCore.pro: Ditto. 21 * WebCore.xcodeproj/project.pbxproj: Ditto. 22 * WebCore.vcproj/WebCore.vcproj: Ditto. 23 * dom/ContainerNode.cpp: 24 (WebCore::notifyChildInserted): Changed to be shadow DOM-aware. 25 * dom/EventContext.cpp: Added. 26 * dom/EventContext.h: Added. 27 * dom/Node.cpp: 28 (WebCore::Node::markAncestorsWithChildNeedsStyleRecalc): Changed to be shadow DOM-aware. 29 (WebCore::Node::createRendererIfNeeded): Ditto. 30 (WebCore::Node::parentOrHostNode): Added new helper method. 31 (WebCore::Node::enclosingLinkEventParentOrSelf): Changed to be shadow DOM-aware. 32 (WebCore::eventTargetRespectingSVGTargetRules): Collapsed two helper methods into one. 33 (WebCore::Node::getEventAncestors): Renamed and refactored to collect a vector of EventContexts. 34 (WebCore::Node::topEventContext): Added. 35 (WebCore::eventHasListeners): Changed to use EventContexts. 36 (WebCore::Node::dispatchGenericEvent): Ditto. 37 * dom/Node.h: Removed eventParentNode that's no longer needed, added parentOrHostNode decl, 38 and changed signature of eventAncestors to use EventContexts. 39 * dom/Text.cpp: 40 (WebCore::Text::createRenderer): Changed to be shadow DOM-aware. 41 * dom/WindowEventContext.cpp: Added. 42 * dom/WindowEventContext.h: Added. 43 * inspector/InspectorDOMAgent.cpp: 44 (WebCore::InspectorDOMAgent::getEventListenersForNode): Changed to use EventContexts. 45 * page/EventHandler.cpp: 46 (WebCore::EventHandler::updateMouseEventTargetNode): Removed code that's no longer necessary. 47 * rendering/RenderTextControlMultiLine.cpp: 48 (WebCore::RenderTextControlMultiLine::subtreeHasChanged): Removed event invocation that's 49 no longer necessary. 50 * rendering/ShadowElement.h: Made m_shadowParent a RefPtr to avoid stale references when parent 51 is deleted. 52 * rendering/TextControlInnerElements.cpp: 53 (WebCore::TextControlInnerTextElement::defaultEventHandler): Flipped the condition back 54 from where it was prior to r60418. 55 * svg/SVGElement.cpp: Removed eventParentNode that's no longer needed. 56 * svg/SVGElement.h: Ditto. 57 1 58 2010-11-12 Ryuan Choi <ryuan.choi@samsung.com> 2 59 -
trunk/WebCore/GNUmakefile.am
r71903 r71934 1136 1136 WebCore/dom/ErrorEvent.h \ 1137 1137 WebCore/dom/Event.cpp \ 1138 WebCore/dom/Event.h \ 1139 WebCore/dom/EventContext.cpp \ 1140 WebCore/dom/EventContext.h \ 1138 1141 WebCore/dom/EventException.h \ 1139 WebCore/dom/Event.h \1140 1142 WebCore/dom/EventListener.h \ 1141 1143 WebCore/dom/EventNames.cpp \ … … 1265 1267 WebCore/dom/WheelEvent.cpp \ 1266 1268 WebCore/dom/WheelEvent.h \ 1269 WebCore/dom/WindowEventContext.cpp \ 1270 WebCore/dom/WindowEventContext.h \ 1267 1271 WebCore/dom/XMLDocumentParser.cpp \ 1268 1272 WebCore/dom/XMLDocumentParser.h \ -
trunk/WebCore/WebCore.gypi
r71903 r71934 1203 1203 'dom/Event.cpp', 1204 1204 'dom/Event.h', 1205 'dom/EventContext.cpp', 1206 'dom/EventContext.h', 1205 1207 'dom/EventException.h', 1206 1208 'dom/EventListener.h', … … 1338 1340 'dom/WheelEvent.cpp', 1339 1341 'dom/WheelEvent.h', 1342 'dom/WindowEventContext.cpp', 1343 'dom/WindowEventContext.h', 1340 1344 'dom/XMLDocumentParser.cpp', 1341 1345 'dom/XMLDocumentParser.h', -
trunk/WebCore/WebCore.pro
r71802 r71934 714 714 dom/ErrorEvent.cpp \ 715 715 dom/Event.cpp \ 716 dom/EventContext.cpp \ 716 717 dom/EventNames.cpp \ 717 718 dom/EventTarget.cpp \ … … 774 775 dom/WebKitTransitionEvent.cpp \ 775 776 dom/WheelEvent.cpp \ 777 dom/WindowEventContext.cpp \ 776 778 dom/XMLDocumentParser.cpp \ 777 779 dom/XMLDocumentParserQt.cpp \ -
trunk/WebCore/WebCore.vcproj/WebCore.vcproj
r71903 r71934 42389 42389 </File> 42390 42390 <File 42391 RelativePath="..\dom\EventContext.cpp" 42392 > 42393 <FileConfiguration 42394 Name="Debug|Win32" 42395 ExcludedFromBuild="true" 42396 > 42397 <Tool 42398 Name="VCCLCompilerTool" 42399 /> 42400 </FileConfiguration> 42401 <FileConfiguration 42402 Name="Release|Win32" 42403 ExcludedFromBuild="true" 42404 > 42405 <Tool 42406 Name="VCCLCompilerTool" 42407 /> 42408 </FileConfiguration> 42409 <FileConfiguration 42410 Name="Debug_Internal|Win32" 42411 ExcludedFromBuild="true" 42412 > 42413 <Tool 42414 Name="VCCLCompilerTool" 42415 /> 42416 </FileConfiguration> 42417 <FileConfiguration 42418 Name="Debug_Cairo|Win32" 42419 ExcludedFromBuild="true" 42420 > 42421 <Tool 42422 Name="VCCLCompilerTool" 42423 /> 42424 </FileConfiguration> 42425 <FileConfiguration 42426 Name="Release_Cairo|Win32" 42427 ExcludedFromBuild="true" 42428 > 42429 <Tool 42430 Name="VCCLCompilerTool" 42431 /> 42432 </FileConfiguration> 42433 <FileConfiguration 42434 Name="Debug_All|Win32" 42435 ExcludedFromBuild="true" 42436 > 42437 <Tool 42438 Name="VCCLCompilerTool" 42439 /> 42440 </FileConfiguration> 42441 </File> 42442 <File 42443 RelativePath="..\dom\EventContext.h" 42444 > 42445 </File> 42446 <File 42391 42447 RelativePath="..\dom\EventException.h" 42392 42448 > … … 45474 45530 <File 45475 45531 RelativePath="..\dom\WheelEvent.h" 45532 > 45533 </File> 45534 <File 45535 RelativePath="..\dom\WindowEventContext.cpp" 45536 > 45537 <FileConfiguration 45538 Name="Debug|Win32" 45539 ExcludedFromBuild="true" 45540 > 45541 <Tool 45542 Name="VCCLCompilerTool" 45543 /> 45544 </FileConfiguration> 45545 <FileConfiguration 45546 Name="Release|Win32" 45547 ExcludedFromBuild="true" 45548 > 45549 <Tool 45550 Name="VCCLCompilerTool" 45551 /> 45552 </FileConfiguration> 45553 <FileConfiguration 45554 Name="Debug_Internal|Win32" 45555 ExcludedFromBuild="true" 45556 > 45557 <Tool 45558 Name="VCCLCompilerTool" 45559 /> 45560 </FileConfiguration> 45561 <FileConfiguration 45562 Name="Debug_Cairo|Win32" 45563 ExcludedFromBuild="true" 45564 > 45565 <Tool 45566 Name="VCCLCompilerTool" 45567 /> 45568 </FileConfiguration> 45569 <FileConfiguration 45570 Name="Release_Cairo|Win32" 45571 ExcludedFromBuild="true" 45572 > 45573 <Tool 45574 Name="VCCLCompilerTool" 45575 /> 45576 </FileConfiguration> 45577 <FileConfiguration 45578 Name="Debug_All|Win32" 45579 ExcludedFromBuild="true" 45580 > 45581 <Tool 45582 Name="VCCLCompilerTool" 45583 /> 45584 </FileConfiguration> 45585 </File> 45586 <File 45587 RelativePath="..\dom\WindowEventContext.h" 45476 45588 > 45477 45589 </File> -
trunk/WebCore/WebCore.xcodeproj/project.pbxproj
r71903 r71934 903 903 411046410FA222A600BA436A /* ScriptEventListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 4110463F0FA222A600BA436A /* ScriptEventListener.h */; }; 904 904 411046420FA222A600BA436A /* ScriptEventListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 411046400FA222A600BA436A /* ScriptEventListener.cpp */; }; 905 4123E569127B3041000FEEA7 /* WindowEventContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4123E567127B3041000FEEA7 /* WindowEventContext.h */; }; 906 4123E56A127B3041000FEEA7 /* WindowEventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4123E568127B3041000FEEA7 /* WindowEventContext.cpp */; }; 905 907 4127D5370F8AAB1D00E424F5 /* ScriptState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4127D5360F8AAB1D00E424F5 /* ScriptState.cpp */; }; 908 4138D3351244054800323D33 /* EventContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4138D3331244054800323D33 /* EventContext.h */; }; 909 4138D3361244054800323D33 /* EventContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4138D3341244054800323D33 /* EventContext.cpp */; }; 906 910 4162A450101145AE00DFF3ED /* DedicatedWorkerContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */; }; 907 911 4162A451101145AE00DFF3ED /* DedicatedWorkerContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */; }; … … 6998 7002 4110463F0FA222A600BA436A /* ScriptEventListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptEventListener.h; sourceTree = "<group>"; }; 6999 7003 411046400FA222A600BA436A /* ScriptEventListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptEventListener.cpp; sourceTree = "<group>"; }; 7004 4123E567127B3041000FEEA7 /* WindowEventContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowEventContext.h; sourceTree = "<group>"; }; 7005 4123E568127B3041000FEEA7 /* WindowEventContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WindowEventContext.cpp; sourceTree = "<group>"; }; 7000 7006 4127D5360F8AAB1D00E424F5 /* ScriptState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptState.cpp; sourceTree = "<group>"; }; 7007 4138D3331244054800323D33 /* EventContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventContext.h; sourceTree = "<group>"; }; 7008 4138D3341244054800323D33 /* EventContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventContext.cpp; sourceTree = "<group>"; }; 7001 7009 4162A44D101145AE00DFF3ED /* DedicatedWorkerContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DedicatedWorkerContext.cpp; path = workers/DedicatedWorkerContext.cpp; sourceTree = "<group>"; }; 7002 7010 4162A44E101145AE00DFF3ED /* DedicatedWorkerContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DedicatedWorkerContext.h; path = workers/DedicatedWorkerContext.h; sourceTree = "<group>"; }; … … 18269 18277 85031B2C0A44EFC700F992E0 /* Event.h */, 18270 18278 14E836D209F8512000B85AE4 /* Event.idl */, 18279 4138D3341244054800323D33 /* EventContext.cpp */, 18280 4138D3331244054800323D33 /* EventContext.h */, 18271 18281 BC60D9090D2A17CE00B9918F /* EventException.h */, 18272 18282 BC60D90A0D2A17CE00B9918F /* EventException.idl */, … … 18429 18439 85031B3B0A44EFC700F992E0 /* WheelEvent.h */, 18430 18440 93EEC1F709C2877700C515D1 /* WheelEvent.idl */, 18441 4123E568127B3041000FEEA7 /* WindowEventContext.cpp */, 18442 4123E567127B3041000FEEA7 /* WindowEventContext.h */, 18431 18443 F523D30902DE4476018635CA /* XMLDocumentParser.cpp */, 18432 18444 F523D30A02DE4476018635CA /* XMLDocumentParser.h */, … … 19595 19607 2ECF7AE210162B5800427DE7 /* ErrorEvent.h in Headers */, 19596 19608 85031B420A44EFC700F992E0 /* Event.h in Headers */, 19609 4138D3351244054800323D33 /* EventContext.h in Headers */, 19597 19610 BC60D90C0D2A17CE00B9918F /* EventException.h in Headers */, 19598 19611 93C09A530B064DB3005ABD4D /* EventHandler.h in Headers */, … … 21275 21288 9380F47409A11AB4001FDB34 /* Widget.h in Headers */, 21276 21289 939B02EF0EA2DBC400C54570 /* WidthIterator.h in Headers */, 21290 4123E569127B3041000FEEA7 /* WindowEventContext.h in Headers */, 21277 21291 BC8243E90D0CFD7500460C8F /* WindowFeatures.h in Headers */, 21278 21292 E1E1BF00115FF6FB006F52CA /* WindowsKeyboardCodes.h in Headers */, … … 22247 22261 2ECF7AE110162B5800427DE7 /* ErrorEvent.cpp in Sources */, 22248 22262 85031B410A44EFC700F992E0 /* Event.cpp in Sources */, 22263 4138D3361244054800323D33 /* EventContext.cpp in Sources */, 22249 22264 93C09A810B064F00005ABD4D /* EventHandler.cpp in Sources */, 22250 22265 93C09A7F0B064EEF005ABD4D /* EventHandlerMac.mm in Sources */, … … 23854 23869 9380F47809A11ACC001FDB34 /* WidgetMac.mm in Sources */, 23855 23870 939B02EE0EA2DBC400C54570 /* WidthIterator.cpp in Sources */, 23871 4123E56A127B3041000FEEA7 /* WindowEventContext.cpp in Sources */, 23856 23872 BC8243E80D0CFD7500460C8F /* WindowFeatures.cpp in Sources */, 23857 23873 08203A9F0ED8C35300B8B61A /* WMLAccessElement.cpp in Sources */, -
trunk/WebCore/dom/ContainerNode.cpp
r71918 r71934 1009 1009 RefPtr<Document> document = child->document(); 1010 1010 1011 if (c->parentNode() && c->parentNode()->inDocument()) 1011 Node* parentOrHostNode = c->parentOrHostNode(); 1012 if (parentOrHostNode && parentOrHostNode->inDocument()) 1012 1013 c->insertedIntoDocument(); 1013 1014 else -
trunk/WebCore/dom/DOMAllInOne.cpp
r71278 r71934 70 70 #include "ErrorEvent.cpp" 71 71 #include "Event.cpp" 72 #include "EventContext.cpp" 72 73 #include "EventNames.cpp" 73 74 #include "EventTarget.cpp" … … 127 128 #include "WebKitTransitionEvent.cpp" 128 129 #include "WheelEvent.cpp" 130 #include "WindowEventContext.cpp" 129 131 #include "XMLDocumentParser.cpp" 130 132 #include "XMLDocumentParserScope.cpp" -
trunk/WebCore/dom/Node.cpp
r71278 r71934 46 46 #include "Element.h" 47 47 #include "Event.h" 48 #include "EventContext.h" 48 49 #include "EventException.h" 49 50 #include "EventHandler.h" … … 81 82 #include "WebKitTransitionEvent.h" 82 83 #include "WheelEvent.h" 84 #include "WindowEventContext.h" 83 85 #include "XMLNames.h" 84 86 #include "htmlediting.h" … … 735 737 inline void Node::markAncestorsWithChildNeedsStyleRecalc() 736 738 { 737 for (ContainerNode* p = parent Node(); p && !p->childNeedsStyleRecalc(); p = p->parentNode())739 for (ContainerNode* p = parentOrHostNode(); p && !p->childNeedsStyleRecalc(); p = p->parentOrHostNode()) 738 740 p->setChildNeedsStyleRecalc(); 739 741 740 742 if (document()->childNeedsStyleRecalc()) 741 743 document()->scheduleStyleRecalc(); … … 1322 1324 ASSERT(!renderer()); 1323 1325 1324 ContainerNode* parent = parent Node();1326 ContainerNode* parent = parentOrHostNode(); 1325 1327 ASSERT(parent); 1326 1328 … … 2240 2242 } 2241 2243 2242 ContainerNode* Node::eventParentNode()2243 {2244 return parentNode();2245 }2246 2247 2244 Node* Node::enclosingLinkEventParentOrSelf() 2248 2245 { 2249 for (Node* node = this; node; node = node-> eventParentNode()) {2246 for (Node* node = this; node; node = node->parentOrHostNode()) { 2250 2247 // For imagemaps, the enclosing link node is the associated area element not the image itself. 2251 2248 // So we don't let images be the enclosingLinkNode, even though isLink sometimes returns true … … 2485 2482 } 2486 2483 2484 static inline EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNode) 2485 { 2486 ASSERT(referenceNode); 2487 2487 2488 #if ENABLE(SVG) 2488 static inline SVGElementInstance* eventTargetAsSVGElementInstance(Node* referenceNode)2489 {2490 ASSERT(referenceNode);2491 2489 if (!referenceNode->isSVGElement()) 2492 return 0;2490 return referenceNode; 2493 2491 2494 2492 // Spec: The event handling for the non-exposed tree works as if the referenced element had been textually included … … 2504 2502 return instance; 2505 2503 } 2506 2507 return 0;2508 }2509 2504 #endif 2510 2505 2511 static inline EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNode) 2512 { 2513 ASSERT(referenceNode); 2506 return referenceNode; 2507 } 2508 2509 void Node::getEventAncestors(Vector<EventContext>& ancestors, EventTarget* originalTarget, EventDispatchBehavior behavior) 2510 { 2511 if (!inDocument()) 2512 return; 2513 2514 EventTarget* target = originalTarget; 2515 Node* ancestor = this; 2516 bool shouldSkipNextAncestor = false; 2517 while (true) { 2518 if (ancestor->isShadowNode()) { 2519 if (behavior == StayInsideShadowDOM) 2520 return; 2521 ancestor = ancestor->shadowParentNode(); 2522 if (!shouldSkipNextAncestor) 2523 target = ancestor; 2524 } else 2525 ancestor = ancestor->parentNode(); 2526 2527 if (!ancestor) 2528 return; 2514 2529 2515 2530 #if ENABLE(SVG) 2516 if (SVGElementInstance* instance = eventTargetAsSVGElementInstance(referenceNode)) {2517 ASSERT(instance->shadowTreeElement() == referenceNode);2518 return instance;2519 }2531 // Skip SVGShadowTreeRootElement. 2532 shouldSkipNextAncestor = ancestor->isSVGElement() && ancestor->isShadowNode(); 2533 if (shouldSkipNextAncestor) 2534 continue; 2520 2535 #endif 2521 2522 return referenceNode; 2523 } 2524 2525 void Node::eventAncestors(Vector<RefPtr<ContainerNode> > &ancestors) 2526 { 2527 if (inDocument()) { 2528 for (ContainerNode* ancestor = eventParentNode(); ancestor; ancestor = ancestor->eventParentNode()) { 2529 #if ENABLE(SVG) 2530 // Skip <use> shadow tree elements. 2531 if (ancestor->isSVGElement() && ancestor->isShadowNode()) 2532 continue; 2533 #endif 2534 ancestors.append(ancestor); 2535 } 2536 // FIXME: Unroll the extra loop inside eventTargetRespectingSVGTargetRules into this loop. 2537 ancestors.append(EventContext(ancestor, eventTargetRespectingSVGTargetRules(ancestor), target)); 2538 2536 2539 } 2537 2540 } … … 2546 2549 RefPtr<FrameView> view = document()->view(); 2547 2550 return dispatchGenericEvent(event.release()); 2551 } 2552 2553 static const EventContext* topEventContext(const Vector<EventContext>& ancestors) 2554 { 2555 return ancestors.isEmpty() ? 0 : &ancestors.last(); 2548 2556 } 2549 2557 … … 2560 2568 // Be sure to ref all of nodes since event handlers could result in the last reference going away. 2561 2569 RefPtr<Node> thisNode(this); 2562 Vector<RefPtr<ContainerNode> > ancestors; 2563 eventAncestors(ancestors); 2564 2565 // Set up a pointer to indicate whether / where to dispatch window events. 2566 // We don't dispatch load events to the window. That quirk was originally 2567 // added because Mozilla doesn't propagate load events to the window object. 2568 DOMWindow* targetForWindowEvents = 0; 2569 if (event->type() != eventNames().loadEvent) { 2570 Node* topLevelContainer = ancestors.isEmpty() ? this : ancestors.last().get(); 2571 if (topLevelContainer->isDocumentNode()) 2572 targetForWindowEvents = static_cast<Document*>(topLevelContainer)->domWindow(); 2573 } 2574 2575 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willDispatchEvent(document(), *event, targetForWindowEvents, this, ancestors); 2570 RefPtr<EventTarget> originalTarget = event->target(); 2571 Vector<EventContext> ancestors; 2572 getEventAncestors(ancestors, originalTarget.get(), event->isMutationEvent() ? StayInsideShadowDOM : RetargetEvent); 2573 2574 WindowEventContext windowContext(event.get(), this, topEventContext(ancestors)); 2575 2576 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willDispatchEvent(document(), *event, windowContext.window(), this, ancestors); 2576 2577 2577 2578 // Give the target node a chance to do some work before DOM event handlers get a crack. … … 2583 2584 event->setEventPhase(Event::CAPTURING_PHASE); 2584 2585 2585 if (targetForWindowEvents) { 2586 event->setCurrentTarget(targetForWindowEvents); 2587 targetForWindowEvents->fireEventListeners(event.get()); 2586 if (windowContext.handleLocalEvents(event.get()) && event->propagationStopped()) 2587 goto doneDispatching; 2588 2589 for (size_t i = ancestors.size(); i; --i) { 2590 ancestors[i - 1].handleLocalEvents(event.get()); 2588 2591 if (event->propagationStopped()) 2589 2592 goto doneDispatching; 2590 2593 } 2591 for (size_t i = ancestors.size(); i; --i) {2592 ContainerNode* ancestor = ancestors[i - 1].get();2593 event->setCurrentTarget(eventTargetRespectingSVGTargetRules(ancestor));2594 ancestor->handleLocalEvents(event.get());2595 if (event->propagationStopped())2596 goto doneDispatching;2597 }2598 2594 2599 2595 event->setEventPhase(Event::AT_TARGET); 2600 2596 event->setTarget(originalTarget.get()); 2601 2597 event->setCurrentTarget(eventTargetRespectingSVGTargetRules(this)); 2602 2598 handleLocalEvents(event.get()); … … 2610 2606 size_t size = ancestors.size(); 2611 2607 for (size_t i = 0; i < size; ++i) { 2612 ContainerNode* ancestor = ancestors[i].get(); 2613 event->setCurrentTarget(eventTargetRespectingSVGTargetRules(ancestor)); 2614 ancestor->handleLocalEvents(event.get()); 2608 ancestors[i].handleLocalEvents(event.get()); 2615 2609 if (event->propagationStopped() || event->cancelBubble()) 2616 2610 goto doneDispatching; 2617 2611 } 2618 if (targetForWindowEvents) { 2619 event->setCurrentTarget(targetForWindowEvents); 2620 targetForWindowEvents->fireEventListeners(event.get()); 2621 if (event->propagationStopped() || event->cancelBubble()) 2622 goto doneDispatching; 2623 } 2612 windowContext.handleLocalEvents(event.get()); 2624 2613 } 2625 2614 2626 2615 doneDispatching: 2616 event->setTarget(originalTarget.get()); 2627 2617 event->setCurrentTarget(0); 2628 2618 event->setEventPhase(0); … … 2645 2635 size_t size = ancestors.size(); 2646 2636 for (size_t i = 0; i < size; ++i) { 2647 ContainerNode* ancestor = ancestors[i].get(); 2648 ancestor->defaultEventHandler(event.get()); 2637 ancestors[i].node()->defaultEventHandler(event.get()); 2649 2638 ASSERT(!event->defaultPrevented()); 2650 2639 if (event->defaultHandled()) … … 2656 2645 doneWithDefault: 2657 2646 2647 // Ensure that after event dispatch, the event's target object is the 2648 // outermost shadow DOM boundary. 2649 event->setTarget(windowContext.target()); 2650 event->setCurrentTarget(0); 2658 2651 InspectorInstrumentation::didDispatchEvent(cookie); 2659 2652 -
trunk/WebCore/dom/Node.h
r71278 r71934 50 50 class Element; 51 51 class Event; 52 class EventContext; 52 53 class EventListener; 53 54 class FloatPoint; … … 84 85 FullStyleChange = 2 << nodeStyleChangeShift, 85 86 SyntheticStyleChange = 3 << nodeStyleChangeShift 87 }; 88 89 enum EventDispatchBehavior { 90 RetargetEvent, 91 StayInsideShadowDOM 86 92 }; 87 93 … … 205 211 Node* shadowTreeRootNode(); 206 212 bool isInShadowTree(); 207 208 // The node's parent for the purpose of event capture and bubbling. 209 virtual ContainerNode* eventParentNode(); 213 // Node's parent or shadow tree host. 214 ContainerNode* parentOrHostNode(); 210 215 211 216 // Returns the enclosing event parent node (or self) that, when clicked, would trigger a navigation. … … 213 218 214 219 // Node ancestors when concerned about event flow. 215 // FIXME: Should be named getEventAncestors. 216 void eventAncestors(Vector<RefPtr<ContainerNode> > &ancestors); 220 void getEventAncestors(Vector<EventContext>& ancestors, EventTarget*, EventDispatchBehavior = RetargetEvent); 217 221 218 222 bool isBlockFlow() const; … … 694 698 } 695 699 700 inline ContainerNode* Node::parentOrHostNode() 701 { 702 if (ContainerNode* parent = parentNode()) 703 return parent; 704 return shadowParentNode(); 705 } 706 696 707 } //namespace 697 708 -
trunk/WebCore/dom/Text.cpp
r71278 r71934 241 241 { 242 242 #if ENABLE(SVG) 243 if (parentNode()->isSVGElement() 243 Node* parentOrHost = parentOrHostNode(); 244 if (parentOrHost->isSVGElement() 244 245 #if ENABLE(SVG_FOREIGN_OBJECT) 245 && !parent Node()->hasTagName(SVGNames::foreignObjectTag)246 && !parentOrHost->hasTagName(SVGNames::foreignObjectTag) 246 247 #endif 247 248 ) -
trunk/WebCore/inspector/InspectorDOMAgent.cpp
r71745 r71934 52 52 #include "DocumentType.h" 53 53 #include "Event.h" 54 #include "EventContext.h" 54 55 #include "EventListener.h" 55 56 #include "EventNames.h" … … 614 615 615 616 // The Node's Event Ancestors (not including self) 616 Vector< RefPtr<ContainerNode>> ancestors;617 node-> eventAncestors(ancestors);617 Vector<EventContext> ancestors; 618 node->getEventAncestors(ancestors, node); 618 619 619 620 // Nodes and their Listeners for the concerned event types (order is top to bottom) 620 621 Vector<EventListenerInfo> eventInformation; 621 622 for (size_t i = ancestors.size(); i; --i) { 622 ContainerNode* ancestor = ancestors[i - 1].get();623 Node* ancestor = ancestors[i - 1].node(); 623 624 for (size_t j = 0; j < eventTypesLength; ++j) { 624 625 AtomicString& type = eventTypes[j]; -
trunk/WebCore/inspector/InspectorInstrumentation.cpp
r71278 r71934 36 36 #include "DOMWindow.h" 37 37 #include "Event.h" 38 #include "EventContext.h" 38 39 #include "InspectorController.h" 39 40 #include "InspectorDOMAgent.h" … … 54 55 int InspectorInstrumentation::s_frontendCounter = 0; 55 56 56 static bool eventHasListeners(const AtomicString& eventType, DOMWindow* window, Node* node, const Vector< RefPtr<ContainerNode>>& ancestors)57 static bool eventHasListeners(const AtomicString& eventType, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors) 57 58 { 58 59 if (window && window->hasEventListeners(eventType)) … … 63 64 64 65 for (size_t i = 0; i < ancestors.size(); i++) { 65 ContainerNode* ancestor = ancestors[i].get();66 Node* ancestor = ancestors[i].node(); 66 67 if (ancestor->hasEventListeners(eventType)) 67 68 return true; … … 139 140 domAgent->characterDataModified(characterData); 140 141 } 141 142 142 143 143 void InspectorInstrumentation::willSendXMLHttpRequestImpl(InspectorController* inspectorController, const String& url) … … 214 214 } 215 215 216 InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventImpl(InspectorController* inspectorController, const Event& event, DOMWindow* window, Node* node, const Vector< RefPtr<ContainerNode>>& ancestors)216 InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventImpl(InspectorController* inspectorController, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors) 217 217 { 218 218 pauseOnNativeEventIfNeeded(inspectorController, listenerEventCategoryType, event.type(), false); -
trunk/WebCore/inspector/InspectorInstrumentation.h
r71278 r71934 41 41 class CharacterData; 42 42 class Element; 43 class EventContext; 43 44 class InspectorController; 44 45 class InspectorTimelineAgent; … … 74 75 static InspectorInstrumentationCookie willChangeXHRReadyState(ScriptExecutionContext*, XMLHttpRequest* request); 75 76 static void didChangeXHRReadyState(const InspectorInstrumentationCookie&); 76 static InspectorInstrumentationCookie willDispatchEvent(Document*, const Event& event, DOMWindow* window, Node* node, const Vector< RefPtr<ContainerNode>>& ancestors);77 static InspectorInstrumentationCookie willDispatchEvent(Document*, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors); 77 78 static void didDispatchEvent(const InspectorInstrumentationCookie&); 78 79 static InspectorInstrumentationCookie willDispatchEventOnWindow(Frame*, const Event& event, DOMWindow* window); … … 131 132 static InspectorInstrumentationCookie willChangeXHRReadyStateImpl(InspectorController*, XMLHttpRequest* request); 132 133 static void didChangeXHRReadyStateImpl(const InspectorInstrumentationCookie&); 133 static InspectorInstrumentationCookie willDispatchEventImpl(InspectorController*, const Event& event, DOMWindow* window, Node* node, const Vector< RefPtr<ContainerNode>>& ancestors);134 static InspectorInstrumentationCookie willDispatchEventImpl(InspectorController*, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors); 134 135 static void didDispatchEventImpl(const InspectorInstrumentationCookie&); 135 136 static InspectorInstrumentationCookie willDispatchEventOnWindowImpl(InspectorController*, const Event& event, DOMWindow* window); … … 226 227 } 227 228 228 229 229 inline void InspectorInstrumentation::willSendXMLHttpRequest(ScriptExecutionContext* context, const String& url) 230 230 { … … 294 294 } 295 295 296 inline InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEvent(Document* document, const Event& event, DOMWindow* window, Node* node, const Vector< RefPtr<ContainerNode>>& ancestors)296 inline InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEvent(Document* document, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors) 297 297 { 298 298 #if ENABLE(INSPECTOR) -
trunk/WebCore/page/EventHandler.cpp
r71479 r71934 1767 1767 if (result && result->isTextNode()) 1768 1768 result = result->parentNode(); 1769 if (result)1770 result = result->shadowAncestorNode();1771 1769 } 1772 1770 m_nodeUnderMouse = result; -
trunk/WebCore/rendering/RenderTextControlMultiLine.cpp
r70072 r71934 52 52 if (!node()->focused()) 53 53 return; 54 55 node()->dispatchEvent(Event::create(eventNames().inputEvent, true, false));56 54 57 55 if (Frame* frame = this->frame()) -
trunk/WebCore/rendering/ShadowElement.h
r71278 r71934 44 44 } 45 45 46 HTMLElement* shadowParent() const { return m_shadowParent ; }46 HTMLElement* shadowParent() const { return m_shadowParent.get(); } 47 47 48 48 private: 49 49 virtual bool isShadowNode() const { return true; } 50 virtual ContainerNode* shadowParentNode() { return m_shadowParent ; }50 virtual ContainerNode* shadowParentNode() { return m_shadowParent.get(); } 51 51 52 HTMLElement*m_shadowParent;52 RefPtr<HTMLElement> m_shadowParent; 53 53 }; 54 54 -
trunk/WebCore/rendering/TextControlInnerElements.cpp
r71131 r71934 155 155 shadowAncestor->defaultEventHandler(event); 156 156 } 157 if ( event->defaultHandled())157 if (!event->defaultHandled()) 158 158 HTMLDivElement::defaultEventHandler(event); 159 159 } -
trunk/WebCore/svg/SVGElement.cpp
r71278 r71934 348 348 } 349 349 350 ContainerNode* SVGElement::eventParentNode()351 {352 if (ContainerNode* shadowParent = shadowParentNode())353 return shadowParent;354 return StyledElement::eventParentNode();355 }356 357 350 } 358 351 -
trunk/WebCore/svg/SVGElement.h
r71278 r71934 100 100 virtual bool isSupported(StringImpl* feature, StringImpl* version) const; 101 101 102 virtual ContainerNode* eventParentNode();103 104 102 virtual bool needsPendingResourceHandling() const { return true; } 105 103 virtual void buildPendingResource() { }
Note: See TracChangeset
for help on using the changeset viewer.