Living
Standard
—
Last
Updated
11
December
2025
6
January
2026
details
element
summary
element
a
element
to
define
a
command
button
element
to
define
a
command
input
element
to
define
a
command
option
element
to
define
a
command
accesskey
attribute
on
a
legend
element
to
define
a
command
accesskey
attribute
to
define
a
command
on
other
elements
dialog
element
menubar
element
menulist
element
menuitem
element
details
element
Support in all current engines.
Support in all current engines.
Support in all current engines.
summary
element
followed
by
flow
content
.
name
open
[Exposed=Window]
interface HTMLDetailsElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions, Reflect] attribute DOMString name;
[CEReactions, Reflect] attribute boolean open;
};
The
details
element
represents
a
disclosure
widget
from
which
the
user
can
obtain
additional
information
or
controls.
As
with
all
HTML
elements,
it
is
not
conforming
to
use
the
details
element
when
attempting
to
represent
another
type
of
control.
For
example,
tab
widgets
and
menu
widgets
are
not
disclosure
widgets,
so
abusing
the
details
element
to
implement
these
patterns
is
incorrect.
The
details
element
is
not
appropriate
for
footnotes.
Please
see
the
section
on
footnotes
for
details
on
how
to
mark
up
footnotes.
The
first
summary
element
child
of
the
element,
if
any,
represents
the
summary
or
legend
of
the
details.
If
there
is
no
child
summary
element,
the
user
agent
should
provide
its
own
legend
(e.g.
"Details").
The rest of the element's contents represents the additional information or controls.
The
name
content
attribute
gives
the
name
of
the
group
of
related
details
elements
that
the
element
is
a
member
of.
Opening
one
member
of
this
group
causes
other
members
of
the
group
to
close.
If
the
attribute
is
specified,
its
value
must
not
be
the
empty
string.
Before
using
this
feature,
authors
should
consider
whether
this
grouping
of
related
details
elements
into
an
exclusive
accordion
is
helpful
or
harmful
to
users.
While
using
an
exclusive
accordion
can
reduce
the
maximum
amount
of
space
that
a
set
of
content
can
occupy,
it
can
also
frustrate
users
who
have
to
open
many
items
to
find
what
they
want
or
users
who
want
to
look
at
the
contents
of
multiple
items
at
the
same
time.
A
document
must
not
contain
more
than
one
details
element
in
the
same
details
name
group
that
has
the
open
attribute
present.
Authors
must
not
use
script
to
add
details
elements
to
a
document
in
a
way
that
would
cause
a
details
name
group
to
have
more
than
one
details
element
with
the
open
attribute
present.
The
group
of
elements
that
is
created
by
a
common
name
attribute
is
exclusive,
meaning
that
at
most
one
of
the
details
elements
can
be
open
at
once.
While
this
exclusivity
is
enforced
by
user
agents,
the
resulting
enforcement
immediately
changes
the
open
attributes
in
the
markup.
This
requirement
on
authors
forbids
such
misleading
markup.
A
document
must
not
contain
a
details
element
that
is
a
descendant
of
another
details
element
in
the
same
details
name
group
.
Documents
that
use
the
name
attribute
to
group
multiple
related
details
elements
should
keep
those
related
elements
together
in
a
containing
element
(such
as
a
section
element
or
article
element).
When
it
makes
sense
for
the
group
to
be
introduced
with
a
heading,
authors
should
put
that
heading
in
a
heading
element
at
the
start
of
the
containing
element.
Visually and programmatically grouping related elements together can be important for accessible user experiences. This can help users understand the relationship between such elements. When related elements are in disparate sections of a web page rather than being grouped, the elements' relationships to each other can be less discoverable or understandable.
The
open
content
attribute
is
a
boolean
attribute
.
If
present,
it
indicates
that
both
the
summary
and
the
additional
information
is
to
be
shown
to
the
user.
If
the
attribute
is
absent,
only
the
summary
is
to
be
shown.
When the element is created, if the attribute is absent, the additional information should be hidden; if the attribute is present, that information should be shown. Subsequently, if the attribute is removed, then the information should be hidden; if the attribute is added, the information should be shown.
The
user
agent
should
allow
the
user
to
request
that
the
additional
information
be
shown
or
hidden.
To
honor
a
request
for
the
details
to
be
shown,
the
user
agent
must
set
the
open
attribute
on
the
element
to
the
empty
string.
To
honor
a
request
for
the
information
to
be
hidden,
the
user
agent
must
remove
the
open
attribute
from
the
element.
This
ability
to
request
that
additional
information
be
shown
or
hidden
may
simply
be
the
activation
behavior
of
the
appropriate
summary
element,
in
the
case
such
an
element
exists.
However,
if
no
such
element
exists,
user
agents
can
still
provide
this
ability
through
some
other
user
interface
affordance.
The
details
name
group
that
contains
a
details
element
a
also
contains
all
the
other
details
elements
b
that
fulfill
all
of
the
following
conditions:
Every
details
element
has
a
details
toggle
task
tracker
,
which
is
a
toggle
task
tracker
or
null,
initially
null.
The
following
attribute
change
steps
,
given
element
,
localName
,
oldValue
,
value
,
and
namespace
,
are
used
for
all
details
elements:
If namespace is not null, then return.
If
localName
is
name
,
then
ensure
details
exclusivity
by
closing
the
given
element
if
needed
given
element
.
If
localName
is
open
,
then:
If
one
of
oldValue
or
value
is
null
and
the
other
is
not
null,
run
the
following
steps,
which
are
known
as
the
details
notification
task
steps
,
for
this
details
element:
When
the
open
attribute
is
toggled
several
times
in
succession,
the
resulting
tasks
essentially
get
coalesced
so
that
only
one
event
is
fired.
If
oldValue
is
null,
queue
a
details
toggle
event
task
given
the
details
element,
"
closed
",
and
"
open
".
Otherwise,
queue
a
details
toggle
event
task
given
the
details
element,
"
open
",
and
"
closed
".
If oldValue is null and value is not null, then ensure details exclusivity by closing other elements if needed given element .
The
details
HTML
element
insertion
steps
,
given
insertedNode
,
are:
Ensure details exclusivity by closing the given element if needed given insertedNode .
To be clear, these attribute change and insertion steps also run when an attribute or element is inserted via the parser.
To
queue
a
details
toggle
event
task
given
a
details
element
element
,
a
string
oldState
,
and
a
string
newState
:
If element 's details toggle task tracker is not null, then:
Set oldState to element 's details toggle task tracker 's old state .
Remove element 's details toggle task tracker 's task from its task queue .
Set element 's details toggle task tracker to null.
Queue an element task given the DOM manipulation task source and element to run the following steps:
Fire
an
event
named
toggle
at
element
,
using
ToggleEvent
,
with
the
oldState
attribute
initialized
to
oldState
and
the
newState
attribute
initialized
to
newState
.
Set element 's details toggle task tracker to null.
Set element 's details toggle task tracker to a struct with task set to the just-queued task and old state set to oldState .
To
ensure
details
exclusivity
by
closing
other
elements
if
needed
given
a
details
element
element
:
If
element
does
not
have
a
name
attribute,
or
its
name
attribute
is
the
empty
string,
then
return.
Let groupMembers be a list of elements, containing all elements in element 's details name group except for element , in tree order .
For each element otherElement of groupMembers :
To
ensure
details
exclusivity
by
closing
the
given
element
if
needed
given
a
details
element
element
:
If
element
does
not
have
an
open
attribute,
then
return.
If
element
does
not
have
a
name
attribute,
or
its
name
attribute
is
the
empty
string,
then
return.
Let groupMembers be a list of elements, containing all elements in element 's details name group except for element , in tree order .
For each element otherElement of groupMembers :
The
following
example
shows
the
details
element
being
used
to
hide
technical
details
in
a
progress
report.
<section class="progress window">
<h1>Copying "Really Achieving Your Childhood Dreams"</h1>
<details>
<summary>Copying... <progress max="375505392" value="97543282"></progress> 25%</summary>
<dl>
<dt>Transfer rate:</dt> <dd>452KB/s</dd>
<dt>Local filename:</dt> <dd>/home/rpausch/raycd.m4v</dd>
<dt>Remote filename:</dt> <dd>/var/www/lectures/raycd.m4v</dd>
<dt>Duration:</dt> <dd>01:16:27</dd>
<dt>Color profile:</dt> <dd>SD (6-1-6)</dd>
<dt>Dimensions:</dt> <dd>320×240</dd>
</dl>
</details>
</section>
The
following
shows
how
a
details
element
can
be
used
to
hide
some
controls
by
default:
<details>
<summary><label for=fn>Name & Extension:</label></summary>
<p><input type=text id=fn name=fn value="Pillar Magazine.pdf">
<p><label><input type=checkbox name=ext checked> Hide extension</label>
</details>
One
could
use
this
in
conjunction
with
other
details
in
a
list
to
allow
the
user
to
collapse
a
set
of
fields
down
to
a
small
set
of
headings,
with
the
ability
to
open
each
one.
In these examples, the summary really just summarizes what the controls can change, and not the actual values, which is less than ideal.
The
following
example
shows
the
name
attribute
of
the
details
element
being
used
to
create
an
exclusive
accordion,
a
set
of
details
elements
where
a
user
action
to
open
one
details
element
causes
any
open
details
to
close.
<section class="characteristics">
<details name="frame-characteristics">
<summary>Material</summary>
The picture frame is made of solid oak wood.
</details>
<details name="frame-characteristics">
<summary>Size</summary>
The picture frame fits a photo 40cm tall and 30cm wide.
The frame is 45cm tall, 35cm wide, and 2cm thick.
</details>
<details name="frame-characteristics">
<summary>Color</summary>
The picture frame is available in its natural wood
color, or with black stain.
</details>
</section>
The
following
example
shows
what
happens
when
the
open
attribute
is
set
on
a
details
element
that
is
part
of
a
set
of
elements
using
the
name
attribute
to
create
an
exclusive
accordion.
Given the initial markup:
<section class="characteristics">
<details name="frame-characteristics" id="d1" open>...</details>
<details name="frame-characteristics" id="d2">...</details>
<details name="frame-characteristics" id="d3">...</details>
</section>
and the script:
document.getElementById("d2").setAttribute("open",
"");
then the resulting tree after the script executes will be equivalent to the markup:
<section class="characteristics">
<details name="frame-characteristics" id="d1">...</details>
<details name="frame-characteristics" id="d2" open>...</details>
<details name="frame-characteristics" id="d3">...</details>
</section>
because
setting
the
open
attribute
on
d2
removes
it
from
d1
.
The
same
happens
when
the
user
activates
the
summary
element
inside
of
d2
.
Because
the
open
attribute
is
added
and
removed
automatically
as
the
user
interacts
with
the
control,
it
can
be
used
in
CSS
to
style
the
element
differently
based
on
its
state.
Here,
a
style
sheet
is
used
to
animate
the
color
of
the
summary
when
the
element
is
opened
or
closed:
<style>
details > summary { transition: color 1s; color: black; }
details[open] > summary { color: red; }
</style>
<details>
<summary>Automated Status: Operational</summary>
<p>Velocity: 12m/s</p>
<p>Direction: North</p>
</details>
summary
element
Support in all current engines.
details
element.
HTMLElement
.
The
summary
element
represents
a
summary,
caption,
or
legend
for
the
rest
of
the
contents
of
the
summary
element's
parent
details
element,
if
any.
A
summary
element
is
a
summary
for
its
parent
details
if
the
following
algorithm
returns
true:
The
activation
behavior
of
summary
elements
is
to
run
the
following
steps:
If
this
summary
element
is
not
the
summary
for
its
parent
details
,
then
return.
Let
parent
be
this
summary
element's
parent.
If
the
open
attribute
is
present
on
parent
,
then
remove
it.
Otherwise,
set
parent
's
open
attribute
to
the
empty
string.
This will then run the details notification task steps .
A command is the abstraction behind menu items, buttons, and links. Once a command is defined, other parts of the interface can refer to the same command, allowing many access points to a single feature to share facets such as the Disabled State .
Commands are defined to have the following facets :
User agents may expose the commands that match the following criteria:
The facet is false (visible)
The element is in a document with a non-null browsing context .
Neither the element nor any of its ancestors has a attribute specified.
User agents are encouraged to do this especially for commands that have Access Keys , as a way to advertise those keys to the user.
For example, such commands could be listed in the user agent's menu bar.
a
element
to
define
a
command
An
a
element
with
an
href
attribute
defines
a
command
.
The Label of the command is the element's descendant text content .
The Access Key of the command is the element's assigned access key , if any.
The of the command is true (hidden) if the element has a attribute, and false otherwise.
The Disabled State facet of the command is true if the element or one of its ancestors is inert , and false otherwise.
The
Action
of
the
command
is
to
fire
a
click
event
at
the
element.
button
element
to
define
a
command
A
button
element
always
defines
a
command
.
The
Label
,
Access
Key
,
,
and
Action
facets
of
the
command
are
determined
as
for
a
elements
(see
the
previous
section).
The Disabled State of the command is true if the element or one of its ancestors is inert , or if the element's disabled state is set, and false otherwise.
input
element
to
define
a
command
An
input
element
whose
type
attribute
is
in
one
of
the
Submit
Button
,
Reset
Button
,
Image
Button
,
Button
,
Radio
Button
,
or
Checkbox
states
defines
a
command
.
The Label of the command is determined as follows:
If
the
type
attribute
is
in
one
of
the
Submit
Button
,
Reset
Button
,
Image
Button
,
or
Button
states,
then
the
Label
is
the
string
given
by
the
value
attribute,
if
any,
and
a
UA-dependent,
locale-dependent
value
that
the
UA
uses
to
label
the
button
itself
if
the
attribute
is
absent.
Otherwise,
if
the
element
is
a
labeled
control
,
then
the
Label
is
the
descendant
text
content
of
the
first
label
element
in
tree
order
whose
labeled
control
is
the
element
in
question.
(In
JavaScript
terms,
this
is
given
by
element.labels[0].textContent
.)
Otherwise,
if
the
value
attribute
is
present,
then
the
Label
is
the
value
of
that
attribute.
Otherwise, the Label is the empty string.
Even
though
the
value
attribute
on
input
elements
in
the
Image
Button
state
is
non-conformant,
the
attribute
can
still
contribute
to
the
Label
determination,
if
it
is
present
and
the
Image
Button's
alt
attribute
is
missing.
The Access Key of the command is the element's assigned access key , if any.
The of the command is true (hidden) if the element has a attribute, and false otherwise.
The Disabled State of the command is true if the element or one of its ancestors is inert , or if the element's disabled state is set, and false otherwise.
The
Action
of
the
command
is
to
fire
a
click
event
at
the
element.
option
element
to
define
a
command
An
option
element
with
an
ancestor
select
element
and
either
no
value
attribute
or
a
value
attribute
that
is
not
the
empty
string
defines
a
command
.
The
Label
of
the
command
is
the
value
of
the
option
element's
label
attribute,
if
there
is
one,
or
else
the
option
element's
descendant
text
content
,
with
ASCII
whitespace
stripped
and
collapsed
.
The Access Key of the command is the element's assigned access key , if any.
The of the command is true (hidden) if the element has a attribute, and false otherwise.
The
Disabled
State
of
the
command
is
true
if
the
element
is
disabled
,
or
if
its
nearest
ancestor
select
element
is
disabled
,
or
if
it
or
one
of
its
ancestors
is
inert
,
and
false
otherwise.
If
the
option
's
nearest
ancestor
select
element
has
a
multiple
attribute,
the
Action
of
the
command
is
to
toggle
the
option
element.
Otherwise,
the
Action
is
to
pick
the
option
element.
accesskey
attribute
on
a
legend
element
to
define
a
command
A
legend
element
defines
a
command
if
all
of
the
following
are
true:
It has an assigned access key .
It
is
a
child
of
a
fieldset
element.
Its
parent
has
a
descendant
that
defines
a
command
that
is
neither
a
label
element
nor
a
legend
element.
This
element,
if
it
exists,
is
the
legend
element's
accesskey
delegatee
.
The Label of the command is the element's descendant text content .
The Access Key of the command is the element's assigned access key .
The
,
Disabled
State
,
and
Action
facets
of
the
command
are
the
same
as
the
respective
facets
of
the
legend
element's
accesskey
delegatee
.
In
this
example,
the
legend
element
specifies
an
accesskey
,
which,
when
activated,
will
delegate
to
the
input
element
inside
the
legend
element.
<fieldset>
<legend accesskey=p>
<label>I want <input name=pizza type=number step=1 value=1 min=0>
pizza(s) with these toppings</label>
</legend>
<label><input name=pizza-cheese type=checkbox checked> Cheese</label>
<label><input name=pizza-ham type=checkbox checked> Ham</label>
<label><input name=pizza-pineapple type=checkbox> Pineapple</label>
</fieldset>
accesskey
attribute
to
define
a
command
on
other
elements
An element that has an assigned access key defines a command .
If one of the earlier sections that define elements that define commands define that this element defines a command , then that section applies to this element, and this section does not. Otherwise, this section applies to that element.
The
Label
of
the
command
depends
on
the
element.
If
the
element
is
a
labeled
control
,
the
descendant
text
content
of
the
first
label
element
in
tree
order
whose
labeled
control
is
the
element
in
question
is
the
Label
(in
JavaScript
terms,
this
is
given
by
element.labels[0].textContent
).
Otherwise,
the
Label
is
the
element's
descendant
text
content
.
The Access Key of the command is the element's assigned access key .
The of the command is true (hidden) if the element has a attribute, and false otherwise.
The Disabled State of the command is true if the element or one of its ancestors is inert , and false otherwise.
The Action of the command is to run the following steps:
click
event
at
the
element.
dialog
element
Support in all current engines.
Support in all current engines.
Support in all current engines.
closedby
open
[Exposed=Window]
interface HTMLDialogElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions, Reflect] attribute boolean open;
attribute DOMString returnValue;
[CEReactions, ReflectSetter] attribute DOMString closedBy;
[CEReactions] undefined show();
[CEReactions] undefined showModal();
[CEReactions] undefined close(optional DOMString returnValue);
[CEReactions] undefined requestClose(optional DOMString returnValue);
};
The
dialog
element
represents
a
transitory
part
of
an
application,
in
the
form
of
a
small
window
("dialog
box"),
which
the
user
interacts
with
to
perform
a
task
or
gather
information.
Once
the
user
is
done,
the
dialog
can
be
automatically
closed
by
the
application,
or
manually
closed
by
the
user.
Especially for modal dialogs, which are a familiar pattern across all types of applications, authors should work to ensure that dialogs in their web applications behave in a way that is familiar to users of non-web applications.
As
with
all
HTML
elements,
it
is
not
conforming
to
use
the
dialog
element
when
attempting
to
represent
another
type
of
control.
For
example,
context
menus,
tooltips,
and
popup
listboxes
are
not
dialog
boxes,
so
abusing
the
dialog
element
to
implement
these
patterns
is
incorrect.
An
important
part
of
user-facing
dialog
behavior
is
the
placement
of
initial
focus.
The
dialog
focusing
steps
attempt
to
pick
a
good
candidate
for
initial
focus
when
a
dialog
is
shown,
but
might
not
be
a
substitute
for
authors
carefully
thinking
through
the
correct
choice
to
match
user
expectations
for
a
specific
dialog.
As
such,
authors
should
use
the
autofocus
attribute
on
the
descendant
element
of
the
dialog
that
the
user
is
expected
to
immediately
interact
with
after
the
dialog
opens.
If
there
is
no
such
element,
then
authors
should
use
the
autofocus
attribute
on
the
dialog
element
itself.
In the following example, a dialog is used for editing the details of a product in an inventory management web application.
<dialog>
<label>Product Number <input type="text" readonly></label>
<label>Product Name <input type="text" autofocus></label>
</dialog>
If
the
autofocus
attribute
was
not
present,
the
Product
Number
field
would
have
been
focused
by
the
dialog
focusing
steps.
Although
that
is
reasonable
behavior,
the
author
determined
that
the
more
relevant
field
to
focus
was
the
Product
Name
field,
as
the
Product
Number
field
is
readonly
and
expects
no
user
input.
So,
the
author
used
autofocus
to
override
the
default.
Even
if
the
author
wants
to
focus
the
Product
Number
field
by
default,
they
are
best
off
explicitly
specifying
that
by
using
autofocus
on
that
input
element.
This
makes
the
intent
obvious
to
future
readers
of
the
code,
and
ensures
the
code
stays
robust
in
the
face
of
future
updates.
(For
example,
if
another
developer
added
a
close
button,
and
positioned
it
in
the
node
tree
before
the
Product
Number
field).
Another important aspect of user behavior is whether dialogs are scrollable or not. In some cases, overflow (and thus scrollability) cannot be avoided, e.g., when it is caused by the user's high text zoom settings. But in general, scrollable dialogs are not expected by users. Adding large text nodes directly to dialog elements is particularly bad as this is likely to cause the dialog element itself to overflow. Authors are best off avoiding them.
The following terms of service dialog respects the above suggestions.
<dialog style="height: 80vh;">
<div style="overflow: auto; height: 60vh;" autofocus>
<p>By placing an order via this Web site on the first day of the fourth month of the year
2010 Anno Domini, you agree to grant Us a non-transferable option to claim, for now and for
ever more, your immortal soul.</p>
<p>Should We wish to exercise this option, you agree to surrender your immortal soul,
and any claim you may have on it, within 5 (five) working days of receiving written
notification from this site or one of its duly authorized minions.</p>
<!-- ... etc., with many more <p> elements ... -->
</div>
<form method="dialog">
<button type="submit" value="agree">Agree</button>
<button type="submit" value="disagree">Disagree</button>
</form>
</dialog>
Note
how
the
dialog
focusing
steps
would
have
picked
the
scrollable
div
element
by
default,
but
similarly
to
the
previous
example,
we
have
placed
autofocus
on
the
div
so
as
to
be
more
explicit
and
robust
against
future
changes.
In
contrast,
if
the
p
elements
expressing
the
terms
of
service
did
not
have
such
a
wrapper
div
element,
then
the
dialog
itself
would
become
scrollable,
violating
the
above
advice.
Furthermore,
in
the
absence
of
any
autofocus
attribute,
such
a
markup
pattern
would
have
violated
the
above
advice
and
tripped
up
the
dialog
focusing
steps
's
default
behavior,
and
caused
focus
to
jump
to
the
Agree
button
,
which
is
a
bad
user
experience.
This
dialog
box
has
some
small
print.
The
strong
element
is
used
to
draw
the
user's
attention
to
the
more
important
part.
<dialog>
<h1>Add to Wallet</h1>
<p><strong><label for=amt>How many gold coins do you want to add to your wallet?</label></strong></p>
<p><input id=amt name=amt type=number min=0 step=0.01 value=100></p>
<p><small>You add coins at your own risk.</small></p>
<p><label><input name=round type=checkbox> Only add perfectly round coins</label></p>
<p><input type=button onclick="submit()" value="Add Coins"></p>
</dialog>
The
open
attribute
is
a
boolean
attribute
.
When
specified,
it
indicates
that
the
dialog
element
is
active
and
that
the
user
can
interact
with
it.
The
closedby
content
attribute
is
an
enumerated
attribute
with
the
following
keywords
and
states:
| Keyword | State | Brief description |
|---|---|---|
any
| Any | Close requests or clicks outside close the dialog. |
closerequest
| Close Request | Close requests close the dialog. |
none
| None | No user actions automatically close the dialog. |
The
closedby
attribute's
invalid
value
default
and
missing
value
default
are
both
the
Auto
state.
The
Auto
state
behaves
as
Close
Request
state
when
the
dialog
was
shown
using
its
showModal()
method;
otherwise
the
None
state.
A
dialog
element
without
an
open
attribute
specified
should
not
be
shown
to
the
user.
This
requirement
may
be
implemented
indirectly
through
the
style
layer.
For
example,
user
agents
that
support
the
suggested
default
rendering
implement
this
requirement
using
the
CSS
rules
described
in
the
Rendering
section
.
Removing
the
open
attribute
will
usually
hide
the
dialog.
However,
doing
so
has
a
number
of
strange
additional
consequences:
The
close
event
will
not
be
fired.
The
close()
method,
and
any
close
requests
,
will
no
longer
be
able
to
close
the
dialog.
If
the
dialog
was
shown
using
its
showModal()
method,
the
Document
will
still
be
blocked
.
For
these
reasons,
it
is
generally
better
to
never
remove
the
open
attribute
manually.
Instead,
use
the
requestClose()
or
close()
methods
to
close
the
dialog,
or
the
attribute
to
hide
it.
The
tabindex
attribute
must
not
be
specified
on
dialog
elements.
dialog
.
show
()
Support in all current engines.
Displays
the
dialog
element.
dialog
.
showModal
()
Support in all current engines.
Displays
the
dialog
element
and
makes
it
the
top-most
modal
dialog.
This
method
honors
the
autofocus
attribute.
dialog
.
close
([
result
])
Support in all current engines.
Closes
the
dialog
element.
The argument, if provided, provides a return value.
dialog
.
requestClose
([
result
])
Acts
as
if
a
close
request
was
sent
targeting
dialog
,
by
first
firing
a
cancel
event,
and
if
that
event
is
not
canceled
with
preventDefault()
,
proceeding
to
close
the
dialog
in
the
same
way
as
the
close()
method
(including
firing
a
close
event).
This
is
a
helper
utility
that
can
be
used
to
consolidate
cancelation
and
closing
logic
into
the
cancel
and
close
event
handlers,
by
having
all
non-
close
request
closing
affordances
call
this
method.
Note
that
this
method
ignores
the
closedby
attribute:
that
is,
even
if
closedby
is
set
to
"
none
",
the
same
behavior
will
apply.
The argument, if provided, provides a return value.
dialog
.
returnValue
[
=
result
]
Support in all current engines.
Returns
the
dialog
's
return
value.
Can be set, to update the return value.
The
show()
method
steps
are:
If
this
has
an
open
attribute
and
is
modal
of
this
is
false,
then
return.
If
this
has
an
open
attribute,
then
throw
an
"
InvalidStateError
"
DOMException
.
If
the
result
of
firing
an
event
named
beforetoggle
,
using
ToggleEvent
,
with
the
cancelable
attribute
initialized
to
true,
the
oldState
attribute
initialized
to
"
closed
",
and
the
newState
attribute
initialized
to
"
open
"
at
this
is
false,
then
return.
Queue
a
dialog
toggle
event
task
given
this
,
"
closed
",
"
open
",
and
null.
Add
an
open
attribute
to
this
,
whose
value
is
the
empty
string.
Set this 's previously focused element to the focused element.
Let document be this 's node document .
Let hideUntil be the result of running topmost popover ancestor given this , document 's showing hint popover list , null, and false.
If hideUntil is null, then set hideUntil to the result of running topmost popover ancestor given this , document 's showing auto popover list , null, and false.
If hideUntil is null, then set hideUntil to document .
Run hide all popovers until given hideUntil , false, and true.
Run the dialog focusing steps given this .
The
showModal()
method
steps
are
to
show
a
modal
dialog
given
this
and
null.
The
close(
returnValue
)
method
steps
are:
If returnValue is not given, then set it to null.
Close the dialog this with returnValue and null.
The
requestClose(
returnValue
)
method
steps
are:
If returnValue is not given, then set it to null.
Request to close the dialog this with returnValue and null.
We
use
show/close
as
the
verbs
for
dialog
elements,
as
opposed
to
verb
pairs
that
are
more
commonly
thought
of
as
antonyms
such
as
show/hide
or
open/close,
due
to
the
following
constraints:
Hiding
a
dialog
is
different
from
closing
one.
Closing
a
dialog
gives
it
a
return
value,
fires
an
event,
unblocks
the
page
for
other
dialogs,
and
so
on.
Whereas
hiding
a
dialog
is
a
purely
visual
property,
and
is
something
you
can
already
do
with
the
attribute
or
by
removing
the
open
attribute.
(See
also
the
note
above
about
removing
the
open
attribute,
and
how
hiding
the
dialog
in
that
way
is
generally
not
desired.)
Showing
a
dialog
is
different
from
opening
one.
Opening
a
dialog
consists
of
creating
and
showing
that
dialog
(similar
to
how
window.open()
both
creates
and
shows
a
new
window).
Whereas
showing
the
dialog
is
the
process
of
taking
a
dialog
element
that
is
already
in
the
DOM,
and
making
it
interactive
and
visible
to
the
user.
If
we
were
to
have
a
dialog.open()
method
despite
the
above,
it
would
conflict
with
the
dialog.open
property.
Furthermore,
a
survey
of
many
other
UI
frameworks
contemporary
to
the
original
design
of
the
dialog
element
made
it
clear
that
the
show/close
verb
pair
was
reasonably
common.
In summary, it turns out that the implications of certain verbs, and how they are used in technology contexts, mean that paired actions such as showing and closing a dialog are not always expressible as antonyms.
The
returnValue
IDL
attribute,
on
getting,
must
return
the
last
value
to
which
it
was
set.
On
setting,
it
must
be
set
to
the
new
value.
When
the
element
is
created,
it
must
be
set
to
the
empty
string.
The
closedBy
getter
steps
are
to
return
the
keyword
corresponding
to
the
computed
closed-by
state
given
this
.
Each
Document
has
a
dialog
pointerdown
target
,
which
is
an
HTML
dialog
element
or
null,
initially
null.
Each
HTML
element
has
a
previously
focused
element
which
is
null
or
an
element,
and
it
is
initially
null.
When
showModal()
and
show()
are
called,
this
element
is
set
to
the
currently
focused
element
before
running
the
dialog
focusing
steps
.
Elements
with
the
whose
popover
state
is
not
popover
state
attribute
set
this
element
to
the
currently
focused
element
during
the
show
popover
algorithm
.
Each
dialog
element
has
a
dialog
toggle
task
tracker
,
which
is
a
toggle
task
tracker
or
null,
initially
null.
Each
dialog
element
has
a
close
watcher
,
which
is
a
close
watcher
or
null,
initially
null.
Each
dialog
element
has
a
request
close
return
value
,
which
is
a
string
or
null,
initially
null.
Each
dialog
element
has
a
request
close
source
element
,
which
is
an
Element
or
null,
initially
null.
Each
dialog
element
has
an
enable
close
watcher
for
request
close
boolean,
initially
false.
dialog
's
enable
close
watcher
for
request
close
is
used
to
force
enable
the
dialog's
close
watcher
while
requesting
to
close
it.
A
dialog
whose
computed
closed-by
state
is
the
None
state
would
otherwise
have
a
disabled
close
watcher
.
Each
dialog
element
has
an
is
modal
boolean,
initially
false.
The
dialog
HTML
element
insertion
steps
,
given
insertedNode
,
are:
If insertedNode 's node document is not fully active , then return.
If
insertedNode
has
an
open
attribute
and
is
connected
,
then
run
the
dialog
setup
steps
given
insertedNode
.
The
dialog
HTML
element
removing
steps
,
given
removedNode
and
oldParent
,
are:
If
removedNode
has
an
open
attribute,
then
run
the
dialog
cleanup
steps
given
removedNode
.
If removedNode 's node document 's top layer contains removedNode , then remove an element from the top layer immediately given removedNode .
Set is modal of removedNode to false.
The
following
attribute
change
steps
,
given
element
,
localName
,
oldValue
,
value
,
and
namespace
are
used
for
dialog
elements:
If namespace is not null, then return.
If
localName
is
not
open
,
then
return.
If value is null and oldValue is not null, then run the dialog cleanup steps given element .
If element 's node document is not fully active , then return.
If element is not connected , then return.
This ensures that the dialog setup steps are not run on nodes that are disconnected, which would result in a close watcher being established. The dialog cleanup steps need no such guard.
If value is not null and oldValue is null, then run the dialog setup steps given element .
To
show
a
modal
dialog
given
a
dialog
element
subject
and
an
Element
or
null
source
:
If
subject
has
an
open
attribute
and
is
modal
of
subject
is
true,
then
return.
If
subject
has
an
open
attribute,
then
throw
an
"
InvalidStateError
"
DOMException
.
If
subject
's
node
document
is
not
fully
active
,
then
throw
an
"
InvalidStateError
"
DOMException
.
If
subject
is
not
connected
,
then
throw
an
"
InvalidStateError
"
DOMException
.
If
subject
is
in
the
popover
showing
state
,
then
throw
an
"
InvalidStateError
"
DOMException
.
If
the
result
of
firing
an
event
named
beforetoggle
,
using
ToggleEvent
,
with
the
cancelable
attribute
initialized
to
true,
the
oldState
attribute
initialized
to
"
closed
",
the
newState
attribute
initialized
to
"
open
",
and
the
source
attribute
initialized
to
source
at
subject
is
false,
then
return.
If
subject
has
an
open
attribute,
then
return.
If subject is not connected , then return.
If subject is in the popover showing state , then return.
Queue
a
dialog
toggle
event
task
given
subject
,
"
closed
",
"
open
",
and
source
.
Add
an
open
attribute
to
subject
,
whose
value
is
the
empty
string.
Assert : subject 's close watcher is not null.
Set is modal of subject to true.
Set subject 's node document to be blocked by the modal dialog subject .
This will cause the focused area of the document to become inert (unless that currently focused area is a shadow-including descendant of subject ). In such cases, the focused area of the document will soon be reset to the viewport . In a couple steps we will attempt to find a better candidate to focus.
If subject 's node document 's top layer does not already contain subject , then add an element to the top layer given subject .
Set subject 's previously focused element to the focused element.
Let document be subject 's node document .
Let hideUntil be the result of running topmost popover ancestor given subject , document 's showing hint popover list , null, and false.
If hideUntil is null, then set hideUntil to the result of running topmost popover ancestor given subject , document 's showing auto popover list , null, and false.
If hideUntil is null, then set hideUntil to document .
Run hide all popovers until given hideUntil , false, and true.
Run the dialog focusing steps given subject .
To
set
the
dialog
close
watcher
,
given
a
dialog
element
dialog
:
Assert : dialog 's close watcher is null.
Assert
:
dialog
has
an
open
attribute
and
dialog
's
node
document
is
fully
active
.
Set dialog 's close watcher to the result of establishing a close watcher given dialog 's relevant global object , with:
cancelAction
given
canPreventClose
being
to
return
the
result
of
firing
an
event
named
cancel
at
dialog
,
with
the
cancelable
attribute
initialized
to
canPreventClose
.
closeAction being to close the dialog given dialog , dialog 's request close return value , and dialog 's request close source element .
getEnabledState being to return true if dialog 's enable close watcher for request close is true or dialog 's computed closed-by state is not None ; otherwise false.
The
is
valid
command
steps
for
dialog
elements,
given
a
command
attribute
command
,
are:
If command is in the Close state, the Request Close state, or the Show Modal state, then return true.
Return false.
The
command
steps
for
dialog
elements,
given
an
element
element
,
an
element
source
,
and
a
command
attribute
command
,
are:
If element is in the popover showing state, then return.
If
command
is
in
the
Close
state
and
element
has
an
open
attribute,
then
close
the
dialog
element
with
source
's
optional
value
and
source
.
If
command
is
in
the
Request
Close
state
and
element
has
an
open
attribute,
then
request
to
close
the
dialog
element
with
source
's
optional
value
and
source
.
If
command
is
the
Show
Modal
state
and
element
does
not
have
an
open
attribute,
then
show
a
modal
dialog
given
element
and
source
.
The
following
buttons
use
commandfor
to
open
and
close
a
"confirm"
dialog
as
modal
when
activated:
<button type=button
commandfor="the-dialog"
command="show-modal">
Delete
</button>
<dialog id="the-dialog">
<form action="/delete" method="POST">
<button type="submit">
Delete
</button>
<button commandfor="the-dialog"
command="close">
Cancel
</button>
</form>
</dialog>
When
a
dialog
element
subject
is
to
be
closed
,
with
null
or
a
string
result
and
an
Element
or
null
source
,
run
these
steps:
If
subject
does
not
have
an
open
attribute,
then
return.
Fire
an
event
named
beforetoggle
,
using
ToggleEvent
,
with
the
oldState
attribute
initialized
to
"
open
",
the
newState
attribute
initialized
to
"
closed
",
and
the
source
attribute
initialized
to
source
at
subject
.
If
subject
does
not
have
an
open
attribute,
then
return.
Queue
a
dialog
toggle
event
task
given
subject
,
"
open
",
"
closed
",
and
source
.
Remove
subject
's
open
attribute.
If is modal of subject is true, then request an element to be removed from the top layer given subject .
Let wasModal be the value of subject 's is modal flag.
Set is modal of subject to false.
If
result
is
not
null,
then
set
subject
's
returnValue
attribute
to
result
.
Set subject 's request close return value to null.
Set subject 's request close source element to null.
If subject 's previously focused element is not null, then:
Let element be subject 's previously focused element .
Set subject 's previously focused element to null.
If subject 's node document 's focused area of the document 's DOM anchor is a shadow-including inclusive descendant of subject , or wasModal is true, then run the focusing steps for element ; the viewport should not be scrolled by doing this step.
Queue
an
element
task
on
the
user
interaction
task
source
given
the
subject
element
to
fire
an
event
named
close
at
subject
.
To
request
to
close
dialog
element
subject
,
given
null
or
a
string
returnValue
and
null
or
an
Element
source
:
If
subject
does
not
have
an
open
attribute,
then
return.
If subject is not connected or subject 's node document is not fully active , then return.
Assert : subject 's close watcher is not null.
Set subject 's enable close watcher for request close to true.
Set subject 's request close return value to returnValue .
Set subject 's request close source element to source .
Request to close subject 's close watcher with false.
Set subject 's enable close watcher for request close to false.
To
queue
a
dialog
toggle
event
task
given
a
dialog
element
element
,
a
string
oldState
,
a
string
newState
,
and
an
Element
or
null
source
:
If element 's dialog toggle task tracker is not null, then:
Set oldState to element 's dialog toggle task tracker 's old state .
Remove element 's dialog toggle task tracker 's task from its task queue .
Set element 's dialog toggle task tracker to null.
Queue an element task given the DOM manipulation task source and element to run the following steps:
Fire
an
event
named
toggle
at
element
,
using
ToggleEvent
,
with
the
oldState
attribute
initialized
to
oldState
,
the
newState
attribute
initialized
to
newState
,
and
the
source
attribute
initialized
to
source
.
Set element 's dialog toggle task tracker to null.
Set element 's dialog toggle task tracker to a struct with task set to the just-queued task and old state set to oldState .
To
retrieve
a
dialog's
computed
closed-by
state
,
given
a
dialog
dialog
:
The
dialog
focusing
steps
,
given
a
dialog
element
subject
,
are
as
follows:
If the allow focus steps given subject 's node document return false, then return.
Let control be null.
If
subject
has
the
autofocus
attribute,
then
set
control
to
subject
.
If control is null, then set control to the focus delegate of subject .
If control is null, then set control to subject .
Run the focusing steps for control .
If
control
is
not
focusable
,
this
will
do
nothing.
This
would
only
happen
if
subject
had
no
focus
delegate,
and
the
user
agent
decided
that
dialog
elements
were
not
generally
focusable.
In
that
case,
any
earlier
modifications
to
the
focused
area
of
the
document
will
apply.
Let topDocument be control 's node navigable 's top-level traversable 's active document .
If control 's node document 's origin is not the same as the origin of topDocument , then return.
Empty topDocument 's autofocus candidates .
Set topDocument 's autofocus processed flag to true.
The
dialog
setup
steps
,
given
a
dialog
element
subject
,
are
as
follows:
Assert : subject 's node document 's open dialogs list does not contain subject .
Add subject to subject 's node document 's open dialogs list .
Set the dialog close watcher with subject .
The
dialog
cleanup
steps
,
given
a
dialog
element
subject
,
are
as
follows:
Remove subject from subject 's node document 's open dialogs list .
If subject 's close watcher is not null, then:
Destroy subject 's close watcher .
Set subject 's close watcher to null.
"Light
dismiss"
means
that
clicking
outside
of
a
dialog
element
whose
closedby
attribute
is
in
the
Any
state
will
close
the
dialog
element.
This
is
in
addition
to
how
such
dialog
s
respond
to
close
requests
.
To
light
dismiss
open
dialogs
,
given
a
PointerEvent
event
:
Let document be event 's target 's node document .
If document 's open dialogs list is empty , then return.
Let ancestor be the result of running nearest clicked dialog given event .
If
event
's
type
is
"
pointerdown
",
then
set
document
's
dialog
pointerdown
target
to
ancestor
.
If
event
's
type
is
"
pointerup
",
then:
Let sameTarget be true if ancestor is document 's dialog pointerdown target .
Set document 's dialog pointerdown target to null.
If sameTarget is false, then return.
Let topmostDialog be the last element of document 's open dialogs list .
If ancestor is topmostDialog , then return.
If topmostDialog 's computed closed-by state is not Any , then return.
Assert : topmostDialog 's close watcher is not null.
Request to close topmostDialog 's close watcher with false.
To
run
light
dismiss
activities
,
given
a
PointerEvent
event
:
Run light dismiss open popovers with event .
Run light dismiss open dialogs with event .
Run light dismiss activities will be called by the Pointer Events spec when the user clicks or touches anywhere on the page.
To
find
the
nearest
clicked
dialog
,
given
a
PointerEvent
event
:
Let target be event 's target .
If
target
is
a
dialog
element,
target
has
an
open
attribute,
target
's
is
modal
is
true,
and
event
's
clientX
and
clientY
are
outside
the
bounds
of
target
,
then
return
null.
The
check
for
clientX
and
clientY
is
because
a
pointer
event
that
hits
the
::backdrop
pseudo
element
of
a
dialog
will
result
in
event
having
a
target
of
the
dialog
element
itself.
Let currentNode be target .
While currentNode is not null:
Return null.
menubar
element
menuitem
element:
Palpable
content
.
menuitem
elements.
orientation
[Exposed=Window]
interface HTMLMenuBarElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions, Reflect] attribute DOMString orientation;
};
The
menubar
element
represents
a
bar
consisting
of
its
contents,
in
the
form
of
a
stack
of
menuitem
elements,
each
of
which
represents
a
command
that
the
user
can
invoke,
or
a
sub-menu
that
the
user
can
trigger.
The
menubar
element,
along
with
the
menulist
and
menuitem
elements,
comprise
an
improvement
over
the
legacy
menu
element
to
offer
an
application
menu
with
built-in
keyboard
navigation
and
sub-menu
triggering,
and
tie-ins
to
modern
APIs
such
as
popovers
and
command
invokers.
In
this
example,
a
document
editing
application
uses
a
menubar
to
represent
a
series
of
editing
commands:
<menubar>
<menuitem commandfor="file-menu" command="show-menu">File</menuitem>
<menuitem commandfor="edit-menu" command="show-menu">Edit</menuitem>
<menuitem commandfor="view-menu" command="show-menu">View</menuitem>
</menubar>
When
focus
enters
the
menubar
element
whose
orientation
attribute
is
in
the
Horizontal
state,
the
user
can
navigate
through
the
menuitem
elements
using
the
left
and
right
arrow
keys.
The
orientation
attribute
is
an
enumerated
attribute
with
the
following
keywords
and
states.
This
attribute's
missing
value
default
and
invalid
value
default
are
both
the
Horizontal
state.
| Keyword | State | Brief description |
|---|---|---|
horizontal
| Horizontal |
The
menubar
displays
its
children
as
a
horizontal
row
of
items,
and
keyboard
navigation
is
used
to
move
focus
laterally
throughout
the
row.
|
vertical
| Vertical |
The
menubar
displays
its
children
as
a
vertical
stack
of
items,
and
keyboard
navigation
is
used
to
move
focus
up
and
down
through
the
stack.
|
Once
the
menu
bar
iterator
object
is
specified
out
explicitly,
write
this
note
that
describes
how
the
orientation
attribute
controls
this
object.
The
orientation
IDL
attribute
must
reflect
the
orientation
content
attribute,
limited
to
only
known
values
.
menulist
element
menuitem
element:
Palpable
content
.
menuitem
elements.
[Exposed=Window]
interface HTMLMenuListElement : HTMLElement {
[HTMLConstructor] constructor();
};
The
menulist
element
represents
a
popover
consisting
of
its
contents,
in
the
form
of
a
stack
of
menuitem
elements,
each
of
which
represents
a
command
that
the
user
can
invoke,
or
a
sub-menu
that
the
user
can
trigger.
menulist
elements
are
so-called
"native"
popovers,
in
that
their
popover
state
is
not
No
Popover
by
default,
even
when
the
popover
attribute
is
not
present.
The
command
steps
for
menulist
elements,
given
an
element
element
,
an
element
source
,
and
a
command
attribute
command
,
are:
If command is in the Hide Menu state:
If the result of running check popover validity given element , true, false, and null is true, then run the hide popover algorithm given element , true, true, false, and source .
Otherwise, if command is in the Toggle Menu state:
If the result of running check popover validity given element , false, false, and null is true, then run the show popover algorithm given element , false, and source .
Otherwise, if the result of running check popover validity given target , true, false, and null is true, then run the hide popover algorithm given element , true, true, false, and source .
Otherwise, if command is in the Show Menu state:
If the result of running check popover validity given element , false, false, and null is true, then run the show popover algorithm given element , false, and source .
menuitem
element
menulist
element
inner
content
elements
.
menubar
element.
menulist
element.
menuitem
element
inner
content
elements
.
disabled
defaultchecked
[Exposed=Window]
interface HTMLMenuItemElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions, Reflect] attribute boolean disabled;
[CEReactions] attribute boolean checked;
[CEReactions, Reflect] attribute boolean defaultChecked;
};
The
disabled
content
attribute
is
a
boolean
attribute
.
A
menuitem
element
that
is
disabled
must
prevent
any
click
events
that
are
queued
on
the
user
interaction
task
source
from
being
dispatched
on
the
element.
Being
disabled
does
not
prevent
all
modifications
to
the
menuitem
element.
For
example,
its
checkedness
could
be
modified
programmatically
from
JavaScript.
Or,
it
could
be
indirectly
modified
by
user
action,
e.g.,
if
other
non-disabled
sibling
menuitem
elements
were
modified.
Each
menuitem
element
has
checkedness
and
dirty
checkedness
booleans,
initially
false.
The
dirty
checkedness
boolean
controls
whether
the
defaultchecked
content
attribute
has
any
effect
on
the
element's
checkedness
.
The
defaultchecked
content
attribute
is
a
boolean
attribute
that
gives
the
default
checkedness
of
the
menuitem
element.
When
the
defaultchecked
content
attribute
is
added,
if
the
element's
dirty
checkedness
is
false,
then
set
the
elenent's
checkedness
to
true;
when
the
defaultchecked
content
attribute
is
removed,
if
the
element's
dirty
checkedness
is
false,
then
set
the
element's
checkedness
to
false.
Each
menuitem
element
has
a
cached
ancestor
menulist
element
,
which
is
a
menulist
element-or-null,
initially
null.
Each
menuitem
element
has
a
cached
ancestor
menubar
element
,
which
is
a
menulist
element-or-null,
initially
null.
Each
menuitem
element
has
a
cached
parent
fieldset
element
,
which
is
a
fieldset
element-or-null,
initially
null.
To
reset
menuitem
ancestor
element
cache
given
a
menuitem
element
element
,
run
these
steps:
For each ancestor of element 's ancestors , in reverse tree order :
If
ancestor
is
a
menulist
,
then
set
element
's
cached
ancestor
menulist
element
to
ancestor
,
and
break
.
If
ancestor
is
a
menulist
,
then
set
element
's
cached
ancestor
menubar
element
to
ancestor
,
and
break
.
If
element
's
parent
is
a
fieldset
element,
then
set
element
's
cached
parent
fieldset
element
to
element
's
parent
.
The
HTML
element
insertion
steps
for
menuitem
elements,
given
insertedNode
,
are:
Reset
menuitem
ancestor
element
cache
given
insertedNode
.
If
insertedNode
's
defaultchecked
attribute
is
present
and
its
dirty
checkedness
is
false,
then:
Check
a
menuitem
element
given
insertedNode
and
true.
Set insertedNode 's dirty checkedness to false.
We
have
to
reset
the
dirtiness,
because
the
algorithm
above
sets
it,
which
is
usually
what
we
want,
except
for
in
this
path,
where
we're
only
checking
the
menu
item
to
reflect
the
defaultchecked
attribute.
The
HTML
element
removing
steps
for
menuitem
elements,
given
removedNode
and
oldParent
,
are:
Reset
menuitem
ancestor
element
cache
given
removedNode
.
A
menuitem
element
is
checkable
if
all
of
the
following
are
true:
its
cached
ancestor
menulist
element
is
non-null;
its
cached
parent
fieldset
element
is
non-null;
its
cached
parent
fieldset
element
's
checkable
attribute
is
not
in
the
None
state;
and
its
cached
parent
fieldset
element
's
checkable
attribute
is
not
in
the
None
state;
and
its invoked submenu is null.
To
get
a
menuitem
element
invoked
submenu
,
run
these
steps.
They
return
a
menulist
element-or-null.
Let
target
be
the
result
of
running
the
element's
get
the
commandfor
-associated
element
.
If
target
is
not
a
menulist
element,
then
return
null.
Let
command
be
the
element's
command
attribute.
If command is not in the Toggle Menu , Show Menu , or Hide Menu state, then return.
Return target .
The
checked
IDL
attribute,
on
getting,
must
return
this
's
checkedness
.
On
setting,
it
must
check
a
menuitem
element
given
this
and
the
new
value.
To
check
a
menuitem
element
element
with
a
boolean
isChecked
,
run
these
steps.
They
return
either
"
close-menulist
"
or
"
stay-open
":
This
algorithm
has
these
return
values
because
when
a
menuitem
is
activated,
it
needs
to
know
whether
checking
an
item
needs
to
hide
the
cached
ancestor
menulist
element
popover
—
as
we
do
when
checking
an
exclusive
item
—
or
leave
it
open
—
as
we
do
with
multi-checked
items,
and
those
that
invoke
a
submenu
—
to
let
the
user
interact
with
the
item
without
immediately
dismissing
it.
If
element
's
is
checkable
is
false,
then
return
"
stay-open
"
if
element
's
invoked
submenu
is
not
null,
and
"
close-menulist
"
otherwise.
Assert : element 's invoked submenu is null.
Set element 's checkedness to isChecked .
Set element 's dirty checkedness to true.
If
element
's
checkedness
is
true
and
element
's
cached
parent
fieldset
element
's
checkable
attribute
is
in
the
Single
state,
then
reset
menuitem
checkedness
given
this
's
parent
and
this
,
and
return
"
close-menulist
".
Return
"
stay-open
".
The
'::checkmark'
pseudo-element
only
applies
to
menuitem
elements
which
are
inside
a
fieldset
element
whose
checkable
attribute
is
not
in
the
None
state.
A
menuitem
element
element
's
activation
behavior
given
event
is:
If
element
is
disabled
,
then
return.
Even
though
the
disabled
attribute
prevents
click
events
that
are
queued
on
the
user
interaction
task
source
from
being
dispatched
on
element
,
we
still
need
to
check
the
attribute
here,
as
activation
behavior
can
be
triggered
in
other
ways.
TODO(domfarolino): Invoke steps to either check the item, or "close the outermost containing menulist", when each is appropriate, before running the shared steps below.
Run the shared command invoker activation steps given element and event .