From 2ca2942f10e35d3484d881f3d0dca996521238a9 Mon Sep 17 00:00:00 2001 From: Robert Longson Date: Thu, 7 Oct 2010 12:19:32 -0700 Subject: [PATCH] Bug 571863: Make sure to update graphic and/or invalidate transform on an inner element when its various attributes are modified. r=dholbert a=blocking-betaN+ --- layout/reftests/svg/dynamic-inner-svg-01.svg | 40 ++++++++++++++++++++ layout/reftests/svg/reftest.list | 1 + layout/svg/base/src/nsSVGInnerSVGFrame.cpp | 24 ++++++++++++ layout/svg/base/src/nsSVGInnerSVGFrame.h | 8 ++-- 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 layout/reftests/svg/dynamic-inner-svg-01.svg diff --git a/layout/reftests/svg/dynamic-inner-svg-01.svg b/layout/reftests/svg/dynamic-inner-svg-01.svg new file mode 100644 index 000000000000..148188bb5d06 --- /dev/null +++ b/layout/reftests/svg/dynamic-inner-svg-01.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/layout/reftests/svg/reftest.list b/layout/reftests/svg/reftest.list index b3ca6310ff97..9c73490779dc 100644 --- a/layout/reftests/svg/reftest.list +++ b/layout/reftests/svg/reftest.list @@ -45,6 +45,7 @@ include svg-integration/reftest.list == dynamic-filter-contents-01.svg dynamic-filter-contents-01-ref.svg == dynamic-gradient-contents-01.svg pass.svg == dynamic-gradient-contents-02.svg pass.svg +== dynamic-inner-svg-01.svg pass.svg == dynamic-link-style-01.svg pass.svg == dynamic-marker-01.svg pass.svg == dynamic-marker-02.svg dynamic-marker-02-ref.svg diff --git a/layout/svg/base/src/nsSVGInnerSVGFrame.cpp b/layout/svg/base/src/nsSVGInnerSVGFrame.cpp index 4cf9aae1cc90..f6d713a25f12 100644 --- a/layout/svg/base/src/nsSVGInnerSVGFrame.cpp +++ b/layout/svg/base/src/nsSVGInnerSVGFrame.cpp @@ -157,6 +157,30 @@ nsSVGInnerSVGFrame::NotifySVGChanged(PRUint32 aFlags) nsSVGInnerSVGFrameBase::NotifySVGChanged(aFlags); } +NS_IMETHODIMP +nsSVGInnerSVGFrame::AttributeChanged(PRInt32 aNameSpaceID, + nsIAtom* aAttribute, + PRInt32 aModType) +{ + if (aNameSpaceID == kNameSpaceID_None) { + if (aAttribute == nsGkAtoms::width || + aAttribute == nsGkAtoms::height || + aAttribute == nsGkAtoms::preserveAspectRatio || + aAttribute == nsGkAtoms::viewBox) { + nsSVGUtils::UpdateGraphic(this); + } else if (aAttribute == nsGkAtoms::transform || + aAttribute == nsGkAtoms::x || + aAttribute == nsGkAtoms::y) { + // make sure our cached transform matrix gets (lazily) updated + mCanvasTM = nsnull; + + nsSVGUtils::NotifyChildrenOfSVGChange(this, TRANSFORM_CHANGED); + } + } + + return NS_OK; +} + NS_IMETHODIMP_(nsIFrame*) nsSVGInnerSVGFrame::GetFrameForPoint(const nsPoint &aPoint) { diff --git a/layout/svg/base/src/nsSVGInnerSVGFrame.h b/layout/svg/base/src/nsSVGInnerSVGFrame.h index bbf64a284bf7..d43199ef41de 100644 --- a/layout/svg/base/src/nsSVGInnerSVGFrame.h +++ b/layout/svg/base/src/nsSVGInnerSVGFrame.h @@ -56,10 +56,6 @@ public: NS_DECL_QUERYFRAME NS_DECL_FRAMEARENA_HELPERS - // We don't define an AttributeChanged method since changes to the - // 'x', 'y', 'width' and 'height' attributes of our content object - // are handled in nsSVGSVGElement::DidModifySVGObservable - #ifdef DEBUG NS_IMETHOD Init(nsIContent* aContent, nsIFrame* aParent, @@ -80,6 +76,10 @@ public: } #endif + NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID, + nsIAtom* aAttribute, + PRInt32 aModType); + // nsISVGChildFrame interface: NS_IMETHOD PaintSVG(nsSVGRenderState *aContext, const nsIntRect *aDirtyRect); virtual void NotifySVGChanged(PRUint32 aFlags);