Bug 455226 - Removing the xlink:href attribute of an feImage filter does not cause it to change; r+sr=bzbarsky
--- a/content/svg/content/src/nsSVGFilters.cpp
+++ b/content/svg/content/src/nsSVGFilters.cpp
@@ -5190,22 +5190,21 @@ public:
NS_DECL_NSIDOMSVGFEIMAGEELEMENT
NS_DECL_NSIDOMSVGURIREFERENCE
NS_FORWARD_NSIDOMSVGELEMENT(nsSVGFEImageElementBase::)
NS_FORWARD_NSIDOMNODE(nsSVGFEImageElementBase::)
NS_FORWARD_NSIDOMELEMENT(nsSVGFEImageElementBase::)
- // nsSVGElement
- virtual void DidChangeString(PRUint8 aAttrEnum, PRBool aDoSetAttr);
-
// nsIContent
virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
+ virtual nsresult AfterSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
+ const nsAString* aValue, PRBool aNotify);
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
PRBool aCompileEventHandlers);
virtual PRInt32 IntrinsicState() const;
// imgIDecoderObserver
NS_IMETHOD OnStopDecode(imgIRequest *aRequest, nsresult status,
const PRUnichar *statusArg);
@@ -5312,30 +5311,48 @@ nsSVGFEImageElement::LoadSVGImage(PRBool
return LoadImage(href, aForce, aNotify);
}
//----------------------------------------------------------------------
// nsIContent methods:
nsresult
+nsSVGFEImageElement::AfterSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
+ const nsAString* aValue, PRBool aNotify)
+{
+ if (aNamespaceID == kNameSpaceID_XLink && aName == nsGkAtoms::href) {
+ if (aValue) {
+ LoadSVGImage(PR_TRUE, aNotify);
+ } else {
+ CancelImageRequests(aNotify);
+ }
+ }
+
+ return nsSVGFEImageElementBase::AfterSetAttr(aNamespaceID, aName,
+ aValue, aNotify);
+}
+
+nsresult
nsSVGFEImageElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
PRBool aCompileEventHandlers)
{
nsresult rv = nsSVGFEImageElementBase::BindToTree(aDocument, aParent,
aBindingParent,
aCompileEventHandlers);
NS_ENSURE_SUCCESS(rv, rv);
- // Our base URI may have changed; claim that our URI changed, and the
- // nsImageLoadingContent will decide whether a new image load is warranted.
- // Note: no need to notify here; since we're just now being bound
- // we don't have any frames or anything yet.
- LoadSVGImage(PR_FALSE, PR_FALSE);
+ if (HasAttr(kNameSpaceID_XLink, nsGkAtoms::href)) {
+ // Our base URI may have changed; claim that our URI changed, and the
+ // nsImageLoadingContent will decide whether a new image load is warranted.
+ // Note: no need to notify here; since we're just now being bound
+ // we don't have any frames or anything yet.
+ LoadSVGImage(PR_FALSE, PR_FALSE);
+ }
return rv;
}
PRInt32
nsSVGFEImageElement::IntrinsicState() const
{
return nsSVGFEImageElementBase::IntrinsicState() |
@@ -5429,26 +5446,16 @@ nsSVGFEImageElement::ComputeTargetBBox(c
nsSVGElement::StringAttributesInfo
nsSVGFEImageElement::GetStringInfo()
{
return StringAttributesInfo(mStringAttributes, sStringInfo,
NS_ARRAY_LENGTH(sStringInfo));
}
-void
-nsSVGFEImageElement::DidChangeString(PRUint8 aAttrEnum, PRBool aDoSetAttr)
-{
- nsSVGFEImageElementBase::DidChangeString(aAttrEnum, aDoSetAttr);
-
- if (aAttrEnum == HREF) {
- LoadSVGImage(PR_TRUE, PR_TRUE);
- }
-}
-
//----------------------------------------------------------------------
// imgIDecoderObserver methods
NS_IMETHODIMP
nsSVGFEImageElement::OnStopDecode(imgIRequest *aRequest,
nsresult status,
const PRUnichar *statusArg)
{
--- a/content/svg/content/src/nsSVGImageElement.cpp
+++ b/content/svg/content/src/nsSVGImageElement.cpp
@@ -76,20 +76,19 @@ public:
NS_DECL_NSIDOMSVGIMAGEELEMENT
NS_DECL_NSIDOMSVGURIREFERENCE
// xxx I wish we could use virtual inheritance
NS_FORWARD_NSIDOMNODE(nsSVGImageElementBase::)
NS_FORWARD_NSIDOMELEMENT(nsSVGImageElementBase::)
NS_FORWARD_NSIDOMSVGELEMENT(nsSVGImageElementBase::)
- // nsSVGElement specializations:
- virtual void DidChangeString(PRUint8 aAttrEnum, PRBool aDoSetAttr);
-
// nsIContent interface
+ virtual nsresult AfterSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
+ const nsAString* aValue, PRBool aNotify);
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
PRBool aCompileEventHandlers);
virtual PRInt32 IntrinsicState() const;
NS_IMETHODIMP_(PRBool) IsAttributeMapped(const nsIAtom* name) const;
@@ -244,33 +243,16 @@ nsSVGImageElement::GetHref(nsIDOMSVGAnim
nsSVGElement::LengthAttributesInfo
nsSVGImageElement::GetLengthInfo()
{
return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
NS_ARRAY_LENGTH(sLengthInfo));
}
-void
-nsSVGImageElement::DidChangeString(PRUint8 aAttrEnum, PRBool aDoSetAttr)
-{
- nsSVGImageElementBase::DidChangeString(aAttrEnum, aDoSetAttr);
-
- if (aAttrEnum == HREF) {
- // If caller is not chrome and dom.disable_image_src_set is true,
- // prevent setting image.src by exiting early
- if (nsContentUtils::GetBoolPref("dom.disable_image_src_set") &&
- !nsContentUtils::IsCallerChrome()) {
- return;
- }
-
- LoadSVGImage(PR_TRUE, PR_TRUE);
- }
-}
-
//----------------------------------------------------------------------
nsresult
nsSVGImageElement::LoadSVGImage(PRBool aForce, PRBool aNotify)
{
// resolve href attribute
nsCOMPtr<nsIURI> baseURI = GetBaseURI();
@@ -282,30 +264,54 @@ nsSVGImageElement::LoadSVGImage(PRBool a
return LoadImage(href, aForce, aNotify);
}
//----------------------------------------------------------------------
// nsIContent methods:
nsresult
+nsSVGImageElement::AfterSetAttr(PRInt32 aNamespaceID, nsIAtom* aName,
+ const nsAString* aValue, PRBool aNotify)
+{
+ if (aNamespaceID == kNameSpaceID_XLink && aName == nsGkAtoms::href) {
+ // If caller is not chrome and dom.disable_image_src_set is true,
+ // prevent setting image.src by exiting early
+ if (nsContentUtils::GetBoolPref("dom.disable_image_src_set") &&
+ !nsContentUtils::IsCallerChrome()) {
+ return NS_OK;
+ }
+
+ if (aValue) {
+ LoadSVGImage(PR_TRUE, aNotify);
+ } else {
+ CancelImageRequests(aNotify);
+ }
+ }
+ return nsSVGImageElementBase::AfterSetAttr(aNamespaceID, aName,
+ aValue, aNotify);
+}
+
+nsresult
nsSVGImageElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
PRBool aCompileEventHandlers)
{
nsresult rv = nsSVGImageElementBase::BindToTree(aDocument, aParent,
aBindingParent,
aCompileEventHandlers);
NS_ENSURE_SUCCESS(rv, rv);
- // Our base URI may have changed; claim that our URI changed, and the
- // nsImageLoadingContent will decide whether a new image load is warranted.
- // Note: no need to notify here; since we're just now being bound
- // we don't have any frames or anything yet.
- LoadSVGImage(PR_FALSE, PR_FALSE);
+ if (HasAttr(kNameSpaceID_XLink, nsGkAtoms::href)) {
+ // Our base URI may have changed; claim that our URI changed, and the
+ // nsImageLoadingContent will decide whether a new image load is warranted.
+ // Note: no need to notify here; since we're just now being bound
+ // we don't have any frames or anything yet.
+ LoadSVGImage(PR_FALSE, PR_FALSE);
+ }
return rv;
}
PRInt32
nsSVGImageElement::IntrinsicState() const
{
return nsSVGImageElementBase::IntrinsicState() |