Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 817f94b

Browse files
mfreed7annevk
authored andcommittedOct 2, 2023
Add declarative shadow root support
Corresponding HTML PR: whatwg/html#5465. Tests: https://wpt.fyi/results/shadow-dom/declarative. Closes whatwg#831.
1 parent 3bddf91 commit 817f94b

File tree

1 file changed

+84
-26
lines changed

1 file changed

+84
-26
lines changed
 

‎dom.bs

+84-26
Original file line numberDiff line numberDiff line change
@@ -4465,15 +4465,36 @@ dom-Range-extractContents, dom-Range-cloneContents -->
44654465
<var>copy</var>, if <var>copy</var> is a <a>document</a>, and set <var>copy</var>'s
44664466
<a for=Node>node document</a> to <var>document</var> otherwise.
44674467

4468-
<li>Run any <a>cloning steps</a> defined for <var>node</var> in
4468+
<li><p>Run any <a>cloning steps</a> defined for <var>node</var> in
44694469
<a>other applicable specifications</a> and pass <var>copy</var>, <var>node</var>,
4470-
<var>document</var> and the <i>clone children flag</i> if set, as parameters.
4470+
<var>document</var>, and the <i>clone children flag</i> if set, as parameters.
44714471

4472-
<li>If the <i>clone children flag</i> is set, <a lt="clone a node">clone</a> all the
4473-
<a for=tree>children</a> of <var>node</var> and append them to <var>copy</var>, with
4474-
<var>document</var> as specified and the <i>clone children flag</i> being set.
4472+
<li><p>If the <i>clone children flag</i> is set, then for each <a for=tree>child</a>
4473+
<var>child</var> of <var>node</var>, in <a>tree order</a>: <a>append</a> the result of
4474+
<a lt="clone a node">cloning</a> <var>child</var> with <var>document</var> and the
4475+
<i>clone children flag</i> set, to <var>copy</var>.
44754476

4476-
<li>Return <var>copy</var>.
4477+
<li>
4478+
<p>If <var>node</var> is a <a for=Element>shadow host</a> whose <a for=/>shadow root</a>'s
4479+
<a for=ShadowRoot>clonable</a> is true:
4480+
4481+
<ol>
4482+
<li><p>Run <a>attach a shadow root</a> with <var>copy</var>, <var>node</var>'s
4483+
<a for=Element>shadow root</a>'s <a for=ShadowRoot>mode</a>, true, <var>node</var>'s
4484+
<a for=Element>shadow root</a>'s <a for=ShadowRoot>delegates focus</a>, and <var>node</var>'s
4485+
<a for=Element>shadow root</a>'s <a for=ShadowRoot>slot assignment</a>.
4486+
4487+
<li><p>Set <var>copy</var>'s <a for=Element>shadow root</a>'s <a for=ShadowRoot>declarative</a>
4488+
to <var>node</var>'s <a for=Element>shadow root</a>'s <a for=ShadowRoot>declarative</a>.
4489+
4490+
<li><p>If the <i>clone children flag</i> is set, then for each <a for=tree>child</a>
4491+
<var>child</var> of <var>node</var>'s <a for=Element>shadow root</a>, in <a>tree order</a>:
4492+
<a>append</a> the result of <a lt="clone a node">cloning</a> <var>child</var> with
4493+
<var>document</var> and the <i>clone children flag</i> set, to <var>copy</var>'s
4494+
<a for=Element>shadow root</a>.
4495+
</ol>
4496+
4497+
<li><p>Return <var>copy</var>.
44774498
</ol>
44784499

44794500
<p>The <dfn method for=Node><code>cloneNode(<var>deep</var>)</code></dfn> method steps are:
@@ -4973,8 +4994,9 @@ known as <dfn export id=concept-document lt="document">documents</dfn>.
49734994
<dfn export for=Document id=concept-document-content-type>content type</dfn> (a string),
49744995
<dfn export for=Document id=concept-document-url>URL</dfn> (a <a for=/>URL</a>),
49754996
<dfn export for=Document id=concept-document-origin>origin</dfn> (an <a for=/>origin</a>),
4976-
<dfn export for=Document id=concept-document-type>type</dfn> ("<code>xml</code>" or "<code>html</code>"), and
4977-
<dfn export for=Document id=concept-document-mode>mode</dfn> ("<code>no-quirks</code>", "<code>quirks</code>", or "<code>limited-quirks</code>").
4997+
<dfn export for=Document id=concept-document-type>type</dfn> ("<code>xml</code>" or "<code>html</code>"),
4998+
<dfn export for=Document id=concept-document-mode>mode</dfn> ("<code>no-quirks</code>", "<code>quirks</code>", or "<code>limited-quirks</code>"), and
4999+
<dfn export for=Document>allow declarative shadow roots</dfn> (a boolean).
49785000
[[!ENCODING]]
49795001
[[!URL]]
49805002
[[!HTML]]
@@ -4983,8 +5005,8 @@ known as <dfn export id=concept-document lt="document">documents</dfn>.
49835005
<a for=/>encoding</a>, <a for=Document>content type</a> is
49845006
"<code>application/xml</code>", <a for=Document>URL</a> is "<code>about:blank</code>",
49855007
<a for=Document>origin</a> is an <a>opaque origin</a>,
4986-
<a for=Document>type</a> is "<code>xml</code>", and its
4987-
<a for=Document>mode</a> is "<code>no-quirks</code>".
5008+
<a for=Document>type</a> is "<code>xml</code>", <a for=Document>mode</a> is "<code>no-quirks</code>",
5009+
and <a for=Document>allow declarative shadow roots</a> is false.
49885010

