#ifndef SVGDocumentExtensions_h
#define SVGDocumentExtensions_h
#include "wtf/Forward.h"
#include "wtf/HashMap.h"
#include "wtf/HashSet.h"
#include "wtf/text/AtomicStringHash.h"
namespace WebCore {
class Document;
class RenderSVGResourceContainer;
class SubtreeLayoutScope;
class SVGElement;
#if ENABLE(SVG_FONTS)
class SVGFontFaceElement;
#endif
class SVGResourcesCache;
class SVGSMILElement;
class SVGSVGElement;
class Element;
class SVGDocumentExtensions {
WTF_MAKE_NONCOPYABLE(SVGDocumentExtensions); WTF_MAKE_FAST_ALLOCATED;
public:
typedef HashSet<Element*> SVGPendingElements;
explicit SVGDocumentExtensions(Document*);
~SVGDocumentExtensions();
void addTimeContainer(SVGSVGElement*);
void removeTimeContainer(SVGSVGElement*);
void addResource(const AtomicString& id, RenderSVGResourceContainer*);
void removeResource(const AtomicString& id);
RenderSVGResourceContainer* resourceById(const AtomicString& id) const;
static void serviceOnAnimationFrame(Document&, double monotonicAnimationStartTime);
void startAnimations();
void pauseAnimations();
void unpauseAnimations();
void dispatchSVGLoadEventToOutermostSVGElements();
void reportWarning(const String&);
void reportError(const String&);
SVGResourcesCache* resourcesCache() const { return m_resourcesCache.get(); }
HashSet<SVGElement*>* setOfElementsReferencingTarget(SVGElement* referencedElement) const;
void addElementReferencingTarget(SVGElement* referencingElement, SVGElement* referencedElement);
void removeAllTargetReferencesForElement(SVGElement*);
void rebuildAllElementReferencesForTarget(SVGElement*);
void removeAllElementReferencesForTarget(SVGElement*);
void addSVGRootWithRelativeLengthDescendents(SVGSVGElement*);
void removeSVGRootWithRelativeLengthDescendents(SVGSVGElement*);
bool isSVGRootWithRelativeLengthDescendents(SVGSVGElement*) const;
void invalidateSVGRootsWithRelativeLengthDescendents(SubtreeLayoutScope*);
#if ENABLE(SVG_FONTS)
const HashSet<SVGFontFaceElement*>& svgFontFaceElements() const { return m_svgFontFaceElements; }
void registerSVGFontFaceElement(SVGFontFaceElement*);
void unregisterSVGFontFaceElement(SVGFontFaceElement*);
void registerPendingSVGFontFaceElementsForRemoval(PassRefPtr<SVGFontFaceElement>);
void removePendingSVGFontFaceElementsForRemoval();
#endif
private:
Document* m_document;
HashSet<SVGSVGElement*> m_timeContainers;
#if ENABLE(SVG_FONTS)
HashSet<SVGFontFaceElement*> m_svgFontFaceElements;
HashSet<RefPtr<SVGFontFaceElement> > m_pendingSVGFontFaceElementsForRemoval;
#endif
HashMap<AtomicString, RenderSVGResourceContainer*> m_resources;
HashMap<AtomicString, OwnPtr<SVGPendingElements> > m_pendingResources;
HashMap<AtomicString, OwnPtr<SVGPendingElements> > m_pendingResourcesForRemoval;
HashMap<SVGElement*, OwnPtr<HashSet<SVGElement*> > > m_elementDependencies;
OwnPtr<SVGResourcesCache> m_resourcesCache;
HashSet<SVGSVGElement*> m_relativeLengthSVGRoots;
#if !ASSERT_DISABLED
bool m_inRelativeLengthSVGRootsInvalidation;
#endif
public:
void addPendingResource(const AtomicString& id, Element*);
bool hasPendingResource(const AtomicString& id) const;
bool isElementPendingResources(Element*) const;
bool isElementPendingResource(Element*, const AtomicString& id) const;
void clearHasPendingResourcesIfPossible(Element*);
void removeElementFromPendingResources(Element*);
PassOwnPtr<SVGPendingElements> removePendingResource(const AtomicString& id);
void serviceAnimations(double monotonicAnimationStartTime);
void markPendingResourcesForRemoval(const AtomicString&);
Element* removeElementFromPendingResourcesForRemoval(const AtomicString&);
private:
PassOwnPtr<SVGPendingElements> removePendingResourceForRemoval(const AtomicString&);
};
}
#endif