@@ -1807,6 +1807,22 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
1807
1807
</li>
1808
1808
</ol>
1809
1809
1810
+ <p>The <span data-x="concept-node-post-connection-ext">post-connection steps</span> for the HTML
1811
+ Standard, given <var>insertedNode</var>, are defined as the following:</p>
1812
+
1813
+ <ol>
1814
+ <li>
1815
+ <p>For each <var>descendant</var> of <var>insertedNode</var>'s <span data-x="inclusive
1816
+ descendant">inclusive descendants</span> in <span>tree order</span>:</p>
1817
+
1818
+ <ol>
1819
+ <li><p>If <var>descendant</var> is a <code>selectedoption</code> element, then run the
1820
+ <span>selectedoption insertion steps</span> given <var>descendant</var> and
1821
+ <var>insertedNode</var>'s <span>parent</span>.</p></li>
1822
+ </ol>
1823
+ </li>
1824
+ </ol>
1825
+
1810
1826
<p>The <span data-x="concept-node-remove-ext">removing steps</span> for the HTML Standard, given
1811
1827
<var>removedNode</var> and <var>oldParent</var>, are defined as the following:</p>
1812
1828
@@ -1857,6 +1873,10 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
1857
1873
<ol>
1858
1874
<li><p>If <var>descendant</var> is an <code>option</code> element, then run the <span>option
1859
1875
removal steps</span> given <var>descendant</var> and <var>oldParent</var>.</p></li>
1876
+
1877
+ <li><p>If <var>descendant</var> is a <code>selectedoption</code> element, then run the
1878
+ <span>selectedoption removal steps</span> given <var>descendant</var> and
1879
+ <var>oldParent</var>.</p></li>
1860
1880
</ol>
1861
1881
</li>
1862
1882
</ol>
@@ -3222,6 +3242,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
3222
3242
<li><dfn data-x="dom-Element-id" data-x-href="https://dom.spec.whatwg.org/#dom-element-id"><code>id</code></dfn> attribute</li>
3223
3243
<li><dfn data-x="dom-Element-setAttribute" data-x-href="https://dom.spec.whatwg.org/#dom-element-setattribute"><code>setAttribute()</code></dfn> method</li>
3224
3244
<li><dfn data-x-href="https://dom.spec.whatwg.org/#dom-node-textcontent"><code>textContent</code></dfn> attribute</li>
3245
+ <li><dfn data-x="dom-parentnode-replacechildren" data-x-href="https://dom.spec.whatwg.org/#dom-parentnode-replacechildren"><code>replaceChildren()</code></dfn> method</li>
3225
3246
3226
3247
<li>The <dfn data-x-href="https://dom.spec.whatwg.org/#concept-tree">tree</dfn>, <dfn data-x-href="https://dom.spec.whatwg.org/#concept-shadow-tree">shadow tree</dfn>, and <dfn data-x-href="https://dom.spec.whatwg.org/#concept-node-tree">node tree</dfn> concepts</li>
3227
3248
<li>The <dfn data-x-href="https://dom.spec.whatwg.org/#concept-tree-order">tree order</dfn> and <dfn data-x-href="https://dom.spec.whatwg.org/#concept-shadow-including-tree-order">shadow-including tree order</dfn> concepts</li>
@@ -3257,6 +3278,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
3257
3278
<li>The <dfn data-x="concept-tree-descendant" data-x-href="https://dom.spec.whatwg.org/#concept-tree-descendant">descendant</dfn> concept</li>
3258
3279
<li>The <dfn data-x="concept-node-insert-ext" data-x-href="https://dom.spec.whatwg.org/#concept-node-insert-ext">insertion steps</dfn>,
3259
3280
<dfn data-x="concept-node-remove-ext" data-x-href="https://dom.spec.whatwg.org/#concept-node-remove-ext">removing steps</dfn>,
3281
+ <dfn data-x="concept-node-post-connection-ext" data-x-href="https://dom.spec.whatwg.org/#concept-node-post-connection-ext">post-connection steps</dfn>,
3260
3282
<dfn data-x="concept-node-adopt-ext" data-x-href="https://dom.spec.whatwg.org/#concept-node-adopt-ext">adopting steps</dfn>, and
3261
3283
<dfn data-x-href="https://dom.spec.whatwg.org/#concept-node-children-changed-ext">children changed steps</dfn> hooks for elements</li>
3262
3284
<li>The <dfn data-x="concept-element-attributes-change" data-x-href="https://dom.spec.whatwg.org/#concept-element-attributes-change">change</dfn>, <dfn data-x="concept-element-attributes-append" data-x-href="https://dom.spec.whatwg.org/#concept-element-attributes-append">append</dfn>, <dfn data-x="concept-element-attributes-remove" data-x-href="https://dom.spec.whatwg.org/#concept-element-attributes-remove">remove</dfn>, <dfn data-x="concept-element-attributes-replace" data-x-href="https://dom.spec.whatwg.org/#concept-element-attributes-replace">replace</dfn>, <dfn data-x="concept-element-attributes-get-by-namespace" data-x-href="https://dom.spec.whatwg.org/#concept-element-attributes-get-by-namespace">get an attribute by namespace and local name</dfn>, <dfn data-x="concept-element-attributes-set-value" data-x-href="https://dom.spec.whatwg.org/#concept-element-attributes-set-value">set value</dfn>, and <dfn data-x="concept-element-attributes-remove-by-namespace" data-x-href="https://dom.spec.whatwg.org/#concept-element-attributes-remove-by-namespace">remove an attribute by namespace and local name</dfn> algorithms for attributes</li>
@@ -3344,6 +3366,7 @@ a.setAttribute('href', 'https://example.com/'); // change the content attribute
3344
3366
<li><dfn data-x="mo childList" data-x-href="https://dom.spec.whatwg.org/#dom-mutationobserverinit-childlist"><code>childList</code></dfn></li>
3345
3367
<li><dfn data-x="mo characterData" data-x-href="https://dom.spec.whatwg.org/#dom-mutationobserverinit-characterdata"><code>characterData</code></dfn></li>
3346
3368
<li><dfn data-x="mo subtree" data-x-href="https://dom.spec.whatwg.org/#dom-mutationobserverinit-subtree"><code>subtree</code></dfn></li>
3369
+ <li><dfn data-x="mo attributes" data-xhref="https://dom.spec.whatwg.org/#dom-mutationobserverinit-attributes"><code>attributes</code></dfn></li>
3347
3370
<li><dfn data-x-href="https://dom.spec.whatwg.org/#abortcontroller"><code>AbortController</code></dfn> and its
3348
3371
<dfn data-x="concept-AbortController-signal" data-x-href="https://dom.spec.whatwg.org/#abortcontroller-signal">signal</dfn></li>
3349
3372
<li><dfn data-x-href="https://dom.spec.whatwg.org/#abortsignal"><code>AbortSignal</code></dfn></li>
@@ -53436,6 +53459,9 @@ interface <dfn interface>HTMLSelectElement</dfn> : <span>HTMLElement</span> {
53436
53459
<li><p>Return <var>options</var>.</p></li>
53437
53460
</ol>
53438
53461
53462
+ <p>Every <code>select</code> element has <dfn>select descendant selectedoption elements</dfn>,
53463
+ which is a <span>list</span> of <code>selectedoption</code> elements, initially « ».</p>
53464
+
53439
53465
<p>The <dfn element-attr for="select"><code data-x="attr-select-required">required</code></dfn>
53440
53466
attribute is a <span>boolean attribute</span>. When specified, the user will be required to select
53441
53467
a value before submitting the form.</p>
@@ -53482,10 +53508,23 @@ interface <dfn interface>HTMLSelectElement</dfn> : <span>HTMLElement</span> {
53482
53508
through a click, or through unfocusing the element after changing its value, or through a <span
53483
53509
data-x="option-command">menu command</span>, or through any other mechanism), and before the
53484
53510
relevant user interaction event <!-- interaction event spec point --> is queued (e.g. before the
53485
- <code data-x="event-click">click</code> event), the user agent must set the <span
53486
- data-x="concept-option-selectedness">selectedness</span> of the picked <code>option</code> element
53487
- to true, set its <span data-x="concept-option-dirtiness">dirtiness</span> to true, and then
53488
- <span>send <code>select</code> update notifications</span>.</p>
53511
+ <code data-x="event-click">click</code> event), the user agent must run the following steps given
53512
+ the <code>select</code> <var>select</var> and the picked <code>option</code>
53513
+ <var>option</var>:</p>
53514
+
53515
+ <ol>
53516
+ <li><p>Set the <span data-x="concept-option-selectedness">selectedness</span> of
53517
+ <var>option</var> to true.</p></li>
53518
+
53519
+ <li><p>Set the <span data-x="concept-option-dirtiness">dirtiness</span> of <var>option</var> to
53520
+ true.</p></li>
53521
+
53522
+ <li><p><span>Send <code>select</code> update notifications</span>.</p></li>
53523
+
53524
+ <li><p>For each <var>selectedoption</var> in <var>select</var>'s <span>select descendant
53525
+ selectedoption elements</span>, run <span>clone an option into a selectedoption</span> given
53526
+ <var>option</var> and <var>selectedoption</var>.</p></li>
53527
+ </ol>
53489
53528
53490
53529
<p>If the <code data-x="attr-select-multiple">multiple</code> attribute is absent, whenever an
53491
53530
<code>option</code> element in the <code>select</code> element's <span
@@ -53514,23 +53553,33 @@ interface <dfn interface>HTMLSelectElement</dfn> : <span>HTMLElement</span> {
53514
53553
53515
53554
<ol>
53516
53555
<li><p>If <var>element</var>'s <code data-x="attr-select-multiple">multiple</code> attribute is
53517
- absent, and <var>element</var>'s <span data-x="concept-select-size">display size</span> is 1,
53518
- and no <code>option</code> elements in the <var>element</var>'s <span
53556
+ absent, then return.</p></li>
53557
+
53558
+ <li><p>If <var>element</var>'s <span data-x="concept-select-size">display size</span> is 1, and
53559
+ no <code>option</code> elements in the <var>element</var>'s <span
53519
53560
data-x="concept-select-option-list">list of options</span> have their <span
53520
53561
data-x="concept-option-selectedness">selectedness</span> set to true, then set the <span
53521
- data-x="concept-option-selectedness">selectedness</span> of the first <code>option</code>
53522
- element in the <span data-x="concept-select-option-list">list of options</span> in
53523
- <span>tree order</span> that is not <span data-x="concept-option-disabled">disabled</span>,
53524
- if any, to true, and return.</p></li>
53562
+ data-x="concept-option-selectedness">selectedness</span> of the first <code>option</code> element
53563
+ in the <span data-x="concept-select-option-list">list of options</span> in <span>tree
53564
+ order</span> that is not <span data-x="concept-option-disabled">disabled</span>, if any, to true ,
53565
+ and return.</p></li>
53525
53566
53526
- <li><p>If <var>element</var>'s <code data-x="attr-select-multiple">multiple</code> attribute is
53527
- absent, and two or more <code>option</code> elements in <var>element</var>'s <span
53567
+ <li><p>If two or more <code>option</code> elements in <var>element</var>'s <span
53528
53568
data-x="concept-select-option-list">list of options</span> have their <span
53529
53569
data-x="concept-option-selectedness">selectedness</span> set to true, then set the <span
53530
53570
data-x="concept-option-selectedness">selectedness</span> of all but the last <code>option</code>
53531
53571
element with its <span data-x="concept-option-selectedness">selectedness</span> set to true in
53532
53572
the <span data-x="concept-select-option-list">list of options</span> in <span>tree order</span>
53533
53573
to false.</p></li>
53574
+
53575
+ <li><p>Let <var>option</var> be the first <code>option</code> in <var>element</var>'s <span
53576
+ data-x="concept-select-option-list">list of options</span> which has its <span
53577
+ data-x="concept-option-selectedness">selectedness</span> set to true, or null if there is no such
53578
+ <code>option</code>.</p></li>
53579
+
53580
+ <li><p>For each <var>selectedoption</var> in <var>element</var>'s <span>select descendant
53581
+ selectedoption elements</span>, run <span>clone an option into a selectedoption</span> given
53582
+ <var>option</var> and <var>selectedoption</var>.</p></li>
53534
53583
</ol>
53535
53584
53536
53585
<p>The <dfn>option insertion steps</dfn>, given <var>option</var> and <var>insertionPoint</var>,
@@ -53849,14 +53898,27 @@ interface <dfn interface>HTMLSelectElement</dfn> : <span>HTMLElement</span> {
53849
53898
data-x="concept-option-selectedness">selectedness</span> set to true, if any. If there isn't one,
53850
53899
then it must return the empty string.</p>
53851
53900
53852
- <p>On setting, the <code data-x="dom-select-value">value</code> attribute must set the <span
53853
- data-x="concept-option-selectedness">selectedness</span> of all the <code>option</code> elements
53854
- in the <span data-x="concept-select-option-list">list of options</span> to false, and then the
53855
- first <code>option</code> element in the <span data-x="concept-select-option-list">list of
53856
- options</span>, in <span>tree order</span>, whose <span data-x="concept-option-value">value</span>
53857
- is equal to the given new value, if any, must have its <span
53858
- data-x="concept-option-selectedness">selectedness</span> set to true and its <span
53859
- data-x="concept-option-dirtiness">dirtiness</span> set to true.</p>
53901
+ <p>On setting, the <code data-x="dom-select-value">value</code> attribute must run the following
53902
+ steps:</p>
53903
+
53904
+ <ol>
53905
+ <li><p>Set the <span data-x="concept-option-selectedness">selectedness</span> of all the
53906
+ <code>option</code> elements in the <span data-x="concept-select-option-list">list of
53907
+ options</span> to false</p></li>
53908
+
53909
+ <li><p>Let <var>option</var> be the first <code>option</code> element in the <span
53910
+ data-x="concept-select-option-list">list of options</span> in <span>tree order</span> whose <span
53911
+ data-x="concept-option-value">value</span> is equal to the new given value, otherwise
53912
+ null.</p></li>
53913
+
53914
+ <li><p>If <var>option</var> is not null, then set <var>option</var>'s <span
53915
+ data-x="concept-option-selectedness">selectedness</span> to true and its <span
53916
+ data-x="concept-option-dirtiness">dirtiness</span> to true.
53917
+
53918
+ <li><p>For each <var>selectedoption</var> in <var>select</var>'s <span>select descendant
53919
+ selectedoption elements</span>, run <span>clone an option into a selectedoption</span> given
53920
+ <var>option</var> and <var>selectedoption</var>.</p></li>
53921
+ </ol>
53860
53922
53861
53923
<p class="note">This can result in no element having a <span
53862
53924
data-x="concept-option-selectedness">selectedness</span> set to true even in the case of the
@@ -54375,6 +54437,16 @@ interface <dfn interface>HTMLOptionElement</dfn> : <span>HTMLElement</span> {
54375
54437
<span>drop-down box</span>, then set <var>select</var>'s <span>select fallback
54376
54438
button text</span> to the value of <var>option</var>'s <span
54377
54439
data-x="dom-option-label">label</span>.</p></li>
54440
+
54441
+ <li>
54442
+ <p>For each <var>selectedoption</var> of <var>select</var>'s <span>select descendant
54443
+ selectedoption elements</span>:</p>
54444
+
54445
+ <ol>
54446
+ <li><p>Run <span>clone an option into a selectedoption</span> given <var>option</var> and
54447
+ <var>selectedoption</var>.</p></li>
54448
+ </ol>
54449
+ </li>
54378
54450
</ol>
54379
54451
54380
54452
<p>The <code>option</code> <span>HTML element insertion steps</span>, given
@@ -54384,8 +54456,9 @@ interface <dfn interface>HTMLOptionElement</dfn> : <span>HTMLElement</span> {
54384
54456
<li><p>Run the <span>mutation observer observe algorithm</span> given <var>insertedOption</var>'s
54385
54457
<span>option element mutation observer</span>, <var>insertedOption</var>, and a
54386
54458
<code>MutationObserverInit</code> with <code data-x="mo characterData">characterData</code> set
54387
- to true, <code data-x="mo childList">childList</code> set to true, and <code data-x="mo
54388
- subtree">subtree</code> set to true.</p></li>
54459
+ to true, <code data-x="mo childList">childList</code> set to true, <code data-x="mo
54460
+ subtree">subtree</code> set to true, and <code data-x="mo attributes">attributes</code> set to
54461
+ true.</p></li>
54389
54462
</ol>
54390
54463
54391
54464
<p>The <code>option</code> <span>HTML element removing steps</span>, given
@@ -56085,6 +56158,115 @@ interface <dfn interface>HTMLLegendElement</dfn> : <span>HTMLElement</span> {
56085
56158
56086
56159
</div>
56087
56160
56161
+ <h4>The <dfn element><code>selectedoption</code></dfn> element</h4>
56162
+
56163
+ <p>The <code>selectedoption</code> element reflects the contents of a <code>select</code>
56164
+ element's currently selected <code>option</code> element. <code>selectedoption</code> elements can
56165
+ be used to declaratively show the selected <code>option</code> element's contents in a different
56166
+ part of the document, such as the <code>select</code> element's invoker button, with alternate
56167
+ rendering based on different selectors in the author's stylesheet.</p>
56168
+
56169
+ <p>Every time the selected <code>option</code> of a <code>select</code> switches from one option
56170
+ to another, or the currently selected <code>option</code>'s descendant DOM structure mutates, the
56171
+ <code>selectedoption</code> element removes all of its children and replaces them with a new
56172
+ cloned copy of the DOM structure of the <code>select</code>'s selected <code>option</code>
56173
+ element.</p>
56174
+
56175
+ <p><code>selectedoption</code> elements become associated with <code>select</code> elements when
56176
+ the <code>selectedoption</code> is a <span>descendant</span> of the <code>select</code>.</p>
56177
+
56178
+ <!-- TODO add code example(s) -->
56179
+
56180
+ <p>To <dfn>clone an option into a selectedoption</dfn>, given an <code>option</code> element
56181
+ <var>option</var> and a <code>selectedoption</code> element <var>selectedOption</var>:</p>
56182
+
56183
+ <ol>
56184
+ <li><p>Let <var>nodes</var> be « ».</p></li>
56185
+
56186
+ <li>
56187
+ <p>If <var>option</var> is not null, then for each <var>child</var> of <var>option</var>'s <span
56188
+ data-x="concept-tree-child">children</span>:</p>
56189
+
56190
+ <ol>
56191
+ <li><p>Let <var>childClone</var> be the result of running <span
56192
+ data-x="concept-node-clone">clone</span> given <var>child</var>, null, true.</p></li>
56193
+
56194
+ <li><p><span data-x="list append">Append</span> <var>childClone</var> to
56195
+ <var>nodes</var>.</p></li>
56196
+ </ol>
56197
+ </li>
56198
+
56199
+ <li><p>Run <span data-x="dom-parentnode-replacechildren">replaceChildren</span> on
56200
+ <var>selectedOption</var> given <var>nodes</var>.</p></li>
56201
+ </ol>
56202
+
56203
+ <p>The <dfn>selectedoption insertion steps</dfn>, given <var>selectedoption</var> and
56204
+ <var>insertionPoint</var>, are:</p>
56205
+
56206
+ <ol>
56207
+ <li><p>Let <var>firstAncestorSelect</var> be null.</p></li>
56208
+
56209
+ <li><p>Let <var>ancestor</var> be <var>selectedoption</var>'s <span>parent</span>.</p></li>
56210
+
56211
+ <li>
56212
+ <p><span>While</span> <var>firstAncestorSelect</var> is null and <var>ancestor</var> is not
56213
+ null:</p>
56214
+
56215
+ <ol>
56216
+ <li><p>If <var>ancestor</var> is a <code>select</code> element, then set
56217
+ <var>firstAncestorSelect</var> to <var>ancestor</var>.</p></li>
56218
+
56219
+ <li><p>Set <var>ancestor</var> to <var>ancestor</var>'s <span>parent</span>.</p></li>
56220
+ </ol>
56221
+ </li>
56222
+
56223
+ <li><p>If <var>firstAncestorSelect</var> is null, then return.</p></li>
56224
+
56225
+ <li><p><span data-x="list append">Append</span> <var>selectedoption</var> to
56226
+ <var>firstAncestorSelect</var>'s <span>select descendant selectedoption elements</span>.</p></li>
56227
+
56228
+ <li><p>Run <span>clone an option into a selectedoption</span> given the first <code>option</code>
56229
+ in <var>firstAncestorSelect</var>'s <span data-x="concept-select-option-list">list of
56230
+ options</span> whose <span data-x="concept-option-selectedness">selectedness</span> is true and
56231
+ <var>insertedNode</var>.</p></li>
56232
+ </ol>
56233
+
56234
+ <p>The <dfn>selectedoption removal steps</dfn>, given <var>selectedoption</var> and
56235
+ <var>oldParent</var>, are:</p>
56236
+
56237
+ <ol>
56238
+ <li>
56239
+ <p>For each <var>ancestor</var> of <var>selectedoption</var>'s <span
56240
+ data-x="ancestor">ancestors</span>:</p>
56241
+
56242
+ <ol>
56243
+ <li><p>If <var>ancestor</var> is a <code>select</code> element, then return.</p></li>
56244
+ </ol>
56245
+ </li>
56246
+
56247
+ <li>
56248
+ <p>For each <var>ancestor</var> of <var>oldParent</var>'s <span data-x="inclusive
56249
+ ancestor">inclusive ancestors</span>:</p>
56250
+
56251
+ <ol>
56252
+ <li>
56253
+ <p>If <var>ancestor</var> is a <code>select</code> element, then:</p>
56254
+
56255
+ <ol>
56256
+ <li><p><span data-x="list remove">remove</span> <var>selectedoption</var> from
56257
+ <var>ancestor</var>'s <span>select descendant selectedoption elements</span>.</p></li>
56258
+
56259
+ <li><p>Run <span>clone an option into a selectedoption</span> given null and
56260
+ <var>selectedoption</var>.</p></li>
56261
+
56262
+ <li><p>Return.</p></li>
56263
+ </ol>
56264
+ </li>
56265
+ </ol>
56266
+ </li>
56267
+ </ol>
56268
+
56269
+ <!-- TODO: call the thing during selectedness setting algorithm and mutationobserver. -->
56088
56270
56089
56271
56090
56272
<h4 split-filename="form-control-infrastructure">Form control infrastructure</h4>
0 commit comments