SVGAnimatedString.cpp (3846B)
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 "SVGAnimatedString.h" 8 9 #include <utility> 10 11 #include "SMILStringType.h" 12 #include "SVGAttrTearoffTable.h" 13 #include "mozilla/SMILValue.h" 14 #include "mozilla/dom/TrustedTypeUtils.h" 15 #include "mozilla/dom/TrustedTypesConstants.h" 16 17 using namespace mozilla::dom; 18 19 namespace mozilla { 20 21 /* Implementation */ 22 23 void SVGAnimatedString::SetBaseValue(const nsAString& aValue, 24 SVGElement* aSVGElement, bool aDoSetAttr) { 25 NS_ASSERTION(aSVGElement, "Null element passed to SetBaseValue"); 26 27 mIsBaseSet = true; 28 if (aDoSetAttr) { 29 aSVGElement->SetStringBaseValue(mAttrEnum, aValue); 30 } 31 if (mAnimVal) { 32 aSVGElement->AnimationNeedsResample(); 33 } 34 35 aSVGElement->DidChangeString(mAttrEnum); 36 } 37 38 void SVGAnimatedString::GetAnimValue(nsAString& aResult, 39 const SVGElement* aSVGElement) const { 40 if (mAnimVal) { 41 aResult = *mAnimVal; 42 return; 43 } 44 45 aSVGElement->GetStringBaseValue(mAttrEnum, aResult); 46 } 47 48 void SVGAnimatedString::SetAnimValue(const nsAString& aValue, 49 SVGElement* aSVGElement) { 50 if (aSVGElement->IsStringAnimatable(mAttrEnum)) { 51 if (mAnimVal && mAnimVal->Equals(aValue)) { 52 return; 53 } 54 if (!mAnimVal) { 55 mAnimVal = MakeUnique<nsString>(); 56 } 57 *mAnimVal = aValue; 58 aSVGElement->DidAnimateString(mAttrEnum); 59 } 60 } 61 62 UniquePtr<SMILAttr> SVGAnimatedString::ToSMILAttr(SVGElement* aSVGElement) { 63 return MakeUnique<SMILString>(this, aSVGElement); 64 } 65 66 nsresult SVGAnimatedString::SMILString::ValueFromString( 67 const nsAString& aStr, const dom::SVGAnimationElement* /*aSrcElement*/, 68 SMILValue& aValue, bool& aPreventCachingOfSandwich) const { 69 SMILValue val(SMILStringType::Singleton()); 70 71 *static_cast<nsAString*>(val.mU.mPtr) = aStr; 72 aValue = std::move(val); 73 return NS_OK; 74 } 75 76 SMILValue SVGAnimatedString::SMILString::GetBaseValue() const { 77 SMILValue val(SMILStringType::Singleton()); 78 mSVGElement->GetStringBaseValue(mVal->mAttrEnum, 79 *static_cast<nsAString*>(val.mU.mPtr)); 80 return val; 81 } 82 83 void SVGAnimatedString::SMILString::ClearAnimValue() { 84 if (mVal->mAnimVal) { 85 mVal->mAnimVal = nullptr; 86 mSVGElement->DidAnimateString(mVal->mAttrEnum); 87 } 88 } 89 90 nsresult SVGAnimatedString::SMILString::SetAnimValue(const SMILValue& aValue) { 91 NS_ASSERTION(aValue.mType == SMILStringType::Singleton(), 92 "Unexpected type to assign animated value"); 93 if (aValue.mType == SMILStringType::Singleton()) { 94 mVal->SetAnimValue(*static_cast<nsAString*>(aValue.mU.mPtr), mSVGElement); 95 } 96 return NS_OK; 97 } 98 99 void SVGAnimatedScriptHrefString::SetBaseValue( 100 const TrustedScriptURLOrString& aValue, SVGElement* aSVGElement, 101 bool aDoSetAttr, nsIPrincipal* aSubjectPrincipal, ErrorResult& aRv) { 102 // https://svgwg.org/svg2-draft/single-page.html#types-InterfaceSVGAnimatedString 103 // See https://github.com/w3c/svgwg/pull/934 104 MOZ_ASSERT(aSVGElement->IsSVGElement(nsGkAtoms::script)); 105 nsCOMPtr<SVGElement> svgElement = aSVGElement; 106 constexpr nsLiteralString sink = u"SVGScriptElement href"_ns; 107 Maybe<nsAutoString> compliantStringHolder; 108 const nsAString* compliantString = 109 TrustedTypeUtils::GetTrustedTypesCompliantString( 110 aValue, sink, kTrustedTypesOnlySinkGroup, *svgElement, 111 aSubjectPrincipal, compliantStringHolder, aRv); 112 if (aRv.Failed()) { 113 return; 114 } 115 SVGAnimatedString::SetBaseValue(*compliantString, aSVGElement, aDoSetAttr); 116 } 117 118 } // namespace mozilla