Chromium Code Reviews| Index: Source/core/svg/animation/SVGSMILElement.cpp |
| diff --git a/Source/core/svg/animation/SVGSMILElement.cpp b/Source/core/svg/animation/SVGSMILElement.cpp |
| index 0a2596505d2ee7205a6ae00cd0068455fa2488dd..2e43a1a950a8db07dd55abe862b492747e1928b7 100644 |
| --- a/Source/core/svg/animation/SVGSMILElement.cpp |
| +++ b/Source/core/svg/animation/SVGSMILElement.cpp |
| @@ -57,6 +57,12 @@ static SMILEventSender& smilBeginEventSender() |
| return sender; |
| } |
| +static SMILEventSender& smilRepeatEventSender() |
| +{ |
| + DEFINE_STATIC_LOCAL(SMILEventSender, sender, ("repeatEvent")); |
| + return sender; |
| +} |
| + |
| // This is used for duration type time values that can't be negative. |
| static const double invalidCachedTime = -1.; |
| @@ -148,6 +154,7 @@ SVGSMILElement::~SVGSMILElement() |
| clearResourceReferences(); |
| smilEndEventSender().cancelEvent(this); |
| smilBeginEventSender().cancelEvent(this); |
| + smilRepeatEventSender().cancelEvent(this); |
| disconnectConditions(); |
| if (m_timeContainer && m_targetElement && hasValidAttributeName()) |
| m_timeContainer->unschedule(this, m_targetElement, m_attributeName); |
| @@ -1117,6 +1124,9 @@ bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b |
| startedActiveInterval(); |
| } |
| + if (repeat && repeat != m_lastRepeat) |
| + smilRepeatEventSender().dispatchEventSoon(this); |
| + |
| updateAnimation(percent, repeat, resultElement); |
| m_lastPercent = percent; |
| m_lastRepeat = repeat; |
| @@ -1135,6 +1145,15 @@ bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b |
| smilBeginEventSender().dispatchEventSoon(this); |
| if (m_activeState == Inactive || m_activeState == Frozen) |
| smilEndEventSender().dispatchEventSoon(this); |
| + if (repeat) { |
| + int count = 1; |
| + while (count < repeat) { |
|
pdr.
2013/08/31 02:28:08
A for loop would be cleaner here:
for (int repeatE
pavane
2013/08/31 03:30:11
done.
|
| + smilRepeatEventSender().dispatchEventSoon(this); |
| + count++; |
| + } |
| + if (m_activeState == Inactive) |
| + smilRepeatEventSender().dispatchEventSoon(this); |
| + } |
| } |
| m_nextProgressTime = calculateNextProgressTime(elapsed); |
| @@ -1215,7 +1234,7 @@ void SVGSMILElement::endedActiveInterval() |
| void SVGSMILElement::dispatchPendingEvent(SMILEventSender* eventSender) |
| { |
| - ASSERT(eventSender == &smilEndEventSender() || eventSender == &smilBeginEventSender()); |
| + ASSERT(eventSender == &smilEndEventSender() || eventSender == &smilBeginEventSender() || eventSender == &smilRepeatEventSender()); |
| const AtomicString& eventType = eventSender->eventType(); |
| dispatchEvent(Event::create(eventType)); |
| } |