Changeset 214819 in webkit
- Timestamp:
- Apr 3, 2017 10:51:29 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r214807 r214819 1 2017-04-01 Simon Fraser <simon.fraser@apple.com> 2 3 Clean up touch event handler registration when moving nodes between documents 4 https://bugs.webkit.org/show_bug.cgi?id=170384 5 rdar://problem/30816694 6 7 Reviewed by Chris Dumez. 8 9 Tests for moving nodes with various listener/handler combinations between documents. 10 11 * fast/events/touch/ios/gesture-node-move-between-documents-expected.txt: Added. 12 * fast/events/touch/ios/gesture-node-move-between-documents.html: Added. 13 * fast/events/touch/ios/overflow-node-move-between-documents-expected.txt: Added. 14 * fast/events/touch/ios/overflow-node-move-between-documents.html: Added. 15 * fast/events/touch/ios/slider-node-move-between-documents-expected.txt: Added. 16 * fast/events/touch/ios/slider-node-move-between-documents.html: Added. 17 * fast/events/touch/ios/touch-node-move-between-documents-expected.txt: Added. 18 * fast/events/touch/ios/touch-node-move-between-documents.html: Added. 19 1 20 2017-04-03 Carlos Garcia Campos <cgarcia@igalia.com> 2 21 -
trunk/Source/WebCore/ChangeLog
r214806 r214819 1 2017-04-01 Simon Fraser <simon.fraser@apple.com> 2 3 Clean up touch event handler registration when moving nodes between documents 4 https://bugs.webkit.org/show_bug.cgi?id=170384 5 rdar://problem/30816694 6 7 Reviewed by Chris Dumez. 8 9 Make sure that Node::didMoveToNewDocument() does the correct unregistration on the 10 old document, and registration on the new document for nodes with touch event listeners, 11 and gesture event listeners. Touch "handler" nodes (those for overflow and sliders) are 12 already correctly moved via renderer-related teardown. 13 14 Add assertions that fire when removal was not complete. 15 16 Use references in more places. 17 18 Tests: fast/events/touch/ios/gesture-node-move-between-documents.html 19 fast/events/touch/ios/overflow-node-move-between-documents.html 20 fast/events/touch/ios/slider-node-move-between-documents.html 21 fast/events/touch/ios/touch-node-move-between-documents.html 22 23 * dom/EventNames.h: 24 (WebCore::EventNames::gestureEventNames): 25 * dom/Node.cpp: 26 (WebCore::Node::willBeDeletedFrom): 27 (WebCore::Node::didMoveToNewDocument): 28 (WebCore::tryAddEventListener): 29 (WebCore::tryRemoveEventListener): 30 * html/shadow/SliderThumbElement.cpp: 31 (WebCore::SliderThumbElement::registerForTouchEvents): 32 (WebCore::SliderThumbElement::unregisterForTouchEvents): 33 * rendering/RenderLayer.cpp: 34 (WebCore::RenderLayer::registerAsTouchEventListenerForScrolling): 35 (WebCore::RenderLayer::unregisterAsTouchEventListenerForScrolling): 36 1 37 2017-04-03 Youenn Fablet <youenn@apple.com> 2 38 -
trunk/Source/WebCore/dom/EventNames.h
r214627 r214819 320 320 321 321 std::array<std::reference_wrapper<const AtomicString>, 5> touchEventNames() const; 322 std::array<std::reference_wrapper<const AtomicString>, 3> gestureEventNames() const; 322 323 323 324 private: … … 360 361 } 361 362 363 inline std::array<std::reference_wrapper<const AtomicString>, 3> EventNames::gestureEventNames() const 364 { 365 return { { gesturestartEvent, gesturechangeEvent, gestureendEvent } }; 366 } 367 362 368 #if ENABLE(GAMEPAD) 363 369 -
trunk/Source/WebCore/dom/Node.cpp
r214702 r214819 316 316 if (hasEventTargetData()) { 317 317 document.didRemoveWheelEventHandler(*this, EventHandlerRemoval::All); 318 #if ENABLE(TOUCH_EVENTS) 319 #if PLATFORM(IOS) 320 document.removeTouchEventListener(*this, EventHandlerRemoval::All); 321 #endif 322 document.didRemoveTouchEventHandler(*this, EventHandlerRemoval::All); 323 #endif 324 } 325 318 326 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS) 319 document.removeTouchEventListener(this, true); 320 #else 321 // FIXME: This should call didRemoveTouchEventHandler(). 322 #endif 323 } 324 325 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS) 326 document.removeTouchEventHandler(this, true); 327 document.removeTouchEventHandler(*this, EventHandlerRemoval::All); 327 328 #endif 328 329 … … 1920 1921 } 1921 1922 1922 unsigned numTouchEvent Handlers = 0;1923 unsigned numTouchEventListeners = 0; 1923 1924 for (auto& name : eventNames().touchEventNames()) 1924 numTouchEvent Handlers += eventListeners(name).size();1925 1926 for (unsigned i = 0; i < numTouchEvent Handlers; ++i) {1925 numTouchEventListeners += eventListeners(name).size(); 1926 1927 for (unsigned i = 0; i < numTouchEventListeners; ++i) { 1927 1928 oldDocument.didRemoveTouchEventHandler(*this); 1928 1929 document().didAddTouchEventHandler(*this); 1929 } 1930 1931 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS) 1932 oldDocument.removeTouchEventListener(*this); 1933 document().addTouchEventListener(*this); 1934 #endif 1935 } 1936 1937 #if ENABLE(TOUCH_EVENTS) && ENABLE(IOS_GESTURE_EVENTS) 1938 unsigned numGestureEventListeners = 0; 1939 for (auto& name : eventNames().gestureEventNames()) 1940 numGestureEventListeners += eventListeners(name).size(); 1941 1942 for (unsigned i = 0; i < numGestureEventListeners; ++i) { 1943 oldDocument.removeTouchEventHandler(*this); 1944 document().addTouchEventHandler(*this); 1945 } 1946 #endif 1930 1947 1931 1948 if (auto* registry = mutationObserverRegistry()) { … … 1938 1955 document().addMutationObserverTypes(registration->mutationTypes()); 1939 1956 } 1957 1958 #if !ASSERT_DISABLED || ENABLE(SECURITY_ASSERTIONS) 1959 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS) 1960 ASSERT_WITH_SECURITY_IMPLICATION(!oldDocument.touchEventListenersContain(*this)); 1961 ASSERT_WITH_SECURITY_IMPLICATION(!oldDocument.touchEventHandlersContain(*this)); 1962 #endif 1963 #if ENABLE(TOUCH_EVENTS) && ENABLE(IOS_GESTURE_EVENTS) 1964 ASSERT_WITH_SECURITY_IMPLICATION(!oldDocument.touchEventTargetsContain(*this)); 1965 #endif 1966 #endif 1940 1967 } 1941 1968 … … 1964 1991 #if ENABLE(TOUCH_EVENTS) 1965 1992 if (eventNames().isTouchEventType(eventType)) 1966 targetNode->document().addTouchEventListener( targetNode);1993 targetNode->document().addTouchEventListener(*targetNode); 1967 1994 #endif 1968 1995 #endif // PLATFORM(IOS) … … 1970 1997 #if ENABLE(IOS_GESTURE_EVENTS) && ENABLE(TOUCH_EVENTS) 1971 1998 if (eventNames().isGestureEventType(eventType)) 1972 targetNode->document().addTouchEventHandler( targetNode);1999 targetNode->document().addTouchEventHandler(*targetNode); 1973 2000 #endif 1974 2001 … … 2005 2032 #if ENABLE(TOUCH_EVENTS) 2006 2033 if (eventNames().isTouchEventType(eventType)) 2007 targetNode->document().removeTouchEventListener( targetNode);2034 targetNode->document().removeTouchEventListener(*targetNode); 2008 2035 #endif 2009 2036 #endif // PLATFORM(IOS) … … 2011 2038 #if ENABLE(IOS_GESTURE_EVENTS) && ENABLE(TOUCH_EVENTS) 2012 2039 if (eventNames().isGestureEventType(eventType)) 2013 targetNode->document().removeTouchEventHandler( targetNode);2040 targetNode->document().removeTouchEventHandler(*targetNode); 2014 2041 #endif 2015 2042 -
trunk/Source/WebCore/html/shadow/SliderThumbElement.cpp
r214291 r214819 550 550 ASSERT(shouldAcceptTouchEvents()); 551 551 552 document().addTouchEventHandler( this);552 document().addTouchEventHandler(*this); 553 553 m_isRegisteredAsTouchEventListener = true; 554 554 } … … 562 562 stopDragging(); 563 563 564 document().removeTouchEventHandler( this);564 document().removeTouchEventHandler(*this); 565 565 m_isRegisteredAsTouchEventListener = false; 566 566 } -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r214640 r214819 2195 2195 return; 2196 2196 2197 renderer().document().addTouchEventHandler( renderer().element());2197 renderer().document().addTouchEventHandler(*renderer().element()); 2198 2198 m_registeredAsTouchEventListenerForScrolling = true; 2199 2199 } … … 2204 2204 return; 2205 2205 2206 renderer().document().removeTouchEventHandler( renderer().element());2206 renderer().document().removeTouchEventHandler(*renderer().element()); 2207 2207 m_registeredAsTouchEventListenerForScrolling = false; 2208 2208 }
Note: See TracChangeset
for help on using the changeset viewer.