Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef mozilla_dom_SVGAnimationElement_h
8 : #define mozilla_dom_SVGAnimationElement_h
9 :
10 : #include "mozilla/Attributes.h"
11 : #include "mozilla/dom/SVGTests.h"
12 : #include "nsReferencedElement.h"
13 : #include "nsSMILTimedElement.h"
14 : #include "nsSVGElement.h"
15 :
16 : typedef nsSVGElement SVGAnimationElementBase;
17 :
18 : namespace mozilla {
19 : namespace dom {
20 :
21 : enum nsSMILTargetAttrType {
22 : eSMILTargetAttrType_auto,
23 : eSMILTargetAttrType_CSS,
24 : eSMILTargetAttrType_XML
25 : };
26 :
27 : class SVGAnimationElement : public SVGAnimationElementBase,
28 : public SVGTests
29 : {
30 : protected:
31 : explicit SVGAnimationElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
32 : nsresult Init();
33 : virtual ~SVGAnimationElement();
34 :
35 : public:
36 : // interfaces:
37 : NS_DECL_ISUPPORTS_INHERITED
38 :
39 0 : NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SVGAnimationElement,
40 : SVGAnimationElementBase)
41 :
42 : virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
43 : bool aPreallocateChildren) const override = 0;
44 :
45 : // nsIContent specializations
46 : virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
47 : nsIContent* aBindingParent,
48 : bool aCompileEventHandlers) override;
49 : virtual void UnbindFromTree(bool aDeep, bool aNullParent) override;
50 :
51 : virtual nsresult UnsetAttr(int32_t aNamespaceID, nsIAtom* aAttribute,
52 : bool aNotify) override;
53 :
54 : virtual bool IsNodeOfType(uint32_t aFlags) const override;
55 :
56 : // Element specializations
57 : virtual bool ParseAttribute(int32_t aNamespaceID,
58 : nsIAtom* aAttribute,
59 : const nsAString& aValue,
60 : nsAttrValue& aResult) override;
61 : virtual nsresult AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName,
62 : const nsAttrValue* aValue,
63 : const nsAttrValue* aOldValue,
64 : bool aNotify) override;
65 :
66 : const nsAttrValue* GetAnimAttr(nsIAtom* aName) const;
67 : bool GetAnimAttr(nsIAtom* aAttName, nsAString& aResult) const;
68 : bool HasAnimAttr(nsIAtom* aAttName) const;
69 : Element* GetTargetElementContent();
70 : virtual bool GetTargetAttributeName(int32_t* aNamespaceID,
71 : nsIAtom** aLocalName) const;
72 : nsSMILTimedElement& TimedElement();
73 : nsSMILTimeContainer* GetTimeContainer();
74 : virtual nsSMILAnimationFunction& AnimationFunction() = 0;
75 :
76 : virtual bool IsEventAttributeNameInternal(nsIAtom* aName) override;
77 :
78 : // Utility methods for within SVG
79 : void ActivateByHyperlink();
80 :
81 : // WebIDL
82 : nsSVGElement* GetTargetElement();
83 : float GetStartTime(ErrorResult& rv);
84 : float GetCurrentTime();
85 : float GetSimpleDuration(ErrorResult& rv);
86 0 : void BeginElement(ErrorResult& rv) { BeginElementAt(0.f, rv); }
87 : void BeginElementAt(float offset, ErrorResult& rv);
88 0 : void EndElement(ErrorResult& rv) { EndElementAt(0.f, rv); }
89 : void EndElementAt(float offset, ErrorResult& rv);
90 :
91 : // SVGTests
92 : virtual bool IsInChromeDoc() const override;
93 :
94 :
95 : protected:
96 : // nsSVGElement overrides
97 :
98 : void UpdateHrefTarget(nsIContent* aNodeForContext,
99 : const nsAString& aHrefStr);
100 : void AnimationTargetChanged();
101 :
102 0 : class TargetReference : public nsReferencedElement {
103 : public:
104 0 : explicit TargetReference(SVGAnimationElement* aAnimationElement) :
105 0 : mAnimationElement(aAnimationElement) {}
106 : protected:
107 : // We need to be notified when target changes, in order to request a
108 : // sample (which will clear animation effects from old target and apply
109 : // them to the new target) and update any event registrations.
110 0 : virtual void ElementChanged(Element* aFrom, Element* aTo) override {
111 0 : nsReferencedElement::ElementChanged(aFrom, aTo);
112 0 : mAnimationElement->AnimationTargetChanged();
113 0 : }
114 :
115 : // We need to override IsPersistent to get persistent tracking (beyond the
116 : // first time the target changes)
117 0 : virtual bool IsPersistent() override { return true; }
118 : private:
119 : SVGAnimationElement* const mAnimationElement;
120 : };
121 :
122 : TargetReference mHrefTarget;
123 : nsSMILTimedElement mTimedElement;
124 : };
125 :
126 : } // namespace dom
127 : } // namespace mozilla
128 :
129 : #endif // mozilla_dom_SVGAnimationElement_h
|