void SVGDocumentExtensions::serviceAnimations(double monotonicAnimationStartTime) { WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> > timeContainers; timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator end = timeContainers.end(); for (WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator itr = timeContainers.begin(); itr != end; ++itr) (*itr)->timeContainer()->serviceAnimations(monotonicAnimationStartTime); }
void SVGUseElement::invalidateDependentShadowTrees() { // Recursively invalidate dependent <use> shadow trees const WillBeHeapHashSet<RawPtrWillBeWeakMember<SVGElement>>& rawInstances = instancesForElement(); WillBeHeapVector<RefPtrWillBeMember<SVGElement>> instances; instances.appendRange(rawInstances.begin(), rawInstances.end()); for (auto& instance : instances) { if (RefPtrWillBeRawPtr<SVGUseElement> element = instance->correspondingUseElement()) { ASSERT(element->inDocument()); element->invalidateShadowTree(); } } }
void SVGDocumentExtensions::startAnimations() { // FIXME: Eventually every "Time Container" will need a way to latch on to some global timer // starting animations for a document will do this "latching" // FIXME: We hold a ref pointers to prevent a shadow tree from getting removed out from underneath us. // In the future we should refactor the use-element to avoid this. See https://webkit.org/b/53704 WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> > timeContainers; timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator end = timeContainers.end(); for (WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator itr = timeContainers.begin(); itr != end; ++itr) { SMILTimeContainer* timeContainer = (*itr)->timeContainer(); if (!timeContainer->isStarted()) timeContainer->begin(); } }
void SVGDocumentExtensions::dispatchSVGLoadEventToOutermostSVGElements() { WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> > timeContainers; timeContainers.appendRange(m_timeContainers.begin(), m_timeContainers.end()); WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator end = timeContainers.end(); for (WillBeHeapVector<RefPtrWillBeMember<SVGSVGElement> >::iterator it = timeContainers.begin(); it != end; ++it) { SVGSVGElement* outerSVG = it->get(); if (!outerSVG->isOutermostSVGSVGElement()) continue; // don't dispatch the load event document is not wellformed (for XML/standalone svg) if (outerSVG->document().wellFormed() || !outerSVG->document().isSVGDocument()) outerSVG->sendSVGLoadEventIfPossible(); } }