commit 747e38c2bb65bd0908f645822041f5ffc419868b
parent 1a8092d3eeea75e280e43fcf077a14996c6511c5
Author: longsonr <longsonr@gmail.com>
Date: Wed, 19 Nov 2025 13:51:33 +0000
Bug 1999989 Part 2 - refactor SVGAnimatedViewBox interface r=emilio
Differential Revision: https://phabricator.services.mozilla.com/D272472
Diffstat:
3 files changed, 46 insertions(+), 40 deletions(-)
diff --git a/dom/svg/SVGAnimatedViewBox.cpp b/dom/svg/SVGAnimatedViewBox.cpp
@@ -148,18 +148,28 @@ void SVGAnimatedViewBox::SetAnimValue(const SVGViewBox& aRect,
aSVGElement->DidAnimateViewBox();
}
+void SVGAnimatedViewBox::SetBaseField(float aValue, SVGElement* aSVGElement,
+ float& aField) {
+ if (!mHasBaseVal) {
+ aField = aValue;
+ return;
+ }
+ if (aField == aValue) {
+ return;
+ }
+ AutoChangeViewBoxNotifier notifier(this, aSVGElement);
+ aField = aValue;
+}
+
void SVGAnimatedViewBox::SetBaseValue(const SVGViewBox& aRect,
- SVGElement* aSVGElement) {
- if (!mHasBaseVal || mBaseVal == aRect) {
- // This method is used to set a single x, y, width
- // or height value. It can't create a base value
- // as the other components may be undefined. We record
- // the new value though, so as not to lose data.
- mBaseVal = aRect;
+ SVGElement* aSVGElement,
+ bool aDoSetAttr) {
+ // Comparison against mBaseVal is only valid if we currently have a base val.
+ if (mHasBaseVal && mBaseVal == aRect) {
return;
}
- AutoChangeViewBoxNotifier notifier(this, aSVGElement);
+ AutoChangeViewBoxNotifier notifier(this, aSVGElement, aDoSetAttr);
mBaseVal = aRect;
mHasBaseVal = true;
@@ -174,15 +184,7 @@ nsresult SVGAnimatedViewBox::SetBaseValueString(const nsAString& aValue,
if (NS_FAILED(rv)) {
return rv;
}
- // Comparison against mBaseVal is only valid if we currently have a base val.
- if (mHasBaseVal && viewBox == mBaseVal) {
- return NS_OK;
- }
-
- AutoChangeViewBoxNotifier notifier(this, aSVGElement, aDoSetAttr);
- mHasBaseVal = true;
- mBaseVal = viewBox;
-
+ SetBaseValue(viewBox, aSVGElement, aDoSetAttr);
return NS_OK;
}
diff --git a/dom/svg/SVGAnimatedViewBox.h b/dom/svg/SVGAnimatedViewBox.h
@@ -99,7 +99,20 @@ class SVGAnimatedViewBox {
}
const SVGViewBox& GetBaseValue() const { return mBaseVal; }
- void SetBaseValue(const SVGViewBox& aRect, SVGElement* aSVGElement);
+ void SetBaseX(float aX, SVGElement* aSVGElement) {
+ SetBaseField(aX, aSVGElement, mBaseVal.x);
+ }
+ void SetBaseY(float aY, SVGElement* aSVGElement) {
+ SetBaseField(aY, aSVGElement, mBaseVal.y);
+ }
+ void SetBaseWidth(float aWidth, SVGElement* aSVGElement) {
+ SetBaseField(aWidth, aSVGElement, mBaseVal.width);
+ }
+ void SetBaseHeight(float aHeight, SVGElement* aSVGElement) {
+ SetBaseField(aHeight, aSVGElement, mBaseVal.height);
+ }
+ void SetBaseValue(const SVGViewBox& aRect, SVGElement* aSVGElement,
+ bool aDoSetAttr);
const SVGViewBox& GetAnimValue() const {
return mAnimVal ? *mAnimVal : mBaseVal;
}
@@ -119,6 +132,8 @@ class SVGAnimatedViewBox {
UniquePtr<SMILAttr> ToSMILAttr(SVGElement* aSVGElement);
private:
+ void SetBaseField(float aHeight, SVGElement* aSVGElement, float& aElement);
+
SVGViewBox mBaseVal;
UniquePtr<SVGViewBox> mAnimVal;
bool mHasBaseVal;
diff --git a/dom/svg/SVGRect.cpp b/dom/svg/SVGRect.cpp
@@ -38,7 +38,7 @@ JSObject* SVGRect::WrapObject(JSContext* aCx,
float SVGRect::X() {
switch (mType) {
case RectType::AnimValue:
- static_cast<SVGElement*>(mParent->AsElement())->FlushAnimations();
+ static_cast<SVGElement*>(mParent.get())->FlushAnimations();
return mVal->GetAnimValue().x;
case RectType::BaseValue:
return mVal->GetBaseValue().x;
@@ -50,7 +50,7 @@ float SVGRect::X() {
float SVGRect::Y() {
switch (mType) {
case RectType::AnimValue:
- static_cast<SVGElement*>(mParent->AsElement())->FlushAnimations();
+ static_cast<SVGElement*>(mParent.get())->FlushAnimations();
return mVal->GetAnimValue().y;
case RectType::BaseValue:
return mVal->GetBaseValue().y;
@@ -62,7 +62,7 @@ float SVGRect::Y() {
float SVGRect::Width() {
switch (mType) {
case RectType::AnimValue:
- static_cast<SVGElement*>(mParent->AsElement())->FlushAnimations();
+ static_cast<SVGElement*>(mParent.get())->FlushAnimations();
return mVal->GetAnimValue().width;
case RectType::BaseValue:
return mVal->GetBaseValue().width;
@@ -74,7 +74,7 @@ float SVGRect::Width() {
float SVGRect::Height() {
switch (mType) {
case RectType::AnimValue:
- static_cast<SVGElement*>(mParent->AsElement())->FlushAnimations();
+ static_cast<SVGElement*>(mParent.get())->FlushAnimations();
return mVal->GetAnimValue().height;
case RectType::BaseValue:
return mVal->GetBaseValue().height;
@@ -88,12 +88,9 @@ void SVGRect::SetX(float aX, ErrorResult& aRv) {
case RectType::AnimValue:
aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
return;
- case RectType::BaseValue: {
- SVGViewBox rect = mVal->GetBaseValue();
- rect.x = aX;
- mVal->SetBaseValue(rect, static_cast<SVGElement*>(mParent->AsElement()));
+ case RectType::BaseValue:
+ mVal->SetBaseX(aX, static_cast<SVGElement*>(mParent.get()));
return;
- }
default:
mRect.x = aX;
}
@@ -104,12 +101,9 @@ void SVGRect::SetY(float aY, ErrorResult& aRv) {
case RectType::AnimValue:
aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
return;
- case RectType::BaseValue: {
- SVGViewBox rect = mVal->GetBaseValue();
- rect.y = aY;
- mVal->SetBaseValue(rect, static_cast<SVGElement*>(mParent->AsElement()));
+ case RectType::BaseValue:
+ mVal->SetBaseY(aY, static_cast<SVGElement*>(mParent.get()));
return;
- }
default:
mRect.y = aY;
}
@@ -121,9 +115,7 @@ void SVGRect::SetWidth(float aWidth, ErrorResult& aRv) {
aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
return;
case RectType::BaseValue: {
- SVGViewBox rect = mVal->GetBaseValue();
- rect.width = aWidth;
- mVal->SetBaseValue(rect, static_cast<SVGElement*>(mParent->AsElement()));
+ mVal->SetBaseWidth(aWidth, static_cast<SVGElement*>(mParent.get()));
return;
}
default:
@@ -136,12 +128,9 @@ void SVGRect::SetHeight(float aHeight, ErrorResult& aRv) {
case RectType::AnimValue:
aRv.ThrowNoModificationAllowedError("Animated values cannot be set");
return;
- case RectType::BaseValue: {
- SVGViewBox rect = mVal->GetBaseValue();
- rect.height = aHeight;
- mVal->SetBaseValue(rect, static_cast<SVGElement*>(mParent->AsElement()));
+ case RectType::BaseValue:
+ mVal->SetBaseHeight(aHeight, static_cast<SVGElement*>(mParent.get()));
return;
- }
default:
mRect.height = aHeight;
}