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 54f5c5a45a9113cbbe931808d0aca72a20846060..3a914e8d23c01755a6d61dc60287753ed5350176 100644 |
| --- a/Source/core/svg/animation/SVGSMILElement.cpp |
| +++ b/Source/core/svg/animation/SVGSMILElement.cpp |
| @@ -205,7 +205,6 @@ SVGSMILElement::~SVGSMILElement() |
| smilRepeatEventSender().cancelEvent(this); |
| smilRepeatNEventSender().cancelEvent(this); |
| #if !ENABLE(OILPAN) |
| - // FIXME: Oilpan: Clear |m_syncBaseDependents| using weak processing. |
| clearConditions(); |
| if (m_timeContainer && m_targetElement && hasValidAttributeName()) |
| @@ -602,12 +601,14 @@ void SVGSMILElement::connectSyncBaseConditions() |
| Condition* condition = m_conditions[n].get(); |
| if (condition->type() == Condition::Syncbase) { |
| ASSERT(!condition->baseID().isEmpty()); |
| - condition->setSyncBase(treeScope().getElementById(AtomicString(condition->baseID()))); |
| - if (!condition->syncBase() || !isSVGSMILElement(*condition->syncBase())) { |
| + Element* element = treeScope().getElementById(AtomicString(condition->baseID())); |
| + if (!element || !isSVGSMILElement(*element)) { |
| condition->setSyncBase(0); |
| continue; |
| } |
| - toSVGSMILElement(condition->syncBase())->addSyncBaseDependent(this); |
| + SVGSMILElement* svgSMILElement = toSVGSMILElement(element); |
| + condition->setSyncBase(svgSMILElement); |
| + svgSMILElement->addSyncBaseDependent(this); |
| } |
| } |
| } |
| @@ -621,7 +622,7 @@ void SVGSMILElement::disconnectSyncBaseConditions() |
| Condition* condition = m_conditions[n].get(); |
| if (condition->type() == Condition::Syncbase) { |
| if (condition->syncBase()) |
| - toSVGSMILElement(condition->syncBase())->removeSyncBaseDependent(this); |
| + condition->syncBase()->removeSyncBaseDependent(this); |
| condition->setSyncBase(0); |
| } |
| } |
| @@ -1246,8 +1247,8 @@ bool SVGSMILElement::progress(SMILTime elapsed, SVGSMILElement* resultElement, b |
| void SVGSMILElement::notifyDependentsIntervalChanged() |
| { |
| ASSERT(m_intervalBegin.isFinite()); |
| - DEFINE_STATIC_LOCAL(HashSet<SVGSMILElement*>, loopBreaker, ()); |
| - if (!loopBreaker.add(this).isNewEntry) |
| + DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<WillBeHeapHashSet<RawPtrWillBeMember<SVGSMILElement> > >, loopBreaker, (adoptPtrWillBeNoop(new WillBeHeapHashSet<RawPtrWillBeMember<SVGSMILElement> >()))); |
|
haraken
2014/05/29 08:11:52
Discussed offline. I wonder if this Persistent<Mem
|
| + if (!loopBreaker->add(this).isNewEntry) |
| return; |
| TimeDependentSet::iterator end = m_syncBaseDependents.end(); |
| @@ -1256,7 +1257,7 @@ void SVGSMILElement::notifyDependentsIntervalChanged() |
| dependent->createInstanceTimesFromSyncbase(this); |
| } |
| - loopBreaker.remove(this); |
| + loopBreaker->remove(this); |
| } |
| void SVGSMILElement::createInstanceTimesFromSyncbase(SVGSMILElement* syncBase) |