Changeset 139762 in webkit
- Timestamp:
- Jan 15, 2013 11:17:42 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r139757 r139762 1 2013-01-15 Alexis Menard <alexis@webkit.org> 2 3 Unprefixed transitionend event doesn't seem to be implemented, which breaks many sites 4 https://bugs.webkit.org/show_bug.cgi?id=105647 5 6 Reviewed by Julien Chaffraix. 7 8 Cover that event delivery is correct : we received unprefixed events. 9 10 * transitions/transition-end-event-helpers.js: 11 (recordTransitionEndEvent): 12 * transitions/transition-end-event-unprefixed-01-expected.txt: Added. 13 * transitions/transition-end-event-unprefixed-01.html: Added. 14 * transitions/transition-end-event-unprefixed-02-expected.txt: Added. 15 * transitions/transition-end-event-unprefixed-02.html: Added. 16 1 17 2013-01-15 Zan Dobersek <zdobersek@igalia.com> 2 18 -
trunk/LayoutTests/transitions/transition-end-event-helpers.js
r124691 r139762 11 11 12 12 Function parameters: 13 event [required]: the event passed with "webkitTransitionEnd" 13 event [required]: the event passed with "webkitTransitionEnd" or "transitionend" 14 14 15 15 */ 16 16 function recordTransitionEndEvent(event) 17 17 { 18 if (event.type != "webkitTransitionEnd" )18 if (event.type != "webkitTransitionEnd" && event.type != "transitionend" ) 19 19 throw("Invalid transition end event!"); 20 20 -
trunk/Source/WebCore/ChangeLog
r139760 r139762 1 2013-01-15 Alexis Menard <alexis@webkit.org> 2 3 Unprefixed transitionend event doesn't seem to be implemented, which breaks many sites 4 https://bugs.webkit.org/show_bug.cgi?id=105647 5 6 Reviewed by Julien Chaffraix. 7 8 Add support for transitionend event delivery as part as the unprefixing 9 work on CSS Transitions. This patch adds some code in EventTarget to 10 figure out if the current event to dispatch has a prefixed version or 11 not. Then from the list of listeners we deduce which event should be delivered 12 (prefixed or unprefixed). 13 14 In the case of the CSS Transitions, WebKit will now behave as follow : 15 if an event listener is attached to the prefixed version of the 16 transition end event then only the prefixed event will be send. 17 If an event listener is attached to the unprefixed version 18 of the transition end event then only the unprefixed event will be 19 send. If there are event listeners on both unprefixed and prefixed 20 events then only the unprefixed event will be send. 21 22 The behavior was discussed here : 23 http://lists.webkit.org/pipermail/webkit-dev/2013-January/023301.html. 24 25 Tests: transitions/transition-end-event-unprefixed-01.html 26 transitions/transition-end-event-unprefixed-02.html 27 28 * dom/Document.cpp: 29 (WebCore::Document::addListenerTypeIfNeeded): Register the prefixed 30 listener too as transitionend listeners so that we properly dispatch 31 events for them. 32 * dom/EventNames.h: 33 (WebCore): Add the new transitionend name. 34 * dom/EventTarget.cpp: 35 (WebCore::createMatchingPrefixedEvent): 36 (WebCore::prefixedType): 37 (WebCore::EventTarget::fireEventListeners): Find out if somebody is 38 listening for unprefixed events, if so we always send the unprefixed 39 event, if not then we create a prefixed event and send it. 40 * page/animation/AnimationController.cpp: 41 (WebCore::AnimationControllerPrivate::fireEventsAndUpdateStyle): 42 * page/animation/ImplicitAnimation.cpp: 43 (WebCore::ImplicitAnimation::sendTransitionEvent): Always create by 44 default unprefixed events. 45 1 46 2013-01-15 Tony Gentilcore <tonyg@chromium.org> 2 47 -
trunk/Source/WebCore/dom/Document.cpp
r139694 r139762 3728 3728 else if (eventType == eventNames().webkitAnimationIterationEvent) 3729 3729 addListenerType(ANIMATIONITERATION_LISTENER); 3730 else if (eventType == eventNames().webkitTransitionEndEvent )3730 else if (eventType == eventNames().webkitTransitionEndEvent || eventType == eventNames().transitionendEvent) 3731 3731 addListenerType(TRANSITIONEND_LISTENER); 3732 3732 else if (eventType == eventNames().beforeloadEvent) -
trunk/Source/WebCore/dom/EventNames.h
r137045 r139762 183 183 \ 184 184 macro(webkitTransitionEnd) \ 185 macro(transitionend) \ 185 186 \ 186 187 macro(orientationchange) \ -
trunk/Source/WebCore/dom/EventTarget.cpp
r131620 r139762 36 36 #include "EventException.h" 37 37 #include "InspectorInstrumentation.h" 38 #include "WebKitTransitionEvent.h" 38 39 #include <wtf/MainThread.h> 39 40 #include <wtf/StdLibExtras.h> … … 161 162 } 162 163 164 static PassRefPtr<Event> createMatchingPrefixedEvent(const Event* event) 165 { 166 if (event->type() == eventNames().transitionendEvent) { 167 const WebKitTransitionEvent* transitionEvent = static_cast<const WebKitTransitionEvent*>(event); 168 RefPtr<Event> prefixedEvent = WebKitTransitionEvent::create(eventNames().webkitTransitionEndEvent, transitionEvent->propertyName(), transitionEvent->elapsedTime()); 169 prefixedEvent->setTarget(event->target()); 170 prefixedEvent->setCurrentTarget(event->currentTarget()); 171 prefixedEvent->setEventPhase(event->eventPhase()); 172 return prefixedEvent.release(); 173 } 174 ASSERT_NOT_REACHED(); 175 return 0; 176 } 177 178 static AtomicString prefixedType(const Event* event) 179 { 180 if (event->type() == eventNames().transitionendEvent) 181 return eventNames().webkitTransitionEndEvent; 182 183 return emptyString(); 184 } 185 163 186 bool EventTarget::fireEventListeners(Event* event) 164 187 { … … 170 193 return true; 171 194 172 EventListenerVector* listenerVector = d->eventListenerMap.find(event->type()); 173 174 if (listenerVector) 175 fireEventListeners(event, d, *listenerVector); 195 EventListenerVector* listenerPrefixedVector = 0; 196 AtomicString prefixedTypeName = prefixedType(event); 197 if (!prefixedTypeName.isEmpty()) 198 listenerPrefixedVector = d->eventListenerMap.find(prefixedTypeName); 199 200 EventListenerVector* listenerUnprefixedVector = d->eventListenerMap.find(event->type()); 201 202 if (listenerUnprefixedVector) 203 fireEventListeners(event, d, *listenerUnprefixedVector); 204 else if (listenerPrefixedVector) 205 fireEventListeners(createMatchingPrefixedEvent(event).get(), d, *listenerPrefixedVector); 176 206 177 207 return !event->defaultPrevented(); -
trunk/Source/WebCore/page/animation/AnimationController.cpp
r138632 r139762 180 180 Vector<EventToDispatch>::const_iterator eventsToDispatchEnd = eventsToDispatch.end(); 181 181 for (Vector<EventToDispatch>::const_iterator it = eventsToDispatch.begin(); it != eventsToDispatchEnd; ++it) { 182 if (it->eventType == eventNames(). webkitTransitionEndEvent)182 if (it->eventType == eventNames().transitionendEvent) 183 183 it->element->dispatchEvent(WebKitTransitionEvent::create(it->eventType, it->name, it->elapsedTime)); 184 184 else -
trunk/Source/WebCore/page/animation/ImplicitAnimation.cpp
r125934 r139762 152 152 keyframeAnim->setUnanimatedStyle(m_toStyle); 153 153 154 sendTransitionEvent(eventNames(). webkitTransitionEndEvent, elapsedTime);154 sendTransitionEvent(eventNames().transitionendEvent, elapsedTime); 155 155 endAnimation(); 156 156 } … … 158 158 bool ImplicitAnimation::sendTransitionEvent(const AtomicString& eventType, double elapsedTime) 159 159 { 160 if (eventType == eventNames(). webkitTransitionEndEvent) {160 if (eventType == eventNames().transitionendEvent) { 161 161 Document::ListenerType listenerType = Document::TRANSITIONEND_LISTENER; 162 162 … … 177 177 178 178 // Restore the original (unanimated) style 179 if (eventType == eventNames(). webkitTransitionEndEvent && element->renderer())179 if (eventType == eventNames().transitionendEvent && element->renderer()) 180 180 setNeedsStyleRecalc(element.get()); 181 181
Note: See TracChangeset
for help on using the changeset viewer.