| Index: Source/core/svg/animation/SVGSMILElement.cpp
|
| diff --git a/Source/core/svg/animation/SVGSMILElement.cpp b/Source/core/svg/animation/SVGSMILElement.cpp
|
| index aaa39d929f2665b29e14044bda8185c54b06e170..9548bc89dbaf6effde2533020357b98219b5f8c5 100644
|
| --- a/Source/core/svg/animation/SVGSMILElement.cpp
|
| +++ b/Source/core/svg/animation/SVGSMILElement.cpp
|
| @@ -490,9 +490,11 @@ void SVGSMILElement::parseBeginOrEnd(const String& parseString, BeginOrEnd begin
|
| Vector<SMILTimeWithOrigin>& timeList = beginOrEnd == Begin ? m_beginTimes : m_endTimes;
|
| if (beginOrEnd == End)
|
| m_hasEndEventConditions = false;
|
| - HashSet<double> existing;
|
| - for (unsigned n = 0; n < timeList.size(); ++n)
|
| - existing.add(timeList[n].time().value());
|
| + HashSet<SMILTime> existing;
|
| + for (unsigned n = 0; n < timeList.size(); ++n) {
|
| + if (!timeList[n].time().isUnresolved())
|
| + existing.add(timeList[n].time().value());
|
| + }
|
| Vector<String> splitString;
|
| parseString.split(';', splitString);
|
| for (unsigned n = 0; n < splitString.size(); ++n) {
|
| @@ -806,7 +808,6 @@ SMILTime SVGSMILElement::simpleDuration() const
|
|
|
| void SVGSMILElement::addBeginTime(SMILTime eventTime, SMILTime beginTime, SMILTimeWithOrigin::Origin origin)
|
| {
|
| - ASSERT(!std::isnan(beginTime.value()));
|
| m_beginTimes.append(SMILTimeWithOrigin(beginTime, origin));
|
| sortTimeList(m_beginTimes);
|
| beginListChanged(eventTime);
|
| @@ -814,7 +815,6 @@ void SVGSMILElement::addBeginTime(SMILTime eventTime, SMILTime beginTime, SMILTi
|
|
|
| void SVGSMILElement::addEndTime(SMILTime eventTime, SMILTime endTime, SMILTimeWithOrigin::Origin origin)
|
| {
|
| - ASSERT(!std::isnan(endTime.value()));
|
| m_endTimes.append(SMILTimeWithOrigin(endTime, origin));
|
| sortTimeList(m_endTimes);
|
| endListChanged(eventTime);
|
| @@ -872,8 +872,11 @@ SMILTime SVGSMILElement::repeatingDuration() const
|
| SMILTime simpleDuration = this->simpleDuration();
|
| if (!simpleDuration || (repeatDur.isUnresolved() && repeatCount.isUnresolved()))
|
| return simpleDuration;
|
| + repeatDur = std::min(repeatDur, SMILTime::indefinite());
|
| SMILTime repeatCountDuration = simpleDuration * repeatCount;
|
| - return std::min(repeatCountDuration, std::min(repeatDur, SMILTime::indefinite()));
|
| + if (!repeatCountDuration.isUnresolved())
|
| + return std::min(repeatDur, repeatCountDuration);
|
| + return repeatDur;
|
| }
|
|
|
| SMILTime SVGSMILElement::resolveActiveEnd(SMILTime resolvedBegin, SMILTime resolvedEnd) const
|
| @@ -940,7 +943,7 @@ void SVGSMILElement::resolveFirstInterval()
|
| if (!firstInterval.begin.isUnresolved() && firstInterval != m_interval) {
|
| m_interval = firstInterval;
|
| notifyDependentsIntervalChanged();
|
| - m_nextProgressTime = std::min(m_nextProgressTime, m_interval.begin);
|
| + m_nextProgressTime = m_nextProgressTime.isUnresolved() ? m_interval.begin : std::min(m_nextProgressTime, m_interval.begin);
|
|
|
| if (m_timeContainer)
|
| m_timeContainer->notifyIntervalsChanged();
|
| @@ -955,7 +958,7 @@ bool SVGSMILElement::resolveNextInterval()
|
| if (!nextInterval.begin.isUnresolved() && nextInterval.begin != m_interval.begin) {
|
| m_interval = nextInterval;
|
| notifyDependentsIntervalChanged();
|
| - m_nextProgressTime = std::min(m_nextProgressTime, m_interval.begin);
|
| + m_nextProgressTime = m_nextProgressTime.isUnresolved() ? m_interval.begin : std::min(m_nextProgressTime, m_interval.begin);
|
| return true;
|
| }
|
|
|
| @@ -1274,10 +1277,13 @@ void SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncBase)
|
| time = syncBase->m_interval.end + condition->offset();
|
| if (!time.isFinite())
|
| continue;
|
| + SMILTime elapsed = this->elapsed();
|
| + if (elapsed.isUnresolved())
|
| + continue;
|
| if (condition->beginOrEnd() == Begin)
|
| - addBeginTime(elapsed(), time);
|
| + addBeginTime(elapsed, time);
|
| else
|
| - addEndTime(elapsed(), time);
|
| + addEndTime(elapsed, time);
|
| }
|
| }
|
| }
|
| @@ -1300,6 +1306,8 @@ void SVGSMILElement::handleConditionEvent(Event* event, Condition* condition)
|
| return;
|
|
|
| SMILTime elapsed = this->elapsed();
|
| + if (elapsed.isUnresolved())
|
| + return;
|
| if (condition->beginOrEnd() == Begin)
|
| addBeginTime(elapsed, elapsed + condition->offset());
|
| else
|
| @@ -1309,6 +1317,8 @@ void SVGSMILElement::handleConditionEvent(Event* event, Condition* condition)
|
| void SVGSMILElement::beginByLinkActivation()
|
| {
|
| SMILTime elapsed = this->elapsed();
|
| + if (elapsed.isUnresolved())
|
| + return;
|
| addBeginTime(elapsed, elapsed);
|
| }
|
|
|
|
|