Add an argument indicating the type of insertion to Node::insertedInto
[WebKit-https.git] / Source / WebCore / svg / SVGSVGElement.h
1 /*
2  * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006, 2007, 2010 Rob Buis <buis@kde.org>
4  * Copyright (C) 2015 Apple Inc. All rights reserved.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #pragma once
23
24 #include "FloatPoint.h"
25 #include "SVGAnimatedBoolean.h"
26 #include "SVGAnimatedLength.h"
27 #include "SVGAnimatedPreserveAspectRatio.h"
28 #include "SVGAnimatedRect.h"
29 #include "SVGExternalResourcesRequired.h"
30 #include "SVGFitToViewBox.h"
31 #include "SVGGraphicsElement.h"
32 #include "SVGZoomAndPan.h"
33
34 namespace WebCore {
35
36 class SMILTimeContainer;
37 class SVGAngle;
38 class SVGLength;
39 class SVGMatrix;
40 class SVGNumber;
41 class SVGRect;
42 class SVGTransform;
43 class SVGViewSpec;
44
45 class SVGSVGElement final : public SVGGraphicsElement, public SVGExternalResourcesRequired, public SVGFitToViewBox, public SVGZoomAndPan {
46
47     BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGSVGElement)
48         DECLARE_ANIMATED_LENGTH(X, x)
49         DECLARE_ANIMATED_LENGTH(Y, y)
50         DECLARE_ANIMATED_LENGTH(Width, width)
51         DECLARE_ANIMATED_LENGTH(Height, height)
52         DECLARE_ANIMATED_BOOLEAN_OVERRIDE(ExternalResourcesRequired, externalResourcesRequired)
53         DECLARE_ANIMATED_RECT(ViewBox, viewBox)
54         DECLARE_ANIMATED_PRESERVEASPECTRATIO(PreserveAspectRatio, preserveAspectRatio)
55     END_DECLARE_ANIMATED_PROPERTIES
56
57 public: // DOM
58     const AtomicString& contentScriptType() const;
59     void setContentScriptType(const AtomicString&);
60
61     const AtomicString& contentStyleType() const;
62     void setContentStyleType(const AtomicString&);
63
64     Ref<SVGRect> viewport() const;
65
66     float pixelUnitToMillimeterX() const;
67     float pixelUnitToMillimeterY() const;
68     float screenPixelToMillimeterX() const;
69     float screenPixelToMillimeterY() const;
70
71     bool useCurrentView() const;
72     SVGViewSpec& currentView();
73
74     float currentScale() const;
75     void setCurrentScale(float);
76
77     Ref<SVGPoint> currentTranslate();
78     FloatPoint currentTranslateValue();
79
80     unsigned suspendRedraw(unsigned maxWaitMilliseconds);
81     void unsuspendRedraw(unsigned suspendHandleId);
82     void unsuspendRedrawAll();
83     void forceRedraw();
84
85     void pauseAnimations();
86     void unpauseAnimations();
87     bool animationsPaused() const;
88     bool hasActiveAnimation() const;
89
90     float getCurrentTime() const;
91     void setCurrentTime(float);
92
93     Ref<NodeList> getIntersectionList(SVGRect&, SVGElement* referenceElement);
94     Ref<NodeList> getEnclosureList(SVGRect&, SVGElement* referenceElement);
95     static bool checkIntersection(const SVGElement*, SVGRect&);
96     static bool checkEnclosure(const SVGElement*, SVGRect&);
97     void deselectAll();
98
99     static Ref<SVGNumber> createSVGNumber();
100     static Ref<SVGLength> createSVGLength();
101     static Ref<SVGAngle> createSVGAngle();
102     static Ref<SVGPoint> createSVGPoint();
103     static Ref<SVGMatrix> createSVGMatrix();
104     static Ref<SVGRect> createSVGRect();
105     static Ref<SVGTransform> createSVGTransform();
106     static Ref<SVGTransform> createSVGTransformFromMatrix(SVGMatrix&);
107
108     Element* getElementById(const AtomicString&);
109
110     SVGZoomAndPanType zoomAndPan() const;
111     void setZoomAndPan(unsigned short);
112
113 public:
114     static Ref<SVGSVGElement> create(const QualifiedName&, Document&);
115     static Ref<SVGSVGElement> create(Document&);
116     void scrollToAnchor(const String& fragmentIdentifier, Element* anchor);
117
118     using SVGGraphicsElement::ref;
119     using SVGGraphicsElement::deref;
120
121     SMILTimeContainer& timeContainer();
122
123     void setCurrentTranslate(const FloatPoint&); // Used to pan.
124     void updateCurrentTranslate(); // Used from DOM bindings to create an SVGStaticPropertyTearOff for currentTranslate.
125
126     bool hasIntrinsicWidth() const;
127     bool hasIntrinsicHeight() const;
128     Length intrinsicWidth() const;
129     Length intrinsicHeight() const;
130
131     FloatSize currentViewportSize() const;
132     FloatRect currentViewBoxRect() const;
133
134     bool hasEmptyViewBox() const;
135     AffineTransform viewBoxToViewTransform(float viewWidth, float viewHeight) const;
136
137 private:
138     SVGSVGElement(const QualifiedName&, Document&);
139     virtual ~SVGSVGElement();
140
141     bool isValid() const override;
142     void didMoveToNewDocument(Document& oldDocument, Document& newDocument) override;
143     void parseAttribute(const QualifiedName&, const AtomicString&) override;
144     bool rendererIsNeeded(const RenderStyle&) override;
145     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
146     InsertedIntoResult insertedInto(InsertionType, ContainerNode&) override;
147     void removedFrom(ContainerNode&) override;
148     void svgAttributeChanged(const QualifiedName&) override;
149     bool selfHasRelativeLengths() const override;
150     void prepareForDocumentSuspension() override;
151     void resumeFromDocumentSuspension() override;
152     AffineTransform localCoordinateSpaceTransform(SVGLocatable::CTMScope) const override;
153
154     Frame* frameForCurrentScale() const;
155     void inheritViewAttributes(const SVGViewElement&);
156     Ref<NodeList> collectIntersectionOrEnclosureList(SVGRect&, SVGElement*, bool (*checkFunction)(const SVGElement*, SVGRect&));
157
158     bool m_useCurrentView { false };
159     SVGZoomAndPanType m_zoomAndPan { SVGZoomAndPanMagnify };
160     Ref<SMILTimeContainer> m_timeContainer;
161     FloatPoint m_currentTranslate;
162     RefPtr<SVGViewSpec> m_viewSpec;
163 };
164
165 inline bool SVGSVGElement::useCurrentView() const
166 {
167     return m_useCurrentView;
168 }
169
170 inline FloatPoint SVGSVGElement::currentTranslateValue()
171 {
172     return m_currentTranslate;
173 }
174
175 inline SVGZoomAndPanType SVGSVGElement::zoomAndPan() const
176 {
177     return m_zoomAndPan;
178 }
179
180 inline void SVGSVGElement::setZoomAndPan(unsigned short zoomAndPan)
181 {
182     m_zoomAndPan = parseFromNumber(zoomAndPan);
183 }
184
185 inline SMILTimeContainer& SVGSVGElement::timeContainer()
186 {
187     return m_timeContainer.get();
188 }
189
190 inline bool SVGSVGElement::hasEmptyViewBox() const
191 {
192     return viewBoxIsValid() && viewBox().isEmpty();
193 }
194
195 } // namespace WebCore