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 : #include "nsSVGString.h"
8 :
9 : #include "mozilla/Move.h"
10 : #include "nsSVGAttrTearoffTable.h"
11 : #include "nsSMILValue.h"
12 : #include "SMILStringType.h"
13 :
14 : using namespace mozilla;
15 : using namespace mozilla::dom;
16 :
17 0 : NS_SVG_VAL_IMPL_CYCLE_COLLECTION_WRAPPERCACHED(nsSVGString::DOMAnimatedString, mSVGElement)
18 :
19 0 : NS_IMPL_CYCLE_COLLECTING_ADDREF(nsSVGString::DOMAnimatedString)
20 0 : NS_IMPL_CYCLE_COLLECTING_RELEASE(nsSVGString::DOMAnimatedString)
21 :
22 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSVGString::DOMAnimatedString)
23 0 : NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
24 0 : NS_INTERFACE_MAP_ENTRY(nsISupports)
25 0 : NS_INTERFACE_MAP_END
26 :
27 : static inline
28 : nsSVGAttrTearoffTable<nsSVGString, nsSVGString::DOMAnimatedString>&
29 0 : SVGAnimatedStringTearoffTable()
30 : {
31 : static nsSVGAttrTearoffTable<nsSVGString, nsSVGString::DOMAnimatedString>
32 0 : sSVGAnimatedStringTearoffTable;
33 0 : return sSVGAnimatedStringTearoffTable;
34 : }
35 :
36 : /* Implementation */
37 :
38 : void
39 29 : nsSVGString::SetBaseValue(const nsAString& aValue,
40 : nsSVGElement *aSVGElement,
41 : bool aDoSetAttr)
42 : {
43 29 : NS_ASSERTION(aSVGElement, "Null element passed to SetBaseValue");
44 :
45 29 : mIsBaseSet = true;
46 29 : if (aDoSetAttr) {
47 0 : aSVGElement->SetStringBaseValue(mAttrEnum, aValue);
48 : }
49 29 : if (mAnimVal) {
50 0 : aSVGElement->AnimationNeedsResample();
51 : }
52 :
53 29 : aSVGElement->DidChangeString(mAttrEnum);
54 29 : }
55 :
56 : void
57 23 : nsSVGString::GetAnimValue(nsAString& aResult, const nsSVGElement *aSVGElement) const
58 : {
59 23 : if (mAnimVal) {
60 0 : aResult = *mAnimVal;
61 0 : return;
62 : }
63 :
64 23 : aSVGElement->GetStringBaseValue(mAttrEnum, aResult);
65 : }
66 :
67 : void
68 0 : nsSVGString::SetAnimValue(const nsAString& aValue, nsSVGElement *aSVGElement)
69 : {
70 0 : if (aSVGElement->IsStringAnimatable(mAttrEnum)) {
71 0 : if (mAnimVal && mAnimVal->Equals(aValue)) {
72 0 : return;
73 : }
74 0 : if (!mAnimVal) {
75 0 : mAnimVal = new nsString();
76 : }
77 0 : *mAnimVal = aValue;
78 0 : aSVGElement->DidAnimateString(mAttrEnum);
79 : }
80 : }
81 :
82 : already_AddRefed<SVGAnimatedString>
83 0 : nsSVGString::ToDOMAnimatedString(nsSVGElement* aSVGElement)
84 : {
85 : RefPtr<DOMAnimatedString> domAnimatedString =
86 0 : SVGAnimatedStringTearoffTable().GetTearoff(this);
87 0 : if (!domAnimatedString) {
88 0 : domAnimatedString = new DOMAnimatedString(this, aSVGElement);
89 0 : SVGAnimatedStringTearoffTable().AddTearoff(this, domAnimatedString);
90 : }
91 :
92 0 : return domAnimatedString.forget();
93 : }
94 :
95 0 : nsSVGString::DOMAnimatedString::~DOMAnimatedString()
96 : {
97 0 : SVGAnimatedStringTearoffTable().RemoveTearoff(mVal);
98 0 : }
99 :
100 : UniquePtr<nsISMILAttr>
101 0 : nsSVGString::ToSMILAttr(nsSVGElement *aSVGElement)
102 : {
103 0 : return MakeUnique<SMILString>(this, aSVGElement);
104 : }
105 :
106 : nsresult
107 0 : nsSVGString::SMILString::ValueFromString(const nsAString& aStr,
108 : const dom::SVGAnimationElement* /*aSrcElement*/,
109 : nsSMILValue& aValue,
110 : bool& aPreventCachingOfSandwich) const
111 : {
112 0 : nsSMILValue val(SMILStringType::Singleton());
113 :
114 0 : *static_cast<nsAString*>(val.mU.mPtr) = aStr;
115 0 : aValue = Move(val);
116 0 : aPreventCachingOfSandwich = false;
117 0 : return NS_OK;
118 : }
119 :
120 : nsSMILValue
121 0 : nsSVGString::SMILString::GetBaseValue() const
122 : {
123 0 : nsSMILValue val(SMILStringType::Singleton());
124 0 : mSVGElement->GetStringBaseValue(mVal->mAttrEnum, *static_cast<nsAString*>(val.mU.mPtr));
125 0 : return val;
126 : }
127 :
128 : void
129 0 : nsSVGString::SMILString::ClearAnimValue()
130 : {
131 0 : if (mVal->mAnimVal) {
132 0 : mVal->mAnimVal = nullptr;
133 0 : mSVGElement->DidAnimateString(mVal->mAttrEnum);
134 : }
135 0 : }
136 :
137 : nsresult
138 0 : nsSVGString::SMILString::SetAnimValue(const nsSMILValue& aValue)
139 : {
140 0 : NS_ASSERTION(aValue.mType == SMILStringType::Singleton(),
141 : "Unexpected type to assign animated value");
142 0 : if (aValue.mType == SMILStringType::Singleton()) {
143 0 : mVal->SetAnimValue(*static_cast<nsAString*>(aValue.mU.mPtr), mSVGElement);
144 : }
145 0 : return NS_OK;
146 : }
|