Add an argument indicating the type of insertion to Node::insertedInto
[WebKit-https.git] / Source / WebCore / svg / SVGUseElement.h
index 4046ef6..2f975fb 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef SVGUseElement_h
-#define SVGUseElement_h
+#pragma once
 
-#if ENABLE(SVG)
 #include "CachedResourceHandle.h"
 #include "CachedSVGDocumentClient.h"
 #include "SVGAnimatedBoolean.h"
 #include "SVGAnimatedLength.h"
 #include "SVGExternalResourcesRequired.h"
-#include "SVGLangSpace.h"
-#include "SVGStyledTransformableElement.h"
-#include "SVGTests.h"
+#include "SVGGraphicsElement.h"
 #include "SVGURIReference.h"
 
 namespace WebCore {
 
 class CachedSVGDocument;
-class SVGElementInstance;
-
-class SVGUseElement : public SVGStyledTransformableElement,
-                      public SVGTests,
-                      public SVGLangSpace,
-                      public SVGExternalResourcesRequired,
-                      public SVGURIReference,
-                      public CachedSVGDocumentClient {
+class SVGGElement;
+
+class SVGUseElement final : public SVGGraphicsElement, public SVGExternalResourcesRequired, public SVGURIReference, private CachedSVGDocumentClient {
+
+    BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGUseElement)
+        DECLARE_ANIMATED_LENGTH(X, x)
+        DECLARE_ANIMATED_LENGTH(Y, y)
+        DECLARE_ANIMATED_LENGTH(Width, width)
+        DECLARE_ANIMATED_LENGTH(Height, height)
+        DECLARE_ANIMATED_STRING_OVERRIDE(Href, href)
+        DECLARE_ANIMATED_BOOLEAN_OVERRIDE(ExternalResourcesRequired, externalResourcesRequired)
+    END_DECLARE_ANIMATED_PROPERTIES
+
 public:
-    static PassRefPtr<SVGUseElement> create(const QualifiedName&, Document*, bool wasInsertedByParser);
+    static Ref<SVGUseElement> create(const QualifiedName&, Document&);
     virtual ~SVGUseElement();
 
-    SVGElementInstance* instanceRoot();
-    SVGElementInstance* animatedInstanceRoot() const;
-    SVGElementInstance* instanceForShadowTreeElement(Node*) const;
     void invalidateShadowTree();
-    void invalidateDependentShadowTrees();
 
-    RenderObject* rendererClipChild() const;
+    RenderElement* rendererClipChild() const;
 
 private:
-    SVGUseElement(const QualifiedName&, Document*, bool wasInsertedByParser);
-
-    virtual bool isValid() const { return SVGTests::isValid(); }
-    virtual bool supportsFocus() const { return true; }
-
-    virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
-    virtual void removedFrom(ContainerNode*) OVERRIDE;
-    virtual void buildPendingResource();
-
-    bool isSupportedAttribute(const QualifiedName&);
-    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
-    virtual void svgAttributeChanged(const QualifiedName&);
-
-    virtual bool willRecalcStyle(StyleChange);
-
-    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
-    virtual void toClipPath(Path&);
+    SVGUseElement(const QualifiedName&, Document&);
+
+    bool isValid() const override;
+    InsertedIntoResult insertedInto(InsertionType, ContainerNode&) override;
+    void removedFrom(ContainerNode&) override;
+    void buildPendingResource() override;
+    void parseAttribute(const QualifiedName&, const AtomicString&) override;
+    void svgAttributeChanged(const QualifiedName&) override;
+    void willRecalcStyle(Style::Change) override;
+    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
+    void toClipPath(Path&) override;
+    bool haveLoadedRequiredResources() override;
+    void finishParsingChildren() override;
+    bool selfHasRelativeLengths() const override;
+    void setHaveFiredLoadEvent(bool) override;
+    bool haveFiredLoadEvent() const override;
+    Timer* svgLoadEventTimer() override;
+    void notifyFinished(CachedResource&) final;
 
-    void clearResourceReferences();
-    void buildShadowAndInstanceTree(SVGElement* target);
-    void detachInstance();
-
-    virtual bool haveLoadedRequiredResources() { return SVGExternalResourcesRequired::haveLoadedRequiredResources(); }
-
-    virtual void finishParsingChildren();
-    virtual bool selfHasRelativeLengths() const;
-
-    // Instance tree handling
-    void buildInstanceTree(SVGElement* target, SVGElementInstance* targetInstance, bool& foundCycle, bool foundUse);
-    bool hasCycleUseReferencing(SVGUseElement*, SVGElementInstance* targetInstance, SVGElement*& newTarget);
-
-    // Shadow tree handling
-    void buildShadowTree(SVGElement* target, SVGElementInstance* targetInstance);
+    Document* externalDocument() const;
+    void updateExternalDocument();
 
-    void expandUseElementsInShadowTree(Node* element);
-    void expandSymbolElementsInShadowTree(Node* element);
+    SVGElement* findTarget(String* targetID = nullptr) const;
 
-    // "Tree connector" 
-    void associateInstancesWithShadowTreeElements(Node* target, SVGElementInstance* targetInstance);
-    SVGElementInstance* instanceForShadowTreeElement(Node* element, SVGElementInstance* instance) const;
+    void cloneTarget(ContainerNode&, SVGElement& target) const;
+    SVGElement* targetClone() const;
 
-    void transferUseAttributesToReplacedElement(SVGElement* from, SVGElement* to) const;
-    void transferEventListenersToShadowTree(SVGElementInstance* target);
+    void updateShadowTree();
+    void expandUseElementsInShadowTree() const;
+    void expandSymbolElementsInShadowTree() const;
+    void transferEventListenersToShadowTree() const;
+    void transferSizeAttributesToTargetClone(SVGElement&) const;
 
-    BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGUseElement)
-        DECLARE_ANIMATED_LENGTH(X, x)
-        DECLARE_ANIMATED_LENGTH(Y, y)
-        DECLARE_ANIMATED_LENGTH(Width, width)
-        DECLARE_ANIMATED_LENGTH(Height, height)
-        DECLARE_ANIMATED_STRING(Href, href)
-        DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
-    END_DECLARE_ANIMATED_PROPERTIES
+    void clearShadowTree();
+    void invalidateDependentShadowTrees();
 
-    bool cachedDocumentIsStillLoading();
-    Document* externalDocument() const;
-    bool instanceTreeIsLoading(SVGElementInstance*);
-    virtual void notifyFinished(CachedResource*);
-    Document* referencedDocument() const;
-    void setCachedDocument(CachedResourceHandle<CachedSVGDocument>);
-
-    // SVGTests
-    virtual void synchronizeRequiredFeatures() { SVGTests::synchronizeRequiredFeatures(this); }
-    virtual void synchronizeRequiredExtensions() { SVGTests::synchronizeRequiredExtensions(this); }
-    virtual void synchronizeSystemLanguage() { SVGTests::synchronizeSystemLanguage(this); }
-
-    // SVGExternalResourcesRequired
-    virtual void setHaveFiredLoadEvent(bool haveFiredLoadEvent) { m_haveFiredLoadEvent = haveFiredLoadEvent; }
-    virtual bool isParserInserted() const { return m_wasInsertedByParser; }
-    virtual bool haveFiredLoadEvent() const { return m_haveFiredLoadEvent; }
-    virtual Timer<SVGElement>* svgLoadEventTimer() OVERRIDE { return &m_svgLoadEventTimer; }
-
-    bool m_wasInsertedByParser;
-    bool m_haveFiredLoadEvent;
-    bool m_needsShadowTreeRecreation;
-    RefPtr<SVGElementInstance> m_targetElementInstance;
-    CachedResourceHandle<CachedSVGDocument> m_cachedDocument;
-    Timer<SVGElement> m_svgLoadEventTimer;
+    bool m_haveFiredLoadEvent { false };
+    bool m_shadowTreeNeedsUpdate { true };
+    CachedResourceHandle<CachedSVGDocument> m_externalDocument;
+    Timer m_svgLoadEventTimer;
 };
 
 }
-
-#endif
-#endif