Chromium Code Reviews| 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 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 154 , m_name(name) | 154 , m_name(name) |
| 155 , m_offset(offset) | 155 , m_offset(offset) |
| 156 , m_repeat(repeat) | 156 , m_repeat(repeat) |
| 157 { | 157 { |
| 158 } | 158 } |
| 159 | 159 |
| 160 SVGSMILElement::SVGSMILElement(const QualifiedName& tagName, Document& doc) | 160 SVGSMILElement::SVGSMILElement(const QualifiedName& tagName, Document& doc) |
| 161 : SVGElement(tagName, doc) | 161 : SVGElement(tagName, doc) |
| 162 , m_attributeName(anyQName()) | 162 , m_attributeName(anyQName()) |
| 163 , m_targetElement(0) | 163 , m_targetElement(0) |
| 164 , m_conditionsConnected(false) | 164 , m_syncBaseConditionsConnected(false) |
| 165 , m_hasEndEventConditions(false) | 165 , m_hasEndEventConditions(false) |
| 166 , m_isWaitingForFirstInterval(true) | 166 , m_isWaitingForFirstInterval(true) |
| 167 , m_intervalBegin(SMILTime::unresolved()) | 167 , m_intervalBegin(SMILTime::unresolved()) |
| 168 , m_intervalEnd(SMILTime::unresolved()) | 168 , m_intervalEnd(SMILTime::unresolved()) |
| 169 , m_previousIntervalBegin(SMILTime::unresolved()) | 169 , m_previousIntervalBegin(SMILTime::unresolved()) |
| 170 , m_activeState(Inactive) | 170 , m_activeState(Inactive) |
| 171 , m_lastPercent(0) | 171 , m_lastPercent(0) |
| 172 , m_lastRepeat(0) | 172 , m_lastRepeat(0) |
| 173 , m_nextProgressTime(0) | 173 , m_nextProgressTime(0) |
| 174 , m_documentOrderIndex(0) | 174 , m_documentOrderIndex(0) |
| 175 , m_cachedDur(invalidCachedTime) | 175 , m_cachedDur(invalidCachedTime) |
| 176 , m_cachedRepeatDur(invalidCachedTime) | 176 , m_cachedRepeatDur(invalidCachedTime) |
| 177 , m_cachedRepeatCount(invalidCachedTime) | 177 , m_cachedRepeatCount(invalidCachedTime) |
| 178 , m_cachedMin(invalidCachedTime) | 178 , m_cachedMin(invalidCachedTime) |
| 179 , m_cachedMax(invalidCachedTime) | 179 , m_cachedMax(invalidCachedTime) |
| 180 { | 180 { |
| 181 resolveFirstInterval(); | 181 resolveFirstInterval(); |
| 182 } | 182 } |
| 183 | 183 |
| 184 SVGSMILElement::~SVGSMILElement() | 184 SVGSMILElement::~SVGSMILElement() |
| 185 { | 185 { |
| 186 clearResourceReferences(); | 186 clearResourceReferences(); |
| 187 smilEndEventSender().cancelEvent(this); | 187 smilEndEventSender().cancelEvent(this); |
| 188 smilBeginEventSender().cancelEvent(this); | 188 smilBeginEventSender().cancelEvent(this); |
| 189 smilRepeatEventSender().cancelEvent(this); | 189 smilRepeatEventSender().cancelEvent(this); |
| 190 smilRepeatNEventSender().cancelEvent(this); | 190 smilRepeatNEventSender().cancelEvent(this); |
| 191 disconnectConditions(); | 191 disconnectSyncBaseConditions(); |
| 192 disconnectEventBaseConditions(); | |
| 192 if (m_timeContainer && m_targetElement && hasValidAttributeName()) | 193 if (m_timeContainer && m_targetElement && hasValidAttributeName()) |
| 193 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); | 194 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); |
| 194 } | 195 } |
| 195 | 196 |
| 196 void SVGSMILElement::clearResourceReferences() | 197 void SVGSMILElement::clearResourceReferences() |
| 197 { | 198 { |
| 198 document().accessSVGExtensions()->removeAllTargetReferencesForElement(this); | 199 document().accessSVGExtensions()->removeAllTargetReferencesForElement(this); |
|
pdr.
2014/01/07 00:25:28
This will also clear the event base conditions we
pavane
2014/01/07 18:20:58
Done.
| |
| 199 } | 200 } |
| 200 | 201 |
| 201 void SVGSMILElement::buildPendingResource() | 202 void SVGSMILElement::buildPendingResource() |
| 202 { | 203 { |
| 203 clearResourceReferences(); | 204 clearResourceReferences(); |
| 204 | 205 |
| 205 if (!inDocument()) { | 206 if (!inDocument()) { |
| 206 // Reset the target element if we are no longer in the document. | 207 // Reset the target element if we are no longer in the document. |
| 207 setTargetElement(0); | 208 setTargetElement(0); |
| 208 return; | 209 return; |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 230 | 231 |
| 231 if (!id.isEmpty()) { | 232 if (!id.isEmpty()) { |
| 232 document().accessSVGExtensions()->addPendingResource(id, this); | 233 document().accessSVGExtensions()->addPendingResource(id, this); |
| 233 ASSERT(hasPendingResources()); | 234 ASSERT(hasPendingResources()); |
| 234 } | 235 } |
| 235 } else { | 236 } else { |
| 236 // Register us with the target in the dependencies map. Any change of hr efElement | 237 // Register us with the target in the dependencies map. Any change of hr efElement |
| 237 // that leads to relayout/repainting now informs us, so we can react to it. | 238 // that leads to relayout/repainting now informs us, so we can react to it. |
| 238 document().accessSVGExtensions()->addElementReferencingTarget(this, svgT arget); | 239 document().accessSVGExtensions()->addElementReferencingTarget(this, svgT arget); |
| 239 } | 240 } |
| 241 connectEventBaseConditions(); | |
| 240 } | 242 } |
| 241 | 243 |
| 242 static inline QualifiedName constructQualifiedName(const SVGElement* svgElement, const AtomicString& attributeName) | 244 static inline QualifiedName constructQualifiedName(const SVGElement* svgElement, const AtomicString& attributeName) |
| 243 { | 245 { |
| 244 ASSERT(svgElement); | 246 ASSERT(svgElement); |
| 245 if (attributeName.isEmpty()) | 247 if (attributeName.isEmpty()) |
| 246 return anyQName(); | 248 return anyQName(); |
| 247 if (!attributeName.contains(':')) | 249 if (!attributeName.contains(':')) |
| 248 return QualifiedName(nullAtom, attributeName, nullAtom); | 250 return QualifiedName(nullAtom, attributeName, nullAtom); |
| 249 | 251 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 312 | 314 |
| 313 buildPendingResource(); | 315 buildPendingResource(); |
| 314 | 316 |
| 315 return InsertionDone; | 317 return InsertionDone; |
| 316 } | 318 } |
| 317 | 319 |
| 318 void SVGSMILElement::removedFrom(ContainerNode* rootParent) | 320 void SVGSMILElement::removedFrom(ContainerNode* rootParent) |
| 319 { | 321 { |
| 320 if (rootParent->inDocument()) { | 322 if (rootParent->inDocument()) { |
| 321 clearResourceReferences(); | 323 clearResourceReferences(); |
| 322 disconnectConditions(); | 324 disconnectSyncBaseConditions(); |
| 325 disconnectEventBaseConditions(); | |
| 323 setTargetElement(0); | 326 setTargetElement(0); |
| 324 setAttributeName(anyQName()); | 327 setAttributeName(anyQName()); |
| 325 animationAttributeChanged(); | 328 animationAttributeChanged(); |
| 326 m_timeContainer = 0; | 329 m_timeContainer = 0; |
| 327 } | 330 } |
| 328 | 331 |
| 329 SVGElement::removedFrom(rootParent); | 332 SVGElement::removedFrom(rootParent); |
| 330 } | 333 } |
| 331 | 334 |
| 332 bool SVGSMILElement::hasValidAttributeName() | 335 bool SVGSMILElement::hasValidAttributeName() |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 494 supportedAttributes.add(SVGNames::attributeNameAttr); | 497 supportedAttributes.add(SVGNames::attributeNameAttr); |
| 495 supportedAttributes.add(XLinkNames::hrefAttr); | 498 supportedAttributes.add(XLinkNames::hrefAttr); |
| 496 } | 499 } |
| 497 return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); | 500 return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName); |
| 498 } | 501 } |
| 499 | 502 |
| 500 void SVGSMILElement::parseAttribute(const QualifiedName& name, const AtomicStrin g& value) | 503 void SVGSMILElement::parseAttribute(const QualifiedName& name, const AtomicStrin g& value) |
| 501 { | 504 { |
| 502 if (name == SVGNames::beginAttr) { | 505 if (name == SVGNames::beginAttr) { |
| 503 if (!m_conditions.isEmpty()) { | 506 if (!m_conditions.isEmpty()) { |
| 504 disconnectConditions(); | 507 disconnectSyncBaseConditions(); |
|
pdr.
2014/01/07 00:25:28
Why disconnect sync base but not disconnect event
pavane
2014/01/07 18:20:58
event base functionality is based on adding event
| |
| 505 m_conditions.clear(); | 508 m_conditions.clear(); |
| 506 parseBeginOrEnd(fastGetAttribute(SVGNames::endAttr), End); | 509 parseBeginOrEnd(fastGetAttribute(SVGNames::endAttr), End); |
| 507 } | 510 } |
| 508 parseBeginOrEnd(value.string(), Begin); | 511 parseBeginOrEnd(value.string(), Begin); |
| 509 if (inDocument()) | 512 if (inDocument()) |
| 510 connectConditions(); | 513 connectSyncBaseConditions(); |
| 511 } else if (name == SVGNames::endAttr) { | 514 } else if (name == SVGNames::endAttr) { |
| 512 if (!m_conditions.isEmpty()) { | 515 if (!m_conditions.isEmpty()) { |
| 513 disconnectConditions(); | 516 disconnectSyncBaseConditions(); |
| 514 m_conditions.clear(); | 517 m_conditions.clear(); |
| 515 parseBeginOrEnd(fastGetAttribute(SVGNames::beginAttr), Begin); | 518 parseBeginOrEnd(fastGetAttribute(SVGNames::beginAttr), Begin); |
| 516 } | 519 } |
| 517 parseBeginOrEnd(value.string(), End); | 520 parseBeginOrEnd(value.string(), End); |
| 518 if (inDocument()) | 521 if (inDocument()) |
| 519 connectConditions(); | 522 connectSyncBaseConditions(); |
| 520 } else | 523 } else |
| 521 SVGElement::parseAttribute(name, value); | 524 SVGElement::parseAttribute(name, value); |
| 522 } | 525 } |
| 523 | 526 |
| 524 void SVGSMILElement::svgAttributeChanged(const QualifiedName& attrName) | 527 void SVGSMILElement::svgAttributeChanged(const QualifiedName& attrName) |
| 525 { | 528 { |
| 526 if (!isSupportedAttribute(attrName)) { | 529 if (!isSupportedAttribute(attrName)) { |
| 527 SVGElement::svgAttributeChanged(attrName); | 530 SVGElement::svgAttributeChanged(attrName); |
| 528 return; | 531 return; |
| 529 } | 532 } |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 553 } | 556 } |
| 554 | 557 |
| 555 animationAttributeChanged(); | 558 animationAttributeChanged(); |
| 556 } | 559 } |
| 557 | 560 |
| 558 inline Element* SVGSMILElement::eventBaseFor(const Condition& condition) | 561 inline Element* SVGSMILElement::eventBaseFor(const Condition& condition) |
| 559 { | 562 { |
| 560 return condition.m_baseID.isEmpty() ? targetElement() : treeScope().getEleme ntById(AtomicString(condition.m_baseID)); | 563 return condition.m_baseID.isEmpty() ? targetElement() : treeScope().getEleme ntById(AtomicString(condition.m_baseID)); |
| 561 } | 564 } |
| 562 | 565 |
| 563 void SVGSMILElement::connectConditions() | 566 void SVGSMILElement::connectSyncBaseConditions() |
| 564 { | 567 { |
| 565 if (m_conditionsConnected) | 568 if (m_syncBaseConditionsConnected) |
| 566 disconnectConditions(); | 569 disconnectSyncBaseConditions(); |
| 567 m_conditionsConnected = true; | 570 m_syncBaseConditionsConnected = true; |
| 568 for (unsigned n = 0; n < m_conditions.size(); ++n) { | 571 for (unsigned n = 0; n < m_conditions.size(); ++n) { |
| 569 Condition& condition = m_conditions[n]; | 572 Condition& condition = m_conditions[n]; |
| 570 if (condition.m_type == Condition::EventBase) { | 573 if (condition.m_type == Condition::Syncbase) { |
| 571 ASSERT(!condition.m_syncbase); | |
| 572 Element* eventBase = eventBaseFor(condition); | |
| 573 if (!eventBase) | |
| 574 continue; | |
| 575 ASSERT(!condition.m_eventListener); | |
| 576 condition.m_eventListener = ConditionEventListener::create(this, &co ndition); | |
| 577 eventBase->addEventListener(AtomicString(condition.m_name), conditio n.m_eventListener, false); | |
| 578 } else if (condition.m_type == Condition::Syncbase) { | |
| 579 ASSERT(!condition.m_baseID.isEmpty()); | 574 ASSERT(!condition.m_baseID.isEmpty()); |
| 580 condition.m_syncbase = treeScope().getElementById(AtomicString(condi tion.m_baseID)); | 575 condition.m_syncbase = treeScope().getElementById(AtomicString(condi tion.m_baseID)); |
| 581 if (!condition.m_syncbase || !isSVGSMILElement(*condition.m_syncbase )) { | 576 if (!condition.m_syncbase || !isSVGSMILElement(*condition.m_syncbase )) { |
| 582 condition.m_syncbase = 0; | 577 condition.m_syncbase = 0; |
| 583 continue; | 578 continue; |
| 584 } | 579 } |
| 585 toSVGSMILElement(condition.m_syncbase.get())->addTimeDependent(this) ; | 580 toSVGSMILElement(condition.m_syncbase.get())->addSyncBaseDependent(t his); |
| 586 } | 581 } |
| 587 } | 582 } |
| 588 } | 583 } |
| 589 | 584 |
| 590 void SVGSMILElement::disconnectConditions() | 585 void SVGSMILElement::disconnectSyncBaseConditions() |
| 591 { | 586 { |
| 592 if (!m_conditionsConnected) | 587 if (!m_syncBaseConditionsConnected) |
| 593 return; | 588 return; |
| 594 m_conditionsConnected = false; | 589 m_syncBaseConditionsConnected = false; |
| 590 for (unsigned n = 0; n < m_conditions.size(); ++n) { | |
| 591 Condition& condition = m_conditions[n]; | |
| 592 if (condition.m_type == Condition::Syncbase) { | |
| 593 if (condition.m_syncbase) | |
| 594 toSVGSMILElement(condition.m_syncbase.get())->removeSyncBaseDepe ndent(this); | |
| 595 condition.m_syncbase = 0; | |
| 596 } | |
| 597 } | |
| 598 } | |
| 599 | |
| 600 void SVGSMILElement::connectEventBaseConditions() | |
| 601 { | |
| 602 disconnectEventBaseConditions(); | |
| 595 for (unsigned n = 0; n < m_conditions.size(); ++n) { | 603 for (unsigned n = 0; n < m_conditions.size(); ++n) { |
| 596 Condition& condition = m_conditions[n]; | 604 Condition& condition = m_conditions[n]; |
| 597 if (condition.m_type == Condition::EventBase) { | 605 if (condition.m_type == Condition::EventBase) { |
| 606 ASSERT(!condition.m_syncbase); | |
| 607 Element* eventBase = eventBaseFor(condition); | |
| 608 if (!eventBase) { | |
|
pdr.
2014/01/07 00:25:28
Can you add an assert here that we don't add a pen
pavane
2014/01/07 18:20:58
Done.
| |
| 609 document().accessSVGExtensions()->addPendingResource(condition.m _baseID, this); | |
|
pdr.
2014/01/07 00:25:28
Can you assert that m_baseID is not empty?
pavane
2014/01/07 18:20:58
Done.
| |
| 610 continue; | |
| 611 } | |
| 612 ASSERT(!condition.m_eventListener); | |
| 613 condition.m_eventListener = ConditionEventListener::create(this, &co ndition); | |
| 614 eventBase->addEventListener(AtomicString(condition.m_name), conditio n.m_eventListener, false); | |
| 615 document().accessSVGExtensions()->addElementReferencingTarget(this, toSVGElement(eventBase)); | |
|
pdr.
2014/01/07 00:25:28
Here you add an element referencing a target but n
pavane
2014/01/07 18:20:58
I think it is handled already. We are calling disc
| |
| 616 } | |
| 617 } | |
| 618 } | |
| 619 | |
| 620 void SVGSMILElement::disconnectEventBaseConditions() | |
| 621 { | |
| 622 for (unsigned n = 0; n < m_conditions.size(); ++n) { | |
| 623 Condition& condition = m_conditions[n]; | |
| 624 if (condition.m_type == Condition::EventBase) { | |
| 598 ASSERT(!condition.m_syncbase); | 625 ASSERT(!condition.m_syncbase); |
| 599 if (!condition.m_eventListener) | 626 if (!condition.m_eventListener) |
| 600 continue; | 627 continue; |
| 601 // Note: It's a memory optimization to try to remove our condition | 628 // Note: It's a memory optimization to try to remove our condition |
| 602 // event listener, but it's not guaranteed to work, since we have | 629 // event listener, but it's not guaranteed to work, since we have |
| 603 // no guarantee that eventBaseFor() will be able to find our conditi on's | 630 // no guarantee that eventBaseFor() will be able to find our conditi on's |
| 604 // original eventBase. So, we also have to disconnect ourselves from | 631 // original eventBase. So, we also have to disconnect ourselves from |
| 605 // our condition event listener, in case it later fires. | 632 // our condition event listener, in case it later fires. |
| 606 Element* eventBase = eventBaseFor(condition); | 633 Element* eventBase = eventBaseFor(condition); |
| 607 if (eventBase) | 634 if (eventBase) |
| 608 eventBase->removeEventListener(AtomicString(condition.m_name), c ondition.m_eventListener.get(), false); | 635 eventBase->removeEventListener(AtomicString(condition.m_name), c ondition.m_eventListener.get(), false); |
| 609 condition.m_eventListener->disconnectAnimation(); | 636 condition.m_eventListener->disconnectAnimation(); |
| 610 condition.m_eventListener = 0; | 637 condition.m_eventListener = 0; |
| 611 } else if (condition.m_type == Condition::Syncbase) { | |
| 612 if (condition.m_syncbase) | |
| 613 toSVGSMILElement(condition.m_syncbase.get())->removeTimeDependen t(this); | |
| 614 } | 638 } |
| 615 condition.m_syncbase = 0; | |
| 616 } | 639 } |
| 617 } | 640 } |
| 618 | 641 |
| 619 void SVGSMILElement::setAttributeName(const QualifiedName& attributeName) | 642 void SVGSMILElement::setAttributeName(const QualifiedName& attributeName) |
| 620 { | 643 { |
| 621 if (m_timeContainer && m_targetElement && m_attributeName != attributeName) { | 644 if (m_timeContainer && m_targetElement && m_attributeName != attributeName) { |
| 622 if (hasValidAttributeName()) | 645 if (hasValidAttributeName()) |
| 623 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); | 646 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); |
| 624 m_attributeName = attributeName; | 647 m_attributeName = attributeName; |
| 625 if (hasValidAttributeName()) | 648 if (hasValidAttributeName()) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 637 if (m_timeContainer && hasValidAttributeName()) { | 660 if (m_timeContainer && hasValidAttributeName()) { |
| 638 if (m_targetElement) | 661 if (m_targetElement) |
| 639 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); | 662 m_timeContainer->unschedule(this, m_targetElement, m_attributeName); |
| 640 if (target) | 663 if (target) |
| 641 m_timeContainer->schedule(this, target, m_attributeName); | 664 m_timeContainer->schedule(this, target, m_attributeName); |
| 642 } | 665 } |
| 643 | 666 |
| 644 if (m_targetElement) { | 667 if (m_targetElement) { |
| 645 // Clear values that may depend on the previous target. | 668 // Clear values that may depend on the previous target. |
| 646 clearAnimatedType(m_targetElement); | 669 clearAnimatedType(m_targetElement); |
| 647 disconnectConditions(); | 670 disconnectSyncBaseConditions(); |
| 648 } | 671 } |
| 649 | 672 |
| 650 // If the animation state is not Inactive, always reset to a clear state bef ore leaving the old target element. | 673 // If the animation state is not Inactive, always reset to a clear state bef ore leaving the old target element. |
| 651 if (m_activeState != Inactive) | 674 if (m_activeState != Inactive) |
| 652 endedActiveInterval(); | 675 endedActiveInterval(); |
| 653 | 676 |
| 654 m_targetElement = target; | 677 m_targetElement = target; |
| 655 } | 678 } |
| 656 | 679 |
| 657 SMILTime SVGSMILElement::elapsed() const | 680 SMILTime SVGSMILElement::elapsed() const |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1088 // Animation does not contribute during the active time if it is past its re peating duration and has fill=remove. | 1111 // Animation does not contribute during the active time if it is past its re peating duration and has fill=remove. |
| 1089 return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_int ervalBegin + repeatingDuration())) || m_activeState == Frozen; | 1112 return (m_activeState == Active && (fill() == FillFreeze || elapsed <= m_int ervalBegin + repeatingDuration())) || m_activeState == Frozen; |
| 1090 } | 1113 } |
| 1091 | 1114 |
| 1092 bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b ool seekToTime) | 1115 bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b ool seekToTime) |
| 1093 { | 1116 { |
| 1094 ASSERT(resultElement); | 1117 ASSERT(resultElement); |
| 1095 ASSERT(m_timeContainer); | 1118 ASSERT(m_timeContainer); |
| 1096 ASSERT(m_isWaitingForFirstInterval || m_intervalBegin.isFinite()); | 1119 ASSERT(m_isWaitingForFirstInterval || m_intervalBegin.isFinite()); |
| 1097 | 1120 |
| 1098 if (!m_conditionsConnected) | 1121 if (!m_syncBaseConditionsConnected) |
| 1099 connectConditions(); | 1122 connectSyncBaseConditions(); |
| 1100 | 1123 |
| 1101 if (!m_intervalBegin.isFinite()) { | 1124 if (!m_intervalBegin.isFinite()) { |
| 1102 ASSERT(m_activeState == Inactive); | 1125 ASSERT(m_activeState == Inactive); |
| 1103 m_nextProgressTime = SMILTime::unresolved(); | 1126 m_nextProgressTime = SMILTime::unresolved(); |
| 1104 return false; | 1127 return false; |
| 1105 } | 1128 } |
| 1106 | 1129 |
| 1107 if (elapsed < m_intervalBegin) { | 1130 if (elapsed < m_intervalBegin) { |
| 1108 ASSERT(m_activeState != Active); | 1131 ASSERT(m_activeState != Active); |
| 1109 if (m_activeState == Frozen) { | 1132 if (m_activeState == Frozen) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1185 return animationIsContributing; | 1208 return animationIsContributing; |
| 1186 } | 1209 } |
| 1187 | 1210 |
| 1188 void SVGSMILElement::notifyDependentsIntervalChanged() | 1211 void SVGSMILElement::notifyDependentsIntervalChanged() |
| 1189 { | 1212 { |
| 1190 ASSERT(m_intervalBegin.isFinite()); | 1213 ASSERT(m_intervalBegin.isFinite()); |
| 1191 DEFINE_STATIC_LOCAL(HashSet<SVGSMILElement*>, loopBreaker, ()); | 1214 DEFINE_STATIC_LOCAL(HashSet<SVGSMILElement*>, loopBreaker, ()); |
| 1192 if (!loopBreaker.add(this).isNewEntry) | 1215 if (!loopBreaker.add(this).isNewEntry) |
| 1193 return; | 1216 return; |
| 1194 | 1217 |
| 1195 TimeDependentSet::iterator end = m_timeDependents.end(); | 1218 TimeDependentSet::iterator end = m_syncBaseDependents.end(); |
| 1196 for (TimeDependentSet::iterator it = m_timeDependents.begin(); it != end; ++ it) { | 1219 for (TimeDependentSet::iterator it = m_syncBaseDependents.begin(); it != end ; ++it) { |
| 1197 SVGSMILElement* dependent = *it; | 1220 SVGSMILElement* dependent = *it; |
| 1198 dependent->createInstanceTimesFromSyncbase(this); | 1221 dependent->createInstanceTimesFromSyncbase(this); |
| 1199 } | 1222 } |
| 1200 | 1223 |
| 1201 loopBreaker.remove(this); | 1224 loopBreaker.remove(this); |
| 1202 } | 1225 } |
| 1203 | 1226 |
| 1204 void SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncbase) | 1227 void SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncbase) |
| 1205 { | 1228 { |
| 1206 // FIXME: To be really correct, this should handle updating exising interval by changing | 1229 // FIXME: To be really correct, this should handle updating exising interval by changing |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1217 time = syncbase->m_intervalEnd + condition.m_offset; | 1240 time = syncbase->m_intervalEnd + condition.m_offset; |
| 1218 ASSERT(time.isFinite()); | 1241 ASSERT(time.isFinite()); |
| 1219 if (condition.m_beginOrEnd == Begin) | 1242 if (condition.m_beginOrEnd == Begin) |
| 1220 addBeginTime(elapsed(), time); | 1243 addBeginTime(elapsed(), time); |
| 1221 else | 1244 else |
| 1222 addEndTime(elapsed(), time); | 1245 addEndTime(elapsed(), time); |
| 1223 } | 1246 } |
| 1224 } | 1247 } |
| 1225 } | 1248 } |
| 1226 | 1249 |
| 1227 void SVGSMILElement::addTimeDependent(SVGSMILElement* animation) | 1250 void SVGSMILElement::addSyncBaseDependent(SVGSMILElement* animation) |
| 1228 { | 1251 { |
| 1229 m_timeDependents.add(animation); | 1252 m_syncBaseDependents.add(animation); |
| 1230 if (m_intervalBegin.isFinite()) | 1253 if (m_intervalBegin.isFinite()) |
| 1231 animation->createInstanceTimesFromSyncbase(this); | 1254 animation->createInstanceTimesFromSyncbase(this); |
| 1232 } | 1255 } |
| 1233 | 1256 |
| 1234 void SVGSMILElement::removeTimeDependent(SVGSMILElement* animation) | 1257 void SVGSMILElement::removeSyncBaseDependent(SVGSMILElement* animation) |
| 1235 { | 1258 { |
| 1236 m_timeDependents.remove(animation); | 1259 m_syncBaseDependents.remove(animation); |
| 1237 } | 1260 } |
| 1238 | 1261 |
| 1239 void SVGSMILElement::handleConditionEvent(Event* event, Condition* condition) | 1262 void SVGSMILElement::handleConditionEvent(Event* event, Condition* condition) |
| 1240 { | 1263 { |
| 1241 if (event->type() == "repeatn" && toRepeatEvent(event)->repeat() != conditio n->m_repeat) | 1264 if (event->type() == "repeatn" && toRepeatEvent(event)->repeat() != conditio n->m_repeat) |
| 1242 return; | 1265 return; |
| 1243 | 1266 |
| 1244 SMILTime elapsed = this->elapsed(); | 1267 SMILTime elapsed = this->elapsed(); |
| 1245 if (condition->m_beginOrEnd == Begin) | 1268 if (condition->m_beginOrEnd == Begin) |
| 1246 addBeginTime(elapsed, elapsed + condition->m_offset); | 1269 addBeginTime(elapsed, elapsed + condition->m_offset); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1274 if (eventType == "repeatn") { | 1297 if (eventType == "repeatn") { |
| 1275 unsigned repeatEventCount = m_repeatEventCountList.first(); | 1298 unsigned repeatEventCount = m_repeatEventCountList.first(); |
| 1276 m_repeatEventCountList.remove(0); | 1299 m_repeatEventCountList.remove(0); |
| 1277 dispatchEvent(RepeatEvent::create(eventType, repeatEventCount)); | 1300 dispatchEvent(RepeatEvent::create(eventType, repeatEventCount)); |
| 1278 } else { | 1301 } else { |
| 1279 dispatchEvent(Event::create(eventType)); | 1302 dispatchEvent(Event::create(eventType)); |
| 1280 } | 1303 } |
| 1281 } | 1304 } |
| 1282 | 1305 |
| 1283 } | 1306 } |
| OLD | NEW |