nsresult SVGMPathElement::AfterSetAttr(int32_t aNamespaceID, nsAtom* aName, const nsAttrValue* aValue, const nsAttrValue* aOldValue, nsIPrincipal* aMaybeScriptedPrincipal, bool aNotify) { if (!aValue && aName == nsGkAtoms::href) { // href attr being removed. if (aNamespaceID == kNameSpaceID_None) { UnlinkHrefTarget(true); // After unsetting href, we may still have xlink:href, so we should // try to add it back. const nsAttrValue* xlinkHref = mAttrsAndChildren.GetAttr(nsGkAtoms::href, kNameSpaceID_XLink); if (xlinkHref) { UpdateHrefTarget(GetParent(), xlinkHref->GetStringValue()); } } else if (aNamespaceID == kNameSpaceID_XLink && !HasAttr(kNameSpaceID_None, nsGkAtoms::href)) { UnlinkHrefTarget(true); } // else: we unset some random-namespace href attribute, or unset xlink:href // but still have href attribute, so keep the target linking to href. } return SVGMPathElementBase::AfterSetAttr(aNamespaceID, aName, aValue, aOldValue, aMaybeScriptedPrincipal, aNotify); }
bool SVGMPathElement::ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute, const nsAString& aValue, nsIPrincipal* aMaybeScriptedPrincipal, nsAttrValue& aResult) { bool returnVal = SVGMPathElementBase::ParseAttribute(aNamespaceID, aAttribute, aValue, aMaybeScriptedPrincipal, aResult); if ((aNamespaceID == kNameSpaceID_XLink || aNamespaceID == kNameSpaceID_None ) && aAttribute == nsGkAtoms::href && IsInUncomposedDoc()) { // Note: If we fail the IsInDoc call, it's ok -- we'll update the target // on next BindToTree call. // Note: "href" takes priority over xlink:href. So if "xlink:href" is being // set here, we only let that update our target if "href" is *unset*. if (aNamespaceID != kNameSpaceID_XLink || !mStringAttributes[HREF].IsExplicitlySet()) { UpdateHrefTarget(GetParent(), aValue); } } return returnVal; }
nsresult SVGAnimationElement::AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName, const nsAttrValue* aValue, bool aNotify) { nsresult rv = SVGAnimationElementBase::AfterSetAttr(aNamespaceID, aName, aValue, aNotify); if (SVGTests::IsConditionalProcessingAttribute(aName)) { bool isDisabled = !SVGTests::PassesConditionalProcessingTests(); if (mTimedElement.SetIsDisabled(isDisabled)) { AnimationNeedsResample(); } } if (aNamespaceID != kNameSpaceID_XLink || aName != nsGkAtoms::href) return rv; if (!aValue) { mHrefTarget.Unlink(); AnimationTargetChanged(); } else if (IsInDoc()) { MOZ_ASSERT(aValue->Type() == nsAttrValue::eString, "Expected href attribute to be string type"); UpdateHrefTarget(this, aValue->GetStringValue()); } // else: we're not yet in a document -- we'll update the target on // next BindToTree call. return rv; }
nsresult SVGAnimationElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, nsIContent* aBindingParent, bool aCompileEventHandlers) { NS_ABORT_IF_FALSE(!mHrefTarget.get(), "Shouldn't have href-target yet " "(or it should've been cleared)"); nsresult rv = SVGAnimationElementBase::BindToTree(aDocument, aParent, aBindingParent, aCompileEventHandlers); NS_ENSURE_SUCCESS(rv,rv); // XXXdholbert is GetCtx (as a check for SVG parent) still needed here? if (!GetCtx()) { // No use proceeding. We don't have an SVG parent (yet) so we won't be able // to register ourselves etc. Maybe next time we'll have more luck. // (This sort of situation will arise a lot when trees are being constructed // piece by piece via script) return NS_OK; } // Add myself to the animation controller's master set of animation elements. if (aDocument) { nsSMILAnimationController *controller = aDocument->GetAnimationController(); if (controller) { controller->RegisterAnimationElement(this); } const nsAttrValue* href = mAttrsAndChildren.GetAttr(nsGkAtoms::href, kNameSpaceID_XLink); if (href) { nsAutoString hrefStr; href->ToString(hrefStr); // Pass in |aParent| instead of |this| -- first argument is only used // for a call to GetCurrentDoc(), and |this| might not have a current // document yet. UpdateHrefTarget(aParent, hrefStr); } mTimedElement.BindToTree(aParent); } AnimationNeedsResample(); return NS_OK; }
bool SVGMPathElement::ParseAttribute(int32_t aNamespaceID, nsIAtom* aAttribute, const nsAString& aValue, nsAttrValue& aResult) { bool returnVal = SVGMPathElementBase::ParseAttribute(aNamespaceID, aAttribute, aValue, aResult); if (aNamespaceID == kNameSpaceID_XLink && aAttribute == nsGkAtoms::href && IsInDoc()) { // NOTE: If we fail the IsInDoc call, it's ok -- we'll update the target // on next BindToTree call. UpdateHrefTarget(GetParent(), aValue); } return returnVal; }
nsresult SVGAnimationElement::AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName, const nsAttrValue* aValue, bool aNotify) { nsresult rv = SVGAnimationElementBase::AfterSetAttr(aNamespaceID, aName, aValue, aNotify); if (aNamespaceID != kNameSpaceID_XLink || aName != nsGkAtoms::href) return rv; if (!aValue) { mHrefTarget.Unlink(); AnimationTargetChanged(); } else if (IsInDoc()) { NS_ABORT_IF_FALSE(aValue->Type() == nsAttrValue::eString, "Expected href attribute to be string type"); UpdateHrefTarget(this, aValue->GetStringValue()); } // else: we're not yet in a document -- we'll update the target on // next BindToTree call. return rv; }