commit 3a0b29121e2273701a63210a4dc075f1fa60c976
parent e821559f74fdbcff1b9d7434ade855a5991ec25b
Author: Alice Boxhall <95208+alice@users.noreply.github.com>
Date: Tue, 6 Jan 2026 16:13:54 +0000
Bug 1989323 - Make `referenceTarget` IDL attributes on ShadowRoot, HTMLTemplateElement and ShadowRootInit nullable. r=dom-core,webidl,saschanaz,smaug
This was resolved in https://github.com/WICG/webcomponents/issues/1093.
Differential Revision: https://phabricator.services.mozilla.com/D265456
Diffstat:
7 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/dom/base/Element.h b/dom/base/Element.h
@@ -1511,7 +1511,7 @@ class Element : public FragmentOrElement {
SlotAssignmentMode aSlotAssignmentMode = SlotAssignmentMode::Named,
ShadowRootClonable aClonable = ShadowRootClonable::No,
ShadowRootSerializable aSerializable = ShadowRootSerializable::No,
- const nsAString& aReferenceTarget = EmptyString());
+ const nsAString& aReferenceTarget = VoidString());
// Attach UA Shadow Root if it is not attached.
enum class NotifyUAWidgetSetup : bool { No, Yes };
diff --git a/dom/base/ShadowRoot.cpp b/dom/base/ShadowRoot.cpp
@@ -71,8 +71,7 @@ ShadowRoot::ShadowRoot(Element* aElement, ShadowRootMode aMode,
mIsAvailableToElementInternals(false),
mIsDeclarative(aDeclarative),
mIsClonable(aIsClonable),
- mIsSerializable(aIsSerializable),
- mReferenceTarget(nsGkAtoms::_empty) {
+ mIsSerializable(aIsSerializable) {
// nsINode.h relies on this.
MOZ_ASSERT(static_cast<nsINode*>(this) == reinterpret_cast<nsINode*>(this));
MOZ_ASSERT(static_cast<nsIContent*>(this) ==
@@ -941,6 +940,5 @@ void ShadowRoot::GetHTML(const GetHTMLOptions& aOptions, nsAString& aResult) {
aOptions.mShadowRoots);
}
void ShadowRoot::SetReferenceTarget(RefPtr<nsAtom> aTarget) {
- MOZ_ASSERT(aTarget);
mReferenceTarget = std::move(aTarget);
}
diff --git a/dom/base/ShadowRoot.h b/dom/base/ShadowRoot.h
@@ -276,16 +276,22 @@ class ShadowRoot final : public DocumentFragment, public DocumentOrShadowRoot {
void GetHTML(const GetHTMLOptions& aOptions, nsAString& aResult);
void GetReferenceTarget(nsAString& aResult) const {
+ if (!mReferenceTarget) {
+ aResult.SetIsVoid(true);
+ return;
+ }
mReferenceTarget->ToString(aResult);
}
nsAtom* ReferenceTarget() const { return mReferenceTarget; }
void SetReferenceTarget(const nsAString& aValue) {
+ if (aValue.IsVoid()) {
+ return SetReferenceTarget(nullptr);
+ }
SetReferenceTarget(NS_Atomize(aValue));
}
void SetReferenceTarget(RefPtr<nsAtom> aTarget);
Element* GetReferenceTargetElement() const {
- return mReferenceTarget->IsEmpty() ? nullptr
- : GetElementById(mReferenceTarget);
+ return mReferenceTarget ? GetElementById(mReferenceTarget) : nullptr;
}
protected:
diff --git a/dom/webidl/Element.webidl b/dom/webidl/Element.webidl
@@ -282,7 +282,7 @@ dictionary ShadowRootInit {
// https://github.com/whatwg/dom/pull/1353
[Pref="dom.shadowdom.referenceTarget.enabled"]
- DOMString referenceTarget;
+ DOMString? referenceTarget;
};
// https://dom.spec.whatwg.org/#element
diff --git a/dom/webidl/HTMLTemplateElement.webidl b/dom/webidl/HTMLTemplateElement.webidl
@@ -23,5 +23,5 @@ interface HTMLTemplateElement : HTMLElement {
[CEReactions, SetterThrows]
attribute boolean shadowRootSerializable;
[CEReactions, SetterThrows, Pref="dom.shadowdom.referenceTarget.enabled"]
- attribute DOMString shadowRootReferenceTarget;
+ attribute DOMString? shadowRootReferenceTarget;
};
diff --git a/dom/webidl/ShadowRoot.webidl b/dom/webidl/ShadowRoot.webidl
@@ -32,7 +32,7 @@ interface ShadowRoot : DocumentFragment
attribute EventHandler onslotchange;
[Pref="dom.shadowdom.referenceTarget.enabled"]
- attribute DOMString referenceTarget;
+ attribute DOMString? referenceTarget;
Element? getElementById(DOMString elementId);
diff --git a/testing/web-platform/meta/shadow-dom/reference-target/tentative/reference-target-basics.html.ini b/testing/web-platform/meta/shadow-dom/reference-target/tentative/reference-target-basics.html.ini
@@ -1,6 +0,0 @@
-[reference-target-basics.html]
- [ShadowRoot.referenceTarget defaults to null when shadow is created declaratively]
- expected: FAIL
-
- [ShadowRoot.referenceTarget defaults to null when shadow is created imperatively]
- expected: FAIL