In the ClearAnimVal() codepath the snapshot is taken too late because the GetAnimatedClassName() codepath checks IsAnimating(), which already returns false. Fix it by introducing WillAnimateClass(). Also, free the animated classname when not animating anymore to avoid that check altogether. Differential Revision: https://phabricator.services.mozilla.com/D290748
95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "SVGAnimatedClass.h"
|
|
|
|
#include <utility>
|
|
|
|
#include "DOMSVGAnimatedString.h"
|
|
#include "SMILStringType.h"
|
|
#include "mozilla/SMILValue.h"
|
|
#include "mozilla/dom/SVGElement.h"
|
|
|
|
namespace mozilla {
|
|
|
|
void SVGAnimatedClass::SetBaseValue(const nsAString& aValue,
|
|
SVGElement* aSVGElement, bool aDoSetAttr) {
|
|
NS_ASSERTION(aSVGElement, "Null element passed to SetBaseValue");
|
|
|
|
aSVGElement->SetMayHaveClass();
|
|
if (aDoSetAttr) {
|
|
aSVGElement->SetAttr(kNameSpaceID_None, nsGkAtoms::_class, aValue, true);
|
|
}
|
|
if (!mAnimVal.IsVoid()) {
|
|
aSVGElement->AnimationNeedsResample();
|
|
}
|
|
}
|
|
|
|
void SVGAnimatedClass::GetBaseValue(nsAString& aValue,
|
|
const SVGElement* aSVGElement) const {
|
|
aSVGElement->GetAttr(nsGkAtoms::_class, aValue);
|
|
}
|
|
|
|
void SVGAnimatedClass::GetAnimValue(nsAString& aResult,
|
|
const SVGElement* aSVGElement) const {
|
|
if (!mAnimVal.IsVoid()) {
|
|
aResult = mAnimVal;
|
|
return;
|
|
}
|
|
|
|
aSVGElement->GetAttr(nsGkAtoms::_class, aResult);
|
|
}
|
|
|
|
void SVGAnimatedClass::SetAnimValue(const nsAString& aValue,
|
|
SVGElement* aSVGElement) {
|
|
if (!mAnimVal.IsVoid() && mAnimVal.Equals(aValue)) {
|
|
return;
|
|
}
|
|
aSVGElement->WillAnimateClass();
|
|
mAnimVal = aValue;
|
|
aSVGElement->SetMayHaveClass();
|
|
aSVGElement->DidAnimateClass();
|
|
}
|
|
|
|
std::unique_ptr<SMILAttr> SVGAnimatedClass::ToSMILAttr(
|
|
SVGElement* aSVGElement) {
|
|
return std::make_unique<SMILString>(this, aSVGElement);
|
|
}
|
|
|
|
nsresult SVGAnimatedClass::SMILString::ValueFromString(
|
|
const nsAString& aStr, const dom::SVGAnimationElement* /*aSrcElement*/,
|
|
SMILValue& aValue, bool& aPreventCachingOfSandwich) const {
|
|
SMILValue val(SMILStringType::Singleton());
|
|
|
|
*static_cast<nsAString*>(val.mU.mPtr) = aStr;
|
|
aValue = std::move(val);
|
|
return NS_OK;
|
|
}
|
|
|
|
SMILValue SVGAnimatedClass::SMILString::GetBaseValue() const {
|
|
SMILValue val(SMILStringType::Singleton());
|
|
mSVGElement->GetAttr(nsGkAtoms::_class,
|
|
*static_cast<nsAString*>(val.mU.mPtr));
|
|
return val;
|
|
}
|
|
|
|
void SVGAnimatedClass::SMILString::ClearAnimValue() {
|
|
if (!mVal->mAnimVal.IsVoid()) {
|
|
mSVGElement->WillAnimateClass();
|
|
mVal->mAnimVal = VoidString();
|
|
mSVGElement->DidAnimateClass();
|
|
}
|
|
}
|
|
|
|
nsresult SVGAnimatedClass::SMILString::SetAnimValue(const SMILValue& aValue) {
|
|
NS_ASSERTION(aValue.mType == SMILStringType::Singleton(),
|
|
"Unexpected type to assign animated value");
|
|
if (aValue.mType == SMILStringType::Singleton()) {
|
|
mVal->SetAnimValue(*static_cast<nsAString*>(aValue.mU.mPtr), mSVGElement);
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
} // namespace mozilla
|