Changeset 141119 in webkit


Ignore:
Timestamp:
Jan 29, 2013 8:55:32 AM (11 years ago)
Author:
alexis@webkit.org
Message:

Implement pseudoElement attribute on transition DOM events.
https://bugs.webkit.org/show_bug.cgi?id=107986

Reviewed by Julien Chaffraix.

Source/WebCore:

Implement the pseudoElement attribute documented here :
http://dev.w3.org/csswg/css3-transitions/#transition-events.
This add a new attribute to the transition DOM event useful when
animating pseudo elements. As they are not accessible in JS, it's
very useful to get on which pseudo element the transition just ended.
This patch adds the new attribute on the IDLs of DOM transition events as well
as adding it to the C++ classes representing them. The event
dispatching code have been patched to change the target of the event
(we can't send the current target as it is the actual DOM
representation of the pseudo element).

Test: fast/css-generated-content/pseudo-transition-event.html

  • dom/EventDispatcher.cpp:

(WebCore::eventTargetRespectingTargetRules): Change the target of the
event in the case of a pseudo element. We can't expose them through the
public interface so the target is the node they belong to.
(WebCore::EventDispatcher::ensureEventAncestors):
(WebCore::EventDispatcher::dispatchScopedEvent):
(WebCore::EventDispatcher::dispatchEvent):
(WebCore::EventDispatcher::dispatchEventPostProcess):

  • dom/EventTarget.cpp:

(WebCore::createMatchingPrefixedEvent):

  • dom/PseudoElement.cpp:

(WebCore::PseudoElement::pseudoElementNameForEvents):
(WebCore):

  • dom/PseudoElement.h:
  • dom/TransitionEvent.cpp:

(WebCore::TransitionEventInit::TransitionEventInit):
(WebCore::TransitionEvent::TransitionEvent):
(WebCore::TransitionEvent::pseudoElement):
(WebCore):

  • dom/TransitionEvent.h:

(TransitionEventInit):
(WebCore::TransitionEvent::create):
(TransitionEvent):

  • dom/TransitionEvent.idl:
  • dom/WebKitTransitionEvent.cpp:

(WebCore::WebKitTransitionEventInit::WebKitTransitionEventInit):
(WebCore::WebKitTransitionEvent::WebKitTransitionEvent):
(WebCore::WebKitTransitionEvent::pseudoElement):
(WebCore):

  • dom/WebKitTransitionEvent.h:

(WebKitTransitionEventInit):
(WebCore::WebKitTransitionEvent::create):
(WebKitTransitionEvent):

  • dom/WebKitTransitionEvent.idl:
  • page/animation/AnimationController.cpp:

(WebCore::AnimationControllerPrivate::fireEventsAndUpdateStyle): Pass
the pseudo element name when creating the Event objects. If the element
is not a pseudo element then the name will be empty which is what the
spec is telling to do. If the element is a pseudo element then the name
will be the pseudo element's name with "::" as a prefix.

LayoutTests:

Add new tests to cover the feature.

  • fast/css-generated-content/pseudo-transition-event-expected.txt: Added.
  • fast/css-generated-content/pseudo-transition-event.html: Added.
  • fast/events/constructors/transition-event-constructor-expected.txt:
  • fast/events/constructors/transition-event-constructor.html:
  • fast/events/constructors/webkit-transition-event-constructor-expected.txt:
  • fast/events/constructors/webkit-transition-event-constructor.html:
