@@ -10698,6 +10698,14 @@ partial interface <dfn id="document" data-lt="">Document</dfn> {
10698
10698
<p class="note">This is only populated for "<code data-x="">about:</code>"-schemed
10699
10699
<code>Document</code>s.</p>
10700
10700
10701
+ <p>Each <code>Document</code> has a <dfn data-x="concept-document-fire-mutation-events-flag">fire
10702
+ mutation events flag</dfn>, which is a boolean, initially true.</p>
10703
+
10704
+ <p class="note">This is intended to suppress firing of DOM Mutation Events in cases when they
10705
+ would normally fire. The specification describing mutation events is not actively maintained so
10706
+ it does not look at this flag, but implementations are expected to act as though it did.
10707
+ <ref>UIEVENTS</ref></p>
10708
+
10701
10709
<h4>The <code>DocumentOrShadowRoot</code> interface</h4>
10702
10710
10703
10711
<p><cite>DOM</cite> defines the <code data-x="DOM
@@ -59911,6 +59919,7 @@ dictionary <dfn dictionary>FormDataEventInit</dfn> : <span>EventInit</span> {
59911
59919
<dd>One <code>summary</code> element followed by <span>flow content</span>.</dd>
59912
59920
<dt><span data-x="concept-element-attributes">Content attributes</span>:</dt>
59913
59921
<dd><span>Global attributes</span></dd>
59922
+ <dd><code data-x="attr-details-name">name</code></dd>
59914
59923
<dd><code data-x="attr-details-open">open</code></dd>
59915
59924
<dt><span
59916
59925
data-x="concept-element-accessibility-considerations">Accessibility considerations</span>:</dt>
@@ -59922,6 +59931,7 @@ dictionary <dfn dictionary>FormDataEventInit</dfn> : <span>EventInit</span> {
59922
59931
interface <dfn interface>HTMLDetailsElement</dfn> : <span>HTMLElement</span> {
59923
59932
[<span>HTMLConstructor</span>] constructor();
59924
59933
59934
+ [<span>CEReactions</span>] attribute DOMString <span data-x="dom-details-name">name</span>;
59925
59935
[<span>CEReactions</span>] attribute boolean <span data-x="dom-details-open">open</span>;
59926
59936
};</code></pre>
59927
59937
</dd>
@@ -59942,6 +59952,31 @@ interface <dfn interface>HTMLDetailsElement</dfn> : <span>HTMLElement</span> {
59942
59952
<p>The rest of the element's contents <span>represents</span> the additional information or
59943
59953
controls.</p>
59944
59954
59955
+ <p>The <dfn element-attr for="details"><code data-x="attr-details-name">name</code></dfn> content
59956
+ attribute gives the name of the group of related <code>details</code> elements that the element is
59957
+ a member of. Opening one member of this group causes other members of the group to close. If the
59958
+ attribute is specified, its value must not be the empty string.</p>
59959
+
59960
+ <p>A document must not contain more than one <code>details</code> element in the same
59961
+ <span>details name group</span> that has the <code data-x="attr-details-open">open</code>
59962
+ attribute present. Authors must not use script to add <code>details</code> elements to a document
59963
+ in a way that would cause a <span>details name group</span> to have more than one
59964
+ <code>details</code> element with the <code data-x="attr-details-open">open</code> attribute
59965
+ present.</p>
59966
+
59967
+ <p class="note">The group of elements that is created by a common <code
59968
+ data-x="attr-details-name">name</code> attribute is exclusive, meaning that at most one of the
59969
+ <code>details</code> elements can be open at once. While this exclusivity is enforced by user
59970
+ agents, the resulting enforcement immediately changes the <code
59971
+ data-x="attr-details-open">open</code> attributes in the markup. This requirement on authors
59972
+ forbids such misleading markup.</p>
59973
+
59974
+ <p>Documents that use the <code data-x="attr-details-name">name</code> attribute to group multiple
59975
+ related <code>details</code> elements should keep those related elements together in a containing
59976
+ element (such as a <code>section</code> element).</p>
59977
+
59978
+ <p class="note">Keeping related elements together can be important for accessibility.</p>
59979
+
59945
59980
<p>The <dfn element-attr for="details"><code data-x="attr-details-open">open</code></dfn> content
59946
59981
attribute is a <span>boolean attribute</span>. If present, it indicates that both the summary and
59947
59982
the additional information is to be shown to the user. If the attribute is absent, only the
@@ -59968,25 +60003,68 @@ interface <dfn interface>HTMLDetailsElement</dfn> : <span>HTMLElement</span> {
59968
60003
exists, user agents can still provide this ability through some other user interface
59969
60004
affordance.</p>
59970
60005
60006
+ <p>The <dfn>details name group</dfn> that contains a <code>details</code> element <var>a</var>
60007
+ also contains all the other <code>details</code> elements <var>b</var> that fulfill all of the
60008
+ following conditions:</p>
60009
+
60010
+ <ul>
60011
+ <li>Both <var>a</var> and <var>b</var> are in the same <span>tree</span>.</li>
60012
+
60013
+ <li>They both have a <code data-x="attr-details-name">name</code> attribute, their <code
60014
+ data-x="attr-details-name">name</code> attributes are not the empty string, and the value of
60015
+ <var>a</var>'s <code data-x="attr-details-name">name</code> attribute equals the value of
60016
+ <var>b</var>'s <code data-x="attr-details-name">name</code> attribute.</li>
60017
+ </ul>
60018
+
59971
60019
<p>Every <code>details</code> element has a <dfn>details toggle task tracker</dfn>, which is a
59972
60020
<span>toggle task tracker</span> or null, initially null.</p>
59973
60021
59974
- <p>Whenever the <code data-x="attr-details-open">open</code> attribute is added to or removed from
59975
- a <code>details</code> element, the user agent must run the following steps, which are known as
59976
- the <dfn>details notification task steps</dfn>, for this <code>details</code> element:</p>
59977
-
59978
- <p class="note">When the <code data-x="attr-details-open">open</code> attribute is toggled several
59979
- times in succession, the resulting tasks essentially get coalesced so that only one event is
59980
- fired.</p>
60022
+ <p>The following <span data-x="concept-element-attributes-change-ext">attribute change
60023
+ steps</span>, given <var>element</var>, <var>localName</var>, <var>oldValue</var>,
60024
+ <var>value</var>, and <var>namespace</var>, are used for all <code>details</code> elements:</p>
59981
60025
59982
60026
<ol>
59983
- <li><p>If the <code data-x="attr-details-open">open</code> attribute is added, <span>queue a
59984
- details toggle event task</span> given the <code>details</code> element, "<code
59985
- data-x="">closed</code>", and "<code data-x="">open</code>".</p></li>
60027
+ <li><p>If <var>namespace</var> is not null, then return.</p></li>
60028
+
60029
+ <li><p>If <var>localName</var> is <code data-x="attr-details-name">name</code>, then <span>ensure
60030
+ details exclusivity by closing the given element if needed</span> given
60031
+ <var>element</var>.</p></li>
59986
60032
59987
- <li><p>Otherwise, <span>queue a details toggle event task</span> given the <code>details</code>
59988
- element, "<code data-x="">open</code>", and "<code data-x="">closed</code>".</p></li>
60033
+ <li><p>If <var>localName</var> is <code data-x="attr-details-open">open</code>, then:
60034
+ <ol>
60035
+ <li>
60036
+ <p>If one of <var>oldValue</var> or <var>value</var> is null and the other is not null,
60037
+ run the following steps, which are known as the <dfn>details notification task steps</dfn>, for
60038
+ this <code>details</code> element:</p>
59989
60039
60040
+ <p class="note">When the <code data-x="attr-details-open">open</code> attribute is toggled
60041
+ several times in succession, the resulting tasks essentially get coalesced so that only one
60042
+ event is fired.</p>
60043
+
60044
+ <ol>
60045
+ <li><p>If <var>oldValue</var> is null, <span>queue a details toggle event task</span> given
60046
+ the <code>details</code> element, "<code data-x="">closed</code>", and "<code
60047
+ data-x="">open</code>".</p></li>
60048
+
60049
+ <li><p>Otherwise, <span>queue a details toggle event task</span> given the
60050
+ <code>details</code> element, "<code data-x="">open</code>", and "<code
60051
+ data-x="">closed</code>".</p></li>
60052
+ </ol>
60053
+ </li>
60054
+
60055
+ <li><p>If <var>oldValue</var> is null and <var>value</var> is not null, then <span>ensure
60056
+ details exclusivity by closing other elements if needed</span> given
60057
+ <var>element</var>.</p></li>
60058
+ </ol>
60059
+ </li>
60060
+ </ol>
60061
+
60062
+ <p>The <code>details</code> <span data-x="html element insertion steps">HTML element insertion
60063
+ steps</span>, given <var>insertedNode</var>, are:</p>
60064
+
60065
+ <ol>
60066
+ <li><p><span>Ensure details exclusivity by closing the given element if needed</span> given
60067
+ <var>insertedNode</var>.</p></li>
59990
60068
</ol>
59991
60069
59992
60070
<p>To <dfn>queue a details toggle event task</dfn> given a <code>details</code> element
@@ -60028,9 +60106,105 @@ interface <dfn interface>HTMLDetailsElement</dfn> : <span>HTMLElement</span> {
60028
60106
to <var>oldState</var>.</p></li>
60029
60107
</ol>
60030
60108
60031
- <p>The <dfn attribute for="HTMLDetailsElement"><code data-x="dom-details-open">open</code></dfn>
60032
- IDL attribute must <span>reflect</span> the <code data-x="attr-details-open">open</code> content
60033
- attribute.</p>
60109
+ <p>To <dfn>ensure details exclusivity by closing other elements if needed</dfn> given a
60110
+ <code>details</code> element <var>element</var>:</p>
60111
+
60112
+ <ol>
60113
+ <li><p><span>Assert</span>: <var>element</var> has an <code
60114
+ data-x="attr-details-open">open</code> attribute.</p></li>
60115
+
60116
+ <!-- This step is an optimization, but it may also make things clearer. -->
60117
+ <li><p>If <var>element</var> does not have a <code data-x="attr-details-name">name</code>
60118
+ attribute, or its <code data-x="attr-details-name">name</code> attribute is the empty string,
60119
+ then return.</p></li>
60120
+
60121
+ <li><p>Let <var>document</var> be <var>element</var>'s <span>node document</span>.</p></li>
60122
+
60123
+ <li><p>Let <var>oldFlag</var> be the value of <var>document</var>'s <span
60124
+ data-x="concept-document-fire-mutation-events-flag">fire mutation events flag</span>.</p></li>
60125
+
60126
+ <li><p>Set <var>document</var>'s <span data-x="concept-document-fire-mutation-events-flag">fire
60127
+ mutation events flag</span> to false.</p></li>
60128
+
60129
+ <li><p>Let <var>groupMembers</var> be a list of elements, containing all elements in
60130
+ <var>element</var>'s <span>details name group</span> except for <var>element</var>, in <span>tree
60131
+ order</span>.</p></li>
60132
+
60133
+ <li>
60134
+ <p><span data-x="list iterate">For each</span> element <var>otherElement</var> of
60135
+ <var>groupMembers</var>:</p>
60136
+ <ol>
60137
+ <li>
60138
+ <p>If the <code data-x="attr-details-open">open</code> attribute is set on
60139
+ <var>otherElement</var>, then:</p>
60140
+
60141
+ <ol>
60142
+ <li><p><span>Assert</span>: <var>otherElement</var> is the only element in
60143
+ <var>groupMembers</var> that has the <code data-x="attr-details-open">open</code> attribute
60144
+ set.</p></li>
60145
+
60146
+ <li><p><span data-x="concept-element-attributes-remove">Remove</span> the <code
60147
+ data-x="attr-details-open">open</code> attribute on <var>otherElement</var>.</p></li>
60148
+
60149
+ <li><p><span>Break</span>.</p></li>
60150
+ </ol>
60151
+ </ol>
60152
+ </li>
60153
+
60154
+ <li><p>Set <var>document</var>'s <span data-x="concept-document-fire-mutation-events-flag">fire
60155
+ mutation events flag</span> to <var>oldFlag</var>.</p></li>
60156
+ </ol>
60157
+
60158
+ <p>To <dfn>ensure details exclusivity by closing the given element if needed</dfn> given a
60159
+ <code>details</code> element <var>element</var>:</p>
60160
+
60161
+ <ol>
60162
+ <li><p>If <var>element</var> does not have an <code data-x="attr-details-open">open</code>
60163
+ attribute, then return.</p></li>
60164
+
60165
+ <!-- This step is an optimization, but it may also make things clearer. -->
60166
+ <li><p>If <var>element</var> does not have a <code data-x="attr-details-name">name</code>
60167
+ attribute, or its <code data-x="attr-details-name">name</code> attribute is the empty string,
60168
+ then return.</p></li>
60169
+
60170
+ <li><p>Let <var>document</var> be <var>element</var>'s <span>node document</span>.</p></li>
60171
+
60172
+ <li><p>Let <var>oldFlag</var> be the value of <var>document</var>'s <span
60173
+ data-x="concept-document-fire-mutation-events-flag">fire mutation events flag</span>.</p></li>
60174
+
60175
+ <li><p>Set <var>document</var>'s <span data-x="concept-document-fire-mutation-events-flag">fire
60176
+ mutation events flag</span> to false.</p></li>
60177
+
60178
+ <li><p>Let <var>groupMembers</var> be a list of elements, containing all elements in
60179
+ <var>element</var>'s <span>details name group</span> except for <var>element</var>, in <span>tree
60180
+ order</span>.</p></li>
60181
+
60182
+ <li>
60183
+ <p><span data-x="list iterate">For each</span> element <var>otherElement</var> of
60184
+ <var>groupMembers</var>:</p>
60185
+
60186
+ <ol>
60187
+ <li>
60188
+ <p>If the <code data-x="attr-details-open">open</code> attribute is set on
60189
+ <var>otherElement</var>, then:</p>
60190
+
60191
+ <ol>
60192
+ <li><p><span data-x="concept-element-attributes-remove">Remove</span> the <code
60193
+ data-x="attr-details-open">open</code> attribute on <var>element</var>.</p></li>
60194
+
60195
+ <li><p><span>Break</span>.</p></li>
60196
+ </ol>
60197
+ </li>
60198
+ </ol>
60199
+ </li>
60200
+
60201
+ <li><p>Set <var>document</var>'s <span data-x="concept-document-fire-mutation-events-flag">fire
60202
+ mutation events flag</span> to <var>oldFlag</var>.</p></li>
60203
+ </ol>
60204
+
60205
+ <p>The <dfn attribute for="HTMLDetailsElement"><code data-x="dom-details-name">name</code></dfn>
60206
+ and <dfn attribute for="HTMLDetailsElement"><code data-x="dom-details-open">open</code></dfn>
60207
+ IDL attributes must <span>reflect</span> the respective content attributes of the same name.</p>
60034
60208
60035
60209
</div>
60036
60210
@@ -60107,6 +60281,62 @@ interface <dfn interface>HTMLDetailsElement</dfn> : <span>HTMLElement</span> {
60107
60281
60108
60282
</div>
60109
60283
60284
+ <div class="example" id="example-details-exclusive-accordion">
60285
+ <p>The following example shows the <code data-x="attr-details-name">name</code> attribute of the
60286
+ <code>details</code> element being used to create an exclusive accordion, a set of
60287
+ <code>details</code> elements where a user action to open one <code>details</code> element causes
60288
+ any open <code>details</code> to close.</p>
60289
+
60290
+ <pre><code class="html"><section class="characteristics">
60291
+ <details name="frame-characteristics">
60292
+ <summary>Material</summary>
60293
+ The picture frame is made of solid oak wood.
60294
+ </details>
60295
+ <details name="frame-characteristics">
60296
+ <summary>Size</summary>
60297
+ The picture frame fits a photo 40cm tall and 30cm wide.
60298
+ The frame is 45cm tall, 35cm wide, and 2cm thick.
60299
+ </details>
60300
+ <details name="frame-characteristics">
60301
+ <summary>Color</summary>
60302
+ The picture frame is available in its natural wood
60303
+ color, or with black stain.
60304
+ </details>
60305
+ </section></code></pre>
60306
+ </div>
60307
+
60308
+ <div class="example" id="example-details-exclusive-accordion-setting-open">
60309
+ <p>The following example shows what happens when the <code data-x="attr-details-open">open</code>
60310
+ attribute is set on a <code>details</code> element that is part of a set of elements using the
60311
+ <code data-x="attr-details-name">name</code> attribute to create an exclusive accordion.</p>
60312
+
60313
+ <p>Given the initial markup:</p>
60314
+
60315
+ <pre><code class="html"><section class="characteristics">
60316
+ <details name="frame-characteristics" id="d1" open>...</details>
60317
+ <details name="frame-characteristics" id="d2">...</details>
60318
+ <details name="frame-characteristics" id="d3">...</details>
60319
+ </section></code></pre>
60320
+
60321
+ <p>and the script:</p>
60322
+
60323
+ <pre><code class="js">document.getElementById("d2").setAttribute("open", "");</code></pre>
60324
+
60325
+ <p>then the resulting tree after the script executes will be equivalent to the markup:</p>
60326
+
60327
+ <pre><code class="html"><section class="characteristics">
60328
+ <details name="frame-characteristics" id="d1">...</details>
60329
+ <details name="frame-characteristics" id="d2" open>...</details>
60330
+ <details name="frame-characteristics" id="d3">...</details>
60331
+ </section></code></pre>
60332
+
60333
+ <p>because setting the <code data-x="attr-details-open">open</code> attribute on <code
60334
+ data-x="">d2</code> removes it from <code data-x="">d1</code>.</p>
60335
+
60336
+ <p>The same happens when the user activates the <code>summary</code> element inside of <code
60337
+ data-x="">d2</code>.</p>
60338
+ </div>
60339
+
60110
60340
<div class="example">
60111
60341
60112
60342
<p>Because the <code data-x="attr-details-open">open</code> attribute is added and removed
@@ -108878,8 +109108,17 @@ document.body.appendChild(frame)</code></pre>
108878
109108
<span>erase all event listeners and handlers</span> given <var>document</var>'s <span>relevant
108879
109109
global object</span>.</p></li>
108880
109110
109111
+ <li>Let <var>oldFlag</var> be the value of <var>document</var>'s <span
109112
+ data-x="concept-document-fire-mutation-events-flag">fire mutation events flag</span>.</li>
109113
+
109114
+ <li>Set <var>document</var>'s <span data-x="concept-document-fire-mutation-events-flag">fire
109115
+ mutation events flag</span> to false.</li>
109116
+
108881
109117
<li><p><span data-x="concept-node-replace-all">Replace all</span> with null within
108882
- <var>document</var>, without firing any mutation events.</p></li>
109118
+ <var>document</var>.</p></li>
109119
+
109120
+ <li>Set <var>document</var>'s <span data-x="concept-document-fire-mutation-events-flag">fire
109121
+ mutation events flag</span> to <var>oldFlag</var>.</li>
108883
109122
108884
109123
<li>
108885
109124
<p>If <var>document</var> is <span>fully active</span>, then:</p>
@@ -134246,6 +134485,7 @@ interface <dfn interface>External</dfn> {
134246
134485
<td><code>summary</code>*;
134247
134486
<span data-x="Flow content">flow</span></td>
134248
134487
<td><span data-x="global attributes">globals</span>;
134488
+ <code data-x="attr-details-name">name</code>;
134249
134489
<code data-x="attr-details-open">open</code></td>
134250
134490
<td><code>HTMLDetailsElement</code></td>
134251
134491
</tr>
@@ -136517,6 +136757,11 @@ interface <dfn interface>External</dfn> {
136517
136757
<span data-x="attr-fe-name">form-associated custom elements</span>
136518
136758
<td> Name of the element to use for <span>form submission</span> and in the <code data-x="dom-form-elements">form.elements</code> API <!--or: Name of the element to use in the <code data-x="dom-form-elements">form.elements</code> API. -->
136519
136759
<td> <a href="#attribute-text">Text</a>*
136760
+ <tr>
136761
+ <th> <code data-x="">name</code>
136762
+ <td> <code data-x="attr-details-name">details</code>
136763
+ <td> Name of group of mutually-exclusive <code>details</code> elements
136764
+ <td> <a href="#attribute-text">Text</a>*
136520
136765
<tr>
136521
136766
<th> <code data-x="">name</code>
136522
136767
<td> <code data-x="attr-form-name">form</code>
0 commit comments