49895011
<p>A <a>document</a> is said to be an <dfn export>XML document</dfn> if its <a for=Document>type</a>
49905012
is "<code>xml</code>"; otherwise an <dfn export>HTML document</dfn>. Whether a <a>document</a> is an
@@ -5857,13 +5879,19 @@ It is initially set to false.</p>
58575879
<p><a for=/>Shadow roots</a> have an associated
58585880
<dfn export for=ShadowRoot>available to element internals</dfn>. It is initially set to false.</p>
58595881

5882+
<p><a for=/>Shadow roots</a> have an associated <dfn export for=ShadowRoot>declarative</dfn>
5883+
(a boolean). It is initially set to false.</p>
5884+
58605885
<p><a for=/>Shadow roots</a>'s associated <a for=DocumentFragment>host</a> is never null.</p>
58615886
<!-- If we ever change this, e.g., add a ShadowRoot object constructor, that would have serious
58625887
consequences for innerHTML. -->
58635888

58645889
<p><a for=/>Shadow roots</a> have an associated <dfn for=ShadowRoot>slot assignment</dfn>
58655890
("<code>manual</code>" or "<code>named</code>").
58665891

5892+
<p><a for=/>Shadow roots</a> have an associated <dfn for=ShadowRoot>clonable</dfn> (a boolean).
5893+
It is initially set to false.</p>
5894+
58675895
<p>A <a for=/>shadow root</a>'s <a>get the parent</a> algorithm, given an <var>event</var>, returns
58685896
null if <var>event</var>'s <a>composed flag</a> is unset and <a for=/>shadow root</a> is the
58695897
<a for=tree>root</a> of <var>event</var>'s <a for=Event>path</a>'s first struct's
@@ -6010,6 +6038,7 @@ dictionary ShadowRootInit {
60106038
required ShadowRootMode mode;
60116039
boolean delegatesFocus = false;
60126040
SlotAssignmentMode slotAssignment = "named";
6041+
boolean clonable = false;
60136042
};
60146043
</pre>
60156044

@@ -6857,23 +6886,38 @@ are:
68576886
"<code>span</code>"
68586887
</ul>
68596888

6889+
<div algorithm>
68606890
<p>The <dfn method for=Element><code>attachShadow(<var>init</var>)</code></dfn> method steps are:
68616891

68626892
<ol>
6863-
<li><p>If <a>this</a>'s <a for=Element>namespace</a> is not the <a>HTML namespace</a>,
6893+
<li><p>Run <a>attach a shadow root</a> with <a>this</a>, <var>init</var>["{{ShadowRootInit/mode}}"],
6894+
<var>init</var>["{{ShadowRootInit/clonable}}"], <var>init</var>["{{ShadowRootInit/delegatesFocus}}"],
6895+
and <var>init</var>["{{ShadowRootInit/slotAssignment}}"].
6896+
6897+
<li><p>Return <a>this</a>'s <a for=Element>shadow root</a>.
6898+
</ol>
6899+
</div>
6900+
6901+
<div algorithm>
6902+
<p>To <dfn id=concept-attach-a-shadow-root>attach a shadow root</dfn>, given an
6903+
<a for=/>element</a> <var>element</var>, a string <var>mode</var>, a boolean <var>clonable</var>,
6904+
a boolean <var>delegatesFocus</var>, and a boolean <var>slotAssignment</var>:
6905+
6906+
<ol>
6907+
<li><p>If <var>element</var>'s <a for=Element>namespace</a> is not the <a>HTML namespace</a>,
68646908
then <a>throw</a> a "{{NotSupportedError!!exception}}" {{DOMException}}.
68656909

68666910
<li><p>If <a>this</a>'s <a for=Element>local name</a> is not a <a>valid shadow host name</a>, then
68676911
<a>throw</a> a "{{NotSupportedError!!exception}}" {{DOMException}}.
68686912

68696913
<li>
6870-
<p>If <a>this</a>'s <a for=Element>local name</a> is a <a>valid custom element name</a>, or
6871-
<a>this</a>'s <a for=Element><code>is</code> value</a> is not null, then:
6914+
<p>If <var>element</var>'s <a for=Element>local name</a> is a <a>valid custom element name</a>, or
6915+
<var>element</var>'s <a for=Element><code>is</code> value</a> is non-null, then:
68726916

