Changeset 139762 in webkit


Ignore:
Timestamp:
Jan 15, 2013 11:17:42 AM (11 years ago)
Author:
alexis@webkit.org
Message:

Unprefixed transitionend event doesn't seem to be implemented, which breaks many sites
https://bugs.webkit.org/show_bug.cgi?id=105647

Reviewed by Julien Chaffraix.

Source/WebCore:

Add support for transitionend event delivery as part as the unprefixing
work on CSS Transitions. This patch adds some code in EventTarget to
figure out if the current event to dispatch has a prefixed version or
not. Then from the list of listeners we deduce which event should be delivered
(prefixed or unprefixed).

In the case of the CSS Transitions, WebKit will now behave as follow :
if an event listener is attached to the prefixed version of the
transition end event then only the prefixed event will be send.
If an event listener is attached to the unprefixed version
of the transition end event then only the unprefixed event will be
send. If there are event listeners on both unprefixed and prefixed
events then only the unprefixed event will be send.

The behavior was discussed here :
http://lists.webkit.org/pipermail/webkit-dev/2013-January/023301.html.

Tests: transitions/transition-end-event-unprefixed-01.html

transitions/transition-end-event-unprefixed-02.html

  • dom/Document.cpp:

(WebCore::Document::addListenerTypeIfNeeded): Register the prefixed
listener too as transitionend listeners so that we properly dispatch
events for them.

  • dom/EventNames.h:

(WebCore): Add the new transitionend name.

  • dom/EventTarget.cpp:

(WebCore::createMatchingPrefixedEvent):
(WebCore::prefixedType):
(WebCore::EventTarget::fireEventListeners): Find out if somebody is
listening for unprefixed events, if so we always send the unprefixed
event, if not then we create a prefixed event and send it.

  • page/animation/AnimationController.cpp:

(WebCore::AnimationControllerPrivate::fireEventsAndUpdateStyle):

  • page/animation/ImplicitAnimation.cpp:

(WebCore::ImplicitAnimation::sendTransitionEvent): Always create by
default unprefixed events.

LayoutTests:

Cover that event delivery is correct : we received unprefixed events.

  • transitions/transition-end-event-helpers.js:

(recordTransitionEndEvent):

  • transitions/transition-end-event-unprefixed-01-expected.txt: Added.
  • transitions/transition-end-event-unprefixed-01.html: Added.
  • transitions/transition-end-event-unprefixed-02-expected.txt: Added.
  • transitions/transition-end-event-unprefixed-02.html: Added.
Location:
trunk
Files:
4 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r139757 r139762  
     12013-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
    1172013-01-15  Zan Dobersek  <zdobersek@igalia.com>
    218
  • trunk/LayoutTests/transitions/transition-end-event-helpers.js

    r124691 r139762  
    1111
    1212Function parameters:
    13     event [required]: the event passed with "webkitTransitionEnd"
     13    event [required]: the event passed with "webkitTransitionEnd" or "transitionend"
    1414
    1515*/
    1616function recordTransitionEndEvent(event)
    1717{
    18   if (event.type != "webkitTransitionEnd")
     18  if (event.type != "webkitTransitionEnd" && event.type != "transitionend" )
    1919    throw("Invalid transition end event!");
    2020
  • trunk/Source/WebCore/ChangeLog

    r139760 r139762  
     12013-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
    1462013-01-15  Tony Gentilcore  <tonyg@chromium.org>
    247
  • trunk/Source/WebCore/dom/Document.cpp

    r139694 r139762  
    37283728    else if (eventType == eventNames().webkitAnimationIterationEvent)
    37293729        addListenerType(ANIMATIONITERATION_LISTENER);
    3730     else if (eventType == eventNames().webkitTransitionEndEvent)
     3730    else if (eventType == eventNames().webkitTransitionEndEvent || eventType == eventNames().transitionendEvent)
    37313731        addListenerType(TRANSITIONEND_LISTENER);
    37323732    else if (eventType == eventNames().beforeloadEvent)
  • trunk/Source/WebCore/dom/EventNames.h

    r137045 r139762  
    183183    \
    184184    macro(webkitTransitionEnd) \
     185    macro(transitionend) \
    185186    \
    186187    macro(orientationchange) \
  • trunk/Source/WebCore/dom/EventTarget.cpp

    r131620 r139762  
    3636#include "EventException.h"
    3737#include "InspectorInstrumentation.h"
     38#include "WebKitTransitionEvent.h"
    3839#include <wtf/MainThread.h>
    3940#include <wtf/StdLibExtras.h>
     
    161162}
    162163
     164static 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
     178static AtomicString prefixedType(const Event* event)
     179{
     180    if (event->type() == eventNames().transitionendEvent)
     181        return eventNames().webkitTransitionEndEvent;
     182
     183    return emptyString();
     184}
     185
    163186bool EventTarget::fireEventListeners(Event* event)
    164187{
     
    170193        return true;
    171194
    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);
    176206   
    177207    return !event->defaultPrevented();
  • trunk/Source/WebCore/page/animation/AnimationController.cpp

    r138632 r139762  
    180180    Vector<EventToDispatch>::const_iterator eventsToDispatchEnd = eventsToDispatch.end();
    181181    for (Vector<EventToDispatch>::const_iterator it = eventsToDispatch.begin(); it != eventsToDispatchEnd; ++it) {
    182         if (it->eventType == eventNames().webkitTransitionEndEvent)
     182        if (it->eventType == eventNames().transitionendEvent)
    183183            it->element->dispatchEvent(WebKitTransitionEvent::create(it->eventType, it->name, it->elapsedTime));
    184184        else
  • trunk/Source/WebCore/page/animation/ImplicitAnimation.cpp

    r125934 r139762  
    152152        keyframeAnim->setUnanimatedStyle(m_toStyle);
    153153   
    154     sendTransitionEvent(eventNames().webkitTransitionEndEvent, elapsedTime);
     154    sendTransitionEvent(eventNames().transitionendEvent, elapsedTime);
    155155    endAnimation();
    156156}
     
    158158bool ImplicitAnimation::sendTransitionEvent(const AtomicString& eventType, double elapsedTime)
    159159{
    160     if (eventType == eventNames().webkitTransitionEndEvent) {
     160    if (eventType == eventNames().transitionendEvent) {
    161161        Document::ListenerType listenerType = Document::TRANSITIONEND_LISTENER;
    162162
     
    177177
    178178            // Restore the original (unanimated) style
    179             if (eventType == eventNames().webkitTransitionEndEvent && element->renderer())
     179            if (eventType == eventNames().transitionendEvent && element->renderer())
    180180                setNeedsStyleRecalc(element.get());
    181181
Note: See TracChangeset for help on using the changeset viewer.