зеркало из https://github.com/mozilla/pjs.git
Bug 301628 - first pass at removal of svg observer mechanism.
r=scooter/jwatt, sr=roc
This commit is contained in:
Родитель
bb0367ba1b
Коммит
8ce0e30c94
|
@ -68,7 +68,7 @@
|
|||
#include "nsIEventListenerManager.h"
|
||||
|
||||
nsSVGElement::nsSVGElement(nsINodeInfo *aNodeInfo)
|
||||
: nsGenericElement(aNodeInfo)
|
||||
: nsGenericElement(aNodeInfo), mSuppressNotification(PR_FALSE)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -186,6 +186,11 @@ nsSVGElement::ParseAttribute(PRInt32 aNamespaceID,
|
|||
}
|
||||
|
||||
if (svg_value) {
|
||||
// We want to prevent DidModifySVGObservable from running if we
|
||||
// come in this route, otherwise AttributeChanged() gets called
|
||||
// twice (once through DidMOdifySVGObservable, once through SetAttr).
|
||||
mSuppressNotification = PR_TRUE;
|
||||
|
||||
if (NS_FAILED(svg_value->SetValueString(aValue))) {
|
||||
// The value was rejected. This happens e.g. in a XUL template
|
||||
// when trying to set a value like "?x" on a value object that
|
||||
|
@ -207,6 +212,7 @@ nsSVGElement::ParseAttribute(PRInt32 aNamespaceID,
|
|||
else {
|
||||
aResult.SetTo(svg_value);
|
||||
}
|
||||
mSuppressNotification = PR_FALSE;
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
|
@ -532,6 +538,10 @@ nsSVGElement::DidModifySVGObservable(nsISVGValue* aObservable,
|
|||
if (aModType == nsISVGValue::mod_context)
|
||||
return NS_OK;
|
||||
|
||||
// Return without setting DOM attribute
|
||||
if (mSuppressNotification)
|
||||
return NS_OK;
|
||||
|
||||
PRUint32 i, count = mMappedAttributes.AttrCount();
|
||||
const nsAttrValue* attrValue = nsnull;
|
||||
for (i = 0; i < count; ++i) {
|
||||
|
|
|
@ -136,6 +136,8 @@ protected:
|
|||
|
||||
nsCOMPtr<nsICSSStyleRule> mContentStyleRule;
|
||||
nsAttrAndChildArray mMappedAttributes;
|
||||
|
||||
PRPackedBool mSuppressNotification;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -43,9 +43,10 @@
|
|||
#include "nsIDOMSVGCircleElement.h"
|
||||
#include "nsIDOMSVGElement.h"
|
||||
#include "nsIDOMSVGSVGElement.h"
|
||||
//#include "nsASVGPathBuilder.h"
|
||||
#include "nsISVGRendererPathBuilder.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
class nsSVGCircleFrame : public nsSVGPathGeometryFrame
|
||||
{
|
||||
|
@ -53,7 +54,6 @@ protected:
|
|||
friend nsIFrame*
|
||||
NS_NewSVGCircleFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
virtual ~nsSVGCircleFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
|
@ -71,9 +71,10 @@ public:
|
|||
}
|
||||
#endif
|
||||
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
@ -101,17 +102,6 @@ NS_NewSVGCircleFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGCircleFrame;
|
||||
}
|
||||
|
||||
nsSVGCircleFrame::~nsSVGCircleFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mCx && (value = do_QueryInterface(mCx)))
|
||||
value->RemoveObserver(this);
|
||||
if (mCy && (value = do_QueryInterface(mCy)))
|
||||
value->RemoveObserver(this);
|
||||
if (mR && (value = do_QueryInterface(mR)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGCircleFrame::InitSVG()
|
||||
{
|
||||
|
@ -128,31 +118,22 @@ nsSVGCircleFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mCx));
|
||||
NS_ASSERTION(mCx, "no cx");
|
||||
if (!mCx) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mCx);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLength> length;
|
||||
circle->GetCy(getter_AddRefs(length));
|
||||
length->GetAnimVal(getter_AddRefs(mCy));
|
||||
NS_ASSERTION(mCx, "no cy");
|
||||
if (!mCx) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mCy);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
NS_ASSERTION(mCy, "no cy");
|
||||
if (!mCy) return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLength> length;
|
||||
circle->GetR(getter_AddRefs(length));
|
||||
length->GetAnimVal(getter_AddRefs(mR));
|
||||
NS_ASSERTION(mCx, "no r");
|
||||
if (!mCx) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mR);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
NS_ASSERTION(mR, "no r");
|
||||
if (!mR) return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -165,19 +146,23 @@ nsSVGCircleFrame::GetType() const
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGCircleFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGCircleFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLength> l = do_QueryInterface(observable);
|
||||
if (l && (mCx==l || mCy==l || mR==l)) {
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::cx ||
|
||||
aAttribute == nsGkAtoms::cy ||
|
||||
aAttribute == nsGkAtoms::r)) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
// else
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -47,6 +47,8 @@
|
|||
#include "nsIDOMSVGTransformList.h"
|
||||
#include "nsSVGDefsFrame.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
@ -57,37 +59,11 @@ NS_NewSVGDefsFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGDefsFrame;
|
||||
}
|
||||
|
||||
nsSVGDefsFrame::nsSVGDefsFrame()
|
||||
{
|
||||
}
|
||||
|
||||
nsSVGDefsFrame::~nsSVGDefsFrame()
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGTransformable> transformable = do_QueryInterface(mContent);
|
||||
if (!transformable)
|
||||
return;
|
||||
|
||||
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms;
|
||||
transformable->GetTransform(getter_AddRefs(transforms));
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(transforms);
|
||||
NS_ASSERTION(value, "interface not found");
|
||||
if (value)
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
// Stub method specialized by subclasses. Not called by said
|
||||
// specializations.
|
||||
NS_IMETHODIMP
|
||||
nsSVGDefsFrame::InitSVG()
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGTransformable> transformable = do_QueryInterface(mContent);
|
||||
if (!transformable)
|
||||
return NS_OK;
|
||||
|
||||
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms;
|
||||
transformable->GetTransform(getter_AddRefs(transforms));
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(transforms);
|
||||
NS_ASSERTION(value, "interface not found");
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -97,8 +73,6 @@ nsSVGDefsFrame::InitSVG()
|
|||
NS_INTERFACE_MAP_BEGIN(nsSVGDefsFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGChildFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGContainerFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGValueObserver)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGDefsFrameBase)
|
||||
|
||||
|
||||
|
@ -195,34 +169,27 @@ nsSVGDefsFrame::IsFrameOfType(PRUint32 aFlags) const
|
|||
return !(aFlags & ~nsIFrame::eSVG);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGDefsFrame::WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGDefsFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
aAttribute == nsGkAtoms::transform) {
|
||||
// make sure our cached transform matrix gets (lazily) updated
|
||||
mCanvasTM = nsnull;
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGDefsFrame::DidModifySVGObservable (nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
{
|
||||
// make sure our cached transform matrix gets (lazily) updated
|
||||
mCanvasTM = nsnull;
|
||||
for (nsIFrame* kid = mFrames.FirstChild(); kid;
|
||||
kid = kid->GetNextSibling()) {
|
||||
nsISVGChildFrame* SVGFrame=nsnull;
|
||||
kid->QueryInterface(NS_GET_IID(nsISVGChildFrame),(void**)&SVGFrame);
|
||||
if (SVGFrame)
|
||||
SVGFrame->NotifyCanvasTMChanged(PR_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
for (nsIFrame* kid = mFrames.FirstChild(); kid;
|
||||
kid = kid->GetNextSibling()) {
|
||||
nsISVGChildFrame* SVGFrame=nsnull;
|
||||
kid->QueryInterface(NS_GET_IID(nsISVGChildFrame),(void**)&SVGFrame);
|
||||
if (SVGFrame)
|
||||
SVGFrame->NotifyCanvasTMChanged(PR_FALSE);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGChildFrame methods
|
||||
|
|
|
@ -42,23 +42,17 @@
|
|||
#include "nsContainerFrame.h"
|
||||
#include "nsISVGChildFrame.h"
|
||||
#include "nsISVGContainerFrame.h"
|
||||
#include "nsISVGValueObserver.h"
|
||||
#include "nsWeakReference.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
|
||||
typedef nsContainerFrame nsSVGDefsFrameBase;
|
||||
|
||||
class nsSVGDefsFrame : public nsSVGDefsFrameBase,
|
||||
public nsISVGChildFrame,
|
||||
public nsISVGContainerFrame,
|
||||
public nsISVGValueObserver,
|
||||
public nsSupportsWeakReference
|
||||
public nsISVGContainerFrame
|
||||
{
|
||||
friend nsIFrame*
|
||||
NS_NewSVGDefsFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
protected:
|
||||
nsSVGDefsFrame();
|
||||
virtual ~nsSVGDefsFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
// nsISupports interface:
|
||||
|
@ -81,6 +75,10 @@ public:
|
|||
nsIFrame* aParent,
|
||||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow);
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
/**
|
||||
* Get the "type" of the frame
|
||||
*
|
||||
|
@ -96,15 +94,6 @@ public:
|
|||
}
|
||||
#endif
|
||||
|
||||
// nsISVGValueObserver
|
||||
NS_IMETHOD WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
NS_IMETHOD DidModifySVGObservable (nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
|
||||
// nsISupportsWeakReference
|
||||
// implementation inherited from nsSupportsWeakReference
|
||||
|
||||
// nsISVGChildFrame interface:
|
||||
NS_IMETHOD PaintSVG(nsISVGRendererCanvas* canvas,
|
||||
const nsRect& dirtyRectTwips,
|
||||
|
|
|
@ -46,14 +46,14 @@
|
|||
#include "nsIDOMSVGSVGElement.h"
|
||||
#include "nsISVGRendererPathBuilder.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
class nsSVGEllipseFrame : public nsSVGPathGeometryFrame
|
||||
{
|
||||
friend nsIFrame*
|
||||
NS_NewSVGEllipseFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
virtual ~nsSVGEllipseFrame();
|
||||
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
/**
|
||||
|
@ -70,9 +70,10 @@ class nsSVGEllipseFrame : public nsSVGPathGeometryFrame
|
|||
}
|
||||
#endif
|
||||
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
@ -100,19 +101,6 @@ NS_NewSVGEllipseFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGEllipseFrame;
|
||||
}
|
||||
|
||||
nsSVGEllipseFrame::~nsSVGEllipseFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mCx && (value = do_QueryInterface(mCx)))
|
||||
value->RemoveObserver(this);
|
||||
if (mCy && (value = do_QueryInterface(mCy)))
|
||||
value->RemoveObserver(this);
|
||||
if (mRx && (value = do_QueryInterface(mRx)))
|
||||
value->RemoveObserver(this);
|
||||
if (mRy && (value = do_QueryInterface(mRy)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGEllipseFrame::InitSVG()
|
||||
{
|
||||
|
@ -128,9 +116,6 @@ nsSVGEllipseFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mCx));
|
||||
NS_ASSERTION(mCx, "no cx");
|
||||
if (!mCx) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mCx);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -139,9 +124,6 @@ nsSVGEllipseFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mCy));
|
||||
NS_ASSERTION(mCy, "no cy");
|
||||
if (!mCy) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mCy);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -150,9 +132,6 @@ nsSVGEllipseFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mRx));
|
||||
NS_ASSERTION(mRx, "no rx");
|
||||
if (!mRx) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mRx);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -161,9 +140,6 @@ nsSVGEllipseFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mRy));
|
||||
NS_ASSERTION(mRy, "no ry");
|
||||
if (!mRy) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mRy);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -176,19 +152,24 @@ nsSVGEllipseFrame::GetType() const
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGEllipseFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGEllipseFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLength> l = do_QueryInterface(observable);
|
||||
if (l && (mCx==l || mCy==l || mRx==l || mRy==l)) {
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::cx ||
|
||||
aAttribute == nsGkAtoms::cy ||
|
||||
aAttribute == nsGkAtoms::rx ||
|
||||
aAttribute == nsGkAtoms::ry)) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
// else
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -61,10 +61,14 @@
|
|||
#include "nsSVGPoint.h"
|
||||
#include "nsIDOMSVGAnimatedInteger.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsISVGValueObserver.h"
|
||||
#include "nsWeakReference.h"
|
||||
|
||||
class nsSVGFilterFrame : public nsSVGDefsFrame,
|
||||
public nsSVGValue,
|
||||
public nsISVGFilterFrame
|
||||
public nsISVGFilterFrame,
|
||||
public nsISVGValueObserver,
|
||||
public nsSupportsWeakReference
|
||||
{
|
||||
protected:
|
||||
friend nsIFrame*
|
||||
|
@ -121,6 +125,8 @@ private:
|
|||
NS_INTERFACE_MAP_BEGIN(nsSVGFilterFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGValue)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGFilterFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGValueObserver)
|
||||
NS_INTERFACE_MAP_ENTRY(nsSupportsWeakReference)
|
||||
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsISVGValue)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGDefsFrame)
|
||||
|
||||
|
|
|
@ -64,6 +64,8 @@
|
|||
#include "nsSVGPoint.h"
|
||||
#include "nsSVGRect.h"
|
||||
#include "nsSVGMatrix.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
@ -91,24 +93,6 @@ nsSVGForeignObjectFrame::nsSVGForeignObjectFrame()
|
|||
|
||||
nsSVGForeignObjectFrame::~nsSVGForeignObjectFrame()
|
||||
{
|
||||
// nsCOMPtr<nsIDOMSVGTransformable> transformable = do_QueryInterface(mContent);
|
||||
// NS_ASSERTION(transformable, "wrong content element");
|
||||
// nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms;
|
||||
// transformable->GetTransform(getter_AddRefs(transforms));
|
||||
// nsCOMPtr<nsISVGValue> value = do_QueryInterface(transforms);
|
||||
// NS_ASSERTION(value, "interface not found");
|
||||
// if (value)
|
||||
// value->RemoveObserver(this);
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mX && (value = do_QueryInterface(mX)))
|
||||
value->RemoveObserver(this);
|
||||
if (mY && (value = do_QueryInterface(mY)))
|
||||
value->RemoveObserver(this);
|
||||
if (mWidth && (value = do_QueryInterface(mWidth)))
|
||||
value->RemoveObserver(this);
|
||||
if (mHeight && (value = do_QueryInterface(mHeight)))
|
||||
value->RemoveObserver(this);
|
||||
|
||||
if (mFilter) {
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mFilter);
|
||||
}
|
||||
|
@ -125,9 +109,6 @@ nsresult nsSVGForeignObjectFrame::Init()
|
|||
length->GetAnimVal(getter_AddRefs(mX));
|
||||
NS_ASSERTION(mX, "no x");
|
||||
if (!mX) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mX);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -136,9 +117,6 @@ nsresult nsSVGForeignObjectFrame::Init()
|
|||
length->GetAnimVal(getter_AddRefs(mY));
|
||||
NS_ASSERTION(mY, "no y");
|
||||
if (!mY) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mY);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -147,9 +125,6 @@ nsresult nsSVGForeignObjectFrame::Init()
|
|||
length->GetAnimVal(getter_AddRefs(mWidth));
|
||||
NS_ASSERTION(mWidth, "no width");
|
||||
if (!mWidth) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mWidth);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -158,21 +133,8 @@ nsresult nsSVGForeignObjectFrame::Init()
|
|||
length->GetAnimVal(getter_AddRefs(mHeight));
|
||||
NS_ASSERTION(mHeight, "no height");
|
||||
if (!mHeight) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mHeight);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
// XXX
|
||||
// nsCOMPtr<nsIDOMSVGTransformable> transformable = do_QueryInterface(mContent);
|
||||
// NS_ASSERTION(transformable, "wrong content element");
|
||||
// nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms;
|
||||
// transformable->GetTransform(getter_AddRefs(transforms));
|
||||
// nsCOMPtr<nsISVGValue> value = do_QueryInterface(transforms);
|
||||
// NS_ASSERTION(value, "interface not found");
|
||||
// if (value)
|
||||
// value->AddObserver(this);
|
||||
|
||||
// XXX for some reason updating fails when done here. Why is this too early?
|
||||
// anyway - we use a less desirable mechanism now of updating in paint().
|
||||
// Update();
|
||||
|
@ -294,6 +256,22 @@ nsSVGForeignObjectFrame::IsFrameOfType(PRUint32 aFlags) const
|
|||
return !(aFlags & ~(nsIFrame::eSVG | nsIFrame::eSVGForeignObject));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGForeignObjectFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y ||
|
||||
aAttribute == nsGkAtoms::width ||
|
||||
aAttribute == nsGkAtoms::height ||
|
||||
aAttribute == nsGkAtoms::transform))
|
||||
Update();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
|
||||
|
|
|
@ -92,7 +92,11 @@ public:
|
|||
|
||||
NS_IMETHOD RemoveFrame(nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
|
||||
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
/**
|
||||
* Get the "type" of the frame
|
||||
*
|
||||
|
|
|
@ -52,6 +52,11 @@
|
|||
#include "nsISVGValueUtils.h"
|
||||
#include "nsSVGMaskFrame.h"
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN(nsSVGGFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGValueObserver)
|
||||
NS_INTERFACE_MAP_ENTRY(nsSupportsWeakReference)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGDefsFrame)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation
|
||||
|
||||
|
@ -336,11 +341,9 @@ nsSVGGFrame::WillModifySVGObservable(nsISVGValue* observable,
|
|||
nsCOMPtr<nsISVGRendererRegion> region;
|
||||
nsSVGUtils::FindFilterInvalidation(this, getter_AddRefs(region));
|
||||
outerSVGFrame->InvalidateRegion(region, PR_TRUE);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return nsSVGGFrameBase::WillModifySVGObservable(observable, aModType);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -370,5 +373,5 @@ nsSVGGFrame::DidModifySVGObservable(nsISVGValue* observable,
|
|||
outerSVGFrame->InvalidateRegion(region, PR_TRUE);
|
||||
}
|
||||
|
||||
return nsSVGGFrameBase::DidModifySVGObservable(observable, aModType);
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -40,12 +40,16 @@
|
|||
#define NSSVGGFRAME_H
|
||||
|
||||
#include "nsSVGDefsFrame.h"
|
||||
#include "nsISVGValueObserver.h"
|
||||
#include "nsWeakReference.h"
|
||||
|
||||
typedef nsSVGDefsFrame nsSVGGFrameBase;
|
||||
|
||||
class nsISVGFilterFrame;
|
||||
|
||||
class nsSVGGFrame : public nsSVGGFrameBase
|
||||
class nsSVGGFrame : public nsSVGGFrameBase,
|
||||
public nsISVGValueObserver,
|
||||
public nsSupportsWeakReference
|
||||
{
|
||||
public:
|
||||
nsSVGGFrame() : mFilter(nsnull), mPropagateTransform(PR_TRUE) {}
|
||||
|
@ -67,6 +71,11 @@ public:
|
|||
#endif
|
||||
|
||||
protected:
|
||||
// nsISupports interface:
|
||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
NS_IMETHOD_(nsrefcnt) AddRef() { return NS_OK; }
|
||||
NS_IMETHOD_(nsrefcnt) Release() { return NS_OK; }
|
||||
|
||||
friend nsIFrame*
|
||||
NS_NewSVGGFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
|
|
|
@ -59,6 +59,8 @@
|
|||
#include "nsSVGFilterFrame.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsSVGMaskFrame.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
#define NS_GET_BIT(rowptr, x) (rowptr[(x)>>3] & (1<<(7-(x)&0x7)))
|
||||
|
||||
|
@ -91,9 +93,10 @@ protected:
|
|||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
@ -157,18 +160,6 @@ NS_NewSVGImageFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
|
||||
nsSVGImageFrame::~nsSVGImageFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mX && (value = do_QueryInterface(mX)))
|
||||
value->RemoveObserver(this);
|
||||
if (mY && (value = do_QueryInterface(mY)))
|
||||
value->RemoveObserver(this);
|
||||
if (mWidth && (value = do_QueryInterface(mWidth)))
|
||||
value->RemoveObserver(this);
|
||||
if (mHeight && (value = do_QueryInterface(mHeight)))
|
||||
value->RemoveObserver(this);
|
||||
if (mPreserveAspectRatio && (value = do_QueryInterface(mPreserveAspectRatio)))
|
||||
value->RemoveObserver(this);
|
||||
|
||||
// set the frame to null so we don't send messages to a dead object.
|
||||
if (mListener) {
|
||||
nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(mContent);
|
||||
|
@ -195,9 +186,6 @@ nsSVGImageFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mX));
|
||||
NS_ASSERTION(mX, "no x");
|
||||
if (!mX) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mX);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -206,9 +194,6 @@ nsSVGImageFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mY));
|
||||
NS_ASSERTION(mY, "no y");
|
||||
if (!mY) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mY);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -217,9 +202,6 @@ nsSVGImageFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mWidth));
|
||||
NS_ASSERTION(mWidth, "no width");
|
||||
if (!mWidth) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mWidth);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -228,9 +210,6 @@ nsSVGImageFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mHeight));
|
||||
NS_ASSERTION(mHeight, "no height");
|
||||
if (!mHeight) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mHeight);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -239,9 +218,6 @@ nsSVGImageFrame::InitSVG()
|
|||
ratio->GetAnimVal(getter_AddRefs(mPreserveAspectRatio));
|
||||
NS_ASSERTION(mHeight, "no preserveAspectRatio");
|
||||
if (!mPreserveAspectRatio) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mPreserveAspectRatio);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
mSurface = nsnull;
|
||||
|
@ -257,19 +233,25 @@ nsSVGImageFrame::InitSVG()
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGImageFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGImageFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLength> l = do_QueryInterface(observable);
|
||||
if (l && (mX==l || mY==l || mWidth==l || mHeight==l)) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
// else
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y ||
|
||||
aAttribute == nsGkAtoms::width ||
|
||||
aAttribute == nsGkAtoms::height ||
|
||||
aAttribute == nsGkAtoms::preserveAspectRatio)) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
#include "nsSVGClipPathFrame.h"
|
||||
#include "nsSVGMaskFrame.h"
|
||||
#include "nsISVGRendererSurface.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
typedef nsContainerFrame nsSVGInnerSVGFrameBase;
|
||||
|
||||
|
@ -98,9 +99,10 @@ public:
|
|||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow);
|
||||
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
// 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
|
||||
|
||||
/**
|
||||
* Get the "type" of the frame
|
||||
*
|
||||
|
@ -217,9 +219,6 @@ nsresult nsSVGInnerSVGFrame::Init()
|
|||
length->GetAnimVal(getter_AddRefs(mX));
|
||||
NS_ASSERTION(mX, "no x");
|
||||
if (!mX) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mX);
|
||||
if (value)
|
||||
value->AddObserver(this); // nsISVGValueObserver
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -228,9 +227,6 @@ nsresult nsSVGInnerSVGFrame::Init()
|
|||
length->GetAnimVal(getter_AddRefs(mY));
|
||||
NS_ASSERTION(mY, "no y");
|
||||
if (!mY) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mY);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -329,21 +325,6 @@ nsSVGInnerSVGFrame::RemoveFrame(nsIAtom* aListName,
|
|||
return result ? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGInnerSVGFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
nsAutoString str;
|
||||
aAttribute->ToString(str);
|
||||
printf("** nsSVGInnerSVGFrame::AttributeChanged(%s)\n",
|
||||
NS_LossyConvertUTF16toASCII(str).get());
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsIAtom *
|
||||
nsSVGInnerSVGFrame::GetType() const
|
||||
{
|
||||
|
|
|
@ -47,6 +47,8 @@
|
|||
#include "nsISVGRendererPathBuilder.h"
|
||||
#include "nsISVGMarkable.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
class nsSVGLineFrame : public nsSVGPathGeometryFrame,
|
||||
public nsISVGMarkable
|
||||
|
@ -55,7 +57,6 @@ protected:
|
|||
friend nsIFrame*
|
||||
NS_NewSVGLineFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
virtual ~nsSVGLineFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
/**
|
||||
|
@ -73,9 +74,10 @@ protected:
|
|||
#endif
|
||||
|
||||
public:
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
@ -117,19 +119,6 @@ NS_NewSVGLineFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGLineFrame;
|
||||
}
|
||||
|
||||
nsSVGLineFrame::~nsSVGLineFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mX1 && (value = do_QueryInterface(mX1)))
|
||||
value->RemoveObserver(this);
|
||||
if (mY1 && (value = do_QueryInterface(mY1)))
|
||||
value->RemoveObserver(this);
|
||||
if (mX2 && (value = do_QueryInterface(mX2)))
|
||||
value->RemoveObserver(this);
|
||||
if (mY2 && (value = do_QueryInterface(mY2)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGLineFrame::InitSVG()
|
||||
{
|
||||
|
@ -145,9 +134,6 @@ nsSVGLineFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mX1));
|
||||
NS_ASSERTION(mX1, "no x1");
|
||||
if (!mX1) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mX1);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -156,9 +142,6 @@ nsSVGLineFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mY1));
|
||||
NS_ASSERTION(mY1, "no y1");
|
||||
if (!mY1) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mY1);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -167,9 +150,6 @@ nsSVGLineFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mX2));
|
||||
NS_ASSERTION(mX2, "no x2");
|
||||
if (!mX2) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mX2);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -178,34 +158,36 @@ nsSVGLineFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mY2));
|
||||
NS_ASSERTION(mY2, "no y2");
|
||||
if (!mY2) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mY2);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIFrame methods:
|
||||
|
||||
nsIAtom *
|
||||
nsSVGLineFrame::GetType() const
|
||||
{
|
||||
return nsLayoutAtoms::svgLineFrame;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGLineFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGLineFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLength> l = do_QueryInterface(observable);
|
||||
if (l && (mX1==l || mY1==l || mX2==l || mY2==l)) {
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x1 ||
|
||||
aAttribute == nsGkAtoms::y1 ||
|
||||
aAttribute == nsGkAtoms::x2 ||
|
||||
aAttribute == nsGkAtoms::y2)) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
// else
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -57,6 +57,8 @@
|
|||
#include "nsISVGRendererCanvas.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsSVGMatrix.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
class nsSVGMarkerFrame : public nsSVGDefsFrame,
|
||||
public nsISVGMarkerFrame
|
||||
|
@ -65,7 +67,6 @@ protected:
|
|||
friend nsIFrame*
|
||||
NS_NewSVGMarkerFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
virtual ~nsSVGMarkerFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
|
@ -74,9 +75,10 @@ public:
|
|||
NS_IMETHOD_(nsrefcnt) AddRef() { return NS_OK; }
|
||||
NS_IMETHOD_(nsrefcnt) Release() { return NS_OK; }
|
||||
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
/**
|
||||
* Get the "type" of the frame
|
||||
|
@ -163,30 +165,9 @@ NS_GetSVGMarkerFrame(nsISVGMarkerFrame **aResult,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsSVGMarkerFrame::~nsSVGMarkerFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mRefX && (value = do_QueryInterface(mRefX)))
|
||||
value->RemoveObserver(this);
|
||||
if (mRefY && (value = do_QueryInterface(mRefY)))
|
||||
value->RemoveObserver(this);
|
||||
if (mMarkerWidth && (value = do_QueryInterface(mMarkerWidth)))
|
||||
value->RemoveObserver(this);
|
||||
if (mMarkerHeight && (value = do_QueryInterface(mMarkerHeight)))
|
||||
value->RemoveObserver(this);
|
||||
if (mOrientAngle && (value = do_QueryInterface(mOrientAngle)))
|
||||
value->RemoveObserver(this);
|
||||
if (mViewBox && (value = do_QueryInterface(mViewBox)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGMarkerFrame::InitSVG()
|
||||
{
|
||||
nsresult rv = nsSVGDefsFrame::InitSVG();
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
nsCOMPtr<nsIDOMSVGMarkerElement> marker = do_QueryInterface(mContent);
|
||||
NS_ASSERTION(marker, "wrong content element");
|
||||
|
||||
|
@ -196,9 +177,6 @@ nsSVGMarkerFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mRefX));
|
||||
NS_ASSERTION(mRefX, "no RefX");
|
||||
if (!mRefX) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mRefX);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -207,9 +185,6 @@ nsSVGMarkerFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mRefY));
|
||||
NS_ASSERTION(mRefY, "no RefY");
|
||||
if (!mRefY) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mRefY);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -218,9 +193,6 @@ nsSVGMarkerFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mMarkerWidth));
|
||||
NS_ASSERTION(mMarkerWidth, "no markerWidth");
|
||||
if (!mMarkerWidth) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mMarkerWidth);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -229,9 +201,6 @@ nsSVGMarkerFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mMarkerHeight));
|
||||
NS_ASSERTION(mMarkerHeight, "no markerHeight");
|
||||
if (!mMarkerHeight) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mMarkerHeight);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -240,9 +209,6 @@ nsSVGMarkerFrame::InitSVG()
|
|||
angle->GetAnimVal(getter_AddRefs(mOrientAngle));
|
||||
NS_ASSERTION(mOrientAngle, "no orientAngle");
|
||||
if (!mOrientAngle) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mOrientAngle);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -252,11 +218,8 @@ nsSVGMarkerFrame::InitSVG()
|
|||
|
||||
if (rect) {
|
||||
rect->GetAnimVal(getter_AddRefs(mViewBox));
|
||||
NS_ASSERTION(mRefY, "no viewBox");
|
||||
if (!mRefY) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mRefY);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
NS_ASSERTION(mViewBox, "no viewBox");
|
||||
if (!mViewBox) return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -270,14 +233,28 @@ nsSVGMarkerFrame::InitSVG()
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGMarkerFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGMarkerFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
return nsSVGDefsFrame::DidModifySVGObservable(observable, aModType);
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::refX ||
|
||||
aAttribute == nsGkAtoms::refY ||
|
||||
aAttribute == nsGkAtoms::markerWidth ||
|
||||
aAttribute == nsGkAtoms::markerHeight ||
|
||||
aAttribute == nsGkAtoms::orient ||
|
||||
aAttribute == nsGkAtoms::viewBox)) {
|
||||
// XXX: marker frame should be a nsSVGValue and call DidModify() here
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return nsSVGDefsFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGContainerFrame methods:
|
||||
|
|
|
@ -55,7 +55,6 @@ class nsSVGMaskFrame : public nsSVGMaskFrameBase,
|
|||
friend nsIFrame*
|
||||
NS_NewSVGMaskFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
virtual ~nsSVGMaskFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
|
@ -141,16 +140,6 @@ NS_GetSVGMaskFrame(nsISVGMaskFrame **aResult,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsSVGMaskFrame::~nsSVGMaskFrame()
|
||||
{
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mX);
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mY);
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mWidth);
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mHeight);
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mMaskUnits);
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mMaskContentUnits);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGMaskFrame::InitSVG()
|
||||
{
|
||||
|
@ -169,7 +158,6 @@ nsSVGMaskFrame::InitSVG()
|
|||
length->GetBaseVal(getter_AddRefs(mX));
|
||||
NS_ASSERTION(mX, "no X");
|
||||
if (!mX) return NS_ERROR_FAILURE;
|
||||
NS_ADD_SVGVALUE_OBSERVER(mX);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -178,7 +166,6 @@ nsSVGMaskFrame::InitSVG()
|
|||
length->GetBaseVal(getter_AddRefs(mY));
|
||||
NS_ASSERTION(mY, "no Y");
|
||||
if (!mY) return NS_ERROR_FAILURE;
|
||||
NS_ADD_SVGVALUE_OBSERVER(mY);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -187,7 +174,6 @@ nsSVGMaskFrame::InitSVG()
|
|||
length->GetBaseVal(getter_AddRefs(mWidth));
|
||||
NS_ASSERTION(mWidth, "no Width");
|
||||
if (!mWidth) return NS_ERROR_FAILURE;
|
||||
NS_ADD_SVGVALUE_OBSERVER(mWidth);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -196,14 +182,11 @@ nsSVGMaskFrame::InitSVG()
|
|||
length->GetBaseVal(getter_AddRefs(mHeight));
|
||||
NS_ASSERTION(mHeight, "no Height");
|
||||
if (!mHeight) return NS_ERROR_FAILURE;
|
||||
NS_ADD_SVGVALUE_OBSERVER(mHeight);
|
||||
}
|
||||
|
||||
mask->GetMaskUnits(getter_AddRefs(mMaskUnits));
|
||||
NS_ADD_SVGVALUE_OBSERVER(mMaskUnits);
|
||||
|
||||
mask->GetMaskContentUnits(getter_AddRefs(mMaskContentUnits));
|
||||
NS_ADD_SVGVALUE_OBSERVER(mMaskContentUnits);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -49,9 +49,7 @@
|
|||
#include "nsISVGRendererCanvas.h"
|
||||
#include "nsIView.h"
|
||||
#include "nsIViewManager.h"
|
||||
#include "nsWeakReference.h"
|
||||
#include "nsISVGValue.h"
|
||||
#include "nsISVGValueObserver.h"
|
||||
#include "nsHTMLParts.h"
|
||||
#include "nsReflowPath.h"
|
||||
#include "nsISVGRenderer.h"
|
||||
|
@ -156,15 +154,12 @@ typedef nsContainerFrame nsSVGOuterSVGFrameBase;
|
|||
class nsSVGOuterSVGFrame : public nsSVGOuterSVGFrameBase,
|
||||
public nsISVGOuterSVGFrame,
|
||||
public nsISVGContainerFrame,
|
||||
public nsISVGValueObserver,
|
||||
public nsSupportsWeakReference,
|
||||
public nsSVGCoordCtxProvider
|
||||
{
|
||||
friend nsIFrame*
|
||||
NS_NewSVGOuterSVGFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
protected:
|
||||
nsSVGOuterSVGFrame();
|
||||
virtual ~nsSVGOuterSVGFrame();
|
||||
nsresult Init();
|
||||
|
||||
// nsISupports interface:
|
||||
|
@ -198,9 +193,9 @@ public:
|
|||
NS_IMETHOD RemoveFrame(nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
// 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
|
||||
|
||||
nsIFrame* GetFrameForPoint(const nsPoint& aPoint);
|
||||
|
||||
|
@ -227,15 +222,6 @@ public:
|
|||
}
|
||||
#endif
|
||||
|
||||
// nsISVGValueObserver
|
||||
NS_IMETHOD WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
NS_IMETHOD DidModifySVGObservable (nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
|
||||
// nsISupportsWeakReference
|
||||
// implementation inherited from nsSupportsWeakReference
|
||||
|
||||
// nsISVGOuterSVGFrame interface:
|
||||
NS_IMETHOD InvalidateRegion(nsISVGRendererRegion* region, PRBool bRedraw);
|
||||
NS_IMETHOD IsRedrawSuspended(PRBool* isSuspended);
|
||||
|
@ -249,7 +235,7 @@ public:
|
|||
// nsISVGContainerFrame interface:
|
||||
already_AddRefed<nsIDOMSVGMatrix> GetCanvasTM();
|
||||
already_AddRefed<nsSVGCoordCtxProvider> GetCoordContextProvider();
|
||||
|
||||
|
||||
protected:
|
||||
// implementation helpers:
|
||||
void InitiateReflow();
|
||||
|
@ -257,9 +243,6 @@ protected:
|
|||
float GetPxPerTwips();
|
||||
float GetTwipsPerPx();
|
||||
|
||||
void AddAsWidthHeightObserver();
|
||||
void RemoveAsWidthHeightObserver();
|
||||
|
||||
void CalculateAvailableSpace(nsRect *maxRect, nsRect *preferredRect,
|
||||
nsPresContext* aPresContext,
|
||||
const nsHTMLReflowState& aReflowState);
|
||||
|
@ -302,18 +285,6 @@ nsSVGOuterSVGFrame::nsSVGOuterSVGFrame()
|
|||
{
|
||||
}
|
||||
|
||||
nsSVGOuterSVGFrame::~nsSVGOuterSVGFrame()
|
||||
{
|
||||
#ifdef DEBUG
|
||||
// printf("~nsSVGOuterSVGFrame %p\n", this);
|
||||
#endif
|
||||
|
||||
if (mZoomAndPan)
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mZoomAndPan);
|
||||
|
||||
RemoveAsWidthHeightObserver();
|
||||
}
|
||||
|
||||
nsresult nsSVGOuterSVGFrame::Init()
|
||||
{
|
||||
nsresult rv;
|
||||
|
@ -348,12 +319,10 @@ nsresult nsSVGOuterSVGFrame::Init()
|
|||
nsIDocument* doc = mContent->GetCurrentDoc();
|
||||
if (doc && doc->GetRootContent() == mContent) {
|
||||
SVGElement->GetZoomAndPanEnum(getter_AddRefs(mZoomAndPan));
|
||||
NS_ADD_SVGVALUE_OBSERVER(mZoomAndPan);
|
||||
SVGElement->GetCurrentTranslate(getter_AddRefs(mCurrentTranslate));
|
||||
SVGElement->GetCurrentScaleNumber(getter_AddRefs(mCurrentScale));
|
||||
}
|
||||
|
||||
AddAsWidthHeightObserver();
|
||||
SuspendRedraw();
|
||||
|
||||
AddStateBits(NS_STATE_IS_OUTER_SVG);
|
||||
|
@ -368,8 +337,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGOuterSVGFrame)
|
|||
NS_INTERFACE_MAP_ENTRY(nsISVGContainerFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGOuterSVGFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGSVGFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGValueObserver)
|
||||
NS_INTERFACE_MAP_ENTRY(nsSVGCoordCtxProvider)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGOuterSVGFrameBase)
|
||||
|
||||
|
@ -461,11 +428,6 @@ nsSVGOuterSVGFrame::Reflow(nsPresContext* aPresContext,
|
|||
|
||||
SuspendRedraw();
|
||||
|
||||
// As soon as we set the coordinate context, the width/height
|
||||
// attributes might emit change-notifications. We don't want those
|
||||
// right now:
|
||||
RemoveAsWidthHeightObserver();
|
||||
|
||||
nsCOMPtr<nsIDOMSVGRect> r;
|
||||
NS_NewSVGRect(getter_AddRefs(r), 0, 0, preferredWidth, preferredHeight);
|
||||
SetCoordCtxRect(r);
|
||||
|
@ -538,8 +500,6 @@ nsSVGOuterSVGFrame::Reflow(nsPresContext* aPresContext,
|
|||
aStatus = NS_FRAME_COMPLETE;
|
||||
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
||||
|
||||
AddAsWidthHeightObserver();
|
||||
|
||||
UnsuspendRedraw();
|
||||
|
||||
return NS_OK;
|
||||
|
@ -642,22 +602,6 @@ nsSVGOuterSVGFrame::RemoveFrame(nsIAtom* aListName,
|
|||
return result ? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGOuterSVGFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
// {
|
||||
// nsAutoString str;
|
||||
// aAttribute->ToString(str);
|
||||
// printf("** nsSVGOuterSVGFrame::AttributeChanged(%s)\n",
|
||||
// NS_LossyConvertUTF16toASCII(str).get());
|
||||
// }
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
MOZ_DECL_CTOR_COUNTER(nsDisplaySVG)
|
||||
class nsDisplaySVG : public nsDisplayItem {
|
||||
public:
|
||||
|
@ -839,30 +783,6 @@ nsSVGOuterSVGFrame::IsFrameOfType(PRUint32 aFlags) const
|
|||
return !(aFlags & ~nsIFrame::eSVG);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGOuterSVGFrame::WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGOuterSVGFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
{
|
||||
mNeedsReflow = PR_TRUE;
|
||||
if (mRedrawSuspendCount==0) {
|
||||
InitiateReflow();
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGOuterSVGFrame methods:
|
||||
|
||||
|
@ -1076,58 +996,6 @@ void nsSVGOuterSVGFrame::InitiateReflow()
|
|||
}
|
||||
|
||||
|
||||
void nsSVGOuterSVGFrame::AddAsWidthHeightObserver()
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGSVGElement> svgElement = do_QueryInterface(mContent);
|
||||
NS_ASSERTION(svgElement, "wrong content element");
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLength> animLength;
|
||||
svgElement->GetWidth(getter_AddRefs(animLength));
|
||||
NS_ASSERTION(animLength, "could not get <svg>:width");
|
||||
nsCOMPtr<nsIDOMSVGLength> length;
|
||||
animLength->GetAnimVal(getter_AddRefs(length));
|
||||
NS_ASSERTION(length, "could not get <svg>:width:animval");
|
||||
NS_ADD_SVGVALUE_OBSERVER(length);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLength> animLength;
|
||||
svgElement->GetHeight(getter_AddRefs(animLength));
|
||||
NS_ASSERTION(animLength, "could not get <svg>:height");
|
||||
nsCOMPtr<nsIDOMSVGLength> length;
|
||||
animLength->GetAnimVal(getter_AddRefs(length));
|
||||
NS_ASSERTION(length, "could not get <svg>:height:animval");
|
||||
NS_ADD_SVGVALUE_OBSERVER(length);
|
||||
}
|
||||
}
|
||||
|
||||
void nsSVGOuterSVGFrame::RemoveAsWidthHeightObserver()
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGSVGElement> svgElement = do_QueryInterface(mContent);
|
||||
NS_ASSERTION(svgElement, "wrong content element");
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLength> animLength;
|
||||
svgElement->GetWidth(getter_AddRefs(animLength));
|
||||
NS_ASSERTION(animLength, "could not get <svg>:width");
|
||||
nsCOMPtr<nsIDOMSVGLength> length;
|
||||
animLength->GetAnimVal(getter_AddRefs(length));
|
||||
NS_ASSERTION(length, "could not get <svg>:width:animval");
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(length);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLength> animLength;
|
||||
svgElement->GetHeight(getter_AddRefs(animLength));
|
||||
NS_ASSERTION(animLength, "could not get <svg>:height");
|
||||
nsCOMPtr<nsIDOMSVGLength> length;
|
||||
animLength->GetAnimVal(getter_AddRefs(length));
|
||||
NS_ASSERTION(length, "could not get <svg>:height:animval");
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(length);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsSVGOuterSVGFrame::CalculateAvailableSpace(nsRect *maxRect,
|
||||
nsRect *preferredRect,
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
#include "nsLayoutAtoms.h"
|
||||
#include "nsISVGPathFlatten.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
class nsSVGPathFrame : public nsSVGPathGeometryFrame,
|
||||
public nsISVGMarkable,
|
||||
|
@ -58,13 +60,13 @@ protected:
|
|||
friend nsIFrame*
|
||||
NS_NewSVGPathFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
~nsSVGPathFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
@ -121,13 +123,6 @@ NS_NewSVGPathFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGPathFrame;
|
||||
}
|
||||
|
||||
nsSVGPathFrame::~nsSVGPathFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mSegments && (value = do_QueryInterface(mSegments)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGPathFrame::InitSVG()
|
||||
{
|
||||
|
@ -139,27 +134,26 @@ nsSVGPathFrame::InitSVG()
|
|||
anim_data->GetAnimatedPathSegList(getter_AddRefs(mSegments));
|
||||
NS_ASSERTION(mSegments, "no pathseglist");
|
||||
if (!mSegments) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mSegments);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsISVGFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGPathFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGPathFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGPathSegList> l = do_QueryInterface(observable);
|
||||
if (l && mSegments==l) {
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
aAttribute == nsGkAtoms::d) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
// else
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#include "nsSVGFilterFrame.h"
|
||||
#include "nsSVGMaskFrame.h"
|
||||
#include "nsISVGRendererSurface.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// nsSVGPathGeometryFrame
|
||||
|
@ -84,11 +85,6 @@ nsSVGPathGeometryFrame::~nsSVGPathGeometryFrame()
|
|||
// printf("~nsSVGPathGeometryFrame %p\n", this);
|
||||
#endif
|
||||
|
||||
nsCOMPtr<nsIDOMSVGTransformable> transformable = do_QueryInterface(mContent);
|
||||
NS_ASSERTION(transformable, "wrong content element");
|
||||
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms;
|
||||
transformable->GetTransform(getter_AddRefs(transforms));
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(transforms);
|
||||
if (mFillGradient) {
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mFillGradient);
|
||||
}
|
||||
|
@ -147,17 +143,9 @@ nsSVGPathGeometryFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
|||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
// we don't use this notification mechanism
|
||||
|
||||
#ifdef DEBUG
|
||||
// printf("** nsSVGPathGeometryFrame::AttributeChanged(");
|
||||
// nsAutoString str;
|
||||
// aAttribute->ToString(str);
|
||||
// nsCAutoString cstr;
|
||||
// cstr.AssignWithConversion(str);
|
||||
// printf(cstr.get());
|
||||
// printf(")\n");
|
||||
#endif
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
aAttribute == nsGkAtoms::transform)
|
||||
UpdateGraphic(nsISVGGeometrySource::UPDATEMASK_CANVAS_TM);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -616,10 +604,8 @@ nsSVGPathGeometryFrame::DidModifySVGObservable (nsISVGValue* observable,
|
|||
}
|
||||
UpdateGraphic(nsISVGGeometrySource::UPDATEMASK_STROKE_PAINT);
|
||||
}
|
||||
} else {
|
||||
// No, all of our other observables update the canvastm by default
|
||||
UpdateGraphic(nsISVGGeometrySource::UPDATEMASK_CANVAS_TM);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -1027,14 +1013,6 @@ nsSVGPathGeometryFrame::GetShapeRendering(PRUint16 *aShapeRendering)
|
|||
NS_IMETHODIMP
|
||||
nsSVGPathGeometryFrame::InitSVG()
|
||||
{
|
||||
// all path geometry frames listen in on changes to their
|
||||
// corresponding content element's transform attribute:
|
||||
nsCOMPtr<nsIDOMSVGTransformable> transformable = do_QueryInterface(mContent);
|
||||
NS_ASSERTION(transformable, "wrong content element");
|
||||
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms;
|
||||
transformable->GetTransform(getter_AddRefs(transforms));
|
||||
NS_ADD_SVGVALUE_OBSERVER(transforms);
|
||||
|
||||
// construct a pathgeometry object:
|
||||
nsISVGOuterSVGFrame* outerSVGFrame = nsSVGUtils::GetOuterSVGFrame(this);
|
||||
if (!outerSVGFrame) {
|
||||
|
|
|
@ -105,7 +105,6 @@ public:
|
|||
#endif
|
||||
|
||||
protected:
|
||||
|
||||
// nsISVGValueObserver
|
||||
NS_IMETHOD WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
|
|
|
@ -91,7 +91,9 @@ static void printRect(char *msg, nsIDOMSVGRect *aRect);
|
|||
|
||||
class nsSVGPatternFrame : public nsSVGPatternFrameBase,
|
||||
public nsSVGValue,
|
||||
public nsISVGPattern
|
||||
public nsISVGPattern,
|
||||
public nsISVGValueObserver,
|
||||
public nsSupportsWeakReference
|
||||
{
|
||||
protected:
|
||||
friend nsIFrame* NS_NewSVGPatternFrame(nsIPresShell* aPresShell,
|
||||
|
|
|
@ -45,6 +45,8 @@
|
|||
#include "nsSVGMarkerFrame.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
class nsSVGPolygonFrame : public nsSVGPathGeometryFrame,
|
||||
public nsISVGMarkable
|
||||
|
@ -53,14 +55,13 @@ protected:
|
|||
friend nsIFrame*
|
||||
NS_NewSVGPolygonFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
~nsSVGPolygonFrame();
|
||||
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
@ -114,13 +115,6 @@ NS_NewSVGPolygonFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGPolygonFrame;
|
||||
}
|
||||
|
||||
nsSVGPolygonFrame::~nsSVGPolygonFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mPoints && (value = do_QueryInterface(mPoints)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGPolygonFrame::InitSVG()
|
||||
{
|
||||
|
@ -132,26 +126,26 @@ nsSVGPolygonFrame::InitSVG()
|
|||
anim_points->GetPoints(getter_AddRefs(mPoints));
|
||||
NS_ASSERTION(mPoints, "no points");
|
||||
if (!mPoints) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mPoints);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGPolygonFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGPolygonFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGPointList> l = do_QueryInterface(observable);
|
||||
if (l && mPoints==l) {
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
aAttribute == nsGkAtoms::points) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
// else
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -45,6 +45,8 @@
|
|||
#include "nsSVGMarkerFrame.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
class nsSVGPolylineFrame : public nsSVGPathGeometryFrame,
|
||||
public nsISVGMarkable
|
||||
|
@ -53,7 +55,6 @@ protected:
|
|||
friend nsIFrame*
|
||||
NS_NewSVGPolylineFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
virtual ~nsSVGPolylineFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
|
@ -64,6 +65,7 @@ public:
|
|||
*/
|
||||
virtual nsIAtom* GetType() const;
|
||||
|
||||
// nsIFrame interface:
|
||||
#ifdef DEBUG
|
||||
NS_IMETHOD GetFrameName(nsAString& aResult) const
|
||||
{
|
||||
|
@ -71,15 +73,13 @@ public:
|
|||
}
|
||||
#endif
|
||||
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
||||
// virtual void ConstructPath(nsASVGPathBuilder* pathBuilder);
|
||||
|
||||
nsCOMPtr<nsIDOMSVGPointList> mPoints;
|
||||
|
||||
// nsISVGMarkable interface
|
||||
|
@ -114,13 +114,6 @@ NS_NewSVGPolylineFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGPolylineFrame;
|
||||
}
|
||||
|
||||
nsSVGPolylineFrame::~nsSVGPolylineFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mPoints && (value = do_QueryInterface(mPoints)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGPolylineFrame::InitSVG()
|
||||
{
|
||||
|
@ -132,9 +125,7 @@ nsSVGPolylineFrame::InitSVG()
|
|||
anim_points->GetPoints(getter_AddRefs(mPoints));
|
||||
NS_ASSERTION(mPoints, "no points");
|
||||
if (!mPoints) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mPoints);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -145,19 +136,21 @@ nsSVGPolylineFrame::GetType() const
|
|||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGPolylineFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGPolylineFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGPointList> l = do_QueryInterface(observable);
|
||||
if (l && mPoints==l) {
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
aAttribute == nsGkAtoms::points) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
// else
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -54,17 +54,17 @@ protected:
|
|||
friend nsIFrame*
|
||||
NS_NewSVGRectFrame(nsIPresShell* aPresShell, nsIContent* aContent);
|
||||
|
||||
virtual ~nsSVGRectFrame();
|
||||
NS_IMETHOD InitSVG();
|
||||
|
||||
public:
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
|
||||
// nsISVGPathGeometrySource interface:
|
||||
NS_IMETHOD ConstructPath(nsISVGRendererPathBuilder *pathBuilder);
|
||||
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
/**
|
||||
* Get the "type" of the frame
|
||||
*
|
||||
|
@ -103,23 +103,6 @@ NS_NewSVGRectFrame(nsIPresShell* aPresShell, nsIContent* aContent)
|
|||
return new (aPresShell) nsSVGRectFrame;
|
||||
}
|
||||
|
||||
nsSVGRectFrame::~nsSVGRectFrame()
|
||||
{
|
||||
nsCOMPtr<nsISVGValue> value;
|
||||
if (mX && (value = do_QueryInterface(mX)))
|
||||
value->RemoveObserver(this);
|
||||
if (mY && (value = do_QueryInterface(mY)))
|
||||
value->RemoveObserver(this);
|
||||
if (mWidth && (value = do_QueryInterface(mWidth)))
|
||||
value->RemoveObserver(this);
|
||||
if (mHeight && (value = do_QueryInterface(mHeight)))
|
||||
value->RemoveObserver(this);
|
||||
if (mRx && (value = do_QueryInterface(mRx)))
|
||||
value->RemoveObserver(this);
|
||||
if (mRy && (value = do_QueryInterface(mRy)))
|
||||
value->RemoveObserver(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGRectFrame::InitSVG()
|
||||
{
|
||||
|
@ -136,9 +119,6 @@ nsSVGRectFrame::InitSVG()
|
|||
NS_ASSERTION(mX, "no x");
|
||||
if (!mX)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mX);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -148,9 +128,6 @@ nsSVGRectFrame::InitSVG()
|
|||
NS_ASSERTION(mY, "no y");
|
||||
if (!mY)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mY);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -160,10 +137,8 @@ nsSVGRectFrame::InitSVG()
|
|||
NS_ASSERTION(mWidth, "no width");
|
||||
if (!mWidth)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mWidth);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLength> length;
|
||||
Rect->GetHeight(getter_AddRefs(length));
|
||||
|
@ -171,9 +146,6 @@ nsSVGRectFrame::InitSVG()
|
|||
NS_ASSERTION(mHeight, "no height");
|
||||
if (!mHeight)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mHeight);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -183,9 +155,6 @@ nsSVGRectFrame::InitSVG()
|
|||
NS_ASSERTION(mRx, "no rx");
|
||||
if (!mRx)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mRx);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -195,28 +164,32 @@ nsSVGRectFrame::InitSVG()
|
|||
NS_ASSERTION(mRy, "no ry");
|
||||
if (!mRy)
|
||||
return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mRy);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGRectFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGRectFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLength> l = do_QueryInterface(observable);
|
||||
if (l && (mX==l || mY==l || mWidth==l || mHeight==l || mRx==l || mRy==l)) {
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y ||
|
||||
aAttribute == nsGkAtoms::width ||
|
||||
aAttribute == nsGkAtoms::height ||
|
||||
aAttribute == nsGkAtoms::rx ||
|
||||
aAttribute == nsGkAtoms::ry)) {
|
||||
UpdateGraphic(nsISVGPathGeometrySource::UPDATEMASK_PATH);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return nsSVGPathGeometryFrame::DidModifySVGObservable(observable, aModType);
|
||||
return nsSVGPathGeometryFrame::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
|
|
@ -71,88 +71,6 @@ nsSVGTSpanFrame::nsSVGTSpanFrame()
|
|||
{
|
||||
}
|
||||
|
||||
nsSVGTSpanFrame::~nsSVGTSpanFrame()
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGTextPositioningElement> element = do_QueryInterface(mContent);
|
||||
|
||||
// clean up our listener refs:
|
||||
if (element) {
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLengthList> animLengthList;
|
||||
element->GetX(getter_AddRefs(animLengthList));
|
||||
if (animLengthList) {
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList;
|
||||
animLengthList->GetAnimVal(getter_AddRefs(lengthList));
|
||||
if (lengthList)
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
}
|
||||
|
||||
if (element) {
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLengthList> animLengthList;
|
||||
element->GetY(getter_AddRefs(animLengthList));
|
||||
if (animLengthList) {
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList;
|
||||
animLengthList->GetAnimVal(getter_AddRefs(lengthList));
|
||||
if (lengthList)
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDx();
|
||||
if (lengthList)
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDy();
|
||||
if (lengthList)
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
}
|
||||
|
||||
nsresult nsSVGTSpanFrame::InitSVG()
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGTextPositioningElement> element = do_QueryInterface(mContent);
|
||||
|
||||
// set us up as a listener for various <tspan>-properties:
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLengthList> animLengthList;
|
||||
element->GetX(getter_AddRefs(animLengthList));
|
||||
if (animLengthList) {
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList;
|
||||
animLengthList->GetAnimVal(getter_AddRefs(lengthList));
|
||||
if (lengthList)
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedLengthList> animLengthList;
|
||||
element->GetY(getter_AddRefs(animLengthList));
|
||||
if (animLengthList) {
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList;
|
||||
animLengthList->GetAnimVal(getter_AddRefs(lengthList));
|
||||
if (lengthList)
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDx();
|
||||
if (lengthList)
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDy();
|
||||
if (lengthList)
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsIAtom *
|
||||
nsSVGTSpanFrame::GetType() const
|
||||
{
|
||||
|
@ -173,29 +91,12 @@ NS_INTERFACE_MAP_BEGIN(nsSVGTSpanFrame)
|
|||
NS_INTERFACE_MAP_ENTRY(nsISVGGlyphFragmentNode)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGContainerFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGChildFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGValueObserver)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGTextContentMetrics)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGTSpanFrameBase)
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIFrame methods
|
||||
NS_IMETHODIMP
|
||||
nsSVGTSpanFrame::Init(nsPresContext* aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aParent,
|
||||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = nsSVGTSpanFrameBase::Init(aPresContext, aContent, aParent,
|
||||
aContext, aPrevInFlow);
|
||||
|
||||
InitSVG();
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGTSpanFrame::AppendFrames(nsIAtom* aListName,
|
||||
|
@ -272,29 +173,24 @@ nsSVGTSpanFrame::RemoveFrame(nsIAtom* aListName,
|
|||
return result ? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGTSpanFrame::WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
nsSVGTSpanFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y ||
|
||||
aAttribute == nsGkAtoms::dx ||
|
||||
aAttribute == nsGkAtoms::dy)) {
|
||||
nsISVGTextFrame* text_frame = GetTextFrame();
|
||||
if (text_frame)
|
||||
text_frame->NotifyGlyphMetricsChange(this);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGTSpanFrame::DidModifySVGObservable (nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
{
|
||||
nsISVGTextFrame* text_frame = GetTextFrame();
|
||||
if (text_frame)
|
||||
text_frame->NotifyGlyphMetricsChange(this);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGTextContentMetrics
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -44,9 +44,7 @@
|
|||
#include "nsPresContext.h"
|
||||
#include "nsISVGTextContainerFrame.h"
|
||||
#include "nsISVGRendererCanvas.h"
|
||||
#include "nsWeakReference.h"
|
||||
#include "nsISVGValue.h"
|
||||
#include "nsISVGValueObserver.h"
|
||||
#include "nsIDOMSVGSVGElement.h"
|
||||
#include "nsIDOMSVGMatrix.h"
|
||||
#include "nsIDOMSVGLengthList.h"
|
||||
|
@ -73,17 +71,13 @@ class nsSVGTSpanFrame : public nsSVGTSpanFrameBase,
|
|||
public nsISVGGlyphFragmentNode,
|
||||
public nsISVGChildFrame,
|
||||
public nsISVGContainerFrame,
|
||||
public nsISVGValueObserver,
|
||||
public nsISVGTextContentMetrics,
|
||||
public nsSupportsWeakReference
|
||||
public nsISVGTextContentMetrics
|
||||
{
|
||||
friend nsIFrame*
|
||||
NS_NewSVGTSpanFrame(nsIPresShell* aPresShell, nsIContent* aContent,
|
||||
nsIFrame* parentFrame);
|
||||
protected:
|
||||
nsSVGTSpanFrame();
|
||||
virtual ~nsSVGTSpanFrame();
|
||||
virtual nsresult InitSVG();
|
||||
|
||||
// nsISupports interface:
|
||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
|
@ -100,11 +94,9 @@ public:
|
|||
nsIFrame* aFrameList);
|
||||
NS_IMETHOD RemoveFrame(nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
NS_IMETHOD Init(nsPresContext* aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aParent,
|
||||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow);
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
/**
|
||||
* Get the "type" of the frame
|
||||
|
@ -121,12 +113,6 @@ public:
|
|||
}
|
||||
#endif
|
||||
|
||||
// nsISVGValueObserver
|
||||
NS_IMETHOD WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
NS_IMETHOD DidModifySVGObservable (nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
|
||||
// nsISVGTextContentMetrics
|
||||
NS_IMETHOD GetNumberOfChars(PRInt32 *_retval);
|
||||
NS_IMETHOD GetComputedTextLength(float *_retval);
|
||||
|
|
|
@ -72,6 +72,8 @@
|
|||
#include "nsSVGMaskFrame.h"
|
||||
#include "nsSVGClipPathFrame.h"
|
||||
#include "nsISVGRendererSurface.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
typedef nsContainerFrame nsSVGTextFrameBase;
|
||||
|
||||
|
@ -88,7 +90,6 @@ class nsSVGTextFrame : public nsSVGTextFrameBase,
|
|||
protected:
|
||||
nsSVGTextFrame();
|
||||
virtual ~nsSVGTextFrame();
|
||||
nsresult Init();
|
||||
|
||||
// nsISupports interface:
|
||||
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
||||
|
@ -106,12 +107,6 @@ public:
|
|||
NS_IMETHOD RemoveFrame(nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
|
||||
NS_IMETHOD Init(nsPresContext* aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aParent,
|
||||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow);
|
||||
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
@ -246,71 +241,11 @@ nsSVGTextFrame::nsSVGTextFrame()
|
|||
|
||||
nsSVGTextFrame::~nsSVGTextFrame()
|
||||
{
|
||||
// clean up our listener refs:
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetX();
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetY();
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDx();
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDy();
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGTransformable> transformable = do_QueryInterface(mContent);
|
||||
NS_ASSERTION(transformable, "wrong content element");
|
||||
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms;
|
||||
transformable->GetTransform(getter_AddRefs(transforms));
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(transforms);
|
||||
}
|
||||
|
||||
if (mFilter) {
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mFilter);
|
||||
}
|
||||
}
|
||||
|
||||
nsresult nsSVGTextFrame::Init()
|
||||
{
|
||||
// set us up as a listener for various <text>-properties:
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetX();
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetY();
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDx();
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGLengthList> lengthList = GetDy();
|
||||
NS_ADD_SVGVALUE_OBSERVER(lengthList);
|
||||
}
|
||||
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms = GetTransform();
|
||||
NS_ADD_SVGVALUE_OBSERVER(transforms);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISupports methods
|
||||
|
||||
|
@ -327,38 +262,40 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGTextFrameBase)
|
|||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIFrame methods
|
||||
NS_IMETHODIMP
|
||||
nsSVGTextFrame::Init(nsPresContext* aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aParent,
|
||||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow)
|
||||
{
|
||||
nsresult rv;
|
||||
rv = nsSVGTextFrameBase::Init(aPresContext, aContent, aParent,
|
||||
aContext, aPrevInFlow);
|
||||
|
||||
Init();
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGTextFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
// we don't use this notification mechanism
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("** nsSVGTextFrame::AttributeChanged(");
|
||||
nsAutoString str;
|
||||
aAttribute->ToString(str);
|
||||
printf(NS_ConvertUTF16toUTF8(str).get());
|
||||
printf(")\n");
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
if (aNameSpaceID != kNameSpaceID_None)
|
||||
return NS_OK;
|
||||
|
||||
if (aAttribute == nsGkAtoms::transform) {
|
||||
// transform has changed
|
||||
|
||||
// make sure our cached transform matrix gets (lazily) updated
|
||||
mCanvasTM = nsnull;
|
||||
|
||||
nsIFrame* kid = mFrames.FirstChild();
|
||||
while (kid) {
|
||||
nsISVGChildFrame* SVGFrame=0;
|
||||
kid->QueryInterface(NS_GET_IID(nsISVGChildFrame),(void**)&SVGFrame);
|
||||
if (SVGFrame)
|
||||
SVGFrame->NotifyCanvasTMChanged(PR_FALSE);
|
||||
kid = kid->GetNextSibling();
|
||||
}
|
||||
} else if (aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y ||
|
||||
aAttribute == nsGkAtoms::dx ||
|
||||
aAttribute == nsGkAtoms::dy) {
|
||||
mPositioningDirty = PR_TRUE;
|
||||
if (mMetricsState == unsuspended) {
|
||||
UpdateGlyphPositioning();
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -489,7 +426,6 @@ nsSVGTextFrame::DidModifySVGObservable (nsISVGValue* observable,
|
|||
{
|
||||
nsISVGFilterFrame *filter;
|
||||
CallQueryInterface(observable, &filter);
|
||||
nsCOMPtr<nsIDOMSVGAnimatedTransformList> transforms = GetTransform();
|
||||
|
||||
if (filter) {
|
||||
if (aModType == nsISVGValue::mod_die) {
|
||||
|
@ -509,28 +445,8 @@ nsSVGTextFrame::DidModifySVGObservable (nsISVGValue* observable,
|
|||
|
||||
if (region)
|
||||
outerSVGFrame->InvalidateRegion(region, PR_TRUE);
|
||||
} else if (SameCOMIdentity(observable, transforms)) {
|
||||
// transform has changed
|
||||
}
|
||||
|
||||
// make sure our cached transform matrix gets (lazily) updated
|
||||
mCanvasTM = nsnull;
|
||||
|
||||
nsIFrame* kid = mFrames.FirstChild();
|
||||
while (kid) {
|
||||
nsISVGChildFrame* SVGFrame=0;
|
||||
kid->QueryInterface(NS_GET_IID(nsISVGChildFrame),(void**)&SVGFrame);
|
||||
if (SVGFrame)
|
||||
SVGFrame->NotifyCanvasTMChanged(PR_FALSE);
|
||||
kid = kid->GetNextSibling();
|
||||
}
|
||||
}
|
||||
else {
|
||||
// x, y have changed
|
||||
mPositioningDirty = PR_TRUE;
|
||||
if (mMetricsState == unsuspended) {
|
||||
UpdateGlyphPositioning();
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -50,14 +50,27 @@
|
|||
#include "nsIDOMSVGURIReference.h"
|
||||
#include "nsIDOMDocument.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsISVGValueObserver.h"
|
||||
#include "nsWeakReference.h"
|
||||
|
||||
typedef nsSVGTSpanFrame nsSVGTextPathFrameBase;
|
||||
|
||||
class nsSVGTextPathFrame : public nsSVGTextPathFrameBase,
|
||||
public nsISVGPathFlatten
|
||||
public nsISVGPathFlatten,
|
||||
public nsISVGValueObserver,
|
||||
public nsSupportsWeakReference
|
||||
{
|
||||
public:
|
||||
|
||||
// nsIFrame:
|
||||
NS_IMETHOD Init(nsPresContext* aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aParent,
|
||||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow);
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
/**
|
||||
* Get the "type" of the frame
|
||||
*
|
||||
|
@ -73,6 +86,8 @@ public:
|
|||
#endif
|
||||
|
||||
// nsISVGValueObserver interface:
|
||||
NS_IMETHOD WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
NS_IMETHOD DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType);
|
||||
|
||||
|
@ -88,7 +103,6 @@ private:
|
|||
|
||||
protected:
|
||||
virtual ~nsSVGTextPathFrame();
|
||||
virtual nsresult InitSVG();
|
||||
|
||||
NS_IMETHOD_(already_AddRefed<nsIDOMSVGLengthList>) GetX();
|
||||
NS_IMETHOD_(already_AddRefed<nsIDOMSVGLengthList>) GetY();
|
||||
|
@ -106,6 +120,8 @@ private:
|
|||
|
||||
NS_INTERFACE_MAP_BEGIN(nsSVGTextPathFrame)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGPathFlatten)
|
||||
NS_INTERFACE_MAP_ENTRY(nsISVGValueObserver)
|
||||
NS_INTERFACE_MAP_ENTRY(nsSupportsWeakReference)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGTSpanFrame)
|
||||
|
||||
|
||||
|
@ -136,14 +152,19 @@ NS_NewSVGTextPathFrame(nsIPresShell* aPresShell, nsIContent* aContent,
|
|||
|
||||
nsSVGTextPathFrame::~nsSVGTextPathFrame()
|
||||
{
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mStartOffset);
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mHref);
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mSegments);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsSVGTextPathFrame::InitSVG()
|
||||
NS_IMETHODIMP
|
||||
nsSVGTextPathFrame::Init(nsPresContext* aPresContext,
|
||||
nsIContent* aContent,
|
||||
nsIFrame* aParent,
|
||||
nsStyleContext* aContext,
|
||||
nsIFrame* aPrevInFlow)
|
||||
{
|
||||
nsSVGTextPathFrameBase::Init(aPresContext, aContent, aParent,
|
||||
aContext, aPrevInFlow);
|
||||
|
||||
nsCOMPtr<nsIDOMSVGTextPathElement> tpath = do_QueryInterface(mContent);
|
||||
|
||||
{
|
||||
|
@ -159,8 +180,6 @@ nsSVGTextPathFrame::InitSVG()
|
|||
nsCOMPtr<nsIDOMSVGLength> length;
|
||||
mX->AppendItem(mStartOffset, getter_AddRefs(length));
|
||||
}
|
||||
|
||||
NS_ADD_SVGVALUE_OBSERVER(mStartOffset);
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -169,7 +188,6 @@ nsSVGTextPathFrame::InitSVG()
|
|||
aRef->GetHref(getter_AddRefs(mHref));
|
||||
if (!mHref)
|
||||
return NS_ERROR_FAILURE;
|
||||
NS_ADD_SVGVALUE_OBSERVER(mHref);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -250,15 +268,42 @@ nsSVGTextPathFrame::GetFlattenedPath(nsSVGPathData **data, nsIFrame *parent) {
|
|||
//----------------------------------------------------------------------
|
||||
// nsISVGValueObserver methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGTextPathFrame::WillModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGTextPathFrame::DidModifySVGObservable(nsISVGValue* observable,
|
||||
nsISVGValue::modificationType aModType)
|
||||
{
|
||||
nsCOMPtr<nsIDOMSVGAnimatedString> s = do_QueryInterface(observable);
|
||||
if (s && mHref==s) {
|
||||
nsISVGTextFrame* text_frame = GetTextFrame();
|
||||
if (text_frame)
|
||||
text_frame->NotifyGlyphMetricsChange(this);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIFrame methods
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGTextPathFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
aAttribute == nsGkAtoms::startOffset) {
|
||||
nsISVGTextFrame* text_frame = GetTextFrame();
|
||||
if (text_frame)
|
||||
text_frame->NotifyGlyphMetricsChange(this);
|
||||
} else if (aNameSpaceID == kNameSpaceID_XLink &&
|
||||
aAttribute == nsGkAtoms::href) {
|
||||
NS_REMOVE_SVGVALUE_OBSERVER(mSegments);
|
||||
mSegments = nsnull;
|
||||
}
|
||||
|
||||
return nsSVGTextPathFrameBase::DidModifySVGObservable(observable, aModType);
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -44,6 +44,8 @@
|
|||
#include "nsIAnonymousContentCreator.h"
|
||||
#include "nsSVGMatrix.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsGkAtoms.h"
|
||||
|
||||
typedef nsSVGGFrame nsSVGUseFrameBase;
|
||||
|
||||
|
@ -64,6 +66,10 @@ private:
|
|||
NS_IMETHOD_(nsrefcnt) Release() { return NS_OK; }
|
||||
|
||||
public:
|
||||
// nsIFrame interface:
|
||||
NS_IMETHOD AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType);
|
||||
|
||||
// nsISVGContainerFrame interface:
|
||||
already_AddRefed<nsIDOMSVGMatrix> GetCanvasTM();
|
||||
|
@ -126,9 +132,6 @@ nsSVGUseFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mX));
|
||||
NS_ASSERTION(mX, "no x");
|
||||
if (!mX) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mX);
|
||||
if (value)
|
||||
value->AddObserver(this); // nsISVGValueObserver
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -137,9 +140,6 @@ nsSVGUseFrame::InitSVG()
|
|||
length->GetAnimVal(getter_AddRefs(mY));
|
||||
NS_ASSERTION(mY, "no y");
|
||||
if (!mY) return NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsISVGValue> value = do_QueryInterface(mY);
|
||||
if (value)
|
||||
value->AddObserver(this);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -158,6 +158,35 @@ NS_INTERFACE_MAP_BEGIN(nsSVGUseFrame)
|
|||
NS_INTERFACE_MAP_ENTRY(nsIAnonymousContentCreator)
|
||||
NS_INTERFACE_MAP_END_INHERITING(nsSVGUseFrameBase)
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsIFrame methods:
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsSVGUseFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
||||
nsIAtom* aAttribute,
|
||||
PRInt32 aModType)
|
||||
{
|
||||
if (aNameSpaceID == kNameSpaceID_None &&
|
||||
(aAttribute == nsGkAtoms::x ||
|
||||
aAttribute == nsGkAtoms::y)) {
|
||||
// make sure our cached transform matrix gets (lazily) updated
|
||||
mCanvasTM = nsnull;
|
||||
|
||||
for (nsIFrame* kid = mFrames.FirstChild(); kid;
|
||||
kid = kid->GetNextSibling()) {
|
||||
nsISVGChildFrame* SVGFrame=nsnull;
|
||||
kid->QueryInterface(NS_GET_IID(nsISVGChildFrame),(void**)&SVGFrame);
|
||||
if (SVGFrame)
|
||||
SVGFrame->NotifyCanvasTMChanged(PR_FALSE);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
return nsSVGUseFrameBase::AttributeChanged(aNameSpaceID,
|
||||
aAttribute, aModType);
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// nsISVGContainerFrame methods:
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче