| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 , m_name(name) | 155 , m_name(name) |
| 156 , m_offset(offset) | 156 , m_offset(offset) |
| 157 , m_repeat(repeat) | 157 , m_repeat(repeat) |
| 158 { | 158 { |
| 159 } | 159 } |
| 160 | 160 |
| 161 SVGSMILElement::SVGSMILElement(const QualifiedName& tagName, Document& doc) | 161 SVGSMILElement::SVGSMILElement(const QualifiedName& tagName, Document& doc) |
| 162 : SVGElement(tagName, doc) | 162 : SVGElement(tagName, doc) |
| 163 , m_attributeName(anyQName()) | 163 , m_attributeName(anyQName()) |
| 164 , m_targetElement(0) | 164 , m_targetElement(0) |
| 165 , m_conditionsConnected(false) | 165 , m_syncBaseConditionsConnected(false) |
| 166 , m_hasEndEventConditions(false) | 166 , m_hasEndEventConditions(false) |
| 167 , m_isWaitingForFirstInterval(true) | 167 , m_isWaitingForFirstInterval(true) |
| 168 , m_intervalBegin(SMILTime::unresolved()) | 168 , m_intervalBegin(SMILTime::unresolved()) |
| 169 , m_intervalEnd(SMILTime::unresolved()) | 169 , m_intervalEnd(SMILTime::unresolved()) |
| 170 , m_previousIntervalBegin(SMILTime::unresolved()) | 170 , m_previousIntervalBegin(SMILTime::unresolved()) |
| 171 , m_activeState(Inactive) | 171 , m_activeState(Inactive) |
| 172 , m_lastPercent(0) | 172 , m_lastPercent(0) |
| 173 , m_lastRepeat(0) | 173 , m_lastRepeat(0) |
| 174 , m_nextProgressTime(0) | 174 , m_nextProgressTime(0) |
| 175 , m_documentOrderIndex(0) | 175 , m_documentOrderIndex(0) |
| 176 , m_cachedDur(invalidCachedTime) | 176 , m_cachedDur(invalidCachedTime) |
| 177 , m_cachedRepeatDur(invalidCachedTime) | 177 , m_cachedRepeatDur(invalidCachedTime) |
| 178 , m_cachedRepeatCount(invalidCachedTime) | 178 , m_cachedRepeatCount(invalidCachedTime) |
| 179 , m_cachedMin(invalidCachedTime) | 179 , m_cachedMin(invalidCachedTime) |
| 180 , m_cachedMax(invalidCachedTime) | 180 , m_cachedMax(invalidCachedTime) |
| 181 { | 181 { |
| 182 resolveFirstInterval(); | 182 resolveFirstInterval(); |
| 183 } | 183 } |
| 184 | 184 |
| 185 SVGSMILElement::~SVGSMILElement() | 185 SVGSMILElement::~SVGSMILElement() |
| 186 { | 186 { |
| 187 clearResourceReferences(); | 187 clearResourceAndEventBaseReferences(); |
| 188 smilEndEventSender().cancelEvent(this); | 188 smilEndEventSender().cancelEvent(this); |
| 189 smilBeginEventSender().cancelEvent(this); | 189 smilBeginEventSender().cancelEvent(this); |
| 190 smilRepeatEventSender().cancelEvent(this); | 190 smilRepeatEventSender().cancelEvent(this); |
| 191 smilRepeatNEventSender().cancelEvent(this); | 191 smilRepeatNEventSender().cancelEvent(this); |
| 192 disconnectConditions(); | 192 disconnectSyncBaseConditions(); |
| 193 disconnectEventBaseConditions(); |
| 193 if (m_timeContainer && m_targetElement && hasValidAttributeName()) | 194 if (m_timeContainer && m_targetElement && hasValidAttributeName()) |
| 194 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); | 195 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); |
| 195 } | 196 } |
| 196 | 197 |
| 197 void SVGSMILElement::clearResourceReferences() | 198 void SVGSMILElement::clearResourceAndEventBaseReferences() |
| 198 { | 199 { |
| 199 document().accessSVGExtensions()->removeAllTargetReferencesForElement(this); | 200 document().accessSVGExtensions()->removeAllTargetReferencesForElement(this); |
| 200 } | 201 } |
| 201 | 202 |
| 202 void SVGSMILElement::buildPendingResource() | 203 void SVGSMILElement::buildPendingResource() |
| 203 { | 204 { |
| 204 clearResourceReferences(); | 205 clearResourceAndEventBaseReferences(); |
| 205 | 206 |
| 206 if (!inDocument()) { | 207 if (!inDocument()) { |
| 207 // Reset the target element if we are no longer in the document. | 208 // Reset the target element if we are no longer in the document. |
| 208 setTargetElement(0); | 209 setTargetElement(0); |
| 209 return; | 210 return; |
| 210 } | 211 } |
| 211 | 212 |
| 212 AtomicString id; | 213 AtomicString id; |
| 213 AtomicString href = getAttribute(XLinkNames::hrefAttr); | 214 AtomicString href = getAttribute(XLinkNames::hrefAttr); |
| 214 Element* target; | 215 Element* target; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 231 | 232 |
| 232 if (!id.isEmpty()) { | 233 if (!id.isEmpty()) { |
| 233 document().accessSVGExtensions()->addPendingResource(id, this); | 234 document().accessSVGExtensions()->addPendingResource(id, this); |
| 234 ASSERT(hasPendingResources()); | 235 ASSERT(hasPendingResources()); |
| 235 } | 236 } |
| 236 } else { | 237 } else { |
| 237 // Register us with the target in the dependencies map. Any change of hr
efElement | 238 // Register us with the target in the dependencies map. Any change of hr
efElement |
| 238 // that leads to relayout/repainting now informs us, so we can react to
it. | 239 // that leads to relayout/repainting now informs us, so we can react to
it. |
| 239 document().accessSVGExtensions()->addElementReferencingTarget(this, svgT
arget); | 240 document().accessSVGExtensions()->addElementReferencingTarget(this, svgT
arget); |
| 240 } | 241 } |
| 242 connectEventBaseConditions(); |
| 241 } | 243 } |
| 242 | 244 |
| 243 static inline QualifiedName constructQualifiedName(const SVGElement* svgElement,
const AtomicString& attributeName) | 245 static inline QualifiedName constructQualifiedName(const SVGElement* svgElement,
const AtomicString& attributeName) |
| 244 { | 246 { |
| 245 ASSERT(svgElement); | 247 ASSERT(svgElement); |
| 246 if (attributeName.isEmpty()) | 248 if (attributeName.isEmpty()) |
| 247 return anyQName(); | 249 return anyQName(); |
| 248 if (!attributeName.contains(':')) | 250 if (!attributeName.contains(':')) |
| 249 return QualifiedName(nullAtom, attributeName, nullAtom); | 251 return QualifiedName(nullAtom, attributeName, nullAtom); |
| 250 | 252 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 m_timeContainer->notifyIntervalsChanged(); | 314 m_timeContainer->notifyIntervalsChanged(); |
| 313 | 315 |
| 314 buildPendingResource(); | 316 buildPendingResource(); |
| 315 | 317 |
| 316 return InsertionDone; | 318 return InsertionDone; |
| 317 } | 319 } |
| 318 | 320 |
| 319 void SVGSMILElement::removedFrom(ContainerNode* rootParent) | 321 void SVGSMILElement::removedFrom(ContainerNode* rootParent) |
| 320 { | 322 { |
| 321 if (rootParent->inDocument()) { | 323 if (rootParent->inDocument()) { |
| 322 clearResourceReferences(); | 324 clearResourceAndEventBaseReferences(); |
| 323 disconnectConditions(); | 325 disconnectSyncBaseConditions(); |
| 326 disconnectEventBaseConditions(); |
| 324 setTargetElement(0); | 327 setTargetElement(0); |
| 325 setAttributeName(anyQName()); | 328 setAttributeName(anyQName()); |
| 326 animationAttributeChanged(); | 329 animationAttributeChanged(); |
| 327 m_timeContainer = 0; | 330 m_timeContainer = 0; |
| 328 } | 331 } |
| 329 | 332 |
| 330 SVGElement::removedFrom(rootParent); | 333 SVGElement::removedFrom(rootParent); |
| 331 } | 334 } |
| 332 | 335 |
| 333 bool SVGSMILElement::hasValidAttributeName() | 336 bool SVGSMILElement::hasValidAttributeName() |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 supportedAttributes.add(SVGNames::attributeNameAttr); | 498 supportedAttributes.add(SVGNames::attributeNameAttr); |
| 496 supportedAttributes.add(XLinkNames::hrefAttr); | 499 supportedAttributes.add(XLinkNames::hrefAttr); |
| 497 } | 500 } |
| 498 return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); | 501 return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); |
| 499 } | 502 } |
| 500 | 503 |
| 501 void SVGSMILElement::parseAttribute(const QualifiedName& name, const AtomicStrin
g& value) | 504 void SVGSMILElement::parseAttribute(const QualifiedName& name, const AtomicStrin
g& value) |
| 502 { | 505 { |
| 503 if (name == SVGNames::beginAttr) { | 506 if (name == SVGNames::beginAttr) { |
| 504 if (!m_conditions.isEmpty()) { | 507 if (!m_conditions.isEmpty()) { |
| 505 disconnectConditions(); | 508 disconnectSyncBaseConditions(); |
| 506 m_conditions.clear(); | 509 m_conditions.clear(); |
| 507 parseBeginOrEnd(fastGetAttribute(SVGNames::endAttr), End); | 510 parseBeginOrEnd(fastGetAttribute(SVGNames::endAttr), End); |
| 508 } | 511 } |
| 509 parseBeginOrEnd(value.string(), Begin); | 512 parseBeginOrEnd(value.string(), Begin); |
| 510 if (inDocument()) | 513 if (inDocument()) |
| 511 connectConditions(); | 514 connectSyncBaseConditions(); |
| 512 } else if (name == SVGNames::endAttr) { | 515 } else if (name == SVGNames::endAttr) { |
| 513 if (!m_conditions.isEmpty()) { | 516 if (!m_conditions.isEmpty()) { |
| 514 disconnectConditions(); | 517 disconnectSyncBaseConditions(); |
| 515 m_conditions.clear(); | 518 m_conditions.clear(); |
| 516 parseBeginOrEnd(fastGetAttribute(SVGNames::beginAttr), Begin); | 519 parseBeginOrEnd(fastGetAttribute(SVGNames::beginAttr), Begin); |
| 517 } | 520 } |
| 518 parseBeginOrEnd(value.string(), End); | 521 parseBeginOrEnd(value.string(), End); |
| 519 if (inDocument()) | 522 if (inDocument()) |
| 520 connectConditions(); | 523 connectSyncBaseConditions(); |
| 521 } else if (name == SVGNames::onbeginAttr) { | 524 } else if (name == SVGNames::onbeginAttr) { |
| 522 setAttributeEventListener(EventTypeNames::beginEvent, createAttributeEve
ntListener(this, name, value)); | 525 setAttributeEventListener(EventTypeNames::beginEvent, createAttributeEve
ntListener(this, name, value)); |
| 523 } else if (name == SVGNames::onendAttr) { | 526 } else if (name == SVGNames::onendAttr) { |
| 524 setAttributeEventListener(EventTypeNames::endEvent, createAttributeEvent
Listener(this, name, value)); | 527 setAttributeEventListener(EventTypeNames::endEvent, createAttributeEvent
Listener(this, name, value)); |
| 525 } else if (name == SVGNames::onrepeatAttr) { | 528 } else if (name == SVGNames::onrepeatAttr) { |
| 526 setAttributeEventListener(EventTypeNames::repeatEvent, createAttributeEv
entListener(this, name, value)); | 529 setAttributeEventListener(EventTypeNames::repeatEvent, createAttributeEv
entListener(this, name, value)); |
| 527 } else | 530 } else |
| 528 SVGElement::parseAttribute(name, value); | 531 SVGElement::parseAttribute(name, value); |
| 529 } | 532 } |
| 530 | 533 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 560 } | 563 } |
| 561 | 564 |
| 562 animationAttributeChanged(); | 565 animationAttributeChanged(); |
| 563 } | 566 } |
| 564 | 567 |
| 565 inline Element* SVGSMILElement::eventBaseFor(const Condition& condition) | 568 inline Element* SVGSMILElement::eventBaseFor(const Condition& condition) |
| 566 { | 569 { |
| 567 return condition.m_baseID.isEmpty() ? targetElement() : treeScope().getEleme
ntById(AtomicString(condition.m_baseID)); | 570 return condition.m_baseID.isEmpty() ? targetElement() : treeScope().getEleme
ntById(AtomicString(condition.m_baseID)); |
| 568 } | 571 } |
| 569 | 572 |
| 570 void SVGSMILElement::connectConditions() | 573 void SVGSMILElement::connectSyncBaseConditions() |
| 571 { | 574 { |
| 572 if (m_conditionsConnected) | 575 if (m_syncBaseConditionsConnected) |
| 573 disconnectConditions(); | 576 disconnectSyncBaseConditions(); |
| 574 m_conditionsConnected = true; | 577 m_syncBaseConditionsConnected = true; |
| 575 for (unsigned n = 0; n < m_conditions.size(); ++n) { | 578 for (unsigned n = 0; n < m_conditions.size(); ++n) { |
| 576 Condition& condition = m_conditions[n]; | 579 Condition& condition = m_conditions[n]; |
| 577 if (condition.m_type == Condition::EventBase) { | 580 if (condition.m_type == Condition::Syncbase) { |
| 578 ASSERT(!condition.m_syncbase); | |
| 579 Element* eventBase = eventBaseFor(condition); | |
| 580 if (!eventBase) | |
| 581 continue; | |
| 582 ASSERT(!condition.m_eventListener); | |
| 583 condition.m_eventListener = ConditionEventListener::create(this, &co
ndition); | |
| 584 eventBase->addEventListener(AtomicString(condition.m_name), conditio
n.m_eventListener, false); | |
| 585 } else if (condition.m_type == Condition::Syncbase) { | |
| 586 ASSERT(!condition.m_baseID.isEmpty()); | 581 ASSERT(!condition.m_baseID.isEmpty()); |
| 587 condition.m_syncbase = treeScope().getElementById(AtomicString(condi
tion.m_baseID)); | 582 condition.m_syncbase = treeScope().getElementById(AtomicString(condi
tion.m_baseID)); |
| 588 if (!condition.m_syncbase || !isSVGSMILElement(*condition.m_syncbase
)) { | 583 if (!condition.m_syncbase || !isSVGSMILElement(*condition.m_syncbase
)) { |
| 589 condition.m_syncbase = 0; | 584 condition.m_syncbase = 0; |
| 590 continue; | 585 continue; |
| 591 } | 586 } |
| 592 toSVGSMILElement(condition.m_syncbase.get())->addTimeDependent(this)
; | 587 toSVGSMILElement(condition.m_syncbase.get())->addSyncBaseDependent(t
his); |
| 593 } | 588 } |
| 594 } | 589 } |
| 595 } | 590 } |
| 596 | 591 |
| 597 void SVGSMILElement::disconnectConditions() | 592 void SVGSMILElement::disconnectSyncBaseConditions() |
| 598 { | 593 { |
| 599 if (!m_conditionsConnected) | 594 if (!m_syncBaseConditionsConnected) |
| 600 return; | 595 return; |
| 601 m_conditionsConnected = false; | 596 m_syncBaseConditionsConnected = false; |
| 597 for (unsigned n = 0; n < m_conditions.size(); ++n) { |
| 598 Condition& condition = m_conditions[n]; |
| 599 if (condition.m_type == Condition::Syncbase) { |
| 600 if (condition.m_syncbase) |
| 601 toSVGSMILElement(condition.m_syncbase.get())->removeSyncBaseDepe
ndent(this); |
| 602 condition.m_syncbase = 0; |
| 603 } |
| 604 } |
| 605 } |
| 606 |
| 607 void SVGSMILElement::connectEventBaseConditions() |
| 608 { |
| 609 disconnectEventBaseConditions(); |
| 602 for (unsigned n = 0; n < m_conditions.size(); ++n) { | 610 for (unsigned n = 0; n < m_conditions.size(); ++n) { |
| 603 Condition& condition = m_conditions[n]; | 611 Condition& condition = m_conditions[n]; |
| 604 if (condition.m_type == Condition::EventBase) { | 612 if (condition.m_type == Condition::EventBase) { |
| 613 ASSERT(!condition.m_syncbase); |
| 614 Element* eventBase = eventBaseFor(condition); |
| 615 if (!eventBase) { |
| 616 if (!condition.m_baseID.isEmpty() && !document().accessSVGExtens
ions()->isElementPendingResource(this, AtomicString(condition.m_baseID))) |
| 617 document().accessSVGExtensions()->addPendingResource(AtomicS
tring(condition.m_baseID), this); |
| 618 continue; |
| 619 } |
| 620 ASSERT(!condition.m_eventListener); |
| 621 condition.m_eventListener = ConditionEventListener::create(this, &co
ndition); |
| 622 eventBase->addEventListener(AtomicString(condition.m_name), conditio
n.m_eventListener, false); |
| 623 document().accessSVGExtensions()->addElementReferencingTarget(this,
toSVGElement(eventBase)); |
| 624 } |
| 625 } |
| 626 } |
| 627 |
| 628 void SVGSMILElement::disconnectEventBaseConditions() |
| 629 { |
| 630 for (unsigned n = 0; n < m_conditions.size(); ++n) { |
| 631 Condition& condition = m_conditions[n]; |
| 632 if (condition.m_type == Condition::EventBase) { |
| 605 ASSERT(!condition.m_syncbase); | 633 ASSERT(!condition.m_syncbase); |
| 606 if (!condition.m_eventListener) | 634 if (!condition.m_eventListener) |
| 607 continue; | 635 continue; |
| 608 // Note: It's a memory optimization to try to remove our condition | 636 // Note: It's a memory optimization to try to remove our condition |
| 609 // event listener, but it's not guaranteed to work, since we have | 637 // event listener, but it's not guaranteed to work, since we have |
| 610 // no guarantee that eventBaseFor() will be able to find our conditi
on's | 638 // no guarantee that eventBaseFor() will be able to find our conditi
on's |
| 611 // original eventBase. So, we also have to disconnect ourselves from | 639 // original eventBase. So, we also have to disconnect ourselves from |
| 612 // our condition event listener, in case it later fires. | 640 // our condition event listener, in case it later fires. |
| 613 Element* eventBase = eventBaseFor(condition); | 641 Element* eventBase = eventBaseFor(condition); |
| 614 if (eventBase) | 642 if (eventBase) |
| 615 eventBase->removeEventListener(AtomicString(condition.m_name), c
ondition.m_eventListener.get(), false); | 643 eventBase->removeEventListener(AtomicString(condition.m_name), c
ondition.m_eventListener.get(), false); |
| 616 condition.m_eventListener->disconnectAnimation(); | 644 condition.m_eventListener->disconnectAnimation(); |
| 617 condition.m_eventListener = 0; | 645 condition.m_eventListener = 0; |
| 618 } else if (condition.m_type == Condition::Syncbase) { | |
| 619 if (condition.m_syncbase) | |
| 620 toSVGSMILElement(condition.m_syncbase.get())->removeTimeDependen
t(this); | |
| 621 } | 646 } |
| 622 condition.m_syncbase = 0; | |
| 623 } | 647 } |
| 624 } | 648 } |
| 625 | 649 |
| 626 void SVGSMILElement::setAttributeName(const QualifiedName& attributeName) | 650 void SVGSMILElement::setAttributeName(const QualifiedName& attributeName) |
| 627 { | 651 { |
| 628 if (m_timeContainer && m_targetElement && m_attributeName != attributeName)
{ | 652 if (m_timeContainer && m_targetElement && m_attributeName != attributeName)
{ |
| 629 if (hasValidAttributeName()) | 653 if (hasValidAttributeName()) |
| 630 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); | 654 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); |
| 631 m_attributeName = attributeName; | 655 m_attributeName = attributeName; |
| 632 if (hasValidAttributeName()) | 656 if (hasValidAttributeName()) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 644 if (m_timeContainer && hasValidAttributeName()) { | 668 if (m_timeContainer && hasValidAttributeName()) { |
| 645 if (m_targetElement) | 669 if (m_targetElement) |
| 646 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); | 670 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); |
| 647 if (target) | 671 if (target) |
| 648 m_timeContainer->schedule(this, target, m_attributeName); | 672 m_timeContainer->schedule(this, target, m_attributeName); |
| 649 } | 673 } |
| 650 | 674 |
| 651 if (m_targetElement) { | 675 if (m_targetElement) { |
| 652 // Clear values that may depend on the previous target. | 676 // Clear values that may depend on the previous target. |
| 653 clearAnimatedType(m_targetElement); | 677 clearAnimatedType(m_targetElement); |
| 654 disconnectConditions(); | 678 disconnectSyncBaseConditions(); |
| 655 } | 679 } |
| 656 | 680 |
| 657 // If the animation state is not Inactive, always reset to a clear state bef
ore leaving the old target element. | 681 // If the animation state is not Inactive, always reset to a clear state bef
ore leaving the old target element. |
| 658 if (m_activeState != Inactive) | 682 if (m_activeState != Inactive) |
| 659 endedActiveInterval(); | 683 endedActiveInterval(); |
| 660 | 684 |
| 661 m_targetElement = target; | 685 m_targetElement = target; |
| 662 } | 686 } |
| 663 | 687 |
| 664 SMILTime SVGSMILElement::elapsed() const | 688 SMILTime SVGSMILElement::elapsed() const |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1091 // Animation does not contribute during the active time if it is past its re
peating duration and has fill=remove. | 1115 // Animation does not contribute during the active time if it is past its re
peating duration and has fill=remove. |
| 1092 return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_int
ervalBegin + repeatingDuration())) || m_activeState == Frozen; | 1116 return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_int
ervalBegin + repeatingDuration())) || m_activeState == Frozen; |
| 1093 } | 1117 } |
| 1094 | 1118 |
| 1095 bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b
ool seekToTime) | 1119 bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b
ool seekToTime) |
| 1096 { | 1120 { |
| 1097 ASSERT(resultElement); | 1121 ASSERT(resultElement); |
| 1098 ASSERT(m_timeContainer); | 1122 ASSERT(m_timeContainer); |
| 1099 ASSERT(m_isWaitingForFirstInterval || m_intervalBegin.isFinite()); | 1123 ASSERT(m_isWaitingForFirstInterval || m_intervalBegin.isFinite()); |
| 1100 | 1124 |
| 1101 if (!m_conditionsConnected) | 1125 if (!m_syncBaseConditionsConnected) |
| 1102 connectConditions(); | 1126 connectSyncBaseConditions(); |
| 1103 | 1127 |
| 1104 if (!m_intervalBegin.isFinite()) { | 1128 if (!m_intervalBegin.isFinite()) { |
| 1105 ASSERT(m_activeState == Inactive); | 1129 ASSERT(m_activeState == Inactive); |
| 1106 m_nextProgressTime = SMILTime::unresolved(); | 1130 m_nextProgressTime = SMILTime::unresolved(); |
| 1107 return false; | 1131 return false; |
| 1108 } | 1132 } |
| 1109 | 1133 |
| 1110 if (elapsed < m_intervalBegin) { | 1134 if (elapsed < m_intervalBegin) { |
| 1111 ASSERT(m_activeState != Active); | 1135 ASSERT(m_activeState != Active); |
| 1112 if (m_activeState == Frozen) { | 1136 if (m_activeState == Frozen) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 return animationIsContributing; | 1212 return animationIsContributing; |
| 1189 } | 1213 } |
| 1190 | 1214 |
| 1191 void SVGSMILElement::notifyDependentsIntervalChanged() | 1215 void SVGSMILElement::notifyDependentsIntervalChanged() |
| 1192 { | 1216 { |
| 1193 ASSERT(m_intervalBegin.isFinite()); | 1217 ASSERT(m_intervalBegin.isFinite()); |
| 1194 DEFINE_STATIC_LOCAL(HashSet<SVGSMILElement*>, loopBreaker, ()); | 1218 DEFINE_STATIC_LOCAL(HashSet<SVGSMILElement*>, loopBreaker, ()); |
| 1195 if (!loopBreaker.add(this).isNewEntry) | 1219 if (!loopBreaker.add(this).isNewEntry) |
| 1196 return; | 1220 return; |
| 1197 | 1221 |
| 1198 TimeDependentSet::iterator end = m_timeDependents.end(); | 1222 TimeDependentSet::iterator end = m_syncBaseDependents.end(); |
| 1199 for (TimeDependentSet::iterator it = m_timeDependents.begin(); it != end; ++
it) { | 1223 for (TimeDependentSet::iterator it = m_syncBaseDependents.begin(); it != end
; ++it) { |
| 1200 SVGSMILElement* dependent = *it; | 1224 SVGSMILElement* dependent = *it; |
| 1201 dependent->createInstanceTimesFromSyncbase(this); | 1225 dependent->createInstanceTimesFromSyncbase(this); |
| 1202 } | 1226 } |
| 1203 | 1227 |
| 1204 loopBreaker.remove(this); | 1228 loopBreaker.remove(this); |
| 1205 } | 1229 } |
| 1206 | 1230 |
| 1207 void SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncbase) | 1231 void SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncbase) |
| 1208 { | 1232 { |
| 1209 // FIXME: To be really correct, this should handle updating exising interval
by changing | 1233 // FIXME: To be really correct, this should handle updating exising interval
by changing |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1220 time = syncbase->m_intervalEnd + condition.m_offset; | 1244 time = syncbase->m_intervalEnd + condition.m_offset; |
| 1221 ASSERT(time.isFinite()); | 1245 ASSERT(time.isFinite()); |
| 1222 if (condition.m_beginOrEnd == Begin) | 1246 if (condition.m_beginOrEnd == Begin) |
| 1223 addBeginTime(elapsed(), time); | 1247 addBeginTime(elapsed(), time); |
| 1224 else | 1248 else |
| 1225 addEndTime(elapsed(), time); | 1249 addEndTime(elapsed(), time); |
| 1226 } | 1250 } |
| 1227 } | 1251 } |
| 1228 } | 1252 } |
| 1229 | 1253 |
| 1230 void SVGSMILElement::addTimeDependent(SVGSMILElement* animation) | 1254 void SVGSMILElement::addSyncBaseDependent(SVGSMILElement* animation) |
| 1231 { | 1255 { |
| 1232 m_timeDependents.add(animation); | 1256 m_syncBaseDependents.add(animation); |
| 1233 if (m_intervalBegin.isFinite()) | 1257 if (m_intervalBegin.isFinite()) |
| 1234 animation->createInstanceTimesFromSyncbase(this); | 1258 animation->createInstanceTimesFromSyncbase(this); |
| 1235 } | 1259 } |
| 1236 | 1260 |
| 1237 void SVGSMILElement::removeTimeDependent(SVGSMILElement* animation) | 1261 void SVGSMILElement::removeSyncBaseDependent(SVGSMILElement* animation) |
| 1238 { | 1262 { |
| 1239 m_timeDependents.remove(animation); | 1263 m_syncBaseDependents.remove(animation); |
| 1240 } | 1264 } |
| 1241 | 1265 |
| 1242 void SVGSMILElement::handleConditionEvent(Event* event, Condition* condition) | 1266 void SVGSMILElement::handleConditionEvent(Event* event, Condition* condition) |
| 1243 { | 1267 { |
| 1244 if (event->type() == "repeatn" && toRepeatEvent(event)->repeat() != conditio
n->m_repeat) | 1268 if (event->type() == "repeatn" && toRepeatEvent(event)->repeat() != conditio
n->m_repeat) |
| 1245 return; | 1269 return; |
| 1246 | 1270 |
| 1247 SMILTime elapsed = this->elapsed(); | 1271 SMILTime elapsed = this->elapsed(); |
| 1248 if (condition->m_beginOrEnd == Begin) | 1272 if (condition->m_beginOrEnd == Begin) |
| 1249 addBeginTime(elapsed, elapsed + condition->m_offset); | 1273 addBeginTime(elapsed, elapsed + condition->m_offset); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1277 if (eventType == "repeatn") { | 1301 if (eventType == "repeatn") { |
| 1278 unsigned repeatEventCount = m_repeatEventCountList.first(); | 1302 unsigned repeatEventCount = m_repeatEventCountList.first(); |
| 1279 m_repeatEventCountList.remove(0); | 1303 m_repeatEventCountList.remove(0); |
| 1280 dispatchEvent(RepeatEvent::create(eventType, repeatEventCount)); | 1304 dispatchEvent(RepeatEvent::create(eventType, repeatEventCount)); |
| 1281 } else { | 1305 } else { |
| 1282 dispatchEvent(Event::create(eventType)); | 1306 dispatchEvent(Event::create(eventType)); |
| 1283 } | 1307 } |
| 1284 } | 1308 } |
| 1285 | 1309 |
| 1286 } | 1310 } |
| OLD | NEW |