Bug 548899: Don't issue attribute-changed notification when transform attribute is animated. r=jwatt sr=roc

This commit is contained in:
Daniel Holbert 2010-03-02 07:36:31 -08:00
parent 6db6a6b16a
commit d5d1ef1794
6 changed files with 34 additions and 5 deletions

View File

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<circle id="circleID" cx="20" cy="100" r="10" fill="orange" stroke="black">
<animateTransform attributeName="transform" type="scale"
from="1" to="2" begin="0" dur="3"/>
</circle>
<rect id="rectID" fill="green" stroke="black" height="100" width="100">
<animate attributeName="fill" from="white" to="blue" begin="0" dur="3"/>
</rect>
</defs>
<use xlink:href="#circleID"/>
</svg>

After

Width:  |  Height:  |  Size: 567 B

View File

@ -6,3 +6,4 @@ load 526875-2.svg
load 529387-1.xhtml
load 537157-1.svg
load 547333-1.svg
load 548899-1.svg

View File

@ -1608,6 +1608,18 @@ nsSVGElement::DidAnimatePreserveAspectRatio()
}
}
void
nsSVGElement::DidAnimateTransform()
{
nsIFrame* frame = GetPrimaryFrame();
if (frame) {
frame->AttributeChanged(kNameSpaceID_None,
nsGkAtoms::transform,
nsIDOMMutationEvent::MODIFICATION);
}
}
nsSVGElement::StringAttributesInfo
nsSVGElement::GetStringInfo()
{
@ -1782,7 +1794,7 @@ nsSVGElement::GetAnimatedAttr(const nsIAtom* aName)
= static_cast<nsSVGAnimatedTransformList*>(transformList.get());
NS_ENSURE_TRUE(list, nsnull);
return new nsSVGTransformSMILAttr(list);
return new nsSVGTransformSMILAttr(list, this);
}
// Lengths:

View File

@ -163,6 +163,7 @@ public:
virtual void DidAnimateEnum(PRUint8 aAttrEnum);
virtual void DidAnimateViewBox();
virtual void DidAnimatePreserveAspectRatio();
virtual void DidAnimateTransform();
void GetAnimatedLengthValues(float *aFirst, ...);
void GetAnimatedNumberValues(float *aFirst, ...);

View File

@ -113,7 +113,6 @@ nsSVGTransformSMILAttr::SetAnimValue(const nsSMILValue& aValue)
nsresult rv = NS_OK;
// Create the anim value if necessary
mVal->WillModify(nsISVGValue::mod_other);
if (!mVal->mAnimVal) {
rv = nsSVGTransformList::Create(getter_AddRefs(mVal->mAnimVal));
NS_ENSURE_SUCCESS(rv,rv);
@ -128,7 +127,7 @@ nsSVGTransformSMILAttr::SetAnimValue(const nsSMILValue& aValue)
}
NS_ENSURE_SUCCESS(rv,rv);
mVal->DidModify(nsISVGValue::mod_other);
mSVGElement->DidAnimateTransform();
return NS_OK;
}

View File

@ -52,8 +52,9 @@ class nsSVGSMILTransform;
class nsSVGTransformSMILAttr : public nsISMILAttr
{
public:
nsSVGTransformSMILAttr(nsSVGAnimatedTransformList* aTransform)
: mVal(aTransform) {}
nsSVGTransformSMILAttr(nsSVGAnimatedTransformList* aTransform,
nsSVGElement* aSVGElement)
: mVal(aTransform), mSVGElement(aSVGElement) {}
// nsISMILAttr methods
virtual nsresult ValueFromString(const nsAString& aStr,
@ -83,6 +84,7 @@ private:
// created & destroyed during a SMIL sample-step, during which time the DOM
// isn't modified.
nsSVGAnimatedTransformList* mVal;
nsSVGElement* mSVGElement;
};
#endif // NS_SVGTRANSFORMSMILATTR_H_