@@ -59187,8 +59187,88 @@ interface <dfn interface>HTMLDialogElement</dfn> : <span>HTMLElement</span> {
59187
59187
<dd w-dev>Uses <code>HTMLDialogElement</code>.</dd>
59188
59188
</dl>
59189
59189
59190
- <p>The <code>dialog</code> element represents a part of an application that a user interacts with
59191
- to perform a task, for example a dialog box, inspector, or window.</p>
59190
+ <p>The <code>dialog</code> element represents a transitory part of an application, in the form of
59191
+ a small window ("dialog box"), which the user interacts with to perform a task or gather
59192
+ information. Once the user is done, the dialog can be automatically closed by the application, or
59193
+ manually closed by the user.</p>
59194
+
59195
+ <p>Especially for modal dialogs, which are a familiar pattern across all types of applications,
59196
+ authors should work to ensure that dialogs in their web applications behave in a way that is
59197
+ familiar to users of non-web applications.</p>
59198
+
59199
+ <p class="note">As with all HTML elements, it is not conforming to use the <code>dialog</code>
59200
+ element when attempting to represent another type of control. For example, context menus,
59201
+ tooltips, and popup listboxes are not dialog boxes, so abusing the <code>dialog</code> element to
59202
+ implement these patterns is incorrect.</p>
59203
+
59204
+ <p>An important part of user-facing dialog behavior is the placement of initial focus. The
59205
+ <span>dialog focusing steps</span> attempt to pick a good candidate for initial focus when a
59206
+ dialog is shown, but might not be a substitute for authors carefully thinking through the correct
59207
+ choice to match user expectations for a specific dialog. As such, authors should use the <code
59208
+ data-x="attr-fe-autofocus">autofocus</code> attribute on the descendant element of the dialog that
59209
+ the user is expected to immediately interact with after the dialog opens. If there is no such
59210
+ element, then authors should use the <code data-x="attr-fe-autofocus">autofocus</code> attribute
59211
+ on the <code>dialog</code> element itself.</p>
59212
+
59213
+ <div class="example">
59214
+ <p>In the following example, a dialog is used for editing the details of a product in an
59215
+ inventory management web application.</p>
59216
+
59217
+ <pre><code class="html"><dialog>
59218
+ <label>Product Number <input type="text" readonly></label>
59219
+ <label>Product Name <input type="text" autofocus></label>
59220
+ </dialog></code></pre>
59221
+
59222
+ <p>If the <code data-x="attr-fe-autofocus">autofocus</code> attribute was not present, the
59223
+ Product Number field would have been focused by the dialog focusing steps. Although that is
59224
+ reasonable behavior, the author determined that the more relevant field to focus was the Product
59225
+ Name field, as the Product Number field is readonly and expects no user input. So, the author
59226
+ used autofocus to override the default.</p>
59227
+
59228
+ <p>Even if the author wants to focus the Product Number field by default, they are best off
59229
+ explicitly specifying that by using autofocus on that <code>input</code> element. This makes the
59230
+ intent obvious to future readers of the code, and ensures the code stays robust in the face of
59231
+ future updates. (For example, if another developer added a close button, and positioned it in the
59232
+ node tree before the Product Number field).</p>
59233
+ </div>
59234
+
59235
+ <p>Another important aspect of user behavior is whether dialogs are scrollable or not. In some
59236
+ cases, overflow (and thus scrollability) cannot be avoided, e.g., when it is caused by the user's
59237
+ high text zoom settings. But in general, scrollable dialogs are not expected by users. Adding
59238
+ large text nodes directly to dialog elements is particularly bad as this is likely to cause the
59239
+ dialog element itself to overflow. Authors are best off avoiding them.</p>
59240
+
59241
+ <div class="example">
59242
+ <p>The following terms of service dialog respects the above suggestions.</p>
59243
+
59244
+ <pre><code class="html"><dialog style="height: 80vh;">
59245
+ <div style="overflow: auto; height: 60vh;" autofocus>
59246
+ <p>By placing an order via this Web site on the first day of the fourth month of the year
59247
+ 2010 Anno Domini, you agree to grant Us a non-transferable option to claim, for now and for
59248
+ ever more, your immortal soul.</p>
59249
+ <p>Should We wish to exercise this option, you agree to surrender your immortal soul,
59250
+ and any claim you may have on it, within 5 (five) working days of receiving written
59251
+ notification from this site or one of its duly authorized minions.</p>
59252
+ <!-- ... etc., with many more <p> elements ... -->
59253
+ </div>
59254
+ <form method="dialog">
59255
+ <button type="submit" value="agree">Agree</button>
59256
+ <button type="submit" value="disagree">Disagree</button>
59257
+ </form>
59258
+ </dialog></code></pre>
59259
+
59260
+ <p>Note how the <span>dialog focusing steps</span> would have picked the scrollable
59261
+ <code>div</code> element by default, but similarly to the previous example, we have placed <code
59262
+ data-x="attr-fe-autofocus">autofocus</code> on the <code>div</code> so as to be more explicit and
59263
+ robust against future changes.</p>
59264
+
59265
+ <p>In contrast, if the <code>p</code> elements expressing the terms of service did not have such
59266
+ a wrapper <code>div</code> element, then the <code>dialog</code> itself would become scrollable,
59267
+ violating the above advice. Furthermore, in the absence of any <code
59268
+ data-x="attr-fe-autofocus">autofocus</code> attribute, such a markup pattern would have violated
59269
+ the above advice and tripped up the <span>dialog focusing steps</span>'s default behavior, and
59270
+ caused focus to jump to the Agree <code>button</code>, which is a bad user experience.</p>
59271
+ </div>
59192
59272
59193
59273
<p>The <dfn element-attr for="dialog"><code data-x="attr-dialog-open">open</code></dfn> attribute
59194
59274
is a <span>boolean attribute</span>. When specified, it indicates that the <code>dialog</code>
@@ -59276,7 +59356,8 @@ interface <dfn interface>HTMLDialogElement</dfn> : <span>HTMLElement</span> {
59276
59356
<li><p>Set the <code>dialog</code> element's <span>previously focused element</span> to the
59277
59357
<span>focused</span> element.</p></li>
59278
59358
59279
- <li><p>Run the <span>dialog focusing steps</span> for the <code>dialog</code> element.</p></li>
59359
+ <li><p>Run the <span>dialog focusing steps</span> given the <code>dialog</code> element and
59360
+ false.</p></li>
59280
59361
</ol>
59281
59362
59282
59363
<p>When the <dfn method for="HTMLDialogElement"><code
@@ -59318,22 +59399,32 @@ interface <dfn interface>HTMLDialogElement</dfn> : <span>HTMLElement</span> {
59318
59399
<li><p>Set the <var>subject</var>'s <span>previously focused element</span> to the
59319
59400
<span>focused</span> element.</p></li>
59320
59401
59321
- <li><p>Run the <span>dialog focusing steps</span> for <var>subject</var>.</p></li>
59402
+ <li><p>Run the <span>dialog focusing steps</span> given <var>subject</var> and true .</p></li>
59322
59403
</ol>
59323
59404
59324
- <p>The <dfn>dialog focusing steps</dfn> for a <code>dialog</code> element <var>subject</var> are as follows:</p>
59405
+ <p>The <dfn>dialog focusing steps</dfn>, given a <code>dialog</code> element <var>subject</var>
59406
+ and a boolean <var>isModal</var>, are as follows:</p>
59325
59407
59326
59408
<ol>
59327
- <li><p>Let <var>control</var> be the <span>focus delegate</span> of <var>subject</var>.</p></li>
59409
+ <li><p>Let <var>control</var> be null.</p></li>
59410
+
59411
+ <li><p>If <var>isModal</var> is true and <var>subject</var> has the <code
59412
+ data-x="attr-fe-autofocus">autofocus</code> attribute, then set <var>control</var> to
59413
+ <var>subject</var>.</p></li>
59414
+
59415
+ <li><p>If <var>control</var> is null, then set <var>control</var> to the <span>focus
59416
+ delegate</span> of <var>subject</var>.</p></li>
59328
59417
59329
59418
<li><p>If <var>control</var> is null, then set <var>control</var> to <var>subject</var>.</p></li>
59330
59419
59331
59420
<li>
59332
59421
<p>Run the <span>focusing steps</span> for <var>control</var>.</p>
59333
59422
59334
- <p class="note">If <var>control</var> is not <span>focusable</span>, this will do nothing. For
59335
- modal dialogs, this means that any <a href="#note-dialog-plus-focus-fixup">earlier
59336
- modifications</a> to the <span>focused area of the document</span> will apply.</p>
59423
+ <p class="note">If <var>control</var> is not <span>focusable</span>, this will do nothing. This
59424
+ would only happen if subject had no focus delegate, and the user agent decided that
59425
+ <code>dialog</code> elements were not generally focusable. In that case, any <a
59426
+ href="#note-dialog-plus-focus-fixup">earlier modifications</a> to the <span>focused area of the
59427
+ document</span> will apply.</p>
59337
59428
</li>
59338
59429
59339
59430
<li><p>Let <var>topDocument</var> be <var>control</var>'s <span>node navigable</span>'s <span
@@ -76245,9 +76336,9 @@ partial interface <span id="NavigatorUserActivation-partial">Navigator</span> {
76245
76336
The element itself.
76246
76337
<tr>
76247
76338
<td headers="td-fa-1 th-fa-examples" colspan=2>
76248
- <p class="example"><code>iframe</code>, <code data-x="attr-input-type-text"><input
76249
- type=text></code>, sometimes <code data-x="a"><a href=""></code> (depending on platform
76250
- conventions).
76339
+ <p class="example"><code>iframe</code>, <code>dialog</code>, <code
76340
+ data-x="attr-input- type-text"><input type =text></code>, sometimes <code data-x="a"><a
76341
+ href=""></code> (depending on platform conventions).
76251
76342
76252
76343
<tbody>
76253
76344
<tr>
@@ -76864,11 +76955,18 @@ partial interface <span id="NavigatorUserActivation-partial">Navigator</span> {
76864
76955
order</span>:</p>
76865
76956
76866
76957
<ol>
76867
- <li><p>If <var>descendant</var> is a <span>focusable area</span>, then return
76958
+ <li><p>Let <var>focusableArea</var> be null.</p></li>
76959
+
76960
+ <li><p>If <var>focusTarget</var> is a <code>dialog</code> element and <var>descendant</var> is
76961
+ <span>sequentially focusable</span>, then set <var>focusableArea</var> to
76962
+ <var>descendant</var>.</p></li>
76963
+
76964
+ <li><p>Otherwise, if <var>focusTarget</var> is not a <code>dialog</code> and
76965
+ <var>descendant</var> is a <span>focusable area</span>, set <var>focusableArea</var> to
76868
76966
<var>descendant</var>.</p></li>
76869
76967
76870
76968
<li>
76871
- <p>Let <var>focusableArea</var> be the result of <span data-x="get the focusable
76969
+ <p>Otherwise, set <var>focusableArea</var> to the result of <span data-x="get the focusable
76872
76970
area">getting the focusable area</span> for <var>descendant</var> given
76873
76971
<var>focusTrigger</var>.</p>
76874
76972
0 commit comments