tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdom/svg/SVGAnimatedViewBox.cpp | 36+++++++++++++++++++-----------------
Mdom/svg/SVGAnimatedViewBox.h | 17++++++++++++++++-
Mdom/svg/SVGRect.cpp | 33+++++++++++----------------------
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; }