nsresult HTMLSharedElement::SetAttr(int32_t aNameSpaceID, nsIAtom* aName, nsIAtom* aPrefix, const nsAString& aValue, bool aNotify) { nsresult rv = nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix, aValue, aNotify); NS_ENSURE_SUCCESS(rv, rv); // If the href attribute of a <base> tag is changing, we may need to update // the document's base URI, which will cause all the links on the page to be // re-resolved given the new base. If the target attribute is changing, we // similarly need to change the base target. if (mNodeInfo->Equals(nsGkAtoms::base) && aNameSpaceID == kNameSpaceID_None && IsInDoc()) { if (aName == nsGkAtoms::href) { SetBaseURIUsingFirstBaseWithHref(GetUncomposedDoc(), this); } else if (aName == nsGkAtoms::target) { SetBaseTargetUsingFirstBaseWithTarget(GetUncomposedDoc(), this); } } return NS_OK; }
nsresult HTMLSharedElement::AfterSetAttr(int32_t aNamespaceID, nsAtom* aName, const nsAttrValue* aValue, const nsAttrValue* aOldValue, nsIPrincipal* aSubjectPrincipal, bool aNotify) { if (aNamespaceID == kNameSpaceID_None) { if (aName == nsGkAtoms::href) { // If the href attribute of a <base> tag is changing, we may need to // update the document's base URI, which will cause all the links on the // page to be re-resolved given the new base. // If the href is being unset (aValue is null), we will need to find a new // <base>. if (mNodeInfo->Equals(nsGkAtoms::base) && IsInUncomposedDoc()) { SetBaseURIUsingFirstBaseWithHref(GetUncomposedDoc(), aValue ? this : nullptr); } } else if (aName == nsGkAtoms::target) { // The target attribute is in pretty much the same situation as the href // attribute, above. if (mNodeInfo->Equals(nsGkAtoms::base) && IsInUncomposedDoc()) { SetBaseTargetUsingFirstBaseWithTarget(GetUncomposedDoc(), aValue ? this : nullptr); } } } return nsGenericHTMLElement::AfterSetAttr(aNamespaceID, aName, aValue, aOldValue, aSubjectPrincipal, aNotify); }
void HTMLSharedElement::UnbindFromTree(bool aDeep, bool aNullParent) { nsIDocument* doc = GetUncomposedDoc(); nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent); // If we're removing a <base> from a document, we may need to update the // document's base URI and base target if (doc && mNodeInfo->Equals(nsGkAtoms::base)) { if (HasAttr(kNameSpaceID_None, nsGkAtoms::href)) { SetBaseURIUsingFirstBaseWithHref(doc, nullptr); } if (HasAttr(kNameSpaceID_None, nsGkAtoms::target)) { SetBaseTargetUsingFirstBaseWithTarget(doc, nullptr); } } }
nsresult HTMLSharedElement::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aName, bool aNotify) { nsresult rv = nsGenericHTMLElement::UnsetAttr(aNameSpaceID, aName, aNotify); NS_ENSURE_SUCCESS(rv, rv); // If we're the first <base> with an href and our href attribute is being // unset, then we're no longer the first <base> with an href, and we need to // find the new one. Similar for target. if (mNodeInfo->Equals(nsGkAtoms::base) && aNameSpaceID == kNameSpaceID_None && IsInDoc()) { if (aName == nsGkAtoms::href) { SetBaseURIUsingFirstBaseWithHref(GetUncomposedDoc(), nullptr); } else if (aName == nsGkAtoms::target) { SetBaseTargetUsingFirstBaseWithTarget(GetUncomposedDoc(), nullptr); } } return NS_OK; }
nsresult HTMLSharedElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, nsIContent* aBindingParent) { nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent, aBindingParent); NS_ENSURE_SUCCESS(rv, rv); // The document stores a pointer to its base URI and base target, which we may // need to update here. if (mNodeInfo->Equals(nsGkAtoms::base) && aDocument) { if (HasAttr(kNameSpaceID_None, nsGkAtoms::href)) { SetBaseURIUsingFirstBaseWithHref(aDocument, this); } if (HasAttr(kNameSpaceID_None, nsGkAtoms::target)) { SetBaseTargetUsingFirstBaseWithTarget(aDocument, this); } } return NS_OK; }