68736917
<ol>
68746918
<li><p>Let <var>definition</var> be the result of
68756919
<a lt="look up a custom element definition">looking up a custom element definition</a> given
6876-
<a>this</a>'s <a for=Node>node document</a>, its <a for=Element>namespace</a>, its
6920+
<var>element</var>'s <a for=Node>node document</a>, its <a for=Element>namespace</a>, its
68776921
<a for=Element>local name</a>, and its <a for=Element><code>is</code> value</a>.
68786922

68796923
<li><p>If <var>definition</var> is not null and <var>definition</var>'s
@@ -6882,38 +6926,52 @@ are:
68826926
</ol>
68836927
</li>
68846928

6885-
<li><p>If <a>this</a> is a <a for=Element>shadow host</a>, then <a>throw</a> an
6886-
"{{NotSupportedError!!exception}}" {{DOMException}}.
6929+
<li>
6930+
<p>If <var>element</var> is a <a for=Element>shadow host</a>, then:
6931+
6932+
<ol>
6933+
<li><p>If <var>element</var>'s <a for=Element>shadow root</a>'s <a for=ShadowRoot>declarative</a>
6934+
is false, then <a>throw</a> an "{{NotSupportedError!!exception}}" {{DOMException}}.
6935+
6936+
<li><p>Otherwise, <a for=/>remove</a> all of <var>element</var>'s
6937+
<a for=Element>shadow root</a>'s <a>children</a>, in <a>tree order</a>, and return.
6938+
6939+
<p class=note>This means that if multiple declarative shadow roots are contained within a single
6940+
shadow host, only the last one will remain.
6941+
</ol>
68876942

68886943
<li><p>Let <var>shadow</var> be a new <a for=/>shadow root</a> whose <a for=Node>node document</a>
6889-
is <a>this</a>'s <a for=Node>node document</a>, <a for=DocumentFragment>host</a> is <a>this</a>,
6890-
and <a for=ShadowRoot>mode</a> is <var>init</var>["{{ShadowRootInit/mode}}"].
6944+
is <var>element</var>'s <a for=Node>node document</a>, <a for=DocumentFragment>host</a> is
6945+
<var>element</var>, and <a for=ShadowRoot>mode</a> is <var>mode</var>.
68916946

6892-
<li><p>Set <var>shadow</var>'s <a for=ShadowRoot>delegates focus</a> to
6893-
<var>init</var>["{{ShadowRootInit/delegatesFocus}}"].
6947+
<li><p>Set <var>shadow</var>'s <a for=ShadowRoot>delegates focus</a> to <var>delegatesFocus</var>.
68946948

68956949
<li><p>If <a>this</a>'s <a for=Element>custom element state</a> is "<code>precustomized</code>" or
68966950
"<code>custom</code>", then set <var>shadow</var>'s
68976951
<a for=ShadowRoot>available to element internals</a> to true.
68986952

6899-
<li><p>Set <var>shadow</var>'s <a for=ShadowRoot>slot assignment</a> to
6900-
<var>init</var>["{{ShadowRootInit/slotAssignment}}"].
6953+
<li><p>Set <var>shadow</var>'s <a for=ShadowRoot>slot assignment</a> to <var>slotAssignment</var>.
69016954

6902-
<li><p>Set <a>this</a>'s <a for=Element>shadow root</a> to <var>shadow</var>.
6955+
<li><p>Set <var>shadow</var>'s <a for=ShadowRoot>declarative</a> to false.
69036956

6904-
<li><p>Return <var>shadow</var>.
6957+
<li><p>Set <var>shadow</var>'s <a for=ShadowRoot>clonable</a> to <var>clonable</var>.
6958+
6959+
<li><p>Set <var>element</var>'s <a for=Element>shadow root</a> to <var>shadow</var>.
69056960
</ol>
6961+
</div>
69066962

6963+
<div algorithm>
69076964
<p>The <dfn attribute for=Element><code>shadowRoot</code></dfn> getter steps are:
69086965

69096966
<ol>
69106967
<li><p>Let <var>shadow</var> be <a>this</a>'s <a for=Element>shadow root</a>.
69116968

69126969
<li><p>If <var>shadow</var> is null or its <a for=ShadowRoot>mode</a> is "<code>closed</code>",
6913-
then return null.</p></li>
6970+
then return null.
69146971

69156972
<li><p>Return <var>shadow</var>.
69166973
</ol>
6974+
</div>
69176975

69186976
<hr>
69196977

@@ -10223,7 +10281,7 @@ Manish Tripathi,
1022310281
Marcos Caceres,
1022410282
Mark Miller,
1022510283
Martijn van der Ven,
10226-
Mason Freed,
10284+
Mason Freed,<!-- mfreed7; GitHub -->
1022710285
Mats Palmgren,
1022810286
Mounir Lamouri,
1022910287
Michael Stramel,

0 commit comments

Comments
 (0)
Please sign in to comment.