Location:
trunk
Files:
2 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r141115 r141119  
     12013-01-29  Alexis Menard  <alexis@webkit.org>
     2
     3        Implement pseudoElement attribute on transition DOM events.
     4        https://bugs.webkit.org/show_bug.cgi?id=107986
     5
     6        Reviewed by Julien Chaffraix.
     7
     8        Add new tests to cover the feature.
     9
     10        * fast/css-generated-content/pseudo-transition-event-expected.txt: Added.
     11        * fast/css-generated-content/pseudo-transition-event.html: Added.
     12        * fast/events/constructors/transition-event-constructor-expected.txt:
     13        * fast/events/constructors/transition-event-constructor.html:
     14        * fast/events/constructors/webkit-transition-event-constructor-expected.txt:
     15        * fast/events/constructors/webkit-transition-event-constructor.html:
     16
    1172013-01-29  Zan Dobersek  <zdobersek@igalia.com>
    218
  • trunk/LayoutTests/fast/events/constructors/transition-event-constructor-expected.txt

    r140448 r141119  
    88PASS new TransitionEvent('eventType').propertyName is ""
    99PASS new TransitionEvent('eventType').elapsedTime is 0
     10PASS new TransitionEvent('eventType').pseudoElement is ""
    1011PASS new TransitionEvent('eventType', { bubbles: false }).bubbles is false
    1112PASS new TransitionEvent('eventType', { bubbles: true }).bubbles is true
     
    3233PASS new TransitionEvent('eventType', { elapsedTime: Infinity }).elapsedTime is Infinity
    3334PASS new TransitionEvent('eventType', { elapsedTime: -Infinity }).elapsedTime is -Infinity
     35PASS new TransitionEvent('eventType', { pseudoElement: '::before' }).pseudoElement is "::before"
     36PASS new TransitionEvent('eventType', { pseudoElement: '' }).pseudoElement is ""
    3437PASS new TransitionEvent('eventType', { elapsedTime: undefined }).elapsedTime is NaN
    3538PASS new TransitionEvent('eventType', { elapsedTime: null }).elapsedTime is 0
     
    4346PASS new TransitionEvent('eventType', { elapsedTime: {doremi: 123.45} }).elapsedTime is NaN
    4447PASS new TransitionEvent('eventType', { elapsedTime: {valueOf: function () { return 123.45 } } }).elapsedTime is 123.45
    45 PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).bubbles is true
    46 PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).cancelable is true
    47 PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).propertyName is 'doremi'
    48 PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).elapsedTime is 123.45
     48PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).bubbles is true
     49PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).cancelable is true
     50PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).propertyName is 'doremi'
     51PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).elapsedTime is 123.45
     52PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).pseudoElement is '::after'
    4953PASS successfullyParsed is true
    5054
  • trunk/LayoutTests/fast/events/constructors/transition-event-constructor.html

    r140448 r141119  
    1414shouldBeEqualToString("new TransitionEvent('eventType').propertyName", "");
    1515shouldBe("new TransitionEvent('eventType').elapsedTime", "0");
     16shouldBeEqualToString("new TransitionEvent('eventType').pseudoElement", "");
    1617
    1718// bubbles is passed.
     
    5152shouldBe("new TransitionEvent('eventType', { elapsedTime: -Infinity }).elapsedTime", "-Infinity");
    5253
     54// pseudoElement is passed.
     55// Strings.
     56shouldBeEqualToString("new TransitionEvent('eventType', { pseudoElement: '::before' }).pseudoElement", "::before");
     57shouldBeEqualToString("new TransitionEvent('eventType', { pseudoElement: '' }).pseudoElement", "");
     58
    5359// Non-numeric values.
    5460shouldBe("new TransitionEvent('eventType', { elapsedTime: undefined }).elapsedTime", "NaN");
     
    6571
    6672// All initializers are passed.
    67 shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).bubbles", "true");
    68 shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).cancelable", "true");
    69 shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).propertyName", "'doremi'");
    70 shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).elapsedTime", "123.45");
     73shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).bubbles", "true");
     74shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).cancelable", "true");
     75shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).propertyName", "'doremi'");
     76shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).elapsedTime", "123.45");
     77shouldBe("new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).pseudoElement", "'::after'");
    7178</script>
    7279<script src="../../js/resources/js-test-post.js"></script>
  • trunk/LayoutTests/fast/events/constructors/webkit-transition-event-constructor-expected.txt

    r97225 r141119  
    88PASS new WebKitTransitionEvent('eventType').propertyName is ""
    99PASS new WebKitTransitionEvent('eventType').elapsedTime is 0
     10PASS new WebKitTransitionEvent('eventType').pseudoElement is ""
    1011PASS new WebKitTransitionEvent('eventType', { bubbles: false }).bubbles is false
    1112PASS new WebKitTransitionEvent('eventType', { bubbles: true }).bubbles is true
     
    3233PASS new WebKitTransitionEvent('eventType', { elapsedTime: Infinity }).elapsedTime is Infinity
    3334PASS new WebKitTransitionEvent('eventType', { elapsedTime: -Infinity }).elapsedTime is -Infinity
     35PASS new WebKitTransitionEvent('eventType', { pseudoElement: '::before' }).pseudoElement is "::before"
     36PASS new WebKitTransitionEvent('eventType', { pseudoElement: '' }).pseudoElement is ""
    3437PASS new WebKitTransitionEvent('eventType', { elapsedTime: undefined }).elapsedTime is NaN
    3538PASS new WebKitTransitionEvent('eventType', { elapsedTime: null }).elapsedTime is 0
     
    4346PASS new WebKitTransitionEvent('eventType', { elapsedTime: {doremi: 123.45} }).elapsedTime is NaN
    4447PASS new WebKitTransitionEvent('eventType', { elapsedTime: {valueOf: function () { return 123.45 } } }).elapsedTime is 123.45
    45 PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).bubbles is true
    46 PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).cancelable is true
    47 PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).propertyName is 'doremi'
    48 PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).elapsedTime is 123.45
     48PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).bubbles is true
     49PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).cancelable is true
     50PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).propertyName is 'doremi'
     51PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).elapsedTime is 123.45
     52PASS new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).pseudoElement is '::after'
    4953PASS successfullyParsed is true
    5054
  • trunk/LayoutTests/fast/events/constructors/webkit-transition-event-constructor.html

    r98407 r141119  
    1414shouldBeEqualToString("new WebKitTransitionEvent('eventType').propertyName", "");
    1515shouldBe("new WebKitTransitionEvent('eventType').elapsedTime", "0");
     16shouldBeEqualToString("new WebKitTransitionEvent('eventType').pseudoElement", "");
    1617
    1718// bubbles is passed.
     
    5152shouldBe("new WebKitTransitionEvent('eventType', { elapsedTime: -Infinity }).elapsedTime", "-Infinity");
    5253
     54// pseudoElement is passed.
     55// Strings.
     56shouldBeEqualToString("new WebKitTransitionEvent('eventType', { pseudoElement: '::before' }).pseudoElement", "::before");
     57shouldBeEqualToString("new WebKitTransitionEvent('eventType', { pseudoElement: '' }).pseudoElement", "");
     58
    5359// Non-numeric values.
    5460shouldBe("new WebKitTransitionEvent('eventType', { elapsedTime: undefined }).elapsedTime", "NaN");
     
    6571
    6672// All initializers are passed.
    67 shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).bubbles", "true");
    68 shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).cancelable", "true");
    69 shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).propertyName", "'doremi'");
    70 shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45 }).elapsedTime", "123.45");
     73shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).bubbles", "true");
     74shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).cancelable", "true");
     75shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).propertyName", "'doremi'");
     76shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).elapsedTime", "123.45");
     77shouldBe("new WebKitTransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).pseudoElement", "'::after'");
    7178</script>
    7279<script src="../../js/resources/js-test-post.js"></script>
  • trunk/Source/WebCore/ChangeLog

    r141114 r141119  
     12013-01-29  Alexis Menard  <alexis@webkit.org>
     2
     3        Implement pseudoElement attribute on transition DOM events.
     4        https://bugs.webkit.org/show_bug.cgi?id=107986
     5
     6        Reviewed by Julien Chaffraix.
     7
     8        Implement the pseudoElement attribute documented here :
     9        http://dev.w3.org/csswg/css3-transitions/#transition-events.
     10        This add a new attribute to the transition DOM event useful when
     11        animating pseudo elements. As they are not accessible in JS, it's
     12        very useful to get on which pseudo element the transition just ended.
     13        This patch adds the new attribute on the IDLs of DOM transition events as well
     14        as adding it to the C++ classes representing them. The event
     15        dispatching code have been patched to change the target of the event
     16        (we can't send the current target as it is the actual DOM
     17        representation of the pseudo element).
     18
     19        Test: fast/css-generated-content/pseudo-transition-event.html
     20
     21        * dom/EventDispatcher.cpp:
     22        (WebCore::eventTargetRespectingTargetRules): Change the target of the
     23        event in the case of a pseudo element. We can't expose them through the
     24        public interface so the target is the node they belong to.
     25        (WebCore::EventDispatcher::ensureEventAncestors):
     26        (WebCore::EventDispatcher::dispatchScopedEvent):
     27        (WebCore::EventDispatcher::dispatchEvent):
     28        (WebCore::EventDispatcher::dispatchEventPostProcess):
     29        * dom/EventTarget.cpp:
     30        (WebCore::createMatchingPrefixedEvent):
     31        * dom/PseudoElement.cpp:
     32        (WebCore::PseudoElement::pseudoElementNameForEvents):
     33        (WebCore):
     34        * dom/PseudoElement.h:
     35        * dom/TransitionEvent.cpp:
     36        (WebCore::TransitionEventInit::TransitionEventInit):
     37        (WebCore::TransitionEvent::TransitionEvent):
     38        (WebCore::TransitionEvent::pseudoElement):
     39        (WebCore):
     40        * dom/TransitionEvent.h:
     41        (TransitionEventInit):
     42        (WebCore::TransitionEvent::create):
     43        (TransitionEvent):
     44        * dom/TransitionEvent.idl:
     45        * dom/WebKitTransitionEvent.cpp:
     46        (WebCore::WebKitTransitionEventInit::WebKitTransitionEventInit):
     47        (WebCore::WebKitTransitionEvent::WebKitTransitionEvent):
     48        (WebCore::WebKitTransitionEvent::pseudoElement):
     49        (WebCore):
     50        * dom/WebKitTransitionEvent.h:
     51        (WebKitTransitionEventInit):
     52        (WebCore::WebKitTransitionEvent::create):
     53        (WebKitTransitionEvent):
     54        * dom/WebKitTransitionEvent.idl:
     55        * page/animation/AnimationController.cpp:
     56        (WebCore::AnimationControllerPrivate::fireEventsAndUpdateStyle): Pass
     57        the pseudo element name when creating the Event objects. If the element
     58        is not a pseudo element then the name will be empty which is what the
     59        spec is telling to do. If the element is a pseudo element then the name
     60        will be the pseudo element's name with "::" as a prefix.
     61
    1622013-01-29  Allan Sandfeld Jensen  <allan.jensen@digia.com>
    263
  • trunk/Source/WebCore/dom/EventDispatcher.cpp

    r139325 r141119  
    136136}
    137137
    138 inline static EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNode)
     138inline static EventTarget* eventTargetRespectingTargetRules(Node* referenceNode)
    139139{
    140140    ASSERT(referenceNode);
     141
     142    if (referenceNode->isPseudoElement())
     143        return referenceNode->parentNode();
    141144
    142145#if ENABLE(SVG)
     
    193196        Node* node = walker.get();
    194197        if (targetStack.isEmpty())
    195             targetStack.append(eventTargetRespectingSVGTargetRules(node));
     198            targetStack.append(eventTargetRespectingTargetRules(node));
    196199        else if (walker.crossingInsertionPoint())
    197200            targetStack.append(targetStack.last());
    198         m_ancestors.append(EventContext(node, eventTargetRespectingSVGTargetRules(node), targetStack.last()));
     201        m_ancestors.append(EventContext(node, eventTargetRespectingTargetRules(node), targetStack.last()));
    199202        if (!inDocument)
    200203            return;
     
    213216{
    214217    // We need to set the target here because it can go away by the time we actually fire the event.
    215     mediator->event()->setTarget(eventTargetRespectingSVGTargetRules(node));
     218    mediator->event()->setTarget(eventTargetRespectingTargetRules(node));
    216219    ScopedEventQueue::instance()->enqueueEventDispatchMediator(mediator);
    217220}
     
    254257    ChildNodesLazySnapshot::takeChildNodesLazySnapshot();
    255258
    256     event->setTarget(eventTargetRespectingSVGTargetRules(m_node.get()));
     259    event->setTarget(eventTargetRespectingTargetRules(m_node.get()));
    257260    ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
    258261    ASSERT(event->target());
     
    340343inline void EventDispatcher::dispatchEventPostProcess(PassRefPtr<Event> event, void* preDispatchEventHandlerResult)
    341344{
    342     event->setTarget(eventTargetRespectingSVGTargetRules(m_node.get()));
     345    event->setTarget(eventTargetRespectingTargetRules(m_node.get()));
    343346    event->setCurrentTarget(0);
    344347    event->setEventPhase(0);
  • trunk/Source/WebCore/dom/EventTarget.cpp

    r139922 r141119  
    166166    if (event->type() == eventNames().transitionendEvent) {
    167167        const WebKitTransitionEvent* transitionEvent = static_cast<const WebKitTransitionEvent*>(event);
    168         RefPtr<Event> prefixedEvent = WebKitTransitionEvent::create(eventNames().webkitTransitionEndEvent, transitionEvent->propertyName(), transitionEvent->elapsedTime());
     168        RefPtr<Event> prefixedEvent = WebKitTransitionEvent::create(eventNames().webkitTransitionEndEvent, transitionEvent->propertyName(), transitionEvent->elapsedTime(), transitionEvent->pseudoElement());
    169169        prefixedEvent->setTarget(event->target());
    170170        prefixedEvent->setCurrentTarget(event->currentTarget());
  • trunk/Source/WebCore/dom/PseudoElement.cpp

    r140452 r141119  
    3838    DEFINE_STATIC_LOCAL(QualifiedName, name, (nullAtom, "<pseudo>", nullAtom));
    3939    return name;
     40}
     41
     42String PseudoElement::pseudoElementNameForEvents(PseudoId pseudoId)
     43{
     44    DEFINE_STATIC_LOCAL(const String, after, (ASCIILiteral("::after")));
     45    DEFINE_STATIC_LOCAL(const String, before, (ASCIILiteral("::before")));
     46    switch (pseudoId) {
     47    case AFTER:
     48        return after;
     49    case BEFORE:
     50        return before;
     51    default:
     52        return emptyString();
     53    }
    4054}
    4155
  • trunk/Source/WebCore/dom/PseudoElement.h

    r138832 r141119  
    4949    virtual bool canContainRangeEndPoint() const OVERRIDE { return false; }
    5050
     51    static String pseudoElementNameForEvents(PseudoId);
     52
    5153private:
    5254    PseudoElement(Element*, PseudoId);
    53 
    54     using EventTarget::dispatchEvent;
    55     virtual bool dispatchEvent(PassRefPtr<Event>) OVERRIDE { return false; }
    5655
    5756    virtual void didRecalcStyle(StyleChange) OVERRIDE;
  • trunk/Source/WebCore/dom/TransitionEvent.cpp

    r140448 r141119  
    3535
    3636TransitionEventInit::TransitionEventInit()
    37     : propertyName()
    38     , elapsedTime(0)
     37    : elapsedTime(0)
    3938{
    4039}
    4140
    4241TransitionEvent::TransitionEvent()
    43     : m_propertyName()
    44     , m_elapsedTime(0)
     42    : m_elapsedTime(0)
    4543{
    4644}
    4745
    48 TransitionEvent::TransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime)
     46TransitionEvent::TransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime, const String& pseudoElement)
    4947    : Event(type, true, true)
    5048    , m_propertyName(propertyName)
    5149    , m_elapsedTime(elapsedTime)
     50    , m_pseudoElement(pseudoElement)
    5251{
    5352}
     
    5756    , m_propertyName(initializer.propertyName)
    5857    , m_elapsedTime(initializer.elapsedTime)
     58    , m_pseudoElement(initializer.pseudoElement)
    5959{
    6060}
     
    7474}
    7575
     76const String& TransitionEvent::pseudoElement() const
     77{
     78    return m_pseudoElement;
     79}
     80
    7681const AtomicString& TransitionEvent::interfaceName() const
    7782{
  • trunk/Source/WebCore/dom/TransitionEvent.h

    r140448 r141119  
    3939    String propertyName;
    4040    double elapsedTime;
     41    String pseudoElement;
    4142};
    4243
     
    4748        return adoptRef(new TransitionEvent);
    4849    }
    49     static PassRefPtr<TransitionEvent> create(const AtomicString& type, const String& propertyName, double elapsedTime)
     50    static PassRefPtr<TransitionEvent> create(const AtomicString& type, const String& propertyName, double elapsedTime, const String& pseudoElement)
    5051    {
    51         return adoptRef(new TransitionEvent(type, propertyName, elapsedTime));
     52        return adoptRef(new TransitionEvent(type, propertyName, elapsedTime, pseudoElement));
    5253    }
    5354    static PassRefPtr<TransitionEvent> create(const AtomicString& type, const TransitionEventInit& initializer)
     
    6061    const String& propertyName() const;
    6162    double elapsedTime() const;
     63    const String& pseudoElement() const;
    6264
    6365    virtual const AtomicString& interfaceName() const;
     
    6567private:
    6668    TransitionEvent();
    67     TransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime);
     69    TransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime, const String& pseudoElement);
    6870    TransitionEvent(const AtomicString& type, const TransitionEventInit& initializer);
    6971
    7072    String m_propertyName;
    7173    double m_elapsedTime;
     74    String m_pseudoElement;
    7275};
    7376
  • trunk/Source/WebCore/dom/TransitionEvent.idl

    r140448 r141119  
    3131    [InitializedByEventConstructor] readonly attribute DOMString propertyName;
    3232    [InitializedByEventConstructor] readonly attribute double elapsedTime;
     33    [InitializedByEventConstructor] readonly attribute DOMString pseudoElement;
    3334};
    3435
  • trunk/Source/WebCore/dom/WebKitTransitionEvent.cpp

    r103746 r141119  
    3232
    3333WebKitTransitionEventInit::WebKitTransitionEventInit()
    34     : propertyName()
    35     , elapsedTime(0)
     34    : elapsedTime(0)
    3635{
    3736}
    3837
    3938WebKitTransitionEvent::WebKitTransitionEvent()
    40     : m_propertyName()
    41     , m_elapsedTime(0)
     39    : m_elapsedTime(0)
    4240{
    4341}
    4442
    45 WebKitTransitionEvent::WebKitTransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime)
     43WebKitTransitionEvent::WebKitTransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime, const String& pseudoElement)
    4644    : Event(type, true, true)
    4745    , m_propertyName(propertyName)
    4846    , m_elapsedTime(elapsedTime)
     47    , m_pseudoElement(pseudoElement)
    4948{
    5049}
     
    5453    , m_propertyName(initializer.propertyName)
    5554    , m_elapsedTime(initializer.elapsedTime)
     55    , m_pseudoElement(initializer.pseudoElement)
    5656{
    5757}
     
    7171}
    7272
     73const String& WebKitTransitionEvent::pseudoElement() const
     74{
     75    return m_pseudoElement;
     76}
     77
    7378const AtomicString& WebKitTransitionEvent::interfaceName() const
    7479{
  • trunk/Source/WebCore/dom/WebKitTransitionEvent.h

    r103746 r141119  
    3636    String propertyName;
    3737    double elapsedTime;
     38    String pseudoElement;
    3839};
    3940
     
    4445        return adoptRef(new WebKitTransitionEvent);
    4546    }
    46     static PassRefPtr<WebKitTransitionEvent> create(const AtomicString& type, const String& propertyName, double elapsedTime)
     47    static PassRefPtr<WebKitTransitionEvent> create(const AtomicString& type, const String& propertyName, double elapsedTime, const String& pseudoElement)
    4748    {
    48         return adoptRef(new WebKitTransitionEvent(type, propertyName, elapsedTime));
     49        return adoptRef(new WebKitTransitionEvent(type, propertyName, elapsedTime, pseudoElement));
    4950    }
    5051    static PassRefPtr<WebKitTransitionEvent> create(const AtomicString& type, const WebKitTransitionEventInit& initializer)
     
    5758    const String& propertyName() const;
    5859    double elapsedTime() const;
     60    const String& pseudoElement() const;
    5961
    6062    virtual const AtomicString& interfaceName() const;
     
    6264private:
    6365    WebKitTransitionEvent();
    64     WebKitTransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime);
     66    WebKitTransitionEvent(const AtomicString& type, const String& propertyName, double elapsedTime, const String& pseudoElement);
    6567    WebKitTransitionEvent(const AtomicString& type, const WebKitTransitionEventInit& initializer);
    6668
    6769    String m_propertyName;
    6870    double m_elapsedTime;
     71    String m_pseudoElement;
    6972};
    7073
  • trunk/Source/WebCore/dom/WebKitTransitionEvent.idl

    r131172 r141119  
    2929    [InitializedByEventConstructor] readonly attribute DOMString propertyName;
    3030    [InitializedByEventConstructor] readonly attribute double elapsedTime;
     31    [InitializedByEventConstructor] readonly attribute DOMString pseudoElement;
    3132};
    3233
  • trunk/Source/WebCore/page/animation/AnimationController.cpp

    r140448 r141119  
    3838#include "Frame.h"
    3939#include "FrameView.h"
     40#include "PseudoElement.h"
    4041#include "RenderView.h"
    4142#include "TransitionEvent.h"
     
    181182    Vector<EventToDispatch>::const_iterator eventsToDispatchEnd = eventsToDispatch.end();
    182183    for (Vector<EventToDispatch>::const_iterator it = eventsToDispatch.begin(); it != eventsToDispatchEnd; ++it) {
    183         if (it->eventType == eventNames().transitionendEvent)
     184        Element* element = it->element.get();
     185        if (it->eventType == eventNames().transitionendEvent) {
    184186#if ENABLE(CSS_TRANSFORMS_ANIMATIONS_TRANSITIONS_UNPREFIXED)
    185             it->element->dispatchEvent(TransitionEvent::create(it->eventType, it->name, it->elapsedTime));
     187            element->dispatchEvent(TransitionEvent::create(it->eventType, it->name, it->elapsedTime, PseudoElement::pseudoElementNameForEvents(element->pseudoId())));
    186188#else
    187             it->element->dispatchEvent(WebKitTransitionEvent::create(it->eventType, it->name, it->elapsedTime));
     189            element->dispatchEvent(WebKitTransitionEvent::create(it->eventType, it->name, it->elapsedTime, PseudoElement::pseudoElementNameForEvents(element->pseudoId())));
    188190#endif
    189         else
    190             it->element->dispatchEvent(WebKitAnimationEvent::create(it->eventType, it->name, it->elapsedTime));
     191        } else
     192            element->dispatchEvent(WebKitAnimationEvent::create(it->eventType, it->name, it->elapsedTime));
    191193    }
    192194
Note: See TracChangeset for help on using the changeset viewer.