Living Standard — Last Updated [DATE: 01 Jan 1901]
Commit Snapshot — Last Updated [DATE: 01 Jan 1901]
Review Draft — Published [DATE: 01 Jan 1901]
Edition for Web Developers — Last Updated [DATE: 01 Jan 1901]
This specification is like no other — it has been processed with you, the humble web developer, in mind.
The focus of this specification is readability and ease of access. Unlike the full HTML Standard, this "developer's edition" removes information that only browser vendors need know. It is automatically produced from the full specification by our build tooling, and thus always in sync with the latest developments in HTML.
To read about its conception, construction, and future, read the original press release, and the blog post about its relaunch.
Finally, feel free to contribute on GitHub to make this edition better for everyone!
This specification defines a big part of the web platform, in lots of detail. Its place in the web platform specification stack relative to other specifications can be best summed up as follows:
In short: Yes.
In more length: the term "HTML5" is widely used as a buzzword to refer to modern web technologies, many of which (though by no means all) are developed at the WHATWG. This document is one such; others are available from the WHATWG Standards overview.
HTML is the World Wide Web's core markup language. Originally, HTML was primarily designed as a language for semantically describing scientific documents. Its general design, however, has enabled it to be adapted, over the subsequent years, to describe a number of other types of documents and even applications.
This specification is intended for authors of documents and scripts that use the features defined in this specification, implementers of tools that operate on pages that use the features defined in this specification, and individuals wishing to establish the correctness of documents or implementations with respect to the requirements of this specification.
This document is probably not suited to readers who do not already have at least a passing familiarity with web technologies, as in places it sacrifices clarity for precision, and brevity for completeness. More approachable tutorials and authoring guides can provide a gentler introduction to the topic.
In particular, familiarity with the basics of DOM is necessary for a complete understanding of some of the more technical parts of this specification. An understanding of Web IDL, HTTP, XML, Unicode, character encodings, JavaScript, and CSS will also be helpful in places but is not essential.
This specification is limited to providing a semantic-level markup language and associated semantic-level scripting APIs for authoring accessible pages on the web ranging from static documents to dynamic applications.
The scope of this specification does not include providing mechanisms for media-specific customization of presentation (although default rendering rules for web browsers are included at the end of this specification, and several mechanisms for hooking into CSS are provided as part of the language).
The scope of this specification is not to describe an entire operating system. In particular, hardware configuration software, image manipulation tools, and applications that users would be expected to use with high-end workstations on a daily basis are out of scope. In terms of applications, this specification is targeted specifically at applications that would be expected to be used by users on an occasional basis, or regularly but from disparate locations, with low CPU requirements. Examples of such applications include online purchasing systems, searching systems, games (especially multiplayer online games), public telephone books or address books, communications software (email clients, instant messaging clients, discussion software), document editing software, etc.
For its first five years (1990-1995), HTML went through a number of revisions and experienced a number of extensions, primarily hosted first at CERN, and then at the IETF.
With the creation of the W3C, HTML's development changed venue again. A first abortive attempt at extending HTML in 1995 known as HTML 3.0 then made way to a more pragmatic approach known as HTML 3.2, which was completed in 1997. HTML4 quickly followed later that same year.
The following year, the W3C membership decided to stop evolving HTML and instead begin work on an XML-based equivalent, called XHTML. This effort started with a reformulation of HTML4 in XML, known as XHTML 1.0, which added no new features except the new serialization, and which was completed in 2000. After XHTML 1.0, the W3C's focus turned to making it easier for other working groups to extend XHTML, under the banner of XHTML Modularization. In parallel with this, the W3C also worked on a new language that was not compatible with the earlier HTML and XHTML languages, calling it XHTML2.
Around the time that HTML's evolution was stopped in 1998, parts of the API for HTML developed by browser vendors were specified and published under the name DOM Level 1 (in 1998) and DOM Level 2 Core and DOM Level 2 HTML (starting in 2000 and culminating in 2003). These efforts then petered out, with some DOM Level 3 specifications published in 2004 but the working group being closed before all the Level 3 drafts were completed.
In 2003, the publication of XForms, a technology which was positioned as the next generation of web forms, sparked a renewed interest in evolving HTML itself, rather than finding replacements for it. This interest was borne from the realization that XML's deployment as a web technology was limited to entirely new technologies (like RSS and later Atom), rather than as a replacement for existing deployed technologies (like HTML).
A proof of concept to show that it was possible to extend HTML4's forms to provide many of the features that XForms 1.0 introduced, without requiring browsers to implement rendering engines that were incompatible with existing HTML web pages, was the first result of this renewed interest. At this early stage, while the draft was already publicly available, and input was already being solicited from all sources, the specification was only under Opera Software's copyright.
The idea that HTML's evolution should be reopened was tested at a W3C workshop in 2004, where some of the principles that underlie the HTML5 work (described below), as well as the aforementioned early draft proposal covering just forms-related features, were presented to the W3C jointly by Mozilla and Opera. The proposal was rejected on the grounds that the proposal conflicted with the previously chosen direction for the web's evolution; the W3C staff and membership voted to continue developing XML-based replacements instead.
Shortly thereafter, Apple, Mozilla, and Opera jointly announced their intent to continue working on the effort under the umbrella of a new venue called the WHATWG. A public mailing list was created, and the draft was moved to the WHATWG site. The copyright was subsequently amended to be jointly owned by all three vendors, and to allow reuse of the specification.
The WHATWG was based on several core principles, in particular that technologies need to be backwards compatible, that specifications and implementations need to match even if this means changing the specification rather than the implementations, and that specifications need to be detailed enough that implementations can achieve complete interoperability without reverse-engineering each other.
The latter requirement in particular required that the scope of the HTML5 specification include what had previously been specified in three separate documents: HTML4, XHTML1, and DOM2 HTML. It also meant including significantly more detail than had previously been considered the norm.
In 2006, the W3C indicated an interest to participate in the development of HTML5 after all, and in 2007 formed a working group chartered to work with the WHATWG on the development of the HTML5 specification. Apple, Mozilla, and Opera allowed the W3C to publish the specification under the W3C copyright, while keeping a version with the less restrictive license on the WHATWG site.
For a number of years, both groups then worked together. In 2011, however, the groups came to the conclusion that they had different goals: the W3C wanted to publish a "finished" version of "HTML5", while the WHATWG wanted to continue working on a Living Standard for HTML, continuously maintaining the specification rather than freezing it in a state with known problems, and adding new features as needed to evolve the platform.
In 2019, the WHATWG and W3C signed an agreement to collaborate on a single version of HTML going forward: this document.
It must be admitted that many aspects of HTML appear at first glance to be nonsensical and inconsistent.
HTML, its supporting DOM APIs, as well as many of its supporting technologies, have been developed over a period of several decades by a wide array of people with different priorities who, in many cases, did not know of each other's existence.
Features have thus arisen from many sources, and have not always been designed in especially consistent ways. Furthermore, because of the unique characteristics of the web, implementation bugs have often become de-facto, and now de-jure, standards, as content is often unintentionally written in ways that rely on them before they can be fixed.
Despite all this, efforts have been made to adhere to certain design goals. These are described in the next few subsections.
To avoid exposing web authors to the complexities of multithreading, the HTML and DOM APIs are designed such that no script can ever detect the simultaneous execution of other scripts. Even with workers, the intent is that the behavior of implementations can be thought of as completely serializing the execution of all scripts in all globals.
The exception to this general design principle is the JavaScript SharedArrayBuffer
class. Using SharedArrayBuffer
objects, it can in fact be observed that scripts in
other agents are executing simultaneously. Furthermore, due to the
JavaScript memory model, there are situations which not only are un-representable via serialized
script execution, but also un-representable via serialized statement execution
among those scripts.
This specification interacts with and relies on a wide variety of other specifications. In certain circumstances, unfortunately, conflicting needs have led to this specification violating the requirements of these other specifications. Whenever this has occurred, the transgressions have each been noted as a "willful violation", and the reason for the violation has been noted.
HTML has a wide array of extensibility mechanisms that can be used for adding semantics in a safe manner:
Authors can use the class
attribute to extend elements,
effectively creating their own elements, while using the most applicable existing "real" HTML
element, so that browsers and other tools that don't know of the extension can still support it
somewhat well. This is the tack used by microformats, for example.
Authors can include data for inline client-side scripts or server-side site-wide scripts
to process using the data-*=""
attributes. These are guaranteed
to never be touched by browsers, and allow scripts to include data on HTML elements that scripts
can then look for and process.
Authors can use the <meta name="" content="">
mechanism to
include page-wide metadata.
Authors can use the rel=""
mechanism to annotate
links with specific meanings by registering extensions to
the predefined set of link types. This is also used by microformats.
Authors can embed raw data using the <script type="">
mechanism with a custom type, for further handling by inline or server-side scripts.
Authors can extend APIs using the JavaScript prototyping mechanism. This is widely used by script libraries, for instance.
Authors can use the microdata feature (the itemscope=""
and itemprop=""
attributes) to embed nested name-value pairs of data to be shared with other applications and
sites.
Authors can define, share, and use custom elements to extend the vocabulary of HTML. The requirements of valid custom element names ensure forward compatibility (since no elements will be added to HTML, SVG, or MathML with hyphen-containing local names in the future).
This specification defines an abstract language for describing documents and applications, and some APIs for interacting with in-memory representations of resources that use this language.
The in-memory representation is known as "DOM HTML", or "the DOM" for short.
There are various concrete syntaxes that can be used to transmit resources that use this abstract language, two of which are defined in this specification.
The first such concrete syntax is the HTML syntax. This is the format suggested for most
authors. It is compatible with most legacy web browsers. If a document is transmitted with the
text/html
MIME type, then it will be processed as an HTML document by
web browsers. This specification defines the latest HTML syntax, known simply as "HTML".
The second concrete syntax is XML. When a document is transmitted with an XML MIME
type, such as application/xhtml+xml
, then it is treated as an XML document by
web browsers, to be parsed by an XML processor. Authors are reminded that the processing for XML
and HTML differs; in particular, even minor syntax errors will prevent a document labeled as XML
from being rendered fully, whereas they would be ignored in the HTML syntax.
The XML syntax for HTML was formerly referred to as "XHTML", but this specification does not use that term (among other reasons, because no such term is used for the HTML syntaxes of MathML and SVG).
The DOM, the HTML syntax, and the XML syntax cannot all represent the same content. For
example, namespaces cannot be represented using the HTML syntax, but they are supported in the DOM
and in the XML syntax. Similarly, documents that use the noscript
feature can be
represented using the HTML syntax, but cannot be represented with the DOM or in the XML syntax.
Comments that contain the string "-->
" can only be represented in the
DOM, not in the HTML and XML syntaxes.
This specification is divided into the following major sections:
EventSource
, and a two-way full-duplex socket protocol for scripts known as Web
Sockets.There are also some appendices, listing obsolete features and IANA considerations, and several indices.
This specification should be read like all other specifications. First, it should be read cover-to-cover, multiple times. Then, it should be read backwards at least once. Then it should be read by picking random sections from the contents list and following all the cross-references.
As described in the conformance requirements section below, this specification describes conformance criteria for a variety of conformance classes. In particular, there are conformance requirements that apply to producers, for example authors and the documents they create, and there are conformance requirements that apply to consumers, for example web browsers. They can be distinguished by what they are requiring: a requirement on a producer states what is allowed, while a requirement on a consumer states how software is to act.
For example, "the foo
attribute's value must be a valid
integer" is a requirement on producers, as it lays out the allowed values; in contrast,
the requirement "the foo
attribute's value must be parsed using the
rules for parsing integers" is a requirement on consumers, as it describes how to
process the content.
Requirements on producers have no bearing whatsoever on consumers.
Continuing the above example, a requirement stating that a particular attribute's value is constrained to being a valid integer emphatically does not imply anything about the requirements on consumers. It might be that the consumers are in fact required to treat the attribute as an opaque string, completely unaffected by whether the value conforms to the requirements or not. It might be (as in the previous example) that the consumers are required to parse the value using specific rules that define how invalid (non-numeric in this case) values are to be processed.
This is a definition, requirement, or explanation.
This is a note.
This is an example.
This is an open issue.
This is a warning.
[Exposed=Window]
interface Example {
// this is an IDL definition
};
variable = object.method([optionalArgument])
This is a note to authors describing the usage of an interface.
/* this is a CSS fragment */
The defining instance of a term is marked up like this. Uses of that term are marked up like this or like this.
The defining instance of an element, attribute, or API is marked up like this
. References to that element, attribute, or API are marked up
like this
.
Other code fragments are marked up like this
.
Variables are marked up like this.
In an algorithm, steps in synchronous sections are marked with ⌛.
In some cases, requirements are given in the form of lists with conditions and corresponding requirements. In such cases, the requirements that apply to a condition are always the first set of requirements that follow the condition, even in the case of there being multiple sets of conditions for those requirements. Such cases are presented as follows:
A basic HTML document looks like this:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Sample page</title>
</head>
<body>
<h1>Sample page</h1>
<p>This is a <a href="demo.html">simple</a> sample.</p>
<!-- this is a comment -->
</body>
</html>
HTML documents consist of a tree of elements and text. Each element is denoted in the source by
a start tag, such as "<body>
", and
an end tag, such as "</body>
".
(Certain start tags and end tags can in certain cases be omitted and are implied by other tags.)
Tags have to be nested such that elements are all completely within each other, without overlapping:
<p>This is <em>very <strong>wrong</em>!</strong></p>
<p>This <em>is <strong>correct</strong>.</em></p>
This specification defines a set of elements that can be used in HTML, along with rules about the ways in which the elements can be nested.
Elements can have attributes, which control how the elements work. In the example below, there
is a hyperlink, formed using the a
element and its href
attribute:
<a href="demo.html">simple</a>
Attributes are placed inside the start tag, and consist
of a name and a value, separated by an "=
" character.
The attribute value can remain unquoted if it doesn't contain ASCII
whitespace or any of "
'
`
=
<
or >
. Otherwise, it has to be quoted using either single or double quotes. The
value, along with the "=
" character, can be omitted altogether if the value
is the empty string.
<!-- empty attributes -->
<input name=address disabled>
<input name=address disabled="">
<!-- attributes with a value -->
<input name=address maxlength=200>
<input name=address maxlength='200'>
<input name=address maxlength="200">
HTML user agents (e.g., web browsers) then parse this markup, turning it into a DOM (Document Object Model) tree. A DOM tree is an in-memory representation of a document.
DOM trees contain several kinds of nodes, in particular a DocumentType
node,
Element
nodes, Text
nodes, Comment
nodes, and in some cases
ProcessingInstruction
nodes.
The markup snippet at the top of this section would be turned into the following DOM tree:
html
html
lang
="en
"head
#text
: ⏎␣␣title
#text
: Sample page#text
: ⏎␣#text
: ⏎␣body
#text
: ⏎␣␣h1
#text
: Sample page#text
: ⏎␣␣p
#text
: This is a a
href
="demo.html
"#text
: simple#text
: sample.#text
: ⏎␣␣#comment
: this is a comment #text
: ⏎␣⏎The document element of this tree is the html
element, which is the
element always found in that position in HTML documents. It contains two elements,
head
and body
, as well as a Text
node between them.
There are many more Text
nodes in the DOM tree than one would initially expect,
because the source contains a number of spaces (represented here by "␣") and line breaks
("⏎") that all end up as Text
nodes in the DOM. However, for historical
reasons not all of the spaces and line breaks in the original markup appear in the DOM. In
particular, all the whitespace before head
start tag ends up being dropped silently,
and all the whitespace after the body
end tag ends up placed at the end of the
body
.
The head
element contains a title
element, which itself contains a
Text
node with the text "Sample page". Similarly, the body
element
contains an h1
element, a p
element, and a comment.
This DOM tree can be manipulated from scripts in the page. Scripts (typically in JavaScript)
are small programs that can be embedded using the script
element or using event
handler content attributes. For example, here is a form with a script that sets the value
of the form's output
element to say "Hello World":
<form name="main">
Result: <output name="result"></output>
<script>
document.forms.main.elements.result.value = 'Hello World';
</script>
</form>
Each element in the DOM tree is represented by an object, and these objects have APIs so that
they can be manipulated. For instance, a link (e.g. the a
element in the tree above)
can have its "href
" attribute changed in several
ways:
var a = document.links[0]; // obtain the first link in the document
a.href = 'sample.html'; // change the destination URL of the link
a.protocol = 'https'; // change just the scheme part of the URL
a.setAttribute('href', 'https://example.com/'); // change the content attribute directly
Since DOM trees are used as the way to represent HTML documents when they are processed and presented by implementations (especially interactive implementations like web browsers), this specification is mostly phrased in terms of DOM trees, instead of the markup described above.
HTML documents represent a media-independent description of interactive content. HTML documents might be rendered to a screen, or through a speech synthesizer, or on a braille display. To influence exactly how such rendering takes place, authors can use a styling language such as CSS.
In the following example, the page has been made yellow-on-blue using CSS.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Sample styled page</title>
<style>
body { background: navy; color: yellow; }
</style>
</head>
<body>
<h1>Sample styled page</h1>
<p>This page is just a demo.</p>
</body>
</html>
For more details on how to use HTML, authors are encouraged to consult tutorials and guides. Some of the examples included in this specification might also be of use, but the novice author is cautioned that this specification, by necessity, defines the language with a level of detail that might be difficult to understand at first.
When HTML is used to create interactive sites, care needs to be taken to avoid introducing vulnerabilities through which attackers can compromise the integrity of the site itself or of the site's users.
A comprehensive study of this matter is beyond the scope of this document, and authors are strongly encouraged to study the matter in more detail. However, this section attempts to provide a quick introduction to some common pitfalls in HTML application development.
The security model of the web is based on the concept of "origins", and correspondingly many of the potential attacks on the web involve cross-origin actions. ORIGIN
When accepting untrusted input, e.g. user-generated content such as text comments, values in URL parameters, messages from third-party sites, etc, it is imperative that the data be validated before use, and properly escaped when displayed. Failing to do this can allow a hostile user to perform a variety of attacks, ranging from the potentially benign, such as providing bogus user information like a negative age, to the serious, such as running scripts every time a user looks at a page that includes the information, potentially propagating the attack in the process, to the catastrophic, such as deleting all data in the server.
When writing filters to validate user input, it is imperative that filters always be safelist-based, allowing known-safe constructs and disallowing all other input. Blocklist-based filters that disallow known-bad inputs and allow everything else are not secure, as not everything that is bad is yet known (for example, because it might be invented in the future).
For example, suppose a page looked at its URL's query string to determine what to display, and the site then redirected the user to that page to display a message, as in:
<ul>
<li><a href="message.cgi?say=Hello">Say Hello</a>
<li><a href="message.cgi?say=Welcome">Say Welcome</a>
<li><a href="message.cgi?say=Kittens">Say Kittens</a>
</ul>
If the message was just displayed to the user without escaping, a hostile attacker could then craft a URL that contained a script element:
https://example.com/message.cgi?say=%3Cscript%3Ealert%28%27Oh%20no%21%27%29%3C/script%3E
If the attacker then convinced a victim user to visit this page, a script of the attacker's choosing would run on the page. Such a script could do any number of hostile actions, limited only by what the site offers: if the site is an e-commerce shop, for instance, such a script could cause the user to unknowingly make arbitrarily many unwanted purchases.
This is called a cross-site scripting attack.
There are many constructs that can be used to try to trick a site into executing code. Here are some that authors are encouraged to consider when writing safelist filters:
img
, it is important to safelist
any provided attributes as well. If one allowed all attributes then an attacker could, for
instance, use the onload
attribute to run arbitrary
script.javascript:
", but user agents can
implement (and indeed, have historically implemented) others.base
element to be inserted means any script
elements
in the page with relative links can be hijacked, and similarly that any form submissions can
get redirected to a hostile site.If a site allows a user to make form submissions with user-specific side-effects, for example posting messages on a forum under the user's name, making purchases, or applying for a passport, it is important to verify that the request was made by the user intentionally, rather than by another site tricking the user into making the request unknowingly.
This problem exists because HTML forms can be submitted to other origins.
Sites can prevent such attacks by populating forms with user-specific hidden tokens, or by
checking `Origin
` headers on all requests.
A page that provides users with an interface to perform actions that the user might not wish to perform needs to be designed so as to avoid the possibility that users can be tricked into activating the interface.
One way that a user could be so tricked is if a hostile site places the victim site in a
small iframe
and then convinces the user to click, for instance by having the user
play a reaction game. Once the user is playing the game, the hostile site can quickly position
the iframe under the mouse cursor just as the user is about to click, thus tricking the user
into clicking the victim site's interface.
To avoid this, sites that do not expect to be used in frames are encouraged to only enable
their interface if they detect that they are not in a frame (e.g. by comparing the window
object to the value of the top
attribute).
Scripts in HTML have "run-to-completion" semantics, meaning that the browser will generally run the script uninterrupted before doing anything else, such as firing further events or continuing to parse the document.
On the other hand, parsing of HTML files happens incrementally, meaning that the parser can pause at any point to let scripts run. This is generally a good thing, but it does mean that authors need to be careful to avoid hooking event handlers after the events could have possibly fired.
There are two techniques for doing this reliably: use event handler content attributes, or create the element and add the event handlers in the same script. The latter is safe because, as mentioned earlier, scripts are run to completion before further events can fire.
One way this could manifest itself is with img
elements and the load
event. The event could fire as soon as the element has been
parsed, especially if the image has already been cached (which is common).
Here, the author uses the onload
handler on an
img
element to catch the load
event:
<img src="games.png" alt="Games" onload="gamesLogoHasLoaded(event)">
If the element is being added by script, then so long as the event handlers are added in the same script, the event will still not be missed:
<script>
var img = new Image();
img.src = 'games.png';
img.alt = 'Games';
img.onload = gamesLogoHasLoaded;
// img.addEventListener('load', gamesLogoHasLoaded, false); // would work also
</script>
However, if the author first created the img
element and then in a separate
script added the event listeners, there's a chance that the load
event would be fired in between, leading it to be missed:
<!-- Do not use this style, it has a race condition! -->
<img id="games" src="games.png" alt="Games">
<!-- the 'load' event might fire here while the parser is taking a
break, in which case you will not see it! -->
<script>
var img = document.getElementById('games');
img.onload = gamesLogoHasLoaded; // might never fire!
</script>
Authors are encouraged to make use of conformance checkers (also known as validators) to catch common mistakes. The WHATWG maintains a list of such tools at: https://whatwg.org/validator/
Unlike previous versions of the HTML specification, this specification defines in some detail the required processing for invalid documents as well as valid documents.
However, even though the processing of invalid content is in most cases well-defined, conformance requirements for documents are still important: in practice, interoperability (the situation in which all implementations process particular content in a reliable and identical or equivalent way) is not the only goal of document conformance requirements. This section details some of the more common reasons for still distinguishing between a conforming document and one with errors.
The majority of presentational features from previous versions of HTML are no longer allowed. Presentational markup in general has been found to have a number of problems:
While it is possible to use presentational markup in a way that provides users of assistive technologies (ATs) with an acceptable experience (e.g. using ARIA), doing so is significantly more difficult than doing so when using semantically-appropriate markup. Furthermore, even using such techniques doesn't help make pages accessible for non-AT non-graphical users, such as users of text-mode browsers.
Using media-independent markup, on the other hand, provides an easy way for documents to be authored in such a way that they work for more users (e.g. users of text browsers).
It is significantly easier to maintain a site written in such a way that the markup is
style-independent. For example, changing the color of a site that uses <font color="">
throughout requires changes across the entire site,
whereas a similar change to a site based on CSS can be done by changing a single file.
Presentational markup tends to be much more redundant, and thus results in larger document sizes.
For those reasons, presentational markup has been removed from HTML in this version. This change should not come as a surprise; HTML4 deprecated presentational markup many years ago and provided a mode (HTML4 Transitional) to help authors move away from presentational markup; later, XHTML 1.1 went further and obsoleted those features altogether.
The only remaining presentational markup features in HTML are the style
attribute and the style
element. Use of the style
attribute is somewhat discouraged in production environments, but
it can be useful for rapid prototyping (where its rules can be directly moved into a separate
style sheet later) and for providing specific styles in unusual cases where a separate style sheet
would be inconvenient. Similarly, the style
element can be useful in syndication or
for page-specific styles, but in general an external style sheet is likely to be more convenient
when the styles apply to multiple pages.
It is also worth noting that some elements that were previously presentational have been
redefined in this specification to be media-independent: b
, i
,
hr
, s
, small
, and u
.
The syntax of HTML is constrained to avoid a wide variety of problems.
Certain invalid syntax constructs, when parsed, result in DOM trees that are highly unintuitive.
For example, the following markup fragment results in a DOM with an hr
element
that is an earlier sibling of the corresponding table
element:
<table><hr>...
To allow user agents to be used in controlled environments without having to implement the more bizarre and convoluted error handling rules, user agents are permitted to fail whenever encountering a parse error.
Some error-handling behavior, such as the behavior for the <table><hr>...
example mentioned above, are incompatible with streaming
user agents (user agents that process HTML files in one pass, without storing state). To avoid
interoperability problems with such user agents, any syntax resulting in such behavior is
considered invalid.
When a user agent based on XML is connected to an HTML parser, it is possible that certain invariants that XML enforces, such as element or attribute names never contain multiple colons, will be violated by an HTML file. Handling this can require that the parser coerce the HTML DOM into an XML-compatible infoset. Most syntax constructs that require such handling are considered invalid. (Comments containing two consecutive hyphens, or ending with a hyphen, are exceptions that are allowed in the HTML syntax.)
Certain syntax constructs can result in disproportionately poor performance. To discourage the use of such constructs, they are typically made non-conforming.
For example, the following markup results in poor performance, since all the unclosed
i
elements have to be reconstructed in each paragraph, resulting in progressively
more elements in each paragraph:
<p><i>She dreamt.
<p><i>She dreamt that she ate breakfast.
<p><i>Then lunch.
<p><i>And finally dinner.
The resulting DOM for this fragment would be:
p
i
#text
: She dreamt.p
i
i
#text
: She dreamt that she ate breakfast.p
i
i
i
#text
: Then lunch.p
i
i
i
i
#text
: And finally dinner.There are syntax constructs that, for historical reasons, are relatively fragile. To help reduce the number of users who accidentally run into such problems, they are made non-conforming.
For example, the parsing of certain named character references in attributes happens even with the closing semicolon being omitted. It is safe to include an ampersand followed by letters that do not form a named character reference, but if the letters are changed to a string that does form a named character reference, they will be interpreted as that character instead.
In this fragment, the attribute's value is "?bill&ted
":
<a href="?bill&ted">Bill and Ted</a>
In the following fragment, however, the attribute's value is actually "?art©
", not the intended "?art©
",
because even without the final semicolon, "©
" is handled the same
as "©
" and thus gets interpreted as "©
":
<a href="?art©">Art and Copy</a>
To avoid this problem, all named character references are required to end with a semicolon, and uses of named character references without a semicolon are flagged as errors.
Thus, the correct way to express the above cases is as follows:
<a href="?bill&ted">Bill and Ted</a> <!-- &ted is ok, since it's not a named character reference -->
<a href="?art&copy">Art and Copy</a> <!-- the & has to be escaped, since © is a named character reference -->
Certain syntax constructs are known to cause especially subtle or serious problems in legacy user agents, and are therefore marked as non-conforming to help authors avoid them.
For example, this is why the U+0060 GRAVE ACCENT character (`) is not allowed in unquoted attributes. In certain legacy user agents, it is sometimes treated as a quote character.
Another example of this is the DOCTYPE, which is required to trigger no-quirks mode, because the behavior of legacy user agents in quirks mode is often largely undocumented.
Certain restrictions exist purely to avoid known security problems.
For example, the restriction on using UTF-7 exists purely to avoid authors falling prey to a known cross-site-scripting attack using UTF-7. UTF7
Markup where the author's intent is very unclear is often made non-conforming. Correcting these errors early makes later maintenance easier.
For example, it is unclear whether the author intended the following to be an
h1
heading or an h2
heading:
<h1>Contact details</h2>
When a user makes a simple typo, it is helpful if the error can be caught early, as this can save the author a lot of debugging time. This specification therefore usually considers it an error to use element names, attribute names, and so forth, that do not match the names defined in this specification.
For example, if the author typed <capton>
instead of <caption>
, this would be flagged as an error and the author could correct
the typo immediately.
In order to allow the language syntax to be extended in the future, certain otherwise harmless features are disallowed.
For example, "attributes" in end tags are ignored currently, but they are invalid, in case a future change to the language makes use of that syntax feature without conflicting with already-deployed (and valid!) content.
Some authors find it helpful to be in the practice of always quoting all attributes and always including all optional tags, preferring the consistency derived from such custom over the minor benefits of terseness afforded by making use of the flexibility of the HTML syntax. To aid such authors, conformance checkers can provide modes of operation wherein such conventions are enforced.
Beyond the syntax of the language, this specification also places restrictions on how elements and attributes can be specified. These restrictions are present for similar reasons:
To avoid misuse of elements with defined meanings, content models are defined that restrict how elements can be nested when such nestings would be of dubious value.
For example, this specification disallows nesting a section
element inside a kbd
element, since it is highly unlikely for an author to indicate
that an entire section should be keyed in.
Similarly, to draw the author's attention to mistakes in the use of elements, clear contradictions in the semantics expressed are also considered conformance errors.
In the fragments below, for example, the semantics are nonsensical: a separator cannot simultaneously be a cell, nor can a radio button be a progress bar.
<hr role="cell">
<input type=radio role=progressbar>
Another example is the restrictions on the content models of the
ul
element, which only allows li
element children. Lists by definition
consist just of zero or more list items, so if a ul
element contains something
other than an li
element, it's not clear what was meant.
Certain elements have default styles or behaviors that make certain combinations likely to lead to confusion. Where these have equivalent alternatives without this problem, the confusing combinations are disallowed.
For example, div
elements are rendered as block boxes, and span
elements as inline boxes. Putting a block box in an
inline box is unnecessarily confusing; since either nesting just div
elements, or nesting just span
elements, or nesting span
elements
inside div
elements all serve the same purpose as nesting a div
element in a span
element, but only the latter involves a block box in
an inline box, the latter combination is disallowed.
Another example would be the way interactive content cannot be
nested. For example, a button
element cannot contain a textarea
element. This is because the default behavior of such nesting interactive elements would be
highly confusing to users. Instead of nesting these elements, they can be placed side by
side.
Sometimes, something is disallowed because allowing it would likely cause author confusion.
For example, setting the disabled
attribute to the value "false
" is disallowed, because despite the
appearance of meaning that the element is enabled, it in fact means that the element is
disabled (what matters for implementations is the presence of the attribute, not its
value).
Some conformance errors simplify the language that authors need to learn.
For example, the area
element's shape
attribute, despite accepting both circ
and circle
values in practice as synonyms, disallows
the use of the circ
value, so as to simplify
tutorials and other learning aids. There would be no benefit to allowing both, but it would
cause extra confusion when teaching the language.
Certain elements are parsed in somewhat eccentric ways (typically for historical reasons), and their content model restrictions are intended to avoid exposing the author to these issues.
For example, a form
element isn't allowed inside phrasing content,
because when parsed as HTML, a form
element's start tag will imply a
p
element's end tag. Thus, the following markup results in two paragraphs, not one:
<p>Welcome. <form><label>Name:</label> <input></form>
It is parsed exactly like the following:
<p>Welcome. </p><form><label>Name:</label> <input></form>
Some errors are intended to help prevent script problems that would be hard to debug.
This is why, for instance, it is non-conforming to have two id
attributes with the same value. Duplicate IDs lead to the wrong
element being selected, with sometimes disastrous effects whose cause is hard to determine.
Some constructs are disallowed because historically they have been the cause of a lot of wasted authoring time, and by encouraging authors to avoid making them, authors can save time in future efforts.
For example, a script
element's src
attribute causes the element's contents to be ignored.
However, this isn't obvious, especially if the element's contents appear to be executable script
— which can lead to authors spending a lot of time trying to debug the inline script
without realizing that it is not executing. To reduce this problem, this specification makes it
non-conforming to have executable script in a script
element when the src
attribute is present. This means that authors who are
validating their documents are less likely to waste time with this kind of mistake.
Some authors like to write files that can be interpreted as both XML and HTML with similar results. Though this practice is discouraged in general due to the myriad of subtle complications involved (especially when involving scripting, styling, or any kind of automated serialization), this specification has a few restrictions intended to at least somewhat mitigate the difficulties. This makes it easier for authors to use this as a transitionary step when migrating between the HTML and XML syntaxes.
For example, there are somewhat complicated rules surrounding the lang
and xml:lang
attributes
intended to keep the two synchronized.
Another example would be the restrictions on the values of xmlns
attributes in the HTML serialization, which are intended to ensure that
elements in conforming documents end up in the same namespaces whether processed as HTML or
XML.
As with the restrictions on the syntax intended to allow for new syntax in future revisions of the language, some restrictions on the content models of elements and values of attributes are intended to allow for future expansion of the HTML vocabulary.
For example, limiting the values of the target
attribute that start with an U+005F LOW LINE
character (_) to only specific predefined values allows new predefined values to be introduced
at a future time without conflicting with author-defined values.
Certain restrictions are intended to support the restrictions made by other specifications.
For example, requiring that attributes that take media query lists use only valid media query lists reinforces the importance of following the conformance rules of that specification.
The following documents might be of interest to readers of this specification.
This Architectural Specification provides authors of specifications, software developers, and content developers with a common reference for interoperable text manipulation on the World Wide Web, building on the Universal Character Set, defined jointly by the Unicode Standard and ISO/IEC 10646. Topics addressed include use of the terms 'character', 'encoding' and 'string', a reference processing model, choice and identification of character encodings, character escaping, and string indexing.
Because Unicode contains such a large number of characters and incorporates the varied writing systems of the world, incorrect usage can expose programs or systems to possible security attacks. This is especially important as more and more products are internationalized. This document describes some of the security considerations that programmers, system analysts, standards developers, and users should take into account, and provides specific recommendations to reduce the risk of problems.
Web Content Accessibility Guidelines (WCAG) covers a wide range of recommendations for making web content more accessible. Following these guidelines will make content accessible to a wider range of people with disabilities, including blindness and low vision, deafness and hearing loss, learning disabilities, cognitive limitations, limited movement, speech disabilities, photosensitivity and combinations of these. Following these guidelines will also often make your web content more usable to users in general.
This specification provides guidelines for designing web content authoring tools that are more accessible for people with disabilities. An authoring tool that conforms to these guidelines will promote accessibility by providing an accessible user interface to authors with disabilities as well as by enabling, supporting, and promoting the production of accessible web content by all authors.
This document provides guidelines for designing user agents that lower barriers to web accessibility for people with disabilities. User agents include browsers and other types of software that retrieve and render web content. A user agent that conforms to these guidelines will promote accessibility through its own user interface and through other internal facilities, including its ability to communicate with other technologies (especially assistive technologies). Furthermore, all users, not just users with disabilities, should find conforming user agents to be more usable.
This specification depends on Infra. INFRA
This specification refers to both HTML and XML attributes and IDL attributes, often in the same context. When it is not clear which is being referred to, they are referred to as content attributes for HTML and XML attributes, and IDL attributes for those defined on IDL interfaces. Similarly, the term "properties" is used for both JavaScript object properties and CSS properties. When these are ambiguous they are qualified as object properties and CSS properties respectively.
Generally, when the specification states that a feature applies to the HTML syntax or the XML syntax, it also includes the other. When a feature specifically only applies to one of the two languages, it is called out by explicitly stating that it does not apply to the other format, as in "for HTML, ... (this does not apply to XML)".
This specification uses the term document to refer to any use of HTML,
ranging from short static documents to long essays or reports with rich multimedia, as well as to
fully-fledged interactive applications. The term is used to refer both to Document
objects and their descendant DOM trees, and to serialized byte streams using the HTML syntax or the XML syntax, depending
on context.
In the context of the DOM structures, the terms HTML
document and XML document are used as defined in
DOM, and refer specifically to two different modes that Document
objects
can find themselves in. DOM (Such uses are always hyperlinked to their
definition.)
In the context of byte streams, the term HTML document refers to resources labeled as
text/html
, and the term XML document refers to resources labeled with an XML
MIME type.
For simplicity, terms such as shown, displayed, and visible might sometimes be used when referring to the way a document is rendered to the user. These terms are not meant to imply a visual medium; they must be considered to apply to other media in equivalent ways.
To run steps in parallel means those steps are to be run, one after another, at the same time as other logic in the standard (e.g., at the same time as the event loop). This standard does not define the precise mechanism by which this is achieved, be it time-sharing cooperative multitasking, fibers, threads, processes, using different hyperthreads, cores, CPUs, machines, etc. By contrast, an operation that is to run immediately must interrupt the currently running task, run itself, and then resume the previously running task.
For guidance on writing specifications that leverage parallelism, see Dealing with the event loop from other specifications.
To avoid race conditions between different in parallel algorithms that operate on the same data, a parallel queue can be used.
A parallel queue represents a queue of algorithm steps that must be run in series.
A parallel queue has an algorithm queue (a queue), initially empty.
To enqueue steps to a parallel queue, enqueue the algorithm steps to the parallel queue's algorithm queue.
To start a new parallel queue, run the following steps:
Let parallelQueue be a new parallel queue.
Run the following steps in parallel:
While true:
Let steps be the result of dequeueing from parallelQueue's algorithm queue.
If steps is not nothing, then run steps.
Assert: running steps did not throw an exception, as steps running in parallel are not allowed to throw.
Implementations are not expected to implement this as a continuously running loop. Algorithms in standards are to be easy to understand and are not necessarily great for battery life or performance.
Return parallelQueue.
Steps running in parallel can themselves run other steps in in parallel. E.g., inside a parallel queue it can be useful to run a series of steps in parallel with the queue.
Imagine a standard defined nameList (a list), along with a method to add a name to nameList, unless nameList already contains name, in which case it rejects.
The following solution suffers from race conditions:
Let p be a new promise created in this's relevant realm.
Run the following steps in parallel:
If nameList contains name,
then queue a global task on the DOM manipulation task source given
this's relevant global object to reject p with a
TypeError
, and abort these steps.
Do some potentially lengthy work.
Append name to nameList.
Queue a global task on the DOM manipulation task source given this's relevant global object to resolve p with undefined.
Return p.
Two invocations of the above could run simultaneously, meaning name isn't in nameList during step 2.1, but it might be added before step 2.3 runs, meaning name ends up in nameList twice.
Parallel queues solve this. The standard would let nameListQueue be the result of starting a new parallel queue, then:
Let p be a new promise created in this's relevant realm.
Enqueue the following steps to nameListQueue:
If nameList contains name,
then queue a global task on the DOM manipulation task source given
this's relevant global object to reject p with a
TypeError
, and abort these steps.
Do some potentially lengthy work.
Append name to nameList.
Queue a global task on the DOM manipulation task source given this's relevant global object to resolve p with undefined.
Return p.
The steps would now queue and the race is avoided.
The specification uses the term supported when referring to whether a user agent has an implementation capable of decoding the semantics of an external resource. A format or type is said to be supported if the implementation can process an external resource of that format or type without critical aspects of the resource being ignored. Whether a specific resource is supported can depend on what features of the resource's format are in use.
For example, a PNG image would be considered to be in a supported format if its pixel data could be decoded and rendered, even if, unbeknownst to the implementation, the image also contained animation data.
An MPEG-4 video file would not be considered to be in a supported format if the compression format used was not supported, even if the implementation could determine the dimensions of the movie from the file's metadata.
What some specifications, in particular the HTTP specifications, refer to as a representation is referred to in this specification as a resource. HTTP
A resource's critical subresources are those that the resource needs to have available to be correctly processed. Which resources are considered critical or not is defined by the specification that defines the resource's format.
For CSS style sheets, we tentatively define here that
their critical subresources are other style sheets imported via @import
rules, including those indirectly imported by other imported style sheets.
This definition is not fully interoperable; furthermore, some user agents seem to count resources like background images or web fonts as critical subresources. Ideally, the CSS Working Group would define this; see w3c/csswg-drafts issue #1088 to track progress on that front.
To ease migration from HTML to XML, user agents conforming to this
specification will place elements in HTML in the http://www.w3.org/1999/xhtml
namespace, at least for the purposes of the DOM and
CSS. The term "HTML elements" refers to any element in that namespace, even in
XML documents.
Except where otherwise stated, all elements defined or mentioned in this specification are in
the HTML namespace ("http://www.w3.org/1999/xhtml
"), and all
attributes defined or mentioned in this specification have no namespace.
The term element type is used to refer to the set of elements that have a given
local name and namespace. For example, button
elements are elements with the element
type button
, meaning they have the local name "button
" and
(implicitly as defined above) the HTML namespace.
Attribute names are said to be XML-compatible if they match the Name
production defined in XML and they contain no U+003A COLON
characters (:). XML
When it is stated that some element or attribute is ignored, or treated as some other value, or handled as if it was something else, this refers only to the processing of the node after it is in the DOM. A user agent must not mutate the DOM in such situations.
A content attribute is said to change value only if its new value is different than its previous value; setting an attribute to a value it already has does not change it.
The term empty, when used for an attribute value, Text
node,
or string, means that the length of the text is zero (i.e., not even containing controls or U+0020 SPACE).
An HTML element can have specific HTML element insertion steps, HTML element post-connection steps, and HTML element removing steps, all defined for the element's local name.
The insertion steps for the HTML Standard, given insertedNode, are defined as the following:
If insertedNode is an element whose namespace is the HTML namespace, and this standard defines HTML element insertion steps for insertedNode's local name, then run the corresponding HTML element insertion steps given insertedNode.
If insertedNode is a form-associated element or the ancestor of a form-associated element, then:
If the form-associated element's parser inserted flag is set, then return.
Reset the form owner of the form-associated element.
If insertedNode is an Element
that is not on the
stack of open elements of an HTML parser, then
process internal resource links given insertedNode's
node document.
The post-connection steps for the HTML Standard, given insertedNode, are defined as the following:
If insertedNode is an element whose namespace is the HTML namespace, and this standard defines HTML element post-connection steps for insertedNode's local name, then run the corresponding HTML element post-connection steps given insertedNode.
The removing steps for the HTML Standard, given removedNode and oldParent, are defined as the following:
Let document be removedNode's node document.
If document's focused area is removedNode, then set document's focused area to document's viewport, and set document's relevant global object's navigation API's focus changed during ongoing navigation to false.
This does not perform the unfocusing steps,
focusing steps, or focus update steps, and thus no blur
or change
events are
fired.
If removedNode is an element whose namespace is the HTML namespace, and this standard defines HTML element removing steps for removedNode's local name, then run the corresponding HTML element removing steps given removedNode and oldParent.
If removedNode is a form-associated element or the ancestor of a form-associated element, then:
If the form-associated element has a form owner and the form-associated element and its form owner are no longer in the same tree, then reset the form owner of the form-associated element.
If removedNode's popover
attribute is not in
the no popover state, then run the hide
popover algorithm given removedNode, false, false, and false.
A node is inserted into a document when the insertion steps are invoked with it as the argument and it is now in a document tree. Analogously, a node is removed from a document when the removing steps are invoked with it as the argument and it is now no longer in a document tree.
A node becomes connected when the insertion steps are invoked with it as the argument and it is now connected. Analogously, a node becomes disconnected when the removing steps are invoked with it as the argument and it is now no longer connected.
A node is browsing-context connected when it is connected and its shadow-including root's browsing context is non-null. A node becomes browsing-context connected when the insertion steps are invoked with it as the argument and it is now browsing-context connected. A node becomes browsing-context disconnected either when the removing steps are invoked with it as the argument and it is now no longer browsing-context connected, or when its shadow-including root's browsing context becomes null.
The construction "a Foo
object", where Foo
is
actually an interface, is sometimes used instead of the more accurate "an object implementing the
interface Foo
".
An IDL attribute is said to be getting when its value is being retrieved (e.g. by author script), and is said to be setting when a new value is assigned to it.
If a DOM object is said to be live, then the attributes and methods on that object must operate on the actual underlying data, not a snapshot of the data.
The term plugin refers to an implementation-defined set of content
handlers used by the user agent that can take part in the user agent's rendering of a
Document
object, but that neither act as child
navigables of the Document
nor introduce any Node
objects to the
Document
's DOM.
Typically such content handlers are provided by third parties, though a user agent can also designate built-in content handlers as plugins.
A user agent must not consider the types text/plain
and
application/octet-stream
as having a registered plugin.
One example of a plugin would be a PDF viewer that is instantiated in a navigable when the user navigates to a PDF file. This would count as a plugin regardless of whether the party that implemented the PDF viewer component was the same as that which implemented the user agent itself. However, a PDF viewer application that launches separate from the user agent (as opposed to using the same interface) is not a plugin by this definition.
This specification does not define a mechanism for interacting with plugins, as it is expected to be user-agent- and platform-specific. Some UAs might opt to support a plugin mechanism such as the Netscape Plugin API; others might use remote content converters or have built-in support for certain types. Indeed, this specification doesn't require user agents to support plugins at all. NPAPI
Browsers should take extreme care when interacting with external content intended for plugins. When third-party software is run with the same privileges as the user agent itself, vulnerabilities in the third-party software become as dangerous as those in the user agent.
Since different users having different sets of plugins provides a tracking vector that increases the chances of users being uniquely identified, user agents are encouraged to support the exact same set of plugins for each user.
A character encoding, or just encoding where that is not ambiguous, is a defined way to convert between byte streams and Unicode strings, as defined in Encoding. An encoding has an encoding name and one or more encoding labels, referred to as the encoding's name and labels in the Encoding standard. ENCODING
This specification describes the conformance criteria for user agents (relevant to implementers) and documents (relevant to authors and authoring tool implementers).
Conforming documents are those that comply with all the conformance criteria for documents. For readability, some of these conformance requirements are phrased as conformance requirements on authors; such requirements are implicitly requirements on documents: by definition, all documents are assumed to have had an author. (In some cases, that author may itself be a user agent — such user agents are subject to additional rules, as explained below.)
For example, if a requirement states that "authors must not
use the foobar
element", it would imply that documents are not allowed to
contain elements named foobar
.
There is no implied relationship between document conformance requirements and implementation conformance requirements. User agents are not free to handle non-conformant documents as they please; the processing model described in this specification applies to implementations regardless of the conformity of the input documents.
User agents fall into several (overlapping) categories with different conformance requirements.
Web browsers that support the XML syntax must process elements and attributes from the HTML namespace found in XML documents as described in this specification, so that users can interact with them, unless the semantics of those elements have been overridden by other specifications.
A conforming web browser would, upon finding a script
element in
an XML document, execute the script contained in that element. However, if the element is found
within a transformation expressed in XSLT (assuming the user agent also supports XSLT), then the
processor would instead treat the script
element as an opaque element that forms
part of the transform.
Web browsers that support the HTML syntax must process documents labeled with an HTML MIME type as described in this specification, so that users can interact with them.
User agents that support scripting must also be conforming implementations of the IDL fragments in this specification, as described in Web IDL. WEBIDL
Unless explicitly stated, specifications that override the semantics of HTML
elements do not override the requirements on DOM objects representing those elements. For
example, the script
element in the example above would still implement the
HTMLScriptElement
interface.
User agents that process HTML and XML documents purely to render non-interactive versions of them must comply to the same conformance criteria as web browsers, except that they are exempt from requirements regarding user interaction.
Typical examples of non-interactive presentation user agents are printers (static UAs) and overhead displays (dynamic UAs). It is expected that most static non-interactive presentation user agents will also opt to lack scripting support.
A non-interactive but dynamic presentation UA would still execute scripts, allowing forms to be dynamically submitted, and so forth. However, since the concept of "focus" is irrelevant when the user cannot interact with the document, the UA would not need to support any of the focus-related DOM APIs.
User agents, whether interactive or not, may be designated (possibly as a user option) as supporting the suggested default rendering defined by this specification.
This is not required. In particular, even user agents that do implement the suggested default rendering are encouraged to offer settings that override this default to improve the experience for the user, e.g. changing the color contrast, using different focus styles, or otherwise making the experience more accessible and usable to the user.
User agents that are designated as supporting the suggested default rendering must, while so designated, implement the rules the Rendering section defines as the behavior that user agents are expected to implement.
Implementations that do not support scripting (or which have their scripting features disabled entirely) are exempt from supporting the events and DOM interfaces mentioned in this specification. For the parts of this specification that are defined in terms of an events model or in terms of the DOM, such user agents must still act as if events and the DOM were supported.
Scripting can form an integral part of an application. Web browsers that do not support scripting, or that have scripting disabled, might be unable to fully convey the author's intent.
Conformance checkers must verify that a document conforms to the applicable conformance
criteria described in this specification. Automated conformance checkers are exempt from
detecting errors that require interpretation of the author's intent (for example, while a
document is non-conforming if the content of a blockquote
element is not a quote,
conformance checkers running without the input of human judgement do not have to check that
blockquote
elements only contain quoted material).
Conformance checkers must check that the input document conforms when parsed without a browsing context (meaning that no scripts are run, and that the parser's scripting flag is disabled), and should also check that the input document conforms when parsed with a browsing context in which scripts execute, and that the scripts never cause non-conforming states to occur other than transiently during script execution itself. (This is only a "SHOULD" and not a "MUST" requirement because it has been proven to be impossible. COMPUTABLE)
The term "HTML validator" can be used to refer to a conformance checker that itself conforms to the applicable requirements of this specification.
XML DTDs cannot express all the conformance requirements of this specification. Therefore, a validating XML processor and a DTD cannot constitute a conformance checker. Also, since neither of the two authoring formats defined in this specification are applications of SGML, a validating SGML system cannot constitute a conformance checker either.
To put it another way, there are three types of conformance criteria:
A conformance checker must check for the first two. A simple DTD-based validator only checks for the first class of errors and is therefore not a conforming conformance checker according to this specification.
Applications and tools that process HTML and XML documents for reasons other than to either render the documents or check them for conformance should act in accordance with the semantics of the documents that they process.
A tool that generates document outlines but increases the nesting level for each paragraph and does not increase the nesting level for headings would not be conforming.
Authoring tools and markup generators must generate conforming documents. Conformance criteria that apply to authors also apply to authoring tools, where appropriate.
Authoring tools are exempt from the strict requirements of using elements only for their specified purpose, but only to the extent that authoring tools are not yet able to determine author intent. However, authoring tools must not automatically misuse elements or encourage their users to do so.
For example, it is not conforming to use an address
element for
arbitrary contact information; that element can only be used for marking up contact information
for its nearest article
or body
element ancestor. However, since an
authoring tool is likely unable to determine the difference, an authoring tool is exempt from
that requirement. This does not mean, though, that authoring tools can use address
elements for any block of italics text (for instance); it just means that the authoring tool
doesn't have to verify that when the user uses a tool for inserting contact information for an
article
element, that the user really is doing that and not inserting something
else instead.
In terms of conformance checking, an editor has to output documents that conform to the same extent that a conformance checker will verify.
When an authoring tool is used to edit a non-conforming document, it may preserve the conformance errors in sections of the document that were not edited during the editing session (i.e. an editing tool is allowed to round-trip erroneous content). However, an authoring tool must not claim that the output is conformant if errors have been so preserved.
Authoring tools are expected to come in two broad varieties: tools that work from structure or semantic data, and tools that work on a What-You-See-Is-What-You-Get media-specific editing basis (WYSIWYG).
The former is the preferred mechanism for tools that author HTML, since the structure in the source information can be used to make informed choices regarding which HTML elements and attributes are most appropriate.
However, WYSIWYG tools are legitimate. WYSIWYG tools should use elements they know are
appropriate, and should not use elements that they do not know to be appropriate. This might in
certain extreme cases mean limiting the use of flow elements to just a few elements, like
div
, b
, i
, and span
and making liberal use
of the style
attribute.
All authoring tools, whether WYSIWYG or not, should make a best effort attempt at enabling users to create well-structured, semantically rich, media-independent content.
For compatibility with existing content and prior specifications, this specification describes two authoring formats: one based on XML, and one using a custom format inspired by SGML (referred to as the HTML syntax). Implementations must support at least one of these two formats, although supporting both is encouraged.
Some conformance requirements are phrased as requirements on elements, attributes, methods or objects. Such requirements fall into two categories: those describing content model restrictions, and those describing implementation behavior. Those in the former category are requirements on documents and authoring tools. Those in the second category are requirements on user agents. Similarly, some conformance requirements are phrased as requirements on authors; such requirements are to be interpreted as conformance requirements on the documents that authors produce. (In other words, this specification does not distinguish between conformance criteria on authors and conformance criteria on documents.)
This specification relies on several other underlying specifications.
The following terms are defined in Infra: INFRA
The Unicode character set is used to represent textual data, and Encoding defines requirements around character encodings. UNICODE
This specification introduces terminology based on the terms defined in those specifications, as described earlier.
The following terms are used as defined in Encoding: ENCODING
Implementations that support the XML syntax for HTML must support some version of XML, as well as its corresponding namespaces specification, because that syntax uses an XML serialization with namespaces. XML XMLNS
Data mining tools and other user agents that perform operations on content without running scripts, evaluating CSS or XPath expressions, or otherwise exposing the resulting DOM to arbitrary content, may "support namespaces" by just asserting that their DOM node analogues are in certain namespaces, without actually exposing the namespace strings.
In the HTML syntax, namespace prefixes and namespace declarations do not have the same effect as in XML. For instance, the colon has no special meaning in HTML element names.
The attribute with the name space
in the XML namespace is defined by
Extensible Markup Language (XML). XML
The Name
production is defined in XML.
XML
This specification also references the <?xml-stylesheet?>
processing instruction, defined in Associating Style Sheets with XML documents.
XMLSSPI
This specification also non-normatively mentions the XSLTProcessor
interface and its transformToFragment()
and transformToDocument()
methods.
XSLTP
The following terms are defined in URL: URL
application/x-www-form-urlencoded
formatapplication/x-www-form-urlencoded
serializerA number of schemes and protocols are referenced by this specification also:
about:
scheme
ABOUTblob:
scheme
FILEAPIdata:
scheme
RFC2397http:
scheme
HTTPhttps:
scheme
HTTPmailto:
scheme MAILTOsms:
scheme
SMSurn:
scheme
URNMedia fragment syntax is defined in Media Fragments URI. MEDIAFRAG
The following terms are defined in the HTTP specifications: HTTP
Accept
` headerAccept-Language
` headerCache-Control
` headerContent-Disposition
` headerContent-Language
` headerContent-Range
` headerLast-Modified
` headerRange
` headerReferer
` headerThe following terms are defined in HTTP State Management Mechanism: COOKIES
Cookie
` headerThe following term is defined in Web Linking: WEBLINK
Link
` headerLink
` field valueThe following terms are defined in Structured Field Values for HTTP: STRUCTURED-FIELDS
The following terms are defined in MIME Sniffing: MIMESNIFF
The following terms are defined in Fetch: FETCH
about:blank
User-Agent
` valueOrigin
` headerCross-Origin-Resource-Policy
` headerRequestCredentials
enumerationRequestDestination
enumerationfetch()
methodThe following terms are defined in Referrer Policy: REFERRERPOLICY
Referrer-Policy
` HTTP headerReferrer-Policy
` header algorithmno-referrer
",
"no-referrer-when-downgrade
",
"origin-when-cross-origin
", and
"unsafe-url
" referrer policiesThe following terms are defined in Mixed Content: MIX
The following terms are defined in Subresource Integrity: SRI
The following terms are defined in Paint Timing: PAINTTIMING
The following terms are defined in Navigation Timing: NAVIGATIONTIMING
NavigationTimingType
and its
"navigate
",
"reload
", and
"back_forward
" values.The following terms are defined in Resource Timing: RESOURCETIMING
The following terms are defined in Performance Timeline: PERFORMANCETIMELINE
PerformanceEntry
and its
name
,
entryType
,
startTime
, and
duration
attributes.The following terms are defined in Long Animation Frames: LONGANIMATIONFRAMES
The following terms are defined in Long Tasks: LONGTASKS
The IDL fragments in this specification must be interpreted as required for conforming IDL fragments, as described in Web IDL. WEBIDL
The following terms are defined in Web IDL:
[Global]
[LegacyFactoryFunction]
[LegacyLenientThis]
[LegacyNullToEmptyString]
[LegacyOverrideBuiltIns]
[LegacyTreatNonObjectAsNull]
[LegacyUnenumerableNamedProperties]
[LegacyUnforgeable]
Web IDL also defines the following types that are used in Web IDL fragments in this specification:
ArrayBuffer
ArrayBufferView
boolean
DOMString
double
Function
long
object
Promise
Uint8ClampedArray
unrestricted double
unsigned long
USVString
VoidFunction
The term throw in this
specification is used as defined in Web IDL. The DOMException
type and the following exception names are defined by Web IDL and used by this
specification:
IndexSizeError
"HierarchyRequestError
"InvalidCharacterError
"NoModificationAllowedError
"NotFoundError
"NotSupportedError
"InvalidStateError
"SyntaxError
"InvalidAccessError
"SecurityError
"NetworkError
"AbortError
"QuotaExceededError
"DataCloneError
"EncodingError
"NotAllowedError
"When this specification requires a user agent to create a Date
object
representing a particular time (which could be the special value Not-a-Number), the milliseconds
component of that time, if any, must be truncated to an integer, and the time value of the newly
created Date
object must represent the resulting truncated time.
For instance, given the time 23045 millionths of a second after 01:00 UTC on
January 1st 2000, i.e. the time 2000-01-01T00:00:00.023045Z, then the Date
object
created representing that time would represent the same time as that created representing the
time 2000-01-01T00:00:00.023Z, 45 millionths earlier. If the given time is NaN, then the result
is a Date
object that represents a time value NaN (indicating that the object does
not represent a specific instant of time).
Some parts of the language described by this specification only support JavaScript as the underlying scripting language. JAVASCRIPT
The term "JavaScript" is used to refer to ECMA-262, rather than the official term ECMAScript, since the term JavaScript is more widely known.
The following terms are defined in the JavaScript specification and used in this specification:
Atomics
objectAtomics.waitAsync
objectDate
classFinalizationRegistry
classRegExp
classSharedArrayBuffer
classSyntaxError
classTypeError
classRangeError
classWeakRef
classeval()
functionWeakRef.prototype.deref()
functionimport()
import.meta
typeof
operatordelete
operatorUsers agents that support JavaScript must also implement the Dynamic Code Brand Checks proposal. The following terms are defined there, and used in this specification: JSDYNAMICCODEBRANDCHECKS
Users agents that support JavaScript must also implement ECMAScript Internationalization API. JSINTL
User agents that support JavaScript must also implement the Import Attributes proposal. The following terms are defined there, and used in this specification: JSIMPORTATTRIBUTES
User agents that support JavaScript must also implement the JSON modules proposal. The following terms are defined there, and used in this specification: JSJSONMODULES
User agents that support JavaScript must also implement the Resizable ArrayBuffer and growable SharedArrayBuffer proposal. The following terms are defined there, and used in this specification: JSRESIZABLEBUFFERS
User agents that support JavaScript must also implement the Temporal proposal. The following terms are defined there, and used in this specification: JSTEMPORAL
The following term is defined in WebAssembly JavaScript Interface: WASMJS
WebAssembly.Module
The Document Object Model (DOM) is a representation — a model — of a document and its content. The DOM is not just an API; the conformance criteria of HTML implementations are defined, in this specification, in terms of operations on the DOM. DOM
Implementations must support DOM and the events defined in UI Events, because this specification is defined in terms of the DOM, and some of the features are defined as extensions to the DOM interfaces. DOM UIEVENTS
In particular, the following features are defined in DOM: DOM
Attr
interfaceCharacterData
interfaceComment
interfaceDOMImplementation
interfaceDocument
interface and its
doctype
attribute
DocumentOrShadowRoot
interfaceDocumentFragment
interfaceDocumentType
interfaceChildNode
interfaceElement
interfaceattachShadow()
method.Node
interfaceNodeList
interfaceProcessingInstruction
interfaceShadowRoot
interfaceText
interfaceRange
interfaceHTMLCollection
interface, its
length
attribute, and its
item()
and
namedItem()
methodsDOMTokenList
interface, and its
value
attribute and
supports
operationcreateDocument()
methodcreateHTMLDocument()
methodcreateElement()
methodcreateElementNS()
methodgetElementById()
methodgetElementsByClassName()
methodappend()
methodappendChild()
methodcloneNode()
methodimportNode()
methodpreventDefault()
methodid
attributesetAttribute()
methodtextContent
attributeslotchange
eventCharacterData
node and its
replace data algorithmEvent
interfaceEvent
and derived interfaces constructor behaviorEventTarget
interfaceEventInit
dictionary typetype
attributecurrentTarget
attributebubbles
attributecancelable
attributecomposed
attributeisTrusted
attributeinitEvent()
methodaddEventListener()
methodEventListener
callback interfaceDocument
Node
, and the concept of
cloning steps used by that algorithmis
valueMutationObserver
interface and mutation observers in generalAbortController
and its
signalAbortSignal
The following features are defined in UI Events: UIEVENTS
MouseEvent
interfaceMouseEvent
interface's relatedTarget
attributeMouseEventInit
dictionary typeFocusEvent
interfaceFocusEvent
interface's relatedTarget
attributeUIEvent
interfaceUIEvent
interface's view
attributeauxclick
eventbeforeinput
eventclick
eventcontextmenu
eventdblclick
eventinput
eventmousedown
eventmouseenter
eventmouseleave
eventmousemove
eventmouseout
eventmouseover
eventmouseup
eventwheel
eventkeydown
eventkeypress
eventkeyup
eventThe following features are defined in Touch Events: TOUCH
Touch
interfacetouchend
eventThe following features are defined in Pointer Events: POINTEREVENTS
PointerEvent
interfacePointerEvent
interface's pointerType
attributepointerdown
eventpointerup
eventpointercancel
eventThe following events are defined in Clipboard API and events: CLIPBOARD-APIS
copy
eventcut
eventpaste
eventThis specification sometimes uses the term name to refer to the event's
type; as in, "an event named click
" or "if the event name is keypress
". The terms
"name" and "type" for events are synonymous.
The following features are defined in DOM Parsing and Serialization: DOMPARSING
XML serialization
The following features are defined in Selection API: SELECTION
Selection
User agents are encouraged to implement the features described in execCommand. EXECCOMMAND
The following features are defined in Fullscreen API: FULLSCREEN
requestFullscreen()
fullscreenchange
High Resolution Time provides the following features: HRT
DOMHighResTimeStamp
This specification uses the following features defined in File API: FILEAPI
Blob
interface and its
type
attributeFile
interface and its
name
and
lastModified
attributesFileList
interfaceBlob
's snapshot stateThe following terms are defined in Indexed Database API: INDEXEDDB
IDBVersionChangeEvent
The following terms are defined in Media Source Extensions: MEDIASOURCE
MediaSource
interfaceThe following terms are defined in Media Capture and Streams: MEDIASTREAM
MediaStream
interfaceMediaStreamTrack
getUserMedia()
The following terms are defined in Reporting: REPORTING
ReportingObserver
sThe following features and terms are defined in XMLHttpRequest: XHR
XMLHttpRequest
interface, and its
responseXML
attributeProgressEvent
interface, and its
lengthComputable
,
loaded
, and
total
attributesFormData
interface, and its associated
entry listThe following features are defined in Battery Status API: BATTERY
getBattery()
methodImplementations must support Media Queries. The <media-condition> feature is defined therein. MQ
While support for CSS as a whole is not required of implementations of this specification (though it is encouraged, at least for web browsers), some features are defined in terms of specific CSS requirements.
When this specification requires that something be parsed according to a particular CSS grammar, the relevant algorithm in CSS Syntax must be followed, including error handling rules. CSSSYNTAX
For example, user agents are required to close all open constructs upon
finding the end of a style sheet unexpectedly. Thus, when parsing the string "rgb(0,0,0
" (with a missing close-parenthesis) for a color value, the close
parenthesis is implied by this error handling rule, and a value is obtained (the color 'black').
However, the similar construct "rgb(0,0,
" (with both a missing
parenthesis and a missing "blue" value) cannot be parsed, as closing the open construct does not
result in a viable value.
The following terms and features are defined in Cascading Style Sheets (CSS): CSS
The basic version of the 'display' property is defined in CSS, and the property is extended by other CSS modules. CSS CSSRUBY CSSTABLE
The following terms and features are defined in CSS Box Model: CSSBOX
The following features are defined in CSS Logical Properties: CSSLOGICAL
The following terms and features are defined in CSS Color: CSSCOLOR
The following terms are defined in CSS Images: CSSIMAGES
The term paint source is used as defined in CSS Images Level 4 to define the interaction of certain HTML elements with the CSS 'element()' function. CSSIMAGES4
The following features are defined in CSS Backgrounds and Borders: CSSBG
CSS Backgrounds and Borders also defines the following border properties: CSSBG
Top | Bottom | Left | Right | |
---|---|---|---|---|
Width | 'border-top-width' | 'border-bottom-width' | 'border-left-width' | 'border-right-width' |
Style | 'border-top-style' | 'border-bottom-style' | 'border-left-style' | 'border-right-style' |
Color | 'border-top-color' | 'border-bottom-color' | 'border-left-color' | 'border-right-color' |
The following features are defined in CSS Box Alignment: CSSALIGN
The following terms and features are defined in CSS Display: CSSDISPLAY
The following features are defined in CSS Flexible Box Layout: CSSFLEXBOX
The following terms and features are defined in CSS Fonts: CSSFONTS
The following features are defined in CSS Grid Layout: CSSGRID
The following terms are defined in CSS Inline Layout: CSSINLINE
The following terms and features are defined in CSS Box Sizing: CSSSIZING
The following features are defined in CSS Lists and Counters. CSSLISTS
The following features are defined in CSS Overflow. CSSOVERFLOW
The following terms and features are defined in CSS Positioned Layout: CSSPOSITION
The following features are defined in CSS Multi-column Layout. CSSMULTICOL
The 'ruby-base' value of the 'display' property is defined in CSS Ruby Layout. CSSRUBY
The following features are defined in CSS Table: CSSTABLE
The following features are defined in CSS Text: CSSTEXT
The following features are defined in CSS Writing Modes: CSSWM
The following features are defined in CSS Basic User Interface: CSSUI
The algorithm to update animations and send events is defined in Web Animations. WEBANIMATIONS
Implementations that support scripting must support the CSS Object Model. The following features and terms are defined in the CSSOM specifications: CSSOM CSSOMVIEW
Screen
interfaceLinkStyle
interfaceCSSStyleDeclaration
interfacestyle
IDL attributecssText
attribute of CSSStyleDeclaration
StyleSheet
interfaceCSSStyleSheet
interfaceCSSStyleSheet
CSSStyleSheet
resize
eventscroll
eventscrollend
eventThe following features and terms are defined in CSS Syntax: CSSSYNTAX
The following terms are defined in Selectors: SELECTORS
:focus-visible
pseudo-classThe following features are defined in CSS Values and Units: CSSVALUES
The following features are defined in CSS View Transitions: CSSVIEWTRANSITIONS
ViewTransition
The term style attribute is defined in CSS Style Attributes. CSSATTR
The following terms are defined in the CSS Cascading and Inheritance: CSSCASCADE
The CanvasRenderingContext2D
object's use of fonts depends on the features
described in the CSS Fonts and Font Loading specifications, including
in particular FontFace
objects and the font source concept.
CSSFONTS CSSFONTLOAD
The following interfaces and terms are defined in Geometry Interfaces: GEOMETRY
DOMMatrix
interface, and associated
m11 element,
m12 element,
m21 element,
m22 element,
m41 element, and
m42 elementDOMMatrix2DInit
and
DOMMatrixInit
dictionariesDOMMatrix
from a dictionary
and create a DOMMatrix
from a 2D dictionary
algorithms for DOMMatrix2DInit
or DOMMatrixInit
DOMPointInit
dictionary, and associated
x and
y membersThe following terms are defined in the CSS Scoping: CSSSCOPING
The following terms and features are defined in CSS Color Adjustment: CSSCOLORADJUST
The following terms are defined in CSS Pseudo-Elements: CSSPSEUDO
The following terms are defined in CSS Containment: CSSCONTAIN
The following terms are defined in CSS Anchor Positioning: CSSANCHOR
The following term is defined in Intersection Observer: INTERSECTIONOBSERVER
IntersectionObserver
IntersectionObserverInit
observe
unobserve
isIntersecting
target
The following terms are defined in Resize Observer: RESIZEOBSERVER
The following interfaces are defined in the WebGL specifications: WEBGL
WebGLRenderingContext
interfaceWebGL2RenderingContext
interfaceWebGLContextAttributes
dictionaryThe following interfaces are defined in WebGPU: WEBGPU
GPUCanvasContext
interfaceImplementations may support WebVTT as a text track format for subtitles, captions, metadata, etc., for media resources. WEBVTT
The following terms, used in this specification, are defined in WebVTT:
VTTCue
interfaceThe role
attribute is defined in
Accessible Rich Internet Applications (ARIA), as are the following
roles: ARIA
button
presentation
In addition, the following aria-*
content
attributes are defined in ARIA: ARIA
aria-checked
aria-describedby
aria-disabled
aria-label
Finally, the following terms are defined ARIA: ARIA
ARIAMixin
interface, with its associated
ARIAMixin
getter steps and
ARIAMixin
setter steps hooksThe following terms are defined in Content Security Policy: CSP
report-uri
directiveframe-ancestors
directivesandbox
directiveSecurityPolicyViolationEvent
interfacesecuritypolicyviolation
eventThe following terms are defined in Service Workers: SW
ServiceWorker
interfaceServiceWorkerContainer
interfaceServiceWorkerGlobalScope
interfaceunregister
The following algorithms are defined in Secure Contexts: SECURE-CONTEXTS
The following terms are defined in Permissions Policy: PERMISSIONSPOLICY
The following feature is defined in Payment Request API: PAYMENTREQUEST
PaymentRequest
interfaceWhile support for MathML as a whole is not required by this specification (though it is encouraged, at least for web browsers), certain features depend upon small parts of MathML being implemented. MATHML
The following features are defined in Mathematical Markup Language (MathML):
annotation-xml
elementmath
elementmerror
elementmi
elementmn
elementmo
elementms
elementmtext
elementWhile support for SVG as a whole is not required by this specification (though it is encouraged, at least for web browsers), certain features depend upon parts of SVG being implemented.
User agents that implement SVG must implement the SVG 2 specification, and not any earlier revisions.
The following features are defined in the SVG 2 specification: SVG
SVGElement
interfaceSVGImageElement
interfaceSVGScriptElement
interfaceSVGSVGElement
interfacea
elementdesc
elementforeignObject
elementimage
elementscript
elementsvg
elementtitle
elementuse
elementtext-rendering
propertyThe following features are defined in Filter Effects: FILTERS
The following features are defined in Compositing and Blending: COMPOSITE
The following features are defined in Cooperative Scheduling of Background Tasks: REQUESTIDLECALLBACK
requestIdleCallback()
The following terms are defined in Screen Orientation: SCREENORIENTATION
The following terms are defined in Storage: STORAGE
The following features are defined in Web App Manifest: MANIFEST
The following terms are defined in WebAssembly JavaScript Interface: ESM Integration: WASMESM
The following features are defined in WebCodecs: WEBCODECS
VideoFrame
interface.The following terms are defined in WebDriver: WEBDRIVER
The following terms are defined in WebDriver BiDi: WEBDRIVERBIDI
The following terms are defined in Web Cryptography API: WEBCRYPTO
The following terms are defined in WebSockets: WEBSOCKETS
WebSocket
The following terms are defined in WebTransport: WEBTRANSPORT
WebTransport
context cleanup steps
The following terms are defined in Web Authentication: An API for accessing Public Key Credentials: WEBAUTHN
The following terms are defined in Credential Management: CREDMAN
navigator.credentials.get()
The following terms are defined in Console: CONSOLE
The following terms are defined in Web Locks API: WEBLOCKS
This specification uses the following features defined in Trusted Types: TRUSTED-TYPES
TrustedHTML
TrustedScript
data
TrustedScriptURL
The following terms are defined in WebRTC API: WEBRTC
RTCDataChannel
RTCPeerConnection
The following terms are defined in Picture-in-Picture API: PICTUREINPICTURE
PictureInPictureWindow
The following terms are defined in Idle Detection API:
IdleDetector
The following terms are defined in Web Speech API:
SpeechRecognition
The following terms are defined in WebOTP API:
OTPCredential
The following terms are defined in Web Share API:
The following terms are defined in Web Smart Card API:
SmartCardConnection
The following terms are defined in Web Background Synchronization:
SyncManager
register()
The following terms are defined in Web Periodic Background Synchronization:
PeriodicSyncManager
register()
The following terms are defined in Background Fetch:
BackgroundFetchManager
fetch()
The following terms are defined in Keyboard Lock:
Keyboard
lock()
The following terms are defined in Web MIDI API:
requestMIDIAccess()
The following terms are defined in Generic Sensor API:
The following terms are defined in WebHID API:
requestDevice
The following terms are defined in WebXR Device API:
XRSystem
This specification does not require support of any particular network protocol, style sheet language, scripting language, or any of the DOM specifications beyond those required in the list above. However, the language described by this specification is biased towards CSS as the styling language, JavaScript as the scripting language, and HTTP as the network protocol, and several features assume that those languages and protocols are in use.
A user agent that implements the HTTP protocol must implement HTTP State Management Mechanism (Cookies) as well. HTTP COOKIES
This specification might have certain additional requirements on character encodings, image formats, audio formats, and video formats in the respective sections.
Vendor-specific proprietary user agent extensions to this specification are strongly discouraged. Documents must not use such extensions, as doing so reduces interoperability and fragments the user base, allowing only users of specific user agents to access the content in question.
All extensions must be defined so that the use of extensions neither contradicts nor causes the non-conformance of functionality defined in the specification.
For example, while strongly discouraged from doing so, an implementation could add a new IDL
attribute "typeTime
" to a control that returned the time it took the user
to select the current value of a control (say). On the other hand, defining a new control that
appears in a form's elements
array would be in violation
of the above requirement, as it would violate the definition of elements
given in this specification.
When vendor-neutral extensions to this specification are needed, either this specification can be updated accordingly, or an extension specification can be written that overrides the requirements in this specification. When someone applying this specification to their activities decides that they will recognize the requirements of such an extension specification, it becomes an applicable specification for the purposes of conformance requirements in this specification.
Someone could write a specification that defines any arbitrary byte stream as conforming, and then claim that their random junk is conforming. However, that does not mean that their random junk actually is conforming for everyone's purposes: if someone else decides that that specification does not apply to their work, then they can quite legitimately say that the aforementioned random junk is just that, junk, and not conforming at all. As far as conformance goes, what matters in a particular community is what that community agrees is applicable.
User agents must treat elements and attributes that they do not understand as semantically neutral; leaving them in the DOM (for DOM processors), and styling them according to CSS (for CSS processors), but not inferring any meaning from them.
When support for a feature is disabled (e.g. as an emergency measure to mitigate a security problem, or to aid in development, or for performance reasons), user agents must act as if they had no support for the feature whatsoever, and as if the feature was not mentioned in this specification. For example, if a particular feature is accessed via an attribute in a Web IDL interface, the attribute itself would be omitted from the objects that implement that interface — leaving the attribute on the object but making it return null or throw an exception is insufficient.
Implementations of XPath 1.0 that operate on HTML
documents parsed or created in the manners described in this specification (e.g. as part of
the document.evaluate()
API) must act as if the following edit was applied
to the XPath 1.0 specification.
First, remove this paragraph:
A QName in the node test is expanded into an expanded-name using the namespace declarations from the expression context. This is the same way expansion is done for element type names in start and end-tags except that the default namespace declared with
xmlns
is not used: if the QName does not have a prefix, then the namespace URI is null (this is the same way attribute names are expanded). It is an error if the QName has a prefix for which there is no namespace declaration in the expression context.
Then, insert in its place the following:
A QName in the node test is expanded into an expanded-name using the namespace declarations from the expression context. If the QName has a prefix, then there must be a namespace declaration for this prefix in the expression context, and the corresponding namespace URI is the one that is associated with this prefix. It is an error if the QName has a prefix for which there is no namespace declaration in the expression context.
If the QName has no prefix and the principal node type of the axis is element, then the default element namespace is used. Otherwise, if the QName has no prefix, the namespace URI is null. The default element namespace is a member of the context for the XPath expression. The value of the default element namespace when executing an XPath expression through the DOM3 XPath API is determined in the following way:
- If the context node is from an HTML DOM, the default element namespace is "http://www.w3.org/1999/xhtml".
- Otherwise, the default element namespace URI is null.
This is equivalent to adding the default element namespace feature of XPath 2.0 to XPath 1.0, and using the HTML namespace as the default element namespace for HTML documents. It is motivated by the desire to have implementations be compatible with legacy HTML content while still supporting the changes that this specification introduces to HTML regarding the namespace used for HTML elements, and by the desire to use XPath 1.0 rather than XPath 2.0.
This change is a willful violation of the XPath 1.0 specification, motivated by desire to have implementations be compatible with legacy content while still supporting the changes that this specification introduces to HTML regarding which namespace is used for HTML elements. XPATH10
XSLT 1.0 processors outputting to a DOM when the output method is "html" (either explicitly or via the defaulting rule in XSLT 1.0) are affected as follows:
If the transformation program outputs an element in no namespace, the processor must, prior to constructing the corresponding DOM element node, change the namespace of the element to the HTML namespace, ASCII-lowercase the element's local name, and ASCII-lowercase the names of any non-namespaced attributes on the element.
This requirement is a willful violation of the XSLT 1.0 specification, required because this specification changes the namespaces and case-sensitivity rules of HTML in a manner that would otherwise be incompatible with DOM-based XSLT transformations. (Processors that serialize the output are unaffected.) XSLT10
This specification does not specify precisely how XSLT processing interacts with the HTML
parser infrastructure (for example, whether an XSLT processor acts as if it puts any
elements into a stack of open elements). However, XSLT processors must stop
parsing if they successfully complete, and must update the current document
readiness first to "interactive
" and then to "complete
" if they are aborted.
This specification does not specify how XSLT interacts with the navigation algorithm, how it fits in with the event loop, nor how error pages are to be handled (e.g. whether XSLT errors are to replace an incremental XSLT output, or are rendered inline, etc.).
There are also additional non-normative comments regarding the interaction of XSLT
and HTML in the script
element section, and of
XSLT, XPath, and HTML in the template
element
section.
This document defines the following policy-controlled features:
autoplay
", which has a default allowlist of 'self'
.cross-origin-isolated
", which has a default allowlist of 'self'
.There are various places in HTML that accept particular data types, such as dates or numbers. This section describes what the conformance criteria for content in those formats is, and how to parse them.
Implementers are strongly urged to carefully examine any third-party libraries they might consider using to implement the parsing of syntaxes described below. For example, date libraries are likely to implement error handling behavior that differs from what is required in this specification, since error-handling behavior is often not defined in specifications that describe date syntaxes similar to those used in this specification, and thus implementations tend to vary greatly in how they handle errors.
Some of the micro-parsers described below follow the pattern of having an input variable that holds the string being parsed, and having a position variable pointing at the next character to parse in input.
A number of attributes are boolean attributes. The presence of a boolean attribute on an element represents the true value, and the absence of the attribute represents the false value.
If the attribute is present, its value must either be the empty string or a value that is an ASCII case-insensitive match for the attribute's canonical name, with no leading or trailing whitespace.
The values "true" and "false" are not allowed on boolean attributes. To represent a false value, the attribute has to be omitted altogether.
Here is an example of a checkbox that is checked and disabled. The checked
and disabled
attributes are the boolean attributes.
<label><input type=checkbox checked name=cheese disabled> Cheese</label>
This could be equivalently written as this:
<label><input type=checkbox checked=checked name=cheese disabled=disabled> Cheese</label>
You can also mix styles; the following is still equivalent:
<label><input type='checkbox' checked name=cheese disabled=""> Cheese</label>
Some attributes, called enumerated attributes, take on a finite set of states. The state for such an attribute is derived by combining the attribute's value, a set of keyword/state mappings given in the specification of each attribute, and two possible special states that can also be given in the specification of the attribute. These special states are the invalid value default and the missing value default.
Multiple keywords can map to the same state.
The empty string can be a valid keyword. Note that the missing value default applies only when the attribute is missing, not when it is present with an empty string value.
To determine the state of an attribute, use the following steps:
If the attribute is not specified:
If the attribute has a missing value default state defined, then return that missing value default state.
Otherwise, return no state.
If the attribute's value is an ASCII case-insensitive match for one of the keywords defined for the attribute, then return the state represented by that keyword.
If the attribute has an invalid value default state defined, then return that invalid value default state.
Return no state.
For authoring conformance purposes, if an enumerated attribute is specified, the attribute's value must be an ASCII case-insensitive match for one of the conforming keywords for that attribute, with no leading or trailing whitespace.
For reflection purposes, states which have any keywords mapping to them are said to have a canonical keyword. This is determined as follows:
If there is only one keyword mapping to the given state, then it is that keyword.
If there is only one conforming keyword mapping to the given state, then it is that conforming keyword.
Otherwise, the canonical keyword for the state will be explicitly given in the specification for the attribute.
A string is a valid integer if it consists of one or more ASCII digits, optionally prefixed with a U+002D HYPHEN-MINUS character (-).
A valid integer without a U+002D HYPHEN-MINUS (-) prefix represents the number that is represented in base ten by that string of digits. A valid integer with a U+002D HYPHEN-MINUS (-) prefix represents the number represented in base ten by the string of digits that follows the U+002D HYPHEN-MINUS, subtracted from zero.
The rules for parsing integers are as given in the following algorithm. When invoked, the steps must be followed in the order given, aborting at the first step that returns a value. This algorithm will return either an integer or an error.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Let sign have the value "positive".
Skip ASCII whitespace within input given position.
If position is past the end of input, return an error.
If the character indicated by position (the first character) is a U+002D HYPHEN-MINUS character (-):
Otherwise, if the character indicated by position (the first character) is a U+002B PLUS SIGN character (+):
+
" is
ignored, but it is not conforming.)If the character indicated by position is not an ASCII digit, then return an error.
Collect a sequence of code points that are ASCII digits from input given position, and interpret the resulting sequence as a base-ten integer. Let value be that integer.
If sign is "positive", return value, otherwise return the result of subtracting value from zero.
A string is a valid non-negative integer if it consists of one or more ASCII digits.
A valid non-negative integer represents the number that is represented in base ten by that string of digits.
The rules for parsing non-negative integers are as given in the following algorithm. When invoked, the steps must be followed in the order given, aborting at the first step that returns a value. This algorithm will return either zero, a positive integer, or an error.
Let input be the string being parsed.
Let value be the result of parsing input using the rules for parsing integers.
If value is an error, return an error.
If value is less than zero, return an error.
Return value.
A string is a valid floating-point number if it consists of:
Optionally, a U+002D HYPHEN-MINUS character (-).
One or both of the following, in the given order:
A series of one or more ASCII digits.
Both of the following, in the given order:
A single U+002E FULL STOP character (.).
A series of one or more ASCII digits.
Optionally:
Either a U+0065 LATIN SMALL LETTER E character (e) or a U+0045 LATIN CAPITAL LETTER E character (E).
Optionally, a U+002D HYPHEN-MINUS character (-) or U+002B PLUS SIGN character (+).
A series of one or more ASCII digits.
A valid floating-point number represents the number obtained by multiplying the significand by ten raised to the power of the exponent, where the significand is the first number, interpreted as base ten (including the decimal point and the number after the decimal point, if any, and interpreting the significand as a negative number if the whole string starts with a U+002D HYPHEN-MINUS character (-) and the number is not zero), and where the exponent is the number after the E, if any (interpreted as a negative number if there is a U+002D HYPHEN-MINUS character (-) between the E and the number and the number is not zero, or else ignoring a U+002B PLUS SIGN character (+) between the E and the number if there is one). If there is no E, then the exponent is treated as zero.
The Infinity and Not-a-Number (NaN) values are not valid floating-point numbers.
The valid floating-point number concept is typically only used to
restrict what is allowed for authors, while the user agent requirements use the rules for
parsing floating-point number values below (e.g., the max
attribute of the progress
element). However, in
some cases the user agent requirements include checking if a string is a valid
floating-point number (e.g., the value sanitization algorithm for the Number state of the input
element, or the
parse a srcset attribute algorithm).
The best representation of the number n as a floating-point number is the string obtained from running ToString(n). The abstract operation ToString is not uniquely determined. When there are multiple possible strings that could be obtained from ToString for a particular value, the user agent must always return the same string for that value (though it may differ from the value used by other user agents).
The rules for parsing floating-point number values are as given in the following algorithm. This algorithm must be aborted at the first step that returns something. This algorithm will return either a number or an error.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Let value have the value 1.
Let divisor have the value 1.
Let exponent have the value 1.
Skip ASCII whitespace within input given position.
If position is past the end of input, return an error.
If the character indicated by position is a U+002D HYPHEN-MINUS character (-):
Otherwise, if the character indicated by position (the first character) is a U+002B PLUS SIGN character (+):
+
"
is ignored, but it is not conforming.)If the character indicated by position is a U+002E FULL STOP (.), and that is not the last character in input, and the character after the character indicated by position is an ASCII digit, then set value to zero and jump to the step labeled fraction.
If the character indicated by position is not an ASCII digit, then return an error.
Collect a sequence of code points that are ASCII digits from input given position, and interpret the resulting sequence as a base-ten integer. Multiply value by that integer.
Fraction: If the character indicated by position is a U+002E FULL STOP (.), run these substeps:
Advance position to the next character.
If position is past the end of input, or if the character indicated by position is not an ASCII digit, U+0065 LATIN SMALL LETTER E (e), or U+0045 LATIN CAPITAL LETTER E (E), then jump to the step labeled conversion.
If the character indicated by position is a U+0065 LATIN SMALL LETTER E character (e) or a U+0045 LATIN CAPITAL LETTER E character (E), skip the remainder of these substeps.
Fraction loop: Multiply divisor by ten.
Advance position to the next character.
If position is past the end of input, then jump to the step labeled conversion.
If the character indicated by position is an ASCII digit, jump back to the step labeled fraction loop in these substeps.
If the character indicated by position is U+0065 (e) or a U+0045 (E), then:
Advance position to the next character.
If position is past the end of input, then jump to the step labeled conversion.
If the character indicated by position is a U+002D HYPHEN-MINUS character (-):
If position is past the end of input, then jump to the step labeled conversion.
Otherwise, if the character indicated by position is a U+002B PLUS SIGN character (+):
If position is past the end of input, then jump to the step labeled conversion.
If the character indicated by position is not an ASCII digit, then jump to the step labeled conversion.
Collect a sequence of code points that are ASCII digits from input given position, and interpret the resulting sequence as a base-ten integer. Multiply exponent by that integer.
Multiply value by ten raised to the exponentth power.
Conversion: Let S be the set of finite IEEE 754 double-precision floating-point values except −0, but with two special values added: 21024 and −21024.
Let rounded-value be the number in S that is closest to value, selecting the number with an even significand if there are two equally close values. (The two special values 21024 and −21024 are considered to have even significands for this purpose.)
If rounded-value is 21024 or −21024, return an error.
Return rounded-value.
The rules for parsing dimension values are as given in the following algorithm. When invoked, the steps must be followed in the order given, aborting at the first step that returns a value. This algorithm will return either a number greater than or equal to 0.0, or failure; if a number is returned, then it is further categorized as either a percentage or a length.
Let input be the string being parsed.
Let position be a position variable for input, initially pointing at the start of input.
Skip ASCII whitespace within input given position.
If position is past the end of input or the code point at position within input is not an ASCII digit, then return failure.
Collect a sequence of code points that are ASCII digits from input given position, and interpret the resulting sequence as a base-ten integer. Let value be that number.
If position is past the end of input, then return value as a length.
If the code point at position within input is U+002E (.), then:
Advance position by 1.
If position is past the end of input or the code point at position within input is not an ASCII digit, then return the current dimension value with value, input, and position.
Let divisor have the value 1.
While true:
Multiply divisor by ten.
Add the value of the code point at position within input, interpreted as a base-ten digit (0..9) and divided by divisor, to value.
Advance position by 1.
If position is past the end of input, then return value as a length.
If the code point at position within input is not an ASCII digit, then break.
Return the current dimension value with value, input, and position.
The current dimension value, given value, input, and position, is determined as follows:
If position is past the end of input, then return value as a length.
If the code point at position within input is U+0025 (%), then return value as a percentage.
Return value as a length.
The rules for parsing nonzero dimension values are as given in the following algorithm. When invoked, the steps must be followed in the order given, aborting at the first step that returns a value. This algorithm will return either a number greater than 0.0, or an error; if a number is returned, then it is further categorized as either a percentage or a length.
Let input be the string being parsed.
Let value be the result of parsing input using the rules for parsing dimension values.
If value is an error, return an error.
If value is zero, return an error.
If value is a percentage, return value as a percentage.
Return value as a length.
A valid list of floating-point numbers is a number of valid floating-point numbers separated by U+002C COMMA characters, with no other characters (e.g. no ASCII whitespace). In addition, there might be restrictions on the number of floating-point numbers that can be given, or on the range of values allowed.
The rules for parsing a list of floating-point numbers are as follows:
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Let numbers be an initially empty list of floating-point numbers. This list will be the result of this algorithm.
Collect a sequence of code points that are ASCII whitespace, U+002C COMMA, or U+003B SEMICOLON characters from input given position. This skips past any leading delimiters.
While position is not past the end of input:
Collect a sequence of code points that are not ASCII whitespace, U+002C COMMA, U+003B SEMICOLON, ASCII digits, U+002E FULL STOP, or U+002D HYPHEN-MINUS characters from input given position. This skips past leading garbage.
Collect a sequence of code points that are not ASCII whitespace, U+002C COMMA, or U+003B SEMICOLON characters from input given position, and let unparsed number be the result.
Let number be the result of parsing unparsed number using the rules for parsing floating-point number values.
If number is an error, set number to zero.
Append number to numbers.
Collect a sequence of code points that are ASCII whitespace, U+002C COMMA, or U+003B SEMICOLON characters from input given position. This skips past the delimiter.
Return numbers.
The rules for parsing a list of dimensions are as follows. These rules return a list of zero or more pairs consisting of a number and a unit, the unit being one of percentage, relative, and absolute.
Let raw input be the string being parsed.
If the last character in raw input is a U+002C COMMA character (,), then remove that character from raw input.
Split the string raw input on commas. Let raw tokens be the resulting list of tokens.
Let result be an empty list of number/unit pairs.
For each token in raw tokens, run the following substeps:
Let input be the token.
Let position be a pointer into input, initially pointing at the start of the string.
Let value be the number 0.
Let unit be absolute.
If position is past the end of input, set unit to relative and jump to the last substep.
If the character at position is an ASCII digit, collect a sequence of code points that are ASCII digits from input given position, interpret the resulting sequence as an integer in base ten, and increment value by that integer.
If the character at position is U+002E (.), then:
Collect a sequence of code points consisting of ASCII whitespace and ASCII digits from input given position. Let s be the resulting sequence.
Remove all ASCII whitespace in s.
If s is not the empty string, then:
Let length be the number of characters in s (after the spaces were removed).
Let fraction be the result of interpreting s as a base-ten integer, and then dividing that number by 10length.
Increment value by fraction.
Skip ASCII whitespace within input given position.
If the character at position is a U+0025 PERCENT SIGN character (%), then set unit to percentage.
Otherwise, if the character at position is a U+002A ASTERISK character (*), then set unit to relative.
Add an entry to result consisting of the number given by value and the unit given by unit.
Return the list result.
In the algorithms below, the number of days in month month of year year is: 31 if month is 1, 3, 5, 7, 8, 10, or 12; 30 if month is 4, 6, 9, or 11; 29 if month is 2 and year is a number divisible by 400, or if year is a number divisible by 4 but not by 100; and 28 otherwise. This takes into account leap years in the Gregorian calendar. GREGORIAN
When ASCII digits are used in the date and time syntaxes defined in this section, they express numbers in base ten.
While the formats described here are intended to be subsets of the corresponding ISO8601 formats, this specification defines parsing rules in much more detail than ISO8601. Implementers are therefore encouraged to carefully examine any date parsing libraries before using them to implement the parsing rules described below; ISO8601 libraries might not parse dates and times in exactly the same manner. ISO8601
Where this specification refers to the proleptic Gregorian calendar, it means the modern Gregorian calendar, extrapolated backwards to year 1. A date in the proleptic Gregorian calendar, sometimes explicitly referred to as a proleptic-Gregorian date, is one that is described using that calendar even if that calendar was not in use at the time (or place) in question. GREGORIAN
The use of the Gregorian calendar as the wire format in this specification is an
arbitrary choice resulting from the cultural biases of those involved in the decision. See also
the section discussing date, time, and number formats in forms
(for authors), implementation notes regarding
localization of form controls, and the time
element.
A month consists of a specific proleptic-Gregorian date with no time-zone information and no date information beyond a year and a month. GREGORIAN
A string is a valid month string representing a year year and month month if it consists of the following components in the given order:
The rules to parse a month string are as follows. This will return either a year and month, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Parse a month component to obtain year and month. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
Return year and month.
The rules to parse a month component, given an input string and a position, are as follows. This will return either a year and a month, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not at least four characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the year.
If year is not a number greater than zero, then fail.
If position is beyond the end of input or if the character at position is not a U+002D HYPHEN-MINUS character, then fail. Otherwise, move position forwards one character.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the month.
If month is not a number in the range 1 ≤ month ≤ 12, then fail.
Return year and month.
A date consists of a specific proleptic-Gregorian date with no time-zone information, consisting of a year, a month, and a day. GREGORIAN
A string is a valid date string representing a year year, month month, and day day if it consists of the following components in the given order:
The rules to parse a date string are as follows. This will return either a date, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Parse a date component to obtain year, month, and day. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
Let date be the date with year year, month month, and day day.
Return date.
The rules to parse a date component, given an input string and a position, are as follows. This will return either a year, a month, and a day, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Parse a month component to obtain year and month. If this returns nothing, then fail.
Let maxday be the number of days in month month of year year.
If position is beyond the end of input or if the character at position is not a U+002D HYPHEN-MINUS character, then fail. Otherwise, move position forwards one character.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the day.
If day is not a number in the range 1 ≤ day ≤ maxday, then fail.
Return year, month, and day.
A yearless date consists of a Gregorian month and a day within that month, but with no associated year. GREGORIAN
A string is a valid yearless date string representing a month month and a day day if it consists of the following components in the given order:
In other words, if the month is "02
",
meaning February, then the day can be 29, as if the year was a leap year.
The rules to parse a yearless date string are as follows. This will return either a month and a day, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Parse a yearless date component to obtain month and day. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
Return month and day.
The rules to parse a yearless date component, given an input string and a position, are as follows. This will return either a month and a day, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Collect a sequence of code points that are U+002D HYPHEN-MINUS characters (-) from input given position. If the collected sequence is not exactly zero or two characters long, then fail.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the month.
If month is not a number in the range 1 ≤ month ≤ 12, then fail.
Let maxday be the number of days in month month of any arbitrary leap year (e.g. 4 or 2000).
If position is beyond the end of input or if the character at position is not a U+002D HYPHEN-MINUS character, then fail. Otherwise, move position forwards one character.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the day.
If day is not a number in the range 1 ≤ day ≤ maxday, then fail.
Return month and day.
A time consists of a specific time with no time-zone information, consisting of an hour, a minute, a second, and a fraction of a second.
A string is a valid time string representing an hour hour, a minute minute, and a second second if it consists of the following components in the given order:
The second component cannot be 60 or 61; leap seconds cannot be represented.
The rules to parse a time string are as follows. This will return either a time, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Parse a time component to obtain hour, minute, and second. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
Let time be the time with hour hour, minute minute, and second second.
Return time.
The rules to parse a time component, given an input string and a position, are as follows. This will return either an hour, a minute, and a second, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the hour.
If position is beyond the end of input or if the character at position is not a U+003A COLON character, then fail. Otherwise, move position forwards one character.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the minute.
Let second be 0.
If position is not beyond the end of input and the character at position is U+003A (:), then:
Advance position to the next character in input.
If position is beyond the end of input, or at the last character in input, or if the next two characters in input starting at position are not both ASCII digits, then fail.
Collect a sequence of code points that are either ASCII digits or U+002E FULL STOP characters from input given position. If the collected sequence is three characters long, or if it is longer than three characters long and the third character is not a U+002E FULL STOP character, or if it has more than one U+002E FULL STOP character, then fail. Otherwise, interpret the resulting sequence as a base-ten number (possibly with a fractional part). Set second to that number.
If second is not a number in the range 0 ≤ second < 60, then fail.
Return hour, minute, and second.
A local date and time consists of a specific proleptic-Gregorian date, consisting of a year, a month, and a day, and a time, consisting of an hour, a minute, a second, and a fraction of a second, but expressed without a time zone. GREGORIAN
A string is a valid local date and time string representing a date and time if it consists of the following components in the given order:
A string is a valid normalized local date and time string representing a date and time if it consists of the following components in the given order:
The rules to parse a local date and time string are as follows. This will return either a date and time, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Parse a date component to obtain year, month, and day. If this returns nothing, then fail.
If position is beyond the end of input or if the character at position is neither a U+0054 LATIN CAPITAL LETTER T character (T) nor a U+0020 SPACE character, then fail. Otherwise, move position forwards one character.
Parse a time component to obtain hour, minute, and second. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
Let date be the date with year year, month month, and day day.
Let time be the time with hour hour, minute minute, and second second.
Return date and time.
A time-zone offset consists of a signed number of hours and minutes.
A string is a valid time-zone offset string representing a time-zone offset if it consists of either:
A U+005A LATIN CAPITAL LETTER Z character (Z), allowed only if the time zone is UTC
Or, the following components, in the given order:
This format allows for time-zone offsets from -23:59 to +23:59. Right now, in practice, the range of offsets of actual time zones is -12:00 to +14:00, and the minutes component of offsets of actual time zones is always either 00, 30, or 45. There is no guarantee that this will remain so forever, however, since time zones are used as political footballs and are thus subject to very whimsical policy decisions.
See also the usage notes and examples in the global date and time section below for details on using time-zone offsets with historical times that predate the formation of formal time zones.
The rules to parse a time-zone offset string are as follows. This will return either a time-zone offset, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Parse a time-zone offset component to obtain timezonehours and timezoneminutes. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
Return the time-zone offset that is timezonehours hours and timezoneminutes minutes from UTC.
The rules to parse a time-zone offset component, given an input string and a position, are as follows. This will return either time-zone hours and time-zone minutes, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
If the character at position is a U+005A LATIN CAPITAL LETTER Z character (Z), then:
Let timezonehours be 0.
Let timezoneminutes be 0.
Advance position to the next character in input.
Otherwise, if the character at position is either a U+002B PLUS SIGN (+) or a U+002D HYPHEN-MINUS (-), then:
If the character at position is a U+002B PLUS SIGN (+), let sign be "positive". Otherwise, it's a U+002D HYPHEN-MINUS (-); let sign be "negative".
Advance position to the next character in input.
Collect a sequence of code points that are ASCII digits from input given position. Let s be the collected sequence.
If s is exactly two characters long, then:
Interpret s as a base-ten integer. Let that number be the timezonehours.
If position is beyond the end of input or if the character at position is not a U+003A COLON character, then fail. Otherwise, move position forwards one character.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the timezoneminutes.
If s is exactly four characters long, then:
Interpret the first two characters of s as a base-ten integer. Let that number be the timezonehours.
Interpret the last two characters of s as a base-ten integer. Let that number be the timezoneminutes.
Otherwise, fail.
Otherwise, fail.
Return timezonehours and timezoneminutes.
A global date and time consists of a specific proleptic-Gregorian date, consisting of a year, a month, and a day, and a time, consisting of an hour, a minute, a second, and a fraction of a second, expressed with a time-zone offset, consisting of a signed number of hours and minutes. GREGORIAN
A string is a valid global date and time string representing a date, time, and a time-zone offset if it consists of the following components in the given order:
Times in dates before the formation of UTC in the mid-twentieth century must be expressed and interpreted in terms of UT1 (contemporary Earth solar time at the 0° longitude), not UTC (the approximation of UT1 that ticks in SI seconds). Time before the formation of time zones must be expressed and interpreted as UT1 times with explicit time zones that approximate the contemporary difference between the appropriate local time and the time observed at the location of Greenwich, London.
The following are some examples of dates written as valid global date and time strings.
0037-12-13 00:00Z
"1979-10-14T12:00:00.001-04:00
"8592-01-01T02:09+02:09
"Several things are notable about these dates:
T
" is replaced by a space, it must be a single space
character. The string "2001-12-21 12:00Z
" (with two spaces
between the components) would not be parsed successfully.The rules to parse a global date and time string are as follows. This will return either a time in UTC, with associated time-zone offset information for round-tripping or display purposes, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Parse a date component to obtain year, month, and day. If this returns nothing, then fail.
If position is beyond the end of input or if the character at position is neither a U+0054 LATIN CAPITAL LETTER T character (T) nor a U+0020 SPACE character, then fail. Otherwise, move position forwards one character.
Parse a time component to obtain hour, minute, and second. If this returns nothing, then fail.
If position is beyond the end of input, then fail.
Parse a time-zone offset component to obtain timezonehours and timezoneminutes. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
Let time be the moment in time at year year, month month, day day, hours hour, minute minute, second second, subtracting timezonehours hours and timezoneminutes minutes. That moment in time is a moment in the UTC time zone.
Let timezone be timezonehours hours and timezoneminutes minutes from UTC.
Return time and timezone.
A week consists of a week-year number and a week number representing a seven-day period starting on a Monday. Each week-year in this calendaring system has either 52 or 53 such seven-day periods, as defined below. The seven-day period starting on the Gregorian date Monday December 29th 1969 (1969-12-29) is defined as week number 1 in week-year 1970. Consecutive weeks are numbered sequentially. The week before the number 1 week in a week-year is the last week in the previous week-year, and vice versa. GREGORIAN
A week-year with a number year has 53 weeks if it corresponds to either a year year in the proleptic Gregorian calendar that has a Thursday as its first day (January 1st), or a year year in the proleptic Gregorian calendar that has a Wednesday as its first day (January 1st) and where year is a number divisible by 400, or a number divisible by 4 but not by 100. All other week-years have 52 weeks.
The week number of the last day of a week-year with 53 weeks is 53; the week number of the last day of a week-year with 52 weeks is 52.
The week-year number of a particular day can be different than the number of the year that contains that day in the proleptic Gregorian calendar. The first week in a week-year y is the week that contains the first Thursday of the Gregorian year y.
For modern purposes, a week as defined here is equivalent to ISO weeks as defined in ISO 8601. ISO8601
A string is a valid week string representing a week-year year and week week if it consists of the following components in the given order:
The rules to parse a week string are as follows. This will return either a week-year number and week number, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not at least four characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the year.
If year is not a number greater than zero, then fail.
If position is beyond the end of input or if the character at position is not a U+002D HYPHEN-MINUS character, then fail. Otherwise, move position forwards one character.
If position is beyond the end of input or if the character at position is not a U+0057 LATIN CAPITAL LETTER W character (W), then fail. Otherwise, move position forwards one character.
Collect a sequence of code points that are ASCII digits from input given position. If the collected sequence is not exactly two characters long, then fail. Otherwise, interpret the resulting sequence as a base-ten integer. Let that number be the week.
Let maxweek be the week number of the last day of year year.
If week is not a number in the range 1 ≤ week ≤ maxweek, then fail.
If position is not beyond the end of input, then fail.
Return the week-year number year and the week number week.
A duration consists of a number of seconds.
Since months and seconds are not comparable (a month is not a precise number of seconds, but is instead a period whose exact length depends on the precise day from which it is measured) a duration as defined in this specification cannot include months (or years, which are equivalent to twelve months). Only durations that describe a specific number of seconds can be described.
A string is a valid duration string representing a duration t if it consists of either of the following:
A literal U+0050 LATIN CAPITAL LETTER P character followed by one or more of the following subcomponents, in the order given, where the number of days, hours, minutes, and seconds corresponds to the same number of seconds as in t:
One or more ASCII digits followed by a U+0044 LATIN CAPITAL LETTER D character, representing a number of days.
A U+0054 LATIN CAPITAL LETTER T character followed by one or more of the following subcomponents, in the order given:
One or more ASCII digits followed by a U+0048 LATIN CAPITAL LETTER H character, representing a number of hours.
One or more ASCII digits followed by a U+004D LATIN CAPITAL LETTER M character, representing a number of minutes.
The following components:
One or more ASCII digits, representing a number of seconds.
Optionally, a U+002E FULL STOP character (.) followed by one, two, or three ASCII digits, representing a fraction of a second.
A U+0053 LATIN CAPITAL LETTER S character.
This, as with a number of other date- and time-related microsyntaxes defined in this specification, is based on one of the formats defined in ISO 8601. ISO8601
One or more duration time components, each with a different duration time component scale, in any order; the sum of the represented seconds being equal to the number of seconds in t.
A duration time component is a string consisting of the following components:
Zero or more ASCII whitespace.
One or more ASCII digits, representing a number of time units, scaled by the duration time component scale specified (see below) to represent a number of seconds.
If the duration time component scale specified is 1 (i.e. the units are seconds), then, optionally, a U+002E FULL STOP character (.) followed by one, two, or three ASCII digits, representing a fraction of a second.
Zero or more ASCII whitespace.
One of the following characters, representing the duration time component scale of the time unit used in the numeric part of the duration time component:
Zero or more ASCII whitespace.
This is not based on any of the formats in ISO 8601. It is intended to be a more human-readable alternative to the ISO 8601 duration format.
The rules to parse a duration string are as follows. This will return either a duration or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Let months, seconds, and component count all be zero.
Let M-disambiguator be minutes.
This flag's other value is months. It is used to disambiguate the "M" unit in ISO8601 durations, which use the same unit for months and minutes. Months are not allowed, but are parsed for future compatibility and to avoid misinterpreting ISO8601 durations that would be valid in other contexts.
Skip ASCII whitespace within input given position.
If position is past the end of input, then fail.
If the character in input pointed to by position is a U+0050 LATIN CAPITAL LETTER P character, then advance position to the next character, set M-disambiguator to months, and skip ASCII whitespace within input given position.
While true:
Let units be undefined. It will be assigned one of the following values: years, months, weeks, days, hours, minutes, and seconds.
Let next character be undefined. It is used to process characters from the input.
If position is past the end of input, then break.
If the character in input pointed to by position is a U+0054 LATIN CAPITAL LETTER T character, then advance position to the next character, set M-disambiguator to minutes, skip ASCII whitespace within input given position, and continue.
Set next character to the character in input pointed to by position.
If next character is a U+002E FULL STOP character (.), then let N equal zero. (Do not advance position. That is taken care of below.)
Otherwise, if next character is an ASCII digit, then collect a sequence of code points that are ASCII digits from input given position, interpret the resulting sequence as a base-ten integer, and let N be that number.
Otherwise, next character is not part of a number; fail.
If position is past the end of input, then fail.
Set next character to the character in input pointed to by position, and this time advance position to the next character. (If next character was a U+002E FULL STOP character (.) before, it will still be that character this time.)
If next character is U+002E (.), then:
Collect a sequence of code points that are ASCII digits from input given position. Let s be the resulting sequence.
If s is the empty string, then fail.
Let length be the number of characters in s.
Let fraction be the result of interpreting s as a base-ten integer, and then dividing that number by 10length.
Increment N by fraction.
Skip ASCII whitespace within input given position.
If position is past the end of input, then fail.
Set next character to the character in input pointed to by position, and advance position to the next character.
If next character is neither a U+0053 LATIN CAPITAL LETTER S character nor a U+0073 LATIN SMALL LETTER S character, then fail.
Set units to seconds.
Otherwise:
If next character is ASCII whitespace, then skip ASCII whitespace within input given position, set next character to the character in input pointed to by position, and advance position to the next character.
If next character is a U+0059 LATIN CAPITAL LETTER Y character, or a U+0079 LATIN SMALL LETTER Y character, set units to years and set M-disambiguator to months.
If next character is a U+004D LATIN CAPITAL LETTER M character or a U+006D LATIN SMALL LETTER M character, and M-disambiguator is months, then set units to months.
If next character is a U+0057 LATIN CAPITAL LETTER W character or a U+0077 LATIN SMALL LETTER W character, set units to weeks and set M-disambiguator to minutes.
If next character is a U+0044 LATIN CAPITAL LETTER D character or a U+0064 LATIN SMALL LETTER D character, set units to days and set M-disambiguator to minutes.
If next character is a U+0048 LATIN CAPITAL LETTER H character or a U+0068 LATIN SMALL LETTER H character, set units to hours and set M-disambiguator to minutes.
If next character is a U+004D LATIN CAPITAL LETTER M character or a U+006D LATIN SMALL LETTER M character, and M-disambiguator is minutes, then set units to minutes.
If next character is a U+0053 LATIN CAPITAL LETTER S character or a U+0073 LATIN SMALL LETTER S character, set units to seconds and set M-disambiguator to minutes.
Otherwise, if next character is none of the above characters, then fail.
Increment component count.
Let multiplier be 1.
If units is years, multiply multiplier by 12 and set units to months.
If units is months, add the product of N and multiplier to months.
Otherwise:
If units is weeks, multiply multiplier by 7 and set units to days.
If units is days, multiply multiplier by 24 and set units to hours.
If units is hours, multiply multiplier by 60 and set units to minutes.
If units is minutes, multiply multiplier by 60 and set units to seconds.
Forcibly, units is now seconds. Add the product of N and multiplier to seconds.
Skip ASCII whitespace within input given position.
If component count is zero, fail.
If months is not zero, fail.
Return the duration consisting of seconds seconds.
A string is a valid date string with optional time if it is also one of the following:
The rules to parse a date or time string are as follows. The algorithm will return either a date, a time, a global date and time, or nothing. If at any point the algorithm says that it "fails", this means that it is aborted at that point and returns nothing.
Let input be the string being parsed.
Let position be a pointer into input, initially pointing at the start of the string.
Set start position to the same position as position.
Set the date present and time present flags to true.
Parse a date component to obtain year, month, and day. If this fails, then set the date present flag to false.
If date present is true, and position is not beyond the end of input, and the character at position is either a U+0054 LATIN CAPITAL LETTER T character (T) or a U+0020 SPACE character, then advance position to the next character in input.
Otherwise, if date present is true, and either position is beyond the end of input or the character at position is neither a U+0054 LATIN CAPITAL LETTER T character (T) nor a U+0020 SPACE character, then set time present to false.
Otherwise, if date present is false, set position back to the same position as start position.
If the time present flag is true, then parse a time component to obtain hour, minute, and second. If this returns nothing, then fail.
If the date present and time present flags are both true, but position is beyond the end of input, then fail.
If the date present and time present flags are both true, parse a time-zone offset component to obtain timezonehours and timezoneminutes. If this returns nothing, then fail.
If position is not beyond the end of input, then fail.
If the date present flag is true and the time present flag is false, then let date be the date with year year, month month, and day day, and return date.
Otherwise, if the time present flag is true and the date present flag is false, then let time be the time with hour hour, minute minute, and second second, and return time.
Otherwise, let time be the moment in time at year year, month month, day day, hours hour, minute minute, second second, subtracting timezonehours hours and timezoneminutes minutes, that moment in time being a moment in the UTC time zone; let timezone be timezonehours hours and timezoneminutes minutes from UTC; and return time and timezone.
Some obsolete legacy attributes parse colors using the rules for parsing a legacy color value, given a string input. They will return either a CSS color or failure.
If input is the empty string, then return failure.
Strip leading and trailing ASCII whitespace from input.
If input is an ASCII case-insensitive match for "transparent
", then return failure.
If input is an ASCII case-insensitive match for one of the named colors, then return the CSS color corresponding to that keyword. CSSCOLOR
CSS2 System Colors are not recognized.
If input's code point length is four, and the first character in input is U+0023 (#), and the last three characters of input are all ASCII hex digits, then:
Let result be a CSS color.
Interpret the second character of input as a hexadecimal digit; let the red component of result be the resulting number multiplied by 17.
Interpret the third character of input as a hexadecimal digit; let the green component of result be the resulting number multiplied by 17.
Interpret the fourth character of input as a hexadecimal digit; let the blue component of result be the resulting number multiplied by 17.
Return result.
Replace any code points greater than U+FFFF in
input (i.e., any characters that are not in the basic multilingual plane) with "00
".
If input's code point length is greater than 128, truncate input, leaving only the first 128 characters.
If the first character in input is U+0023 (#), then remove it.
Replace any character in input that is not an ASCII hex digit with U+0030 (0).
While input's code point length is zero or not a multiple of three, append U+0030 (0) to input.
Split input into three strings of equal code point length, to obtain three components. Let length be the code point length that all of those components have (one third the code point length of input).
If length is greater than 8, then remove the leading length-8 characters in each component, and let length be 8.
While length is greater than two and the first character in each component is U+0030 (0), remove that character and reduce length by one.
If length is still greater than two, truncate each component, leaving only the first two characters in each.
Let result be a CSS color.
Interpret the first component as a hexadecimal number; let the red component of result be the resulting number.
Interpret the second component as a hexadecimal number; let the green component of result be the resulting number.
Interpret the third component as a hexadecimal number; let the blue component of result be the resulting number.
Return result.
A set of space-separated tokens is a string containing zero or more words (known as tokens) separated by one or more ASCII whitespace, where words consist of any string of one or more characters, none of which are ASCII whitespace.
A string containing a set of space-separated tokens may have leading or trailing ASCII whitespace.
An unordered set of unique space-separated tokens is a set of space-separated tokens where none of the tokens are duplicated.
An ordered set of unique space-separated tokens is a set of space-separated tokens where none of the tokens are duplicated but where the order of the tokens is meaningful.
Sets of space-separated tokens sometimes have a defined set of allowed values. When a set of allowed values is defined, the tokens must all be from that list of allowed values; other values are non-conforming. If no such set of allowed values is provided, then all values are conforming.
How tokens in a set of space-separated tokens are to be compared (e.g. case-sensitively or not) is defined on a per-set basis.
A set of comma-separated tokens is a string containing zero or more tokens each separated from the next by a single U+002C COMMA character (,), where tokens consist of any string of zero or more characters, neither beginning nor ending with ASCII whitespace, nor containing any U+002C COMMA characters (,), and optionally surrounded by ASCII whitespace.
For instance, the string " a ,b,,d d
" consists of four tokens: "a", "b", the empty
string, and "d d". Leading and trailing whitespace around each token doesn't count as part of
the token, and the empty string can be a token.
Sets of comma-separated tokens sometimes have further restrictions on what consists a valid token. When such restrictions are defined, the tokens must all fit within those restrictions; other values are non-conforming. If no such restrictions are specified, then all values are conforming.
A valid hash-name reference to an element of type type is a
string consisting of a U+0023 NUMBER SIGN character (#) followed by a string which exactly matches
the value of the name
attribute of an element with type type in
the same tree.
The rules for parsing a hash-name reference to an element of type type, given a context node scope, are as follows:
If the string being parsed does not contain a U+0023 NUMBER SIGN character, or if the first such character in the string is the last character in the string, then return null.
Let s be the string from the character immediately after the first U+0023 NUMBER SIGN character in the string being parsed up to the end of that string.
Return the first element of type type in scope's tree, in
tree order, that has an id
or name
attribute whose value is s, or null if there is no such
element.
Although id
attributes are accounted for when
parsing, they are not used in determining whether a value is a valid hash-name
reference. That is, a hash-name reference that refers to an element based on id
is a conformance error (unless that element also has a name
attribute with the same value).
A string is a valid media query list if it matches the <media-query-list>
production of Media Queries.
MQ
A string matches the environment of the user if it is the empty string, a string consisting of only ASCII whitespace, or is a media query list that matches the user's environment according to the definitions given in Media Queries. MQ
A unique internal value is a value that is serializable, comparable by value, and never exposed to script.
To create a new unique internal value, return a unique internal value that has never previously been returned by this algorithm.
A string is a valid non-empty URL if it is a valid URL string but it is not the empty string.
A string is a valid URL potentially surrounded by spaces if, after stripping leading and trailing ASCII whitespace from it, it is a valid URL string.
A string is a valid non-empty URL potentially surrounded by spaces if, after stripping leading and trailing ASCII whitespace from it, it is a valid non-empty URL.
This specification defines the URL about:legacy-compat
as a reserved,
though unresolvable, about:
URL, for use in DOCTYPEs in HTML documents when needed for
compatibility with XML tools. ABOUT
This specification defines the URL about:html-kind
as a reserved,
though unresolvable, about:
URL, that is used as an
identifier for kinds of media tracks. ABOUT
This specification defines the URL about:srcdoc
as a reserved, though
unresolvable, about:
URL, that is used as the URL of iframe
srcdoc
documents.
ABOUT
The fallback base URL of a Document
object document is the
URL record obtained by running these steps:
If document is an iframe
srcdoc
document, then:
Assert: document's about base URL is non-null.
Return document's about base URL.
If document's URL matches
about:blank
and document's about base URL is non-null, then return
document's about base URL.
Return document's URL.
The document base URL of a Document
object is the
URL record obtained by running these steps:
If there is no base
element that has an href
attribute in the Document
, then return the
Document
's fallback base URL.
Otherwise, return the frozen base URL of the first base
element
in the Document
that has an href
attribute, in
tree order.
A URL matches about:blank
if its scheme is "about
", its path contains a single string "blank
", its
username and password are the empty string, and its host is null.
Such a URL's query and fragment can be non-null. For example, the URL
record created by parsing "about:blank?foo#bar
" matches about:blank
.
A URL matches about:srcdoc
if its scheme is "about
", its path contains a single string "srcdoc
",
its query is null, its username and password are the empty string, and its host is null.
The reason that matches about:srcdoc
ensures that the
URL's query is null is because it is not
possible to create an iframe
srcdoc
document whose URL has a non-null query, unlike Document
s whose URL matches about:blank
. In other
words, the set of all URLs that match
about:srcdoc
only vary in their fragment.
Parsing a URL is the process of taking a string and obtaining the URL record that it represents. While this process is defined in URL, the HTML standard defines several wrappers to abstract base URLs and encodings. URL
Most new APIs are to use parse a URL. Older APIs and HTML elements might have reason to use encoding-parse a URL. When a custom base URL is needed or no base URL is desired, the URL parser can of course be used directly as well.
To parse a URL, given a string url, relative to a
Document
object or environment settings object environment,
run these steps. They return failure or a URL.
Let baseURL be environment's base
URL, if environment is a Document
object; otherwise
environment's API base URL.
Return the result of applying the URL parser to url, with baseURL.
To encoding-parse a URL,
given a string url, relative to a Document
object or environment
settings object environment, run these steps. They return failure or a
URL.
Let encoding be UTF-8.
If environment is a Document
object, then set encoding
to environment's character
encoding.
Otherwise, if environment's relevant global object is a
Window
object, set encoding to environment's relevant
global object's associated
Document
's character
encoding.
Let baseURL be environment's base
URL, if environment is a Document
object; otherwise
environment's API base URL.
Return the result of applying the URL parser to url, with baseURL and encoding.
To encoding-parse-and-serialize a
URL, given a string url, relative to a Document
object or
environment settings object environment, run these steps. They return
failure or a string.
Let url be the result of encoding-parsing a URL given url, relative to environment.
If url is failure, then return failure.
Return the result of applying the URL serializer to url.
When a document's document base URL changes, all elements in that document are affected by a base URL change.
The following are base URL change steps, which run when an element is affected by a base URL change (as defined by DOM):
If the URL identified by the hyperlink is being shown to the user, or if any
data derived from that URL is affecting the display, then the href
attribute's value should be reparsed, relative to the element's node
document and the UI updated appropriately.
For example, the CSS :link
/:visited
pseudo-classes
might have been affected.
If the hyperlink has a ping
attribute and its
URL(s) are being shown to the user, then the ping
attribute's tokens should be reparsed, relative to the element's node
document and the UI updated appropriately.
q
, blockquote
, ins
, or
del
element with a cite
attributeIf the URL identified by the cite
attribute is being
shown to the user, or if any data derived from that URL is affecting the display,
then the cite
attribute's value should be reparsed, relative to the element's node document and the UI updated
appropriately.
The element is not directly affected.
For instance, changing the base URL doesn't affect the image displayed by
img
elements, although subsequent accesses of the src
IDL attribute from script will return a new absolute
URL that might no longer correspond to the image being shown.
A response whose type is "basic
", "cors
", or "default
" is CORS-same-origin.
FETCH
A response whose type is "opaque
" or "opaqueredirect
" is CORS-cross-origin.
A response's unsafe response is its internal response if it has one, and the response itself otherwise.
To create a potential-CORS request, given a url, destination, corsAttributeState, and an optional same-origin fallback flag, run these steps:
Let mode be "no-cors
" if corsAttributeState
is No CORS, and "cors
"
otherwise.
If same-origin fallback flag is set and mode is "no-cors
", set mode to "same-origin
".
Let credentialsMode be "include
".
If corsAttributeState is Anonymous, set credentialsMode to "same-origin
".
Let request be a new request whose URL is url, destination is destination, mode is mode, credentials mode is credentialsMode, and whose use-URL-credentials flag is set.
The Content-Type metadata of a resource must be obtained and interpreted in a manner consistent with the requirements of MIME Sniffing. MIMESNIFF
The computed MIME type of a resource must be found in a manner consistent with the requirements given in MIME Sniffing. MIMESNIFF
The rules for sniffing images specifically, the rules for distinguishing if a resource is text or binary, and the rules for sniffing audio and video specifically are also defined in MIME Sniffing. These rules return a MIME type as their result. MIMESNIFF
It is imperative that the rules in MIME Sniffing be followed exactly. When a user agent uses different heuristics for content type detection than the server expects, security problems can occur. For more details, see MIME Sniffing. MIMESNIFF
meta
elementsThe algorithm for extracting a character encoding from a meta
element,
given a string s, is as follows. It either returns a character encoding or
nothing.
Let position be a pointer into s, initially pointing at the start of the string.
Loop: Find the first seven characters in s after position that are an ASCII case-insensitive match for the word "charset
". If no such match is found, return nothing.
Skip any ASCII whitespace that immediately follow the word "charset
" (there might not be any).
If the next character is not a U+003D EQUALS SIGN (=), then move position to point just before that next character, and jump back to the step labeled loop.
Skip any ASCII whitespace that immediately follow the equals sign (there might not be any).
Process the next character as follows:
This algorithm is distinct from those in the HTTP specifications (for example, HTTP doesn't allow the use of single quotes and requires supporting a backslash-escape mechanism that is not supported by this algorithm). While the algorithm is used in contexts that, historically, were related to HTTP, the syntax as supported by implementations diverged some time ago. HTTP
A CORS settings attribute is an enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
anonymous
| Anonymous | Requests for the element will have their
mode set to "cors " and their
credentials mode set to "same-origin ".
|
(the empty string) | ||
use-credentials
| Use Credentials | Requests for the element will have their mode set to "cors " and their credentials mode set to "include ".
|
The attribute's missing value default is the No CORS state, and its invalid value default is the Anonymous state. For the purposes of reflection, the canonical keyword for the Anonymous state is the anonymous
keyword.
The majority of fetches governed by CORS settings attributes will be done via the create a potential-CORS request algorithm.
For more modern features, where the request's mode is always "cors
", certain CORS settings attributes have been repurposed to have a
slightly different meaning, wherein they only impact the request's credentials mode. To perform this translation, we
define the CORS settings attribute credentials mode for a given CORS
settings attribute to be determined by switching on the attribute's state:
same-origin
"include
"A referrer policy attribute is an enumerated attribute. Each referrer policy, including the empty string, is a keyword for this attribute, mapping to a state of the same name.
The attribute's missing value default and invalid value default are both the empty string state.
The impact of these states on the processing model of various fetches is defined in more detail throughout this specification, in Fetch, and in Referrer Policy. FETCH REFERRERPOLICY
Several signals can contribute to which processing model is used for a given fetch; a referrer policy attribute is only one of them. In general, the order in which these signals are processed are:
First, the presence of a noreferrer
link
type;
Then, the value of a referrer policy attribute;
Then, the presence of any meta
element with name
attribute set to referrer
.
Finally, the `Referrer-Policy
` HTTP
header.
A nonce
content
attribute represents a cryptographic nonce ("number used once") which can be used by Content
Security Policy to determine whether or not a given fetch will be allowed to proceed. The
value is text. CSP
Elements that have a nonce
content attribute ensure that the
cryptographic nonce is only exposed to script (and not to side-channels like CSS attribute
selectors) by taking the value from the content attribute, moving it into an internal slot
named [[CryptographicNonce]], exposing it to script
via the HTMLOrSVGElement
interface mixin, and setting the content attribute to the
empty string. Unless otherwise specified, the slot's value is the empty string.
element.nonce
Returns the value set for element's cryptographic nonce. If the setter was not
used, this will be the value originally found in the nonce
content attribute.
element.nonce = value
Updates element's cryptographic nonce value.
The nonce
IDL attribute must, on getting, return the
value of this element's [[CryptographicNonce]]; and on setting, set this element's
[[CryptographicNonce]] to the given value.
Note how the setter for the nonce
IDL attribute does not update the corresponding
content attribute. This, as well as the below setting of the nonce
content attribute to the empty string when an element
becomes browsing-context connected, is meant to prevent exfiltration of the nonce
value through mechanisms that can easily read content attributes, such as selectors. Learn more in
issue #2369, where this behavior was
introduced.
The following attribute change
steps are used for the nonce
content attribute:
If element does not include HTMLOrSVGElement
, then
return.
If localName is not nonce
or
namespace is not null, then return.
If value is null, then set element's [[CryptographicNonce]] to the empty string.
Otherwise, set element's [[CryptographicNonce]] to value.
Whenever an element including HTMLOrSVGElement
becomes browsing-context connected, the user agent must execute the following steps
on the element:
Let CSP list be element's shadow-including root's policy container's CSP list.
If CSP list contains a header-delivered Content Security Policy, and
element has a nonce
content attribute
attr whose value is not the empty string, then:
Let nonce be element's [[CryptographicNonce]].
Set an attribute value for
element using "nonce
" and the empty
string.
Set element's [[CryptographicNonce]] to nonce.
If element's [[CryptographicNonce]] were not restored it would be the empty string at this point.
The cloning steps for elements that
include HTMLOrSVGElement
must set the
[[CryptographicNonce]] slot on the copy to the value of the slot on the element being
cloned.
A lazy loading attribute is an enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
lazy
| Lazy | Used to defer fetching a resource until some conditions are met. |
eager
| Eager | Used to fetch a resource immediately; the default state. |
The attribute directs the user agent to fetch a resource immediately or to defer fetching until some conditions associated with the element are met, according to the attribute's current state.
The attribute's missing value default and invalid value default are both the Eager state.
The will lazy load element steps, given an element element, are as follows:
If scripting is disabled for element, then return false.
This is an anti-tracking measure, because if a user agent supported lazy loading when scripting is disabled, it would still be possible for a site to track a user's approximate scroll position throughout a session, by strategically placing images in a page's markup such that a server can track how many images are requested and when.
If element's lazy loading attribute is in the Lazy state, then return true.
Return false.
Each img
and iframe
element has associated lazy load resumption
steps, initially null.
For img
and iframe
elements that will lazy load, these steps are run from the lazy load
intersection observer's callback or when their lazy loading attribute is set
to the Eager state. This causes the element to
continue loading.
Each Document
has a lazy load intersection observer, initially set to
null but can be set to an IntersectionObserver
instance.
To start intersection-observing a lazy loading element element, run these steps:
Let doc be element's node document.
If doc's lazy load intersection observer is null, set it to a new
IntersectionObserver
instance, initialized as follows:
The intention is to use the original value of the
IntersectionObserver
constructor. However, we're forced to use the
JavaScript-exposed constructor in this specification, until Intersection Observer
exposes low-level hooks for use in specifications. See bug w3c/IntersectionObserver#464
which tracks this. INTERSECTIONOBSERVER
The callback is these steps, with arguments entries and observer:
For each entry in entries using a method of iteration which does not trigger developer-modifiable array accessors or iteration hooks:
Let resumptionSteps be null.
If entry.isIntersecting
is true, then
set resumptionSteps to entry.target
's
lazy load resumption steps.
If resumptionSteps is null, then return.
Stop intersection-observing a lazy loading element for
entry.target
.
Set entry.target
's lazy load resumption
steps to null.
Invoke resumptionSteps.
The intention is to use the original value of the
isIntersecting
and
target
getters. See w3c/IntersectionObserver#464.
INTERSECTIONOBSERVER
The options is an IntersectionObserverInit
dictionary with the
following dictionary members: «[ "scrollMargin
" → lazy load scroll
margin ]»
This allows for fetching the image during scrolling, when it does not yet — but is about to — intersect the viewport.
The lazy load scroll margin suggestions imply dynamic changes to the
value, but the IntersectionObserver
API does not support changing the scroll
margin. See issue w3c/IntersectionObserver#428.
Call doc's lazy load intersection observer's observe
method with element as the
argument.
The intention is to use the original value of the observe
method. See w3c/IntersectionObserver#464.
INTERSECTIONOBSERVER
To stop intersection-observing a lazy loading element element, run these steps:
Let doc be element's node document.
Assert: doc's lazy load intersection observer is not null.
Call doc's lazy load intersection observer's unobserve
method with element as
the argument.
The intention is to use the original value of the unobserve
method. See w3c/IntersectionObserver#464.
INTERSECTIONOBSERVER
The lazy load scroll margin is an implementation-defined value, but with the following suggestions to consider:
Set a minimum value that most often results in the resources being loaded before they intersect the viewport under normal usage patterns for the given device.
The typical scrolling speed: increase the value for devices with faster typical scrolling speeds.
The current scrolling speed or momentum: the UA can attempt to predict where the scrolling will likely stop, and adjust the value accordingly.
The network quality: increase the value for slow or high-latency connections.
User preferences can influence the value.
It is important for privacy that the lazy load scroll margin not leak additional information. For example, the typical scrolling speed on the current device could be imprecise so as to not introduce a new fingerprinting vector.
A blocking attribute explicitly indicates that certain operations should be blocked on the fetching of an external resource. The operations that can be blocked are represented by possible blocking tokens, which are strings listed by the following table:
Possible blocking token | Description |
---|---|
"render "
| The element is potentially render-blocking. |
In the future, there might be more possible blocking tokens.
A blocking attribute must have a value that is an unordered set of unique space-separated tokens, each of which are possible blocking tokens. The supported tokens of a blocking attribute are the possible blocking tokens. Any element can have at most one blocking attribute.
The blocking tokens set for an element el are the result of the following steps:
Let value be the value of el's blocking attribute, or the empty string if no such attribute exists.
Set value to value, converted to ASCII lowercase.
Let rawTokens be the result of splitting value on ASCII whitespace.
Return a set containing the elements of rawTokens that are possible blocking tokens.
An element is potentially render-blocking if its blocking tokens set
contains "render
", or if it is
implicitly potentially render-blocking, which will be defined at the individual
elements. By default, an element is not implicitly potentially render-blocking.
A fetch priority attribute is an enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
high
| high | Signals a high-priority fetch relative to other resources with the same destination. |
low
| low | Signals a low-priority fetch relative to other resources with the same destination. |
auto
| auto | Signals automatic determination of fetch priority relative to other resources with the same destination. |
The attribute's missing value default and invalid value default are both the auto state.
The building blocks for reflecting are as follows:
A reflected target is an element or ElementInternals
object. It is typically clear from context and typically identical to the interface of the
reflected IDL attribute. It is always identical to that interface when it is an
ElementInternals
object.
A reflected IDL attribute is an attribute interface member.
A reflected content attribute name is a string. When the reflected
target is an element, it represents the local name of a content attribute whose namespace
is null. When the reflected target is an ElementInternals
object, it
represents a key of the reflected target's target
element's internal content attribute map.
A reflected IDL attribute can be defined to reflect a reflected content attribute name of a reflected target. In general this means that the IDL attribute getter returns the current value of the content attribute, and the setter changes the value of the content attribute to the given value.
If the reflected target is an element, then the reflected IDL
attribute can additionally declare to support ElementInternals
.
This means that the ElementInternals
interface also has a reflected IDL
attribute, with the same identifier, and that reflected IDL attribute reflects the same reflected content attribute name.
The fooBar
IDL attribute must reflect the foobar
content attribute and support
ElementInternals
.
Reflected targets have these associated algorithms:
For a reflected target that is an element element, these are defined as follows:
Return element.
Let attribute be the result of running get an attribute by namespace and local name given null, the reflected content attribute name, and element.
If attribute is null, then return null.
Return attribute's value.
Set an attribute value given element, the reflected content attribute name, and value.
Remove an attribute by namespace and local name given null, the reflected content attribute name, and element.
For a reflected target that is an ElementInternals
object
elementInternals, they are defined as follows:
Return elementInternals's target element.
If elementInternals's target element's internal content attribute map[the reflected content attribute name] does not exist, then return null.
Return elementInternals's target element's internal content attribute map[the reflected content attribute name].
Set elementInternals's target element's internal content attribute map[the reflected content attribute name] to value.
Remove elementInternals's target element's internal content attribute map[the reflected content attribute name].
This results in somewhat redundant data structures for
ElementInternals
objects as their target
element's internal content attribute map cannot be directly manipulated and as
such reflection is only happening in a single direction. This approach was nevertheless chosen to
make it less error-prone to define IDL attributes that are shared between reflected targets and benefit from common API semantics.
IDL attributes of type DOMString
or DOMString?
that reflect enumerated content attributes can be limited to only known values.
Per the processing models below, those will cause the getters for such IDL attributes to only
return keywords for those enumerated attributes, or the empty string or null.
If a reflected IDL attribute has the type DOMString
:
The getter steps are:
Let element be the result of running this's get the element.
Let contentAttributeValue be the result of running this's get the content attribute.
Let attributeDefinition be the attribute definition of element's content attribute whose namespace is null and local name is the reflected content attribute name.
If attributeDefinition indicates it is an enumerated attribute and the reflected IDL attribute is defined to be limited to only known values:
If contentAttributeValue does not correspond to any state of attributeDefinition (e.g., it is null and there is no missing value default), or if it is in a state of attributeDefinition with no associated keyword value, then return the empty string.
Return the canonical keyword for the state of attributeDefinition that contentAttributeValue corresponds to.
If contentAttributeValue is null, then return the empty string.
Return contentAttributeValue.
The setter steps are to run this's set the content attribute with the given value.
If a reflected IDL attribute has the type DOMString?
:
The getter steps are:
Let element be the result of running this's get the element.
Let contentAttributeValue be the result of running this's get the content attribute.
Let attributeDefinition be the attribute definition of element's content attribute whose namespace is null and local name is the reflected content attribute name.
Assert: attributeDefinition indicates it is an enumerated attribute.
Assert: the reflected IDL attribute is limited to only known values.
Assert: contentAttributeValue corresponds to a state of attributeDefinition.
If contentAttributeValue corresponds to a state of attributeDefinition with no associated keyword value, then return null.
Return the canonical keyword for the state of attributeDefinition that contentAttributeValue corresponds to.
The setter steps are:
If the given value is null, then run this's delete the content attribute.
Otherwise, run this's set the content attribute with the given value.
If a reflected IDL attribute has the type USVString
:
The getter steps are:
Let element be the result of running this's get the element.
Let contentAttributeValue be the result of running this's get the content attribute.
Let attributeDefinition be the attribute definition of element's content attribute whose namespace is null and local name is the reflected content attribute name.
If attributeDefinition indicates it contains a URL:
If contentAttributeValue is null, then return the empty string.
Let urlString be the result of encoding-parsing-and-serializing a URL given contentAttributeValue, relative to element's node document.
If urlString is not failure, then return urlString.
Return contentAttributeValue, converted to a scalar value string.
The setter steps are to run this's set the content attribute with the given value.
If a reflected IDL attribute has the type boolean
:
The getter steps are:
Let contentAttributeValue be the result of running this's get the content attribute.
If contentAttributeValue is null, then return false.
Return true.
The setter steps are:
If the given value is false, then run this's delete the content attribute.
If the given value is true, then run this's set the content attribute with the empty string.
This corresponds to the rules for boolean content attributes.
If a reflected IDL attribute has the type long
,
optionally limited to only non-negative numbers and optionally with a default
value defaultValue:
The getter steps are:
Let contentAttributeValue be the result of running this's get the content attribute.
If contentAttributeValue is not null:
Let parsedValue be the result of integer parsing contentAttributeValue if the reflected IDL attribute is not limited to only non-negative numbers; otherwise the result of non-negative integer parsing contentAttributeValue.
If parsedValue is not an error and is within the long
range, then return parsedValue.
If the reflected IDL attribute has a default value, then return defaultValue.
If the reflected IDL attribute is limited to only non-negative numbers, then return −1.
Return 0.
The setter steps are:
If the reflected IDL attribute is limited to only non-negative
numbers and the given value is negative, then throw an
"IndexSizeError
" DOMException
.
Run this's set the content attribute with the given value converted to the shortest possible string representing the number as a valid integer.
If a reflected IDL attribute has the type unsigned long
, optionally limited to only positive
numbers, limited to only positive
numbers with fallback, or clamped to the range [clampedMin,
clampedMax], and optionally with a default value defaultValue:
The getter steps are:
Let contentAttributeValue be the result of running this's get the content attribute.
Let minimum be 0.
If the reflected IDL attribute is limited to only positive numbers or limited to only positive numbers with fallback, then set minimum to 1.
If the reflected IDL attribute is clamped to the range, then set minimum to clampedMin.
Let maximum be 2147483647 if the reflected IDL attribute is not clamped to the range; otherwise clampedMax.
If contentAttributeValue is not null:
Let parsedValue be the result of non-negative integer parsing contentAttributeValue.
If parsedValue is not an error and is in the range minimum to maximum, inclusive, then return parsedValue.
If parsedValue is not an error and the reflected IDL attribute is clamped to the range:
If parsedValue is less than minimum, then return minimum.
Return maximum.
If the reflected IDL attribute has a default value, then return defaultValue.
Return minimum.
The setter steps are:
If the reflected IDL attribute is limited to only positive
numbers and the given value is 0, then throw an
"IndexSizeError
" DOMException
.
Let minimum be 0.
If the reflected IDL attribute is limited to only positive numbers or limited to only positive numbers with fallback, then set minimum to 1.
Let newValue be minimum.
If the reflected IDL attribute has a default value, then set newValue to defaultValue.
If the given value is in the range minimum to 2147483647, inclusive, then set newValue to it.
Run this's set the content attribute with newValue converted to the shortest possible string representing the number as a valid non-negative integer.
Clamped to the range has no effect on the setter steps.
If a reflected IDL attribute has the type double
,
optionally limited to only positive numbers
and optionally with a default value defaultValue:
The getter steps are:
Let contentAttributeValue be the result of running this's get the content attribute.
If contentAttributeValue is not null:
Let parsedValue be the result of floating-point number parsing contentAttributeValue.
If parsedValue is not an error and is greater than 0, then return parsedValue.
If parsedValue is not an error and the reflected IDL attribute is not limited to only positive numbers, then return parsedValue.
If the reflected IDL attribute has a default value, then return defaultValue.
Return 0.
The setter steps are:
If the reflected IDL attribute is limited to only positive numbers and the given value is not greater than 0, then return.
Run this's set the content attribute with the given value, converted to the best representation of the number as a floating-point number.
The values Infinity and Not-a-Number (NaN) values throw an exception on setting, as defined in Web IDL. WEBIDL
If a reflected IDL attribute has the type DOMTokenList
, then its
getter steps are to return a DOMTokenList
object whose associated element is
this and associated attribute's local name is the reflected content
attribute name. Specification authors cannot use support
ElementInternals
for IDL attributes of this type.
If a reflected IDL attribute has the type T?
,
where T is either Element
or an interface that inherits from
Element
, then with attr being the reflected content attribute
name:
Its reflected target has an explicitly set attr-element, which is a weak reference to an element or null. It is initially null.
Its reflected target reflectedTarget has a get the attr-associated element algorithm, that runs these steps:
Let element be the result of running reflectedTarget's get the element.
Let contentAttributeValue be the result of running reflectedTarget's get the content attribute.
If reflectedTarget's explicitly set attr-element is not null:
If reflectedTarget's explicitly set attr-element is a descendant of any of element's shadow-including ancestors, then return reflectedTarget's explicitly set attr-element.
Return null.
Otherwise, if contentAttributeValue is not null, return the first element candidate, in tree order, that meets the following criteria:
candidate's root is the same as element's root;
candidate's ID is contentAttributeValue; and
candidate implements T.
If no such element exists, then return null.
Return null.
The getter steps are to return the result of running this's get the attr-associated element.
The setter steps are:
If the given value is null, then:
Set this's explicitly set attr-element to null.
Run this's delete the content attribute.
Return.
Run this's set the content attribute with the empty string.
Set this's explicitly set attr-element to a weak reference to the given value.
For element reflected targets only: the following attribute change steps, given element, localName, oldValue, value, and namespace, are used to synchronize between the content attribute and the IDL attribute:
If localName is not attr or namespace is not null, then return.
Set element's explicitly set attr-element to null.
Reflected IDL attributes of this
type are strongly encouraged to have their identifier end in "Element
" for
consistency.
If a reflected IDL attribute has the type FrozenArray<T>?
, where T is either
Element
or an interface that inherits from Element
, then with
attr being the reflected content attribute name:
Its reflected target has an explicitly set attr-elements, which is either a list of weak references to elements or null. It is initially null.
Its reflected target has a cached attr-associated elements, which is a list of elements. It is initially « ».
Its reflected target has a cached attr-associated
elements object, which is a FrozenArray<T>?
. It is
initially null.
Its reflected target reflectedTarget has a get the attr-associated elements algorithm, which runs these steps:
Let elements be an empty list.
Let element be the result of running reflectedTarget's get the element.
If reflectedTarget's explicitly set attr-elements is not null:
For each attrElement in reflectedTarget's explicitly set attr-elements:
If attrElement is not a descendant of any of element's shadow-including ancestors, then continue.
Append attrElement to elements.
Otherwise:
Let contentAttributeValue be the result of running reflectedTarget's get the content attribute.
If contentAttributeValue is null, then return null.
Let tokens be contentAttributeValue, split on ASCII whitespace.
For each id of tokens:
Let candidate be the first element, in tree order, that meets the following criteria:
candidate's root is the same as element's root;
candidate's ID is id; and
candidate implements T.
If no such element exists, then continue.
Append candidate to elements.
Return elements.
The getter steps are:
Let elements be the result of running this's get the attr-associated elements.
If the contents of elements is equal to the contents of this's cached attr-associated elements, then return this's cached attr-associated elements object.
Let elementsAsFrozenArray be elements, converted to a FrozenArray<T>?
.
Set this's cached attr-associated elements to elements.
Set this's cached attr-associated elements object to elementsAsFrozenArray.
Return elementsAsFrozenArray.
This extra caching layer is necessary to preserve the invariant that element.reflectedElements === element.reflectedElements
.
The setter steps are:
If the given value is null:
Set this's explicitly set attr-elements to null.
Run this's delete the content attribute.
Return.
Run this's set the content attribute with the empty string.
Let elements be an empty list.
For each element in the given value:
Append a weak reference to element to elements.
Set this's explicitly set attr-elements to elements.
For element reflected targets only: the following attribute change steps, given element, localName, oldValue, value, and namespace, are used to synchronize between the content attribute and the IDL attribute:
If localName is not attr or namespace is not null, then return.
Set element's explicitly set attr-elements to null.
Reflected IDL attributes of this
type are strongly encouraged to have their identifier end in "Elements
" for
consistency.
Reflection is primarily about improving web developer ergonomics by giving them typed access to content attributes through reflected IDL attributes. The ultimate source of truth, which the web platform builds upon, is the content attributes themselves. That is, specification authors must not use the reflected IDL attribute getter or setter steps, but instead must use the content attribute presence and value. (Or an abstraction on top, such as the state of an enumerated attribute.)
Two important exceptions to this are reflected IDL attributes whose type is one of the following:
T?
, where T is either Element
or
an interface that inherits from Element
FrozenArray<T>?
, where T is either
Element
or an interface that inherits from Element
For those, specification authors must use the reflected target's get the attr-associated element and get the attr-associated elements, respectively. The content attribute presence and value must not be used as they cannot be fully synchronized with the reflected IDL attribute.
A reflected target's explicitly set attr-element, explicitly set attr-elements, cached attr-associated elements, and cached attr-associated elements object are to be treated as internal implementation details and not to be built upon.
The HTMLFormControlsCollection
and HTMLOptionsCollection
interfaces
are collections derived from the
HTMLCollection
interface. The HTMLAllCollection
interface is a collection, but is not so derived.
HTMLAllCollection
interfaceThe HTMLAllCollection
interface is used for the legacy document.all
attribute. It operates similarly to
HTMLCollection
; the main differences are that it allows a staggering variety of
different (ab)uses of its methods to all end up returning something, and that it can be called as
a function as an alternative to property access.
All HTMLAllCollection
objects are rooted at a Document
and have a filter that matches all elements, so the elements represented by the
collection of an HTMLAllCollection
object consist of all the descendant
elements of the root Document
.
Objects that implement the HTMLAllCollection
interface are legacy platform objects with an additional [[Call]] internal
method described in the section below. They also have an
[[IsHTMLDDA]] internal slot.
Objects that implement the HTMLAllCollection
interface have several unusual
behaviors, due of the fact that they have an [[IsHTMLDDA]] internal slot:
The ToBoolean abstract operation in JavaScript returns
false when given objects implementing the HTMLAllCollection
interface.
The IsLooselyEqual abstract operation,
when given objects implementing the HTMLAllCollection
interface, returns true when
compared to the undefined
and null
values.
(Comparisons using the IsStrictlyEqual abstract
operation, and IsLooselyEqual comparisons to other values such as strings or objects, are
unaffected.)
The typeof
operator in JavaScript returns the string
"undefined"
when applied to objects implementing the
HTMLAllCollection
interface.
These special behaviors are motivated by a desire for compatibility with two classes of legacy
content: one that uses the presence of document.all
as a
way to detect legacy user agents, and one that only supports those legacy user agents and uses
the document.all
object without testing for its presence
first. JAVASCRIPT
[Exposed=Window,
LegacyUnenumerableNamedProperties]
interface HTMLAllCollection {
readonly attribute unsigned long length;
getter Element (unsigned long index);
getter (HTMLCollection or Element)? namedItem(DOMString name);
(HTMLCollection or Element)? item(optional DOMString nameOrIndex);
// Note: HTMLAllCollection objects have a custom [[Call]] internal method and an [[IsHTMLDDA]] internal slot.
};
The object's supported property indices are as defined for
HTMLCollection
objects.
The supported property names consist of the non-empty values of all the id
attributes of all the elements represented by the
collection, and the non-empty values of all the name
attributes of
all the "all"-named elements represented by the collection, in
tree order, ignoring later duplicates, with the id
of
an element preceding its name
if it contributes both, they differ from
each other, and neither is the duplicate of an earlier entry.
The length
getter steps are to return the number
of nodes represented by the collection.
The indexed property getter must return the result of getting the "all"-indexed element from this given the passed index.
The namedItem(name)
method steps are
to return the result of getting the "all"-named
element(s) from this given name.
The item(nameOrIndex)
method steps
are:
If nameOrIndex was not provided, return null.
Return the result of getting the "all"-indexed or named element(s) from this, given nameOrIndex.
The following elements are "all"-named elements:
a
,
button
,
embed
,
form
,
frame
,
frameset
,
iframe
,
img
,
input
,
map
,
meta
,
object
,
select
, and
textarea
To get the "all"-indexed element from an
HTMLAllCollection
collection given an index index, return the
indexth element in collection, or null if there is no such
indexth element.
To get the "all"-named element(s) from an
HTMLAllCollection
collection given a name name, perform the
following steps:
If name is the empty string, return null.
Let subCollection be an HTMLCollection
object rooted at the same
Document
as collection, whose filter matches only elements that are
either:
"all"-named elements with a name
attribute equal to
name, or,
elements with an ID equal to name.
If there is exactly one element in subCollection, then return that element.
Otherwise, if subCollection is empty, return null.
Otherwise, return subCollection.
To get the "all"-indexed or named
element(s) from an HTMLAllCollection
collection given
nameOrIndex:
If nameOrIndex, converted to a JavaScript String value, is an array index property name, return the result of getting the "all"-indexed element from collection given the number represented by nameOrIndex.
Return the result of getting the "all"-named element(s) from collection given nameOrIndex.
If argumentsList's size is zero, or if argumentsList[0] is undefined, return null.
Let nameOrIndex be the result of converting argumentsList[0] to a DOMString
.
Let result be the result of getting the "all"-indexed or named element(s)
from this HTMLAllCollection
given nameOrIndex.
Return the result of converting result to an ECMAScript value.
The thisArgument is ignored, and thus code such as Function.prototype.call.call(document.all, null, "x")
will still search for
elements. (document.all.call
does not exist, since document.all
does not inherit from Function.prototype
.)
HTMLFormControlsCollection
interfaceThe HTMLFormControlsCollection
interface is used for
collections of listed
elements in form
elements.
[Exposed=Window]
interface HTMLFormControlsCollection : HTMLCollection {
// inherits length and item()
getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
};
[Exposed=Window]
interface RadioNodeList : NodeList {
attribute DOMString value;
};
collection.length
Returns the number of elements in collection.
element = collection.item(index)
element = collection[index]
Returns the item at index index in collection. The items are sorted in tree order.
element = collection.namedItem(name)
radioNodeList = collection.namedItem(name)
element = collection[name]
radioNodeList = collection[name]
Returns the item with ID or name
name from collection.
If there are multiple matching items, then a RadioNodeList
object containing all
those elements is returned.
radioNodeList.value
Returns the value of the first checked radio button represented by radioNodeList.
radioNodeList.value = value
Checks the first radio button represented by radioNodeList that has value value.
The object's supported property indices are as defined for
HTMLCollection
objects.
The supported property names consist of the non-empty values of all the id
and name
attributes of all the
elements represented by the collection, in tree order, ignoring later
duplicates, with the id
of an element preceding its name
if it contributes both, they differ from each other, and neither is the
duplicate of an earlier entry.
The namedItem(name)
method
must act according to the following algorithm:
id
attribute or a name
attribute equal to name, then return that node and stop the algorithm.id
attribute or a name
attribute equal
to name, then return null and stop the algorithm.RadioNodeList
object representing a live
view of the HTMLFormControlsCollection
object, further filtered so that the only
nodes in the RadioNodeList
object are those that have either an id
attribute or a name
attribute equal
to name. The nodes in the RadioNodeList
object must be sorted in
tree order.RadioNodeList
object.Members of the RadioNodeList
interface inherited from the NodeList
interface must behave as they would on a NodeList
object.
The value
IDL attribute on the
RadioNodeList
object, on getting, must return the value returned by running the
following steps:
Let element be the first element in tree order
represented by the RadioNodeList
object that is an input
element whose
type
attribute is in the Radio Button state and whose checkedness is true. Otherwise, let it be null.
If element is null, return the empty string.
If element is an element with no value
attribute, return the string "on
".
Otherwise, return the value of element's value
attribute.
On setting, the value
IDL attribute must run the
following steps:
If the new value is the string "on
": let element be the first element in tree order
represented by the RadioNodeList
object that is an input
element whose
type
attribute is in the Radio Button state and whose value
content attribute is either absent, or present and equal to the new value, if any. If no such element exists, then instead let element be null.
Otherwise: let element be the first element in tree order
represented by the RadioNodeList
object that is an input
element whose
type
attribute is in the Radio Button state and whose value
content attribute is present and equal to the new value, if
any. If no such element exists, then instead let element be null.
If element is not null, then set its checkedness to true.
HTMLOptionsCollection
interfaceThe HTMLOptionsCollection
interface is used for collections of option
elements. It is always
rooted on a select
element and has attributes and methods that manipulate that
element's descendants.
[Exposed=Window]
interface HTMLOptionsCollection : HTMLCollection {
// inherits item(), namedItem()
[CEReactions] attribute unsigned long length; // shadows inherited length
[CEReactions] setter undefined (unsigned long index, HTMLOptionElement? option);
[CEReactions] undefined add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
[CEReactions] undefined remove(long index);
attribute long selectedIndex;
};
collection.length
Returns the number of elements in collection.
collection.length = value
When set to a smaller number than the existing length, truncates the number of
option
elements in the container corresponding to collection.
When set to a greater number than the existing length, if that number is less than or equal
to 100000, adds new blank option
elements to the container corresponding to
collection.
element = collection.item(index)
element = collection[index]
Returns the item at index index in collection. The items are sorted in tree order.
collection[index] = element
When index is a greater number than the number of items in collection,
adds new blank option
elements in the corresponding container.
When set to null, removes the item at index index from collection.
When set to an option
element, adds or replaces it at index index in
collection.
element = collection.namedItem(name)
element = collection[name]
Returns the item with ID or name
name from collection.
If there are multiple matching items, then the first is returned.
collection.add(element[, before])
Inserts element before the node given by before.
The before argument can be a number, in which case element is inserted before the item with that number, or an element from collection, in which case element is inserted before that element.
If before is omitted, null, or a number out of range, then element will be added at the end of the list.
Throws a "HierarchyRequestError
" DOMException
if
element is an ancestor of the element into which it is to be inserted.
collection.remove(index)
Removes the item with index index from collection.
collection.selectedIndex
Returns the index of the first selected item, if any, or −1 if there is no selected item.
collection.selectedIndex = index
Changes the selection to the option
element at index index in
collection.
The object's supported property indices are as defined for
HTMLCollection
objects.
The length
getter steps are to return the
number of nodes represented by the collection.
The length
setter steps are:
Let current be the number of nodes represented by the collection.
If the given value is greater than current, then:
If the given value is greater than 100,000, then return.
Let n be value − current.
Append n new option
elements with no attributes and no child
nodes to the select
element on which this is rooted.
If the given value is less than current, then:
Let n be current − value.
Remove the last n nodes in the collection from their parent nodes.
Setting length
never removes
or adds any optgroup
elements, and never adds new children to existing
optgroup
elements (though it can remove children from them).
The supported property names consist of the non-empty values of all the id
and name
attributes of all the
elements represented by the collection, in tree order, ignoring later
duplicates, with the id
of an element preceding its name
if it contributes both, they differ from each other, and neither is
the duplicate of an earlier entry.
When the user agent is to set the value of a new indexed property or set the value of an existing indexed property for a given property index index to a new value value, it must run the following algorithm:
If value is null, invoke the steps for the remove
method with index as
the argument, and return.
Let length be the number of nodes represented by the collection.
Let n be index minus length.
If n is greater than zero, then append a DocumentFragment
consisting of n-1 new option
elements with no attributes and
no child nodes to the select
element on which the HTMLOptionsCollection
is rooted.
If n is greater than or equal to zero, append value to the select
element. Otherwise, replace the indexth element in the collection by value.
The add(element, before)
method must act according to the following algorithm:
If element is an ancestor of the select
element on which
the HTMLOptionsCollection
is rooted, then throw a
"HierarchyRequestError
" DOMException
.
If before is an element, but that element isn't a descendant of the
select
element on which the HTMLOptionsCollection
is rooted, then throw
a "NotFoundError
" DOMException
.
If element and before are the same element, then return.
If before is a node, then let reference be that node. Otherwise, if before is an integer, and there is a beforeth node in the collection, let reference be that node. Otherwise, let reference be null.
If reference is not null, let parent be the parent
node of reference. Otherwise, let parent be the
select
element on which the HTMLOptionsCollection
is rooted.
Pre-insert element into parent node before reference.
The remove(index)
method must act
according to the following algorithm:
If the number of nodes represented by the collection is zero, return.
If index is not a number greater than or equal to 0 and less than the number of nodes represented by the collection, return.
Let element be the indexth element in the collection.
Remove element from its parent node.
The selectedIndex
IDL attribute must act
like the identically named attribute on the select
element on which the
HTMLOptionsCollection
is rooted
DOMStringList
interfaceThe DOMStringList
interface is a non-fashionable retro way of representing a list
of strings.
[Exposed=(Window,Worker)]
interface DOMStringList {
readonly attribute unsigned long length;
getter DOMString? item(unsigned long index);
boolean contains(DOMString string);
};
New APIs must use sequence<DOMString>
or
equivalent rather than DOMStringList
.
strings.length
Returns the number of strings in strings.
strings[index]
strings.item(index)
Returns the string with index index from strings.
strings.contains(string)
Returns true if strings contains string, and false otherwise.
Each DOMStringList
object has an associated list.
The DOMStringList
interface supports indexed properties. The
supported property indices are the indices of this's
associated list.
The length
getter steps are to return
this's associated list's size.
The item(index)
method steps are to
return the indexth item in this's associated list, or null if
index plus one is greater than this's associated list's size.
The contains(string)
method steps
are to return true if this's associated list contains string, and false otherwise.
To support passing JavaScript objects,
including platform objects, across realm
boundaries, this specification defines the following infrastructure for
serializing and deserializing objects, including in some cases transferring the underlying data
instead of copying it. Collectively this serialization/deserialization process is known as
"structured cloning", although most APIs perform separate serialization and deserialization steps.
(With the notable exception being the structuredClone()
method.)
This section uses the terminology and typographic conventions from the JavaScript specification. JAVASCRIPT
Serializable objects support being serialized, and later deserialized, in a way that is independent of any given realm. This allows them to be stored on disk and later restored, or cloned across agent and even agent cluster boundaries.
Not all objects are serializable objects, and not all aspects of objects that are serializable objects are necessarily preserved when they are serialized.
Platform objects can be serializable objects
if their primary interface is decorated with the [Serializable]
IDL extended
attribute. Such interfaces must also define the following algorithms:
A set of steps that serializes the data in value into fields of serialized. The resulting data serialized into serialized must be independent of any realm.
These steps may throw an exception if serialization is not possible.
These steps may perform a sub-serialization to serialize nested data structures. They should not call StructuredSerialize directly, as doing so will omit the important memory argument.
The introduction of these steps should omit mention of the forStorage argument if it is not relevant to the algorithm.
A set of steps that deserializes the data in serialized, using it to set up value as appropriate. value will be a newly-created instance of the platform object type in question, with none of its internal data set up; setting that up is the job of these steps.
These steps may throw an exception if deserialization is not possible.
These steps may perform a sub-deserialization to deserialize nested data structures. They should not call StructuredDeserialize directly, as doing so will omit the important targetRealm and memory arguments.
It is up to the definition of individual platform objects to determine what data is serialized and deserialized by these steps. Typically the steps are very symmetric.
The [Serializable]
extended attribute must take no
arguments, and must only appear on an interface. It must not appear more than once on an
interface.
For a given platform object, only the object's primary interface is
considered during the (de)serialization process. Thus, if inheritance is involved in defining the
interface, each [Serializable]
-annotated interface in the
inheritance chain needs to define standalone serialization steps and
deserialization steps, including taking into account any important data that might
come from inherited interfaces.
Let's say we were defining a platform object Person
, which had
associated with it two pieces of associated data:
a name value, which is a string; and
a best friend value, which is either another Person
instance
or null.
We could then define Person
instances to be serializable
objects by annotating the Person
interface with the [Serializable]
extended attribute, and defining the
following accompanying algorithms:
Set serialized.[[Name]] to value's associated name value.
Let serializedBestFriend be the sub-serialization of value's associated best friend value.
Set serialized.[[BestFriend]] to serializedBestFriend.
Set value's associated name value to serialized.[[Name]].
Let deserializedBestFriend be the sub-deserialization of serialized.[[BestFriend]].
Set value's associated best friend value to deserializedBestFriend.
Objects defined in the JavaScript specification are handled by the StructuredSerialize abstract operation directly.
Originally, this specification defined the concept of "cloneable objects", which could be cloned from one realm to another. However, to better specify the behavior of certain more complex situations, the model was updated to make the serialization and deserialization explicit.
Transferable objects support being transferred across agents. Transferring is effectively recreating the object while sharing a reference to the underlying data and then detaching the object being transferred. This is useful to transfer ownership of expensive resources. Not all objects are transferable objects and not all aspects of objects that are transferable objects are necessarily preserved when transferred.
Transferring is an irreversible and non-idempotent operation. Once an object has been transferred, it cannot be transferred, or indeed used, again.
Platform objects can be transferable objects
if their primary interface is decorated with the [Transferable]
IDL extended
attribute. Such interfaces must also define the following algorithms:
A set of steps that transfers the data in value into fields of dataHolder. The resulting data held in dataHolder must be independent of any realm.
These steps may throw an exception if transferral is not possible.
A set of steps that receives the data in dataHolder, using it to set up value as appropriate. value will be a newly-created instance of the platform object type in question, with none of its internal data set up; setting that up is the job of these steps.
These steps may throw an exception if it is not possible to receive the transfer.
It is up to the definition of individual platform objects to determine what data is transferred by these steps. Typically the steps are very symmetric.
The [Transferable]
extended attribute must take no
arguments, and must only appear on an interface. It must not appear more than once on an
interface.
For a given platform object, only the object's primary interface is
considered during the transferring process. Thus, if inheritance is involved in defining the
interface, each [Transferable]
-annotated interface in the
inheritance chain needs to define standalone transfer steps and
transfer-receiving steps, including taking into account any important data that might
come from inherited interfaces.
Platform objects that are transferable objects have a [[Detached]] internal slot. This is used to ensure that once a platform object has been transferred, it cannot be transferred again.
Objects defined in the JavaScript specification are handled by the StructuredSerializeWithTransfer abstract operation directly.
The StructuredSerializeInternal abstract operation takes as input a JavaScript value value and serializes it to a realm-independent form, represented here as a Record. This serialized form has all the information necessary to later deserialize into a new JavaScript value in a different realm.
This process can throw an exception, for example when trying to serialize un-serializable objects.
If memory was not supplied, let memory be an empty map.
The purpose of the memory map is to avoid serializing objects twice. This ends up preserving cycles and the identity of duplicate objects in graphs.
If memory[value] exists, then return memory[value].
Let deep be false.
If value is undefined, null, a Boolean, a Number, a BigInt, or a String, then return { [[Type]]: "primitive", [[Value]]: value }.
If value is a Symbol, then throw a
"DataCloneError
" DOMException
.
Let serialized be an uninitialized value.
If value has a [[BooleanData]] internal slot, then set serialized to { [[Type]]: "Boolean", [[BooleanData]]: value.[[BooleanData]] }.
Otherwise, if value has a [[NumberData]] internal slot, then set serialized to { [[Type]]: "Number", [[NumberData]]: value.[[NumberData]] }.
Otherwise, if value has a [[BigIntData]] internal slot, then set serialized to { [[Type]]: "BigInt", [[BigIntData]]: value.[[BigIntData]] }.
Otherwise, if value has a [[StringData]] internal slot, then set serialized to { [[Type]]: "String", [[StringData]]: value.[[StringData]] }.
Otherwise, if value has a [[DateValue]] internal slot, then set serialized to { [[Type]]: "Date", [[DateValue]]: value.[[DateValue]] }.
Otherwise, if value has a [[RegExpMatcher]] internal slot, then set serialized to { [[Type]]: "RegExp", [[RegExpMatcher]]: value.[[RegExpMatcher]], [[OriginalSource]]: value.[[OriginalSource]], [[OriginalFlags]]: value.[[OriginalFlags]] }.
Otherwise, if value has an [[ArrayBufferData]] internal slot, then:
If IsSharedArrayBuffer(value) is true, then:
If the current settings object's cross-origin isolated
capability is false, then throw a "DataCloneError
"
DOMException
.
This check is only needed when serializing (and not when deserializing) as
the cross-origin
isolated capability cannot change over time and a SharedArrayBuffer
cannot leave an agent cluster.
If forStorage is true, then throw a
"DataCloneError
" DOMException
.
If value has an [[ArrayBufferMaxByteLength]] internal slot, then set serialized to { [[Type]]: "GrowableSharedArrayBuffer", [[ArrayBufferData]]: value.[[ArrayBufferData]], [[ArrayBufferByteLengthData]]: value.[[ArrayBufferByteLengthData]], [[ArrayBufferMaxByteLength]]: value.[[ArrayBufferMaxByteLength]], [[AgentCluster]]: the surrounding agent's agent cluster }.
Otherwise, set serialized to { [[Type]]: "SharedArrayBuffer", [[ArrayBufferData]]: value.[[ArrayBufferData]], [[ArrayBufferByteLength]]: value.[[ArrayBufferByteLength]], [[AgentCluster]]: the surrounding agent's agent cluster }.
Otherwise:
If IsDetachedBuffer(value) is true, then throw a
"DataCloneError
" DOMException
.
Let size be value.[[ArrayBufferByteLength]].
Let dataCopy be ? CreateByteDataBlock(size).
This can throw a RangeError
exception
upon allocation failure.
Perform CopyDataBlockBytes(dataCopy, 0, value.[[ArrayBufferData]], 0, size).
If value has an [[ArrayBufferMaxByteLength]] internal slot, then set serialized to { [[Type]]: "ResizableArrayBuffer", [[ArrayBufferData]]: dataCopy, [[ArrayBufferByteLength]]: size, [[ArrayBufferMaxByteLength]]: value.[[ArrayBufferMaxByteLength]] }.
Otherwise, set serialized to { [[Type]]: "ArrayBuffer", [[ArrayBufferData]]: dataCopy, [[ArrayBufferByteLength]]: size }.
Otherwise, if value has a [[ViewedArrayBuffer]] internal slot, then:
If IsArrayBufferViewOutOfBounds(value) is true, then throw a
"DataCloneError
" DOMException
.
Let buffer be the value of value's [[ViewedArrayBuffer]] internal slot.
Let bufferSerialized be ? StructuredSerializeInternal(buffer, forStorage, memory).
Assert: bufferSerialized.[[Type]] is "ArrayBuffer", "ResizableArrayBuffer", "SharedArrayBuffer", or "GrowableSharedArrayBuffer".
If value has a [[DataView]] internal slot, then set serialized to { [[Type]]: "ArrayBufferView", [[Constructor]]: "DataView", [[ArrayBufferSerialized]]: bufferSerialized, [[ByteLength]]: value.[[ByteLength]], [[ByteOffset]]: value.[[ByteOffset]] }.
Otherwise:
Assert: value has a [[TypedArrayName]] internal slot.
Set serialized to { [[Type]]: "ArrayBufferView", [[Constructor]]: value.[[TypedArrayName]], [[ArrayBufferSerialized]]: bufferSerialized, [[ByteLength]]: value.[[ByteLength]], [[ByteOffset]]: value.[[ByteOffset]], [[ArrayLength]]: value.[[ArrayLength]] }.
Otherwise, if value has [[MapData]] internal slot, then:
Set serialized to { [[Type]]: "Map", [[MapData]]: a new empty List }.
Set deep to true.
Otherwise, if value has [[SetData]] internal slot, then:
Set serialized to { [[Type]]: "Set", [[SetData]]: a new empty List }.
Set deep to true.
Otherwise, if value has an [[ErrorData]] internal slot and value is not a platform object, then:
Let name be ? Get(value, "name").
If name is not one of "Error", "EvalError", "RangeError", "ReferenceError", "SyntaxError", "TypeError", or "URIError", then set name to "Error".
Let valueMessageDesc be ? value.[[GetOwnProperty]]("message
").
Let message be undefined if IsDataDescriptor(valueMessageDesc) is false, and ? ToString(valueMessageDesc.[[Value]]) otherwise.
Set serialized to { [[Type]]: "Error", [[Name]]: name, [[Message]]: message }.
User agents should attach a serialized representation of any interesting accompanying
data which are not yet specified, notably the stack
property, to
serialized.
See the Error Stacks proposal for in-progress work on specifying this data. JSERRORSTACKS
Otherwise, if value is an Array exotic object, then:
Let valueLenDescriptor be ?
OrdinaryGetOwnProperty(value, "length
").
Let valueLen be valueLenDescriptor.[[Value]].
Set serialized to { [[Type]]: "Array", [[Length]]: valueLen, [[Properties]]: a new empty List }.
Set deep to true.
Otherwise, if value is a platform object that is a serializable object:
If value has a [[Detached]] internal slot whose value is true,
then throw a "DataCloneError
" DOMException
.
Let typeString be the identifier of the primary interface of value.
Set serialized to { [[Type]]: typeString }.
Set deep to true.
Otherwise, if value is a platform object, then throw a
"DataCloneError
" DOMException
.
Otherwise, if IsCallable(value) is true, then throw a
"DataCloneError
" DOMException
.
Otherwise, if value has any internal slot other than [[Prototype]],
[[Extensible]], or [[PrivateElements]], then throw a "DataCloneError
"
DOMException
.
For instance, a [[PromiseState]] or [[WeakMapData]] internal slot.
Otherwise, if value is an exotic object and value is not the
%Object.prototype% intrinsic object associated with any realm, then
throw a "DataCloneError
" DOMException
.
For instance, a proxy object.
Otherwise:
Set serialized to { [[Type]]: "Object", [[Properties]]: a new empty List }.
Set deep to true.
%Object.prototype% will end up being handled via this step and subsequent steps. The end result is that its exoticness is ignored, and after deserialization the result will be an empty object (not an immutable prototype exotic object).
Set memory[value] to serialized.
If deep is true, then:
If value has a [[MapData]] internal slot, then:
Let copiedList be a new empty List.
For each Record { [[Key]], [[Value]] } entry of value.[[MapData]]:
Let copiedEntry be a new Record { [[Key]]: entry.[[Key]], [[Value]]: entry.[[Value]] }.
If copiedEntry.[[Key]] is not the special value empty, append copiedEntry to copiedList.
For each Record { [[Key]], [[Value]] } entry of copiedList:
Let serializedKey be ? StructuredSerializeInternal(entry.[[Key]], forStorage, memory).
Let serializedValue be ? StructuredSerializeInternal(entry.[[Value]], forStorage, memory).
Append { [[Key]]: serializedKey, [[Value]]: serializedValue } to serialized.[[MapData]].
Otherwise, if value has a [[SetData]] internal slot, then:
Let copiedList be a new empty List.
For each entry of value.[[SetData]]:
If entry is not the special value empty, append entry to copiedList.
For each entry of copiedList:
Let serializedEntry be ? StructuredSerializeInternal(entry, forStorage, memory).
Append serializedEntry to serialized.[[SetData]].
Otherwise, if value is a platform object that is a serializable object, then perform the serialization steps for value's primary interface, given value, serialized, and forStorage.
The serialization steps may need to perform a sub-serialization. This is an operation which takes as input a value subValue, and returns StructuredSerializeInternal(subValue, forStorage, memory). (In other words, a sub-serialization is a specialization of StructuredSerializeInternal to be consistent within this invocation.)
Otherwise, for each key in ! EnumerableOwnProperties(value, key):
If ! HasOwnProperty(value, key) is true, then:
Let inputValue be ? value.[[Get]](key, value).
Let outputValue be ? StructuredSerializeInternal(inputValue, forStorage, memory).
Append { [[Key]]: key, [[Value]]: outputValue } to serialized.[[Properties]].
Return serialized.
It's important to realize that the Records produced by StructuredSerializeInternal might contain "pointers" to other records that create circular references. For example, when we pass the following JavaScript object into StructuredSerializeInternal:
const o = {};
o.myself = o;
it produces the following result:
{ [[Type]]: "Object", [[Properties]]: « { [[Key]]: "myself", [[Value]]: <a pointer to this whole structure> } » }
Return ? StructuredSerializeInternal(value, false).
Return ? StructuredSerializeInternal(value, true).
The StructuredDeserialize abstract operation takes as input a Record serialized, which was previously produced by StructuredSerialize or StructuredSerializeForStorage, and deserializes it into a new JavaScript value, created in targetRealm.
This process can throw an exception, for example when trying to allocate memory for the new
objects (especially ArrayBuffer
objects).
If memory was not supplied, let memory be an empty map.
The purpose of the memory map is to avoid deserializing objects twice. This ends up preserving cycles and the identity of duplicate objects in graphs.
If memory[serialized] exists, then return memory[serialized].
Let deep be false.
Let value be an uninitialized value.
If serialized.[[Type]] is "primitive", then set value to serialized.[[Value]].
Otherwise, if serialized.[[Type]] is "Boolean", then set value to a new Boolean object in targetRealm whose [[BooleanData]] internal slot value is serialized.[[BooleanData]].
Otherwise, if serialized.[[Type]] is "Number", then set value to a new Number object in targetRealm whose [[NumberData]] internal slot value is serialized.[[NumberData]].
Otherwise, if serialized.[[Type]] is "BigInt", then set value to a new BigInt object in targetRealm whose [[BigIntData]] internal slot value is serialized.[[BigIntData]].
Otherwise, if serialized.[[Type]] is "String", then set value to a new String object in targetRealm whose [[StringData]] internal slot value is serialized.[[StringData]].
Otherwise, if serialized.[[Type]] is "Date", then set value to a new Date object in targetRealm whose [[DateValue]] internal slot value is serialized.[[DateValue]].
Otherwise, if serialized.[[Type]] is "RegExp", then set value to a new RegExp object in targetRealm whose [[RegExpMatcher]] internal slot value is serialized.[[RegExpMatcher]], whose [[OriginalSource]] internal slot value is serialized.[[OriginalSource]], and whose [[OriginalFlags]] internal slot value is serialized.[[OriginalFlags]].
Otherwise, if serialized.[[Type]] is "SharedArrayBuffer", then:
If targetRealm's corresponding agent cluster is not
serialized.[[AgentCluster]], then throw a
"DataCloneError
" DOMException
.
Otherwise, set value to a new SharedArrayBuffer object in targetRealm whose [[ArrayBufferData]] internal slot value is serialized.[[ArrayBufferData]] and whose [[ArrayBufferByteLength]] internal slot value is serialized.[[ArrayBufferByteLength]].
Otherwise, if serialized.[[Type]] is "GrowableSharedArrayBuffer", then:
If targetRealm's corresponding agent cluster is not
serialized.[[AgentCluster]], then throw a
"DataCloneError
" DOMException
.
Otherwise, set value to a new SharedArrayBuffer object in targetRealm whose [[ArrayBufferData]] internal slot value is serialized.[[ArrayBufferData]], whose [[ArrayBufferByteLengthData]] internal slot value is serialized.[[ArrayBufferByteLengthData]], and whose [[ArrayBufferMaxByteLength]] internal slot value is serialized.[[ArrayBufferMaxByteLength]].
Otherwise, if serialized.[[Type]] is "ArrayBuffer", then set value to a new ArrayBuffer object in targetRealm whose [[ArrayBufferData]] internal slot value is serialized.[[ArrayBufferData]], and whose [[ArrayBufferByteLength]] internal slot value is serialized.[[ArrayBufferByteLength]].
If this throws an exception, catch it, and then throw a
"DataCloneError
" DOMException
.
This step might throw an exception if there is not enough memory available to create such an ArrayBuffer object.
Otherwise, if serialized.[[Type]] is "ResizableArrayBuffer", then set value to a new ArrayBuffer object in targetRealm whose [[ArrayBufferData]] internal slot value is serialized.[[ArrayBufferData]], whose [[ArrayBufferByteLength]] internal slot value is serialized.[[ArrayBufferByteLength]], and whose [[ArrayBufferMaxByteLength]] internal slot value is serialized.[[ArrayBufferMaxByteLength]].
If this throws an exception, catch it, and then throw a
"DataCloneError
" DOMException
.
This step might throw an exception if there is not enough memory available to create such an ArrayBuffer object.
Otherwise, if serialized.[[Type]] is "ArrayBufferView", then:
Let deserializedArrayBuffer be ? StructuredDeserialize(serialized.[[ArrayBufferSerialized]], targetRealm, memory).
If serialized.[[Constructor]] is "DataView", then set value to a new DataView object in targetRealm whose [[ViewedArrayBuffer]] internal slot value is deserializedArrayBuffer, whose [[ByteLength]] internal slot value is serialized.[[ByteLength]], and whose [[ByteOffset]] internal slot value is serialized.[[ByteOffset]].
Otherwise, set value to a new typed array object in targetRealm, using the constructor given by serialized.[[Constructor]], whose [[ViewedArrayBuffer]] internal slot value is deserializedArrayBuffer, whose [[TypedArrayName]] internal slot value is serialized.[[Constructor]], whose [[ByteLength]] internal slot value is serialized.[[ByteLength]], whose [[ByteOffset]] internal slot value is serialized.[[ByteOffset]], and whose [[ArrayLength]] internal slot value is serialized.[[ArrayLength]].
Otherwise, if serialized.[[Type]] is "Map", then:
Set value to a new Map object in targetRealm whose [[MapData]] internal slot value is a new empty List.
Set deep to true.
Otherwise, if serialized.[[Type]] is "Set", then:
Set value to a new Set object in targetRealm whose [[SetData]] internal slot value is a new empty List.
Set deep to true.
Otherwise, if serialized.[[Type]] is "Array", then:
Let outputProto be targetRealm.[[Intrinsics]].[[%Array.prototype%]].
Set value to ! ArrayCreate(serialized.[[Length]], outputProto).
Set deep to true.
Otherwise, if serialized.[[Type]] is "Object", then:
Set value to a new Object in targetRealm.
Set deep to true.
Otherwise, if serialized.[[Type]] is "Error", then:
Let prototype be %Error.prototype%.
If serialized.[[Name]] is "EvalError", then set prototype to %EvalError.prototype%.
If serialized.[[Name]] is "RangeError", then set prototype to %RangeError.prototype%.
If serialized.[[Name]] is "ReferenceError", then set prototype to %ReferenceError.prototype%.
If serialized.[[Name]] is "SyntaxError", then set prototype to %SyntaxError.prototype%.
If serialized.[[Name]] is "TypeError", then set prototype to %TypeError.prototype%.
If serialized.[[Name]] is "URIError", then set prototype to %URIError.prototype%.
Let message be serialized.[[Message]].
Set value to OrdinaryObjectCreate(prototype, « [[ErrorData]] »).
Let messageDesc be PropertyDescriptor{ [[Value]]: message, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }.
If message is not undefined, then perform !
OrdinaryDefineOwnProperty(value, "message
",
messageDesc).
Any interesting accompanying data attached to serialized should be deserialized and attached to value.
Otherwise:
Let interfaceName be serialized.[[Type]].
If the interface identified by interfaceName is not
exposed in targetRealm, then throw a
"DataCloneError
" DOMException
.
Set value to a new instance of the interface identified by interfaceName, created in targetRealm.
Set deep to true.
Set memory[serialized] to value.
If deep is true, then:
If serialized.[[Type]] is "Map", then:
For each Record { [[Key]], [[Value]] } entry of serialized.[[MapData]]:
Let deserializedKey be ? StructuredDeserialize(entry.[[Key]], targetRealm, memory).
Let deserializedValue be ? StructuredDeserialize(entry.[[Value]], targetRealm, memory).
Append { [[Key]]: deserializedKey, [[Value]]: deserializedValue } to value.[[MapData]].
Otherwise, if serialized.[[Type]] is "Set", then:
For each entry of serialized.[[SetData]]:
Let deserializedEntry be ? StructuredDeserialize(entry, targetRealm, memory).
Append deserializedEntry to value.[[SetData]].
Otherwise, if serialized.[[Type]] is "Array" or "Object", then:
For each Record { [[Key]], [[Value]] } entry of serialized.[[Properties]]:
Let deserializedValue be ? StructuredDeserialize(entry.[[Value]], targetRealm, memory).
Let result be ! CreateDataProperty(value, entry.[[Key]], deserializedValue).
Assert: result is true.
Otherwise:
Perform the appropriate deserialization steps for the interface identified by serialized.[[Type]], given serialized, value, and targetRealm.
The deserialization steps may need to perform a sub-deserialization. This is an operation which takes as input a previously-serialized Record subSerialized, and returns StructuredDeserialize(subSerialized, targetRealm, memory). (In other words, a sub-deserialization is a specialization of StructuredDeserialize to be consistent within this invocation.)
Return value.
Let memory be an empty map.
In addition to how it is used normally by StructuredSerializeInternal, in this algorithm memory is also used to ensure that StructuredSerializeInternal ignores items in transferList, and let us do our own handling instead.
For each transferable of transferList:
If transferable has neither an [[ArrayBufferData]] internal slot nor a
[[Detached]] internal slot, then throw a
"DataCloneError
" DOMException
.
If transferable has an [[ArrayBufferData]] internal slot and
IsSharedArrayBuffer(transferable) is true, then throw a
"DataCloneError
" DOMException
.
If memory[transferable] exists,
then throw a "DataCloneError
" DOMException
.
Set memory[transferable] to { [[Type]]: an uninitialized value }.
transferable is not transferred yet as transferring has side effects and StructuredSerializeInternal needs to be able to throw first.
Let serialized be ? StructuredSerializeInternal(value, false, memory).
Let transferDataHolders be a new empty List.
For each transferable of transferList:
If transferable has an [[ArrayBufferData]] internal slot and
IsDetachedBuffer(transferable) is true, then throw a
"DataCloneError
" DOMException
.
If transferable has a [[Detached]] internal slot and
transferable.[[Detached]] is true, then throw a
"DataCloneError
" DOMException
.
Let dataHolder be memory[transferable].
If transferable has an [[ArrayBufferData]] internal slot, then:
If transferable has an [[ArrayBufferMaxByteLength]] internal slot, then:
Set dataHolder.[[Type]] to "ResizableArrayBuffer".
Set dataHolder.[[ArrayBufferData]] to transferable.[[ArrayBufferData]].
Set dataHolder.[[ArrayBufferByteLength]] to transferable.[[ArrayBufferByteLength]].
Set dataHolder.[[ArrayBufferMaxByteLength]] to transferable.[[ArrayBufferMaxByteLength]].
Otherwise:
Set dataHolder.[[Type]] to "ArrayBuffer".
Set dataHolder.[[ArrayBufferData]] to transferable.[[ArrayBufferData]].
Set dataHolder.[[ArrayBufferByteLength]] to transferable.[[ArrayBufferByteLength]].
Perform ? DetachArrayBuffer(transferable).
Specifications can use the [[ArrayBufferDetachKey]] internal slot to prevent
ArrayBuffer
s from being detached. This is used in
WebAssembly JavaScript Interface, for example. WASMJS
Otherwise:
Assert: transferable is a platform object that is a transferable object.
Let interfaceName be the identifier of the primary interface of transferable.
Set dataHolder.[[Type]] to interfaceName.
Perform the appropriate transfer steps for the interface identified by interfaceName, given transferable and dataHolder.
Set transferable.[[Detached]] to true.
Append dataHolder to transferDataHolders.
Return { [[Serialized]]: serialized, [[TransferDataHolders]]: transferDataHolders }.
Let memory be an empty map.
Analogous to StructuredSerializeWithTransfer, in addition to how it is used normally by StructuredDeserialize, in this algorithm memory is also used to ensure that StructuredDeserialize ignores items in serializeWithTransferResult.[[TransferDataHolders]], and let us do our own handling instead.
Let transferredValues be a new empty List.
For each transferDataHolder of serializeWithTransferResult.[[TransferDataHolders]]:
Let value be an uninitialized value.
If transferDataHolder.[[Type]] is "ArrayBuffer", then set value to a new ArrayBuffer object in targetRealm whose [[ArrayBufferData]] internal slot value is transferDataHolder.[[ArrayBufferData]], and whose [[ArrayBufferByteLength]] internal slot value is transferDataHolder.[[ArrayBufferByteLength]].
In cases where the original memory occupied by [[ArrayBufferData]] is accessible during the deserialization, this step is unlikely to throw an exception, as no new memory needs to be allocated: the memory occupied by [[ArrayBufferData]] is instead just getting transferred into the new ArrayBuffer. This could be true, for example, when both the source and target realms are in the same process.
Otherwise, if transferDataHolder.[[Type]] is "ResizableArrayBuffer", then set value to a new ArrayBuffer object in targetRealm whose [[ArrayBufferData]] internal slot value is transferDataHolder.[[ArrayBufferData]], whose [[ArrayBufferByteLength]] internal slot value is transferDataHolder.[[ArrayBufferByteLength]], and whose [[ArrayBufferMaxByteLength]] internal slot value is transferDataHolder.[[ArrayBufferMaxByteLength]].
For the same reason as the previous step, this step is also unlikely to throw an exception.
Otherwise:
Let interfaceName be transferDataHolder.[[Type]].
If the interface identified by interfaceName is not exposed in
targetRealm, then throw a "DataCloneError
"
DOMException
.
Set value to a new instance of the interface identified by interfaceName, created in targetRealm.
Perform the appropriate transfer-receiving steps for the interface identified by interfaceName given transferDataHolder and value.
Set memory[transferDataHolder] to value.
Append value to transferredValues.
Let deserialized be ? StructuredDeserialize(serializeWithTransferResult.[[Serialized]], targetRealm, memory).
Return { [[Deserialized]]: deserialized, [[TransferredValues]]: transferredValues }.
Other specifications may use the abstract operations defined here. The following provides some guidance on when each abstract operation is typically useful, with examples.
Cloning a value to another realm, with a transfer list, but where the target realm is not known ahead of time. In this case the serialization step can be performed immediately, with the deserialization step delayed until the target realm becomes known.
messagePort.postMessage()
uses this pair of abstract operations, as the destination realm is not known until the
MessagePort
has been shipped.
Creating a realm-independent snapshot of a given value which can be saved for an indefinite amount of time, and then reified back into a JavaScript value later, possibly multiple times.
StructuredSerializeForStorage can be used for situations where the serialization
is anticipated to be stored in a persistent manner, instead of passed between realms. It throws
when attempting to serialize SharedArrayBuffer
objects, since storing shared memory
does not make sense. Similarly, it can throw or possibly have different behavior when given a
platform object with custom serialization steps when the
forStorage argument is true.
history.pushState()
and history.replaceState()
use
StructuredSerializeForStorage on author-supplied state objects, storing them as
serialized state in the appropriate session history entry. Then,
StructuredDeserialize is used so that the history.state
property can return a clone of the
originally-supplied state object.
broadcastChannel.postMessage()
uses
StructuredSerialize on its input, then uses StructuredDeserialize
multiple times on the result to produce a fresh clone for each destination being broadcast
to. Note that transferring does not make sense in multi-destination situations.
Any API for persisting JavaScript values to the filesystem would also use StructuredSerializeForStorage on its input and StructuredDeserialize on its output.
In general, call sites may pass in Web IDL values instead of JavaScript values; this is to be understood to perform an implicit conversion to the JavaScript value before invoking these algorithms.
Call sites that are not invoked as a result of author code synchronously calling into a user agent method must take care to properly prepare to run script and prepare to run a callback before invoking StructuredSerialize, StructuredSerializeForStorage, or StructuredSerializeWithTransfer abstract operations, if they are being performed on arbitrary objects. This is necessary because the serialization process can invoke author-defined accessors as part of its final deep-serialization steps, and these accessors could call into operations that rely on the entry and incumbent concepts being properly set up.
window.postMessage()
performs
StructuredSerializeWithTransfer on its arguments, but is careful to do so
immediately, inside the synchronous portion of its algorithm. Thus it is able to use the
algorithms without needing to prepare to run script and prepare to run a
callback.
In contrast, a hypothetical API that used StructuredSerialize to serialize some author-supplied object periodically, directly from a task on the event loop, would need to ensure it performs the appropriate preparations beforehand. As of this time, we know of no such APIs on the platform; usually it is simpler to perform the serialization ahead of time, as a synchronous consequence of author code.
result = self.structuredClone(value[, { transfer }])
Takes the input value and returns a deep copy by performing the structured clone algorithm.
Transferable objects listed in the transfer
array are transferred, not
just cloned, meaning that they are no longer usable in the input value.
Throws a "DataCloneError
" DOMException
if any part of
the input value is not serializable.
The structuredClone(value,
options)
method steps are:
Let serialized be ?
StructuredSerializeWithTransfer(value, options["transfer
"]).
Let deserializeRecord be ? StructuredDeserializeWithTransfer(serialized, this's relevant realm).
Return deserializeRecord.[[Deserialized]].
Every XML and HTML document in an HTML UA is represented by a Document
object.
DOM
The Document
object's URL is defined in DOM. It is initially set when
the Document
object is created, but can change during the lifetime of the
Document
object; for example, it changes when the user navigates to a fragment on the page
and when the pushState()
method is called with a new
URL. DOM
Interactive user agents typically expose the Document
object's
URL in their user interface. This is the primary
mechanism by which a user can tell if a site is attempting to impersonate another.
The Document
object's origin is defined in DOM. It is initially set when the
Document
object is created, and can change during the lifetime of the
Document
only upon setting document.domain
. A Document
's origin can differ from the origin of its URL;
for example when a child navigable is created, its active document's origin is inherited from its parent's active document's origin, even though its active document's URL is
about:blank
. DOM
When a Document
is created by a script using
the createDocument()
or createHTMLDocument()
methods, the
Document
is ready for post-load tasks immediately.
The document's referrer is a string (representing a URL) that
can be set when the Document
is created. If it is not explicitly set, then its value
is the empty string.
Document
objectDOM defines a Document
interface, which
this specification extends significantly.
enum DocumentReadyState { "loading", "interactive", "complete" };
enum DocumentVisibilityState { "visible", "hidden" };
typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement;
[LegacyOverrideBuiltIns]
partial interface Document {
static Document
parseHTMLUnsafe((TrustedHTML
or DOMString) html);
// resource metadata management
[PutForwards=href, LegacyUnforgeable] readonly attribute Location? location;
attribute USVString domain;
readonly attribute USVString referrer;
attribute USVString cookie;
readonly attribute DOMString lastModified;
readonly attribute DocumentReadyState readyState;
// DOM tree accessors
getter object (DOMString name);
[CEReactions] attribute DOMString title;
[CEReactions] attribute DOMString dir;
[CEReactions] attribute HTMLElement? body;
readonly attribute HTMLHeadElement? head;
[SameObject] readonly attribute HTMLCollection images;
[SameObject] readonly attribute HTMLCollection embeds;
[SameObject] readonly attribute HTMLCollection plugins;
[SameObject] readonly attribute HTMLCollection links;
[SameObject] readonly attribute HTMLCollection forms;
[SameObject] readonly attribute HTMLCollection scripts;
NodeList getElementsByName(DOMString elementName);
readonly attribute HTMLOrSVGScriptElement? currentScript; // classic scripts in a document tree only
// dynamic markup insertion
[CEReactions] Document open(optional DOMString unused1, optional DOMString unused2); // both arguments are ignored
WindowProxy? open(USVString url, DOMString name, DOMString features);
[CEReactions] undefined close();
[CEReactions] undefined write((TrustedHTML
or DOMString)... text);
[CEReactions] undefined writeln((TrustedHTML
or DOMString)... text);
// user interaction
readonly attribute WindowProxy? defaultView;
boolean hasFocus();
[CEReactions] attribute DOMString designMode;
[CEReactions] boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = "");
boolean queryCommandEnabled(DOMString commandId);
boolean queryCommandIndeterm(DOMString commandId);
boolean queryCommandState(DOMString commandId);
boolean queryCommandSupported(DOMString commandId);
DOMString queryCommandValue(DOMString commandId);
readonly attribute boolean hidden;
readonly attribute DocumentVisibilityState visibilityState;
// special event handler IDL attributes that only apply to Document objects
[LegacyLenientThis] attribute EventHandler onreadystatechange;
attribute EventHandler onvisibilitychange;
// also has obsolete members
};
Document includes GlobalEventHandlers;
Each Document
has a policy container (a policy container), initially a new policy
container, which contains policies which apply to the Document
.
Each Document
has a permissions policy, which
is a permissions policy, which is initially
empty.
Each Document
has a module map,
which is a module map, initially empty.
Each Document
has an opener policy,
which is an opener policy, initially a new opener policy.
Each Document
has an is initial about:blank
, which is a
boolean, initially false.
Each Document
has a during-loading
navigation ID for WebDriver BiDi, which is a navigation ID or null, initially
null.
As the name indicates, this is used for interfacing with the WebDriver
BiDi specification, which needs to be informed about certain occurrences during the early
parts of the Document
's lifecycle, in a way that ties them to the original
navigation ID used when the navigation that created this Document
was
the ongoing navigation. This eventually gets set back to null, after WebDriver
BiDi considers the loading process to be finished. BIDI
Each Document
has an about base
URL, which is a URL or null, initially null.
This is only populated for "about:
"-schemed
Document
s.
Each Document
has a bfcache blocking details, which is a
set of not restored reason details,
initially empty.
DocumentOrShadowRoot
interfaceDOM defines the DocumentOrShadowRoot
mixin, which this specification
extends.
partial interface mixin DocumentOrShadowRoot {
readonly attribute Element? activeElement;
};
document.referrer
Returns the URL of the Document
from
which the user navigated to this one, unless it was blocked or there was no such document, in
which case it returns the empty string.
The noreferrer
link type can be used to block the
referrer.
The referrer
attribute must return the document's referrer.
document.cookie [ = value ]
Returns the HTTP cookies that apply to the Document
. If there are no cookies or
cookies can't be applied to this resource, the empty string will be returned.
Can be set, to add a new cookie to the element's set of HTTP cookies.
If the contents are sandboxed into an
opaque origin (e.g., in an iframe
with the sandbox
attribute), a
"SecurityError
" DOMException
will be thrown on getting
and setting.
The cookie
attribute represents the cookies of the resource identified by the document's URL.
A Document
object that falls into one of the following conditions is a
cookie-averse Document
object:
Document
object whose browsing
context is null.Document
whose URL's scheme is not an HTTP(S) scheme.
On getting, if the document is a cookie-averse Document
object, then the
user agent must return the empty string. Otherwise, if the Document
's origin is an opaque
origin, the user agent must throw a "SecurityError
"
DOMException
. Otherwise, the user agent must return the cookie-string
for the document's URL for a "non-HTTP" API, decoded
using UTF-8 decode without BOM. COOKIES
On setting, if the document is a cookie-averse Document
object, then
the user agent must do nothing. Otherwise, if the Document
's origin is an opaque
origin, the user agent must throw a "SecurityError
"
DOMException
. Otherwise, the user agent must act as it would when receiving a set-cookie-string for the document's
URL via a "non-HTTP" API, consisting of the new value
encoded as UTF-8. COOKIES ENCODING
Since the cookie
attribute is accessible
across frames, the path restrictions on cookies are only a tool to help manage which cookies are
sent to which parts of the site, and are not in any way a security feature.
The cookie
attribute's getter and
setter synchronously access shared state. Since there is no locking mechanism, other browsing
contexts in a multiprocess user agent can modify cookies while scripts are running. A site could,
for instance, try to read a cookie, increment its value, then write it back out, using the new
value of the cookie as a unique identifier for the session; if the site does this twice in two
different browser windows at the same time, it might end up using the same "unique" identifier for
both sessions, with potentially disastrous effects.
document.lastModified
Returns the date of the last modification to the document, as reported by the server, in the
form "MM/DD/YYYY hh:mm:ss
", in the user's local time zone.
If the last modification date is not known, the current time is returned instead.
The lastModified
attribute, on getting, must return
the date and time of the Document
's source file's last modification, in the user's
local time zone, in the following format:
The month component of the date.
A U+002F SOLIDUS character (/).
The day component of the date.
A U+002F SOLIDUS character (/).
The year component of the date.
A U+0020 SPACE character.
The hours component of the time.
A U+003A COLON character (:).
The minutes component of the time.
A U+003A COLON character (:).
The seconds component of the time.
All the numeric components above, other than the year, must be given as two ASCII digits representing the number in base ten, zero-padded if necessary. The year must be given as the shortest possible string of four or more ASCII digits representing the number in base ten, zero-padded if necessary.
The Document
's source file's last modification date and time must be derived from
relevant features of the networking protocols used, e.g. from the value of the HTTP `Last-Modified
` header of the document, or from metadata in the
file system for local files. If the last modification date and time are not known, the attribute
must return the current date and time in the above format.
document.readyState
Returns "loading
" while the Document
is loading, "interactive
" once it is finished parsing but still loading subresources, and
"complete
" once it has loaded.
The readystatechange
event fires on the
Document
object when this value changes.
The DOMContentLoaded
event fires after the transition to
"interactive
" but before the transition to "complete
", at the point where all subresources apart from async
script
elements have loaded.
Each Document
has a current document readiness, a string, initially
"complete
".
For Document
objects created via the create and initialize a Document
object
algorithm, this will be immediately reset to "loading
" before any script
can observe the value of document.readyState
. This
default applies to other cases such as initial
about:blank
Document
s or Document
s without a
browsing context.
The readyState
getter steps are to return
this's current document readiness.
To update the current document readiness for Document
document to readinessValue:
If document's current document readiness equals readinessValue, then return.
Set document's current document readiness to readinessValue.
If document is associated with an HTML parser, then:
Let now be the current high resolution time given document's relevant global object.
If readinessValue is "complete
", and
document's load timing info's DOM complete time is 0, then
set document's load timing info's DOM complete time to
now.
Otherwise, if readinessValue is "interactive
", and
document's load timing info's DOM interactive time is 0,
then set document's load timing info's DOM interactive
time to now.
Fire an event named readystatechange
at document.
A Document
is said to have an active parser if it is associated with an
HTML parser or an XML parser that has not yet been stopped or aborted.
A Document
has a document load timing info load timing info.
A Document
has a document unload timing info previous document unload timing.
A Document
has a boolean was created via cross-origin redirects,
initially false.
The document load timing info struct has the following items:
DOMHighResTimeStamp
valuesThe document unload timing info struct has the following items:
DOMHighResTimeStamp
valuesEach Document
has a render-blocking element set, a set of
elements, initially the empty set.
A Document
document allows adding render-blocking elements
if document's content type is
"text/html
" and the body element of document is null.
A Document
document is render-blocked if both of the
following are true:
document's render-blocking element set is non-empty, or document allows adding render-blocking elements.
The current high resolution time given document's relevant global object has not exceeded an implementation-defined timeout value.
An element el is render-blocking if el's node document document is render-blocked, and el is in document's render-blocking element set.
To block rendering on an element el:
Let document be el's node document.
If document allows adding render-blocking elements, then append el to document's render-blocking element set.
To unblock rendering on an element el:
Let document be el's node document.
Remove el from document's render-blocking element set.
Whenever a render-blocking element el becomes browsing-context disconnected, or el's blocking attribute's value is changed so that el is no longer potentially render-blocking, then unblock rendering on el.
The html
element of a document is its document element,
if it's an html
element, and null otherwise.
document.head
Returns the head
element.
The head
element of a document is the first head
element
that is a child of the html
element, if there is one, or null
otherwise.
The head
attribute,
on getting, must return the head
element of the document (a
head
element or null).
document.title [ = value ]
Returns the document's title, as given by the title
element for
HTML and as given by the SVG title
element for SVG.
Can be set, to update the document's title. If there is no appropriate element to update, the new value is ignored.
The title
element of a document is the first title
element
in the document (in tree order), if there is one, or null otherwise.
The title
attribute must, on getting, run the following
algorithm:
If the document element is an SVG svg
element, then
let value be the child text content of the first SVG
title
element that is a child of the document element.
Otherwise, let value be the child text content of the
title
element, or the empty string if the title
element is null.
Strip and collapse ASCII whitespace in value.
Return value.
On setting, the steps corresponding to the first matching condition in the following list must be run:
svg
elementIf there is an SVG title
element that is a child of the
document element, let element be the first such element.
Otherwise:
Let element be the result of creating an
element given the document element's node document, title
, and the SVG namespace.
Insert element as the first child of the document element.
String replace all with the given value within element.
If the title
element is null and the head
element is null, then return.
If the title
element is non-null, let element be
the title
element.
Otherwise:
Let element be the result of creating an
element given the document element's node document,
title
, and the HTML namespace.
Append element to the
head
element.
String replace all with the given value within element.
Do nothing.
document.body [ = value ]
Returns the body element.
Can be set, to replace the body element.
If the new value is not a body
or frameset
element, this will throw
a "HierarchyRequestError
" DOMException
.
The body element of a document is the first of the html
element's children that is either a body
element or a frameset
element, or null if there is no such element.
The body
attribute,
on getting, must return the body element of the document (either a body
element, a frameset
element, or null). On setting, the following algorithm must be
run:
body
or frameset
element, then throw a
"HierarchyRequestError
" DOMException
.HierarchyRequestError
" DOMException
.The value returned by the body
getter is
not always the one passed to the setter.
In this example, the setter successfully inserts a body
element (though this is
non-conforming since SVG does not allow a body
as child of SVG
svg
). However the getter will return null because the document element is not
html
.
<svg xmlns="http://www.w3.org/2000/svg">
<script>
document.body = document.createElementNS("http://www.w3.org/1999/xhtml", "body");
console.assert(document.body === null);
</script>
</svg>
document.images
Returns an HTMLCollection
of the img
elements in the
Document
.
document.embeds
document.plugins
Returns an HTMLCollection
of the embed
elements in the
Document
.
document.links
Returns an HTMLCollection
of the a
and area
elements
in the Document
that have href
attributes.
document.forms
Returns an HTMLCollection
of the form
elements in the
Document
.
document.scripts
Returns an HTMLCollection
of the script
elements in the
Document
.
The images
attribute must return an HTMLCollection
rooted at the Document
node,
whose filter matches only img
elements.
The embeds
attribute must return an HTMLCollection
rooted at the Document
node,
whose filter matches only embed
elements.
The plugins
attribute must return the same object as that returned by the embeds
attribute.
The links
attribute must return an HTMLCollection
rooted at the Document
node,
whose filter matches only a
elements with href
attributes and area
elements with href
attributes.
The forms
attribute must return an HTMLCollection
rooted at the Document
node,
whose filter matches only form
elements.
The scripts
attribute must return an HTMLCollection
rooted at the Document
node,
whose filter matches only script
elements.
collection = document.getElementsByName(name)
Returns a NodeList
of elements in the Document
that have a name
attribute with the value name.
The getElementsByName(elementName)
method
steps are to return a live NodeList
containing all the HTML
elements in that document that have a name
attribute whose value is
identical to the elementName argument, in tree order. When the
method is invoked on a Document
object again with the same argument, the user agent
may return the same as the object returned by the earlier call. In other cases, a new
NodeList
object must be returned.
document.currentScript
Returns the script
element, or the SVG script
element,
that is currently executing, as long as the element represents a classic script. In
the case of reentrant script execution, returns the one that most recently started executing
amongst those that have not yet finished executing.
Returns null if the Document
is not currently executing a script
or
SVG script
element (e.g., because the running script is an event
handler, or a timeout), or if the currently executing script
or SVG
script
element represents a module script.
The currentScript
attribute, on getting, must return
the value to which it was most recently set. When the Document
is created, the currentScript
must be initialized to null.
This API has fallen out of favor in the implementer and standards community, as
it globally exposes script
or SVG script
elements. As such,
it is not available in newer contexts, such as when running module
scripts or when running scripts in a shadow tree. We are looking into creating
a new solution for identifying the running script in such contexts, which does not make it
globally available: see issue #1013.
The Document
interface supports named properties. The supported property names of a
Document
object document at any moment consist of the following, in
tree order according to the element that contributed them, ignoring later duplicates,
and with values from id
attributes coming before values from name
attributes when the same element contributes both:
the value of the name
content attribute for all
exposed embed
, form
, iframe
,
img
, and exposed object
elements that have a non-empty
name
content attribute and are in a document tree with
document as their root;
the value of the id
content attribute for all
exposed object
elements that have a non-empty
id
content attribute and are in a document tree with
document as their root; and
the value of the id
content attribute for all
img
elements that have both a non-empty id
content
attribute and a non-empty name
content attribute, and are in a
document tree with document as their root.
To determine the value of a named property
name for a Document
, the user agent must return the value obtained using
the following steps:
Let elements be the list of named
elements with the name name that are in a document tree with the
Document
as their root.
There will be at least one such element, since the algorithm would otherwise not have been invoked by Web IDL.
If elements has only one element, and that element is an iframe
element, and that iframe
element's content navigable is not null, then
return the active WindowProxy
of the element's
content navigable.
Otherwise, if elements has only one element, return that element.
Otherwise, return an HTMLCollection
rooted at the Document
node,
whose filter matches only named elements with
the name name.
Named elements with the name name, for the purposes of the above algorithm, are those that are either:
embed
, form
, iframe
,
img
, or exposed object
elements that have a name
content attribute whose value is name, orobject
elements that have an id
content attribute whose value is name, orimg
elements that have an id
content attribute
whose value is name, and that have a non-empty name
content attribute present also.An embed
or object
element is said to be exposed if it has
no exposed object
ancestor, and, for object
elements, is
additionally either not showing its fallback content or has no object
or
embed
descendants.
The dir
attribute on the
Document
interface is defined along with the dir
content attribute.
Elements, attributes, and attribute values in HTML are defined (by this specification) to have
certain meanings (semantics). For example, the ol
element represents an ordered list,
and the lang
attribute represents the language of the content.
These definitions allow HTML processors, such as web browsers or search engines, to present and use documents and applications in a wide variety of contexts that the author might not have considered.
As a simple example, consider a web page written by an author who only considered desktop computer web browsers:
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>My Page</title>
</head>
<body>
<h1>Welcome to my page</h1>
<p>I like cars and lorries and have a big Jeep!</p>
<h2>Where I live</h2>
<p>I live in a small hut on a mountain!</p>
</body>
</html>
Because HTML conveys meaning, rather than presentation, the same page can also be used by a small browser on a mobile phone, without any change to the page. Instead of headings being in large letters as on the desktop, for example, the browser on the mobile phone might use the same size text for the whole page, but with the headings in bold.
But it goes further than just differences in screen size: the same page could equally be used by a blind user using a browser based around speech synthesis, which instead of displaying the page on a screen, reads the page to the user, e.g. using headphones. Instead of large text for the headings, the speech browser might use a different volume or a slower voice.
That's not all, either. Since the browsers know which parts of the page are the headings, they can create a document outline that the user can use to quickly navigate around the document, using keys for "jump to next heading" or "jump to previous heading". Such features are especially common with speech browsers, where users would otherwise find quickly navigating a page quite difficult.
Even beyond browsers, software can make use of this information. Search engines can use the headings to more effectively index a page, or to provide quick links to subsections of the page from their results. Tools can use the headings to create a table of contents (that is in fact how this very specification's table of contents is generated).
This example has focused on headings, but the same principle applies to all of the semantics in HTML.
Authors must not use elements, attributes, or attribute values for purposes other than their appropriate intended semantic purpose, as doing so prevents software from correctly processing the page.
For example, the following snippet, intended to represent the heading of a corporate site, is non-conforming because the second line is not intended to be a heading of a subsection, but merely a subheading or subtitle (a subordinate heading for the same section).
<body>
<h1>ACME Corporation</h1>
<h2>The leaders in arbitrary fast delivery since 1920</h2>
...
The hgroup
element can be used for these kinds of situations:
<body>
<hgroup>
<h1>ACME Corporation</h1>
<p>The leaders in arbitrary fast delivery since 1920</p>
</hgroup>
...
The document in this next example is similarly non-conforming, despite
being syntactically correct, because the data placed in the cells is clearly
not tabular data, and the cite
element mis-used:
<!DOCTYPE HTML>
<html lang="en-GB">
<head> <title> Demonstration </title> </head>
<body>
<table>
<tr> <td> My favourite animal is the cat. </td> </tr>
<tr>
<td>
—<a href="https://example.org/~ernest/"><cite>Ernest</cite></a>,
in an essay from 1992
</td>
</tr>
</table>
</body>
</html>
This would make software that relies on these semantics fail: for example, a speech browser that allowed a blind user to navigate tables in the document would report the quote above as a table, confusing the user; similarly, a tool that extracted titles of works from pages would extract "Ernest" as the title of a work, even though it's actually a person's name, not a title.
A corrected version of this document might be:
<!DOCTYPE HTML>
<html lang="en-GB">
<head> <title> Demonstration </title> </head>
<body>
<blockquote>
<p> My favourite animal is the cat. </p>
</blockquote>
<p>
—<a href="https://example.org/~ernest/">Ernest</a>,
in an essay from 1992
</p>
</body>
</html>
Authors must not use elements, attributes, or attribute values that are not permitted by this specification or other applicable specifications, as doing so makes it significantly harder for the language to be extended in the future.
In the next example, there is a non-conforming attribute value ("carpet") and a non-conforming attribute ("texture"), which is not permitted by this specification:
<label>Carpet: <input type="carpet" name="c" texture="deep pile"></label>
Here would be an alternative and correct way to mark this up:
<label>Carpet: <input type="text" class="carpet" name="c" data-texture="deep pile"></label>
DOM nodes whose node document's browsing context is null are exempt from all document conformance requirements other than the HTML syntax requirements and XML syntax requirements.
In particular, the template
element's template contents's node
document's browsing context is null. For
example, the content model requirements and
attribute value microsyntax requirements do not apply to a template
element's
template contents. In this example an img
element has attribute values
that are placeholders that would be invalid outside a template
element.
<template>
<article>
<img src="{{src}}" alt="{{alt}}">
<h1></h1>
</article>
</template>
However, if the above markup were to omit the </h1>
end tag, that
would be a violation of the HTML syntax, and would thus be flagged as an
error by conformance checkers.
Through scripting and using other mechanisms, the values of attributes, text, and indeed the entire structure of the document may change dynamically while a user agent is processing it. The semantics of a document at an instant in time are those represented by the state of the document at that instant in time, and the semantics of a document can therefore change over time. User agents must update their presentation of the document as this occurs.
HTML has a progress
element that describes a progress bar. If its
"value" attribute is dynamically updated by a script, the UA would update the rendering to show
the progress changing.
The nodes representing HTML elements in the DOM must implement, and expose to scripts, the interfaces listed for them in the relevant sections of this specification. This includes HTML elements in XML documents, even when those documents are in another context (e.g. inside an XSLT transform).
Elements in the DOM represent things; that is, they have intrinsic meaning, also known as semantics.
For example, an ol
element represents an ordered list.
Elements can be referenced (referred to) in some way, either
explicitly or implicitly. One way that an element in the DOM can be explicitly referenced is by
giving an id
attribute to the element, and then creating a
hyperlink with that id
attribute's value as the fragment for the hyperlink's href
attribute value. Hyperlinks are not necessary for a
reference, however; any manner of referring to the element in question will suffice.
Consider the following figure
element, which is given an id
attribute:
<figure id="module-script-graph">
<img src="module-script-graph.svg"
alt="Module A depends on module B, which depends
on modules C and D.">
<figcaption>Figure 27: a simple module graph</figcaption>
</figure>
A hyperlink-based reference could be created
using the a
element, like so:
As we can see in <a href="#module-script-graph">figure 27</a>, ...
However, there are many other ways of referencing the
figure
element, such as:
"As depicted in the figure of modules A, B, C, and D..."
"In Figure 27..." (without a hyperlink)
"From the contents of the 'simple module graph' figure..."
"In the figure below..." (but this is discouraged)
The basic interface, from which all the HTML elements' interfaces inherit, and which must be used by elements that have no additional requirements, is
the HTMLElement
interface.
[Exposed=Window]
interface HTMLElement : Element {
[HTMLConstructor] constructor();
// metadata attributes
[CEReactions] attribute DOMString title;
[CEReactions] attribute DOMString lang;
[CEReactions] attribute boolean translate;
[CEReactions] attribute DOMString dir;
// user interaction
[CEReactions] attribute (boolean or unrestricted double or DOMString)? hidden;
[CEReactions] attribute boolean inert;
undefined click();
[CEReactions] attribute DOMString accessKey;
readonly attribute DOMString accessKeyLabel;
[CEReactions] attribute boolean draggable;
[CEReactions] attribute boolean spellcheck;
[CEReactions] attribute DOMString writingSuggestions;
[CEReactions] attribute DOMString autocapitalize;
[CEReactions] attribute boolean autocorrect;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText;
ElementInternals attachInternals();
// The popover API
undefined showPopover(optional ShowPopoverOptions options = {});
undefined hidePopover();
boolean togglePopover(optional (TogglePopoverOptions or boolean) options = {});
[CEReactions] attribute DOMString? popover;
};
dictionary ShowPopoverOptions {
HTMLElement source;
};
dictionary TogglePopoverOptions : ShowPopoverOptions {
boolean force;
};
HTMLElement includes GlobalEventHandlers;
HTMLElement includes ElementContentEditable;
HTMLElement includes HTMLOrSVGElement;
[Exposed=Window]
interface HTMLUnknownElement : HTMLElement {
// Note: intentionally no [HTMLConstructor]
};
The HTMLElement
interface holds methods and attributes related to a number of
disparate features, and the members of this interface are therefore described in various different
sections of this specification.
The element interface for an element with name name in the HTML namespace is determined as follows:
If name is applet
, bgsound
, blink
,
isindex
, keygen
, multicol
, nextid
, or
spacer
, then return HTMLUnknownElement
.
If name is acronym
, basefont
, big
,
center
, nobr
, noembed
, noframes
,
plaintext
, rb
, rtc
, strike
, or
tt
, then return HTMLElement
.
If name is listing
or xmp
, then return
HTMLPreElement
.
Otherwise, if this specification defines an interface appropriate for the element type corresponding to the local name name, then return that interface.
If other applicable specifications define an appropriate interface for name, then return the interface they define.
If name is a valid custom element name, then return
HTMLElement
.
Return HTMLUnknownElement
.
The use of HTMLElement
instead of HTMLUnknownElement
in
the case of valid custom element names is done to
ensure that any potential future upgrades only cause
a linear transition of the element's prototype chain, from HTMLElement
to a subclass,
instead of a lateral one, from HTMLUnknownElement
to an unrelated subclass.
Features shared between HTML and SVG elements use the HTMLOrSVGElement
interface
mixin: SVG
interface mixin HTMLOrSVGElement {
[SameObject] readonly attribute DOMStringMap dataset;
attribute DOMString nonce; // intentionally no [CEReactions]
[CEReactions] attribute boolean autofocus;
[CEReactions] attribute long tabIndex;
undefined focus(optional FocusOptions options = {});
undefined blur();
};
An example of an element that is neither an HTML nor SVG element is one created as follows:
const el = document.createElementNS("some namespace", "example");
console.assert(el.constructor === Element);
To support the custom elements feature, all HTML elements have
special constructor behavior. This is indicated via the [HTMLConstructor]
IDL
extended attribute. It indicates that the interface object for the given interface
will have a specific behavior when called, as defined in detail below.
The [HTMLConstructor]
extended attribute must take no
arguments, and must only appear on constructor
operations. It must appear only once on a constructor operation, and the interface must
contain only the single, annotated constructor operation, and no others. The annotated
constructor operation must be declared to take no arguments.
Interfaces declared with constructor operations that are annotated with the [HTMLConstructor]
extended attribute have the following
overridden constructor steps:
Let registry be the current global object's
CustomElementRegistry
object.
If NewTarget is equal to the active function
object, then throw a TypeError
.
This can occur when a custom element is defined using an element interface as its constructor:
customElements.define("bad-1", HTMLButtonElement);
new HTMLButtonElement(); // (1)
document.createElement("bad-1"); // (2)
In this case, during the execution of HTMLButtonElement
(either explicitly, as
in (1), or implicitly, as in (2)), both the active function object and
NewTarget are HTMLButtonElement
. If this check was not present, it
would be possible to create an instance of HTMLButtonElement
whose local name was
bad-1
.
Let definition be the entry in registry with constructor equal to
NewTarget. If there is no such definition, then throw a TypeError
.
Since there can be no entry in registry with a constructor of undefined, this step also prevents HTML element constructors from being called as functions (since in that case NewTarget will be undefined).
Let is value be null.
If definition's local name is equal to definition's name (i.e., definition is for an autonomous custom element), then:
If the active function object is not HTMLElement
, then throw a
TypeError
.
This can occur when a custom element is defined to not extend any local names, but
inherits from a non-HTMLElement
class:
customElements.define("bad-2", class Bad2 extends HTMLParagraphElement {});
In this case, during the (implicit) super()
call that occurs when
constructing an instance of Bad2
, the active function
object is HTMLParagraphElement
, not HTMLElement
.
Otherwise (i.e., if definition is for a customized built-in element):
Let valid local names be the list of local names for elements defined in this specification or in other applicable specifications that use the active function object as their element interface.
If valid local names does not contain definition's local name, then throw a
TypeError
.
This can occur when a custom element is defined to extend a given local name but inherits from the wrong class:
customElements.define("bad-3", class Bad3 extends HTMLQuoteElement {}, { extends: "p" });
In this case, during the (implicit) super()
call that occurs when
constructing an instance of Bad3
, valid local names is the
list containing q
and blockquote
, but definition's local name is p
,
which is not in that list.
Set is value to definition's name.
If definition's construction stack is empty, then:
Let element be the result of internally creating a new object implementing the interface to which the active function object corresponds, given the current realm and NewTarget.
Set element's node document to the current global
object's associated
Document
.
Set element's namespace to the HTML namespace.
Set element's namespace prefix to null.
Set element's local name to definition's local name.
Set element's custom element state to "custom
".
Set element's custom element definition to definition.
Set element's is
value to is value.
Return element.
This occurs when author script constructs a new custom element directly, e.g.
via new MyCustomElement()
.
Let prototype be ? Get(NewTarget, "prototype").
If prototype is not an Object, then:
Let realm be ? GetFunctionRealm(NewTarget).
Set prototype to the interface prototype object of realm whose interface is the same as the interface of the active function object.
The realm of the active function object might not be realm, so we are using the more general concept of "the same interface" across realms; we are not looking for equality of interface objects. This fallback behavior, including using the realm of NewTarget and looking up the appropriate prototype there, is designed to match analogous behavior for the JavaScript built-ins and Web IDL's internally create a new object implementing the interface algorithm.
Let element be the last entry in definition's construction stack.
If element is an already
constructed marker, then throw a TypeError
.
This can occur when the author code inside the custom element
constructor non-conformantly creates another
instance of the class being constructed, before calling super()
:
let doSillyThing = true;
class DontDoThis extends HTMLElement {
constructor() {
if (doSillyThing) {
doSillyThing = false;
new DontDoThis();
// Now the construction stack will contain an already constructed marker.
}
// This will then fail with a TypeError:
super();
}
}
This can also occur when author code inside the custom element constructor non-conformantly calls super()
twice, since per the JavaScript specification, this actually executes the superclass
constructor (i.e. this algorithm) twice, before throwing an error:
class DontDoThisEither extends HTMLElement {
constructor() {
super();
// This will throw, but not until it has already called into the HTMLElement constructor
super();
}
}
Perform ? element.[[SetPrototypeOf]](prototype).
Replace the last entry in definition's construction stack with an already constructed marker.
Return element.
This step is normally reached when upgrading a custom element; the existing element is
returned, so that the super()
call inside the custom element
constructor assigns that existing element to this.
In addition to the constructor behavior implied by [HTMLConstructor]
, some elements also have named constructors (which are really factory functions with a modified prototype
property).
Named constructors for HTML elements can also be used in an extends
clause when defining a custom element constructor:
class AutoEmbiggenedImage extends Image {
constructor(width, height) {
super(width * 10, height * 10);
}
}
customElements.define("auto-embiggened", AutoEmbiggenedImage, { extends: "img" });
const image = new AutoEmbiggenedImage(15, 20);
console.assert(image.width === 150);
console.assert(image.height === 200);
Each element in this specification has a definition that includes the following information:
A list of categories to which the element belongs. These are used when defining the content models for each element.
A non-normative description of where the element can be used. This information is redundant with the content models of elements that allow this one as a child, and is provided only as a convenience.
For simplicity, only the most specific expectations are listed.
For example, all phrasing content is flow content. Thus, elements that are phrasing content will only be listed as "where phrasing content is expected", since this is the more-specific expectation. Anywhere that expects flow content also expects phrasing content, and thus also meets this expectation.
A normative description of what content must be included as children and descendants of the element.
A non-normative description of whether, in the text/html
syntax, the
start and end tags can
be omitted. This information is redundant with the normative requirements given in the optional tags section, and is provided in the element
definitions only as a convenience.
A normative list of attributes that may be specified on the element (except where otherwise disallowed), along with non-normative descriptions of those attributes. (The content to the left of the dash is normative, the content to the right of the dash is not.)
For authors: Conformance requirements for use of ARIA role
and aria-*
attributes are
defined in ARIA in HTML. ARIA ARIAHTML
For implementers: User agent requirements for implementing accessibility API semantics are defined in HTML Accessibility API Mappings. HTMLAAM
A normative definition of a DOM interface that such elements must implement.
This is then followed by a description of what the element represents, along with any additional normative conformance criteria that may apply to authors and implementations. Examples are sometimes also included.
An attribute value is a string. Except where otherwise specified, attribute values on HTML elements may be any string value, including the empty string, and there is no restriction on what text can be specified in such attribute values.
Each element defined in this specification has a content model: a description of the element's expected contents. An HTML element must have contents that match the requirements described in the element's content model. The contents of an element are its children in the DOM.
ASCII whitespace is always allowed between elements. User agents represent these
characters between elements in the source markup as Text
nodes in the DOM. Empty Text
nodes and
Text
nodes consisting of just sequences of those characters are considered
inter-element whitespace.
Inter-element whitespace, comment nodes, and processing instruction nodes must be ignored when establishing whether an element's contents match the element's content model or not, and must be ignored when following algorithms that define document and element semantics.
Thus, an element A is said to be preceded or followed
by a second element B if A and B have
the same parent node and there are no other element nodes or Text
nodes (other than
inter-element whitespace) between them. Similarly, a node is the only child of
an element if that element contains no other nodes other than inter-element
whitespace, comment nodes, and processing instruction nodes.
Authors must not use HTML elements anywhere except where they are explicitly allowed, as defined for each element, or as explicitly required by other specifications. For XML compound documents, these contexts could be inside elements from other namespaces, if those elements are defined as providing the relevant contexts.
The Atom Syndication Format defines a content
element. When its type
attribute has the value
xhtml
, The Atom Syndication Format requires that it contain a
single HTML div
element. Thus, a div
element is allowed in that context,
even though this is not explicitly normatively stated by this specification. ATOM
In addition, HTML elements may be orphan nodes (i.e. without a parent node).
For example, creating a td
element and storing it in a global variable in a
script is conforming, even though td
elements are otherwise only supposed to be used
inside tr
elements.
var data = {
name: "Banana",
cell: document.createElement('td'),
};
When an element's content model is nothing, the
element must contain no Text
nodes (other than inter-element whitespace)
and no element nodes.
Most HTML elements whose content model is "nothing" are also, for convenience, void elements (elements that have no end tag in the HTML syntax). However, these are entirely separate concepts.
Each element in HTML falls into zero or more categories that group elements with similar characteristics together. The following broad categories are used in this specification:
Some elements also fall into other categories, which are defined in other parts of this specification.
These categories are related as follows:
Sectioning content, heading content, phrasing content, embedded content, and interactive content are all types of flow content. Metadata is sometimes flow content. Metadata and interactive content are sometimes phrasing content. Embedded content is also a type of phrasing content, and sometimes is interactive content.
Other categories are also used for specific purposes, e.g. form controls are specified using a number of categories to define common requirements. Some elements have unique requirements and do not fit into any particular category.
Metadata content is content that sets up the presentation or behavior of the rest of the content, or that sets up the relationship of the document with other documents, or that conveys other "out of band" information.
base
link
meta
noscript
script
style
template
title
Elements from other namespaces whose semantics are primarily metadata-related (e.g. RDF) are also metadata content.
Thus, in the XML serialization, one can use RDF, like this:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:r="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xml:lang="en">
<head>
<title>Hedral's Home Page</title>
<r:RDF>
<Person xmlns="http://www.w3.org/2000/10/swap/pim/contact#"
r:about="https://hedral.example.com/#">
<fullName>Cat Hedral</fullName>
<mailbox r:resource="mailto:hedral@damowmow.com"/>
<personalTitle>Sir</personalTitle>
</Person>
</r:RDF>
</head>
<body>
<h1>My home page</h1>
<p>I like playing with string, I guess. Sister says squirrels are fun
too so sometimes I follow her to play with them.</p>
</body>
</html>
This isn't possible in the HTML serialization, however.
Most elements that are used in the body of documents and applications are categorized as flow content.
a
abbr
address
area
(if it is a descendant of a map
element)article
aside
audio
b
bdi
bdo
blockquote
br
button
canvas
cite
code
data
datalist
del
details
dfn
dialog
div
dl
em
embed
fieldset
figure
footer
form
h1
h2
h3
h4
h5
h6
header
hgroup
hr
i
iframe
img
input
ins
kbd
label
link
(if it is allowed in the body)main
(if it is a hierarchically correct main
element)map
mark
math
menu
meta
(if the itemprop
attribute is present)meter
nav
noscript
object
ol
output
p
picture
pre
progress
q
ruby
s
samp
script
search
section
select
slot
small
span
strong
sub
sup
svg
table
template
textarea
time
u
ul
var
video
wbr
Sectioning content is content that defines the scope of header
and footer
elements.
article
aside
nav
section
Heading content defines the heading of a section (whether explicitly marked up using sectioning content elements, or implied by the heading content itself).
h1
h2
h3
h4
h5
h6
hgroup
(if it has a descendant h1
to h6
element)Phrasing content is the text of the document, as well as elements that mark up that text at the intra-paragraph level. Runs of phrasing content form paragraphs.
a
abbr
area
(if it is a descendant of a map
element)audio
b
bdi
bdo
br
button
canvas
cite
code
data
datalist
del
dfn
em
embed
i
iframe
img
input
ins
kbd
label
link
(if it is allowed in the body)map
mark
math
meta
(if the itemprop
attribute is present)meter
noscript
object
output
picture
progress
q
ruby
s
samp
script
select
slot
small
span
strong
sub
sup
svg
template
textarea
time
u
var
video
wbr
Most elements that are categorized as phrasing content can only contain elements that are themselves categorized as phrasing content, not any flow content.
Text, in the context of content models, means either nothing,
or Text
nodes. Text is sometimes used as a content
model on its own, but is also phrasing content, and can be inter-element
whitespace (if the Text
nodes are empty or contain just ASCII
whitespace).
Text
nodes and attribute values must consist of scalar
values, excluding noncharacters, and controls other than ASCII whitespace.
This specification includes extra constraints on the exact value of Text
nodes and
attribute values depending on their precise context.
Embedded content is content that imports another resource into the document, or content from another vocabulary that is inserted into the document.
audio
canvas
embed
iframe
img
math
object
picture
svg
video
Elements that are from namespaces other than the HTML namespace and that convey content but not metadata, are embedded content for the purposes of the content models defined in this specification. (For example, MathML or SVG.)
Some embedded content elements can have fallback content: content that is to be used when the external resource cannot be used (e.g. because it is of an unsupported format). The element definitions state what the fallback is, if any.
Interactive content is content that is specifically intended for user interaction.
a
(if the href
attribute is present)audio
(if the controls
attribute is present)button
details
embed
iframe
img
(if the usemap
attribute is present)input
(if the type
attribute is not in the Hidden state)label
select
textarea
video
(if the controls
attribute is present)As a general rule, elements whose content model allows any flow content or
phrasing content should have at least one node in its contents that is palpable content and
that does not have the hidden
attribute specified.
Palpable content makes an element non-empty by providing either
some descendant non-empty text, or else something users can
hear (audio
elements) or view (video
, img
, or
canvas
elements) or otherwise interact with (for example, interactive form
controls).
This requirement is not a hard requirement, however, as there are many cases where an element can be empty legitimately, for example when it is used as a placeholder which will later be filled in by a script, or when the element is part of a template and would on most pages be filled in but on some pages is not relevant.
Conformance checkers are encouraged to provide a mechanism for authors to find elements that fail to fulfill this requirement, as an authoring aid.
The following elements are palpable content:
a
abbr
address
article
aside
audio
(if the controls
attribute is present)b
bdi
bdo
blockquote
button
canvas
cite
code
data
del
details
dfn
div
dl
(if the element's children include at least one name-value group)em
embed
fieldset
figure
footer
form
h1
h2
h3
h4
h5
h6
header
hgroup
i
iframe
img
input
(if the type
attribute is not in the Hidden state)ins
kbd
label
main
map
mark
math
menu
(if the element's children include at least one li
element)meter
nav
object
ol
(if the element's children include at least one li
element)output
p
picture
pre
progress
q
ruby
s
samp
search
section
select
small
span
strong
sub
sup
svg
table
textarea
time
u
ul
(if the element's children include at least one li
element)var
video
Script-supporting elements are those that do not represent anything themselves (i.e. they are not rendered), but are used to support scripts, e.g. to provide functionality for the user.
The following elements are script-supporting elements:
script
template
Some elements are described as transparent; they have "transparent" in the description of their content model. The content model of a transparent element is derived from the content model of its parent element: the elements required in the part of the content model that is "transparent" are the same elements as required in the part of the content model of the parent of the transparent element in which the transparent element finds itself.
For instance, an ins
element inside a ruby
element cannot contain an
rt
element, because the part of the ruby
element's content model that
allows ins
elements is the part that allows phrasing content, and the
rt
element is not phrasing content.
In some cases, where transparent elements are nested in each other, the process has to be applied iteratively.
Consider the following markup fragment:
<p><object><param><ins><map><a href="/">Apples</a></map></ins></object></p>
To check whether "Apples" is allowed inside the a
element, the content models are
examined. The a
element's content model is transparent, as is the map
element's, as is the ins
element's, as is the part of the object
element's in which the ins
element is found. The object
element is
found in the p
element, whose content model is phrasing content. Thus,
"Apples" is allowed, as text is phrasing content.
When a transparent element has no parent, then the part of its content model that is "transparent" must instead be treated as accepting any flow content.
The term paragraph as defined in this section is used for more than
just the definition of the p
element. The paragraph concept defined here
is used to describe how to interpret documents. The p
element is merely one of
several ways of marking up a paragraph.
A paragraph is typically a run of phrasing content that forms a block of text with one or more sentences that discuss a particular topic, as in typography, but can also be used for more general thematic grouping. For instance, an address is also a paragraph, as is a part of a form, a byline, or a stanza in a poem.
In the following example, there are two paragraphs in a section. There is also a heading, which contains phrasing content that is not a paragraph. Note how the comments and inter-element whitespace do not form paragraphs.
<section>
<h2>Example of paragraphs</h2>
This is the <em>first</em> paragraph in this example.
<p>This is the second.</p>
<!-- This is not a paragraph. -->
</section>
Paragraphs in flow content are defined relative to what the document looks like
without the a
, ins
, del
, and map
elements
complicating matters, since those elements, with their hybrid content models, can straddle
paragraph boundaries, as shown in the first two examples below.
Generally, having elements straddle paragraph boundaries is best avoided. Maintaining such markup can be difficult.
The following example takes the markup from the earlier example and puts ins
and
del
elements around some of the markup to show that the text was changed (though in
this case, the changes admittedly don't make much sense). Notice how this example has exactly the
same paragraphs as the previous one, despite the ins
and del
elements
— the ins
element straddles the heading and the first paragraph, and the
del
element straddles the boundary between the two paragraphs.
<section>
<ins><h2>Example of paragraphs</h2>
This is the <em>first</em> paragraph in</ins> this example<del>.
<p>This is the second.</p></del>
<!-- This is not a paragraph. -->
</section>
Let view be a view of the DOM that replaces all a
,
ins
, del
, and map
elements in the document with their contents. Then, in view, for each run
of sibling phrasing content nodes uninterrupted by other types of content, in an
element that accepts content other than phrasing content as well as phrasing
content, let first be the first node of the run, and let last be the last node of the run. For each such run that consists of at least one
node that is neither embedded content nor inter-element whitespace, a
paragraph exists in the original DOM from immediately before first to
immediately after last. (Paragraphs can thus span across a
,
ins
, del
, and map
elements.)
Conformance checkers may warn authors of cases where they have paragraphs that overlap each
other (this can happen with object
, video
, audio
, and
canvas
elements, and indirectly through elements in other namespaces that allow HTML
to be further embedded therein, like SVG svg
or MathML
math
).
A paragraph is also formed explicitly by p
elements.
The p
element can be used to wrap individual paragraphs when there
would otherwise not be any content other than phrasing content to separate the paragraphs from
each other.
In the following example, the link spans half of the first paragraph, all of the heading separating the two paragraphs, and half of the second paragraph. It straddles the paragraphs and the heading.
<header>
Welcome!
<a href="about.html">
This is home of...
<h1>The Falcons!</h1>
The Lockheed Martin multirole jet fighter aircraft!
</a>
This page discusses the F-16 Fighting Falcon's innermost secrets.
</header>
Here is another way of marking this up, this time showing the paragraphs explicitly, and splitting the one link element into three:
<header>
<p>Welcome! <a href="about.html">This is home of...</a></p>
<h1><a href="about.html">The Falcons!</a></h1>
<p><a href="about.html">The Lockheed Martin multirole jet
fighter aircraft!</a> This page discusses the F-16 Fighting
Falcon's innermost secrets.</p>
</header>
It is possible for paragraphs to overlap when using certain elements that define fallback content. For example, in the following section:
<section>
<h2>My Cats</h2>
You can play with my cat simulator.
<object data="cats.sim">
To see the cat simulator, use one of the following links:
<ul>
<li><a href="cats.sim">Download simulator file</a>
<li><a href="https://sims.example.com/watch?v=LYds5xY4INU">Use online simulator</a>
</ul>
Alternatively, upgrade to the Mellblom Browser.
</object>
I'm quite proud of it.
</section>
There are five paragraphs:
object
element.The first paragraph is overlapped by the other four. A user agent that supports the "cats.sim" resource will only show the first one, but a user agent that shows the fallback will confusingly show the first sentence of the first paragraph as if it was in the same paragraph as the second one, and will show the last paragraph as if it was at the start of the second sentence of the first paragraph.
To avoid this confusion, explicit p
elements can be used. For example:
<section>
<h2>My Cats</h2>
<p>You can play with my cat simulator.</p>
<object data="cats.sim">
<p>To see the cat simulator, use one of the following links:</p>
<ul>
<li><a href="cats.sim">Download simulator file</a>
<li><a href="https://sims.example.com/watch?v=LYds5xY4INU">Use online simulator</a>
</ul>
<p>Alternatively, upgrade to the Mellblom Browser.</p>
</object>
<p>I'm quite proud of it.</p>
</section>
The following attributes are common to and may be specified on all HTML elements (even those not defined in this specification):
accesskey
autocapitalize
autocorrect
autofocus
contenteditable
dir
draggable
enterkeyhint
hidden
inert
inputmode
is
itemid
itemprop
itemref
itemscope
itemtype
lang
nonce
popover
spellcheck
style
tabindex
title
translate
writingsuggestions
These attributes are only defined by this specification as attributes for HTML elements. When this specification refers to elements having these attributes, elements from namespaces that are not defined as having these attributes must not be considered as being elements with these attributes.
For example, in the following XML fragment, the "bogus
" element does not
have a dir
attribute as defined in this specification, despite
having an attribute with the literal name "dir
". Thus, the
directionality of the inner-most span
element is 'rtl', inherited from the div
element indirectly through
the "bogus
" element.
<div xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
<bogus xmlns="https://example.net/ns" dir="ltr">
<span xmlns="http://www.w3.org/1999/xhtml">
</span>
</bogus>
</div>
DOM defines the user agent requirements for the class
, id
, and slot
attributes for any element in any namespace.
DOM
The class
, id
, and slot
attributes may be specified on all HTML elements.
When specified on HTML elements, the class
attribute must have a value that is a set of space-separated tokens representing the
various classes that the element belongs to.
Assigning classes to an element affects class matching in selectors in CSS, the getElementsByClassName()
method in the DOM,
and other such features.
There are no additional restrictions on the tokens authors can use in the class
attribute, but authors are encouraged to use values that describe
the nature of the content, rather than values that describe the desired presentation of the
content.
When specified on HTML elements, the id
attribute
value must be unique amongst all the IDs in the element's
tree and must contain at least one character. The value must not contain any
ASCII whitespace.
The id
attribute specifies its element's unique identifier (ID).
There are no other restrictions on what form an ID can take; in particular, IDs can consist of just digits, start with a digit, start with an underscore, consist of just punctuation, etc.
An element's unique identifier can be used for a variety of purposes, most notably as a way to link to specific parts of a document using fragments, as a way to target an element when scripting, and as a way to style a specific element from CSS.
Identifiers are opaque strings. Particular meanings should not be derived from the value of the
id
attribute.
There are no conformance requirements for the slot
attribute
specific to HTML elements.
The slot
attribute is used to assign a
slot to an element: an element with a slot
attribute is
assigned to the slot
created by the slot
element whose name
attribute's value matches that slot
attribute's value — but only
if that slot
element finds itself in the shadow tree whose
root's host has the corresponding
slot
attribute value.
To enable assistive technology products to expose a more fine-grained interface than is
otherwise possible with HTML elements and attributes, a set of annotations
for assistive technology products can be specified (the ARIA role
and aria-*
attributes).
ARIA
The following event handler content attributes may be specified on any HTML element:
onauxclick
onbeforeinput
onbeforematch
onbeforetoggle
onblur
*oncancel
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextlost
oncontextmenu
oncontextrestored
oncopy
oncuechange
oncut
ondblclick
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onemptied
onended
onerror
*onfocus
*onformdata
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
*onloadeddata
onloadedmetadata
onloadstart
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onpaste
onpause
onplay
onplaying
onprogress
onratechange
onreset
onresize
*onscroll
*onscrollend
*onsecuritypolicyviolation
onseeked
onseeking
onselect
onslotchange
onstalled
onsubmit
onsuspend
ontimeupdate
ontoggle
onvolumechange
onwaiting
onwheel
The attributes marked with an asterisk have a different meaning when specified on
body
elements as those elements expose event handlers of the
Window
object with the same names.
While these attributes apply to all elements, they are not useful on all elements.
For example, only media elements will ever receive a volumechange
event fired by the user agent.
Custom data attributes (e.g. data-foldername
or data-msgid
) can be specified on any
HTML element, to store custom data, state, annotations, and
similar, specific to the page.
In HTML documents, elements in the HTML namespace may have an xmlns
attribute specified, if, and only if, it has the exact value "http://www.w3.org/1999/xhtml
". This does not apply to XML
documents.
In HTML, the xmlns
attribute has absolutely no effect. It
is basically a talisman. It is allowed merely to make migration to and from XML mildly easier.
When parsed by an HTML parser, the attribute ends up in no namespace, not the "http://www.w3.org/2000/xmlns/
" namespace like namespace declaration attributes in
XML do.
In XML, an xmlns
attribute is part of the namespace
declaration mechanism, and an element cannot actually have an xmlns
attribute in no namespace specified.
XML also allows the use of the xml:space
attribute in the XML namespace on any element in an XML
document. This attribute has no effect on HTML elements, as the default
behavior in HTML is to preserve whitespace. XML
There is no way to serialize the xml:space
attribute on HTML elements in the text/html
syntax.
title
attributeThe title
attribute
represents advisory information for the element, such as would be appropriate for a
tooltip. On a link, this could be the title or a description of the target resource; on an image,
it could be the image credit or a description of the image; on a paragraph, it could be a footnote
or commentary on the text; on a citation, it could be further information about the source; on
interactive content, it could be a label for, or instructions for, use of the
element; and so forth. The value is text.
Relying on the title
attribute is currently
discouraged as many user agents do not expose the attribute in an accessible manner as required by
this specification (e.g., requiring a pointing device such as a mouse to cause a tooltip to
appear, which excludes keyboard-only users and touch-only users, such as anyone with a modern
phone or tablet).
If this attribute is omitted from an element, then it implies that the title
attribute of the nearest ancestor HTML element with a title
attribute set is also
relevant to this element. Setting the attribute overrides this, explicitly stating that the
advisory information of any ancestors is not relevant to this element. Setting the attribute to
the empty string indicates that the element has no advisory information.
If the title
attribute's value contains U+000A LINE FEED (LF)
characters, the content is split into multiple lines. Each U+000A LINE FEED (LF) character
represents a line break.
Caution is advised with respect to the use of newlines in title
attributes.
For instance, the following snippet actually defines an abbreviation's expansion with a line break in it:
<p>My logs show that there was some interest in <abbr title="Hypertext
Transport Protocol">HTTP</abbr> today.</p>
Some elements, such as link
, abbr
, and input
, define
additional semantics for the title
attribute beyond the semantics
described above.
The advisory information of an element is the value that the following algorithm returns, with the algorithm being aborted once a value is returned. When the algorithm returns the empty string, then there is no advisory information.
If the element has a title
attribute, then return the
result of running normalize newlines on its value.
If the element has a parent element, then return the parent element's advisory information.
Return the empty string.
User agents should inform the user when elements have advisory information, otherwise the information would not be discoverable.
The title
IDL attribute
must reflect the title
content attribute.
lang
and xml:lang
attributesThe lang
attribute
(in no namespace) specifies the primary language for the element's contents and for any of the
element's attributes that contain text. Its value must be a valid BCP 47 language tag, or the
empty string. Setting the attribute to the empty string indicates that the primary language is
unknown. BCP47
The lang
attribute in the XML namespace is defined in XML.
XML
If these attributes are omitted from an element, then the language of this element is the same
as the language of its parent element, if any (except for slot
elements in a
shadow tree).
The lang
attribute in no namespace may be used on any HTML element.
The lang
attribute in the XML
namespace may be used on HTML elements in XML documents,
as well as elements in other namespaces if the relevant specifications allow it (in particular,
MathML and SVG allow lang
attributes in the
XML namespace to be specified on their elements). If both the lang
attribute in no namespace and the lang
attribute in the XML namespace are specified on the same
element, they must have exactly the same value when compared in an ASCII
case-insensitive manner.
Authors must not use the lang
attribute in
the XML namespace on HTML elements in HTML
documents. To ease migration to and from XML, authors may specify an attribute in no
namespace with no prefix and with the literal localname "xml:lang
" on
HTML elements in HTML documents, but such attributes must only be
specified if a lang
attribute in no namespace is also specified,
and both attributes must have the same value when compared in an ASCII
case-insensitive manner.
The attribute in no namespace with no prefix and with the literal localname "xml:lang
" has no effect on language processing.
To determine the language of a node, user agents must use the first appropriate step in the following list:
lang
attribute in the XML namespace setUse the value of that attribute.
lang
in no namespace
attribute setUse the value of that attribute.
Use the language of that shadow root's host.
Use the language of that parent element.
If there is a pragma-set default language set, then that is the language of the node. If there is no pragma-set default language set, then language information from a higher-level protocol (such as HTTP), if any, must be used as the final fallback language instead. In the absence of any such language information, and in cases where the higher-level protocol reports multiple languages, the language of the node is unknown, and the corresponding language tag is the empty string.
If the resulting value is not a recognized language tag, then it must be treated as an unknown language having the given language tag, distinct from all other languages. For the purposes of round-tripping or communicating with other services that expect language tags, user agents should pass unknown language tags through unmodified, and tagged as being BCP 47 language tags, so that subsequent services do not interpret the data as another type of language description. BCP47
Thus, for instance, an element with lang="xyzzy"
would be
matched by the selector :lang(xyzzy)
(e.g. in CSS), but it would not be
matched by :lang(abcde)
, even though both are equally invalid. Similarly, if
a web browser and screen reader working in unison communicated about the language of the element,
the browser would tell the screen reader that the language was "xyzzy", even if it knew it was
invalid, just in case the screen reader actually supported a language with that tag after all.
Even if the screen reader supported both BCP 47 and another syntax for encoding language names,
and in that other syntax the string "xyzzy" was a way to denote the Belarusian language, it would
be incorrect for the screen reader to then start treating text as Belarusian, because
"xyzzy" is not how Belarusian is described in BCP 47 codes (BCP 47 uses the code "be" for
Belarusian).
If the resulting value is the empty string, then it must be interpreted as meaning that the language of the node is explicitly unknown.
User agents may use the element's language to determine proper processing or rendering (e.g. in the selection of appropriate fonts or pronunciations, for dictionary selection, or for the user interfaces of form controls such as date pickers).
The lang
IDL attribute
must reflect the lang
content attribute in no
namespace.
translate
attributeThe translate
attribute is used to specify whether an element's attribute values and the values of its
Text
node children are to be translated when the page is localized, or whether to
leave them unchanged. It is an attribute is an enumerated attribute with the
following keywords and states:
Keyword | State | Brief description |
---|---|---|
yes
| yes | Sets translation mode to translate-enabled. |
(the empty string) | ||
no
| no | Sets translation mode to no-translate. |
The attribute's missing value default and invalid value default are both the inherit state.
Each element (even non-HTML elements) has a translation mode, which is in either the
translate-enabled state or the no-translate state. If an HTML element's translate
attribute is in the yes state, then the element's
translation mode is in the translate-enabled state; otherwise, if the
element's translate
attribute is in the no state, then the element's translation mode
is in the no-translate state. Otherwise, either the element's translate
attribute is in the inherit state, or the element is not an HTML element and thus does not have a translate
attribute; in either case, the element's
translation mode is in the same state as its parent element's, if any,
or in the translate-enabled state, if the element's parent element is
null.
When an element is in the translate-enabled state, the element's translatable
attributes and the values of its Text
node children are to be translated when
the page is localized.
When an element is in the no-translate state, the element's attribute values and the
values of its Text
node children are to be left as-is when the page is localized,
e.g. because the element contains a person's name or a name of a computer program.
The following attributes are translatable attributes:
abbr
on th
elementsalt
on area
,
img
, and
input
elementscontent
on meta
elements, if the name
attribute specifies a metadata name whose value is known to be translatabledownload
on a
and
area
elementslabel
on optgroup
,
option
, and
track
elementslang
on HTML elements; must be "translated" to match the language used in the translationplaceholder
on input
and
textarea
elementssrcdoc
on iframe
elements; must be parsed and recursively processedstyle
on HTML elements; must be parsed and
recursively processed (e.g. for the values of 'content' properties)title
on all HTML elementsvalue
on input
elements with a
type
attribute in the Button state
or the Reset Button stateOther specifications may define other attributes that are also translatable
attributes. For example, ARIA would define the aria-label
attribute as translatable.
The translate
IDL
attribute must, on getting, return true if the element's translation mode is
translate-enabled, and false otherwise. On setting, it must set the content
attribute's value to "yes
" if the new value is true, and set the content
attribute's value to "no
" otherwise.
In this example, everything in the document is to be translated when the page is localized, except the sample keyboard input and sample program output:
<!DOCTYPE HTML>
<html lang=en> <!-- default on the document element is translate=yes -->
<head>
<title>The Bee Game</title> <!-- implied translate=yes inherited from ancestors -->
</head>
<body>
<p>The Bee Game is a text adventure game in English.</p>
<p>When the game launches, the first thing you should do is type
<kbd translate=no>eat honey</kbd>. The game will respond with:</p>
<pre><samp translate=no>Yum yum! That was some good honey!</samp></pre>
</body>
</html>
dir
attributeThe dir
attribute
is an enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
ltr
| ltr | The contents of the element are explicitly directionally isolated left-to-right text. |
rtl
| rtl | The contents of the element are explicitly directionally isolated right-to-left text. |
auto
| auto | The contents of the element are explicitly directionally isolated text, but the direction is to be determined programmatically using the contents of the element (as described below). |
The heuristic used by the auto state is very crude (it just looks at the first character with a strong directionality, in a manner analogous to the Paragraph Level determination in the bidirectional algorithm). Authors are urged to only use this value as a last resort when the direction of the text is truly unknown and no better server-side heuristic can be applied. BIDI
For textarea
and pre
elements, the heuristic is applied on a
per-paragraph level.
The attribute's missing value default and invalid value default are both the undefined state.
The directionality of an element (any element, not just
an HTML element) is either 'ltr' or 'rtl'. To compute the directionality given an element element, switch on
element's dir
attribute state:
Return 'ltr'.
Return 'rtl'.
Let result be the auto directionality of element.
If result is null, then return 'ltr'.
Return result.
bdi
elementLet result be the auto directionality of element.
If result is null, then return 'ltr'.
Return result.
input
element whose type
attribute is in the Telephone stateReturn 'ltr'.
Return the parent directionality of element.
Since the dir
attribute is only defined for
HTML elements, it cannot be present on elements from other namespaces. Thus, elements
from other namespaces always end up using the parent directionality.
The auto-directionality form-associated elements are:
input
elements whose type
attribute is
in the Hidden, Text, Search,
Telephone, URL, Email, Password, Submit
Button, Reset Button, or Button state, and
textarea
elements.
To compute the auto directionality given an element element:
If element is an auto-directionality form-associated element:
If element's value contains a character of bidirectional character type AL or R, and there is no character of bidirectional character type L anywhere before it in the element's value, then return 'rtl'. BIDI
If element's value is not the empty string, then return 'ltr'.
Return null.
If element is a slot
element whose root is a
shadow root and element's assigned nodes are not empty:
For each node child of element's assigned nodes:
Let childDirection be null.
If child is a Text
node, then set childDirection to
the text node directionality of child.
Otherwise:
Assert: child is an Element
node.
Set childDirection to the contained text auto directionality of child with canExcludeRoot set to true.
If childDirection is not null, then return childDirection.
Return null.
Return the contained text auto directionality of element with canExcludeRoot set to false.
To compute the contained text auto directionality of an element element with a boolean canExcludeRoot:
For each node descendant of element's descendants, in tree order:
If any of
is one of
bdi
elementscript
elementstyle
elementtextarea
elementdir
attribute is not in the undefined statethen continue.
If descendant is a slot
element whose root is a
shadow root, then return the directionality of that shadow root's host.
If descendant is not a Text
node, then
continue.
Let result be the text node directionality of descendant.
If result is not null, then return result.
Return null.
To compute the text node directionality given a Text
node
text:
If text's data does not contain a code point whose bidirectional character type is L, AL, or R, then return null. BIDI
Let codePoint be the first code point in text's data whose bidirectional character type is L, AL, or R.
If codePoint is of bidirectional character type AL or R, then return 'rtl'.
If codePoint is of bidirectional character type L, then return 'ltr'.
To compute the parent directionality given an element element:
Let parentNode be element's parent node.
If parentNode is a shadow root, then return the directionality of parentNode's host.
If parentNode is an element, then return the directionality of parentNode.
Return 'ltr'.
This attribute has rendering requirements involving the bidirectional algorithm.
The directionality of an attribute of an HTML element, which is used when the text of that attribute is to be included in the rendering in some manner, is determined as per the first appropriate set of steps from the following list:
dir
attribute is in the auto
stateFind the first character (in logical order) of the attribute's value that is of bidirectional character type L, AL, or R. BIDI
If such a character is found and it is of bidirectional character type AL or R, the directionality of the attribute is 'rtl'.
Otherwise, the directionality of the attribute is 'ltr'.
The following attributes are directionality-capable attributes:
abbr
on th
elementsalt
on area
,
img
, and
input
elementscontent
on meta
elements, if the name
attribute specifies a metadata name whose value is primarily intended to be human-readable rather than machine-readablelabel
on optgroup
,
option
, and
track
elementsplaceholder
on input
and
textarea
elementstitle
on all HTML elementsdocument.dir [ = value ]
Returns the html
element's dir
attribute's value, if any.
Can be set, to either "ltr
", "rtl
", or "auto
" to replace the html
element's dir
attribute's value.
If there is no html
element, returns the
empty string and ignores new values.
The dir
IDL attribute on
an element must reflect the dir
content attribute of
that element, limited to only known values.
The dir
IDL
attribute on Document
objects must reflect the dir
content attribute of the html
element, if
any, limited to only known values. If there is no such element, then the attribute
must return the empty string and do nothing on setting.
Authors are strongly encouraged to use the dir
attribute to indicate text direction rather than using CSS, since that way their documents will
continue to render correctly even in the absence of CSS (e.g. as interpreted by search
engines).
This markup fragment is of an IM conversation.
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> How do you write "What's your name?" in Arabic?</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> ما اسمك؟</p>
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> Thanks.</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> That's written "شكرًا".</p>
<p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> Do you know how to write "Please"?</p>
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> "من فضلك", right?</p>
Given a suitable style sheet and the default alignment styles for the p
element,
namely to align the text to the start edge of the paragraph, the resulting rendering could
be as follows:
As noted earlier, the auto
value is not a panacea. The
final paragraph in this example is misinterpreted as being right-to-left text, since it begins
with an Arabic character, which causes the "right?" to be to the left of the Arabic text.
style
attributeAll HTML elements may have the style
content attribute set. This is a style attribute as defined by CSS Style
Attributes. CSSATTR
In user agents that support CSS, the attribute's value must be parsed when the attribute is added or has its value changed, according to the rules given for style attributes. CSSATTR
However, if the Should element's inline behavior be blocked by Content Security
Policy? algorithm returns "Blocked
" when executed upon the
attribute's element, "style attribute
", and the attribute's
value, then the style rules defined in the attribute's value must not be applied to the
element. CSP
Documents that use style
attributes on any of their elements
must still be comprehensible and usable if those attributes were removed.
In particular, using the style
attribute to hide
and show content, or to convey meaning that is otherwise not included in the document, is
non-conforming. (To hide and show content, use the hidden
attribute.)
element.style
Returns a CSSStyleDeclaration
object for the element's style
attribute.
The style
IDL attribute is defined in CSS Object
Model. CSSOM
In the following example, the words that refer to colors are marked up using the
span
element and the style
attribute to make those
words show up in the relevant colors in visual media.
<p>My sweat suit is <span style="color: green; background:
transparent">green</span> and my eyes are <span style="color: blue;
background: transparent">blue</span>.</p>
data-*
attributesA custom data attribute is an attribute in no namespace whose name starts with the
string "data-
", has at least one character after the
hyphen, is XML-compatible, and contains no ASCII
upper alphas.
All attribute names on HTML elements in HTML documents get ASCII-lowercased automatically, so the restriction on ASCII uppercase letters doesn't affect such documents.
Custom data attributes are intended to store custom data, state, annotations, and similar, private to the page or application, for which there are no more appropriate attributes or elements.
These attributes are not intended for use by software that is not known to the administrators of the site that uses the attributes. For generic extensions that are to be used by multiple independent tools, either this specification should be extended to provide the feature explicitly, or a technology like microdata should be used (with a standardized vocabulary).
For instance, a site about music could annotate list items representing tracks in an album with custom data attributes containing the length of each track. This information could then be used by the site itself to allow the user to sort the list by track length, or to filter the list for tracks of certain lengths.
<ol>
<li data-length="2m11s">Beyond The Sea</li>
...
</ol>
It would be inappropriate, however, for the user to use generic software not associated with that music site to search for tracks of a certain length by looking at this data.
This is because these attributes are intended for use by the site's own scripts, and are not a generic extension mechanism for publicly-usable metadata.
Similarly, a page author could write markup that provides information for a translation tool that they are intending to use:
<p>The third <span data-mytrans-de="Anspruch">claim</span> covers the case of <span
translate="no">HTML</span> markup.</p>
In this example, the "data-mytrans-de
" attribute gives specific text
for the MyTrans product to use when translating the phrase "claim" to German. However, the
standard translate
attribute is used to tell it that in all
languages, "HTML" is to remain unchanged. When a standard attribute is available, there is no
need for a custom data attribute to be used.
In this example, custom data attributes are used to store the result of a feature detection
for PaymentRequest
, which could be used in CSS to style a checkout page
differently.
<script>
if ('PaymentRequest' in window) {
document.documentElement.dataset.hasPaymentRequest = '';
}
</script>
Here, the data-has-payment-request
attribute is effectively being used
as a boolean attribute; it is enough to check the presence of the attribute.
However, if the author so wishes, it could later be populated with some value, maybe to indicate
limited functionality of the feature.
Every HTML element may have any number of custom data attributes specified, with any value.
Authors should carefully design such extensions so that when the attributes are ignored and any associated CSS dropped, the page is still usable.
User agents must not derive any implementation behavior from these attributes or values. Specifications intended for user agents must not define these attributes to have any meaningful values.
JavaScript libraries may use the custom data attributes, as they are considered to be part of the page on which they are used. Authors of libraries that are reused by many authors are encouraged to include their name in the attribute names, to reduce the risk of clashes. Where it makes sense, library authors are also encouraged to make the exact name used in the attribute names customizable, so that libraries whose authors unknowingly picked the same name can be used on the same page, and so that multiple versions of a particular library can be used on the same page even when those versions are not mutually compatible.
For example, a library called "DoQuery" could use attribute names like data-doquery-range
, and a library called "jJo" could use attributes names like
data-jjo-range
. The jJo library could also provide an API to set which
prefix to use (e.g. J.setDataPrefix('j2')
, making the attributes have names
like data-j2-range
).
element.dataset
Returns a DOMStringMap
object for the element's data-*
attributes.
Hyphenated names become camel-cased. For example, data-foo-bar=""
becomes element.dataset.fooBar
.
The dataset
IDL
attribute provides convenient accessors for all the data-*
attributes on an element. On getting, the dataset
IDL attribute
must return a DOMStringMap
whose associated element is this element.
The DOMStringMap
interface is used for the dataset
attribute. Each DOMStringMap
has an associated element.
[Exposed=Window,
LegacyOverrideBuiltIns]
interface DOMStringMap {
getter DOMString (DOMString name);
[CEReactions] setter undefined (DOMString name, DOMString value);
[CEReactions] deleter undefined (DOMString name);
};
To get a DOMStringMap
's name-value
pairs, run the following algorithm:
Let list be an empty list of name-value pairs.
For each content attribute on the DOMStringMap
's associated element whose first five characters are
the string "data-
" and whose remaining characters (if any) do not include
any ASCII upper alphas, in the order that those
attributes are listed in the element's attribute list, add a name-value pair to
list whose name is the attribute's name with the first five characters removed and
whose value is the attribute's value.
For each name in list, for each U+002D HYPHEN-MINUS character (-) in the name that is followed by an ASCII lower alpha, remove the U+002D HYPHEN-MINUS character (-) and replace the character that followed it by the same character converted to ASCII uppercase.
Return list.
The supported property names on a DOMStringMap
object at any instant
are the names of each pair returned from getting the
DOMStringMap
's name-value pairs at that instant, in the order returned.
To determine the value of a named property
name for a DOMStringMap
, return the value component of the name-value pair
whose name component is name in the list returned from getting the DOMStringMap
's name-value
pairs.
To set the value of a new named property or
set the value of an existing named property for a DOMStringMap
, given a
property name name and a new value value, run the following steps:
If name contains a U+002D HYPHEN-MINUS character (-) followed by an ASCII
lower alpha, then throw a "SyntaxError
"
DOMException
.
For each ASCII upper alpha in name, insert a U+002D HYPHEN-MINUS character (-) before the character and replace the character with the same character converted to ASCII lowercase.
Insert the string data-
at the front of name.
If name does not match the XML Name
production,
throw an "InvalidCharacterError
" DOMException
.
Set an attribute value for the
DOMStringMap
's associated element
using name and value.
To delete an existing named property
name for a DOMStringMap
, run the following steps:
For each ASCII upper alpha in name, insert a U+002D HYPHEN-MINUS character (-) before the character and replace the character with the same character converted to ASCII lowercase.
Insert the string data-
at the front of name.
Remove an attribute by name given
name and the DOMStringMap
's associated element.
This algorithm will only get invoked by Web IDL for names that
are given by the earlier algorithm for getting the
DOMStringMap
's name-value pairs. WEBIDL
If a web page wanted an element to represent a space ship, e.g. as part of a game, it would
have to use the class
attribute along with data-*
attributes:
<div class="spaceship" data-ship-id="92432"
data-weapons="laser 2" data-shields="50%"
data-x="30" data-y="10" data-z="90">
<button class="fire"
onclick="spaceships[this.parentNode.dataset.shipId].fire()">
Fire
</button>
</div>
Notice how the hyphenated attribute name becomes camel-cased in the API.
Given the following fragment and elements with similar constructions:
<img class="tower" id="tower5" data-x="12" data-y="5"
data-ai="robotarget" data-hp="46" data-ability="flames"
src="towers/rocket.png" alt="Rocket Tower">
...one could imagine a function splashDamage()
that takes some arguments, the first
of which is the element to process:
function splashDamage(node, x, y, damage) {
if (node.classList.contains('tower') && // checking the 'class' attribute
node.dataset.x == x && // reading the 'data-x' attribute
node.dataset.y == y) { // reading the 'data-y' attribute
var hp = parseInt(node.dataset.hp); // reading the 'data-hp' attribute
hp = hp - damage;
if (hp < 0) {
hp = 0;
node.dataset.ai = 'dead'; // setting the 'data-ai' attribute
delete node.dataset.ability; // removing the 'data-ability' attribute
}
node.dataset.hp = hp; // setting the 'data-hp' attribute
}
}
innerText
and outerText
propertieselement.innerText [ = value ]
Returns the element's text content "as rendered".
Can be set, to replace the element's children with the given value, but with line breaks
converted to br
elements.
element.outerText [ = value ]
Returns the element's text content "as rendered".
Can be set, to replace the element with the given value, but with line breaks converted to
br
elements.
The get the text steps, given an HTMLElement element, are:
If element is not being rendered or if the user agent is a non-CSS user agent, then return element's descendant text content.
This step can produce surprising results, as when the innerText
getter is invoked on an element not being
rendered, its text contents are returned, but when accessed on an element that is
being rendered, all of its children that are not being rendered have
their text contents ignored.
Let results be a new empty list.
For each child node node of element:
Let current be the list resulting in running the rendered text collection steps with node. Each item in results will either be a string or a positive integer (a required line break count).
Intuitively, a required line break count item means that a certain number of line breaks appear at that point, but they can be collapsed with the line breaks induced by adjacent required line break count items, reminiscent to CSS margin-collapsing.
For each item item in current, append item to results.
Remove any items from results that are the empty string.
Remove any runs of consecutive required line break count items at the start or end of results.
Replace each remaining run of consecutive required line break count items with a string consisting of as many U+000A LF code points as the maximum of the values in the required line break count items.
Return the concatenation of the string items in results.
The innerText
and
outerText
getter steps
are to return the result of running get the text steps with this.
The rendered text collection steps, given a node node, are as follows:
Let items be the result of running the rendered text collection steps with each child node of node in tree order, and then concatenating the results to a single list.
If node's computed value of 'visibility' is not 'visible', then return items.
If node is not being rendered, then return items. For the purpose of this step, the following elements must act as described if the computed value of the 'display' property is not 'none':
select
elements have an associated non-replaced inline CSS box
whose child boxes include only those of optgroup
and option
element
child nodes;
optgroup
elements have an associated non-replaced block-level CSS
box whose child boxes include only those of option
element child nodes;
and
option
element have an associated non-replaced block-level CSS
box whose child boxes are as normal for non-replaced block-level CSS boxes.
items can be non-empty due to 'display:contents'.
If node is a Text
node, then for each CSS text box produced by
node, in content order, compute the text of the box after application of the CSS
'white-space' processing rules and 'text-transform' rules, set
items to the list of the resulting strings, and return items.
The CSS 'white-space' processing rules are slightly modified: collapsible spaces at
the end of lines are always collapsed, but they are only removed if the line is the last line of
the block, or it ends with a br
element. Soft hyphens should be preserved.
CSSTEXT
If node is a br
element, then append a string containing a single U+000A LF code point to
items.
If node's computed value of 'display' is 'table-cell', and node's CSS box is not the last 'table-cell' box of its enclosing 'table-row' box, then append a string containing a single U+0009 TAB code point to items.
If node's computed value of 'display' is 'table-row', and node's CSS box is not the last 'table-row' box of the nearest ancestor 'table' box, then append a string containing a single U+000A LF code point to items.
If node is a p
element, then append 2 (a required line break count) at the beginning and end of
items.
If node's used value of 'display' is block-level or 'table-caption', then append 1 (a required line break count) at the beginning and end of items. CSSDISPLAY
Floats and absolutely-positioned elements fall into this category.
Return items.
Note that descendant nodes of most replaced elements (e.g., textarea
,
input
, and video
— but not button
) are not rendered
by CSS, strictly speaking, and therefore have no CSS boxes for the
purposes of this algorithm.
This algorithm is amenable to being generalized to work on ranges. Then we can use it as the basis for Selection
's
stringifier and maybe expose it directly on ranges. See Bugzilla bug 10583.
The set the inner text steps, given an HTMLElement element, and a string value are:
Let fragment be the rendered text fragment for value given element's node document.
Replace all with fragment within element.
The innerText
setter steps are to run set the inner
text steps.
The outerText
setter steps are:
If this's parent is null, then throw a
"NoModificationAllowedError
" DOMException
.
Let next be this's next sibling.
Let previous be this's previous sibling.
Let fragment be the rendered text fragment for the given value given this's node document.
If fragment has no children, then
append a new Text
node whose data is the empty string and node document is
this's node document to fragment.
Replace this with fragment within this's parent.
If next is non-null and next's previous sibling is a
Text
node, then merge with the next text node given next's
previous sibling.
If previous is a Text
node, then merge with the next text
node given previous.
The rendered text fragment for a string input given a
Document
document is the result of running the following steps:
Let fragment be a new DocumentFragment
whose node
document is document.
Let position be a position variable for input, initially pointing at the start of input.
Let text be the empty string.
While position is not past the end of input:
Collect a sequence of code points that are not U+000A LF or U+000D CR from input given position, and set text to the result.
If text is not the empty string, then append a new Text
node whose data is text and node document is
document to fragment.
While position is not past the end of input, and the code point at position is either U+000A LF or U+000D CR:
If the code point at position is U+000D CR and the next code point is U+000A LF, then advance position to the next code point in input.
Advance position to the next code point in input.
Append the result of creating an element given document, br
, and the
HTML namespace to fragment.
Return fragment.
To merge with the next text node given a Text
node node:
Let next be node's next sibling.
If next is not a Text
node, then return.
Replace data with node, node's data's length, 0, and next's data.
Remove next.
Text content in HTML elements with Text
nodes in their
contents, and text in attributes of HTML
elements that allow free-form text, may contain characters in the ranges U+202A to U+202E
and U+2066 to U+2069 (the bidirectional-algorithm formatting characters). BIDI
Authors are encouraged to use the dir
attribute, the
bdo
element, and the bdi
element, rather than maintaining the
bidirectional-algorithm formatting characters manually. The bidirectional-algorithm formatting
characters interact poorly with CSS.
User agents must implement the Unicode bidirectional algorithm to determine the proper ordering of characters when rendering documents and parts of documents. BIDI
The mapping of HTML to the Unicode bidirectional algorithm must be done in one of three ways. Either the user agent must implement CSS, including in particular the CSS 'unicode-bidi', 'direction', and 'content' properties, and must have, in its user agent style sheet, the rules using those properties given in this specification's rendering section, or, alternatively, the user agent must act as if it implemented just the aforementioned properties and had a user agent style sheet that included all the aforementioned rules, but without letting style sheets specified in documents override them, or, alternatively, the user agent must implement another styling language with equivalent semantics. CSSGC
The following elements and attributes have requirements defined by the rendering section that, due to the requirements in this section, are requirements on all user agents (not just those that support the suggested default rendering):
dir
attributebdi
elementbdo
elementbr
elementpre
elementtextarea
elementwbr
elementUser agent requirements for implementing Accessibility API semantics on HTML elements are defined in HTML Accessibility API Mappings. In addition to the rules there, for a custom element element, the default ARIA role semantics are determined as follows: HTMLAAM
Let map be element's internal content attribute map.
If map["role
"] exists,
then return it.
Return no role.
Similarly, for a custom element element, the default ARIA state and property semantics, for a state or property named stateOrProperty, are determined as follows:
If element's attached internals is non-null:
If element's attached internals's get the stateOrProperty-associated element exists, then return the result of running it.
If element's attached internals's get the stateOrProperty-associated elements exists, then return the result of running it.
If element's internal content attribute map[stateOrProperty] exists, then return it.
Return the default value for stateOrProperty.
The "default semantics" referred to here are sometimes also called "native", "implicit", or "host language" semantics in ARIA. ARIA
One implication of these definitions is that the default semantics can change over
time. This allows custom elements the same expressivity as built-in elements; e.g., compare to how
the default ARIA role semantics of an a
element change as the href
attribute is added or removed.
For an example of this in action, see the custom elements section.
Conformance checker requirements for checking use of ARIA role
and aria-*
attributes on
HTML elements are defined in ARIA in HTML. ARIAHTML
html
elementhead
element followed by a body
element.[Exposed=Window]
interface HTMLHtmlElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLHtmlElement
.The html
element represents the root of an HTML document.
Authors are encouraged to specify a lang
attribute on the root
html
element, giving the document's language. This aids speech synthesis tools to
determine what pronunciations to use, translation tools to determine what rules to use, and so
forth.
The html
element in the following example declares that the document's language
is English.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Swapping Songs</title>
</head>
<body>
<h1>Swapping Songs</h1>
<p>Tonight I swapped some of the songs I wrote with some friends, who
gave me some of the songs they wrote. I love sharing my music.</p>
</body>
</html>
head
elementhtml
element.iframe
srcdoc
document or if title information is available from a higher-level protocol: Zero or more elements of metadata content, of which no more than one is a title
element and no more than one is a base
element.title
element and no more than one is a base
element.[Exposed=Window]
interface HTMLHeadElement : HTMLElement {
[HTMLConstructor] constructor();
};
HTMLHeadElement
.The head
element represents a collection of metadata for the
Document
.
The collection of metadata in a head
element can be large or small. Here is an
example of a very short one:
<!doctype html>
<html lang=en>
<head>
<title>A document with a short head</title>
</head>
<body>
...
Here is an example of a longer one:
<!DOCTYPE HTML>
<HTML LANG="EN">
<HEAD>
<META CHARSET="UTF-8">
<BASE HREF="https://www.example.com/">
<TITLE>An application with a long head</TITLE>
<LINK REL="STYLESHEET" HREF="default.css">
<LINK REL="STYLESHEET ALTERNATE" HREF="big.css" TITLE="Big Text">
<SCRIPT SRC="support.js"></SCRIPT>
<META NAME="APPLICATION-NAME" CONTENT="Long headed application">
</HEAD>
<BODY>
...
The title
element is a required child in most situations, but when a
higher-level protocol provides title information, e.g., in the subject line of an email when HTML
is used as an email authoring format, the title
element can be omitted.
title
elementhead
element containing no other title
elements.[Exposed=Window]
interface HTMLTitleElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString text;
};
HTMLTitleElement
.The title
element represents the document's title or name. Authors
should use titles that identify their documents even when they are used out of context, for
example in a user's history or bookmarks, or in search results. The document's title is often
different from its first heading, since the first heading does not have to stand alone when taken
out of context.
There must be no more than one title
element per document.
If it's reasonable for the Document
to have no title, then the
title
element is probably not required. See the head
element's content
model for a description of when the element is required.
title.text [ = value ]
Returns the child text content of the element.
Can be set, to replace the element's children with the given value.
The text
attribute's getter must return this title
element's child text
content.
The text
attribute's setter must string replace
all with the given value within this title
element.
Here are some examples of appropriate titles, contrasted with the top-level headings that might be used on those same pages.
<title>Introduction to The Mating Rituals of Bees</title>
...
<h1>Introduction</h1>
<p>This companion guide to the highly successful
<cite>Introduction to Medieval Bee-Keeping</cite> book is...
The next page might be a part of the same site. Note how the title describes the subject matter unambiguously, while the first heading assumes the reader knows what the context is and therefore won't wonder if the dances are Salsa or Waltz:
<title>Dances used during bee mating rituals</title>
...
<h1>The Dances</h1>
The string to use as the document's title is given by the document.title
IDL attribute.
User agents should use the document's title when referring to the document in their user
interface. When the contents of a title
element are used in this way, the
directionality of that title
element should be used to set the directionality
of the document's title in the user interface.
base
elementhead
element containing no other base
elements.href
target
[Exposed=Window]
interface HTMLBaseElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString href;
[CEReactions] attribute DOMString target;
};
HTMLBaseElement
.The base
element allows authors to specify the document base URL for
the purposes of parsing URLs, and the name of the default
navigable for the purposes of following hyperlinks. The element does not
represent any content beyond this information.
There must be no more than one base
element per document.
A base
element must have either an href
attribute, a target
attribute, or both.
The href
content
attribute, if specified, must contain a valid URL potentially surrounded by
spaces.
A base
element, if it has an href
attribute,
must come before any other elements in the tree that have attributes defined as taking URLs, except the html
element (its manifest
attribute isn't affected by base
elements).
If there are multiple base
elements with href
attributes, all but the first are ignored.
The target
attribute,
if specified, must contain a valid navigable target name or keyword, which specifies
which navigable is to be used as the default when hyperlinks and forms in the
Document
cause navigation.
A base
element, if it has a target
attribute, must come before any elements in the tree that represent hyperlinks.
If there are multiple base
elements with target
attributes, all but the first are ignored.
To get an element's target, given an a
, area
, or
form
element element, and an optional string-or-null target
(default null), run these steps:
If target is null, then:
If element has a target
attribute, then set
target to that attribute's value.
Otherwise, if element's node document contains a
base
element with a target
attribute, set
target to the value of the target
attribute
of the first such base
element.
If target is not null, and contains an ASCII tab or newline and a
U+003C (<), then set target to "_blank
".
Return target.
A base
element that is the first base
element with an href
content attribute in a document tree has a
frozen base URL. The frozen base URL must be immediately
set for an element whenever any of the following
situations occur:
The base
element becomes the first base
element in tree
order with an href
content attribute in its
Document
.
The base
element is the first base
element in tree
order with an href
content attribute in its
Document
, and its href
content attribute is
changed.
To set the frozen base URL for an element element:
Let document be element's node document.
Let urlRecord be the result of parsing the
value of element's href
content attribute with
document's fallback base URL, and document's character encoding. (Thus, the base
element isn't affected by itself.)
If any of the following are true:
urlRecord is failure;
urlRecord's scheme is "data
" or "javascript
"; or
running Is base allowed for Document? on urlRecord and
document returns "Blocked
",
then set element's frozen base URL to document's fallback base URL and return.
Set element's frozen base URL to urlRecord.
The href
IDL
attribute, on getting, must return the result of running the following algorithm:
Let document be element's node document.
Let url be the value of the href
attribute of this element, if it has one, and the empty string otherwise.
Let urlRecord be the result of parsing
url with document's fallback base URL, and
document's character encoding.
(Thus, the base
element isn't affected by other base
elements or
itself.)
If urlRecord is failure, return url.
Return the serialization of urlRecord.
The href
IDL attribute, on setting, must set the href
content attribute to the given new value.
The target
IDL
attribute must reflect the content attribute of the same name.
In this example, a base
element is used to set the document base
URL:
<!DOCTYPE html>
<html lang="en">
<head>
<title>This is an example for the <base> element</title>
<base href="https://www.example.com/news/index.html">
</head>
<body>
<p>Visit the <a href="archives.html">archives</a>.</p>
</body>
</html>
The link in the above example would be a link to "https://www.example.com/news/archives.html
".
link
elementnoscript
element that is a child of a head
element.href
crossorigin
rel
media
integrity
hreflang
type
referrerpolicy
sizes
imagesrcset
imagesizes
as
blocking
color
disabled
fetchpriority
title
attribute has special semantics on this element.[Exposed=Window]
interface HTMLLinkElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString href;
[CEReactions] attribute DOMString? crossOrigin;
[CEReactions] attribute DOMString rel;
[CEReactions] attribute DOMString as;
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[CEReactions] attribute DOMString media;
[CEReactions] attribute DOMString integrity;
[CEReactions] attribute DOMString hreflang;
[CEReactions] attribute DOMString type;
[SameObject, PutForwards=value] readonly attribute DOMTokenList sizes;
[CEReactions] attribute USVString imageSrcset;
[CEReactions] attribute DOMString imageSizes;
[CEReactions] attribute DOMString referrerPolicy;
[SameObject, PutForwards=value] readonly attribute DOMTokenList blocking;
[CEReactions] attribute boolean disabled;
[CEReactions] attribute DOMString fetchPriority;
// also has obsolete members
};
HTMLLinkElement includes LinkStyle;
HTMLLinkElement
.The link
element allows authors to link their document to other resources.
The address of the link(s) is given by the href
attribute. If the href
attribute is present, then its value must be a valid
non-empty URL potentially surrounded by spaces. One or both of the href
or imagesrcset
attributes must be present.
If both the href
and imagesrcset
attributes are absent, then the element does not
define a link.
The types of link indicated (the relationships) are given by the value of the rel
attribute, which, if present, must have a
value that is a unordered set of unique space-separated tokens. The allowed keywords and their meanings are defined in a later section. If the rel
attribute is absent, has no keywords, or if
none of the keywords used are allowed according to the definitions in this specification, then the
element does not create any links.
rel
's
supported tokens are the keywords defined in
HTML link types which are allowed on link
elements, impact
the processing model, and are supported by the user agent. The possible supported tokens are
alternate
,
dns-prefetch
,
expect
,
icon
,
manifest
,
modulepreload
,
next
,
pingback
,
preconnect
,
prefetch
,
preload
,
search
, and
stylesheet
.
rel
's supported
tokens must only include the tokens from this list that the user agent implements the
processing model for.
Theoretically a user agent could support the processing model for the canonical
keyword — if it were a search engine that executed
JavaScript. But in practice that's quite unlikely. So in most cases, canonical
ought not be included in rel
's supported
tokens.
A link
element must have either a rel
attribute or an itemprop
attribute, but not both.
If a link
element has an itemprop
attribute,
or has a rel
attribute that contains only keywords that are
body-ok, then the element is said to be allowed in the body. This means
that the element can be used where phrasing content is expected.
If the rel
attribute is used, the element can
only sometimes be used in the body
of the page. When used with the itemprop
attribute, the element can be used both in the
head
element and in the body
of the page, subject to the constraints of
the microdata model.
Two categories of links can be created using the link
element: links to external resources and hyperlinks. The link types section defines
whether a particular link type is an external resource or a hyperlink. One link
element can create multiple links (of which some might be external resource links and some might be hyperlinks); exactly which and how many links are created depends on the
keywords given in the rel
attribute. User agents must process
the links on a per-link basis, not a per-element basis.
Each link created for a link
element is handled separately. For
instance, if there are two link
elements with rel="stylesheet"
,
they each count as a separate external resource, and each is affected by its own attributes
independently. Similarly, if a single link
element has a rel
attribute with the value next stylesheet
,
it creates both a hyperlink (for the next
keyword) and
an external resource link (for the stylesheet
keyword), and they are affected by other attributes (such as media
or title
)
differently.
For example, the following link
element creates two hyperlinks (to the same page):
<link rel="author license" href="/about">
The two links created by this element are one whose semantic is that the target page has information about the current page's author, and one whose semantic is that the target page has information regarding the license under which the current page is provided.
Hyperlinks created with the link
element and its
rel
attribute apply to the whole document. This contrasts with
the rel
attribute of a
and area
elements, which indicates the type of a link whose context is given by the link's location within
the document.
Unlike those created by a
and area
elements, hyperlinks created by link
elements are not displayed as
part of the document by default, in user agents that support the suggested
default rendering. And even if they are force-displayed using CSS, they have no
activation behavior. Instead, they primarily provide semantic information which might
be used by the page or by other software that consumes the page's contents. Additionally, the user
agent can provide
its own UI for following such hyperlinks.
The exact behavior for links to external resources depends on the exact relationship, as defined for the relevant link type.
The crossorigin
attribute is a CORS settings attribute. It is intended for use with external resource links.
The media
attribute
says which media the resource applies to. The value must be a valid media query
list.
The integrity
attribute represents the integrity
metadata for requests which this element is responsible for. The value is text. The
attribute must only be specified on link
elements that have a rel
attribute that contains the stylesheet
, preload
, or modulepreload
keyword. SRI
The hreflang
attribute on the link
element has the same semantics as the hreflang
attribute on the a
element.
The type
attribute
gives the MIME type of the linked resource. It is purely advisory. The value must be
a valid MIME type string.
For external resource links, the type
attribute is used as a hint to user agents so that they can
avoid fetching resources they do not support.
The referrerpolicy
attribute is a referrer policy
attribute. It is intended for use with external
resource links, where it helps set the referrer policy used when fetching and processing the linked resource.
REFERRERPOLICY
The title
attribute
gives the title of the link. With one exception, it is purely advisory. The value is text. The
exception is for style sheet links that are in a document tree, for which the title
attribute defines CSS
style sheet sets.
The title
attribute on link
elements differs from the global title
attribute of most other
elements in that a link without a title does not inherit the title of the parent element: it
merely has no title.
The imagesrcset
attribute may be present, and is a srcset attribute.
The imagesrcset
and href
attributes (if width
descriptors are not used) together contribute the image
sources to the source set.
If the imagesrcset
attribute is present and has any
image candidate strings using a width
descriptor, the imagesizes
attribute must also be present, and is a
sizes attribute. The imagesizes
attribute
contributes the source size to the source set.
The imagesrcset
and imagesizes
attributes must only be specified on
link
elements that have both a rel
attribute that
specifies the preload
keyword, as well as an as
attribute in the "image
" state.
These attributes allow preloading the appropriate resource that is later used by an
img
element that has the corresponding values for its srcset
and sizes
attributes:
<link rel="preload" as="image"
imagesrcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w"
imagesizes="50vw">
<!-- ... later, or perhaps inserted dynamically ... -->
<img src="wolf.jpg" alt="A rad wolf"
srcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w"
sizes="50vw">
Note how we omit the href
attribute, as it would only
be relevant for browsers that do not support imagesrcset
, and in those cases it would likely cause the
incorrect image to be preloaded.
The imagesrcset
attribute can be combined with the
media
attribute to preload the appropriate resource
selected from a picture
element's sources, for art direction:
<link rel="preload" as="image"
imagesrcset="dog-cropped-1x.jpg, dog-cropped-2x.jpg 2x"
media="(max-width: 800px)">
<link rel="preload" as="image"
imagesrcset="dog-wide-1x.jpg, dog-wide-2x.jpg 2x"
media="(min-width: 801px)">
<!-- ... later, or perhaps inserted dynamically ... -->
<picture>
<source srcset="dog-cropped-1x.jpg, dog-cropped-2x.jpg 2x"
media="(max-width: 800px)">
<img src="dog-wide-1x.jpg" srcset="dog-wide-2x.jpg 2x"
alt="An awesome dog">
</picture>
The sizes
attribute
gives the sizes of icons for visual media. Its value, if present, is merely advisory. User agents may use the value to decide which icon(s) to use if multiple icons are
available. If specified, the attribute must have a value that is an unordered set of
unique space-separated tokens which are ASCII case-insensitive. Each value
must be either an ASCII case-insensitive match for the string "any
", or a value that consists of two valid non-negative integers that do not have a leading U+0030 DIGIT
ZERO (0) character and that are separated by a single U+0078 LATIN SMALL LETTER X or U+0058 LATIN
CAPITAL LETTER X character. The attribute must only be specified on link
elements
that have a rel
attribute that specifies the icon
keyword or the apple-touch-icon
keyword.
The apple-touch-icon
keyword is a registered extension to the predefined set of link types, but user
agents are not required to support it in any way.
The as
attribute
specifies the potential destination for a
preload request for the resource given by the href
attribute.
It is an enumerated attribute. Each potential destination is a keyword for this
attribute, mapping to a state of the same name. The attribute must be specified on
link
elements that have a rel
attribute that
contains the preload
keyword. It may be specified on
link
elements that have a rel
attribute that
contains the modulepreload
keyword; in such cases it must
have a value which is a script-like
destination. For other link
elements, it must not be specified.
The processing model for how the as
attribute is
used is given in an individual link type's fetch and process the linked resource
algorithm.
The attribute does not have a missing value
default or invalid value default, meaning that invalid
or missing values for the attribute map to no state. This is accounted for in the processing
model. For preload
links, both conditions are an error; for
modulepreload
links, a missing value will be treated as
"script
".
The blocking
attribute is a blocking attribute. It is used by link types stylesheet
and expect
, and it must only be specified on link elements
that have a rel
attribute containing those keywords.
The color
attribute is
used with the mask-icon
link type. The attribute must only be specified on
link
elements that have a rel
attribute that
contains the mask-icon
keyword. The value must be a string that matches the
CSS <color> production, defining a suggested color that user agents can use to
customize the display of the icon that the user sees when they pin your site.
This specification does not have any user agent requirements for the color
attribute.
The mask-icon
keyword is a registered extension to the predefined set of link types, but user
agents are not required to support it in any way.
link
elements have an associated explicitly enabled boolean. It is
initially false.
The disabled
attribute is a boolean attribute that is used with the stylesheet
link type. The attribute must only be specified on
link
elements that have a rel
attribute that
contains the stylesheet
keyword.
Whenever the disabled
attribute is removed, set the
link
element's explicitly enabled attribute to true.
Removing the disabled
attribute dynamically, e.g.,
using document.querySelector("link").removeAttribute("disabled")
, will
fetch and apply the style sheet:
<link disabled rel="alternate stylesheet" href="css/pooh">
The fetchpriority
attribute is a fetch
priority attribute that is intended for use with external resource links, where it is used to set the priority used when fetching and processing the linked
resource.
The IDL attributes
href
,
hreflang
,
integrity
,
media
,
rel
,
sizes
,
type
,
blocking
, and
disabled
each must reflect the respective content attributes of the same name.
There is no reflecting IDL attribute for the color
attribute, but this might be added later.
The as
IDL
attribute must reflect the as
content attribute,
limited to only known values.
The crossOrigin
IDL attribute must reflect the
crossorigin
content attribute, limited to only
known values.
The referrerPolicy
IDL attribute must
reflect the referrerpolicy
content
attribute, limited to only known values.
The fetchPriority
IDL attribute must
reflect the fetchpriority
content
attribute, limited to only known values.
The imageSrcset
IDL attribute must reflect the
imagesrcset
content attribute.
The imageSizes
IDL attribute must reflect the
imagesizes
content attribute.
The relList
IDL attribute must reflect the rel
content attribute.
The relList
attribute can be used for
feature detection, by calling its supports()
method to check which types of links are supported.
media
attributeIf the link is a hyperlink then the media
attribute is purely advisory, and describes for which media the document in question was
designed.
However, if the link is an external resource link, then the media
attribute is prescriptive. The user agent must apply the
external resource when the media
attribute's value
matches the environment and the other relevant conditions apply, and must not apply
it otherwise.
The default, if the media
attribute is
omitted, is "all
", meaning that by default links apply to all media.
The external resource might have further restrictions defined within that limit
its applicability. For example, a CSS style sheet might have some @media
blocks. This specification does not override such further restrictions or requirements.
type
attributeIf the type
attribute is present, then the user agent must
assume that the resource is of the given type (even if that is not a valid MIME type
string, e.g. the empty string). If the attribute is omitted, but the external
resource link type has a default type defined, then the user agent must assume that the
resource is of that type. If the UA does not support the given MIME type for the
given link relationship, then the UA should not fetch and process the linked
resource; if the UA does support the given MIME type for the given link
relationship, then the UA should fetch and process the linked resource at the
appropriate time as specified for the external resource link's particular type.
If the attribute is omitted, and the external resource link type does not have a
default type defined, but the user agent would fetch and process the linked resource
if the type was known and supported, then the user agent should fetch and process the linked
resource under the assumption that it will be supported.
User agents must not consider the type
attribute
authoritative — upon fetching the resource, user agents must not use the type
attribute to determine its actual type. Only the actual type
(as defined in the next paragraph) is used to determine whether to apply the resource,
not the aforementioned assumed type.
If the external resource link type defines rules for processing the resource's Content-Type metadata, then those rules apply. Otherwise, if the resource is expected to be an image, user agents may apply the image sniffing rules, with the official type being the type determined from the resource's Content-Type metadata, and use the resulting computed type of the resource as if it was the actual type. Otherwise, if neither of these conditions apply or if the user agent opts not to apply the image sniffing rules, then the user agent must use the resource's Content-Type metadata to determine the type of the resource. If there is no type metadata, but the external resource link type has a default type defined, then the user agent must assume that the resource is of that type.
The stylesheet
link type defines rules for
processing the resource's Content-Type metadata.
Once the user agent has established the type of the resource, the user agent must apply the resource if it is of a supported type and the other relevant conditions apply, and must ignore the resource otherwise.
If a document contains style sheet links labeled as follows:
<link rel="stylesheet" href="A" type="text/plain">
<link rel="stylesheet" href="B" type="text/css">
<link rel="stylesheet" href="C">
...then a compliant UA that supported only CSS style sheets would fetch the B and C files, and
skip the A file (since text/plain
is not the MIME type for CSS style
sheets).
For files B and C, it would then check the actual types returned by the server. For those that
are sent as text/css
, it would apply the styles, but for those labeled as
text/plain
, or any other type, it would not.
If one of the two files was returned without a Content-Type metadata, or with a
syntactically incorrect type like Content-Type: "null"
, then the
default type for stylesheet
links would kick in. Since that
default type is text/css
, the style sheet would nonetheless be applied.
link
elementAll external resource
links have a fetch and process the linked resource algorithm, which takes a
link
element el. They also have linked resource fetch setup
steps which take a link
element el and request request. Individual link types may provide
their own fetch and process the linked resource algorithm, but unless explicitly
stated, they use the default fetch and process the linked resource algorithm.
Similarly, individual link types may provide their own linked resource fetch setup
steps, but unless explicitly stated, these steps just return true.
The default fetch and process the linked resource, given a link
element
el, is as follows:
Let options be the result of creating link options from el.
Let request be the result of creating a link request given options.
If request is null, then return.
Set request's synchronous flag.
Run the linked resource fetch setup steps, given el and request. If the result is false, then return.
Set request's initiator
type to "css
" if el's rel
attribute contains the keyword stylesheet
; "link
" otherwise.
Fetch request with processResponseConsumeBody set to the following steps given response response and null, failure, or a byte sequence bodyBytes:
Let success be true.
If any of the following are true:
bodyBytes is null or failure; or
response's status is not an ok status,
then set success to false.
Note that content-specific errors, e.g., CSS parse errors or PNG decoding errors, do not affect success.
Otherwise, wait for the link resource's critical subresources to finish loading.
The specification that defines a link type's critical subresources (e.g., CSS) is expected to describe how these subresources are fetched and processed. However, since this is not currently explicit, this specification describes waiting for a link resource's critical subresources to be fetched and processed, with the expectation that this will be done correctly.
Process the linked resource given el, success, response, and bodyBytes.
To create a link request given a link processing options options:
Assert: options's href is not the empty string.
If options's destination is null, then return null.
Let url be the result of encoding-parsing a URL given options's href, relative to options's base URL.
Passing the base URL instead of a document or environment is tracked by issue #9715.
If url is failure, then return null.
Let request be the result of creating a potential-CORS request given url, options's destination, and options's crossorigin.
Set request's policy container to options's policy container.
Set request's integrity metadata to options's integrity.
Set request's cryptographic nonce metadata to options's cryptographic nonce metadata.
Set request's referrer policy to options's referrer policy.
Set request's client to options's environment.
Set request's priority to options's fetch priority.
Return request.
User agents may opt to only try to fetch and process such resources when they are needed, instead of pro-actively fetching all the external resources that are not applied.
Similar to the fetch and process the linked resource algorithm, all external resource links have a process the linked
resource algorithm which takes a link
element el, boolean
success, a response response, and a
byte sequence bodyBytes. Individual link types may provide their own
process the linked resource algorithm, but unless explicitly stated, that algorithm
does nothing.
Unless otherwise specified for a given rel
keyword, the
element must delay the load event of the element's node document until
all the attempts to fetch and process the linked resource and its critical
subresources are complete. (Resources that the user agent has not yet attempted to fetch
and process, e.g., because it is waiting for the resource to be needed, do not delay the
load event.)
Link
` headersAll link types that can be external resource
links define a process a link header algorithm, which takes a link
processing options. This algorithm defines whether and how they react to appearing in an
HTTP `Link
` response header.
For most link types, this algorithm does nothing. The summary table is a good reference to quickly know whether a link type has defined process a link header steps.
A link processing options is a struct. It has the following items:
link
")Document
Document
auto
)A link processing options has a base URL and an href rather than a parsed URL because the URL could be a result of the options's source set.
To create link options from element given a link
element
el:
Let document be el's node document.
Let options be a new link processing options with
as
attribute.crossorigin
content attributereferrerpolicy
content attributefetchpriority
content attributeIf el has an href
attribute, then set
options's href to the value of
el's href
attribute.
If el has an integrity
attribute,
then set options's integrity to the
value of el's integrity
content
attribute.
If el has a type
attribute, then set
options's type to the value of
el's type
attribute.
Assert: options's href is not the empty string, or options's source set is not null.
A link
element with neither an href
or an
imagesrcset
does not represent a link.
Return options.
To extract links from headers given a header list headers:
Let links be a new list.
Let rawLinkHeaders be the result of getting, decoding, and splitting
`Link
` from response's header list.
For each linkHeader of rawLinkHeaders:
Let linkObject be the result of parsing linkHeader. WEBLINK
If linkObject["target_uri
"] does not
exist, then continue.
Append linkObject to links.
Return links.
To process link headers given a Document
doc,
a response response, and a
"pre-media
" or "media
" phase:
Let links be the result of extracting links from response's header list.
For each linkObject in links:
Let rel be linkObject["relation_type
"].
Let attribs be linkObject["target_attributes
"].
Let expectedPhase be "media
" if either "srcset
", "imagesrcset
", or "media
" exist in
attribs; otherwise "pre-media
".
If expectedPhase is not phase, then continue.
If attribs["media
"] exists and attribs["media
"]
does not match the environment, then
continue.
Let options be a new link processing options with
target_uri
"]Apply link options from parsed header attributes to options given attribs.
If attribs["imagesrcset
"] exists and attribs["imagesizes
"] exists,
then set options's source set to the
result of creating a source set given
linkObject["target_uri
"], attribs["imagesrcset
"], attribs["imagesizes
"], and null.
Run the process a link header steps for rel given options.
To apply link options from parsed header attributes to a link processing options options given attribs:
If attribs["as
"] exists, then set options's destination to the result of translating attribs["as
"].
If attribs["crossorigin
"] exists and is an ASCII case-insensitive match for one of
the CORS settings attribute keywords,
then set options's crossorigin to the
CORS settings attribute state corresponding to that keyword.
If attribs["integrity
"] exists, then set options's integrity to attribs["integrity
"].
If attribs["referrerpolicy
"]
exists and is an ASCII case-insensitive match for
some referrer policy, then set options's referrer policy to that referrer policy.
If attribs["nonce
"]
exists, then set options's nonce to attribs["nonce
"].
If attribs["type
"] exists, then set options's type to attribs["type
"].
If attribs["fetchpriority
"]
exists and is an ASCII case-insensitive match for
a fetch priority attribute keyword, then set options's fetch priority to that fetch priority
attribute keyword.
Early hints allow user-agents to perform some operations, such as to speculatively load resources that are likely to be used by the document, before the navigation request is fully handled by the server and a response code is served. Servers can indicate early hints by serving a response with a 103 status code before serving the final response.RFC8297
For compatibility reasons early hints are typically delivered over HTTP/2 or above, but for readability we use HTTP/1.1-style notation below.
For example, given the following sequence of responses:
103 Early Hint Link: </image.png>; rel=preload; as=image
200 OK Content-Type: text/html <!DOCTYPE html> ... <img src="/image.png">
the image will start loading before the HTML content arrives.
Only the first early hint response served during the navigation is handled, and it is discarded if it is succeeded by a cross-origin redirect.
In addition to the `Link
` headers, it is possible that the 103
response contains a Content Security Policy header, which is enforced when processing
the early hint.
For example, given the following sequence of responses:
103 Early Hint Content-Security-Policy: style-src: self; Link: </style.css>; rel=preload; as=style
103 Early Hint Link: </image.png>; rel=preload; as=image
302 Redirect Location: /alternate.html
200 OK Content-Security-Policy: style-src: none; Link: </font.ttf>; rel=preload; as=font
The font and style would be loaded, and the image will be discarded, as only the first early hint response in the final redirect chain is respected. The late Content Security Policy header comes after the request to fetch the style has already been performed, but the style will not be accessible to the document.
To process early hint headers given a response response and an environment reservedEnvironment:
Early-hint `Link
` headers are always processed
before `Link
` headers from the final response, followed by link
elements. This is
equivalent to prepending the contents of the early and final `Link
` headers to the Document
's head
element,
in respective order.
Let earlyPolicyContainer be the result of creating a policy container from a fetch response given response and reservedEnvironment.
This allows the early hint response to include a Content Security Policy which would be enforced when fetching the early hint request.
Let links be the result of extracting links from response's header list.
Let earlyHints be an empty list.
For each linkObject in links:
The moment we receive the early hint link header, we begin fetching earlyRequest. If it comes back before the
Document
is created, we set earlyResponse to the response of that fetch and
once the Document
is created we commit it (by making it available in the map
of preloaded resources as if it was a link
element). If the
Document
is created first, the response is
committed as soon as it becomes available.
Let rel be linkObject["relation_type
"].
Let options be a new link processing options with
target_uri
"]early-hint
"Let attribs be linkObject["target_attributes
"].
Only the as
, crossorigin
, integrity
, and type
attributes are handled as part of early hint processing. The other ones, in particular blocking
, imagesrcset
, imagesizes
, and media
are only applicable once a Document
is
created.
Apply link options from parsed header attributes to options given attribs.
Run the process a link header steps for rel given options.
Append options to earlyHints.
Return the following substeps given Document
doc: for each options in earlyHints:
If options's on document ready is null, then set options's document to doc.
Otherwise, call options's on document ready with doc.
link
elementInteractive user agents may provide users with a means to follow the hyperlinks created using the link
element, somewhere
within their user interface. Such invocations of the follow
the hyperlink algorithm must set the userInvolvement argument to "browser UI
". The exact interface is not defined by this
specification, but it could include the following information (obtained from the element's
attributes, again as defined below), in some form or another (possibly simplified), for each
hyperlink created with each link
element in the document:
rel
attribute)title
attribute).href
attribute).hreflang
attribute).media
attribute).User agents could also include other information, such as the type of the resource (as given by
the type
attribute).
meta
elementitemprop
attribute is present: flow content.itemprop
attribute is present: phrasing content.charset
attribute is present, or if the element's http-equiv
attribute is in the Encoding declaration state: in a head
element.http-equiv
attribute is present but not in the Encoding declaration state: in a head
element.http-equiv
attribute is present but not in the Encoding declaration state: in a noscript
element that is a child of a head
element.name
attribute is present: where metadata content is expected.itemprop
attribute is present: where metadata content is expected.itemprop
attribute is present: where phrasing content is expected.name
http-equiv
content
charset
media
[Exposed=Window]
interface HTMLMetaElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString name;
[CEReactions] attribute DOMString httpEquiv;
[CEReactions] attribute DOMString content;
[CEReactions] attribute DOMString media;
// also has obsolete members
};
HTMLMetaElement
.The meta
element represents various kinds of metadata that cannot be
expressed using the title
, base
, link
, style
,
and script
elements.
The meta
element can represent document-level metadata with the name
attribute, pragma directives with the http-equiv
attribute, and the file's character encoding
declaration when an HTML document is serialized to string form (e.g. for transmission over
the network or for disk storage) with the charset
attribute.
Exactly one of the name
, http-equiv
, charset
,
and itemprop
attributes must be specified.
If either name
, http-equiv
, or itemprop
is
specified, then the content
attribute must also be
specified. Otherwise, it must be omitted.
The charset
attribute specifies the character encoding used by the document.
This is a character encoding declaration. If the attribute is present, its value must
be an ASCII case-insensitive match for the string "utf-8
".
The charset
attribute on the
meta
element has no effect in XML documents, but is allowed in XML documents in order
to facilitate migration to and from XML.
There must not be more than one meta
element with a charset
attribute per document.
The content
attribute gives the value of the document metadata or pragma directive when the element is used
for those purposes. The allowed values depend on the exact context, as described in subsequent
sections of this specification.
If a meta
element has a name
attribute, it sets document metadata. Document metadata
is expressed in terms of name-value pairs, the name
attribute
on the meta
element giving the name, and the content
attribute on the same element giving the value. The name
specifies what aspect of metadata is being set; valid names and the meaning of their values are
described in the following sections. If a meta
element has no content
attribute, then the value part of the metadata
name-value pair is the empty string.
The media
attribute
says which media the metadata applies to. The value must be a valid media query list.
Unless the name
is theme-color
, the media
attribute has no effect on the processing model and must not be used by authors.
The name
, content
, and media
IDL attributes
must reflect the respective content attributes of the same name. The IDL attribute
httpEquiv
must
reflect the content attribute http-equiv
.
This specification defines a few names for the name
attribute of the meta
element.
Names are case-insensitive, and must be compared in an ASCII case-insensitive manner.
application-name
The value must be a short free-form string giving the name of the web application that the
page represents. If the page is not a web application, the application-name
metadata name must not be used.
Translations of the web application's name may be given, using the lang
attribute to specify the language of each name.
There must not be more than one meta
element with a given language
and where the name
attribute value is an
ASCII case-insensitive match for
application-name
per document.
User agents may use the application name in UI in preference to the page's
title
, since the title might include status messages and the like relevant to the
status of the page at a particular moment in time instead of just being the name of the
application.
To find the application name to use given an ordered list of languages (e.g. British English, American English, and English), user agents must run the following steps:
Let languages be the list of languages.
Let default language be the language of the
Document
's document element, if any, and if that language is not
unknown.
If there is a default language, and if it is not the same language as any of the languages in languages, append it to languages.
Let winning language be the first language in languages for which
there is a meta
element in the Document
where the
name
attribute value is an
ASCII case-insensitive match for
application-name
and whose
language is the language in question.
If none of the languages have such a meta
element, then return;
there's no given application name.
Return the value of the content
attribute of the
first meta
element in the Document
in tree order where the
name
attribute value is an
ASCII case-insensitive match for application-name
and whose language is winning language.
This algorithm would be used by a browser when it needs a name for the page, for instance, to label a bookmark. The languages it would provide to the algorithm would be the user's preferred languages.
author
The value must be a free-form string giving the name of one of the page's authors.
description
The value must be a free-form string that describes the page. The value must be
appropriate for use in a directory of pages, e.g. in a search engine. There must not be more than
one meta
element where the name
attribute value
is an ASCII case-insensitive match for
description
per document.
generator
The value must be a free-form string that identifies one of the software packages used to generate the document. This value must not be used on pages whose markup is not generated by software, e.g. pages whose markup was written by a user in a text editor.
Here is what a tool called "Frontweaver" could include in its output, in the page's
head
element, to identify itself as the tool used to generate the page:
<meta name=generator content="Frontweaver 8.2">
keywords
The value must be a set of comma-separated tokens, each of which is a keyword relevant to the page.
This page about typefaces on British motorways uses a meta
element to specify
some keywords that users might use to look for the page:
<!DOCTYPE HTML>
<html lang="en-GB">
<head>
<title>Typefaces on UK motorways</title>
<meta name="keywords" content="british,type face,font,fonts,highway,highways">
</head>
<body>
...
Many search engines do not consider such keywords, because this feature has historically been used unreliably and even misleadingly as a way to spam search engine results in a way that is not helpful for users.
To obtain the list of keywords that the author has specified as applicable to the page, the user agent must run the following steps:
Let keywords be an empty list.
For each meta
element with a name
attribute and a content
attribute and where the name
attribute value is an ASCII case-insensitive
match for keywords
:
Split the value of the element's content
attribute on commas.
Add the resulting tokens, if any, to keywords.
Remove any duplicates from keywords.
Return keywords. This is the list of keywords that the author has specified as applicable to the page.
User agents should not use this information when there is insufficient confidence in the reliability of the value.
For instance, it would be reasonable for a content management system to use the keyword information of pages within the system to populate the index of a site-specific search engine, but a large-scale content aggregator that used this information would likely find that certain users would try to game its ranking mechanism through the use of inappropriate keywords.
referrer
The value must be a referrer policy, which defines the default referrer
policy for the Document
. REFERRERPOLICY
If any meta
element element is inserted into the document, or has its name
or content
attributes changed, user agents must run the following algorithm:
If element is not in a document tree, then return.
If element does not have a name
attribute whose value is an ASCII case-insensitive match for "referrer
", then return.
If element does not have a content
attribute, or that attribute's value is the empty string, then return.
Let value be the value of element's content
attribute, converted to ASCII
lowercase.
If value is one of the values given in the first column of the following table, then set value to the value given in the second column:
Legacy value | Referrer policy |
---|---|
never
| no-referrer
|
default
| the default referrer policy |
always
| unsafe-url
|
origin-when-crossorigin
| origin-when-cross-origin
|
If value is a referrer policy, then set element's node document's policy container's referrer policy to policy.
For historical reasons, unlike other standard metadata names, the processing
model for referrer
is not responsive to element removals,
and does not use tree order. Only the most-recently-inserted or
most-recently-modified meta
element in this state has an effect.
theme-color
The value must be a string that matches the CSS <color> production, defining a suggested color that user agents should use to customize the display of the page or of the surrounding user interface. For example, a browser might color the page's title bar with the specified value, or use it as a color highlight in a tab bar or task switcher.
Within an HTML document, the media
attribute value must
be unique amongst all the meta
elements with their name
attribute value set to an ASCII
case-insensitive match for theme-color
.
This standard itself uses "WHATWG green" as its theme color:
<!DOCTYPE HTML>
<title>HTML Standard</title>
<meta name="theme-color" content="#3c790a">
...
The media
attribute may be used to describe the context
in which the provided color should be used.
If we only wanted to use "WHATWG green" as this standard's theme color in dark mode,
we could use the prefers-color-scheme
media feature:
<!DOCTYPE HTML>
<title>HTML Standard</title>
<meta name="theme-color" content="#3c790a" media="(prefers-color-scheme: dark)">
...
To obtain a page's theme color, user agents must run the following steps:
Let candidate elements be the list of all meta
elements that
meet the following criteria, in tree order:
the element is in a document tree;
the element has a name
attribute, whose value
is an ASCII case-insensitive match for theme-color
; and
the element has a content
attribute.
For each element in candidate elements:
If element has a media
attribute
and the value of element's media
attribute does not match the environment, then
continue.
Let value be the result of stripping leading and trailing ASCII whitespace from the value of
element's content
attribute.
Let color be the result of parsing value.
If color is not failure, then return color.
Return nothing (the page has no theme color).
If any meta
elements are inserted into the document or removed from the document, or existing meta
elements have their
name
, content
, or
media
attributes changed, or if the environment changes
such that any meta
element's media
attribute's value may now or may no longer match the
environment, user agents must re-run the above algorithm and apply the result to any
affected UI.
When using the theme color in UI, user agents may adjust it in implementation-specific ways to make it more suitable for the UI in question. For example, if a user agent intends to use the theme color as a background and display white text over it, it might use a darker variant of the theme color in that part of the UI, to ensure adequate contrast.
color-scheme
To aid user agents in rendering the page background with the desired color scheme immediately
(rather than waiting for all CSS in the page to load), a 'color-scheme' value can
be provided in a meta
element.
The value must be a string that matches the syntax for the CSS 'color-scheme' property value. It determines the page's supported color-schemes.
There must not be more than one meta
element with its name
attribute value set to an
ASCII case-insensitive match for color-scheme
per document.
The following declaration indicates that the page is aware of and can handle a color scheme with dark background colors and light foreground colors:
<meta name="color-scheme" content="dark">
To obtain a page's supported color-schemes, user agents must run the following steps:
Let candidate elements be the list of all meta
elements that
meet the following criteria, in tree order:
the element is in a document tree;
the element has a name
attribute, whose value
is an ASCII case-insensitive match for color-scheme
; and
the element has a content
attribute.
For each element in candidate elements:
content
attribute.Return null.
If any meta
elements are inserted into the document or removed from the document, or existing meta
elements have their
name
or content
attributes changed, user agents must re-run the above algorithm.
Because these rules check successive elements until they find a match, an author can provide multiple such values to handle fallback for legacy user agents. Opposite to how CSS fallback works for properties, the multiple meta elements needs to be arranged with the legacy values after the newer values.
Anyone can create and use their own extensions to the predefined set of metadata names. There is no requirement to register such extensions.
However, a new metadata name should not be created in any of the following cases:
If either the name is a URL, or the value of its accompanying content
attribute is a URL; in those cases,
registering it as an extension to the predefined set of
link types is encouraged (rather than creating a new metadata name).
If the name is for something expected to have processing requirements in user agents; in that case it ought to be standardized.
Also, before creating and using a new metadata name, consulting the WHATWG Wiki MetaExtensions page is encouraged — to avoid choosing a metadata name that's already in use, and to avoid duplicating the purpose of any metadata names that are already in use, and to avoid new standardized names clashing with your chosen name. WHATWGWIKI
Anyone is free to edit the WHATWG Wiki MetaExtensions page at any time to add a metadata name. New metadata names can be specified with the following information:
The actual name being defined. The name should not be confusingly similar to any other defined name (e.g. differing only in case).
A short non-normative description of what the metadata name's meaning is, including the format the value is required to be in.
A list of other names that have exactly the same processing requirements. Authors should not use the names defined to be synonyms (they are only intended to allow user agents to support legacy content). Anyone may remove synonyms that are not used in practice; only names that need to be processed as synonyms for compatibility with legacy content are to be registered in this way.
One of the following:
If a metadata name is found to be redundant with existing values, it should be removed and listed as a synonym for the existing value.
If a metadata name is added in the "proposed" state for a period of a month or more without being used or specified, then it may be removed from the WHATWG Wiki MetaExtensions page.
If a metadata name is added with the "proposed" status and found to be redundant with existing values, it should be removed and listed as a synonym for the existing value. If a metadata name is added with the "proposed" status and found to be harmful, then it should be changed to "discontinued" status.
Anyone can change the status at any time, but should only do so in accordance with the definitions above.
When the http-equiv
attribute is specified on a
meta
element, the element is a pragma directive.
The http-equiv
attribute is an enumerated
attribute with the following keywords and states:
Keyword | Conforming | State | Brief description |
---|---|---|---|
content-language
| No | Content language | Sets the pragma-set default language. |
content-type
| Encoding declaration | An alternative form of setting the charset .
| |
default-style
| Default style | Sets the name of the default CSS style sheet set. | |
refresh
| Refresh | Acts as a timed redirect. | |
set-cookie
| No | Set-Cookie | Has no effect. |
x-ua-compatible
| X-UA-Compatible | In practice, encourages Internet Explorer to more closely follow the specifications. | |
content-security-policy
| Content security policy | Enforces a Content Security
Policy on a Document .
|
When a meta
element is inserted
into the document, if its http-equiv
attribute is
present and represents one of the above states, then the user agent must run the algorithm
appropriate for that state, as described in the following list:
http-equiv="content-language
"
)
This feature is non-conforming. Authors are encouraged to use the lang
attribute instead.
This pragma sets the pragma-set default language. Until such a pragma is successfully processed, there is no pragma-set default language.
If the meta
element has no content
attribute, then return.
If the element's content
attribute contains a
U+002C COMMA character (,) then return.
Let input be the value of the element's content
attribute.
Let position point at the first character of input.
Skip ASCII whitespace within input given position.
Collect a sequence of code points that are not ASCII whitespace from input given position.
Let candidate be the string that resulted from the previous step.
If candidate is the empty string, return.
Set the pragma-set default language to candidate.
If the value consists of multiple space-separated tokens, tokens after the first are ignored.
This pragma is almost, but not quite, entirely unlike the HTTP `Content-Language
` header of the same name.
HTTP
http-equiv="content-type
"
)
The Encoding declaration state is
just an alternative form of setting the charset
attribute: it is a character encoding declaration. This state's user
agent requirements are all handled by the parsing section of the specification.
For meta
elements with an http-equiv
attribute in the Encoding declaration
state, the content
attribute must have a value
that is an ASCII case-insensitive match for a string that consists of:
"text/html;
", optionally followed by any number of ASCII
whitespace, followed by "charset=utf-8
".
A document must not contain both a meta
element with an http-equiv
attribute in the Encoding declaration state and a
meta
element with the charset
attribute
present.
The Encoding declaration state may be
used in HTML documents, but elements with an http-equiv
attribute in that state must not be used in
XML documents.
http-equiv="default-style
"
)
This pragma sets the name of the default CSS style sheet set.
If the meta
element has no content
attribute, or if that attribute's value is the empty string, then return.
Change the preferred CSS style sheet set name with the name being the value
of the element's content
attribute.
CSSOM
http-equiv="refresh
"
)
This pragma acts as a timed redirect.
A Document
object has an associated will declaratively
refresh (a boolean). It is initially false.
If the meta
element has no content
attribute, or if that attribute's value is the empty string, then return.
Let input be the value of the element's content
attribute.
Run the shared declarative refresh steps with the meta
element's node document, input, and the meta
element.
The shared declarative refresh steps, given a Document
object
document, string input, and optionally a meta
element
meta, are as follows:
If document's will declaratively refresh is true, then return.
Let position point at the first code point of input.
Skip ASCII whitespace within input given position.
Let time be 0.
Collect a sequence of code points that are ASCII digits from input given position, and let the result be timeString.
If timeString is the empty string, then:
If the code point in input pointed to by position is not U+002E (.), then return.
Otherwise, set time to the result of parsing timeString using the rules for parsing non-negative integers.
Collect a sequence of code points that are ASCII digits and U+002E FULL STOP characters (.) from input given position. Ignore any collected characters.
Let urlRecord be document's URL.
If position is not past the end of input, then:
If the code point in input pointed to by position is not U+003B (;), U+002C (,), or ASCII whitespace, then return.
Skip ASCII whitespace within input given position.
If the code point in input pointed to by position is U+003B (;) or U+002C (,), then advance position to the next code point.
Skip ASCII whitespace within input given position.
If position is not past the end of input, then:
Let urlString be the substring of input from the code point at position to the end of the string.
If the code point in input pointed to by position is U+0055 (U) or U+0075 (u), then advance position to the next code point. Otherwise, jump to the step labeled skip quotes.
If the code point in input pointed to by position is U+0052 (R) or U+0072 (r), then advance position to the next code point. Otherwise, jump to the step labeled parse.
If the code point in input pointed to by position is U+004C (L) or U+006C (l), then advance position to the next code point. Otherwise, jump to the step labeled parse.
Skip ASCII whitespace within input given position.
If the code point in input pointed to by position is U+003D (=), then advance position to the next code point. Otherwise, jump to the step labeled parse.
Skip ASCII whitespace within input given position.
Skip quotes: If the code point in input pointed to by position is U+0027 (') or U+0022 ("), then let quote be that code point, and advance position to the next code point. Otherwise, let quote be the empty string.
Set urlString to the substring of input from the code point at position to the end of the string.
If quote is not the empty string, and there is a code point in urlString equal to quote, then truncate urlString at that code point, so that it and all subsequent code points are removed.
Parse: Set urlRecord to the result of encoding-parsing a URL given urlString, relative to document.
If urlRecord is failure, then return.
Set document's will declaratively refresh to true.
Perform one or more of the following steps:
After the refresh has come due (as defined below), if the user has not canceled the
redirect and, if meta is given, document's active sandboxing
flag set does not have the sandboxed automatic features browsing context
flag set, then navigate
document's node navigable to urlRecord using
document, with historyHandling set to "replace
".
For the purposes of the previous paragraph, a refresh is said to have come due as soon as the later of the following two conditions occurs:
It is important to use document here, and not meta's
node document, as that might have changed between the initial set of steps and
the refresh coming due and meta is not always given (in case of the HTTP
`Refresh
` header).
Provide the user with an interface that, when selected, navigates document's node navigable to urlRecord using document.
Do nothing.
In addition, the user agent may, as with anything, inform the user of any and all aspects of its operation, including the state of any timers, the destinations of any timed redirects, and so forth.
For meta
elements with an http-equiv
attribute in the Refresh state, the content
attribute must have a value consisting either of:
URL
",
followed by a U+003D EQUALS SIGN character (=), followed by a valid URL string
that does not start with a literal U+0027 APOSTROPHE (') or U+0022 QUOTATION MARK (")
character.In the former case, the integer represents a number of seconds before the page is to be reloaded; in the latter case the integer represents a number of seconds before the page is to be replaced by the page at the given URL.
A news organization's front page could include the following markup in the page's
head
element, to ensure that the page automatically reloads from the server every
five minutes:
<meta http-equiv="Refresh" content="300">
A sequence of pages could be used as an automated slide show by making each page refresh to the next page in the sequence, using markup such as the following:
<meta http-equiv="Refresh" content="20; URL=page4.html">
http-equiv="set-cookie
"
)
This pragma is non-conforming and has no effect.
User agents are required to ignore this pragma.
http-equiv="x-ua-compatible
"
)
In practice, this pragma encourages Internet Explorer to more closely follow the specifications.
For meta
elements with an http-equiv
attribute in the X-UA-Compatible state, the
content
attribute must have a value that is an
ASCII case-insensitive match for the string "IE=edge
".
User agents are required to ignore this pragma.
http-equiv="content-security-policy
"
)
This pragma enforces a Content Security
Policy on a Document
. CSP
If the meta
element is not a child of a head
element,
return.
If the meta
element has no content
attribute, or if that attribute's value is the empty string, then return.
Let policy be the result of executing Content Security Policy's parse
a serialized Content Security Policy algorithm on the meta
element's
content
attribute's value, with a source of "meta",
and a disposition of "enforce".
Remove all occurrences of the report-uri
, frame-ancestors
, and sandbox
directives from policy.
Enforce the policy policy.
For meta
elements with an http-equiv
attribute in the Content security
policy state, the content
attribute must have a
value consisting of a valid Content Security
Policy, but must not contain any report-uri
,
frame-ancestors
, or sandbox
directives.
The Content Security Policy given in the content
attribute will be enforced upon the current document. CSP
At the time of inserting the meta
element to the document, it is
possible that some resources have already been fetched. For example, images might be stored in
the list of available images prior to dynamically inserting a meta
element with an http-equiv
attribute in the Content security policy state.
Resources that have already been fetched are not guaranteed to be blocked by a Content
Security Policy that's enforced late.
A page might choose to mitigate the risk of cross-site scripting attacks by preventing the execution of inline JavaScript, as well as blocking all plugin content, using a policy such as the following:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'">
There must not be more than one meta
element with any particular state in the
document at a time.
A character encoding declaration is a mechanism by which the character encoding used to store or transmit a document is specified.
The Encoding standard requires use of the UTF-8 character
encoding and requires use of the "utf-8
" encoding label
to identify it. Those requirements necessitate that the document's character encoding
declaration, if it exists, specifies an encoding label using an ASCII
case-insensitive match for "utf-8
". Regardless of whether a
character encoding declaration is present or not, the actual character encoding used to encode the document must be
UTF-8. ENCODING
To enforce the above rules, authoring tools must default to using UTF-8 for newly-created documents.
The following restrictions also apply:
In addition, due to a number of restrictions on meta
elements, there can only be
one meta
-based character encoding declaration per document.
If an HTML document does not start with a BOM, and its
encoding is not explicitly given by Content-Type
metadata, and the document is not an iframe
srcdoc
document, then the encoding must be specified
using a meta
element with a charset
attribute
or a meta
element with an http-equiv
attribute in the Encoding declaration
state.
A character encoding declaration is required (either in the Content-Type metadata or explicitly in the file) even when all characters are in the ASCII range, because a character encoding is needed to process non-ASCII characters entered by the user in forms, in URLs generated by scripts, and so forth.
Using non-UTF-8 encodings can have unexpected results on form submission and URL encodings, which use the document's character encoding by default.
If the document is an iframe
srcdoc
document, the document must not have a character encoding declaration. (In
this case, the source is already decoded, since it is part of the document that contained the
iframe
.)
In XML, the XML declaration should be used for inline character encoding information, if necessary.
In HTML, to declare that the character encoding is UTF-8, the author could
include the following markup near the top of the document (in the head
element):
<meta charset="utf-8">
In XML, the XML declaration would be used instead, at the very top of the markup:
<?xml version="1.0" encoding="utf-8"?>
style
elementnoscript
element that is a child of a head
element.media
blocking
title
attribute has special semantics on this element.[Exposed=Window]
interface HTMLStyleElement : HTMLElement {
[HTMLConstructor] constructor();
attribute boolean disabled;
[CEReactions] attribute DOMString media;
[SameObject, PutForwards=value] readonly attribute DOMTokenList blocking;
// also has obsolete members
};
HTMLStyleElement includes LinkStyle;
HTMLStyleElement
.The style
element allows authors to embed CSS style sheets in their documents.
The style
element is one of several inputs to the styling processing
model. The element does not represent content for the
user.
The disabled
getter steps are:
If this does not have an associated CSS style sheet, return false.
If this's associated CSS style sheet's disabled flag is set, return true.
Return false.
The disabled
setter steps are:
If this does not have an associated CSS style sheet, return.
If the given value is true, set this's associated CSS style sheet's disabled flag. Otherwise, unset this's associated CSS style sheet's disabled flag.
Importantly, disabled
attribute assignments only take
effect when the style
element has an associated CSS style sheet:
const style = document.createElement('style');
style.disabled = true;
style.textContent = 'body { background-color: red; }';
document.body.append(style);
console.log(style.disabled); // false
The media
attribute
says which media the styles apply to. The value must be a valid media query list.
The user agent must apply the styles when the media
attribute's value matches the environment and
the other relevant conditions apply, and must not apply them otherwise.
The styles might be further limited in scope, e.g. in CSS with the use of @media
blocks. This specification does not override such further restrictions or
requirements.
The default, if the media
attribute is omitted, is "all
", meaning that by default styles apply to all
media.
The blocking
attribute is a blocking attribute.
The title
attribute on style
elements defines
CSS style sheet sets. If the style
element
has no title
attribute, then it has no title; the title
attribute of ancestors does not apply to the style
element. If the style
element is not in a document tree, then the title
attribute is ignored. CSSOM
The title
attribute on style
elements, like the title
attribute on link
elements, differs from the global title
attribute in that a
style
block without a title does not inherit the title of the parent element: it
merely has no title.
The child text content of a style
element must be that of a
conformant style sheet.
A style
element is implicitly potentially render-blocking if the
element was created by its node document's parser.
The user agent must run the update a style
block algorithm whenever
any of the following conditions occur:
The element is popped off the stack of open elements of an HTML parser or XML parser.
The element is not on the stack of open elements of an HTML parser or XML parser, and it becomes connected or disconnected.
The element's children changed steps run.
The update a style
block algorithm is as follows:
Let element be the style
element.
If element has an associated CSS style sheet, remove the CSS style sheet in question.
If element is not connected, then return.
If element's type
attribute is present and
its value is neither the empty string nor an ASCII case-insensitive match for
"text/css
", then return.
In particular, a type
value with
parameters, such as "text/css; charset=utf-8
", will cause this algorithm
to return early.
If the Should element's inline behavior be blocked by Content Security
Policy? algorithm returns "Blocked
" when executed upon the
style
element, "style
", and the style
element's
child text content, then return. CSP
Create a CSS style sheet with the following properties:
text/css
element
The media
attribute of element.
This is a reference to the (possibly absent at this time) attribute, rather than a copy of the attribute's current value. CSSOM defines what happens when the attribute is dynamically set, changed, or removed.
The title
attribute of element, if
element is in a document tree, or the empty string otherwise.
Again, this is a reference to the attribute.
Unset.
Set.
null
Left at its default value.
Left uninitialized.
This doesn't seem right. Presumably we should be using the element's child text content? Tracked as issue #2997.
If element contributes a script-blocking style sheet, append element to its node document's script-blocking style sheet set.
If element's media
attribute's value
matches the environment and element is
potentially render-blocking, then block rendering on
element.
Once the attempts to obtain the style sheet's critical subresources, if any, are complete, or, if the style sheet has no critical subresources, once the style sheet has been parsed and processed, the user agent must run these steps:
Fetching the critical subresources is not well-defined; probably issue #968 is the best resolution for that.
In the meantime, any critical subresource request should have its render-blocking set to whether or not the
style
element is currently render-blocking.
Let element be the style
element associated with the style sheet
in question.
Let success be true.
If the attempts to obtain any of the style sheet's critical subresources failed for any reason (e.g., DNS error, HTTP 404 response, a connection being prematurely closed, unsupported Content-Type), set success to false.
Note that content-specific errors, e.g., CSS parse errors or PNG decoding errors, do not affect success.
Queue an element task on the networking task source given element and the following steps:
If success is true, fire an event
named load
at element.
Otherwise, fire an event named error
at element.
If element contributes a script-blocking style sheet:
Assert: element's node document's script-blocking style sheet set contains element.
Remove element from its node document's script-blocking style sheet set.
Unblock rendering on element.
The element must delay the load event of the element's node document until all the attempts to obtain the style sheet's critical subresources, if any, are complete.
This specification does not specify a style system, but CSS is expected to be supported by most web browsers. CSS
The media
and
blocking
IDL
attributes must each reflect the respective content attributes of the same name.
The LinkStyle
interface is also implemented by this element. CSSOM
The following document has its stress emphasis styled as bright red text rather than italics text, while leaving titles of works and Latin words in their default italics. It shows how using appropriate elements enables easier restyling of documents.
<!DOCTYPE html>
<html lang="en-US">
<head>
<title>My favorite book</title>
<style>
body { color: black; background: white; }
em { font-style: normal; color: red; }
</style>
</head>
<body>
<p>My <em>favorite</em> book of all time has <em>got</em> to be
<cite>A Cat's Life</cite>. It is a book by P. Rahmel that talks
about the <i lang="la">Felis catus</i> in modern human society.</p>
</body>
</html>
If the style sheet referenced no other resources (e.g., it was an internal style sheet given by
a style
element with no @import
rules), then the style rules
must be immediately made available to script; otherwise, the style rules must only be
made available to script once the event loop reaches its update the
rendering step.
An element el in the context of a
Document
of an HTML parser or XML parser contributes a
script-blocking style sheet if all of the following are true:
el was created by that Document
's parser.
el is either a style
element or a link
element that
was an external resource link that contributes to the styling
processing model when the el was created by the parser.
el's media
attribute's value
matches the environment.
el's style sheet was enabled when the element was created by the parser.
The last time the event loop reached step 1,
el's root was that Document
.
The user agent hasn't given up on loading that particular style sheet yet. A user agent may give up on loading a style sheet at any time.
Giving up on a style sheet before the style sheet loads, if the style sheet eventually does still load, means that the script might end up operating with incorrect information. For example, if a style sheet sets the color of an element to green, but a script that inspects the resulting style is executed before the sheet is loaded, the script will find that the element is black (or whatever the default color is), and might thus make poor choices (e.g., deciding to use black as the color elsewhere on the page, instead of green). Implementers have to balance the likelihood of a script using incorrect information with the performance impact of doing nothing while waiting for a slow network request to finish.
It is expected that counterparts to the above rules also apply to
<?xml-stylesheet?>
PIs. However, this has not yet been thoroughly
investigated.
A Document
has a script-blocking style sheet set, which is an ordered set, initially empty.
A Document
document has a style sheet that is blocking
scripts if the following steps return true:
If document's script-blocking style sheet set is not empty, then return true.
If document's node navigable is null, then return false.
Let containerDocument be document's node navigable's container document.
If containerDocument is non-null and containerDocument's script-blocking style sheet set is not empty, then return true.
Return false.
A Document
has no style sheet that is blocking scripts if it does not
have a style sheet that is blocking
scripts.
body
elementhtml
element.onafterprint
onbeforeprint
onbeforeunload
onhashchange
onlanguagechange
onmessage
onmessageerror
onoffline
ononline
onpageswap
onpagehide
onpagereveal
onpageshow
onpopstate
onrejectionhandled
onstorage
onunhandledrejection
onunload
[Exposed=Window]
interface HTMLBodyElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLBodyElement includes WindowEventHandlers;
HTMLBodyElement
.The body
element represents the contents of the document.
In conforming documents, there is only one body
element. The document.body
IDL attribute provides scripts with easy access to
a document's body
element.
Some DOM operations (for example, parts of the drag and drop model)
are defined in terms of "the body element". This refers to a particular element in
the DOM, as per the definition of the term, and not any arbitrary body
element.
The body
element exposes as event handler content attributes a number
of the event handlers of the Window
object. It also mirrors their
event handler IDL attributes.
The event handlers of the Window
object named by the
Window
-reflecting body element event handler set, exposed on the
body
element, replace the generic event handlers with the same names
normally supported by HTML elements.
Thus, for example, a bubbling error
event
dispatched on a child of the body element of a Document
would first
trigger the onerror
event handler content
attributes of that element, then that of the root html
element, and only
then would it trigger the onerror
event handler content attribute on the
body
element. This is because the event would bubble from the target, to the
body
, to the html
, to the Document
, to the
Window
, and the event handler on the
body
is watching the Window
not the body
. A regular event
listener attached to the body
using addEventListener()
,
however, would be run when the event bubbled through the body
and not when it reaches
the Window
object.
This page updates an indicator to show whether or not the user is online:
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Online or offline?</title>
<script>
function update(online) {
document.getElementById('status').textContent =
online ? 'Online' : 'Offline';
}
</script>
</head>
<body ononline="update(true)"
onoffline="update(false)"
onload="update(navigator.onLine)">
<p>You are: <span id="status">(Unknown)</span></p>
</body>
</html>
article
elementHTMLElement
.The article
element represents a complete, or self-contained,
composition in a document, page, application, or site and that is, in principle, independently
distributable or reusable, e.g. in syndication. This could be a forum post, a magazine or
newspaper article, a blog entry, a user-submitted comment, an interactive widget or gadget, or any
other independent item of content.
When article
elements are nested, the inner article
elements
represent articles that are in principle related to the contents of the outer article. For
instance, a blog entry on a site that accepts user-submitted comments could represent the comments
as article
elements nested within the article
element for the blog
entry.
Author information associated with an article
element (q.v. the
address
element) does not apply to nested article
elements.
When used specifically with content to be redistributed in syndication, the
article
element is similar in purpose to the entry
element in
Atom. ATOM
The schema.org microdata vocabulary can be used to provide the publication date
for an article
element, using one of the CreativeWork subtypes.
When the main content of the page (i.e. excluding footers, headers, navigation blocks, and
sidebars) is all one single self-contained composition, that content may be marked with an
article
, but it is technically redundant in that case (since it's self-evident that
the page is a single composition, as it is a single document).
This example shows a blog post using the article
element, with some schema.org
annotations:
<article itemscope itemtype="http://schema.org/BlogPosting">
<header>
<h2 itemprop="headline">The Very First Rule of Life</h2>
<p><time itemprop="datePublished" datetime="2009-10-09">3 days ago</time></p>
<link itemprop="url" href="?comments=0">
</header>
<p>If there's a microphone anywhere near you, assume it's hot and
sending whatever you're saying to the world. Seriously.</p>
<p>...</p>
<footer>
<a itemprop="discussionUrl" href="?comments=1">Show comments...</a>
</footer>
</article>
Here is that same blog post, but showing some of the comments:
<article itemscope itemtype="http://schema.org/BlogPosting">
<header>
<h2 itemprop="headline">The Very First Rule of Life</h2>
<p><time itemprop="datePublished" datetime="2009-10-09">3 days ago</time></p>
<link itemprop="url" href="?comments=0">
</header>
<p>If there's a microphone anywhere near you, assume it's hot and
sending whatever you're saying to the world. Seriously.</p>
<p>...</p>
<section>
<h1>Comments</h1>
<article itemprop="comment" itemscope itemtype="http://schema.org/Comment" id="c1">
<link itemprop="url" href="#c1">
<footer>
<p>Posted by: <span itemprop="creator" itemscope itemtype="http://schema.org/Person">
<span itemprop="name">George Washington</span>
</span></p>
<p><time itemprop="dateCreated" datetime="2009-10-10">15 minutes ago</time></p>
</footer>
<p>Yeah! Especially when talking about your lobbyist friends!</p>
</article>
<article itemprop="comment" itemscope itemtype="http://schema.org/Comment" id="c2">
<link itemprop="url" href="#c2">
<footer>
<p>Posted by: <span itemprop="creator" itemscope itemtype="http://schema.org/Person">
<span itemprop="name">George Hammond</span>
</span></p>
<p><time itemprop="dateCreated" datetime="2009-10-10">5 minutes ago</time></p>
</footer>
<p>Hey, you have the same first name as me.</p>
</article>
</section>
</article>
Notice the use of footer
to give the information for each comment (such as who
wrote it and when): the footer
element can appear at the start of its
section when appropriate, such as in this case. (Using header
in this case wouldn't
be wrong either; it's mostly a matter of authoring preference.)
In this example, article
elements are used to host widgets on a portal page. The
widgets are implemented as customized built-in
elements in order to get specific styling and scripted behavior.
<!DOCTYPE HTML>
<html lang=en>
<title>eHome Portal</title>
<script src="/scripts/widgets.js"></script>
<link rel=stylesheet href="/styles/main.css">
<article is="stock-widget">
<h2>Stocks</h2>
<table>
<thead> <tr> <th> Stock <th> Value <th> Delta
<tbody> <template> <tr> <td> <td> <td> </template>
</table>
<p> <input type=button value="Refresh" onclick="this.parentElement.refresh()">
</article>
<article is="news-widget">
<h2>News</h2>
<ul>
<template>
<li>
<p><img> <strong></strong>
<p>
</template>
</ul>
<p> <input type=button value="Refresh" onclick="this.parentElement.refresh()">
</article>
section
elementHTMLElement
.The section
element represents a generic section of a document or
application. A section, in this context, is a thematic grouping of content, typically with a
heading.
Examples of sections would be chapters, the various tabbed pages in a tabbed dialog box, or the numbered sections of a thesis. A web site's home page could be split into sections for an introduction, news items, and contact information.
Authors are encouraged to use the article
element instead of the
section
element when it would make sense to syndicate the contents of the
element.
The section
element is not a generic
container element. When an element is needed only for styling purposes or as a convenience for
scripting, authors are encouraged to use the div
element instead. A general rule is
that the section
element is appropriate only if the element's contents would be
listed explicitly in the document's outline.
In the following example, we see an article (part of a larger web page) about apples, containing two short sections.
<article>
<hgroup>
<h2>Apples</h2>
<p>Tasty, delicious fruit!</p>
</hgroup>
<p>The apple is the pomaceous fruit of the apple tree.</p>
<section>
<h3>Red Delicious</h3>
<p>These bright red apples are the most common found in many
supermarkets.</p>
</section>
<section>
<h3>Granny Smith</h3>
<p>These juicy, green apples make a great filling for
apple pies.</p>
</section>
</article>
Here is a graduation programme with two sections, one for the list of people graduating, and one for the description of the ceremony. (The markup in this example features an uncommon style sometimes used to minimize the amount of inter-element whitespace.)
<!DOCTYPE Html>
<Html Lang=En
><Head
><Title
>Graduation Ceremony Summer 2022</Title
></Head
><Body
><H1
>Graduation</H1
><Section
><H2
>Ceremony</H2
><P
>Opening Procession</P
><P
>Speech by Valedictorian</P
><P
>Speech by Class President</P
><P
>Presentation of Diplomas</P
><P
>Closing Speech by Headmaster</P
></Section
><Section
><H2
>Graduates</H2
><Ul
><Li
>Molly Carpenter</Li
><Li
>Anastasia Luccio</Li
><Li
>Ebenezar McCoy</Li
><Li
>Karrin Murphy</Li
><Li
>Thomas Raith</Li
><Li
>Susan Rodriguez</Li
></Ul
></Section
></Body
></Html>
In this example, a book author has marked up some sections as chapters and some as appendices, and uses CSS to style the headers in these two classes of section differently.
<style>
section { border: double medium; margin: 2em; }
section.chapter h2 { font: 2em Roboto, Helvetica Neue, sans-serif; }
section.appendix h2 { font: small-caps 2em Roboto, Helvetica Neue, sans-serif; }
</style>
<header>
<hgroup>
<h1>My Book</h1>
<p>A sample with not much content</p>
</hgroup>
<p><small>Published by Dummy Publicorp Ltd.</small></p>
</header>
<section class="chapter">
<h2>My First Chapter</h2>
<p>This is the first of my chapters. It doesn't say much.</p>
<p>But it has two paragraphs!</p>
</section>
<section class="chapter">
<h2>It Continues: The Second Chapter</h2>
<p>Bla dee bla, dee bla dee bla. Boom.</p>
</section>
<section class="chapter">
<h2>Chapter Three: A Further Example</h2>
<p>It's not like a battle between brightness and earthtones would go
unnoticed.</p>
<p>But it might ruin my story.</p>
</section>
<section class="appendix">
<h2>Appendix A: Overview of Examples</h2>
<p>These are demonstrations.</p>
</section>
<section class="appendix">
<h2>Appendix B: Some Closing Remarks</h2>
<p>Hopefully this long example shows that you <em>can</em> style
sections, so long as they are used to indicate actual sections.</p>
</section>
nav
elementHTMLElement
.The nav
element represents a section of a page that links to other
pages or to parts within the page: a section with navigation links.
Not all groups of links on a page need to be in a nav
element —
the element is primarily intended for sections that consist of major navigation blocks. In
particular, it is common for footers to have a short list of links to various pages of a site,
such as the terms of service, the home page, and a copyright page. The footer
element
alone is sufficient for such cases; while a nav
element can be used in such cases, it
is usually unnecessary.
User agents (such as screen readers) that are targeted at users who can benefit from navigation information being omitted in the initial rendering, or who can benefit from navigation information being immediately available, can use this element as a way to determine what content on the page to initially skip or provide on request (or both).
In the following example, there are two nav
elements, one for primary navigation
around the site, and one for secondary navigation around the page itself.
<body>
<h1>The Wiki Center Of Exampland</h1>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/events">Current Events</a></li>
...more...
</ul>
</nav>
<article>
<header>
<h2>Demos in Exampland</h2>
<p>Written by A. N. Other.</p>
</header>
<nav>
<ul>
<li><a href="#public">Public demonstrations</a></li>
<li><a href="#destroy">Demolitions</a></li>
...more...
</ul>
</nav>
<div>
<section id="public">
<h2>Public demonstrations</h2>
<p>...more...</p>
</section>
<section id="destroy">
<h2>Demolitions</h2>
<p>...more...</p>
</section>
...more...
</div>
<footer>
<p><a href="?edit">Edit</a> | <a href="?delete">Delete</a> | <a href="?Rename">Rename</a></p>
</footer>
</article>
<footer>
<p><small>© copyright 1998 Exampland Emperor</small></p>
</footer>
</body>
In the following example, the page has several places where links are present, but only one of those places is considered a navigation section.
<body itemscope itemtype="http://schema.org/Blog">
<header>
<h1>Wake up sheeple!</h1>
<p><a href="news.html">News</a> -
<a href="blog.html">Blog</a> -
<a href="forums.html">Forums</a></p>
<p>Last Modified: <span itemprop="dateModified">2009-04-01</span></p>
<nav>
<h2>Navigation</h2>
<ul>
<li><a href="articles.html">Index of all articles</a></li>
<li><a href="today.html">Things sheeple need to wake up for today</a></li>
<li><a href="successes.html">Sheeple we have managed to wake</a></li>
</ul>
</nav>
</header>
<main>
<article itemprop="blogPosts" itemscope itemtype="http://schema.org/BlogPosting">
<header>
<h2 itemprop="headline">My Day at the Beach</h2>
</header>
<div itemprop="articleBody">
<p>Today I went to the beach and had a lot of fun.</p>
...more content...
</div>
<footer>
<p>Posted <time itemprop="datePublished" datetime="2009-10-10">Thursday</time>.</p>
</footer>
</article>
...more blog posts...
</main>
<footer>
<p>Copyright ©
<span itemprop="copyrightYear">2010</span>
<span itemprop="copyrightHolder">The Example Company</span>
</p>
<p><a href="about.html">About</a> -
<a href="policy.html">Privacy Policy</a> -
<a href="contact.html">Contact Us</a></p>
</footer>
</body>
You can also see microdata annotations in the above example that use the schema.org vocabulary to provide the publication date and other metadata about the blog post.
A nav
element doesn't have to contain a list, it can contain other kinds of
content as well. In this navigation block, links are provided in prose:
<nav>
<h1>Navigation</h1>
<p>You are on my home page. To the north lies <a href="/blog">my
blog</a>, from whence the sounds of battle can be heard. To the east
you can see a large mountain, upon which many <a
href="/school">school papers</a> are littered. Far up thus mountain
you can spy a little figure who appears to be me, desperately
scribbling a <a href="/school/thesis">thesis</a>.</p>
<p>To the west are several exits. One fun-looking exit is labeled <a
href="https://games.example.com/">"games"</a>. Another more
boring-looking exit is labeled <a
href="https://isp.example.net/">ISP™</a>.</p>
<p>To the south lies a dark and dank <a href="/about">contacts
page</a>. Cobwebs cover its disused entrance, and at one point you
see a rat run quickly out of the page.</p>
</nav>
In this example, nav
is used in an email application, to let the user switch
folders:
<p><input type=button value="Compose" onclick="compose()"></p>
<nav>
<h1>Folders</h1>
<ul>
<li> <a href="/inbox" onclick="return openFolder(this.href)">Inbox</a> <span class=count></span>
<li> <a href="/sent" onclick="return openFolder(this.href)">Sent</a>
<li> <a href="/drafts" onclick="return openFolder(this.href)">Drafts</a>
<li> <a href="/trash" onclick="return openFolder(this.href)">Trash</a>
<li> <a href="/customers" onclick="return openFolder(this.href)">Customers</a>
</ul>
</nav>
aside
elementHTMLElement
.The aside
element represents a section of a page that consists of
content that is tangentially related to the content around the aside
element, and
which could be considered separate from that content. Such sections are often represented as
sidebars in printed typography.
The element can be used for typographical effects like pull quotes or sidebars, for
advertising, for groups of nav
elements, and for other content that is considered
separate from the main content of the page.
It's not appropriate to use the aside
element just for
parentheticals, since those are part of the main flow of the document.
The following example shows how an aside is used to mark up background material on Switzerland in a much longer news story on Europe.
<aside>
<h2>Switzerland</h2>
<p>Switzerland, a land-locked country in the middle of geographic
Europe, has not joined the geopolitical European Union, though it is
a signatory to a number of European treaties.</p>
</aside>
The following example shows how an aside is used to mark up a pull quote in a longer article.
...
<p>He later joined a large company, continuing on the same work.
<q>I love my job. People ask me what I do for fun when I'm not at
work. But I'm paid to do my hobby, so I never know what to
answer. Some people wonder what they would do if they didn't have to
work... but I know what I would do, because I was unemployed for a
year, and I filled that time doing exactly what I do now.</q></p>
<aside>
<q>People ask me what I do for fun when I'm not at work. But I'm
paid to do my hobby, so I never know what to answer.</q>
</aside>
<p>Of course his work — or should that be hobby? —
isn't his only passion. He also enjoys other pleasures.</p>
...
The following extract shows how aside
can be used for blogrolls and other side
content on a blog:
<body>
<header>
<h1>My wonderful blog</h1>
<p>My tagline</p>
</header>
<aside>
<!-- this aside contains two sections that are tangentially related
to the page, namely, links to other blogs, and links to blog posts
from this blog -->
<nav>
<h2>My blogroll</h2>
<ul>
<li><a href="https://blog.example.com/">Example Blog</a>
</ul>
</nav>
<nav>
<h2>Archives</h2>
<ol reversed>
<li><a href="/last-post">My last post</a>
<li><a href="/first-post">My first post</a>
</ol>
</nav>
</aside>
<aside>
<!-- this aside is tangentially related to the page also, it
contains twitter messages from the blog author -->
<h1>Twitter Feed</h1>
<blockquote cite="https://twitter.example.net/t31351234">
I'm on vacation, writing my blog.
</blockquote>
<blockquote cite="https://twitter.example.net/t31219752">
I'm going to go on vacation soon.
</blockquote>
</aside>
<article>
<!-- this is a blog post -->
<h2>My last post</h2>
<p>This is my last post.</p>
<footer>
<p><a href="/last-post" rel=bookmark>Permalink</a>
</footer>
</article>
<article>
<!-- this is also a blog post -->
<h2>My first post</h2>
<p>This is my first post.</p>
<aside>
<!-- this aside is about the blog post, since it's inside the
<article> element; it would be wrong, for instance, to put the
blogroll here, since the blogroll isn't really related to this post
specifically, only to the page as a whole -->
<h2>Posting</h2>
<p>While I'm thinking about it, I wanted to say something about
posting. Posting is fun!</p>
</aside>
<footer>
<p><a href="/first-post" rel=bookmark>Permalink</a>
</footer>
</article>
<footer>
<p><a href="/archives">Archives</a> -
<a href="/about">About me</a> -
<a href="/copyright">Copyright</a></p>
</footer>
</body>
h1
, h2
, h3
, h4
, h5
, and h6
elementshgroup
element.[Exposed=Window]
interface HTMLHeadingElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLHeadingElement
.These elements represent headings for their sections.
The semantics and meaning of these elements are defined in the section on headings and outlines.
These elements have a heading level given by the number in their name. The
heading level corresponds to the levels of nested sections. The h1
element is for a top-level section, h2
for a subsection, h3
for a
sub-subsection, and so on.
As far as their respective document outlines (their heading and section structures) are concerned, these two snippets are semantically equivalent:
<body>
<h1>Let's call it a draw(ing surface)</h1>
<h2>Diving in</h2>
<h2>Simple shapes</h2>
<h2>Canvas coordinates</h2>
<h3>Canvas coordinates diagram</h3>
<h2>Paths</h2>
</body>
<body>
<h1>Let's call it a draw(ing surface)</h1>
<section>
<h2>Diving in</h2>
</section>
<section>
<h2>Simple shapes</h2>
</section>
<section>
<h2>Canvas coordinates</h2>
<section>
<h3>Canvas coordinates diagram</h3>
</section>
</section>
<section>
<h2>Paths</h2>
</section>
</body>
Authors might prefer the former style for its terseness, or the latter style for its additional styling hooks. Which is best is purely an issue of preferred authoring style.
hgroup
elementp
elements, followed by one h1
, h2
,
h3
, h4
, h5
, or h6
element, followed by zero
or more p
elements, optionally intermixed with script-supporting
elements.HTMLElement
.The hgroup
element represents a heading and related content. The
element may be used to group an h1
–h6
element with one or more
p
elements containing content representing a subheading, alternative title, or
tagline.
Here are some examples of valid headings contained within an hgroup
element.
<hgroup>
<h1>The reality dysfunction</h1>
<p>Space is not the only void</p>
</hgroup>
<hgroup>
<h1>Dr. Strangelove</h1>
<p>Or: How I Learned to Stop Worrying and Love the Bomb</p>
</hgroup>
header
elementheader
or footer
element
descendants.HTMLElement
.The header
element represents a group of introductory or navigational
aids.
A header
element is intended to usually contain a heading
(an h1
–h6
element or an hgroup
element), but this is
not required. The header
element can also be used to wrap a section's table of
contents, a search form, or any relevant logos.
Here are some sample headers. This first one is for a game:
<header>
<p>Welcome to...</p>
<h1>Voidwars!</h1>
</header>
The following snippet shows how the element can be used to mark up a specification's header:
<header>
<hgroup>
<h1>Fullscreen API</h1>
<p>Living Standard — Last Updated 19 October 2015<p>
</hgroup>
<dl>
<dt>Participate:</dt>
<dd><a href="https://github.com/whatwg/fullscreen">GitHub whatwg/fullscreen</a></dd>
<dt>Commits:</dt>
<dd><a href="https://github.com/whatwg/fullscreen/commits">GitHub whatwg/fullscreen/commits</a></dd>
</dl>
</header>
The header
element is not sectioning content; it doesn't
introduce a new section.
In this example, the page has a page heading given by the h1
element, and two
subsections whose headings are given by h2
elements. The content after the
header
element is still part of the last subsection started in the
header
element, because the header
element doesn't take part in the
outline algorithm.
<body>
<header>
<h1>Little Green Guys With Guns</h1>
<nav>
<ul>
<li><a href="/games">Games</a>
<li><a href="/forum">Forum</a>
<li><a href="/download">Download</a>
</ul>
</nav>
<h2>Important News</h2> <!-- this starts a second subsection -->
<!-- this is part of the subsection entitled "Important News" -->
<p>To play today's games you will need to update your client.</p>
<h2>Games</h2> <!-- this starts a third subsection -->
</header>
<p>You have three active games:</p>
<!-- this is still part of the subsection entitled "Games" -->
...
footer
elementheader
or footer
element
descendants.HTMLElement
.The footer
element represents a footer for its nearest ancestor
sectioning content element, or for the body element if there is no such
ancestor. A footer typically contains information about its section such as who wrote it, links
to related documents, copyright data, and the like.
When the footer
element contains entire sections, they represent appendices, indices, long colophons, verbose license
agreements, and other such content.
Contact information for the author or editor of a section belongs in an
address
element, possibly itself inside a footer
. Bylines and other
information that could be suitable for both a header
or a footer
can be
placed in either (or neither). The primary purpose of these elements is merely to help the author
write self-explanatory markup that is easy to maintain and style; they are not intended to impose
specific structures on authors.
Footers don't necessarily have to appear at the end of a section, though they usually do.
When there is no ancestor sectioning content element, then it applies to the whole page.
The footer
element is not itself sectioning content; it
doesn't introduce a new section.
Here is a page with two footers, one at the top and one at the bottom, with the same content:
<body>
<footer><a href="../">Back to index...</a></footer>
<hgroup>
<h1>Lorem ipsum</h1>
<p>The ipsum of all lorems</p>
</hgroup>
<p>A dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.</p>
<footer><a href="../">Back to index...</a></footer>
</body>
Here is an example which shows the footer
element being used both for a site-wide
footer and for a section footer.
<!DOCTYPE HTML>
<HTML LANG="en"><HEAD>
<TITLE>The Ramblings of a Scientist</TITLE>
<BODY>
<H1>The Ramblings of a Scientist</H1>
<ARTICLE>
<H1>Episode 15</H1>
<VIDEO SRC="/fm/015.ogv" CONTROLS PRELOAD>
<P><A HREF="/fm/015.ogv">Download video</A>.</P>
</VIDEO>
<FOOTER> <!-- footer for article -->
<P>Published <TIME DATETIME="2009-10-21T18:26-07:00">on 2009/10/21 at 6:26pm</TIME></P>
</FOOTER>
</ARTICLE>
<ARTICLE>
<H1>My Favorite Trains</H1>
<P>I love my trains. My favorite train of all time is a Köf.</P>
<P>It is fun to see them pull some coal cars because they look so
dwarfed in comparison.</P>
<FOOTER> <!-- footer for article -->
<P>Published <TIME DATETIME="2009-09-15T14:54-07:00">on 2009/09/15 at 2:54pm</TIME></P>
</FOOTER>
</ARTICLE>
<FOOTER> <!-- site wide footer -->
<NAV>
<P><A HREF="/credits.html">Credits</A> —
<A HREF="/tos.html">Terms of Service</A> —
<A HREF="/index.html">Blog Index</A></P>
</NAV>
<P>Copyright © 2009 Gordon Freeman</P>
</FOOTER>
</BODY>
</HTML>
Some site designs have what is sometimes referred to as "fat footers" — footers that contain a lot of material, including images, links to other articles, links to pages for sending feedback, special offers... in some ways, a whole "front page" in the footer.
This fragment shows the bottom of a page on a site with a "fat footer":
...
<footer>
<nav>
<section>
<h1>Articles</h1>
<p><img src="images/somersaults.jpeg" alt=""> Go to the gym with
our somersaults class! Our teacher Jim takes you through the paces
in this two-part article. <a href="articles/somersaults/1">Part
1</a> · <a href="articles/somersaults/2">Part 2</a></p>
<p><img src="images/kindplus.jpeg"> Tired of walking on the edge of
a clif<!-- sic -->? Our guest writer Lara shows you how to bumble
your way through the bars. <a href="articles/kindplus/1">Read
more...</a></p>
<p><img src="images/crisps.jpeg"> The chips are down, now all
that's left is a potato. What can you do with it? <a
href="articles/crisps/1">Read more...</a></p>
</section>
<ul>
<li> <a href="/about">About us...</a>
<li> <a href="/feedback">Send feedback!</a>
<li> <a href="/sitemap">Sitemap</a>
</ul>
</nav>
<p><small>Copyright © 2015 The Snacker —
<a href="/tos">Terms of Service</a></small></p>
</footer>
</body>
address
elementheader
, footer
, or
address
element descendants.HTMLElement
.The address
element represents the contact information for its
nearest article
or body
element ancestor. If that is the body
element, then the contact information applies to the document as a whole.
For example, a page at the W3C web site related to HTML might include the following contact information:
<ADDRESS>
<A href="../People/Raggett/">Dave Raggett</A>,
<A href="../People/Arnaud/">Arnaud Le Hors</A>,
contact persons for the <A href="Activity">W3C HTML Activity</A>
</ADDRESS>
The address
element must not be used to represent arbitrary addresses (e.g. postal
addresses), unless those addresses are in fact the relevant contact information. (The
p
element is the appropriate element for marking up postal addresses in general.)
The address
element must not contain information other than contact
information.
For example, the following is non-conforming use of the
address
element:
<ADDRESS>Last Modified: 1999/12/24 23:37:50</ADDRESS>
Typically, the address
element would be included along with other information in a
footer
element.
The contact information for a node node is a collection of
address
elements defined by the first applicable entry from the following list:
article
elementbody
elementThe contact information consists of all the address
elements that have node as an ancestor and do not have another body
or
article
element ancestor that is a descendant of node.
article
elementbody
elementThe contact information of node is the same as the contact information of
the nearest article
or body
element ancestor, whichever is
nearest.
The contact information of node is the same as the contact information of
the body element of the Document
.
There is no contact information for node.
User agents may expose the contact information of a node to the user, or use it for other purposes, such as indexing sections based on the sections' contact information.
In this example the footer contains contact information and a copyright notice.
<footer>
<address>
For more details, contact
<a href="mailto:js@example.com">John Smith</a>.
</address>
<p><small>© copyright 2038 Example Corp.</small></p>
</footer>
h1
–h6
elements have a heading level, which is given
by the number in the element's name.
These elements represent headings. The lower a heading's heading level is, the fewer ancestor sections the heading has.
The outline is all headings in a document, in tree order.
The outline should be used for generating document outlines, for example when generating tables of contents. When creating an interactive table of contents, entries should jump the user to the relevant heading.
If a document has one or more headings, at least a single heading within the outline should have a heading level of 1.
Each heading following another heading lead in the outline must have a heading level that is less than, equal to, or 1 greater than lead's heading level.
The following example is non-conforming:
<body>
<h1>Apples</h1>
<p>Apples are fruit.</p>
<section>
<h3>Taste</h3>
<p>They taste lovely.</p>
</section>
</body>
It could be written as follows and then it would be conforming:
<body>
<h1>Apples</h1>
<p>Apples are fruit.</p>
<section>
<h2>Taste</h2>
<p>They taste lovely.</p>
</section>
</body>
The following markup fragment:
<body>
<hgroup id="document-title">
<h1>HTML: Living Standard</h1>
<p>Last Updated 12 August 2016</p>
</hgroup>
<p>Some intro to the document.</p>
<h2>Table of contents</h2>
<ol id=toc>...</ol>
<h2>First section</h2>
<p>Some intro to the first section.</p>
</body>
...results in 3 document headings:
<h1>HTML: Living Standard</h1>
<h2>Table of contents</h2>
.
<h2>First section</h2>
.
A rendered view of the outline might look like:
First, here is a document, which is a book with very short chapters and subsections:
<!DOCTYPE HTML>
<html lang=en>
<title>The Tax Book (all in one page)</title>
<h1>The Tax Book</h1>
<h2>Earning money</h2>
<p>Earning money is good.</p>
<h3>Getting a job</h3>
<p>To earn money you typically need a job.</p>
<h2>Spending money</h2>
<p>Spending is what money is mainly used for.</p>
<h3>Cheap things</h3>
<p>Buying cheap things often not cost-effective.</p>
<h3>Expensive things</h3>
<p>The most expensive thing is often not the most cost-effective either.</p>
<h2>Investing money</h2>
<p>You can lend your money to other people.</p>
<h2>Losing money</h2>
<p>If you spend money or invest money, sooner or later you will lose money.
<h3>Poor judgement</h3>
<p>Usually if you lose money it's because you made a mistake.</p>
Its outline could be presented as follows:
Notice that the title
element is not a heading.
A document can contain multiple top-level headings:
<!DOCTYPE HTML>
<html lang=en>
<title>Alphabetic Fruit</title>
<h1>Apples</h1>
<p>Pomaceous.</p>
<h1>Bananas</h1>
<p>Edible.</p>
<h1>Carambola</h1>
<p>Star.</p>
The document's outline could be presented as follows:
header
elements do not influence the outline of a
document:
<!DOCTYPE HTML>
<html lang="en">
<title>We're adopting a child! — Ray's blog</title>
<h1>Ray's blog</h1>
<article>
<header>
<nav>
<a href="?t=-1d">Yesterday</a>;
<a href="?t=-7d">Last week</a>;
<a href="?t=-1m">Last month</a>
</nav>
<h2>We're adopting a child!</h2>
</header>
<p>As of today, Janine and I have signed the papers to become
the proud parents of baby Diane! We've been looking forward to
this day for weeks.</p>
</article>
</html>
The document's outline could be presented as follows:
The following example is conforming, but not encouraged as it has no heading whose heading level is 1:
<!DOCTYPE HTML>
<html lang=en>
<title>Alphabetic Fruit</title>
<section>
<h2>Apples</h2>
<p>Pomaceous.</p>
</section>
<section>
<h2>Bananas</h2>
<p>Edible.</p>
</section>
<section>
<h2>Carambola</h2>
<p>Star.</p>
</section>
The document's outline could be presented as follows:
The following example is conforming, but not encouraged as the first heading's heading level is not 1:
<!DOCTYPE HTML>
<html lang=en>
<title>Feathers on The Site of Encyclopedic Knowledge</title>
<h2>A plea from our caretakers</h2>
<p>Please, we beg of you, send help! We're stuck in the server room!</p>
<h1>Feathers</h1>
<p>Epidermal growths.</p>
The document's outline could be presented as follows:
User agents are encouraged to expose page outlines to users to aid in navigation. This is especially true for non-visual media, e.g. screen readers.
For instance, a user agent could map the arrow keys as follows:
Element | Purpose |
---|---|
Example | |
body
| |
| |
article
| |
| |
section
| |
| |
nav
| |
| |
aside
| |
| |
h1 –h6
| A heading |
| |
hgroup
| |
| |
header
| |
| |
footer
| |
|
A section
forms part of something else. An article
is its own thing.
But how does one know which is which? Mostly the real answer is "it depends on author intent".
For example, one could imagine a book with a "Granny Smith" chapter that just said "These
juicy, green apples make a great filling for apple pies."; that would be a section
because there'd be lots of other chapters on (maybe) other kinds of apples.
On the other hand, one could imagine a tweet or reddit comment or tumblr post or newspaper
classified ad that just said "Granny Smith. These juicy, green apples make a great filling for
apple pies."; it would then be article
s because that was the whole thing.
A comment on an article is not part of the article
on which it is commenting,
therefore it is its own article
.
p
element[Exposed=Window]
interface HTMLParagraphElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLParagraphElement
.The p
element represents a paragraph.
While paragraphs are usually represented in visual media by blocks of text that are physically separated from adjacent blocks through blank lines, a style sheet or user agent would be equally justified in presenting paragraph breaks in a different manner, for instance using inline pilcrows (¶).
The following examples are conforming HTML fragments:
<p>The little kitten gently seated herself on a piece of
carpet. Later in her life, this would be referred to as the time the
cat sat on the mat.</p>
<fieldset>
<legend>Personal information</legend>
<p>
<label>Name: <input name="n"></label>
<label><input name="anon" type="checkbox"> Hide from other users</label>
</p>
<p><label>Address: <textarea name="a"></textarea></label></p>
</fieldset>
<p>There was once an example from Femley,<br>
Whose markup was of dubious quality.<br>
The validator complained,<br>
So the author was pained,<br>
To move the error from the markup to the rhyming.</p>
The p
element should not be used when a more specific element is more
appropriate.
The following example is technically correct:
<section>
<!-- ... -->
<p>Last modified: 2001-04-23</p>
<p>Author: fred@example.com</p>
</section>
However, it would be better marked-up as:
<section>
<!-- ... -->
<footer>Last modified: 2001-04-23</footer>
<address>Author: fred@example.com</address>
</section>
Or:
<section>
<!-- ... -->
<footer>
<p>Last modified: 2001-04-23</p>
<address>Author: fred@example.com</address>
</footer>
</section>
List elements (in particular, ol
and ul
elements) cannot be children
of p
elements. When a sentence contains a bulleted list, therefore, one might wonder
how it should be marked up.
For instance, this fantastic sentence has bullets relating to
and is further discussed below.
The solution is to realize that a paragraph, in HTML terms, is not a logical concept, but a structural one. In the fantastic example above, there are actually five paragraphs as defined by this specification: one before the list, one for each bullet, and one after the list.
The markup for the above example could therefore be:
<p>For instance, this fantastic sentence has bullets relating to</p>
<ul>
<li>wizards,
<li>faster-than-light travel, and
<li>telepathy,
</ul>
<p>and is further discussed below.</p>
Authors wishing to conveniently style such "logical" paragraphs consisting of multiple
"structural" paragraphs can use the div
element instead of the p
element.
Thus for instance the above example could become the following:
<div>For instance, this fantastic sentence has bullets relating to
<ul>
<li>wizards,
<li>faster-than-light travel, and
<li>telepathy,
</ul>
and is further discussed below.</div>
This example still has five structural paragraphs, but now the author can style just the
div
instead of having to consider each part of the example separately.
hr
elementselect
element.[Exposed=Window]
interface HTMLHRElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLHRElement
.The hr
element represents a paragraph-level thematic
break, e.g., a scene change in a story, or a transition to another topic within a section of a
reference book; alternatively, it represents a separator between a set of options of a
select
element.
The following fictional extract from a project manual shows two sections that use the
hr
element to separate topics within the section.
<section>
<h1>Communication</h1>
<p>There are various methods of communication. This section
covers a few of the important ones used by the project.</p>
<hr>
<p>Communication stones seem to come in pairs and have mysterious
properties:</p>
<ul>
<li>They can transfer thoughts in two directions once activated
if used alone.</li>
<li>If used with another device, they can transfer one's
consciousness to another body.</li>
<li>If both stones are used with another device, the
consciousnesses switch bodies.</li>
</ul>
<hr>
<p>Radios use the electromagnetic spectrum in the meter range and
longer.</p>
<hr>
<p>Signal flares use the electromagnetic spectrum in the
nanometer range.</p>
</section>
<section>
<h1>Food</h1>
<p>All food at the project is rationed:</p>
<dl>
<dt>Potatoes</dt>
<dd>Two per day</dd>
<dt>Soup</dt>
<dd>One bowl per day</dd>
</dl>
<hr>
<p>Cooking is done by the chefs on a set rotation.</p>
</section>
There is no need for an hr
element between the sections themselves, since the
section
elements and the h1
elements imply thematic changes
themselves.
The following extract from Pandora's Star by Peter F. Hamilton shows two
paragraphs that precede a scene change and the paragraph that follows it. The scene change,
represented in the printed book by a gap containing a solitary centered star between the second
and third paragraphs, is here represented using the hr
element.
<p>Dudley was ninety-two, in his second life, and fast approaching
time for another rejuvenation. Despite his body having the physical
age of a standard fifty-year-old, the prospect of a long degrading
campaign within academia was one he regarded with dread. For a
supposedly advanced civilization, the Intersolar Commonwealth could be
appallingly backward at times, not to mention cruel.</p>
<p><i>Maybe it won't be that bad</i>, he told himself. The lie was
comforting enough to get him through the rest of the night's
shift.</p>
<hr>
<p>The Carlton AllLander drove Dudley home just after dawn. Like the
astronomer, the vehicle was old and worn, but perfectly capable of
doing its job. It had a cheap diesel engine, common enough on a
semi-frontier world like Gralmond, although its drive array was a
thoroughly modern photoneural processor. With its high suspension and
deep-tread tyres it could plough along the dirt track to the
observatory in all weather and seasons, including the metre-deep snow
of Gralmond's winters.</p>
The hr
element does not affect the document's
outline.
pre
element[Exposed=Window]
interface HTMLPreElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLPreElement
.The pre
element represents a block of preformatted text, in which
structure is represented by typographic conventions rather than by elements.
In the HTML syntax, a leading newline character immediately following
the pre
element start tag is stripped.
Some examples of cases where the pre
element could be used:
Authors are encouraged to consider how preformatted text will be experienced when the formatting is lost, as will be the case for users of speech synthesizers, braille displays, and the like. For cases like ASCII art, it is likely that an alternative presentation, such as a textual description, would be more universally accessible to the readers of the document.
To represent a block of computer code, the pre
element can be used with a
code
element; to represent a block of computer output the pre
element
can be used with a samp
element. Similarly, the kbd
element can be used
within a pre
element to indicate text that the user is to enter.
In the following snippet, a sample of computer code is presented.
<p>This is the <code>Panel</code> constructor:</p>
<pre><code>function Panel(element, canClose, closeHandler) {
this.element = element;
this.canClose = canClose;
this.closeHandler = function () { if (closeHandler) closeHandler() };
}</code></pre>
In the following snippet, samp
and kbd
elements are mixed in the
contents of a pre
element to show a session of Zork I.
<pre><samp>You are in an open field west of a big white house with a boarded
front door.
There is a small mailbox here.
></samp> <kbd>open mailbox</kbd>
<samp>Opening the mailbox reveals:
A leaflet.
></samp></pre>
The following shows a contemporary poem that uses the pre
element to preserve its
unusual formatting, which forms an intrinsic part of the poem itself.
<pre> maxling
it is with a heart
heavy
that i admit loss of a feline
so loved
a friend lost to the
unknown
(night)
~cdr 11dec07</pre>
blockquote
elementcite
[Exposed=Window]
interface HTMLQuoteElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString cite;
};
The HTMLQuoteElement
interface is
also used by the q
element.
HTMLQuoteElement
.The blockquote
element represents a section that is quoted from
another source.
Content inside a blockquote
must be quoted from another source, whose address, if
it has one, may be cited in the cite
attribute.
If the cite
attribute is present, it must be a
valid URL potentially surrounded by spaces. To obtain the
corresponding citation link, the value of the attribute must be parsed relative to the element's node document. User agents may
allow users to follow such citation links, but they are primarily intended for private use (e.g.,
by server-side scripts collecting statistics about a site's use of quotations), not for
readers.
The content of a blockquote
may be abbreviated or may have context added in the
conventional manner for the text's language.
For example, in English this is traditionally done using square brackets. Consider a page with the sentence "Jane ate the cracker. She then said she liked apples and fish."; it could be quoted as follows:
<blockquote>
<p>[Jane] then said she liked [...] fish.</p>
</blockquote>
Attribution for the quotation, if any, must be placed outside the blockquote
element.
For example, here the attribution is given in a paragraph after the quote:
<blockquote>
<p>I contend that we are both atheists. I just believe in one fewer
god than you do. When you understand why you dismiss all the other
possible gods, you will understand why I dismiss yours.</p>
</blockquote>
<p>— Stephen Roberts</p>
The other examples below show other ways of showing attribution.
The cite
IDL
attribute must reflect the element's cite
content
attribute.
Here a blockquote
element is used in conjunction with a figure
element and its figcaption
to clearly relate a quote to its attribution (which is
not part of the quote and therefore doesn't belong inside the blockquote
itself):
<figure>
<blockquote>
<p>The truth may be puzzling. It may take some work to grapple with.
It may be counterintuitive. It may contradict deeply held
prejudices. It may not be consonant with what we desperately want to
be true. But our preferences do not determine what's true. We have a
method, and that method helps us to reach not absolute truth, only
asymptotic approaches to the truth — never there, just closer
and closer, always finding vast new oceans of undiscovered
possibilities. Cleverly designed experiments are the key.</p>
</blockquote>
<figcaption>Carl Sagan, in "<cite>Wonder and Skepticism</cite>", from
the <cite>Skeptical Inquirer</cite> Volume 19, Issue 1 (January-February
1995)</figcaption>
</figure>
This next example shows the use of cite
alongside blockquote
:
<p>His next piece was the aptly named <cite>Sonnet 130</cite>:</p>
<blockquote cite="https://quotes.example.org/s/sonnet130.html">
<p>My mistress' eyes are nothing like the sun,<br>
Coral is far more red, than her lips red,<br>
...
This example shows how a forum post could use blockquote
to show what post a user
is replying to. The article
element is used for each post, to mark up the
threading.
<article>
<h1><a href="https://bacon.example.com/?blog=109431">Bacon on a crowbar</a></h1>
<article>
<header><strong>t3yw</strong> 12 points 1 hour ago</header>
<p>I bet a narwhal would love that.</p>
<footer><a href="?pid=29578">permalink</a></footer>
<article>
<header><strong>greg</strong> 8 points 1 hour ago</header>
<blockquote><p>I bet a narwhal would love that.</p></blockquote>
<p>Dude narwhals don't eat bacon.</p>
<footer><a href="?pid=29579">permalink</a></footer>
<article>
<header><strong>t3yw</strong> 15 points 1 hour ago</header>
<blockquote>
<blockquote><p>I bet a narwhal would love that.</p></blockquote>
<p>Dude narwhals don't eat bacon.</p>
</blockquote>
<p>Next thing you'll be saying they don't get capes and wizard
hats either!</p>
<footer><a href="?pid=29580">permalink</a></footer>
<article>
<article>
<header><strong>boing</strong> -5 points 1 hour ago</header>
<p>narwhals are worse than ceiling cat</p>
<footer><a href="?pid=29581">permalink</a></footer>
</article>
</article>
</article>
</article>
<article>
<header><strong>fred</strong> 1 points 23 minutes ago</header>
<blockquote><p>I bet a narwhal would love that.</p></blockquote>
<p>I bet they'd love to peel a banana too.</p>
<footer><a href="?pid=29582">permalink</a></footer>
</article>
</article>
</article>
This example shows the use of a blockquote
for short snippets, demonstrating that
one does not have to use p
elements inside blockquote
elements:
<p>He began his list of "lessons" with the following:</p>
<blockquote>One should never assume that his side of
the issue will be recognized, let alone that it will
be conceded to have merits.</blockquote>
<p>He continued with a number of similar points, ending with:</p>
<blockquote>Finally, one should be prepared for the threat
of breakdown in negotiations at any given moment and not
be cowed by the possibility.</blockquote>
<p>We shall now discuss these points...
Examples of how to represent a conversation are shown
in a later section; it is not appropriate to use the cite
and blockquote
elements for this purpose.
ol
elementli
element: Palpable content.li
and script-supporting elements.reversed
start
type
[Exposed=Window]
interface HTMLOListElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean reversed;
[CEReactions] attribute long start;
[CEReactions] attribute DOMString type;
// also has obsolete members
};
HTMLOListElement
.The ol
element represents a list of items, where the items have been
intentionally ordered, such that changing the order would change the meaning of the document.
The items of the list are the li
element child nodes of the ol
element, in tree order.
The reversed
attribute
is a boolean attribute. If present, it indicates that the list is a descending list
(..., 3, 2, 1). If the attribute is omitted, the list is an ascending list (1, 2, 3, ...).
The start
attribute, if
present, must be a valid integer. It is used to determine the starting value of the list.
An ol
element has a starting value, which is
an integer determined as follows:
If the ol
element has a start
attribute,
then:
Let parsed be the result of parsing the value of the attribute as an integer.
If parsed is not an error, then return parsed.
If the ol
element has a reversed
attribute, then return the number of owned li
elements.
Return 1.
The type
attribute can be
used to specify the kind of marker to use in the list, in the cases where that matters (e.g.
because items are to be referenced by their number/letter). The attribute, if
specified, must have a value that is identical to one of the characters given in the
first cell of one of the rows of the following table. The type
attribute represents the state given in the cell in the second
column of the row whose first cell matches the attribute's value; if none of the cells match, or
if the attribute is omitted, then the attribute represents the decimal state.
Keyword | State | Description | Examples for values 1-3 and 3999-4001 | |||||||
---|---|---|---|---|---|---|---|---|---|---|
1
(U+0031)
| decimal | Decimal numbers | 1. | 2. | 3. | ... | 3999. | 4000. | 4001. | ... |
a (U+0061)
| lower-alpha | Lowercase latin alphabet | a. | b. | c. | ... | ewu. | ewv. | eww. | ... |
A (U+0041)
| upper-alpha | Uppercase latin alphabet | A. | B. | C. | ... | EWU. | EWV. | EWW. | ... |
i (U+0069)
| lower-roman | Lowercase roman numerals | i. | ii. | iii. | ... | mmmcmxcix. | i̅v̅. | i̅v̅i. | ... |
I (U+0049)
| upper-roman | Uppercase roman numerals | I. | II. | III. | ... | MMMCMXCIX. | I̅V̅. | I̅V̅I. | ... |
User agents should render the items of the list in a manner consistent with the state of the
type
attribute of the ol
element. Numbers less than
or equal to zero should always use the decimal system regardless of the type
attribute.
For CSS user agents, a mapping for this attribute to the 'list-style-type' CSS property is given in the Rendering section (the mapping is straightforward: the states above have the same names as their corresponding CSS values).
It is possible to redefine the default CSS list styles used to implement this attribute in CSS user agents; doing so will affect how list items are rendered.
The reversed
and type
IDL
attributes must reflect the respective content attributes of the same name.
The start
IDL
attribute must reflect the content attribute of the same name, with a default
value of 1.
This means that the start
IDL attribute does
not necessarily match the list's starting value, in cases
where the start
content attribute is omitted and the reversed
content attribute is specified.
The following markup shows a list where the order matters, and where the ol
element is therefore appropriate. Compare this list to the equivalent list in the ul
section to see an example of the same items using the ul
element.
<p>I have lived in the following countries (given in the order of when
I first lived there):</p>
<ol>
<li>Switzerland
<li>United Kingdom
<li>United States
<li>Norway
</ol>
Note how changing the order of the list changes the meaning of the document. In the following example, changing the relative order of the first two items has changed the birthplace of the author:
<p>I have lived in the following countries (given in the order of when
I first lived there):</p>
<ol>
<li>United Kingdom
<li>Switzerland
<li>United States
<li>Norway
</ol>
ul
elementli
element: Palpable content.li
and script-supporting elements.[Exposed=Window]
interface HTMLUListElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLUListElement
.The ul
element represents a list of items, where the order of the
items is not important — that is, where changing the order would not materially change the
meaning of the document.
The items of the list are the li
element child nodes of the ul
element.
The following markup shows a list where the order does not matter, and where the
ul
element is therefore appropriate. Compare this list to the equivalent list in the
ol
section to see an example of the same items using the ol
element.
<p>I have lived in the following countries:</p>
<ul>
<li>Norway
<li>Switzerland
<li>United Kingdom
<li>United States
</ul>
Note that changing the order of the list does not change the meaning of the document. The items in the snippet above are given in alphabetical order, but in the snippet below they are given in order of the size of their current account balance in 2007, without changing the meaning of the document whatsoever:
<p>I have lived in the following countries:</p>
<ul>
<li>Switzerland
<li>Norway
<li>United Kingdom
<li>United States
</ul>
menu
elementli
element: Palpable content.li
and script-supporting elements.[Exposed=Window]
interface HTMLMenuElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLMenuElement
.The menu
element represents a toolbar consisting of its contents, in
the form of an unordered list of items (represented by li
elements), each of
which represents a command that the user can perform or activate.
The menu
element is simply a semantic alternative to ul
to express an unordered list of commands (a "toolbar").
In this example, a text-editing application uses a menu
element to provide a
series of editing commands:
<menu>
<li><button onclick="copy()"><img src="copy.svg" alt="Copy"></button></li>
<li><button onclick="cut()"><img src="cut.svg" alt="Cut"></button></li>
<li><button onclick="paste()"><img src="paste.svg" alt="Paste"></button></li>
</menu>
Note that the styling to make this look like a conventional toolbar menu is up to the application.
li
elementol
elements.ul
elements.menu
elements.ul
or menu
element: value
[Exposed=Window]
interface HTMLLIElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute long value;
// also has obsolete members
};
HTMLLIElement
.The li
element represents a list item. If its parent element is an
ol
, ul
, or menu
element, then the element is an item of the
parent element's list, as defined for those elements. Otherwise, the list item has no defined
list-related relationship to any other li
element.
The value
attribute, if
present, must be a valid integer. It is used to determine the ordinal
value of the list item, when the li
's list owner is an
ol
element.
Any element whose computed value of 'display' is 'list-item' has a list owner, which is determined as follows:
If the element is not being rendered, return null; the element has no list owner.
Let ancestor be the element's parent.
If the element has an ol
, ul
, or menu
ancestor, set
ancestor to the closest such ancestor element.
Return the closest inclusive ancestor of ancestor that produces a CSS box.
Such an element will always exist, as at the very least the document element will always produce a CSS box.
To determine the ordinal value of each element owned by a given list owner owner, perform the following steps:
Let i be 1.
If owner is an ol
element, let numbering be
owner's starting value. Otherwise, let
numbering be 1.
Loop: If i is greater than the number of list items that owner owns, then return; all of owner's owned list items have been assigned ordinal values.
Let item be the ith of owner's owned list items, in tree order.
If item is an li
element that has a value
attribute, then:
Let parsed be the result of parsing the value of the attribute as an integer.
If parsed is not an error, then set numbering to parsed.
The ordinal value of item is numbering.
If owner is an ol
element, and owner has a reversed
attribute, decrement numbering by 1;
otherwise, increment numbering by 1.
Increment i by 1.
Go to the step labeled loop.
The value
IDL
attribute must reflect the value of the value
content attribute.
The element's value
IDL attribute does not directly
correspond to its ordinal value; it simply reflects
the content attribute. For example, given this list:
<ol>
<li>Item 1
<li value="3">Item 3
<li>Item 4
</ol>
The ordinal values are 1, 3, and 4, whereas the value
IDL attributes return 0, 3, 0 on getting.
The following example, the top ten movies are listed (in reverse order). Note the way the list
is given a title by using a figure
element and its figcaption
element.
<figure>
<figcaption>The top 10 movies of all time</figcaption>
<ol>
<li value="10"><cite>Josie and the Pussycats</cite>, 2001</li>
<li value="9"><cite lang="sh">Црна мачка, бели мачор</cite>, 1998</li>
<li value="8"><cite>A Bug's Life</cite>, 1998</li>
<li value="7"><cite>Toy Story</cite>, 1995</li>
<li value="6"><cite>Monsters, Inc</cite>, 2001</li>
<li value="5"><cite>Cars</cite>, 2006</li>
<li value="4"><cite>Toy Story 2</cite>, 1999</li>
<li value="3"><cite>Finding Nemo</cite>, 2003</li>
<li value="2"><cite>The Incredibles</cite>, 2004</li>
<li value="1"><cite>Ratatouille</cite>, 2007</li>
</ol>
</figure>
The markup could also be written as follows, using the reversed
attribute on the ol
element:
<figure>
<figcaption>The top 10 movies of all time</figcaption>
<ol reversed>
<li><cite>Josie and the Pussycats</cite>, 2001</li>
<li><cite lang="sh">Црна мачка, бели мачор</cite>, 1998</li>
<li><cite>A Bug's Life</cite>, 1998</li>
<li><cite>Toy Story</cite>, 1995</li>
<li><cite>Monsters, Inc</cite>, 2001</li>
<li><cite>Cars</cite>, 2006</li>
<li><cite>Toy Story 2</cite>, 1999</li>
<li><cite>Finding Nemo</cite>, 2003</li>
<li><cite>The Incredibles</cite>, 2004</li>
<li><cite>Ratatouille</cite>, 2007</li>
</ol>
</figure>
While it is conforming to include heading elements (e.g. h1
) inside
li
elements, it likely does not convey the semantics that the author intended. A
heading starts a new section, so a heading in a list implicitly splits the list into spanning
multiple sections.
dl
elementdt
elements followed by one or more dd
elements, optionally intermixed with script-supporting elements.div
elements, optionally intermixed with script-supporting elements.[Exposed=Window]
interface HTMLDListElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLDListElement
.The dl
element represents an association list consisting of zero or
more name-value groups (a description list). A name-value group consists of one or more names
(dt
elements, possibly as children of a div
element child) followed by
one or more values (dd
elements, possibly as children of a div
element
child), ignoring any nodes other than dt
and dd
element children, and
dt
and dd
elements that are children of div
element
children. Within a single dl
element, there should not be more than one
dt
element for each name.
Name-value groups may be terms and definitions, metadata topics and values, questions and answers, or any other groups of name-value data.
The values within a group are alternatives; multiple paragraphs forming part of the same value
must all be given within the same dd
element.
The order of the list of groups, and of the names and values within each group, may be significant.
In order to annotate groups with microdata attributes, or other global
attributes that apply to whole groups, or just for styling purposes, each group in a
dl
element can be wrapped in a div
element. This does not change the
semantics of the dl
element.
The name-value groups of a dl
element dl are determined using the
following algorithm. A name-value group has a name (a list of dt
elements, initially
empty) and a value (a list of dd
elements, initially empty).
Let groups be an empty list of name-value groups.
Let current be a new name-value group.
Let seenDd be false.
Let child be dl's first child.
Let grandchild be null.
While child is not null:
If child is a div
element, then:
Let grandchild be child's first child.
While grandchild is not null:
Process dt
or dd
for
grandchild.
Set grandchild to grandchild's next sibling.
Otherwise, process dt
or dd
for
child.
Set child to child's next sibling.
If current is not empty, then append current to groups.
Return groups.
To process dt
or dd
for a node node means to
follow these steps:
Let groups, current, and seenDd be the same variables as those of the same name in the algorithm that invoked these steps.
If node is a dt
element, then:
If seenDd is true, then append current to groups, set current to a new name-value group, and set seenDd to false.
Append node to current's name.
Otherwise, if node is a dd
element, then append node to
current's value and set seenDd to true.
When a name-value group has an empty list as name or value, it is often due to
accidentally using dd
elements in the place of dt
elements and vice
versa. Conformance checkers can spot such mistakes and might be able to advise authors how to
correctly use the markup.
In the following example, one entry ("Authors") is linked to two values ("John" and "Luke").
<dl>
<dt> Authors
<dd> John
<dd> Luke
<dt> Editor
<dd> Frank
</dl>
In the following example, one definition is linked to two terms.
<dl>
<dt lang="en-US"> <dfn>color</dfn> </dt>
<dt lang="en-GB"> <dfn>colour</dfn> </dt>
<dd> A sensation which (in humans) derives from the ability of
the fine structure of the eye to distinguish three differently
filtered analyses of a view. </dd>
</dl>
The following example illustrates the use of the dl
element to mark up metadata
of sorts. At the end of the example, one group has two metadata labels ("Authors" and "Editors")
and two values ("Robert Rothman" and "Daniel Jackson"). This example also uses the
div
element around the groups of dt
and dd
element, to aid
with styling.
<dl>
<div>
<dt> Last modified time </dt>
<dd> 2004-12-23T23:33Z </dd>
</div>
<div>
<dt> Recommended update interval </dt>
<dd> 60s </dd>
</div>
<div>
<dt> Authors </dt>
<dt> Editors </dt>
<dd> Robert Rothman </dd>
<dd> Daniel Jackson </dd>
</div>
</dl>
The following example shows the dl
element used to give a set of instructions.
The order of the instructions here is important (in the other examples, the order of the blocks
was not important).
<p>Determine the victory points as follows (use the
first matching case):</p>
<dl>
<dt> If you have exactly five gold coins </dt>
<dd> You get five victory points </dd>
<dt> If you have one or more gold coins, and you have one or more silver coins </dt>
<dd> You get two victory points </dd>
<dt> If you have one or more silver coins </dt>
<dd> You get one victory point </dd>
<dt> Otherwise </dt>
<dd> You get no victory points </dd>
</dl>
The following snippet shows a dl
element being used as a glossary. Note the use
of dfn
to indicate the word being defined.
<dl>
<dt><dfn>Apartment</dfn>, n.</dt>
<dd>An execution context grouping one or more threads with one or
more COM objects.</dd>
<dt><dfn>Flat</dfn>, n.</dt>
<dd>A deflated tire.</dd>
<dt><dfn>Home</dfn>, n.</dt>
<dd>The user's login directory.</dd>
</dl>
This example uses microdata attributes in a dl
element, together
with the div
element, to annotate the ice cream desserts at a French restaurant.
<dl>
<div itemscope itemtype="http://schema.org/Product">
<dt itemprop="name">Café ou Chocolat Liégeois
<dd itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<span itemprop="price">3.50</span>
<data itemprop="priceCurrency" value="EUR">€</data>
<dd itemprop="description">
2 boules Café ou Chocolat, 1 boule Vanille, sauce café ou chocolat, chantilly
</div>
<div itemscope itemtype="http://schema.org/Product">
<dt itemprop="name">Américaine
<dd itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<span itemprop="price">3.50</span>
<data itemprop="priceCurrency" value="EUR">€</data>
<dd itemprop="description">
1 boule Crème brûlée, 1 boule Vanille, 1 boule Caramel, chantilly
</div>
</dl>
Without the div
element the markup would need to use the itemref
attribute to link the data in the dd
elements
with the item, as follows.
<dl>
<dt itemscope itemtype="http://schema.org/Product" itemref="1-offer 1-description">
<span itemprop="name">Café ou Chocolat Liégeois</span>
<dd id="1-offer" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<span itemprop="price">3.50</span>
<data itemprop="priceCurrency" value="EUR">€</data>
<dd id="1-description" itemprop="description">
2 boules Café ou Chocolat, 1 boule Vanille, sauce café ou chocolat, chantilly
<dt itemscope itemtype="http://schema.org/Product" itemref="2-offer 2-description">
<span itemprop="name">Américaine</span>
<dd id="2-offer" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<span itemprop="price">3.50</span>
<data itemprop="priceCurrency" value="EUR">€</data>
<dd id="2-description" itemprop="description">
1 boule Crème brûlée, 1 boule Vanille, 1 boule Caramel, chantilly
</dl>
The dl
element is inappropriate for marking up dialogue. See some examples of how to mark up dialogue.
dt
elementdd
or dt
elements inside dl
elements.dd
or dt
elements inside div
elements that are children of a dl
element.header
, footer
, sectioning content, or heading content descendants.HTMLElement
.The dt
element represents the term, or name, part of a
term-description group in a description list (dl
element).
The dt
element itself, when used in a dl
element, does
not indicate that its contents are a term being defined, but this can be indicated using the
dfn
element.
This example shows a list of frequently asked questions (a FAQ) marked up using the
dt
element for questions and the dd
element for answers.
<article>
<h1>FAQ</h1>
<dl>
<dt>What do we want?</dt>
<dd>Our data.</dd>
<dt>When do we want it?</dt>
<dd>Now.</dd>
<dt>Where is it?</dt>
<dd>We are not sure.</dd>
</dl>
</article>
dd
elementdt
or dd
elements inside dl
elements.dt
or dd
elements inside div
elements that are children of a dl
element.HTMLElement
.The dd
element represents the description, definition, or value, part
of a term-description group in a description list (dl
element).
A dl
can be used to define a vocabulary list, like in a dictionary. In the
following example, each entry, given by a dt
with a dfn
, has several
dd
s, showing the various parts of the definition.
<dl>
<dt><dfn>happiness</dfn></dt>
<dd class="pronunciation">/ˈhæpinəs/</dd>
<dd class="part-of-speech"><i><abbr>n.</abbr></i></dd>
<dd>The state of being happy.</dd>
<dd>Good fortune; success. <q>Oh <b>happiness</b>! It worked!</q></dd>
<dt><dfn>rejoice</dfn></dt>
<dd class="pronunciation">/rɪˈdʒɔɪs/</dd>
<dd><i class="part-of-speech"><abbr>v.intr.</abbr></i> To be delighted oneself.</dd>
<dd><i class="part-of-speech"><abbr>v.tr.</abbr></i> To cause one to be delighted.</dd>
</dl>
figure
elementfigcaption
element followed by flow content.figcaption
element.HTMLElement
.The figure
element represents some flow content,
optionally with a caption, that is self-contained (like a complete sentence) and is typically
referenced as a single unit from the main flow of the document.
"Self-contained" in this context does not necessarily mean independent. For
example, each sentence in a paragraph is self-contained; an image that is part of a sentence would
be inappropriate for figure
, but an entire sentence made of images would be
fitting.
The element can thus be used to annotate illustrations, diagrams, photos, code listings, etc.
When a figure
is referred to from the main content of the document by identifying
it by its caption (e.g., by figure number), it enables such content to be easily moved away from
that primary content, e.g., to the side of the page, to dedicated pages, or to an appendix,
without affecting the flow of the document.
If a figure
element is referenced by its relative position, e.g.,
"in the photograph above" or "as the next figure shows", then moving the figure would disrupt the
page's meaning. Authors are encouraged to consider using labels to refer to figures, rather than
using such relative references, so that the page can easily be restyled without affecting the
page's meaning.
The first figcaption
element child of the element, if any,
represents the caption of the figure
element's contents. If there is no child
figcaption
element, then there is no caption.
A figure
element's contents are part of the surrounding flow. If the purpose of
the page is to display the figure, for example a photograph on an image sharing site, the
figure
and figcaption
elements can be used to explicitly provide a
caption for that figure. For content that is only tangentially related, or that serves a separate
purpose than the surrounding flow, the aside
element should be used (and can itself
wrap a figure
). For example, a pull quote that repeats content from an
article
would be more appropriate in an aside
than in a
figure
, because it isn't part of the content, it's a repetition of the content for
the purposes of enticing readers or highlighting key topics.
This example shows the figure
element to mark up a code listing.
<p>In <a href="#l4">listing 4</a> we see the primary core interface
API declaration.</p>
<figure id="l4">
<figcaption>Listing 4. The primary core interface API declaration.</figcaption>
<pre><code>interface PrimaryCore {
boolean verifyDataLine();
undefined sendData(sequence<byte> data);
undefined initSelfDestruct();
}</code></pre>
</figure>
<p>The API is designed to use UTF-8.</p>
Here we see a figure
element to mark up a photo that is the main content of the
page (as in a gallery).
<!DOCTYPE HTML>
<html lang="en">
<title>Bubbles at work — My Gallery™</title>
<figure>
<img src="bubbles-work.jpeg"
alt="Bubbles, sitting in his office chair, works on his
latest project intently.">
<figcaption>Bubbles at work</figcaption>
</figure>
<nav><a href="19414.html">Prev</a> — <a href="19416.html">Next</a></nav>
In this example, we see an image that is not a figure, as well as an image and a
video that are. The first image is literally part of the example's second sentence, so it's not a
self-contained unit, and thus figure
would be inappropriate.
<h2>Malinko's comics</h2>
<p>This case centered on some sort of "intellectual property"
infringement related to a comic (see Exhibit A). The suit started
after a trailer ending with these words:
<blockquote>
<img src="promblem-packed-action.png" alt="ROUGH COPY! Promblem-Packed Action!">
</blockquote>
<p>...was aired. A lawyer, armed with a Bigger Notebook, launched a
preemptive strike using snowballs. A complete copy of the trailer is
included with Exhibit B.
<figure>
<img src="ex-a.png" alt="Two squiggles on a dirty piece of paper.">
<figcaption>Exhibit A. The alleged <cite>rough copy</cite> comic.</figcaption>
</figure>
<figure>
<video src="ex-b.mov"></video>
<figcaption>Exhibit B. The <cite>Rough Copy</cite> trailer.</figcaption>
</figure>
<p>The case was resolved out of court.
Here, a part of a poem is marked up using figure
.
<figure>
<p>'Twas brillig, and the slithy toves<br>
Did gyre and gimble in the wabe;<br>
All mimsy were the borogoves,<br>
And the mome raths outgrabe.</p>
<figcaption><cite>Jabberwocky</cite> (first verse). Lewis Carroll, 1832-98</figcaption>
</figure>
In this example, which could be part of a much larger work discussing a castle, nested
figure
elements are used to provide both a group caption and individual captions for
each figure in the group:
<figure>
<figcaption>The castle through the ages: 1423, 1858, and 1999 respectively.</figcaption>
<figure>
<figcaption>Etching. Anonymous, ca. 1423.</figcaption>
<img src="castle1423.jpeg" alt="The castle has one tower, and a tall wall around it.">
</figure>
<figure>
<figcaption>Oil-based paint on canvas. Maria Towle, 1858.</figcaption>
<img src="castle1858.jpeg" alt="The castle now has two towers and two walls.">
</figure>
<figure>
<figcaption>Film photograph. Peter Jankle, 1999.</figcaption>
<img src="castle1999.jpeg" alt="The castle lies in ruins, the original tower all that remains in one piece.">
</figure>
</figure>
The previous example could also be more succinctly written as follows (using title
attributes in place of the nested
figure
/figcaption
pairs):
<figure>
<img src="castle1423.jpeg" title="Etching. Anonymous, ca. 1423."
alt="The castle has one tower, and a tall wall around it.">
<img src="castle1858.jpeg" title="Oil-based paint on canvas. Maria Towle, 1858."
alt="The castle now has two towers and two walls.">
<img src="castle1999.jpeg" title="Film photograph. Peter Jankle, 1999."
alt="The castle lies in ruins, the original tower all that remains in one piece.">
<figcaption>The castle through the ages: 1423, 1858, and 1999 respectively.</figcaption>
</figure>
The figure is sometimes referenced only implicitly from the content:
<article>
<h1>Fiscal negotiations stumble in Congress as deadline nears</h1>
<figure>
<img src="obama-reid.jpeg" alt="Obama and Reid sit together smiling in the Oval Office.">
<figcaption>Barack Obama and Harry Reid. White House press photograph.</figcaption>
</figure>
<p>Negotiations in Congress to end the fiscal impasse sputtered on Tuesday, leaving both chambers
grasping for a way to reopen the government and raise the country's borrowing authority with a
Thursday deadline drawing near.</p>
...
</article>
figcaption
elementfigure
element.HTMLElement
.The figcaption
element represents a caption or legend for the rest of
the contents of the figcaption
element's parent figure
element, if any.
The element can contain additional information about the source:
<figcaption>
<p>A duck.</p>
<p><small>Photograph courtesy of 🌟 News.</small></p>
</figcaption>
<figcaption>
<p>Average rent for 3-room apartments, excluding non-profit apartments</p>
<p>Zürich’s Statistics Office — <time datetime=2017-11-14>14 November 2017</time></p>
</figcaption>
main
elementmain
element.HTMLElement
.The main
element represents the dominant contents of the
document.
A document must not have more than one main
element that does not have the hidden
attribute specified.
A hierarchically correct main
element is one whose ancestor elements
are limited to html
, body
, div
, form
without
an accessible name, and autonomous custom elements. Each main
element must be a
hierarchically correct main
element.
In this example, the author has used a presentation where each component of the page is
rendered in a box. To wrap the main content of the page (as opposed to the header, the footer,
the navigation bar, and a sidebar), the main
element is used.
<!DOCTYPE html>
<html lang="en">
<title>RPG System 17</title>
<style>
header, nav, aside, main, footer {
margin: 0.5em; border: thin solid; padding: 0.5em;
background: #EFF; color: black; box-shadow: 0 0 0.25em #033;
}
h1, h2, p { margin: 0; }
nav, main { float: left; }
aside { float: right; }
footer { clear: both; }
</style>
<header>
<h1>System Eighteen</h1>
</header>
<nav>
<a href="../16/">← System 17</a>
<a href="../18/">RPXIX →</a>
</nav>
<aside>
<p>This system has no HP mechanic, so there's no healing.
</aside>
<main>
<h2>Character creation</h2>
<p>Attributes (magic, strength, agility) are purchased at the cost of one point per level.</p>
<h2>Rolls</h2>
<p>Each encounter, roll the dice for all your skills. If you roll more than the opponent, you win.</p>
</main>
<footer>
<p>Copyright © 2013
</footer>
</html>
In the following example, multiple main
elements are used and script is used to
make navigation work without a server roundtrip and to set the hidden
attribute on those that are not current:
<!doctype html>
<html lang=en-CA>
<meta charset=utf-8>
<title> … </title>
<link rel=stylesheet href=spa.css>
<script src=spa.js async></script>
<nav>
<a href=/>Home</a>
<a href=/about>About</a>
<a href=/contact>Contact</a>
</nav>
<main>
<h1>Home</h1>
…
</main>
<main hidden>
<h1>About</h1>
…
</main>
<main hidden>
<h1>Contact</h1>
…
</main>
<footer>Made with ❤️ by <a href=https://example.com/>Example 👻</a>.</footer>
search
elementHTMLElement
.The search
element represents a part of a document or application
that contains a set of form controls or other content related to performing a search or filtering
operation. This could be a search of the web site or application; a way of searching or filtering
search results on the current web page; or a global or Internet-wide search function.
It's not appropriate to use the search
element just for presenting
search results, though suggestions and links as part of "quick search" results can be
included as part of a search feature. Rather, a returned web page of search results would instead
be expected to be presented as part of the main content of that web page.
In the following example, the author is including a search form within the
header
of the web page:
<header>
<h1><a href="/">My fancy blog</a></h1>
...
<search>
<form action="search.php">
<label for="query">Find an article</label>
<input id="query" name="q" type="search">
<button type="submit">Go!</button>
</form>
</search>
</header>
In this example, the author has implemented their web application's search functionality
entirely with JavaScript. There is no use of the form
element to perform
server-side submission, but the containing search
element semantically identifies
the purpose of the descendant content as representing search capabilities.
<search>
<label>
Find and filter your query
<input type="search" id="query">
</label>
<label>
<input type="checkbox" id="exact-only">
Exact matches only
</label>
<section>
<h3>Results found:</h3>
<ul id="results">
<li>
<p><a href="services/consulting">Consulting services</a></p>
<p>
Find out how can we help you improve your business with our integrated consultants, Bob and Bob.
</p>
</li>
...
</ul>
<!--
when a query returns or filters out all results
render the no results message here
-->
<output id="no-results"></output>
</section>
</search>
In the following example, the page has two search features. The first is located in the web page's
header
and serves as a global mechanism to search the web site's content. Its purpose is
indicated by its specified title
attribute. The second is included as part of the main content
of the page, as it represents a mechanism to search and filter the content of the current page. It contains
a heading to indicate its purpose.
<body>
<header>
...
<search title="Website">
...
</search>
</header>
<main>
<h1>Hotels near your location</h1>
<search>
<h2>Filter results</h2>
...
</search>
<article>
<!-- search result content -->
</article>
</main>
</body>
div
elementdl
element.dl
element: one or more dt
elements followed by one or more dd
elements, optionally intermixed with script-supporting elements.dl
element: flow content.[Exposed=Window]
interface HTMLDivElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLDivElement
.The div
element has no special meaning at all. It represents its
children. It can be used with the class
, lang
, and title
attributes to mark up
semantics common to a group of consecutive elements. It can also be used in a dl
element, wrapping groups of dt
and dd
elements.
Authors are strongly encouraged to view the div
element as an element
of last resort, for when no other element is suitable. Use of more appropriate elements instead of
the div
element leads to better accessibility for readers and easier maintainability
for authors.
For example, a blog post would be marked up using article
, a chapter using
section
, a page's navigation aids using nav
, and a group of form
controls using fieldset
.
On the other hand, div
elements can be useful for stylistic purposes or to wrap
multiple paragraphs within a section that are all to be annotated in a similar way. In the
following example, we see div
elements used as a way to set the language of two
paragraphs at once, instead of setting the language on the two paragraph elements separately:
<article lang="en-US">
<h1>My use of language and my cats</h1>
<p>My cat's behavior hasn't changed much since her absence, except
that she plays her new physique to the neighbors regularly, in an
attempt to get pets.</p>
<div lang="en-GB">
<p>My other cat, coloured black and white, is a sweetie. He followed
us to the pool today, walking down the pavement with us. Yesterday
he apparently visited our neighbours. I wonder if he recognises that
their flat is a mirror image of ours.</p>
<p>Hm, I just noticed that in the last paragraph I used British
English. But I'm supposed to write in American English. So I
shouldn't say "pavement" or "flat" or "colour"...</p>
</div>
<p>I should say "sidewalk" and "apartment" and "color"!</p>
</article>
a
elementhref
attribute: Interactive content.a
element descendant, or descendant with the tabindex
attribute specified.href
target
download
ping
rel
hreflang
type
referrerpolicy
href
attribute: for authors; for implementers.[Exposed=Window]
interface HTMLAnchorElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString target;
[CEReactions] attribute DOMString download;
[CEReactions] attribute USVString ping;
[CEReactions] attribute DOMString rel;
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[CEReactions] attribute DOMString hreflang;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString text;
[CEReactions] attribute DOMString referrerPolicy;
// also has obsolete members
};
HTMLAnchorElement includes HTMLHyperlinkElementUtils;
HTMLAnchorElement
.If the a
element has an href
attribute,
then it represents a hyperlink (a hypertext anchor) labeled by its
contents.
If the a
element has no href
attribute,
then the element represents a placeholder for where a link might otherwise have been
placed, if it had been relevant, consisting of just the element's contents.
The target
, download
, ping
,
rel
, hreflang
, type
,
and referrerpolicy
attributes must be omitted
if the href
attribute is not present.
If the itemprop
attribute is specified on an a
element,
then the href
attribute must also be specified.
If a site uses a consistent navigation toolbar on every page, then the link that would
normally link to the page itself could be marked up using an a
element:
<nav>
<ul>
<li> <a href="/">Home</a> </li>
<li> <a href="/news">News</a> </li>
<li> <a>Examples</a> </li>
<li> <a href="/legal">Legal</a> </li>
</ul>
</nav>
The href
, target
, download
, ping
,
and referrerpolicy
attributes affect what
happens when users follow hyperlinks or download hyperlinks created using the a
element. The rel
, hreflang
, and type
attributes may be used to indicate to the user the likely nature of the target resource before the
user follows the link.
a.text
Same as textContent
.
The IDL attributes download
, ping
, target
, rel
, hreflang
, and type
, must reflect the respective content attributes
of the same name.
The IDL attribute relList
must reflect the rel
content attribute.
The IDL attribute referrerPolicy
must reflect the referrerpolicy
content attribute, limited to
only known values.
The text
attribute's getter must return this element's descendant text content.
The text
attribute's setter must string replace
all with the given value within this element.
The a
element can be wrapped around entire paragraphs, lists, tables, and so
forth, even entire sections, so long as there is no interactive content within (e.g., buttons or
other links). This example shows how this can be used to make an entire advertising block into a
link:
<aside class="advertising">
<h1>Advertising</h1>
<a href="https://ad.example.com/?adid=1929&pubid=1422">
<section>
<h1>Mellblomatic 9000!</h1>
<p>Turn all your widgets into mellbloms!</p>
<p>Only $9.99 plus shipping and handling.</p>
</section>
</a>
<a href="https://ad.example.com/?adid=375&pubid=1422">
<section>
<h1>The Mellblom Browser</h1>
<p>Web browsing at the speed of light.</p>
<p>No other browser goes faster!</p>
</section>
</a>
</aside>
The following example shows how a bit of script can be used to effectively make an entire row in a job listing table a hyperlink:
<table>
<tr>
<th>Position
<th>Team
<th>Location
<tr>
<td><a href="/jobs/manager">Manager</a>
<td>Remotees
<td>Remote
<tr>
<td><a href="/jobs/director">Director</a>
<td>Remotees
<td>Remote
<tr>
<td><a href="/jobs/astronaut">Astronaut</a>
<td>Architecture
<td>Remote
</table>
<script>
document.querySelector("table").onclick = ({ target }) => {
if (target.parentElement.localName === "tr") {
const link = target.parentElement.querySelector("a");
if (link) {
link.click();
}
}
}
</script>
em
elementHTMLElement
.The em
element represents stress emphasis of its contents.
The level of stress that a particular piece of content has is given by its number of ancestor
em
elements.
The placement of stress emphasis changes the meaning of the sentence. The element thus forms an integral part of the content. The precise way in which stress is used in this way depends on the language.
These examples show how changing the stress emphasis changes the meaning. First, a general statement of fact, with no stress:
<p>Cats are cute animals.</p>
By emphasizing the first word, the statement implies that the kind of animal under discussion is in question (maybe someone is asserting that dogs are cute):
<p><em>Cats</em> are cute animals.</p>
Moving the stress to the verb, one highlights that the truth of the entire sentence is in question (maybe someone is saying cats are not cute):
<p>Cats <em>are</em> cute animals.</p>
By moving it to the adjective, the exact nature of the cats is reasserted (maybe someone suggested cats were mean animals):
<p>Cats are <em>cute</em> animals.</p>
Similarly, if someone asserted that cats were vegetables, someone correcting this might emphasize the last word:
<p>Cats are cute <em>animals</em>.</p>
By emphasizing the entire sentence, it becomes clear that the speaker is fighting hard to get the point across. This kind of stress emphasis also typically affects the punctuation, hence the exclamation mark here.
<p><em>Cats are cute animals!</em></p>
Anger mixed with emphasizing the cuteness could lead to markup such as:
<p><em>Cats are <em>cute</em> animals!</em></p>
The em
element isn't a generic "italics" element. Sometimes, text is intended to
stand out from the rest of the paragraph, as if it was in a different mood or voice. For this,
the i
element is more appropriate.
The em
element also isn't intended to convey importance; for that purpose, the
strong
element is more appropriate.
strong
elementHTMLElement
.The strong
element represents strong importance, seriousness, or
urgency for its contents.
Importance: the strong
element can be used in a heading, caption,
or paragraph to distinguish the part that really matters from other parts that might be more
detailed, more jovial, or merely boilerplate. (This is distinct from marking up subheadings, for
which the hgroup
element is appropriate.)
For example, the first word of the previous paragraph is marked up with
strong
to distinguish it from the more detailed text in the rest of the
paragraph.
Seriousness: the strong
element can be used to mark up a warning
or caution notice.
Urgency: the strong
element can be used to denote contents that
the user needs to see sooner than other parts of the document.
The relative level of importance of a piece of content is given by its number of ancestor
strong
elements; each strong
element increases the importance of its
contents.
Changing the importance of a piece of text with the strong
element does not change
the meaning of the sentence.
Here, the word "chapter" and the actual chapter number are mere boilerplate, and the actual
name of the chapter is marked up with strong
:
<h1>Chapter 1: <strong>The Praxis</strong></h1>
In the following example, the name of the diagram in the caption is marked up with
strong
, to distinguish it from boilerplate text (before) and the description
(after):
<figcaption>Figure 1. <strong>Ant colony dynamics</strong>. The ants in this colony are
affected by the heat source (upper left) and the food source (lower right).</figcaption>
In this example, the heading is really "Flowers, Bees, and Honey", but the author has added a
light-hearted addition to the heading. The strong
element is thus used to mark up
the first part to distinguish it from the latter part.
<h1><strong>Flowers, Bees, and Honey</strong> and other things I don't understand</h1>
Here is an example of a warning notice in a game, with the various parts marked up according to how important they are:
<p><strong>Warning.</strong> This dungeon is dangerous.
<strong>Avoid the ducks.</strong> Take any gold you find.
<strong><strong>Do not take any of the diamonds</strong>,
they are explosive and <strong>will destroy anything within
ten meters.</strong></strong> You have been warned.</p>
In this example, the strong
element is used to denote the part of the text that
the user is intended to read first.
<p>Welcome to Remy, the reminder system.</p>
<p>Your tasks for today:</p>
<ul>
<li><p><strong>Turn off the oven.</strong></p></li>
<li><p>Put out the trash.</p></li>
<li><p>Do the laundry.</p></li>
</ul>
small
elementHTMLElement
.The small
element represents side comments such as small print.
Small print typically features disclaimers, caveats, legal restrictions, or copyrights. Small print is also sometimes used for attribution, or for satisfying licensing requirements.
The small
element does not "de-emphasize" or lower the importance of
text emphasized by the em
element or marked as important with the strong
element. To mark text as not emphasized or important, simply do not mark it up with the
em
or strong
elements respectively.
The small
element should not be used for extended spans of text, such as multiple
paragraphs, lists, or sections of text. It is only intended for short runs of text. The text of a
page listing terms of use, for instance, would not be a suitable candidate for the
small
element: in such a case, the text is not a side comment, it is the main content
of the page.
The small
element must not be used for subheadings; for that purpose, use the
hgroup
element.
In this example, the small
element is used to indicate that value-added tax is
not included in a price of a hotel room:
<dl>
<dt>Single room
<dd>199 € <small>breakfast included, VAT not included</small>
<dt>Double room
<dd>239 € <small>breakfast included, VAT not included</small>
</dl>
In this second example, the small
element is used for a side comment in an
article.
<p>Example Corp today announced record profits for the
second quarter <small>(Full Disclosure: Foo News is a subsidiary of
Example Corp)</small>, leading to speculation about a third quarter
merger with Demo Group.</p>
This is distinct from a sidebar, which might be multiple paragraphs long and is removed from the main flow of text. In the following example, we see a sidebar from the same article. This sidebar also has small print, indicating the source of the information in the sidebar.
<aside>
<h1>Example Corp</h1>
<p>This company mostly creates small software and Web
sites.</p>
<p>The Example Corp company mission is "To provide entertainment
and news on a sample basis".</p>
<p><small>Information obtained from <a
href="https://example.com/about.html">example.com</a> home
page.</small></p>
</aside>
In this last example, the small
element is marked as being important
small print.
<p><strong><small>Continued use of this service will result in a kiss.</small></strong></p>
s
elementHTMLElement
.The s
element represents contents that are no longer accurate or no
longer relevant.
The s
element is not appropriate when indicating document edits; to
mark a span of text as having been removed from a document, use the del
element.
In this example a recommended retail price has been marked as no longer relevant as the product in question has a new sale price.
<p>Buy our Iced Tea and Lemonade!</p>
<p><s>Recommended retail price: $3.99 per bottle</s></p>
<p><strong>Now selling for just $2.99 a bottle!</strong></p>
cite
elementHTMLElement
.The cite
element represents the title of a work (e.g.
a book,
a paper,
an essay,
a poem,
a score,
a song,
a script,
a film,
a TV show,
a game,
a sculpture,
a painting,
a theatre production,
a play,
an opera,
a musical,
an exhibition,
a legal case report,
a computer program,
etc.). This can be a work that is being quoted or referenced in detail (i.e., a
citation), or it can just be a work that is mentioned in passing.
A person's name is not the title of a work — even if people call that person a piece of
work — and the element must therefore not be used to mark up people's names. (In some cases,
the b
element might be appropriate for names; e.g. in a gossip article where the
names of famous people are keywords rendered with a different style to draw attention to them. In
other cases, if an element is really needed, the span
element can be
used.)
This next example shows a typical use of the cite
element:
<p>My favorite book is <cite>The Reality Dysfunction</cite> by
Peter F. Hamilton. My favorite comic is <cite>Pearls Before
Swine</cite> by Stephan Pastis. My favorite track is <cite>Jive
Samba</cite> by the Cannonball Adderley Sextet.</p>
This is correct usage:
<p>According to the Wikipedia article <cite>HTML</cite>, as it
stood in mid-February 2008, leaving attribute values unquoted is
unsafe. This is obviously an over-simplification.</p>
The following, however, is incorrect usage, as the cite
element here is
containing far more than the title of the work:
<!-- do not copy this example, it is an example of bad usage! -->
<p>According to <cite>the Wikipedia article on HTML</cite>, as it
stood in mid-February 2008, leaving attribute values unquoted is
unsafe. This is obviously an over-simplification.</p>
The cite
element is a key part of any citation in a bibliography, but it is only
used to mark the title:
<p><cite>Universal Declaration of Human Rights</cite>, United Nations,
December 1948. Adopted by General Assembly resolution 217 A (III).</p>
A citation is not a quote (for which the q
element
is appropriate).
This is incorrect usage, because cite
is not for quotes:
<p><cite>This is wrong!</cite>, said Ian.</p>
This is also incorrect usage, because a person is not a work:
<p><q>This is still wrong!</q>, said <cite>Ian</cite>.</p>
The correct usage does not use a cite
element:
<p><q>This is correct</q>, said Ian.</p>
As mentioned above, the b
element might be relevant for marking names as being
keywords in certain kinds of documents:
<p>And then <b>Ian</b> said <q>this might be right, in a
gossip column, maybe!</q>.</p>
q
elementcite
HTMLQuoteElement
.The q
element represents some phrasing
content quoted from another source.
Quotation punctuation (such as quotation marks) that is quoting the contents of the element
must not appear immediately before, after, or inside q
elements; they will be
inserted into the rendering by the user agent.
Content inside a q
element must be quoted from another source, whose address, if
it has one, may be cited in the cite
attribute. The source may be fictional, as when quoting
characters in a novel or screenplay.
If the cite
attribute is present, it must be a valid
URL potentially surrounded by spaces. To obtain the corresponding citation
link, the value of the attribute must be parsed
relative to the element's node document. User agents may allow users to follow
such citation links, but they are primarily intended for private use (e.g., by server-side scripts
collecting statistics about a site's use of quotations), not for readers.
The q
element must not be used in place of quotation marks that do not represent
quotes; for example, it is inappropriate to use the q
element for marking up
sarcastic statements.
The use of q
elements to mark up quotations is entirely optional; using explicit
quotation punctuation without q
elements is just as correct.
Here is a simple example of the use of the q
element:
<p>The man said <q>Things that are impossible just take
longer</q>. I disagreed with him.</p>
Here is an example with both an explicit citation link in the q
element, and an
explicit citation outside:
<p>The W3C page <cite>About W3C</cite> says the W3C's
mission is <q cite="https://www.w3.org/Consortium/">To lead the
World Wide Web to its full potential by developing protocols and
guidelines that ensure long-term growth for the Web</q>. I
disagree with this mission.</p>
In the following example, the quotation itself contains a quotation:
<p>In <cite>Example One</cite>, he writes <q>The man
said <q>Things that are impossible just take longer</q>. I
disagreed with him</q>. Well, I disagree even more!</p>
In the following example, quotation marks are used instead of the q
element:
<p>His best argument was ❝I disagree❞, which
I thought was laughable.</p>
In the following example, there is no quote — the quotation marks are used to name a
word. Use of the q
element in this case would be inappropriate.
<p>The word "ineffable" could have been used to describe the disaster
resulting from the campaign's mismanagement.</p>
dfn
elementdfn
element descendants.title
attribute has special semantics on this element.HTMLElement
.The dfn
element represents the defining instance of a term. The paragraph, description list group, or section that is the nearest ancestor of the dfn
element must also contain the definition(s) for the term given
by the dfn
element.
Defining term: if the dfn
element has a title
attribute, then the exact value of that
attribute is the term being defined. Otherwise, if it contains exactly one element child node and
no child Text
nodes, and that child element is an abbr
element with a
title
attribute, then the exact value of that
attribute is the term being defined. Otherwise, it is the descendant text content of
the dfn
element that gives the term being defined.
If the title
attribute of the dfn
element is
present, then it must contain only the term being defined.
The title
attribute of ancestor elements does not
affect dfn
elements.
An a
element that links to a dfn
element represents an instance of
the term defined by the dfn
element.
In the following fragment, the term "Garage Door Opener" is first defined in the first paragraph, then used in the second. In both cases, its abbreviation is what is actually displayed.
<p>The <dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>
is a device that allows off-world teams to open the iris.</p>
<!-- ... later in the document: -->
<p>Teal'c activated his <abbr title="Garage Door Opener">GDO</abbr>
and so Hammond ordered the iris to be opened.</p>
With the addition of an a
element, the reference
can be made explicit:
<p>The <dfn id=gdo><abbr title="Garage Door Opener">GDO</abbr></dfn>
is a device that allows off-world teams to open the iris.</p>
<!-- ... later in the document: -->
<p>Teal'c activated his <a href=#gdo><abbr title="Garage Door Opener">GDO</abbr></a>
and so Hammond ordered the iris to be opened.</p>
abbr
elementtitle
attribute has special semantics on this element.HTMLElement
.The abbr
element represents an abbreviation or acronym, optionally
with its expansion. The title
attribute may be used to provide an expansion of the
abbreviation. The attribute, if specified, must contain an expansion of the abbreviation, and
nothing else.
The paragraph below contains an abbreviation marked up with the abbr
element.
This paragraph defines the term "Web Hypertext Application
Technology Working Group".
<p>The <dfn id=whatwg><abbr
title="Web Hypertext Application Technology Working Group">WHATWG</abbr></dfn>
is a loose unofficial collaboration of web browser manufacturers and
interested parties who wish to develop new technologies designed to
allow authors to write and deploy Applications over the World Wide
Web.</p>
An alternative way to write this would be:
<p>The <dfn id=whatwg>Web Hypertext Application Technology
Working Group</dfn> (<abbr
title="Web Hypertext Application Technology Working Group">WHATWG</abbr>)
is a loose unofficial collaboration of web browser manufacturers and
interested parties who wish to develop new technologies designed to
allow authors to write and deploy Applications over the World Wide
Web.</p>
This paragraph has two abbreviations. Notice how only one is defined; the other, with no
expansion associated with it, does not use the abbr
element.
<p>The
<abbr title="Web Hypertext Application Technology Working Group">WHATWG</abbr>
started working on HTML5 in 2004.</p>
This paragraph links an abbreviation to its definition.
<p>The <a href="#whatwg"><abbr
title="Web Hypertext Application Technology Working Group">WHATWG</abbr></a>
community does not have much representation from Asia.</p>
This paragraph marks up an abbreviation without giving an expansion, possibly as a hook to apply styles for abbreviations (e.g. smallcaps).
<p>Philip` and Dashiva both denied that they were going to
get the issue counts from past revisions of the specification to
backfill the <abbr>WHATWG</abbr> issue graph.</p>
If an abbreviation is pluralized, the expansion's grammatical number (plural vs singular) must match the grammatical number of the contents of the element.
Here the plural is outside the element, so the expansion is in the singular:
<p>Two <abbr title="Working Group">WG</abbr>s worked on
this specification: the <abbr>WHATWG</abbr> and the
<abbr>HTMLWG</abbr>.</p>
Here the plural is inside the element, so the expansion is in the plural:
<p>Two <abbr title="Working Groups">WGs</abbr> worked on
this specification: the <abbr>WHATWG</abbr> and the
<abbr>HTMLWG</abbr>.</p>
Abbreviations do not have to be marked up using this element. It is expected to be useful in the following cases:
abbr
element with a title
attribute is an
alternative to including the expansion inline (e.g. in parentheses).abbr
element with a title
attribute or include the expansion inline in the text the first
time the abbreviation is used.abbr
element
can be used without a title
attribute.Providing an expansion in a title
attribute once
will not necessarily cause other abbr
elements in the same document with the same
contents but without a title
attribute to behave as if they had
the same expansion. Every abbr
element is independent.
ruby
elementHTMLElement
.The ruby
element allows one or more spans of phrasing content to be marked with
ruby annotations. Ruby annotations are short runs of text presented alongside base text, primarily
used in East Asian typography as a guide for pronunciation or to include other annotations. In
Japanese, this form of typography is also known as furigana.
The content model of ruby
elements consists of one or more of the following
sequences:
One or the other of the following:
Phrasing content, but with no ruby
elements and with no
ruby
element descendants
A single ruby
element that itself has no ruby
element
descendants
One or the other of the following:
One or more rt
elements
An rp
element followed by one or more rt
elements, each of
which is itself followed by an rp
element
The ruby
and rt
elements can be used for a variety of kinds of
annotations, including in particular (though by no means limited to) those described below. For
more details on Japanese Ruby in particular, and how to render Ruby for Japanese, see
Requirements for Japanese Text Layout. JLREQ
At the time of writing, CSS does not yet provide a way to fully control the
rendering of the HTML ruby
element. It is hoped that CSS will be extended to support
the styles described below in due course.
One or more hiragana or katakana characters (the ruby annotation) are placed with each ideographic character (the base text). This is used to provide readings of kanji characters.
<ruby>B<rt>annotation</ruby>
In this example, notice how each annotation corresponds to a single base character.
<ruby>君<rt>くん</ruby><ruby>子<rt>し</ruby>は<ruby>和<rt>わ</ruby>して<ruby>同<rt>どう</ruby>ぜず。
君子は和して同ぜず。
This example can also be written as follows, using one ruby
element with two
segments of base text and two annotations (one for each) rather than two back-to-back
ruby
elements each with one base text segment and annotation (as in the markup
above):
<ruby>君<rt>くん</rt>子<rt>し</ruby>は<ruby>和<rt>わ</ruby>して<ruby>同<rt>どう</ruby>ぜず。
This is similar to the previous case: each ideographic character in the compound word (the base text) has its reading given in hiragana or katakana characters (the ruby annotation). The difference is that the base text segments form a compound word rather than being separate from each other.
<ruby>B<rt>annotation</rt>B<rt>annotation</ruby>
In this example, notice again how each annotation corresponds to a single base character. In this example, each compound word (jukugo) corresponds to a single ruby
element.
The rendering here is expected to be that each annotation be placed over (or next to, in vertical text) the corresponding base character, with the annotations not overhanging any of the adjacent characters.
<ruby>鬼<rt>き</rt>門<rt>もん</rt></ruby>の<ruby>方<rt>ほう</rt>角<rt>がく</rt></ruby>を<ruby>凝<rt>ぎょう</rt>視<rt>し</rt></ruby>する
鬼門の方角を凝視する
This is semantically identical to the previous case (each individual ideographic character in the base compound word has its reading given in an annotation in hiragana or katakana characters), but the rendering is the more complicated Jukugo Ruby rendering.
This is the same example as above for mono-ruby for compound words. The different rendering is expected to be achieved using different styling (e.g. in CSS), and is not shown here.
<ruby>鬼<rt>き</rt>門<rt>もん</rt></ruby>の<ruby>方<rt>ほう</rt>角<rt>がく</rt></ruby>を<ruby>凝<rt>ぎょう</rt>視<rt>し</rt></ruby>する
For more details on Jukugo Ruby rendering, see Appendix F in the Requirements for Japanese Text Layout. JLREQ
The annotation describes the meaning of the base text, rather than (or in addition to) the pronunciation. As such, both the base text and the annotation can be multiple characters long.
<ruby>BASE<rt>annotation</ruby>
Here a compound ideographic word has its corresponding katakana given as an annotation.
<ruby>境界面<rt>インターフェース</ruby>
境界面
Here a compound ideographic word has its translation in English provided as an annotation.
<ruby lang="ja">編集者<rt lang="en">editor</ruby>
編集者
A phonetic reading that corresponds to multiple base characters, because a one-to-one mapping would be difficult. (In English, the words "Colonel" and "Lieutenant" are examples of words where a direct mapping of pronunciation to individual letters is, in some dialects, rather unclear.)
In this example, the name of a species of flowers has a phonetic reading provided using group ruby:
<ruby>紫陽花<rt>あじさい</ruby>
紫陽花
Sometimes, ruby styles described above are combined.
If this results in two annotations covering the same single base segment, then the annotations can just be placed back to back.
<ruby>BASE<rt>annotation 1<rt>annotation 2</ruby>
<ruby>B<rt>a<rt>a</ruby><ruby>A<rt>a<rt>a</ruby><ruby>S<rt>a<rt>a</ruby><ruby>E<rt>a<rt>a</ruby>
In this contrived example, some symbols are given names in English and French.
<ruby>
♥ <rt> Heart <rt lang=fr> Cœur </rt>
☘ <rt> Shamrock <rt lang=fr> Trèfle </rt>
✶ <rt> Star <rt lang=fr> Étoile </rt>
</ruby>
In more complicated situations such as the following examples, a nested ruby
element is used to give the inner annotations, and then that whole ruby
is then
given an annotation at the "outer" level.
<ruby><ruby>B<rt>a</rt>A<rt>n</rt>S<rt>t</rt>E<rt>n</rt></ruby><rt>annotation</ruby>
Here both a phonetic reading and the meaning are given in ruby annotations. The annotation on the nested ruby
element gives a mono-ruby phonetic annotation for each base character, while the annotation in the rt
element that is a child of the outer ruby
element gives the meaning using hiragana.
<ruby><ruby>東<rt>とう</rt>南<rt>なん</rt></ruby><rt>たつみ</rt></ruby>の方角
東南の方角
This is the same example, but the meaning is given in English instead of Japanese:
<ruby><ruby>東<rt>とう</rt>南<rt>なん</rt></ruby><rt lang=en>Southeast</rt></ruby>の方角
東南の方角
Within a ruby
element that does not have a ruby
element ancestor,
content is segmented and segments are placed into three categories: base text segments, annotation
segments, and ignored segments. Ignored segments do not form part of the document's semantics
(they consist of some inter-element whitespace and rp
elements, the
latter of which are used for legacy user agents that do not support ruby at all). Base text
segments can overlap (with a limit of two segments overlapping any one position in the DOM, and
with any segment having an earlier start point than an overlapping segment also having an equal or
later end point, and any segment have a later end point than an overlapping segment also having an
equal or earlier start point). Annotation segments correspond to rt
elements. Each annotation
segment can be associated with a base text segment, and each base text segment can have annotation
segments associated with it. (In a conforming document, each base text segment is associated with
at least one annotation segment, and each annotation segment is associated with one base text
segment.) A ruby
element represents the union of the segments of base
text it contains, along with the mapping from those base text segments to annotation segments.
Segments are described in terms of DOM ranges; annotation segment ranges always
consist of exactly one element. DOM
At any particular time, the segmentation and categorization of content of a ruby
element is the result that would be obtained from running the following algorithm:
Let base text segments be an empty list of base text segments, each potentially with a list of base text subsegments.
Let annotation segments be an empty list of annotation segments, each potentially being associated with a base text segment or subsegment.
Let root be the ruby
element for which the algorithm is
being run.
If root has a ruby
element ancestor, then jump to the
step labeled end.
Let current parent be root.
Let index be 0.
Let start index be null.
Let parent start index be null.
Let current base text be null.
Start mode: If index is greater than or equal to the number of child nodes in current parent, then jump to the step labeled end mode.
If the indexth node in current parent is an
rt
or rp
element, jump to the step labeled annotation
mode.
Set start index to the value of index.
Base mode: If the indexth node in current
parent is a ruby
element, and if current parent is the
same element as root, then push a ruby level and then jump to
the step labeled start mode.
If the indexth node in current parent is an
rt
or rp
element, then set the current base text and then
jump to the step labeled annotation mode.
Increment index by one.
Base mode post-increment: If index is greater than or equal to the number of child nodes in current parent, then jump to the step labeled end mode.
Jump back to the step labeled base mode.
Annotation mode: If the indexth node in current
parent is an rt
element, then push a ruby annotation and jump to
the step labeled annotation mode increment.
If the indexth node in current parent is an
rp
element, jump to the step labeled annotation mode increment.
If the indexth node in current parent is not a
Text
node, or is a Text
node that is not inter-element
whitespace, then jump to the step labeled base mode.
Annotation mode increment: Let lookahead index be index plus one.
Annotation mode white-space skipper: If lookahead index is equal to the number of child nodes in current parent then jump to the step labeled end mode.
If the lookahead indexth node in current parent is
an rt
element or an rp
element, then set index to
lookahead index and jump to the step labeled annotation mode.
If the lookahead indexth node in current parent is
not a Text
node, or is a Text
node that is not inter-element
whitespace, then jump to the step labeled base mode (without further incrementing
index, so the inter-element whitespace seen so far becomes part
of the next base text segment).
Increment lookahead index by one.
Jump to the step labeled annotation mode white-space skipper.
End mode: If current parent is not the same element as root, then pop a ruby level and jump to the step labeled base mode post-increment.
End: Return base text segments and annotation
segments. Any content of the ruby
element not described by segments in either
of those lists is implicitly in an ignored segment.
When the steps above say to set the current base text, it means to run the following steps at that point in the algorithm:
Let text range be a DOM range whose start is the boundary point (current parent, start index) and whose end is the boundary point (current parent, index).
Let new text segment be a base text segment described by the range annotation range.
Add new text segment to base text segments.
Let current base text be new text segment.
Let start index be null.
When the steps above say to push a ruby level, it means to run the following steps at that point in the algorithm:
Let current parent be the indexth node in current parent.
Let index be 0.
Set saved start index to the value of start index.
Let start index be null.
When the steps above say to pop a ruby level, it means to run the following steps at that point in the algorithm:
Let index be the position of current parent in root.
Let current parent be root.
Increment index by one.
Set start index to the value of saved start index.
Let saved start index be null.
When the steps above say to push a ruby annotation, it means to run the following steps at that point in the algorithm:
Let rt be the rt
element that is the indexth node of current parent.
Let annotation range be a DOM range whose start is the boundary point (current parent, index) and whose end is the boundary point (current parent, index plus one) (i.e. that contains only rt).
Let new annotation segment be an annotation segment described by the range annotation range.
If current base text is not null, associate new annotation segment with current base text.
Add new annotation segment to annotation segments.
In this example, each ideograph in the Japanese text 漢字 is annotated with its reading in hiragana.
...
<ruby>漢<rt>かん</rt>字<rt>じ</rt></ruby>
...
This might be rendered as:
In this example, each ideograph in the traditional Chinese text 漢字 is annotated with its bopomofo reading.
<ruby>漢<rt>ㄏㄢˋ</rt>字<rt>ㄗˋ</rt></ruby>
This might be rendered as:
In this example, each ideograph in the simplified Chinese text 汉字 is annotated with its pinyin reading.
...<ruby>汉<rt>hàn</rt>字<rt>zì</rt></ruby>...
This might be rendered as:
In this more contrived example, the acronym "HTML" has four annotations: one for the whole acronym, briefly describing what it is, one for the letters "HT" expanding them to "Hypertext", one for the letter "M" expanding it to "Markup", and one for the letter "L" expanding it to "Language".
<ruby>
<ruby>HT<rt>Hypertext</rt>M<rt>Markup</rt>L<rt>Language</rt></ruby>
<rt>An abstract language for describing documents and applications
</ruby>
rt
elementruby
element.HTMLElement
.The rt
element marks the ruby text component of a ruby annotation. When it is the
child of a ruby
element, it doesn't represent
anything itself, but the ruby
element uses it as part of determining what it
represents.
An rt
element that is not a child of a ruby
element
represents the same thing as its children.
rp
elementruby
element, either immediately before or immediately after an rt
element.HTMLElement
.The rp
element can be used to provide parentheses or other content around a ruby
text component of a ruby annotation, to be shown by user agents that don't support ruby
annotations.
An rp
element that is a child of a ruby
element represents nothing. An rp
element
whose parent element is not a ruby
element represents its
children.
The example above, in which each ideograph in the text 漢字 is annotated with its phonetic reading, could be expanded to
use rp
so that in legacy user agents the readings are in parentheses:
...
<ruby>漢<rp>(</rp><rt>かん</rt><rp>)</rp>字<rp>(</rp><rt>じ</rt><rp>)</rp></ruby>
...
In conforming user agents the rendering would be as above, but in user agents that do not support ruby, the rendering would be:
... 漢(かん)字(じ)...
When there are multiple annotations for a segment, rp
elements can also be placed
between the annotations. Here is another copy of an earlier contrived example showing some
symbols with names given in English and French, but this time with rp
elements as
well:
<ruby>
♥<rp>: </rp><rt>Heart</rt><rp>, </rp><rt lang=fr>Cœur</rt><rp>.</rp>
☘<rp>: </rp><rt>Shamrock</rt><rp>, </rp><rt lang=fr>Trèfle</rt><rp>.</rp>
✶<rp>: </rp><rt>Star</rt><rp>, </rp><rt lang=fr>Étoile</rt><rp>.</rp>
</ruby>
This would make the example render as follows in non-ruby-capable user agents:
♥: Heart, Cœur. ☘: Shamrock, Trèfle. ✶: Star, Étoile.
data
elementvalue
[Exposed=Window]
interface HTMLDataElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString value;
};
HTMLDataElement
.The data
element represents its contents, along with a
machine-readable form of those contents in the value
attribute.
The value
attribute
must be present. Its value must be a representation of the element's contents in a
machine-readable format.
When the value is date- or time-related, the more specific time
element can be used instead.
The element can be used for several purposes.
When combined with microformats or the microdata attributes defined in
this specification, the element serves to provide both a machine-readable value for the purposes
of data processors, and a human-readable value for the purposes of rendering in a web browser. In
this case, the format to be used in the value
attribute is
determined by the microformats or microdata vocabulary in use.
The element can also, however, be used in conjunction with scripts in the page, for when a
script has a literal value to store alongside a human-readable value. In such cases, the format to
be used depends only on the needs of the script. (The data-*
attributes can also be useful in such situations.)
The value
IDL
attribute must reflect the content attribute of the same name.
Here, a short table has its numeric values encoded using the data
element so
that the table sorting JavaScript library can provide a sorting mechanism on each column
despite the numbers being presented in textual form in one column and in a decomposed form in
another.
<script src="sortable.js"></script>
<table class="sortable">
<thead> <tr> <th> Game <th> Corporations <th> Map Size
<tbody>
<tr> <td> 1830 <td> <data value="8">Eight</data> <td> <data value="93">19+74 hexes (93 total)</data>
<tr> <td> 1856 <td> <data value="11">Eleven</data> <td> <data value="99">12+87 hexes (99 total)</data>
<tr> <td> 1870 <td> <data value="10">Ten</data> <td> <data value="149">4+145 hexes (149 total)</data>
</table>
time
elementdatetime
attribute: Phrasing content.datetime
[Exposed=Window]
interface HTMLTimeElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString dateTime;
};
HTMLTimeElement
.The time
element represents its contents, along with a
machine-readable form of those contents in the datetime
attribute. The kind of content is limited to various kinds of dates, times, time-zone offsets, and
durations, as described below.
The datetime
attribute may be present. If present, its value must be a representation of the element's contents
in a machine-readable format.
A time
element that does not have a datetime
content attribute must not have any element
descendants.
The datetime value of a time
element is the value of the element's
datetime
content attribute, if it has one, otherwise the
child text content of the time
element.
The datetime value of a time
element must match one of the following
syntaxes.
<time>2011-11</time>
<time>2011-11-18</time>
<time>11-18</time>
<time>14:54</time>
<time>14:54:39</time>
<time>14:54:39.929</time>
<time>2011-11-18T14:54</time>
<time>2011-11-18T14:54:39</time>
<time>2011-11-18T14:54:39.929</time>
<time>2011-11-18 14:54</time>
<time>2011-11-18 14:54:39</time>
<time>2011-11-18 14:54:39.929</time>
Times with dates but without a time zone offset are useful for specifying events that are observed at the same specific time in each time zone, throughout a day. For example, the 2020 new year is celebrated at 2020-01-01 00:00 in each time zone, not at the same precise moment across all time zones. For events that occur at the same time across all time zones, for example a videoconference meeting, a valid global date and time string is likely more useful.
<time>Z</time>
<time>+0000</time>
<time>+00:00</time>
<time>-0800</time>
<time>-08:00</time>
For times without dates (or times referring to events that recur on multiple dates), specifying the geographic location that controls the time is usually more useful than specifying a time zone offset, because geographic locations change time zone offsets with daylight saving time. In some cases, geographic locations even change time zone, e.g. when the boundaries of those time zones are redrawn, as happened with Samoa at the end of 2011. There exists a time zone database that describes the boundaries of time zones and what rules apply within each such zone, known as the time zone database. TZDATABASE
<time>2011-11-18T14:54Z</time>
<time>2011-11-18T14:54:39Z</time>
<time>2011-11-18T14:54:39.929Z</time>
<time>2011-11-18T14:54+0000</time>
<time>2011-11-18T14:54:39+0000</time>
<time>2011-11-18T14:54:39.929+0000</time>
<time>2011-11-18T14:54+00:00</time>
<time>2011-11-18T14:54:39+00:00</time>
<time>2011-11-18T14:54:39.929+00:00</time>
<time>2011-11-18T06:54-0800</time>
<time>2011-11-18T06:54:39-0800</time>
<time>2011-11-18T06:54:39.929-0800</time>
<time>2011-11-18T06:54-08:00</time>
<time>2011-11-18T06:54:39-08:00</time>
<time>2011-11-18T06:54:39.929-08:00</time>
<time>2011-11-18 14:54Z</time>
<time>2011-11-18 14:54:39Z</time>
<time>2011-11-18 14:54:39.929Z</time>
<time>2011-11-18 14:54+0000</time>
<time>2011-11-18 14:54:39+0000</time>
<time>2011-11-18 14:54:39.929+0000</time>
<time>2011-11-18 14:54+00:00</time>
<time>2011-11-18 14:54:39+00:00</time>
<time>2011-11-18 14:54:39.929+00:00</time>
<time>2011-11-18 06:54-0800</time>
<time>2011-11-18 06:54:39-0800</time>
<time>2011-11-18 06:54:39.929-0800</time>
<time>2011-11-18 06:54-08:00</time>
<time>2011-11-18 06:54:39-08:00</time>
<time>2011-11-18 06:54:39.929-08:00</time>
Times with dates and a time zone offset are useful for specifying specific events, or recurring virtual events where the time is not anchored to a specific geographic location. For example, the precise time of an asteroid impact, or a particular meeting in a series of meetings held at 1400 UTC every day, regardless of whether any particular part of the world is observing daylight saving time or not. For events where the precise time varies by the local time zone offset of a specific geographic location, a valid local date and time string combined with that geographic location is likely more useful.
<time>2011-W47</time>
<time>2011</time>
<time>0001</time>
<time>PT4H18M3S</time>
<time>4h 18m 3s</time>
The machine-readable equivalent of the element's contents must be obtained from the element's datetime value by using the following algorithm:
If parsing a month string from the element's datetime value returns a month, that is the machine-readable equivalent; return.
If parsing a date string from the element's datetime value returns a date, that is the machine-readable equivalent; return.
If parsing a yearless date string from the element's datetime value returns a yearless date, that is the machine-readable equivalent; return.
If parsing a time string from the element's datetime value returns a time, that is the machine-readable equivalent; return.
If parsing a local date and time string from the element's datetime value returns a local date and time, that is the machine-readable equivalent; return.
If parsing a time-zone offset string from the element's datetime value returns a time-zone offset, that is the machine-readable equivalent; return.
If parsing a global date and time string from the element's datetime value returns a global date and time, that is the machine-readable equivalent; return.
If parsing a week string from the element's datetime value returns a week, that is the machine-readable equivalent; return.
If the element's datetime value consists of only ASCII digits, at least one of which is not U+0030 DIGIT ZERO (0), then the machine-readable equivalent is the base-ten interpretation of those digits, representing a year; return.
If parsing a duration string from the element's datetime value returns a duration, that is the machine-readable equivalent; return.
There is no machine-readable equivalent.
The algorithms referenced above are intended to be designed such that for any arbitrary string s, only one of the algorithms returns a value. A more efficient approach might be to create a single algorithm that parses all these data types in one pass; developing such an algorithm is left as an exercise to the reader.
The dateTime
IDL attribute must reflect the element's datetime
content attribute.
The time
element can be used to encode dates, for example in microformats. The
following shows a hypothetical way of encoding an event using a variant on hCalendar that uses
the time
element:
<div class="vevent">
<a class="url" href="http://www.web2con.com/">http://www.web2con.com/</a>
<span class="summary">Web 2.0 Conference</span>:
<time class="dtstart" datetime="2005-10-05">October 5</time> -
<time class="dtend" datetime="2005-10-07">7</time>,
at the <span class="location">Argent Hotel, San Francisco, CA</span>
</div>
Here, a fictional microdata vocabulary based on the Atom vocabulary is used with the
time
element to mark up a blog post's publication date.
<article itemscope itemtype="https://n.example.org/rfc4287">
<h1 itemprop="title">Big tasks</h1>
<footer>Published <time itemprop="published" datetime="2009-08-29">two days ago</time>.</footer>
<p itemprop="content">Today, I went out and bought a bike for my kid.</p>
</article>
In this example, another article's publication date is marked up using time
, this
time using the schema.org microdata vocabulary:
<article itemscope itemtype="http://schema.org/BlogPosting">
<h1 itemprop="headline">Small tasks</h1>
<footer>Published <time itemprop="datePublished" datetime="2009-08-30">yesterday</time>.</footer>
<p itemprop="articleBody">I put a bike bell on her bike.</p>
</article>
In the following snippet, the time
element is used to encode a date in the
ISO8601 format, for later processing by a script:
<p>Our first date was <time datetime="2006-09-23">a Saturday</time>.</p>
In this second snippet, the value includes a time:
<p>We stopped talking at <time datetime="2006-09-24T05:00-07:00">5am the next morning</time>.</p>
A script loaded by the page (and thus privy to the page's internal convention of marking up
dates and times using the time
element) could scan through the page and look at all
the time
elements therein to create an index of dates and times.
For example, this element conveys the string "Friday" with the additional semantic that the 18th of November 2011 is the meaning that corresponds to "Friday":
Today is <time datetime="2011-11-18">Friday</time>.
In this example, a specific time in the Pacific Standard Time timezone is specified:
Your next meeting is at <time datetime="2011-11-18T15:00-08:00">3pm</time>.
code
elementHTMLElement
.The code
element represents a fragment of computer code. This could
be an XML element name, a filename, a computer program, or any other string that a computer would
recognize.
There is no formal way to indicate the language of computer code being marked up. Authors who
wish to mark code
elements with the language used, e.g. so that syntax highlighting
scripts can use the right rules, can use the class
attribute, e.g.
by adding a class prefixed with "language-
" to the element.
The following example shows how the element can be used in a paragraph to mark up element names and computer code, including punctuation.
<p>The <code>code</code> element represents a fragment of computer
code.</p>
<p>When you call the <code>activate()</code> method on the
<code>robotSnowman</code> object, the eyes glow.</p>
<p>The example below uses the <code>begin</code> keyword to indicate
the start of a statement block. It is paired with an <code>end</code>
keyword, which is followed by the <code>.</code> punctuation character
(full stop) to indicate the end of the program.</p>
The following example shows how a block of code could be marked up using the pre
and code
elements.
<pre><code class="language-pascal">var i: Integer;
begin
i := 1;
end.</code></pre>
A class is used in that example to indicate the language used.
See the pre
element for more details.
var
elementHTMLElement
.The var
element represents a variable. This could be an actual
variable in a mathematical expression or programming context, an identifier representing a
constant, a symbol identifying a physical quantity, a function parameter, or just be a term used
as a placeholder in prose.
In the paragraph below, the letter "n" is being used as a variable in prose:
<p>If there are <var>n</var> pipes leading to the ice
cream factory then I expect at <em>least</em> <var>n</var>
flavors of ice cream to be available for purchase!</p>
For mathematics, in particular for anything beyond the simplest of expressions, MathML is more
appropriate. However, the var
element can still be used to refer to specific
variables that are then mentioned in MathML expressions.
In this example, an equation is shown, with a legend that references the variables in the
equation. The expression itself is marked up with MathML, but the variables are mentioned in the
figure's legend using var
.
<figure>
<math>
<mi>a</mi>
<mo>=</mo>
<msqrt>
<msup><mi>b</mi><mn>2</mn></msup>
<mi>+</mi>
<msup><mi>c</mi><mn>2</mn></msup>
</msqrt>
</math>
<figcaption>
Using Pythagoras' theorem to solve for the hypotenuse <var>a</var> of
a triangle with sides <var>b</var> and <var>c</var>
</figcaption>
</figure>
Here, the equation describing mass-energy equivalence is used in a sentence, and the
var
element is used to mark the variables and constants in that equation:
<p>Then she turned to the blackboard and picked up the chalk. After a few moment's
thought, she wrote <var>E</var> = <var>m</var> <var>c</var><sup>2</sup>. The teacher
looked pleased.</p>
samp
elementHTMLElement
.The samp
element represents sample or quoted output from another
program or computing system.
See the pre
and kbd
elements for more details.
This element can be contrasted with the output
element, which can be
used to provide immediate output in a web application.
This example shows the samp
element being used
inline:
<p>The computer said <samp>Too much cheese in tray
two</samp> but I didn't know what that meant.</p>
This second example shows a block of sample output from a console program. Nested
samp
and kbd
elements allow for the styling of specific elements
of the sample output using a style sheet. There's also a few parts of the samp
that
are annotated with even more detailed markup, to enable very precise styling. To achieve this,
span
elements are used.
<pre><samp><span class="prompt">jdoe@mowmow:~$</span> <kbd>ssh demo.example.com</kbd>
Last login: Tue Apr 12 09:10:17 2005 from mowmow.example.com on pts/1
Linux demo 2.6.10-grsec+gg3+e+fhs6b+nfs+gr0501+++p3+c4a+gr2b-reslog-v6.189 #1 SMP Tue Feb 1 11:22:36 PST 2005 i686 unknown
<span class="prompt">jdoe@demo:~$</span> <span class="cursor">_</span></samp></pre>
This third example shows a block of input and its respective output. The example uses
both code
and samp
elements.
<pre>
<code class="language-javascript">console.log(2.3 + 2.4)</code>
<samp>4.699999999999999</samp>
</pre>
kbd
elementHTMLElement
.The kbd
element represents user input (typically keyboard input,
although it may also be used to represent other input, such as voice commands).
When the kbd
element is nested inside a samp
element, it represents
the input as it was echoed by the system.
When the kbd
element contains a samp
element, it represents
input based on system output, for example invoking a menu item.
When the kbd
element is nested inside another kbd
element, it
represents an actual key or other single unit of input as appropriate for the input mechanism.
Here the kbd
element is used to indicate keys to press:
<p>To make George eat an apple, press <kbd><kbd>Shift</kbd> + <kbd>F3</kbd></kbd></p>
In this second example, the user is told to pick a particular menu item. The outer
kbd
element marks up a block of input, with the inner kbd
elements
representing each individual step of the input, and the samp
elements inside them
indicating that the steps are input based on something being displayed by the system, in this
case menu labels:
<p>To make George eat an apple, select
<kbd><kbd><samp>File</samp></kbd>|<kbd><samp>Eat Apple...</samp></kbd></kbd>
</p>
Such precision isn't necessary; the following is equally fine:
<p>To make George eat an apple, select <kbd>File | Eat Apple...</kbd></p>
sub
and sup
elementssub
element: for authors; for implementers.sup
element: for authors; for implementers.HTMLElement
.The sup
element represents a superscript and the sub
element represents a subscript.
These elements must be used only to mark up typographical conventions with specific meanings,
not for typographical presentation for presentation's sake. For example, it would be inappropriate
for the sub
and sup
elements to be used in the name of the LaTeX
document preparation system. In general, authors should use these elements only if the
absence of those elements would change the meaning of the content.
In certain languages, superscripts are part of the typographical conventions for some abbreviations.
<p>Their names are
<span lang="fr"><abbr>M<sup>lle</sup></abbr> Gwendoline</span> and
<span lang="fr"><abbr>M<sup>me</sup></abbr> Denise</span>.</p>
The sub
element can be used inside a var
element, for variables that
have subscripts.
Here, the sub
element is used to represent the subscript that identifies the
variable in a family of variables:
<p>The coordinate of the <var>i</var>th point is
(<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>).
For example, the 10th point has coordinate
(<var>x<sub>10</sub></var>, <var>y<sub>10</sub></var>).</p>
Mathematical expressions often use subscripts and superscripts. Authors are encouraged to use
MathML for marking up mathematics, but authors may opt to use sub
and
sup
if detailed mathematical markup is not desired. MATHML
<var>E</var>=<var>m</var><var>c</var><sup>2</sup>
f(<var>x</var>, <var>n</var>) = log<sub>4</sub><var>x</var><sup><var>n</var></sup>
i
elementHTMLElement
.The i
element represents a span of text in an alternate voice or
mood, or otherwise offset from the normal prose in a manner indicating a different quality of
text, such as a taxonomic designation, a technical term, an idiomatic phrase from another
language, transliteration, a thought, or a ship name in Western texts.
Terms in languages different from the main text should be annotated with lang
attributes (or, in XML, lang
attributes in the XML namespace).
The examples below show uses of the i
element:
<p>The <i class="taxonomy">Felis silvestris catus</i> is cute.</p>
<p>The term <i>prose content</i> is defined above.</p>
<p>There is a certain <i lang="fr">je ne sais quoi</i> in the air.</p>
In the following example, a dream sequence is marked up using
i
elements.
<p>Raymond tried to sleep.</p>
<p><i>The ship sailed away on Thursday</i>, he
dreamt. <i>The ship had many people aboard, including a beautiful
princess called Carey. He watched her, day-in, day-out, hoping she
would notice him, but she never did.</i></p>
<p><i>Finally one night he picked up the courage to speak with
her—</i></p>
<p>Raymond woke with a start as the fire alarm rang out.</p>
Authors can use the class
attribute on the i
element to identify why the element is being used, so that if the style of a particular use (e.g.
dream sequences as opposed to taxonomic terms) is to be changed at a later date, the author
doesn't have to go through the entire document (or series of related documents) annotating each
use.
Authors are encouraged to consider whether other elements might be more applicable than the
i
element, for instance the em
element for marking up stress emphasis,
or the dfn
element to mark up the defining instance of a term.
Style sheets can be used to format i
elements, just like any other
element can be restyled. Thus, it is not the case that content in i
elements will
necessarily be italicized.
b
elementHTMLElement
.The b
element represents a span of text to which attention is being
drawn for utilitarian purposes without conveying any extra importance and with no implication of
an alternate voice or mood, such as key words in a document abstract, product names in a review,
actionable words in interactive text-driven software, or an article lede.
The following example shows a use of the b
element to highlight key words without
marking them up as important:
<p>The <b>frobonitor</b> and <b>barbinator</b> components are fried.</p>
In the following example, objects in a text adventure are highlighted as being special by use
of the b
element.
<p>You enter a small room. Your <b>sword</b> glows
brighter. A <b>rat</b> scurries past the corner wall.</p>
Another case where the b
element is appropriate is in marking up the lede (or
lead) sentence or paragraph. The following example shows how a BBC article about
kittens adopting a rabbit as their own could be marked up:
<article>
<h2>Kittens 'adopted' by pet rabbit</h2>
<p><b class="lede">Six abandoned kittens have found an
unexpected new mother figure — a pet rabbit.</b></p>
<p>Veterinary nurse Melanie Humble took the three-week-old
kittens to her Aberdeen home.</p>
[...]
As with the i
element, authors can use the class
attribute on the b
element to identify why the element is being used, so that if the
style of a particular use is to be changed at a later date, the author doesn't have to go through
annotating each use.
The b
element should be used as a last resort when no other element is more
appropriate. In particular, headings should use the h1
to h6
elements,
stress emphasis should use the em
element, importance should be denoted with the
strong
element, and text marked or highlighted should use the mark
element.
The following would be incorrect usage:
<p><b>WARNING!</b> Do not frob the barbinator!</p>
In the previous example, the correct element to use would have been strong
, not
b
.
Style sheets can be used to format b
elements, just like any other
element can be restyled. Thus, it is not the case that content in b
elements will
necessarily be boldened.
u
elementHTMLElement
.The u
element represents a span of text with an unarticulated, though
explicitly rendered, non-textual annotation, such as labeling the text as being a proper name in
Chinese text (a Chinese proper name mark), or labeling the text as being misspelt.
In most cases, another element is likely to be more appropriate: for marking stress emphasis,
the em
element should be used; for marking key words or phrases either the
b
element or the mark
element should be used, depending on the context;
for marking book titles, the cite
element should be used; for labeling text with explicit textual annotations, the
ruby
element should be used; for technical terms, taxonomic designation,
transliteration, a thought, or for labeling ship names in Western texts, the i
element should be used.
The default rendering of the u
element in visual presentations
clashes with the conventional rendering of hyperlinks (underlining). Authors are encouraged to
avoid using the u
element where it could be confused for a hyperlink.
In this example, a u
element is used to mark a word as misspelt:
<p>The <u>see</u> is full of fish.</p>
mark
elementHTMLElement
.The mark
element represents a run of text in one document marked or
highlighted for reference purposes, due to its relevance in
another context. When used in a quotation or other block of text referred to from the prose, it
indicates a highlight that was not originally present but which has been added to bring the
reader's attention to a part of the text that might not have been considered important by the
original author when the block was originally written, but which is now under previously
unexpected scrutiny. When used in the main prose of a document, it indicates a part of the
document that has been highlighted due to its likely relevance to the user's current activity.
This example shows how the mark
element can be used to bring attention to a
particular part of a quotation:
<p lang="en-US">Consider the following quote:</p>
<blockquote lang="en-GB">
<p>Look around and you will find, no-one's really
<mark>colour</mark> blind.</p>
</blockquote>
<p lang="en-US">As we can tell from the <em>spelling</em> of the word,
the person writing this quote is clearly not American.</p>
(If the goal was to mark the element as misspelt, however, the u
element,
possibly with a class, would be more appropriate.)
Another example of the mark
element is highlighting parts of a document that are
matching some search string. If someone looked at a document, and the server knew that the user
was searching for the word "kitten", then the server might return the document with one paragraph
modified as follows:
<p>I also have some <mark>kitten</mark>s who are visiting me
these days. They're really cute. I think they like my garden! Maybe I
should adopt a <mark>kitten</mark>.</p>
In the following snippet, a paragraph of text refers to a specific part of a code fragment.
<p>The highlighted part below is where the error lies:</p>
<pre><code>var i: Integer;
begin
i := <mark>1.1</mark>;
end.</code></pre>
This is separate from syntax highlighting, for which span
is more
appropriate. Combining both, one would get:
<p>The highlighted part below is where the error lies:</p>
<pre><code><span class=keyword>var</span> <span class=ident>i</span>: <span class=type>Integer</span>;
<span class=keyword>begin</span>
<span class=ident>i</span> := <span class=literal><mark>1.1</mark></span>;
<span class=keyword>end</span>.</code></pre>
This is another example showing the use of mark
to highlight a part of quoted
text that was originally not emphasized. In this example, common typographic conventions have led
the author to explicitly style mark
elements in quotes to render in italics.
<style>
blockquote mark, q mark {
font: inherit; font-style: italic;
text-decoration: none;
background: transparent; color: inherit;
}
.bubble em {
font: inherit; font-size: larger;
text-decoration: underline;
}
</style>
<article>
<h1>She knew</h1>
<p>Did you notice the subtle joke in the joke on panel 4?</p>
<blockquote>
<p class="bubble">I didn't <em>want</em> to believe. <mark>Of course
on some level I realized it was a known-plaintext attack.</mark> But I
couldn't admit it until I saw for myself.</p>
</blockquote>
<p>(Emphasis mine.) I thought that was great. It's so pedantic, yet it
explains everything neatly.</p>
</article>
Note, incidentally, the distinction between the em
element in this example, which
is part of the original text being quoted, and the mark
element, which is
highlighting a part for comment.
The following example shows the difference between denoting the importance of a span
of text (strong
) as opposed to denoting the relevance of a span of text
(mark
). It is an extract from a textbook, where the extract has had the parts
relevant to the exam highlighted. The safety warnings, important though they may be, are
apparently not relevant to the exam.
<h3>Wormhole Physics Introduction</h3>
<p><mark>A wormhole in normal conditions can be held open for a
maximum of just under 39 minutes.</mark> Conditions that can increase
the time include a powerful energy source coupled to one or both of
the gates connecting the wormhole, and a large gravity well (such as a
black hole).</p>
<p><mark>Momentum is preserved across the wormhole. Electromagnetic
radiation can travel in both directions through a wormhole,
but matter cannot.</mark></p>
<p>When a wormhole is created, a vortex normally forms.
<strong>Warning: The vortex caused by the wormhole opening will
annihilate anything in its path.</strong> Vortexes can be avoided when
using sufficiently advanced dialing technology.</p>
<p><mark>An obstruction in a gate will prevent it from accepting a
wormhole connection.</mark></p>
bdi
elementdir
global attribute has special semantics on this element.HTMLElement
.The bdi
element represents a span of text that is to be isolated from
its surroundings for the purposes of bidirectional text formatting. BIDI
The dir
global attribute defaults to auto
on this element (it never inherits from the parent element like
with other elements).
This element is especially useful when embedding user-generated content with an unknown directionality.
In this example, usernames are shown along with the number of posts that the user has
submitted. If the bdi
element were not used, the username of the Arabic user would
end up confusing the text (the bidirectional algorithm would put the colon and the number "3"
next to the word "User" rather than next to the word "posts").
<ul>
<li>User <bdi>jcranmer</bdi>: 12 posts.
<li>User <bdi>hober</bdi>: 5 posts.
<li>User <bdi>إيان</bdi>: 3 posts.
</ul>
bdo
elementdir
global attribute has special semantics on this element.HTMLElement
.The bdo
element represents explicit text directionality formatting
control for its children. It allows authors to override the Unicode bidirectional algorithm by
explicitly specifying a direction override. BIDI
Authors must specify the dir
attribute on this element, with the
value ltr
to specify a left-to-right override and with the value rtl
to
specify a right-to-left override. The auto
value must not be specified.
span
element[Exposed=Window]
interface HTMLSpanElement : HTMLElement {
[HTMLConstructor] constructor();
};
HTMLSpanElement
.The span
element doesn't mean anything on its own, but can be useful when used
together with the global attributes, e.g. class
,
lang
, or dir
. It
represents its children.
In this example, a code fragment is marked up using span
elements and class
attributes so that its keywords and identifiers can be
color-coded from CSS:
<pre><code class="lang-c"><span class="keyword">for</span> (<span class="ident">j</span> = 0; <span class="ident">j</span> < 256; <span class="ident">j</span>++) {
<span class="ident">i_t3</span> = (<span class="ident">i_t3</span> & 0x1ffff) | (<span class="ident">j</span> << 17);
<span class="ident">i_t6</span> = (((((((<span class="ident">i_t3</span> >> 3) ^ <span class="ident">i_t3</span>) >> 1) ^ <span class="ident">i_t3</span>) >> 8) ^ <span class="ident">i_t3</span>) >> 5) & 0xff;
<span class="keyword">if</span> (<span class="ident">i_t6</span> == <span class="ident">i_t1</span>)
<span class="keyword">break</span>;
}</code></pre>
br
element[Exposed=Window]
interface HTMLBRElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLBRElement
.The br
element represents a line break.
While line breaks are usually represented in visual media by physically moving subsequent text to a new line, a style sheet or user agent would be equally justified in causing line breaks to be rendered in a different manner, for instance as green dots, or as extra spacing.
br
elements must be used only for line breaks that are actually part of the
content, as in poems or addresses.
The following example is correct usage of the br
element:
<p>P. Sherman<br>
42 Wallaby Way<br>
Sydney</p>
br
elements must not be used for separating thematic groups in a paragraph.
The following examples are non-conforming, as they abuse the br
element:
<p><a ...>34 comments.</a><br>
<a ...>Add a comment.</a></p>
<p><label>Name: <input name="name"></label><br>
<label>Address: <input name="address"></label></p>
Here are alternatives to the above, which are correct:
<p><a ...>34 comments.</a></p>
<p><a ...>Add a comment.</a></p>
<p><label>Name: <input name="name"></label></p>
<p><label>Address: <input name="address"></label></p>
If a paragraph consists of nothing but a single br
element, it
represents a placeholder blank line (e.g. as in a template). Such blank lines must not be used for
presentation purposes.
Any content inside br
elements must not be considered part of the surrounding
text.
This element has rendering requirements involving the bidirectional algorithm.
wbr
elementHTMLElement
.The wbr
element represents a line break opportunity.
In the following example, someone is quoted as saying something which, for effect, is written
as one long word. However, to ensure that the text can be wrapped in a readable fashion, the
individual words in the quote are separated using a wbr
element.
<p>So then she pointed at the tiger and screamed
"there<wbr>is<wbr>no<wbr>way<wbr>you<wbr>are<wbr>ever<wbr>going<wbr>to<wbr>catch<wbr>me"!</p>
Any content inside wbr
elements must not be considered part of the surrounding
text.
var wbr = document.createElement("wbr");
wbr.textContent = "This is wrong";
document.body.appendChild(wbr);
This element has rendering requirements involving the bidirectional algorithm.
Element | Purpose | Example |
---|---|---|
a
| Hyperlinks |
|
em
| Stress emphasis |
|
strong
| Importance |
|
small
| Side comments |
|
s
| Inaccurate text |
|
cite
| Titles of works |
|
q
| Quotations |
|
dfn
| Defining instance |
|
abbr
| Abbreviations |
|
ruby , rt , rp
| Ruby annotations |
|
data
| Machine-readable equivalent |
|
time
| Machine-readable equivalent of date- or time-related data |
|
code
| Computer code |
|
var
| Variables |
|
samp
| Computer output |
|
kbd
| User input |
|
sub
| Subscripts |
|
sup
| Superscripts |
|
i
| Alternative voice |
|
b
| Keywords |
|
u
| Annotations |
|
mark
| Highlight |
|
bdi
| Text directionality isolation |
|
bdo
| Text directionality formatting |
|
span
| Other |
|
br
| Line break |
|
wbr
| Line breaking opportunity |
|
Links are a conceptual construct, created by a
, area
,
form
, and link
elements, that represent
a connection between two resources, one of which is the current Document
. There are
three kinds of links in HTML:
These are links to resources that are to be used to augment the current document, generally automatically processed by the user agent. All external resource links have a fetch and process the linked resource algorithm which describes how the resource is obtained.
These are links to other resources that are generally exposed to the user by the user agent so that the user can cause the user agent to navigate to those resources, e.g. to visit them in a browser or download them.
These are links to resources within the current document, used to give those resources special meaning or behavior.
For link
elements with an href
attribute and a
rel
attribute, links must be created for the keywords of the
rel
attribute, as defined for those keywords in the link types section.
Similarly, for a
and area
elements with an href
attribute and a rel
attribute, links must be created for the keywords of the
rel
attribute as defined for those keywords in the link types section. Unlike link
elements, however,
a
and area
elements with an href
attribute that either do not have a rel
attribute, or
whose rel
attribute has no keywords that are defined as
specifying hyperlinks, must also create a hyperlink.
This implied hyperlink has no special meaning (it has no link type)
beyond linking the element's node document to the resource given by the element's href
attribute.
Similarly, for form
elements with a rel
attribute, links must be created for the keywords of the rel
attribute as defined for those keywords in the link types section.
form
elements that do not have a rel
attribute,
or whose rel
attribute has no keywords that are defined as
specifying hyperlinks, must also create a hyperlink.
A hyperlink can have one or more hyperlink annotations that modify the processing semantics of that hyperlink.
a
and area
elementsThe href
attribute on a
and area
elements must have a value that is a valid
URL potentially surrounded by spaces.
The href
attribute on a
and
area
elements is not required; when those elements do not have href
attributes they do not create hyperlinks.
The target
attribute, if present, must be a valid navigable target name or keyword. It gives the
name of the navigable that will be used. User agents use this
name when following hyperlinks.
The download
attribute, if present, indicates that the author intends the hyperlink to be used for downloading a resource. The attribute may have a value; the
value, if any, specifies the default filename that the author recommends for use in labeling the
resource in a local file system. There are no restrictions on allowed values, but authors are
cautioned that most file systems have limitations with regard to what punctuation is supported in
filenames, and user agents are likely to adjust filenames accordingly.
The ping
attribute, if present, gives the URLs of the
resources that are interested in being notified if the user follows the hyperlink. The value must
be a set of space-separated tokens, each of which must be a valid non-empty
URL whose scheme is an HTTP(S)
scheme. The value is used by the user agent for hyperlink
auditing.
The rel
attribute on a
and area
elements controls what kinds of links the elements create. The attribute's value must be an
unordered set of unique space-separated tokens. The allowed
keywords and their meanings are defined below.
rel
's supported tokens are the keywords defined in HTML link types which are allowed on a
and area
elements, impact the processing model, and are supported by the user agent. The possible supported tokens are noreferrer
, noopener
, and opener
. rel
's supported tokens must only include the tokens from this
list that the user agent implements the processing model for.
The rel
attribute has no default value. If the
attribute is omitted or if none of the values in the attribute are recognized by the user agent,
then the document has no particular relationship with the destination resource other than there
being a hyperlink between the two.
The hreflang
attribute on a
elements that create hyperlinks, if
present, gives the language of the linked resource. It is purely advisory. The value must be a
valid BCP 47 language tag. BCP47 User agents must not consider this
attribute authoritative — upon fetching the resource, user agents must use only language
information associated with the resource to determine its language, not metadata included in the
link to the resource.
The type
attribute, if present, gives the MIME type of the linked resource. It is purely
advisory. The value must be a valid MIME type string. User agents must
not consider the type
attribute authoritative —
upon fetching the resource, user agents must not use metadata included in the link to the resource
to determine its type.
The referrerpolicy
attribute is a referrer
policy attribute. Its purpose is to set the referrer policy used when
following hyperlinks. REFERRERPOLICY
When an a
or area
element's activation behavior is
invoked, the user agent may allow the user to indicate a preference regarding whether the
hyperlink is to be used for navigation or whether the resource it
specifies is to be downloaded.
In the absence of a user preference, the default should be navigation if the element has no
download
attribute, and should be to download the
specified resource if it does.
The activation behavior of an a
or area
element
element given an event event is:
If element has no href
attribute,
then return.
Let hyperlinkSuffix be null.
If element is an a
element, and event's target is an img
with an ismap
attribute specified, then:
Let x and y be 0.
If event's isTrusted
attribute is
initialized to true, then set x to the distance in CSS
pixels from the left edge of the image to the location of the click, and set
y to the distance in CSS pixels from the top edge of the
image to the location of the click.
If x is negative, set x to 0.
If y is negative, set y to 0.
Set hyperlinkSuffix to the concatenation of U+003F (?), the value of x expressed as a base-ten integer using ASCII digits, U+002C (,), and the value of y expressed as a base-ten integer using ASCII digits.
Let userInvolvement be event's user navigation involvement.
If the user has expressed a preference to download the hyperlink, then set
userInvolvement to "browser UI
".
That is, if the user has expressed a specific preference for downloading, this
no longer counts as merely "activation
".
If element has a download
attribute, or if the user has expressed a preference to download the hyperlink, then download the hyperlink created by element with
hyperlinkSuffix set to hyperlinkSuffix and
userInvolvement set to
userInvolvement.
Otherwise, follow the hyperlink created by element with hyperlinkSuffix set to hyperlinkSuffix and userInvolvement set to userInvolvement.
a
and area
elementsinterface mixin HTMLHyperlinkElementUtils {
[CEReactions] stringifier attribute USVString href;
readonly attribute USVString origin;
[CEReactions] attribute USVString protocol;
[CEReactions] attribute USVString username;
[CEReactions] attribute USVString password;
[CEReactions] attribute USVString host;
[CEReactions] attribute USVString hostname;
[CEReactions] attribute USVString port;
[CEReactions] attribute USVString pathname;
[CEReactions] attribute USVString search;
[CEReactions] attribute USVString hash;
};
hyperlink.toString()
hyperlink.href
Returns the hyperlink's URL.
Can be set, to change the URL.
hyperlink.origin
Returns the hyperlink's URL's origin.
hyperlink.protocol
Returns the hyperlink's URL's scheme.
Can be set, to change the URL's scheme.
hyperlink.username
Returns the hyperlink's URL's username.
Can be set, to change the URL's username.
hyperlink.password
Returns the hyperlink's URL's password.
Can be set, to change the URL's password.
hyperlink.host
Returns the hyperlink's URL's host and port (if different from the default port for the scheme).
Can be set, to change the URL's host and port.
hyperlink.hostname
Returns the hyperlink's URL's host.
Can be set, to change the URL's host.
hyperlink.port
Returns the hyperlink's URL's port.
Can be set, to change the URL's port.
hyperlink.pathname
Returns the hyperlink's URL's path.
Can be set, to change the URL's path.
hyperlink.search
Returns the hyperlink's URL's query (includes leading "?
" if
non-empty).
Can be set, to change the URL's query (ignores leading "?
").
hyperlink.hash
Returns the hyperlink's URL's fragment (includes leading "#
" if
non-empty).
Can be set, to change the URL's fragment (ignores leading "#
").
An element implementing the HTMLHyperlinkElementUtils
mixin has an associated url (null or a URL). It is initially null.
An element implementing the HTMLHyperlinkElementUtils
mixin has an associated set the url algorithm, which runs these steps:
Set this element's url to null.
If this element's href
content attribute is
absent, then return.
Let url be the result of encoding-parsing a URL given this
element's href
content attribute's value, relative to
this element's node document.
If url is not failure, then set this element's url to url.
When elements implementing the HTMLHyperlinkElementUtils
mixin are created, and
whenever those elements have their href
content
attribute set, changed, or removed, the user agent must set the url.
This is only observable for blob:
URLs as
parsing them involves a Blob URL Store lookup.
An element implementing the HTMLHyperlinkElementUtils
mixin has an associated
reinitialize url algorithm, which runs these
steps:
If the element's url is non-null, its scheme is "blob
", and it has an
opaque path, then terminate these steps.
Set the url.
To update href
, set the element's href
content attribute's value to the element's url, serialized.
The href
getter steps are:
Reinitialize url.
Let url be this's url.
If url is null and this has no href
content attribute, return the empty string.
Otherwise, if url is null, return this's href
content attribute's value.
Return url, serialized.
The href
setter steps are to set this's
href
content attribute's value to the given value.
The origin
getter steps are:
Reinitialize url.
If this's url is null, return the empty string.
Return the serialization of this's url's origin.
The protocol
getter steps are:
Reinitialize url.
If this's url is null, return
":
".
Return this's url's scheme, followed by ":
".
The protocol
setter steps are:
Reinitialize url.
If this's url is null, then return.
Basic URL parse the given value, followed by ":
", with this's url as
url and scheme start state as
state override.
Because the URL parser ignores multiple consecutive colons, providing a value
of "https:
" (or even "https::::
") is the same as
providing a value of "https
".
Update href
.
The username
getter steps are:
Reinitialize url.
If this's url is null, return the empty string.
Return this's url's username.
The username
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null or url cannot have a username/password/port, then return.
Set the username, given url and the given value.
Update href
.
The password
getter steps are:
Reinitialize url.
Let url be this's url.
If url is null, then return the empty string.
Return url's password.
The password
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null or url cannot have a username/password/port, then return.
Set the password, given url and the given value.
Update href
.
The host
getter steps are:
Reinitialize url.
Let url be this's url.
If url or url's host is null, return the empty string.
If url's port is null, return url's host, serialized.
Return url's host, serialized, followed by ":
" and url's port, serialized.
The host
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null or url has an opaque path, then return.
Basic URL parse the given value, with url as url and host state as state override.
Update href
.
The hostname
getter steps are:
Reinitialize url.
Let url be this's url.
If url or url's host is null, return the empty string.
Return url's host, serialized.
The hostname
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null or url has an opaque path, then return.
Basic URL parse the given value, with url as url and hostname state as state override.
Update href
.
The port
getter steps are:
Reinitialize url.
Let url be this's url.
If url or url's port is null, return the empty string.
Return url's port, serialized.
The port
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null or url cannot have a username/password/port, then return.
If the given value is the empty string, then set url's port to null.
Otherwise, basic URL parse the given value, with url as url and port state as state override.
Update href
.
The pathname
getter steps are:
Reinitialize url.
Let url be this's url.
If url is null, then return the empty string.
Return the result of URL path serializing url.
The pathname
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null or url has an opaque path, then return.
Set url's path to the empty list.
Basic URL parse the given value, with url as url and path start state as state override.
Update href
.
The search
getter steps are:
Reinitialize url.
Let url be this's url.
If url is null, or url's query is either null or the empty string, return the empty string.
Return "?
", followed by url's query.
The search
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null, terminate these steps.
If the given value is the empty string, set url's query to null.
Otherwise:
Let input be the given value with a single leading "?
"
removed, if any.
Set url's query to the empty string.
Basic URL parse input, with url as url and query state as state override.
Update href
.
The hash
getter steps are:
Reinitialize url.
Let url be this's url.
If url is null, or url's fragment is either null or the empty string, return the empty string.
Return "#
", followed by url's fragment.
The hash
setter steps are:
Reinitialize url.
Let url be this's url.
If url is null, then return.
If the given value is the empty string, set url's fragment to null.
Otherwise:
Let input be the given value with a single leading "#
"
removed, if any.
Set url's fragment to the empty string.
Basic URL parse input, with url as url and fragment state as state override.
Update href
.
An element element cannot navigate if any of the following are true:
element's node document is not fully active; or
element is not an a
element and is not
connected.
This is also used by form submission for
the form
element. The exception for a
elements is for compatibility with
web content.
To get an element's noopener, given an a
, area
, or
form
element element, a URL record url, and a
string target, perform the following steps. They return a boolean.
If element's link types include the noopener
or noreferrer
keyword, then return true.
If element's link types
do not include the opener
keyword and target is an
ASCII case-insensitive match for "_blank
", then return
true.
If url's scheme is "blob
":
Let blobOrigin be url's blob URL entry's environment's origin.
Let topLevelOrigin be element's relevant settings object's top-level origin.
If blobOrigin is not same site with topLevelOrigin, then return true.
Return false.
To follow the hyperlink created by an element
subject, given an optional hyperlinkSuffix (default null) and an
optional userInvolvement (default "none
"):
If subject cannot navigate, then return.
Let replace be false.
Let targetAttributeValue be the empty string.
If subject is an a
or area
element, then set
targetAttributeValue to the result of getting
an element's target given subject.
Let urlRecord be the result of encoding-parsing a URL given
subject's href
attribute value, relative to
subject's node document.
If urlRecord is failure, then return.
Let noopener be the result of getting an element's noopener with subject, urlRecord, and targetAttributeValue.
Let targetNavigable be the first return value of applying the rules for choosing a navigable given targetAttributeValue, subject's node navigable, and noopener.
If targetNavigable is null, then return.
Let urlString be the result of applying the URL serializer to urlRecord.
If hyperlinkSuffix is non-null, then append it to urlString.
Let referrerPolicy be the current state of subject's referrerpolicy
content attribute.
If subject's link
types includes the noreferrer
keyword, then set
referrerPolicy to "no-referrer
".
Navigate targetNavigable to urlString using subject's node document, with referrerPolicy set to referrerPolicy and userInvolvement set to userInvolvement.
Unlike many other types of navigations, following hyperlinks does not have
special "replace
" behavior for when
documents are not completely loaded. This is true for both user-initiated instances
of following hyperlinks, as well as script-triggered ones via, e.g., aElement.click()
.
In some cases, resources are intended for later use rather than immediate viewing. To indicate
that a resource is intended to be downloaded for use later, rather than immediately used, the
download
attribute can be specified on the
a
or area
element that creates the hyperlink to that
resource.
The attribute can furthermore be given a value, to specify the filename that user agents are
to use when storing the resource in a file system. This value can be overridden by the `Content-Disposition
` HTTP header's filename parameters.
RFC6266
In cross-origin situations, the download
attribute has to be combined with the `Content-Disposition
` HTTP header, specifically with the
attachment
disposition type, to avoid the user being warned of possibly
nefarious activity. (This is to protect users from being made to download sensitive personal or
confidential information without their full understanding.)
To download the hyperlink created by an
element subject, given an optional hyperlinkSuffix (default null) and an
optional userInvolvement (default
"none
"):
If subject cannot navigate, then return.
If subject's node document's active sandboxing flag set has the sandboxed downloads browsing context flag set, then return.
Let urlString be the result of encoding-parsing-and-serializing a
URL given subject's href
attribute
value, relative to subject's node document.
If urlString is failure, then return.
If hyperlinkSuffix is non-null, then append it to urlString.
If userInvolvement is not "browser UI
",
then:
Assert: subject has a download
attribute.
Let navigation be subject's relevant global object's navigation API.
Let filename be the value of subject's download
attribute.
Let continue be the result of firing a download request navigate
event at
navigation with destinationURL
set to urlString, userInvolvement set to
userInvolvement, and filename set to
filename.
If continue is false, then return.
Run these steps in parallel:
Optionally, the user agent may abort these steps, if it believes doing so would safeguard the user from a potentially hostile download.
Let request be a new request whose
URL is urlString, client is entry settings object, initiator is "download
", destination is the empty string, and whose
synchronous flag and use-URL-credentials flag are set.
Handle the result of fetching request as a download.
When a user agent is to handle a resource obtained from a fetch as a download, it should provide the user with a way to save the resource for later use, if a resource is successfully obtained. Otherwise, it should report any problems downloading the file to the user.
If the user agent needs a filename for a resource being handled as a download, it should select one using the following algorithm.
This algorithm is intended to mitigate security dangers involved in downloading files from untrusted sites, and user agents are strongly urged to follow it.
Let filename be the undefined value.
If the resource has a `Content-Disposition
`
header, that header specifies the attachment
disposition type, and the
header includes filename information, then let filename have the value specified by
the header, and jump to the step labeled sanitize below. RFC6266
Let interface origin be the origin of the Document
in which the download or navigate action resulting in the
download was initiated, if any.
Let resource origin be the origin of the URL of the
resource being downloaded, unless that URL's scheme
component is data
, in which case let resource origin be
the same as the interface origin, if any.
If there is no interface origin, then let trusted operation be true. Otherwise, let trusted operation be true if resource origin is the same origin as interface origin, and false otherwise.
If trusted operation is true and the resource has a `Content-Disposition
` header and that header includes
filename information, then let filename have the value specified by the header, and
jump to the step labeled sanitize below. RFC6266
If the download was not initiated from a hyperlink created by an
a
or area
element, or if the element of the hyperlink from
which it was initiated did not have a download
attribute when the download was initiated, or if there was such an attribute but its value when
the download was initiated was the empty string, then jump to the step labeled no proposed
filename.
Let proposed filename have the value of the download
attribute of the element of the
hyperlink that initiated the download at the time the download was
initiated.
If trusted operation is true, let filename have the value of proposed filename, and jump to the step labeled sanitize below.
If the resource has a `Content-Disposition
`
header and that header specifies the attachment
disposition type, let
filename have the value of proposed filename, and jump to the step labeled
sanitize below. RFC6266
No proposed filename: If trusted operation is true, or if the user indicated a preference for having the resource in question downloaded, let filename have a value derived from the URL of the resource in an implementation-defined manner, and jump to the step labeled sanitize below.
Let filename be set to the user's preferred filename or to a filename selected by the user agent, and jump to the step labeled sanitize below.
If the algorithm reaches this step, then a download was begun from a different origin than
the resource being downloaded, and the origin did not mark the file as suitable for
downloading, and the download was not initiated by the user. This could be because a download
attribute was used to trigger the download, or
because the resource in question is not of a type that the user agent supports.
This could be dangerous, because, for instance, a hostile server could be trying to get a user to unknowingly download private information and then re-upload it to the hostile server, by tricking the user into thinking the data is from the hostile server.
Thus, it is in the user's interests that the user be somehow notified that the resource in question comes from quite a different source, and to prevent confusion, any suggested filename from the potentially hostile interface origin should be ignored.
Sanitize: Optionally, allow the user to influence filename. For example, a user agent could prompt the user for a filename, potentially providing the value of filename as determined above as a default value.
Adjust filename to be suitable for the local file system.
For example, this could involve removing characters that are not legal in filenames, or trimming leading and trailing whitespace.
If the platform conventions do not in any way use extensions to determine the types of file on the file system, then return filename as the filename.
Let claimed type be the type given by the resource's Content-Type metadata, if any is known. Let named type be the type given by filename's extension, if any is known. For the purposes of this step, a type is a mapping of a MIME type to an extension.
If named type is consistent with the user's preferences (e.g., because the value of filename was determined by prompting the user), then return filename as the filename.
If claimed type and named type are the same type (i.e., the type given by the resource's Content-Type metadata is consistent with the type given by filename's extension), then return filename as the filename.
If the claimed type is known, then alter filename to add an extension corresponding to claimed type.
Otherwise, if named type is known to be potentially dangerous (e.g. it
will be treated by the platform conventions as a native executable, shell script, HTML
application, or executable-macro-capable document) then optionally alter filename to add a known-safe extension
(e.g. ".txt
").
This last step would make it impossible to download executables, which might not be desirable. As always, implementers are forced to balance security and usability in this matter.
Return filename as the filename.
For the purposes of this algorithm, a file extension
consists of any part of the filename that platform conventions dictate will be used for
identifying the type of the file. For example, many operating systems use the part of the filename
following the last dot (".
") in the filename to determine the type of the
file, and from that the manner in which the file is to be opened or executed.
User agents should ignore any directory or path information provided by the resource itself,
its URL, and any download
attribute, in
deciding where to store the resulting file in the user's file system.
If a hyperlink created by an a
or area
element has a
ping
attribute, and the user follows the hyperlink, and
the value of the element's href
attribute can be parsed, relative to the element's node
document, without failure, then the user agent must take the ping
attribute's value, split that string on ASCII whitespace, parse each resulting token, relative to the element's node document, and
then run these steps for each resulting URL ping URL, ignoring when
parsing returns failure:
If ping URL's scheme is not an HTTP(S) scheme, then return.
Optionally, return. (For example, the user agent might wish to ignore any or all ping URLs in accordance with the user's expressed preferences.)
Let settingsObject be the element's node document's relevant settings object.
Let request be a new request whose URL is ping URL, method is `POST
`, header list is « (`Content-Type
`,
`text/ping
`) », body is `PING
`, client is
settingsObject, destination is the
empty string, credentials mode is "include
", referrer is "no-referrer
", and whose use-URL-credentials flag is set, and whose
initiator type is "ping
".
Let target URL be the result of encoding-parsing-and-serializing a
URL given the element's href
attribute's value,
relative to the element's node document, and then:
Document
object
containing the hyperlink being audited and ping URL have the same
originDocument
containing the
hyperlink being audited is not "https
"Ping-From
` header with, as its value, the
URL of the document containing the hyperlink, and a
`Ping-To
` HTTP header with, as its value, the target URL.Ping-To
` HTTP header with, as its value,
target URL. request does not include a
`Ping-From
` header.Fetch request.
This may be done in parallel with the primary fetch, and is independent of the result of that fetch.
User agents should allow the user to adjust this behavior, for example in conjunction with a
setting that disables the sending of HTTP `Referer
` (sic)
headers. Based on the user's preferences, UAs may either ignore the ping
attribute altogether, or selectively ignore URLs in the
list (e.g. ignoring any third-party URLs); this is explicitly accounted for in the steps
above.
User agents must ignore any entity bodies returned in the responses. User agents may close the connection prematurely once they start receiving a response body.
When the ping
attribute is present, user agents
should clearly indicate to the user that following the hyperlink will also cause secondary
requests to be sent in the background, possibly including listing the actual target URLs.
For example, a visual user agent could include the hostnames of the target ping URLs along with the hyperlink's actual URL in a status bar or tooltip.
The ping
attribute is redundant with pre-existing
technologies like HTTP redirects and JavaScript in allowing web pages to track which off-site
links are most popular or allowing advertisers to track click-through rates.
However, the ping
attribute provides these advantages
to the user over those alternatives:
Thus, while it is possible to track users without this feature, authors are encouraged to use
the ping
attribute so that the user agent can make the
user experience more transparent.
Ping-From
` and `Ping-To
` headersThe `Ping-From
` and `Ping-To
` HTTP request headers are included in hyperlink
auditing requests. Their value is a URL, serialized.
The following table summarizes the link types that are defined by this specification, by their corresponding keywords. This table is non-normative; the actual definitions for the link types are given in the next few sections.
In this section, the term referenced document refers to the resource identified by the element representing the link, and the term current document refers to the resource within which the element representing the link finds itself.
To determine which link types apply to a link
, a
, area
,
or form
element, the element's rel
attribute must be split on ASCII whitespace. The resulting tokens
are the keywords for the link types that apply to that element.
Except where otherwise specified, a keyword must not be specified more than once per rel
attribute.
Some of the sections that follow the table below list synonyms for certain keywords. The
indicated synonyms are to be handled as specified by user agents, but must
not be used in documents (for example, the keyword "copyright
").
Keywords are always ASCII case-insensitive, and must be compared as such.
Thus, rel="next"
is the same as rel="NEXT"
.
Keywords that are body-ok affect whether link
elements are
allowed in the body. The body-ok keywords are
dns-prefetch
,
modulepreload
,
pingback
,
preconnect
,
prefetch
,
preload
, and
stylesheet
.
New link types that are to be implemented by web browsers are to be added to this standard. The remainder can be registered as extensions.
Link type | Effect on... | body-ok | Has `Link ` processing |
Brief description | ||
---|---|---|---|---|---|---|
link |
a and area |
form |
||||
alternate |
Hyperlink | not allowed | · | · | Gives alternate representations of the current document. | |
canonical |
Hyperlink | not allowed | · | · | Gives the preferred URL for the current document. | |
author |
Hyperlink | not allowed | · | · | Gives a link to the author of the current document or article. | |
bookmark |
not allowed | Hyperlink | not allowed | · | · | Gives the permalink for the nearest ancestor section. |
dns-prefetch |
External Resource | not allowed | Yes | · | Specifies that the user agent should preemptively perform DNS resolution for the target resource's origin. | |
expect |
Internal Resource | not allowed | · | · | Expect an element with the target ID to appear in the current document. | |
external |
not allowed | Annotation | · | · | Indicates that the referenced document is not part of the same site as the current document. | |
help |
Hyperlink | · | · | Provides a link to context-sensitive help. | ||
icon |
External Resource | not allowed | · | · | Imports an icon to represent the current document. | |
manifest |
External Resource | not allowed | · | · | Imports or links to an application manifest. MANIFEST | |
modulepreload |
External Resource | not allowed | Yes | · | Specifies that the user agent must preemptively fetch the module script and store it in the document's module map for later evaluation. Optionally, the module's dependencies can be fetched as well. | |
license |
Hyperlink | · | · | Indicates that the main content of the current document is covered by the copyright license described by the referenced document. | ||
next |
Hyperlink | · | · | Indicates that the current document is a part of a series, and that the next document in the series is the referenced document. | ||
nofollow |
not allowed | Annotation | · | · | Indicates that the current document's original author or publisher does not endorse the referenced document. | |
noopener |
not allowed | Annotation | · | · | Creates a top-level traversable with a non-auxiliary browsing
context if the hyperlink would otherwise create one that was auxiliary (i.e., has an
appropriate target attribute value). |
|
noreferrer |
not allowed | Annotation | · | · | No `Referer ` (sic) header will be included.
Additionally, has the same effect as noopener . |
|
opener |
not allowed | Annotation | · | · | Creates an auxiliary browsing context if the hyperlink would otherwise create
a top-level traversable with a non-auxiliary browsing context (i.e.,
has "_blank " as target
attribute value). |
|
pingback |
External Resource | not allowed | Yes | · | Gives the address of the pingback server that handles pingbacks to the current document. | |
preconnect |
External Resource | not allowed | Yes | Yes | Specifies that the user agent should preemptively connect to the target resource's origin. | |
prefetch |
External Resource | not allowed | Yes | · | Specifies that the user agent should preemptively fetch and cache the target resource as it is likely to be required for a followup navigation. | |
preload |
External Resource | not allowed | Yes | Yes | Specifies that the user agent must preemptively fetch and cache the target resource for current navigation according to the potential destination given by the as attribute (and the priority associated with the corresponding destination). |
|
prev |
Hyperlink | · | · | Indicates that the current document is a part of a series, and that the previous document in the series is the referenced document. | ||
privacy-policy |
Hyperlink | not allowed | · | · | Gives a link to information about the data collection and usage practices that apply to the current document. | |
search |
Hyperlink | · | · | Gives a link to a resource that can be used to search through the current document and its related pages. | ||
stylesheet |
External Resource | not allowed | Yes | · | Imports a style sheet. | |
tag |
not allowed | Hyperlink | not allowed | · | · | Gives a tag (identified by the given address) that applies to the current document. |
terms-of-service |
Hyperlink | not allowed | · | · | Gives a link to information about the agreements between the current document's provider and users who wish to use the current document. |
alternate
"The alternate
keyword may be used with link
,
a
, and area
elements.
The meaning of this keyword depends on the values of the other attributes.
link
element and the rel
attribute also contains the keyword stylesheet
The alternate
keyword modifies the meaning of the stylesheet
keyword in the way described for that keyword. The
alternate
keyword does not create a link of its own.
Here, a set of link
elements provide some style sheets:
<!-- a persistent style sheet -->
<link rel="stylesheet" href="default.css">
<!-- the preferred alternate style sheet -->
<link rel="stylesheet" href="green.css" title="Green styles">
<!-- some alternate style sheets -->
<link rel="alternate stylesheet" href="contrast.css" title="High contrast">
<link rel="alternate stylesheet" href="big.css" title="Big fonts">
<link rel="alternate stylesheet" href="wide.css" title="Wide screen">
alternate
keyword is used with the type
attribute set to the value application/rss+xml
or the value application/atom+xml
The keyword creates a hyperlink referencing a syndication feed (though not necessarily syndicating exactly the same content as the current page).
For the purposes of feed autodiscovery, user agents should consider all link
elements in the document with the alternate
keyword used and
with their type
attribute set to the value application/rss+xml
or the value application/atom+xml
. If the user agent has the concept of a default
syndication feed, the first such element (in tree order) should be used as the
default.
The following link
elements give syndication feeds for a blog:
<link rel="alternate" type="application/atom+xml" href="posts.xml" title="Cool Stuff Blog">
<link rel="alternate" type="application/atom+xml" href="posts.xml?category=robots" title="Cool Stuff Blog: robots category">
<link rel="alternate" type="application/atom+xml" href="comments.xml" title="Cool Stuff Blog: Comments">
Such link
elements would be used by user agents engaged in feed autodiscovery,
with the first being the default (where applicable).
The following example offers various different syndication feeds to the user, using
a
elements:
<p>You can access the planets database using Atom feeds:</p>
<ul>
<li><a href="recently-visited-planets.xml" rel="alternate" type="application/atom+xml">Recently Visited Planets</a></li>
<li><a href="known-bad-planets.xml" rel="alternate" type="application/atom+xml">Known Bad Planets</a></li>
<li><a href="unexplored-planets.xml" rel="alternate" type="application/atom+xml">Unexplored Planets</a></li>
</ul>
These links would not be used in feed autodiscovery.
The keyword creates a hyperlink referencing an alternate representation of the current document.
The nature of the referenced document is given by the hreflang
, and type
attributes.
If the alternate
keyword is used with the hreflang
attribute, and that attribute's value differs
from the document element's language, it indicates that the referenced
document is a translation.
If the alternate
keyword is used with the type
attribute, it indicates that the referenced document is
a reformulation of the current document in the specified format.
The hreflang
and type
attributes can be combined when specified with the alternate
keyword.
The following example shows how you can specify versions of the page that use alternative formats, are aimed at other languages, and that are intended for other media:
<link rel=alternate href="/en/html" hreflang=en type=text/html title="English HTML">
<link rel=alternate href="/fr/html" hreflang=fr type=text/html title="French HTML">
<link rel=alternate href="/en/html/print" hreflang=en type=text/html media=print title="English HTML (for printing)">
<link rel=alternate href="/fr/html/print" hreflang=fr type=text/html media=print title="French HTML (for printing)">
<link rel=alternate href="/en/pdf" hreflang=en type=application/pdf title="English PDF">
<link rel=alternate href="/fr/pdf" hreflang=fr type=application/pdf title="French PDF">
This relationship is transitive — that is, if a document links to two other documents
with the link type "alternate
", then, in addition to implying
that those documents are alternative representations of the first document, it is also implying
that those two documents are alternative representations of each other.
author
"The author
keyword may be used with link
,
a
, and area
elements. This keyword creates a hyperlink.
For a
and area
elements, the author
keyword indicates that the referenced document provides further information about the author of
the nearest article
element ancestor of the element defining the hyperlink, if there
is one, or of the page as a whole, otherwise.
For link
elements, the author
keyword indicates
that the referenced document provides further information about the author for the page as a
whole.
The "referenced document" can be, and often is, a mailto:
URL giving the email address of the author. MAILTO
Synonyms: For historical reasons, user agents must also treat
link
, a
, and area
elements that have a rev
attribute with the value "made
" as having the author
keyword specified as a link relationship.
bookmark
"The bookmark
keyword may be used with a
and
area
elements. This keyword creates a hyperlink.
The bookmark
keyword gives a permalink for the nearest
ancestor article
element of the linking element in question, or of the section the linking element is most closely associated with, if
there are no ancestor article
elements.
The following snippet has three permalinks. A user agent could determine which permalink applies to which part of the spec by looking at where the permalinks are given.
...
<body>
<h1>Example of permalinks</h1>
<div id="a">
<h2>First example</h2>
<p><a href="a.html" rel="bookmark">This permalink applies to
only the content from the first H2 to the second H2</a>. The DIV isn't
exactly that section, but it roughly corresponds to it.</p>
</div>
<h2>Second example</h2>
<article id="b">
<p><a href="b.html" rel="bookmark">This permalink applies to
the outer ARTICLE element</a> (which could be, e.g., a blog post).</p>
<article id="c">
<p><a href="c.html" rel="bookmark">This permalink applies to
the inner ARTICLE element</a> (which could be, e.g., a blog comment).</p>
</article>
</article>
</body>
...
canonical
"The canonical
keyword may be used with link
element. This keyword creates a hyperlink.
The canonical
keyword indicates that URL given by the href
attribute is the preferred URL for the current document. That
helps search engines reduce duplicate content, as described in more detail in The Canonical
Link Relation. RFC6596
dns-prefetch
"The dns-prefetch
keyword may be used with
link
elements. This keyword creates an external
resource link. This keyword is body-ok.
The dns-prefetch
keyword indicates that preemptively
performing DNS resolution for the origin of the specified resource is likely to be
beneficial, as it is highly likely that the user will require resources located at that
origin, and the user experience would be improved by preempting the latency costs
associated with DNS resolution.
There is no default type for resources given by the dns-prefetch
keyword.
The appropriate times to fetch and process this type of link are:
When the external resource link is created on a link
element
that is already browsing-context connected.
When the external resource link's link
element becomes
browsing-context connected.
When the href
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
The fetch and process the linked resource steps for this type of linked resource,
given a link
element el, are:
Let url be the result of encoding-parsing a URL given
el's href
attribute's value, relative to
el's node document.
If url is failure, then return.
Let partitionKey be the result of determining the network partition key given el's node document's relevant settings object.
The user agent should resolve an origin given partitionKey and url's origin.
As the results of this algorithm can be cached, future fetches could be faster.
expect
"The expect
keyword may be used with link
elements. This keyword creates an internal resource
link.
An internal resource link created by the expect
keyword can be used to block rendering until the element that
it indicates is connected to the document and fully
parsed.
There is no default type for resources given by the expect
keyword.
Whenever any of the following conditions occur for a link
element
el:
the expect
internal resource link is created
on el that is already browsing-context connected;
an expect
internal resource link has been
created on el and el becomes
browsing-context connected;
an expect
internal resource link has been
created on el, el is already browsing-context connected, and
el's href
attribute is set, changed, or removed;
or
an expect
internal resource link has been
created on el, el is already browsing-context connected, and
el's media
attribute is set, changed, or
removed,
then process el.
To process internal resource link given a link
element el,
run these steps:
Let doc be el's node document.
Let url be the result of encoding-parsing a URL given
el's href
attribute's value, relative to
doc.
If this fails, or if url does not equal doc's URL with exclude fragments set to false, then unblock rendering on el and return.
Let indicatedElement be the result of selecting the indicated part given doc and url.
If all of the following are true:
doc's current document readiness is "loading
";
el creates an internal resource link;
el is browsing-context connected;
el's rel
attribute
contains expect
;
el is potentially render-blocking;
el's media
attribute
matches the environment; and
indicatedElement is not an element, or is on a
stack of open elements of an HTML parser whose associated
Document
is doc,
then block rendering on el.
Otherwise, unblock rendering on el.
To process internal resource links given a Document
doc:
For each expect
link
element link in
doc's render-blocking element set, process link.
The following attribute change steps, given
element, localName, value, and namespace, are used to
ensure expect
link
elements respond to dynamic id
and name
changes:
If namespace is not null, then return.
If element is in a stack of open elements of an HTML parser, then return.
If any of the following is true:
localName is id
; or
localName is name
and element is an a
element,
then process internal resource links given element's node document.
external
"The external
keyword may be used with a
,
area
, and form
elements. This keyword does not create a
hyperlink, but annotates any other
hyperlinks created by the element (the implied hyperlink, if no other keywords create one).
The external
keyword indicates that the link is leading to a
document that is not part of the site that the current document forms a part of.
help
"The help
keyword may be used with link
,
a
, area
, and form
elements. This keyword creates a
hyperlink.
For a
, area
, and form
elements, the help
keyword indicates that the referenced document provides further help
information for the parent of the element defining the hyperlink, and its children.
In the following example, the form control has associated context-sensitive help. The user agent could use this information, for example, displaying the referenced document if the user presses the "Help" or "F1" key.
<p><label> Topic: <input name=topic> <a href="help/topic.html" rel="help">(Help)</a></label></p>
For link
elements, the help
keyword indicates that
the referenced document provides help for the page as a whole.
For a
and area
elements, on some browsers, the help
keyword causes the link to use a different cursor.
icon
"The icon
keyword may be used with link
elements.
This keyword creates an external resource link.
The specified resource is an icon representing the page or site, and should be used by the user agent when representing the page in the user interface.
Icons could be auditory icons, visual icons, or other kinds of icons. If
multiple icons are provided, the user agent must select the most appropriate icon according to the
type
, media
, and sizes
attributes. If there are multiple equally appropriate icons,
user agents must use the last one declared in tree order at the time that the user
agent collected the list of icons. If the user agent tries to use an icon but that icon is
determined, upon closer examination, to in fact be inappropriate (e.g. because it uses an
unsupported format), then the user agent must try the next-most-appropriate icon as determined by
the attributes.
User agents are not required to update icons when the list of icons changes, but are encouraged to do so.
There is no default type for resources given by the icon
keyword.
However, for the purposes of determining the type of the
resource, user agents must expect the resource to be an image.
The sizes
keywords represent icon sizes in raw pixels (as
opposed to CSS pixels).
An icon that is 50 CSS pixels wide intended for displays with a device pixel density of two device pixels per CSS pixel (2x, 192dpi) would have a width of 100 raw pixels. This feature does not support indicating that a different resource is to be used for small high-resolution icons vs large low-resolution icons (e.g. 50×50 2x vs 100×100 1x).
To parse and process the attribute's value, the user agent must first split the attribute's value on ASCII whitespace, and must then parse each resulting keyword to determine what it represents.
The any
keyword represents that the
resource contains a scalable icon, e.g. as provided by an SVG image.
Other keywords must be further parsed as follows to determine what they represent:
If the keyword doesn't contain exactly one U+0078 LATIN SMALL LETTER X or U+0058 LATIN CAPITAL LETTER X character, then this keyword doesn't represent anything. Return for that keyword.
Let width string be the string before the "x
" or
"X
".
Let height string be the string after the "x
" or
"X
".
If either width string or height string start with a U+0030 DIGIT ZERO (0) character or contain any characters other than ASCII digits, then this keyword doesn't represent anything. Return for that keyword.
Apply the rules for parsing non-negative integers to width string to obtain width.
Apply the rules for parsing non-negative integers to height string to obtain height.
The keyword represents that the resource contains a bitmap icon with a width of width device pixels and a height of height device pixels.
The keywords specified on the sizes
attribute must not
represent icon sizes that are not actually available in the linked resource.
The linked resource fetch setup steps for this type of linked resource, given a
link
element el and request
request, are:
Set request's destination to
"image
".
Return true.
The process a link header steps for this type of linked resource are to do nothing.
In the absence of a link
with the icon
keyword, for
Document
objects whose URL's
scheme is an HTTP(S) scheme, user agents may
instead run these steps in parallel:
Let request be a new request whose
URL is the URL record obtained by
resolving the URL "/favicon.ico
" against the
Document
object's URL, client is the Document
object's
relevant settings object, destination is "image
",
synchronous flag is set, credentials
mode is "include
", and whose use-URL-credentials flag
is set.
Let response be the result of fetching request.
Use response's unsafe response as an icon as if it had been
declared using the icon
keyword.
The following snippet shows the top part of an application with several icons.
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>lsForums — Inbox</title>
<link rel=icon href=favicon.png sizes="16x16" type="image/png">
<link rel=icon href=windows.ico sizes="32x32 48x48" type="image/vnd.microsoft.icon">
<link rel=icon href=mac.icns sizes="128x128 512x512 8192x8192 32768x32768">
<link rel=icon href=iphone.png sizes="57x57" type="image/png">
<link rel=icon href=gnome.svg sizes="any" type="image/svg+xml">
<link rel=stylesheet href=lsforums.css>
<script src=lsforums.js></script>
<meta name=application-name content="lsForums">
</head>
<body>
...
For historical reasons, the icon
keyword may be preceded by the
keyword "shortcut
". If the "shortcut
" keyword is
present, the rel
attribute's entire value must be an
ASCII case-insensitive match for the string "shortcut icon
" (with a single U+0020 SPACE character between the tokens and
no other ASCII whitespace).
license
"The license
keyword may be used with link
,
a
, area
, and form
elements. This keyword creates a
hyperlink.
The license
keyword indicates that the referenced document
provides the copyright license terms under which the main content of the current document is
provided.
This specification does not specify how to distinguish between the main content of a document and content that is not deemed to be part of that main content. The distinction should be made clear to the user.
Consider a photo sharing site. A page on that site might describe and show a photograph, and the page might be marked up as follows:
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Exampl Pictures: Kissat</title>
<link rel="stylesheet" href="/style/default">
</head>
<body>
<h1>Kissat</h1>
<nav>
<a href="../">Return to photo index</a>
</nav>
<figure>
<img src="/pix/39627052_fd8dcd98b5.jpg">
<figcaption>Kissat</figcaption>
</figure>
<p>One of them has six toes!</p>
<p><small><a rel="license" href="http://www.opensource.org/licenses/mit-license.php">MIT Licensed</a></small></p>
<footer>
<a href="/">Home</a> | <a href="../">Photo index</a>
<p><small>© copyright 2009 Exampl Pictures. All Rights Reserved.</small></p>
</footer>
</body>
</html>
In this case the license
applies to just the photo (the main
content of the document), not the whole document. In particular not the design of the page
itself, which is covered by the copyright given at the bottom of the document. This could be made
clearer in the styling (e.g. making the license link prominently positioned near the photograph,
while having the page copyright in light small text at the foot of the page).
Synonyms: For historical reasons, user agents must also treat the keyword
"copyright
" like the license
keyword.
manifest
"The manifest
keyword may be used with link
elements.
This keyword creates an external resource link.
The manifest
keyword indicates the manifest file that provides
metadata associated with the current document.
There is no default type for resources given by the manifest
keyword.
When a web application is not installed, the appropriate time to fetch and process the linked resource for this link type is when the user agent deems it necessary. For example, when the user chooses to install the web application.
For an installed web application, the appropriate times to fetch and process the linked resource for this link type are:
When the external resource link is created on a link
element
that is already browsing-context connected.
When the external resource link's link
element becomes
browsing-context connected.
When the href
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
In any case, only the first link
element in tree order whose rel
attribute contains the token manifest
may be used.
A user agent must not delay the load event for this link type.
The linked resource fetch setup steps for this type of linked resource, given a
link
element el and request
request, are:
Let navigable be el's node document's node navigable.
If navigable is null, then return false.
If navigable is not a top-level traversable, then return false.
Set request's initiator to
"manifest
".
Set request's destination to
"manifest
".
Set request's mode to "cors
".
Set request's credentials
mode to the CORS settings attribute credentials mode for el's
crossorigin
content attribute.
Return true.
To process this type of linked resource given
a link
element el, boolean success, response response, and byte sequence
bodyBytes:
If response's Content-Type metadata is not a JSON MIME type, then set success to false.
If success is true:
Let document URL be el's node document's URL.
Let manifest URL be response's URL.
Process the manifest given document URL, manifest URL, and bodyBytes. MANIFEST
The process a link header steps for this type of linked resource are to do nothing.
modulepreload
"The modulepreload
keyword may be used with
link
elements. This keyword creates an external resource link. This
keyword is body-ok.
The modulepreload
keyword is a specialized alternative
to the preload
keyword, with a processing model geared toward
preloading module scripts. In particular, it uses the specific
fetch behavior for module scripts (including, e.g., a different interpretation of the crossorigin
attribute), and places the result into the
appropriate module map for later evaluation. In
contrast, a similar external resource link using the preload
keyword would place the result in the preload cache, without
affecting the document's module map.
Additionally, implementations can take advantage of the fact that module scripts declare their dependencies in order to fetch the specified module's
dependency as well. This is intended as an optimization opportunity, since the user agent knows
that, in all likelihood, those dependencies will also be needed later. It will not generally be
observable without using technology such as service workers, or monitoring on the server side.
Notably, the appropriate load
or error
events will occur after the specified module is fetched, and
will not wait for any dependencies.
A user agent must not delay the load event for this link type.
The appropriate times to fetch and process the linked resource for such a link are:
When the external resource link is created on a link
element
that is already browsing-context connected.
When the external resource link's link
element becomes
browsing-context connected.
When the href
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
Unlike some other link relations, changing the relevant attributes (such as as
, crossorigin
, and
referrerpolicy
) of such a link
does not trigger a new fetch. This is because the document's module map has already been populated by a previous
fetch, and so re-fetching would be pointless.
The fetch and process the linked resource algorithm for modulepreload
links, given a link
element
el, is as follows:
If el's href
attribute's value is the
empty string, then return.
Let destination be the current state of el's as
attribute (a destination), or "script
" if
it is in no state.
If destination is not script-like, then queue an element
task on the networking task source given el to fire an event named error
at el, and return.
Let url be the result of encoding-parsing a URL given
el's href
attribute's value, relative to
el's node document.
If url is failure, then return.
Let settings object be el's node document's relevant settings object.
Let credentials mode be the CORS settings attribute credentials
mode for el's crossorigin
attribute.
Let cryptographic nonce be el.[[CryptographicNonce]].
Let integrity metadata be the value of el's integrity
attribute, if it is specified, or the empty string
otherwise.
If el does not have an integrity
attribute, then set integrity metadata to the result of resolving a module
integrity metadata with url and settings object.
Let referrer policy be the current state of el's referrerpolicy
attribute.
Let fetch priority be the current state of el's fetchpriority
attribute.
Let options be a script fetch options whose cryptographic nonce is cryptographic
nonce, integrity metadata is
integrity metadata, parser
metadata is "not-parser-inserted
", credentials mode is credentials
mode, referrer
policy is referrer policy, and fetch priority is
fetch priority.
Fetch a modulepreload module script graph given url, destination, settings object, options, and with the following steps given result:
If result is null, then fire an
event named error
at el,
and return.
Fire an event named load
at el.
The process a link header steps for this type of linked resource are to do nothing.
The following snippet shows the top part of an application with several modules preloaded:
<!DOCTYPE html>
<html lang="en">
<title>IRCFog</title>
<link rel="modulepreload" href="app.mjs">
<link rel="modulepreload" href="helpers.mjs">
<link rel="modulepreload" href="irc.mjs">
<link rel="modulepreload" href="fog-machine.mjs">
<script type="module" src="app.mjs">
...
Assume that the module graph for the application is as follows:
Here we see the application developer has used modulepreload
to declare all of the modules in their module graph,
ensuring that the user agent initiates fetches for them all. Without such preloading, the user
agent might need to go through multiple network roundtrips before discovering helpers.mjs
, if technologies such as HTTP/2 Server Push are not in play. In
this way, modulepreload
link
elements can be
used as a sort of "manifest" of the application's modules.
The following code shows how modulepreload
links can
be used in conjunction with import()
to ensure network fetching is done ahead of
time, so that when import()
is called, the module is already ready (but not
evaluated) in the module map:
<link rel="modulepreload" href="awesome-viewer.mjs">
<button onclick="import('./awesome-viewer.mjs').then(m => m.view())">
View awesome thing
</button>
nofollow
"The nofollow
keyword may be used with a
,
area
, and form
elements. This keyword does not create a
hyperlink, but annotates any other
hyperlinks created by the element (the implied hyperlink, if no other keywords create one).
The nofollow
keyword indicates that the link is not endorsed
by the original author or publisher of the page, or that the link to the referenced document was
included primarily because of a commercial relationship between people affiliated with the two
pages.
noopener
"The noopener
keyword may be used with a
,
area
, and form
elements. This keyword does not create a
hyperlink, but annotates any other
hyperlinks created by the element (the implied hyperlink, if no other keywords create one).
The keyword indicates that any newly created top-level traversable which results
from following the hyperlink will not contain an auxiliary browsing
context. E.g., the resulting Window
's opener
getter will return null.
See also the processing model.
This typically creates a top-level traversable with an auxiliary browsing
context (assuming there is no existing navigable whose target name is "example
"):
<a href=help.html target=example>Help!</a>
This creates a top-level traversable with a non-auxiliary browsing context (assuming the same thing):
<a href=help.html target=example rel=noopener>Help!</a>
These are equivalent and only navigate the parent navigable:
<a href=index.html target=_parent>Home</a>
<a href=index.html target=_parent rel=noopener>Home</a>
noreferrer
"The noreferrer
keyword may be used with a
,
area
, and form
elements. This keyword does not create a
hyperlink, but annotates any other
hyperlinks created by the element (the implied hyperlink, if no other keywords create one).
It indicates that no referrer information is to be leaked when following the link and also
implies the noopener
keyword behavior under the same
conditions.
See also the processing model where referrer is directly manipulated.
<a href="..." rel="noreferrer" target="_blank">
has the same behavior as <a href="..." rel="noreferrer noopener" target="_blank">
.
opener
"The opener
keyword may be used with a
,
area
, and form
elements. This keyword does not create a
hyperlink, but annotates any other
hyperlinks created by the element (the implied hyperlink, if no other keywords create one).
The keyword indicates that any newly created top-level traversable which results from following the hyperlink will contain an auxiliary browsing context.
See also the processing model.
In the following example the opener
is used to allow the help
page popup to navigate its opener, e.g., in case what the user is looking for can be found
elsewhere. An alternative might be to use a named target, rather than _blank
, but this has the potential to clash with existing names.
<a href="..." rel=opener target=_blank>Help!</a>
pingback
"The pingback
keyword may be used with link
elements. This keyword creates an external resource
link. This keyword is body-ok.
For the semantics of the pingback
keyword, see
Pingback 1.0. PINGBACK
preconnect
"The preconnect
keyword may be used with link
elements. This keyword creates an external resource
link. This keyword is body-ok.
The preconnect
keyword indicates that preemptively
initiating a connection to the origin of the specified resource is likely to be
beneficial, as it is highly likely that the user will require resources located at that
origin, and the user experience would be improved by preempting the latency costs
associated with establishing the connection.
There is no default type for resources given by the preconnect
keyword.
A user agent must not delay the load event for this link type.
The appropriate times to fetch and process this type of link are:
When the external resource link is created on a link
element
that is already browsing-context connected.
When the external resource link's link
element becomes
browsing-context connected.
When the href
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
When the crossorigin
attribute of the
link
element of an external resource
link that is already browsing-context connected is set, changed, or
removed.
The fetch and process the linked resource steps for this type of linked resource,
given a link
element el, are to create link options from el and
to preconnect given the result.
The process a link header step for this type of linked resource given a link processing options options are to preconnect given options.
To preconnect given a link processing options options:
If options's href is an empty string, return.
Let url be the result of encoding-parsing a URL given options's href, relative to options's base URL.
Passing the base URL instead of a document or environment is tracked by issue #9715.
If url is failure, then return.
If url's scheme is not an HTTP(S) scheme, then return.
Let partitionKey be the result of determining the network partition key given options's environment.
Let useCredentials be true.
If options's crossorigin is Anonymous and options's origin does not have the same origin as url's origin, then set useCredentials to false.
The user agent should obtain a connection given partitionKey, url's origin, and useCredentials.
This connection is obtained but not used directly. It will remain in the connection pool for subsequent use.
The user agent should attempt to initiate a preconnect and perform the full connection handshake (DNS+TCP for HTTP, and DNS+TCP+TLS for HTTPS origins) whenever possible, but is allowed to elect to perform a partial handshake (DNS only for HTTP, and DNS or DNS+TCP for HTTPS origins), or skip it entirely, due to resource constraints or other reasons.
The optimal number of connections per origin is dependent on the negotiated protocol, users current connectivity profile, available device resources, global connection limits, and other context specific variables. As a result, the decision for how many connections should be opened is deferred to the user agent.
prefetch
"The prefetch
keyword may be used with link
elements. This keyword creates an external resource
link. This keyword is body-ok.
The prefetch
keyword indicates that preemptively fetching and caching the specified resource or same-site document is
likely to be beneficial, as it is highly likely that the user will require this resource for
future navigations.
There is no default type for resources given by the prefetch
keyword.
The appropriate times to fetch and process this type of link are:
When the external resource link is created on a link
element
that is already browsing-context connected.
When the external resource link's link
element becomes
browsing-context connected.
When the href
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
When the crossorigin
attribute of the
link
element of an external resource
link that is already browsing-context connected is set, changed, or
removed.
The fetch and process the linked resource algorithm for prefetch
links, given a link
element
el, is as follows:
If el's href
attribute's value is the
empty string, then return.
Let options be the result of creating link options from el.
Set options's destination to the empty string.
Let request be the result of creating a link request given options.
If request is null, then return.
Set request's initiator to
"prefetch
".
Let processPrefetchResponse be the following steps given a response response and null, failure, or a byte sequence bytesOrNull:
If response is a network error, fire an event named error
at el.
Otherwise, fire an event named load
at el.
The user agent should fetch request, with processResponseConsumeBody set to processPrefetchResponse. User agents may delay the fetching of request to prioritize other requests that are necessary for the current document.
The process a link header steps for this type of linked resource are to do nothing.
preload
"The preload
keyword may be used with link
elements. This keyword creates an external resource
link. This keyword is body-ok.
The preload
keyword indicates that the user agent will
preemptively fetch and cache the specified resource according
to the potential destination given by the
as
attribute, and the priority given by the fetchpriority
attribute, as it is highly likely that the
user will require this resource for the current navigation.
User-agents might perform additional operations when a resource is loaded, such as preemptively decoding images or creating stylesheets. However, these additional operations cannot have observable effects.
There is no default type for resources given by the preload
keyword.
A user agent must not delay the load event for this link type.
The appropriate times to fetch and process the linked resource for such a link are:
When the external resource link is created on a link
element
that is already browsing-context connected.
When the external resource link's link
element becomes
browsing-context connected.
When the href
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
When the as
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
When the type
attribute of the link
element of an external resource link that is already browsing-context
connected, but was previously not obtained due to the type
attribute specifying an unsupported type for the request
destination, is set, removed, or
changed.
When the media
attribute of the link
element of an external resource link that is already browsing-context
connected, but was previously not obtained due to the media
attribute not
matching the environment, is changed or
removed.
A Document
has a map of preloaded resources, which is an
ordered map, initially empty.
A preload key is a struct. It has the following items:
same-origin
", "cors
", or
"no-cors
"
A preload entry is a struct. It has the following items:
To consume a preloaded resource for Window
window,
given a URL url, a string destination, a string
mode, a string credentialsMode, a string integrityMetadata, and
onResponseAvailable, which is an algorithm accepting a response:
Let key be a preload key whose URL is url, destination is destination, mode is mode, and credentials mode is credentialsMode.
Let preloads be window's associated Document
's map of
preloaded resources.
If key does not exist in preloads, then return false.
Let entry be preloads[key].
Let consumerIntegrityMetadata be the result of parsing integrityMetadata.
Let preloadIntegrityMetadata be the result of parsing entry's integrity metadata.
If none of the following conditions apply:
consumerIntegrityMetadata is no metadata
;
consumerIntegrityMetadata is equal to preloadIntegrityMetadata; or
This comparison would ignore unknown integrity options. See issue #116.
then return false.
A mistmatch in integrity metadata between the preload and the consumer, even if both match the data, would lead to an additional fetch from the network.
It is important that network errors are added to the preload cache so that if a preload request results in an error, the erroneous response isn't re-requested from the network later. This also has security implications; consider the case where a developer specifies subresource integrity metadata on a preload request, but not the following resource request. If the preload request fails subresource integrity verification and is discarded, the resource request will fetch and consume a potentially-malicious response from the network without verifying its integrity. SRI
Remove preloads[key].
If entry's response is null, then set entry's on response available to onResponseAvailable.
Otherwise, call onResponseAvailable with entry's response.
Return true.
For the purposes of this section, a string type matches a string destination if the following algorithm returns true:
If type is an empty string, then return true.
If destination is "fetch
", then return true.
Let mimeTypeRecord be the result of parsing type.
If mimeTypeRecord is failure, then return false.
If mimeTypeRecord is not supported by the user agent, then return false.
If any of the following are true:
destination is "audio
" or "video
", and mimeTypeRecord is an
audio or video MIME type;
destination is a script-like destination and mimeTypeRecord is a JavaScript MIME type;
destination is "image
" and
mimeTypeRecord is an image MIME type;
destination is "font
" and
mimeTypeRecord is a font MIME type;
destination is "json
" and
mimeTypeRecord is a JSON MIME type;
destination is "style
" and
mimeTypeRecord's essence is
text/css
; or
destination is "track
" and
mimeTypeRecord's essence is
text/vtt
,
then return true.
Return false.
To create a preload key for a request request, return a new preload key whose URL is request's URL, destination is request's destination, mode is request's mode, and credentials mode is request's credentials mode.
To translate a preload destination given a string destination:
If destination is not "fetch
", "font
",
"image
", "script
", "style
",
or "track
", then return null.
Return the result of translating destination.
To preload given a link processing options options and an optional processResponse, which is an algorithm accepting a response:
If options's type doesn't match options's destination, then return.
If options's destination is
"image
" and options's source set is not null, then set options's href to the result of selecting an image source from options's source set.
Let request be the result of creating a link request given options.
If request is null, then return.
Let unsafeEndTime be 0.
Let entry be a new preload entry whose integrity metadata is options's integrity.
Let key be the result of creating a preload key given request.
If options's document is "pending
", then set request's initiator type to "early
hint
".
Let controller be null.
Let reportTiming given a Document
document be to
report timing for controller given document's relevant
global object.
Set controller to the result of fetching request, with processResponseConsumeBody set to the following steps given a response response and null, failure, or a byte sequence bodyBytes:
If bodyBytes is a byte sequence, then set response's body to bodyBytes as a body.
By using processResponseConsumeBody, we have extracted the entire body. This is necessary to ensure the preloader loads the entire body from the network, regardless of whether the preload will be consumed (which is uncertain at this point). This step then resets the request's body to a new body containing the same bytes, so that other specifications can read from it at the time of actual consumption, despite us having already done so once.
Otherwise, set response to a network error.
Set unsafeEndTime to the unsafe shared current time.
If options's document is not null, then call reportTiming given options's document.
If entry's on response available is null, then set entry's response to response; otherwise call entry's on response available given response.
If processResponse is given, then call processResponse with response.
Let commit be the following steps given a Document
document:
If entry's response is not null, then call reportTiming given document.
Set document's map of preloaded resources[key] to entry.
If options's document is null, then set options's on document ready to commit. Otherwise, call commit with options's document.
The fetch and process the linked resource steps for this type of linked resource,
given a link
element el, are:
Update the source set for el.
Let options be the result of creating link options from el.
Preload options, with the following steps given a response response:
If response is a network error, fire an event named error
at el. Otherwise, fire an event named
load
at el.
The actual browsers' behavior is different from the spec here, and the feasibility of changing the behavior has not yet been investigated. See issue #1142.
The process a link header step for this type of link given a link processing options options is to preload options.
privacy-policy
"The privacy-policy
keyword may be used with
link
, a
, and area
elements. This keyword creates a
hyperlink.
The privacy-policy
keyword indicates that the
referenced document contains information about the data collection and usage practices that apply
to the current document, as described in more detail in Additional Link Relation
Types. The referenced document may be a standalone privacy policy, or a specific section of
some more general document. RFC6903
search
"The search
keyword may be used with link
,
a
, area
, and form
elements. This keyword creates a
hyperlink.
The search
keyword indicates that the referenced document
provides an interface specifically for searching the document and its related resources.
OpenSearch description documents can be used with link
elements and
the search
link type to enable user agents to autodiscover search
interfaces. OPENSEARCH
stylesheet
"The stylesheet
keyword may be used with link
elements. This keyword creates an external resource
link that contributes to the styling processing model. This keyword is
body-ok.
The specified resource is a CSS style sheet that describes how to present the document.
If the alternate
keyword is also specified on the
link
element, then the link is an
alternative style sheet; in this case, the title
attribute
must be specified on the link
element, with a non-empty value.
The default type for resources given by the stylesheet
keyword is text/css
.
A link
element of this type is implicitly potentially render-blocking
if the element was created by its node document's parser.
When the disabled
attribute of a link
element with a stylesheet
keyword is set, disable the associated CSS style sheet.
The appropriate times to fetch and process this type of link are:
When the external resource link is created on a link
element
that is already browsing-context connected.
When the external resource link's link
element becomes
browsing-context connected.
When the href
attribute of the link
element of an external resource link that is already browsing-context
connected is changed.
When the disabled
attribute of the
link
element of an external resource link that is already
browsing-context connected is set, changed, or removed.
When the crossorigin
attribute of the
link
element of an external resource
link that is already browsing-context connected is set, changed, or
removed.
When the type
attribute of the link
element of an external resource link that is already browsing-context
connected is set or changed to a value that does not or no longer matches the Content-Type metadata of the previous obtained external resource, if
any.
When the type
attribute of the link
element of an external resource link that is already browsing-context
connected, but was previously not obtained due to the type
attribute specifying an unsupported type, is removed or
changed.
When the external resource link that is already browsing-context connected changes from being an alternative style sheet to not being one, or vice versa.
Quirk: If the document has been set to quirks mode, has the
same origin as the URL of the external resource,
and the Content-Type metadata of the external resource is not a
supported style sheet type, the user agent must instead assume it to be text/css
.
The linked resource fetch setup steps for this type of linked resource, given a
link
element el and request
request, are:
If el's disabled
attribute is set,
then return false.
If el contributes a script-blocking style sheet, append el to its node document's script-blocking style sheet set.
If el's media
attribute's value
matches the environment and el is
potentially render-blocking, then block rendering on
el.
If el is currently render-blocking, then set request's render-blocking to true.
Return true.
See issue #968 for plans
to use the CSSOM fetch a CSS
style sheet algorithm instead of the default fetch and process the linked
resource algorithm. In the meantime, any critical
subresource request should have its render-blocking set to whether or not the
link
element is currently render-blocking.
To process this type of linked resource
given a link
element el, boolean success, response response, and byte sequence
bodyBytes:
If the resource's Content-Type metadata is not
text/css
, then set success to false.
If el no longer creates an external resource link that contributes to the styling processing model, or if, since the resource in question was fetched, it has become appropriate to fetch it again, then:
Remove el from el's node document's script-blocking style sheet set.
Return.
If el has an associated CSS style sheet, remove the CSS style sheet.
If success is true, then:
Create a CSS style sheet with the following properties:
text/css
response's URL list[0]
We provide a URL here on the assumption that w3c/csswg-drafts issue #9316 will be fixed.
el
The media
attribute of el.
This is a reference to the (possibly absent at this time) attribute, rather than a copy of the attribute's current value. CSSOM defines what happens when the attribute is dynamically set, changed, or removed.
The title
attribute of el, if
el is in a document tree, or the empty string otherwise.
This is similarly a reference to the attribute, rather than a copy of the attribute's current value.
Set if the link is an alternative style sheet and el's explicitly enabled is false; unset otherwise.
Set if the resource is CORS-same-origin; unset otherwise.
null
Left at its default value.
Left uninitialized.
This doesn't seem right. Presumably we should be using bodyBytes? Tracked as issue #2997.
The CSS environment encoding is the result of running the following steps: CSSSYNTAX
Fire an event named load
at el.
Otherwise, fire an event named error
at el.
If el contributes a script-blocking style sheet, then:
Assert: el's node document's script-blocking style sheet set contains el.
Remove el from its node document's script-blocking style sheet set.
Unblock rendering on el.
The process a link header steps for this type of linked resource are to do nothing.
tag
"The tag
keyword may be used with a
and
area
elements. This keyword creates a hyperlink.
The tag
keyword indicates that the tag that the
referenced document represents applies to the current document.
Since it indicates that the tag applies to the current document, it would be inappropriate to use this keyword in the markup of a tag cloud, which lists the popular tags across a set of pages.
This document is about some gems, and so it is tagged with "https://en.wikipedia.org/wiki/Gemstone
" to unambiguously categorize it as applying
to the "jewel" kind of gems, and not to, say, the towns in the US, the Ruby package format, or
the Swiss locomotive class:
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>My Precious</title>
</head>
<body>
<header><h1>My precious</h1> <p>Summer 2012</p></header>
<p>Recently I managed to dispose of a red gem that had been
bothering me. I now have a much nicer blue sapphire.</p>
<p>The red gem had been found in a bauxite stone while I was digging
out the office level, but nobody was willing to haul it away. The
same red gem stayed there for literally years.</p>
<footer>
Tags: <a rel=tag href="https://en.wikipedia.org/wiki/Gemstone">Gemstone</a>
</footer>
</body>
</html>
In this document, there are two articles. The "tag
"
link, however, applies to the whole page (and would do so wherever it was placed, including if it
was within the article
elements).
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Gem 4/4</title>
</head>
<body>
<article>
<h1>801: Steinbock</h1>
<p>The number 801 Gem 4/4 electro-diesel has an ibex and was rebuilt in 2002.</p>
</article>
<article>
<h1>802: Murmeltier</h1>
<figure>
<img src="https://upload.wikimedia.org/wikipedia/commons/b/b0/Trains_de_la_Bernina_en_hiver_2.jpg"
alt="The 802 was red with pantographs and tall vents on the side.">
<figcaption>The 802 in the 1980s, above Lago Bianco.</figcaption>
</figure>
<p>The number 802 Gem 4/4 electro-diesel has a marmot and was rebuilt in 2003.</p>
</article>
<p class="topic"><a rel=tag href="https://en.wikipedia.org/wiki/Rhaetian_Railway_Gem_4/4">Gem 4/4</a></p>
</body>
</html>
terms-of-service
"The terms-of-service
keyword may be used with
link
, a
, and area
elements. This keyword creates a
hyperlink.
The terms-of-service
keyword indicates that the
referenced document contains information about the agreements between the current document's
provider and users who wish to use the current document, as described in more detail in
Additional Link Relation Types. RFC6903
Some documents form part of a sequence of documents.
A sequence of documents is one where each document can have a previous sibling and a next sibling. A document with no previous sibling is the start of its sequence, a document with no next sibling is the end of its sequence.
A document may be part of multiple sequences.
next
"The next
keyword may be used with link
,
a
, area
, and form
elements. This keyword creates a
hyperlink.
The next
keyword indicates that the document is part of a
sequence, and that the link is leading to the document that is the next logical document in the
sequence.
When the next
keyword is used with a link
element, user agents should process such links as if they were using one of the dns-prefetch
, preconnect
, or
prefetch
keywords. Which keyword the user agent wishes to use
is implementation-dependent; for example, a user agent may wish to use the less-costly preconnect
processing model when trying to conserve data, battery
power, or processing power, or may wish to pick a keyword depending on heuristic analysis of past
user behavior in similar scenarios.
prev
"The prev
keyword may be used with link
,
a
, area
, and form
elements. This keyword creates a
hyperlink.
The prev
keyword indicates that the document is part of a
sequence, and that the link is leading to the document that is the previous logical document in
the sequence.
Synonyms: For historical reasons, user agents must also treat the keyword
"previous
" like the prev
keyword.
Extensions to the predefined set of link types may be registered on the microformats page for existing rel values. MFREL
Anyone is free to edit the microformats page for existing rel values at any time to add a type. Extension types must be specified with the following information:
The actual value being defined. The value should not be confusingly similar to any other defined value (e.g. differing only in case).
If the value contains a U+003A COLON character (:), it must also be an absolute URL.
link
One of the following:
link
elements.link
element; it creates a
hyperlink.link
element; it creates an external
resource link.a
and area
One of the following:
a
and area
elements.a
and area
elements; it creates a
hyperlink.a
and area
elements; it creates
an external resource link.a
and area
elements; it annotates other hyperlinks
created by the element.form
One of the following:
form
elements.form
elements; it creates a
hyperlink.form
elements; it creates an external
resource link.form
elements; it annotates other hyperlinks created by the
element.A short non-normative description of what the keyword's meaning is.
A link to a more detailed description of the keyword's semantics and requirements. It could be another page on the wiki, or a link to an external page.
A list of other keyword values that have exactly the same processing requirements. Authors should not use the values defined to be synonyms, they are only intended to allow user agents to support legacy content. Anyone may remove synonyms that are not used in practice; only names that need to be processed as synonyms for compatibility with legacy content are to be registered in this way.
One of the following:
If a keyword is found to be redundant with existing values, it should be removed and listed as a synonym for the existing value.
If a keyword is registered in the "proposed" state for a period of a month or more without being used or specified, then it may be removed from the registry.
If a keyword is added with the "proposed" status and found to be redundant with existing values, it should be removed and listed as a synonym for the existing value. If a keyword is added with the "proposed" status and found to be harmful, then it should be changed to "discontinued" status.
Anyone can change the status at any time, but should only do so in accordance with the definitions above.
Conformance checkers must use the information given on the microformats page for existing rel values to establish if a value is allowed or not: values defined in this specification or marked as "proposed" or "ratified" must be accepted when used on the elements for which they apply as described in the "Effect on..." field, whereas values marked as "discontinued" or not listed in either this specification or on the aforementioned page must be rejected as invalid. Conformance checkers may cache this information (e.g. for performance reasons or to avoid the use of unreliable network connectivity).
When an author uses a new type not defined by either this specification or the wiki page, conformance checkers should offer to add the value to the wiki, with the details described above, with the "proposed" status.
Types defined as extensions in the microformats
page for existing rel values with the status "proposed" or "ratified" may be used with the
rel
attribute on link
, a
, and area
elements in accordance to the "Effect on..." field. MFREL
The ins
and del
elements represent edits to the document.
ins
elementcite
datetime
HTMLModElement
.The ins
element represents an addition to the document.
The following represents the addition of a single paragraph:
<aside>
<ins>
<p> I like fruit. </p>
</ins>
</aside>
As does the following, because everything in the aside
element here counts as
phrasing content and therefore there is just one paragraph:
<aside>
<ins>
Apples are <em>tasty</em>.
</ins>
<ins>
So are pears.
</ins>
</aside>
ins
elements should not cross implied paragraph
boundaries.
The following example represents the addition of two paragraphs, the second of which was
inserted in two parts. The first ins
element in this example thus crosses a
paragraph boundary, which is considered poor form.
<aside>
<!-- don't do this -->
<ins datetime="2005-03-16 00:00Z">
<p> I like fruit. </p>
Apples are <em>tasty</em>.
</ins>
<ins datetime="2007-12-19 00:00Z">
So are pears.
</ins>
</aside>
Here is a better way of marking this up. It uses more elements, but none of the elements cross implied paragraph boundaries.
<aside>
<ins datetime="2005-03-16 00:00Z">
<p> I like fruit. </p>
</ins>
<ins datetime="2005-03-16 00:00Z">
Apples are <em>tasty</em>.
</ins>
<ins datetime="2007-12-19 00:00Z">
So are pears.
</ins>
</aside>
del
elementcite
datetime
HTMLModElement
.The del
element represents a removal from the document.
del
elements should not cross implied paragraph
boundaries.
The following shows a "to do" list where items that have been done are crossed-off with the date and time of their completion.
<h1>To Do</h1>
<ul>
<li>Empty the dishwasher</li>
<li><del datetime="2009-10-11T01:25-07:00">Watch Walter Lewin's lectures</del></li>
<li><del datetime="2009-10-10T23:38-07:00">Download more tracks</del></li>
<li>Buy a printer</li>
</ul>
ins
and del
elementsThe cite
attribute
may be used to specify the URL of a document that
explains the change. When that document is long, for instance the minutes of a meeting, authors
are encouraged to include a fragment pointing to the
specific part of that document that discusses the change.
If the cite
attribute is present, it must be a valid
URL potentially surrounded by spaces that explains the change. To obtain
the corresponding citation link, the value of the attribute must be parsed relative to the element's node document. User agents may
allow users to follow such citation links, but they are primarily intended for private use (e.g.,
by server-side scripts collecting statistics about a site's edits), not for readers.
The datetime
attribute may be used to specify the time and date of the change.
If present, the datetime
attribute's value must be a
valid date string with optional time.
User agents must parse the datetime
attribute according
to the parse a date or time string algorithm. If that doesn't return a date or a global date and time,
then the modification has no associated timestamp (the value is non-conforming; it is not a
valid date string with optional time). Otherwise, the modification is marked as
having been made at the given date or global date and time. If the given value is a global date and time then user agents should use the associated
time-zone offset information to determine which time zone to present the given datetime in.
This value may be shown to the user, but it is primarily intended for private use.
The ins
and del
elements must implement the
HTMLModElement
interface:
[Exposed=Window]
interface HTMLModElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString cite;
[CEReactions] attribute DOMString dateTime;
};
The cite
IDL
attribute must reflect the element's cite
content
attribute. The dateTime
IDL attribute must reflect the
element's datetime
content attribute.
Since the ins
and del
elements do not affect paragraphing, it is possible, in some cases where paragraphs are implied (without explicit p
elements), for an
ins
or del
element to span both an entire paragraph or other
non-phrasing content elements and part of another paragraph. For example:
<section>
<ins>
<p>
This is a paragraph that was inserted.
</p>
This is another paragraph whose first sentence was inserted
at the same time as the paragraph above.
</ins>
This is a second sentence, which was there all along.
</section>
By only wrapping some paragraphs in p
elements, one can even get the end of one
paragraph, a whole second paragraph, and the start of a third paragraph to be covered by the same
ins
or del
element (though this is very confusing, and not considered
good practice):
<section>
This is the first paragraph. <ins>This sentence was
inserted.
<p>This second paragraph was inserted.</p>
This sentence was inserted too.</ins> This is the
third paragraph in this example.
<!-- (don't do this) -->
</section>
However, due to the way implied paragraphs are defined, it is
not possible to mark up the end of one paragraph and the start of the very next one using the same
ins
or del
element. You instead have to use one (or two) p
element(s) and two ins
or del
elements, as for example:
<section>
<p>This is the first paragraph. <del>This sentence was
deleted.</del></p>
<p><del>This sentence was deleted too.</del> That
sentence needed a separate <del> element.</p>
</section>
Partly because of the confusion described above, authors are strongly encouraged to always mark
up all paragraphs with the p
element, instead of having ins
or
del
elements that cross implied paragraphs
boundaries.
The content models of the ol
and ul
elements do not allow
ins
and del
elements as children. Lists always represent all their
items, including items that would otherwise have been marked as deleted.
To indicate that an item is inserted or deleted, an ins
or del
element can be wrapped around the contents of the li
element. To indicate that an
item has been replaced by another, a single li
element can have one or more
del
elements followed by one or more ins
elements.
In the following example, a list that started empty had items added and removed from it over time. The bits in the example that have been emphasized show the parts that are the "current" state of the list. The list item numbers don't take into account the edits, though.
<h1>Stop-ship bugs</h1>
<ol>
<li><ins datetime="2008-02-12T15:20Z">Bug 225:
Rain detector doesn't work in snow</ins></li>
<li><del datetime="2008-03-01T20:22Z"><ins datetime="2008-02-14T12:02Z">Bug 228:
Water buffer overflows in April</ins></del></li>
<li><ins datetime="2008-02-16T13:50Z">Bug 230:
Water heater doesn't use renewable fuels</ins></li>
<li><del datetime="2008-02-20T21:15Z"><ins datetime="2008-02-16T14:25Z">Bug 232:
Carbon dioxide emissions detected after startup</ins></del></li>
</ol>
In the following example, a list that started with just fruit was replaced by a list with just colors.
<h1>List of <del>fruits</del><ins>colors</ins></h1>
<ul>
<li><del>Lime</del><ins>Green</ins></li>
<li><del>Apple</del></li>
<li>Orange</li>
<li><del>Pear</del></li>
<li><ins>Teal</ins></li>
<li><del>Lemon</del><ins>Yellow</ins></li>
<li>Olive</li>
<li><ins>Purple</ins></li>
</ul>
The elements that form part of the table model have complicated content model requirements that
do not allow for the ins
and del
elements, so indicating edits to a
table can be difficult.
To indicate that an entire row or an entire column has been added or removed, the entire
contents of each cell in that row or column can be wrapped in ins
or del
elements (respectively).
Here, a table's row has been added:
<table>
<thead>
<tr> <th> Game name <th> Game publisher <th> Verdict
<tbody>
<tr> <td> Diablo 2 <td> Blizzard <td> 8/10
<tr> <td> Portal <td> Valve <td> 10/10
<tr> <td> <ins>Portal 2</ins> <td> <ins>Valve</ins> <td> <ins>10/10</ins>
</table>
Here, a column has been removed (the time at which it was removed is given also, as is a link to the page explaining why):
<table>
<thead>
<tr> <th> Game name <th> Game publisher <th> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">Verdict</del>
<tbody>
<tr> <td> Diablo 2 <td> Blizzard <td> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">8/10</del>
<tr> <td> Portal <td> Valve <td> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">10/10</del>
<tr> <td> Portal 2 <td> Valve <td> <del cite="/edits/r192" datetime="2011-05-02 14:23Z">10/10</del>
</table>
Generally speaking, there is no good way to indicate more complicated edits (e.g. that a cell was removed, moving all subsequent cells up or to the left).
picture
elementsource
elements, followed by one img
element,
optionally intermixed with script-supporting elements.[Exposed=Window]
interface HTMLPictureElement : HTMLElement {
[HTMLConstructor] constructor();
};
HTMLPictureElement
.The picture
element is a container
which provides multiple sources to its contained img
element
to allow authors to declaratively control or give hints to the user agent about which image resource to use,
based on the screen pixel density, viewport size, image format, and other factors.
It represents its children.
The picture
element is somewhat different from the similar-looking
video
and audio
elements. While all of them contain source
elements, the source
element's src
attribute
has no meaning when the element is nested within a picture
element, and the resource
selection algorithm is different. Also, the picture
element itself does not display
anything; it merely provides a context for its contained img
element that enables it
to choose from multiple URLs.
source
elementpicture
element, before the img
element.track
elements.type
media
src
(in audio
or video
)srcset
(in picture
)sizes
(in picture
)width
(in picture
)height
(in picture
)[Exposed=Window]
interface HTMLSourceElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString src;
[CEReactions] attribute DOMString type;
[CEReactions] attribute USVString srcset;
[CEReactions] attribute DOMString sizes;
[CEReactions] attribute DOMString media;
[CEReactions] attribute unsigned long width;
[CEReactions] attribute unsigned long height;
};
HTMLSourceElement
.The source
element allows authors to specify multiple alternative
source sets for img
elements or multiple alternative
media resources for media
elements. It does not represent anything on its own.
The type
attribute
may be present. If present, the value must be a valid MIME type string.
The media
attribute may also be present. If present, the value must contain a valid media query
list. The user agent will skip to the next source
element if the value does
not match the environment.
The media
attribute is only evaluated
once during the resource selection algorithm
for media elements. In contrast, when using the
picture
element, the user agent will react to
changes in the environment.
The remainder of the requirements depend on whether the parent is a picture
element or a media element:
source
element's parent is a picture
elementThe srcset
attribute must be present, and is a srcset attribute.
The srcset
attribute contributes the image sources to the source set, if the
source
element is selected.
If the srcset
attribute has any image candidate strings using a width descriptor, the
sizes
attribute may also be present. If, additionally,
the following sibling img
element does not allow
auto-sizes, the sizes
attribute must be present.
The sizes
attribute is a sizes attribute, which contributes the source size to
the source set, if the source
element is selected.
If the img
element allows auto-sizes, then the sizes
attribute can be omitted on previous sibling
source
elements. In such cases, it is equivalent to specifying auto
.
The source
element supports dimension attributes. The
img
element can use the width
and height
attributes of a source
element, instead of
those on the img
element itself, to determine its rendered dimensions and
aspect-ratio, as defined in the Rendering section.
The type
attribute gives the type of the images in the
source set, to allow the user agent to skip to the next source
element
if it does not support the given type.
If the type
attribute is not
specified, the user agent will not select a different source
element if it finds
that it does not support the image format after fetching it.
When a source
element has a following sibling source
element or
img
element with a srcset
attribute
specified, it must have at least one of the following:
A media
attribute specified with a value that,
after stripping leading and trailing
ASCII whitespace, is not the empty string and is not an ASCII
case-insensitive match for the string "all
".
A type
attribute specified.
The src
attribute must not be present.
source
element's parent is a media elementThe src
attribute
gives the URL of the media resource. The value must be a valid
non-empty URL potentially surrounded by spaces. This attribute must be present.
The type
attribute gives the type of the media
resource, to help the user agent determine if it can play this media
resource before fetching it. The codecs
parameter, which certain
MIME types define, might be necessary to specify exactly how the resource is encoded.
RFC6381
Dynamically modifying a source
element's src
or type
attribute
when the element is already inserted in a video
or audio
element will
have no effect. To change what is playing, just use the src
attribute on the media element directly, possibly making use of the canPlayType()
method to pick from amongst available
resources. Generally, manipulating source
elements manually after the document has
been parsed is an unnecessarily complicated approach.
The following list shows some examples of how to use the codecs=
MIME
parameter in the type
attribute.
<source src='video.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="avc1.58A01E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="avc1.4D401E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="avc1.64001E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="mp4v.20.8, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="mp4v.20.240, mp4a.40.2"'>
<source src='video.3gp' type='video/3gpp; codecs="mp4v.20.8, samr"'>
<source src='video.ogv' type='video/ogg; codecs="theora, vorbis"'>
<source src='video.ogv' type='video/ogg; codecs="theora, speex"'>
<source src='audio.ogg' type='audio/ogg; codecs=vorbis'>
<source src='audio.spx' type='audio/ogg; codecs=speex'>
<source src='audio.oga' type='audio/ogg; codecs=flac'>
<source src='video.ogv' type='video/ogg; codecs="dirac, vorbis"'>
The srcset
and sizes
attributes must not be present.
The source
HTML element insertion
steps, given insertedNode, are:
If insertedNode's parent is a media element that has no src
attribute and whose networkState
has the value NETWORK_EMPTY
, then invoke that media
element's resource selection
algorithm.
If insertedNode's next sibling is an img
element and its parent is
a picture
element, then, count this as a relevant
mutation for the img
element.
The source
HTML element removing
steps, given removedNode and oldParent, are:
If removedNode's next sibling was an img
element and
oldParent is a picture
element, then, count this as a relevant mutation for the img
element.
The IDL attributes src
, type
, srcset
, sizes
and media
must reflect the respective
content attributes of the same name.
If the author isn't sure if user agents will all be able to render the media resources
provided, the author can listen to the error
event on the last
source
element and trigger fallback behavior:
<script>
function fallback(video) {
// replace <video> with its contents
while (video.hasChildNodes()) {
if (video.firstChild instanceof HTMLSourceElement)
video.removeChild(video.firstChild);
else
video.parentNode.insertBefore(video.firstChild, video);
}
video.parentNode.removeChild(video);
}
</script>
<video controls autoplay>
<source src='video.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
<source src='video.ogv' type='video/ogg; codecs="theora, vorbis"'
onerror="fallback(parentNode)">
...
</video>
img
elementusemap
attribute: Interactive content.picture
element, after all source
elements.alt
src
srcset
sizes
crossorigin
usemap
ismap
width
height
referrerpolicy
decoding
loading
fetchpriority
alt
attribute: for authors; for implementers.[Exposed=Window,
LegacyFactoryFunction=Image(optional unsigned long width, optional unsigned long height)]
interface HTMLImageElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString alt;
[CEReactions] attribute USVString src;
[CEReactions] attribute USVString srcset;
[CEReactions] attribute DOMString sizes;
[CEReactions] attribute DOMString? crossOrigin;
[CEReactions] attribute DOMString useMap;
[CEReactions] attribute boolean isMap;
[CEReactions] attribute unsigned long width;
[CEReactions] attribute unsigned long height;
readonly attribute unsigned long naturalWidth;
readonly attribute unsigned long naturalHeight;
readonly attribute boolean complete;
readonly attribute USVString currentSrc;
[CEReactions] attribute DOMString referrerPolicy;
[CEReactions] attribute DOMString decoding;
[CEReactions] attribute DOMString loading;
[CEReactions] attribute DOMString fetchPriority;
Promise<undefined> decode();
// also has obsolete members
};
HTMLImageElement
.An img
element represents an image.
An img
element has a dimension
attribute source, initially set to the element itself.
The image given by the src
and srcset
attributes, and
any previous sibling source
elements' srcset
attributes if the parent is a picture
element, is the embedded content; the value of
the alt
attribute provides
equivalent content for those who cannot process images or who have image loading disabled (i.e. it
is the img
element's fallback content).
The requirements on the alt
attribute's value are described
in a separate section.
The src
attribute must be present, and must contain a
valid non-empty URL potentially surrounded by spaces referencing a non-interactive,
optionally animated, image resource that is neither paged nor scripted.
The requirements above imply that images can be static bitmaps (e.g. PNGs, GIFs, JPEGs), single-page vector documents (single-page PDFs, XML files with an SVG document element), animated bitmaps (APNGs, animated GIFs), animated vector graphics (XML files with an SVG document element that use declarative SMIL animation), and so forth. However, these definitions preclude SVG files with script, multipage PDF files, interactive MNG files, HTML documents, plain text documents, and the like. PNG GIF JPEG PDF XML APNG SVG MNG
The srcset
attribute may also be present, and is a
srcset attribute.
The srcset
attribute and the src
attribute (if width
descriptors are not used) contribute the image sources
to the source set (if no source
element was selected).
If the srcset
attribute is present and has any image candidate strings using a width
descriptor, the sizes
attribute must also be present.
If the srcset
attribute is not specified, and the
loading
attribute is in the Lazy state, the sizes
attribute may be specified with the value "auto
" (ASCII case-insensitive). The sizes
attribute is a sizes attribute,
which contributes the source size to the source set (if no
source
element was selected).
An img
element allows auto-sizes if:
loading
attribute is in the Lazy state, andsizes
attribute's value is "auto
" (ASCII case-insensitive), or starts with "auto,
" (ASCII case-insensitive).The crossorigin
attribute is a CORS settings attribute. Its purpose is to allow images from
third-party sites that allow cross-origin access to be used with canvas
.
The referrerpolicy
attribute is a referrer
policy attribute. Its purpose is to set the referrer policy used when fetching the image. REFERRERPOLICY
The decoding
attribute indicates the preferred method to decode this
image. The attribute, if present, must be an image decoding hint. This attribute's missing value default and invalid value default are both the auto state.
The fetchpriority
attribute is a fetch
priority attribute. Its purpose is to set the priority used when fetching the image.
The loading
attribute is a lazy
loading attribute. Its purpose is to indicate the policy for loading images that are
outside the viewport.
When the loading
attribute's state is changed to the
Eager state, the user agent must run these
steps:
Let resumptionSteps be the img
element's lazy load
resumption steps.
If resumptionSteps is null, then return.
Set the img
's lazy load resumption steps to null.
Invoke resumptionSteps.
<img src="1.jpeg" alt="1">
<img src="2.jpeg" loading=eager alt="2">
<img src="3.jpeg" loading=lazy alt="3">
<div id=very-large></div> <!-- Everything after this div is below the viewport -->
<img src="4.jpeg" alt="4">
<img src="5.jpeg" loading=lazy alt="5">
In the example above, the images load as follows:
1.jpeg
, 2.jpeg
,
4.jpeg
The images load eagerly and delay the window's load event.
3.jpeg
The image loads when layout is known, due to being in the viewport, however it does not delay the window's load event.
5.jpeg
The image loads only once scrolled into the viewport, and does not delay the window's load event.
Developers are encouraged to specify a preferred aspect ratio via width
and height
attributes
on lazy loaded images, even if CSS sets the image's width and height properties, to prevent the
page layout from shifting around after the image loads.
The img
HTML element insertion
steps, given insertedNode, are:
If insertedNode's parent is a picture
element, then, count this as
a relevant mutation for
insertedNode.
The img
HTML element removing
steps, given removedNode and oldParent, are:
If oldParent is a picture
element, then, count this as a
relevant mutation for removedNode.
The img
element must not be used as a layout tool. In particular, img
elements should not be used to display transparent images, as such images rarely convey meaning and
rarely add anything useful to the document.
What an img
element represents depends on the src
attribute and the alt
attribute.
src
attribute is set and the alt
attribute is set to the empty stringThe image is either decorative or supplemental to the rest of the content, redundant with some other information in the document.
If the image is available and the user agent is configured to display that image, then the element represents the element's image data.
Otherwise, the element represents nothing, and may be omitted completely from the rendering. User agents may provide the user with a notification that an image is present but has been omitted from the rendering.
src
attribute is set and the alt
attribute is set to a value that isn't emptyThe image is a key part of the content; the alt
attribute
gives a textual equivalent or replacement for the image.
If the image is available and the user agent is configured to display that image, then the element represents the element's image data.
Otherwise, the element represents the text given by the alt
attribute. User agents may provide the user with a notification
that an image is present but has been omitted from the rendering.
src
attribute is set and the alt
attribute is notThe image might be a key part of the content, and there is no textual equivalent of the image available.
In a conforming document, the absence of the alt
attribute indicates that the image is a key part of the content
but that a textual replacement for the image was not available when the image was generated.
If the image is available and the user agent is configured to display that image, then the element represents the element's image data.
If the image has a src
attribute whose value is
the empty string, then the element represents nothing.
Otherwise, the user agent should display some sort of indicator that there is an image that is not being rendered, and may, if requested by the user, or if so configured, or when required to provide contextual information in response to navigation, provide caption information for the image, derived as follows:
If the image has a title
attribute whose value is not
the empty string, then return the value of that attribute.
If the image is a descendant of a figure
element that has a child
figcaption
element, and, ignoring the figcaption
element and its
descendants, the figure
element has no flow content descendants other
than inter-element whitespace and the img
element, then return the
contents of the first such figcaption
element.
Return nothing. (There is no caption information.)
src
attribute is not set and either the alt
attribute is set to the empty string or the alt
attribute is not set at allThe element represents nothing.
The element represents the text given by the alt
attribute.
The alt
attribute does not represent advisory information.
User agents must not present the contents of the alt
attribute
in the same way as content of the title
attribute.
User agents may always provide the user with the option to display any image, or to prevent any image from being displayed. User agents may also apply heuristics to help the user make use of the image when the user is unable to see it, e.g. due to a visual disability or because they are using a text terminal with no graphics capabilities. Such heuristics could include, for instance, optical character recognition (OCR) of text found within the image.
While user agents are encouraged to repair cases of missing alt
attributes, authors must not rely on such behavior. Requirements for providing text to act as an alternative for images are described
in detail below.
The contents of img
elements, if any, are ignored for the purposes of
rendering.
The usemap
attribute,
if present, can indicate that the image has an associated
image map.
The ismap
attribute,
when used on an element that is a descendant of an a
element with an href
attribute, indicates by its presence that the element
provides access to a server-side image map. This affects how events are handled on the
corresponding a
element.
The ismap
attribute is a
boolean attribute. The attribute must not be specified
on an element that does not have an ancestor a
element
with an href
attribute.
The usemap
and ismap
attributes can result in confusing behavior when used
together with source
elements with the media
attribute specified in a picture
element.
The img
element supports dimension
attributes.
The alt
, src
, srcset
and sizes
IDL attributes must
reflect the respective content attributes of the same name.
The crossOrigin
IDL attribute must
reflect the crossorigin
content attribute,
limited to only known values.
The useMap
IDL
attribute must reflect the usemap
content
attribute.
The isMap
IDL
attribute must reflect the ismap
content
attribute.
The referrerPolicy
IDL attribute must
reflect the referrerpolicy
content
attribute, limited to only known values.
The decoding
IDL attribute must reflect the decoding
content attribute, limited to only known values.
The loading
IDL attribute must reflect the loading
content
attribute, limited to only known values.
The fetchPriority
IDL attribute
must reflect the fetchpriority
content
attribute, limited to only known values.
image.width [ = value ]
image.height [ = value ]
These attributes return the actual rendered dimensions of the image, or 0 if the dimensions are not known.
They can be set, to change the corresponding content attributes.
image.naturalWidth
image.naturalHeight
These attributes return the natural dimensions of the image, or 0 if the dimensions are not known.
image.complete
Returns true if the image has been completely downloaded or if no image is specified; otherwise, returns false.
image.currentSrc
Returns the image's absolute URL.
image.decode()
This method causes the user agent to decode the image in parallel, returning a promise that fulfills when decoding is complete.
The promise will be rejected with an "EncodingError
"
DOMException
if the image cannot be decoded.
image = new Image([ width [, height ] ])
Returns a new img
element, with the width
and height
attributes set to the values passed in the
relevant arguments, if applicable.
The IDL attributes width
and height
must return the rendered width and height of the
image, in CSS pixels, if the image is being rendered; or
else the density-corrected natural width and height of the image, in CSS pixels, if the image has density-corrected natural width and
height and is available but is not being
rendered; or else 0, if the image is not available or does
not have density-corrected natural width and height. CSS
On setting, they must act as if they reflected the respective content attributes of the same name.
The IDL attributes naturalWidth
and naturalHeight
must return
the density-corrected natural width and height of the image, in CSS pixels, if the image has density-corrected natural width and
height and is available, or else 0. CSS
Since the density-corrected natural width and height of an image
take into account any orientation specified in its metadata, naturalWidth
and naturalHeight
reflect the dimensions after applying any
rotation needed to correctly orient the image, regardless of the value of the
'image-orientation' property.
The complete
getter steps are:
If any of the following are true:
both the src
attribute and the srcset
attribute are omitted;
the srcset
attribute is omitted and the src
attribute's value is the empty string;
the img
element's current request's state is completely available and
its pending request is null; or
the img
element's current request's state is broken and its
pending request is null,
then return true.
Return false.
The currentSrc
IDL attribute must return the
img
element's current request's current
URL.
The decode()
method, when invoked, must perform the following steps:
Let promise be a new promise.
Queue a microtask to perform the following steps:
This is done because updating the image data takes place in a microtask as well. Thus, to make code such as
img.src = "stars.jpg";
img.decode();
properly decode stars.jpg
, we need to delay any processing by one
microtask.
Let global be this's relevant global object.
If any of the following are true:
this's node document is not fully active; or
this's current request's state is broken,
then reject promise with an "EncodingError
"
DOMException
.
Otherwise, in parallel, wait for one of the following cases to occur, and perform the corresponding actions:
img
element's node document stops being fully
activeimg
element's current request changes or is mutatedimg
element's current request's state becomes brokenQueue a global task on the DOM manipulation task source with
global to reject promise with an
"EncodingError
" DOMException
.
img
element's current request's state becomes completely
availableDecode the image.
If decoding does not need to be performed for this image (for example because it is a vector graphic) or the decoding process completes successfully, then queue a global task on the DOM manipulation task source with global to resolve promise with undefined.
If decoding fails (for example due to invalid image data), then queue a global
task on the DOM manipulation task source with global to
reject promise with an "EncodingError
"
DOMException
.
User agents should ensure that the decoded media data stays readily available until at least the end of the next successful update the rendering step in the event loop. This is an important part of the API contract, and should not be broken if at all possible. (Typically, this would only be violated in low-memory situations that require evicting decoded image data, or when the image is too large to keep in decoded form for this period of time.)
Animated images will become completely available only after all their frames are loaded. Thus, even though an implementation could decode the first frame before that point, the above steps will not do so, instead waiting until all frames are available.
Return promise.
Without the decode()
method, the process of loading an
img
element and then displaying it might look like the following:
const img = new Image();
img.src = "nebula.jpg";
img.onload = () => {
document.body.appendChild(img);
};
img.onerror = () => {
document.body.appendChild(new Text("Could not load the nebula :("));
};
However, this can cause notable dropped frames, as the paint that occurs after inserting the image into the DOM causes a synchronous decode on the main thread.
This can instead be rewritten using the decode()
method:
const img = new Image();
img.src = "nebula.jpg";
img.decode().then(() => {
document.body.appendChild(img);
}).catch(() => {
document.body.appendChild(new Text("Could not load the nebula :("));
});
This latter form avoids the dropped frames of the original, by allowing the user agent to decode the image in parallel, and only inserting it into the DOM (and thus causing it to be painted) once the decoding process is complete.
Because the decode()
method attempts to ensure that the
decoded image data is available for at least one frame, it can be combined with the requestAnimationFrame()
API.
This means it can be used with coding styles or frameworks that ensure that all DOM modifications
are batched together as animation frame
callbacks:
const container = document.querySelector("#container");
const { containerWidth, containerHeight } = computeDesiredSize();
requestAnimationFrame(() => {
container.style.width = containerWidth;
container.style.height = containerHeight;
});
// ...
const img = new Image();
img.src = "supernova.jpg";
img.decode().then(() => {
requestAnimationFrame(() => container.appendChild(img));
});
A legacy factory function is provided for creating HTMLImageElement
objects (in
addition to the factory methods from DOM such as createElement()
): Image(width, height)
. When invoked,
the legacy factory function must perform the following steps:
Let document be the current global object's associated Document
.
Let img be the result of creating an
element given document, img
, and the HTML
namespace.
If width is given, then set
an attribute value for img using "width
"
and width.
If height is given, then set an attribute value for img
using "height
" and height.
Return img.
A single image can have different appropriate alternative text depending on the context.
In each of the following cases, the same image is used, yet the alt
text is different each time. The image is the coat of arms of the
Carouge municipality in the canton Geneva in Switzerland.
Here it is used as a supplementary icon:
<p>I lived in <img src="carouge.svg" alt=""> Carouge.</p>
Here it is used as an icon representing the town:
<p>Home town: <img src="carouge.svg" alt="Carouge"></p>
Here it is used as part of a text on the town:
<p>Carouge has a coat of arms.</p>
<p><img src="carouge.svg" alt="The coat of arms depicts a lion, sitting in front of a tree."></p>
<p>It is used as decoration all over the town.</p>
Here it is used as a way to support a similar text where the description is given as well as, instead of as an alternative to, the image:
<p>Carouge has a coat of arms.</p>
<p><img src="carouge.svg" alt=""></p>
<p>The coat of arms depicts a lion, sitting in front of a tree.
It is used as decoration all over the town.</p>
Here it is used as part of a story:
<p>She picked up the folder and a piece of paper fell out.</p>
<p><img src="carouge.svg" alt="Shaped like a shield, the paper had a
red background, a green tree, and a yellow lion with its tongue
hanging out and whose tail was shaped like an S."></p>
<p>She stared at the folder. S! The answer she had been looking for all
this time was simply the letter S! How had she not seen that before? It all
came together now. The phone call where Hector had referred to a lion's tail,
the time Maria had stuck her tongue out...</p>
Here it is not known at the time of publication what the image will be, only that it will be a
coat of arms of some kind, and thus no replacement text can be provided, and instead only a brief
caption for the image is provided, in the title
attribute:
<p>The last user to have uploaded a coat of arms uploaded this one:</p>
<p><img src="last-uploaded-coat-of-arms.cgi" title="User-uploaded coat of arms."></p>
Ideally, the author would find a way to provide real replacement text even in this case, e.g. by asking the previous user. Not providing replacement text makes the document more difficult to use for people who are unable to view images, e.g. blind users, or users or very low-bandwidth connections or who pay by the byte, or users who are forced to use a text-only web browser.
Here are some more examples showing the same picture used in different contexts, with different appropriate alternate texts each time.
<article>
<h1>My cats</h1>
<h2>Fluffy</h2>
<p>Fluffy is my favorite.</p>
<img src="fluffy.jpg" alt="She likes playing with a ball of yarn.">
<p>She's just too cute.</p>
<h2>Miles</h2>
<p>My other cat, Miles just eats and sleeps.</p>
</article>
<article>
<h1>Photography</h1>
<h2>Shooting moving targets indoors</h2>
<p>The trick here is to know how to anticipate; to know at what speed and
what distance the subject will pass by.</p>
<img src="fluffy.jpg" alt="A cat flying by, chasing a ball of yarn, can be
photographed quite nicely using this technique.">
<h2>Nature by night</h2>
<p>To achieve this, you'll need either an extremely sensitive film, or
immense flash lights.</p>
</article>
<article>
<h1>About me</h1>
<h2>My pets</h2>
<p>I've got a cat named Fluffy and a dog named Miles.</p>
<img src="fluffy.jpg" alt="Fluffy, my cat, tends to keep itself busy.">
<p>My dog Miles and I like go on long walks together.</p>
<h2>music</h2>
<p>After our walks, having emptied my mind, I like listening to Bach.</p>
</article>
<article>
<h1>Fluffy and the Yarn</h1>
<p>Fluffy was a cat who liked to play with yarn. She also liked to jump.</p>
<aside><img src="fluffy.jpg" alt="" title="Fluffy"></aside>
<p>She would play in the morning, she would play in the evening.</p>
</article>
To embed an image in HTML, when there is only a single image resource, use the img
element and its src
attribute.
<h2>From today's featured article</h2>
<img src="/uploads/100-marie-lloyd.jpg" alt="" width="100" height="150">
<p><b><a href="/wiki/Marie_Lloyd">Marie Lloyd</a></b> (1870–1922)
was an English <a href="/wiki/Music_hall">music hall</a> singer, ...
However, there are a number of situations for which the author might wish to use multiple image resources that the user agent can choose from:
Different users might have different environmental characteristics:
The users' physical screen size might be different from one another.
A mobile phone's screen might be 4 inches diagonally, while a laptop's screen might be 14 inches diagonally.
This is only relevant when an image's rendered size depends on the viewport size.
The users' screen pixel density might be different from one another.
A mobile phone's screen might have three times as many physical pixels per inch compared to another mobile phone's screen, regardless of their physical screen size.
The users' zoom level might be different from one another, or might change for a single user over time.
A user might zoom in to a particular image to be able to get a more detailed look.
The zoom level and the screen pixel density (the previous point) can both affect the number of physical screen pixels per CSS pixel. This ratio is usually referred to as device-pixel-ratio.
The users' screen orientation might be different from one another, or might change for a single user over time.
A tablet can be held upright or rotated 90 degrees, so that the screen is either "portrait" or "landscape".
The users' network speed, network latency and bandwidth cost might be different from one another, or might change for a single user over time.
A user might be on a fast, low-latency and constant-cost connection while at work, on a slow, low-latency and constant-cost connection while at home, and on a variable-speed, high-latency and variable-cost connection anywhere else.
Authors might want to show the same image content but with different rendered size depending on, usually, the width of the viewport. This is usually referred to as viewport-based selection.
A web page might have a banner at the top that always spans the entire viewport width. In this case, the rendered size of the image depends on the physical size of the screen (assuming a maximised browser window).
Another web page might have images in columns, with a single column for screens with a small physical size, two columns for screens with medium physical size, and three columns for screens with big physical size, with the images varying in rendered size in each case to fill up the viewport. In this case, the rendered size of an image might be bigger in the one-column layout compared to the two-column layout, despite the screen being smaller.
Authors might want to show different image content depending on the rendered size of the image. This is usually referred to as art direction.
When a web page is viewed on a screen with a large physical size (assuming a maximised browser window), the author might wish to include some less relevant parts surrounding the critical part of the image. When the same web page is viewed on a screen with a small physical size, the author might wish to show only the critical part of the image.
Authors might want to show the same image content but using different image formats, depending on which image formats the user agent supports. This is usually referred to as image format-based selection.
A web page might have some images in the JPEG, WebP and JPEG XR image formats, with the latter two having better compression abilities compared to JPEG. Since different user agents can support different image formats, with some formats offering better compression ratios, the author would like to serve the better formats to user agents that support them, while providing JPEG fallback for user agents that don't.
The above situations are not mutually exclusive. For example, it is reasonable to combine different resources for different device-pixel-ratio with different resources for art direction.
While it is possible to solve these problems using scripting, doing so introduces some other problems:
Some user agents aggressively download images specified in the HTML markup, before scripts have had a chance to run, so that web pages complete loading sooner. If a script changes which image to download, the user agent will potentially start two separate downloads, which can instead cause worse page loading performance.
If the author avoids specifying any image in the HTML markup and instead instantiates a single download from script, that avoids the double download problem above but then no image will be downloaded at all for users with scripting disabled and the aggressive image downloading optimization will also be disabled.
With this in mind, this specification introduces a number of features to address the above problems in a declarative manner.
The src
and srcset
attributes on the img
element can be used, using the x
descriptor, to provide multiple images that only vary in their size (the smaller image is a
scaled-down version of the bigger image).
The x
descriptor is not appropriate when the rendered
size of the image depends on the viewport width
(viewport-based selection), but can be used together with
art direction.
<h2>From today's featured article</h2>
<img src="/uploads/100-marie-lloyd.jpg"
srcset="/uploads/150-marie-lloyd.jpg 1.5x, /uploads/200-marie-lloyd.jpg 2x"
alt="" width="100" height="150">
<p><b><a href="/wiki/Marie_Lloyd">Marie Lloyd</a></b> (1870–1922)
was an English <a href="/wiki/Music_hall">music hall</a> singer, ...
The user agent can choose any of the given resources depending on the user's screen's pixel density, zoom level, and possibly other factors such as the user's network conditions.
For backwards compatibility with older user agents that don't yet understand the srcset
attribute, one of the URLs is specified in the
img
element's src
attribute. This will result
in something useful (though perhaps lower-resolution than the user would like) being displayed
even in older user agents. For new user agents, the src
attribute participates in the resource selection, as if it was specified in srcset
with a 1x
descriptor.
The image's rendered size is given in the width
and
height
attributes, which allows the user agent to
allocate space for the image before it is downloaded.
The srcset
and sizes
attributes can be used, using the w
descriptor, to provide multiple images that only vary in their size (the smaller image is a
scaled-down version of the bigger image).
In this example, a banner image takes up the entire viewport width (using appropriate CSS).
<h1><img sizes="100vw" srcset="wolf-400.jpg 400w, wolf-800.jpg 800w, wolf-1600.jpg 1600w"
src="wolf-400.jpg" alt="The rad wolf"></h1>
The user agent will calculate the effective pixel density of each image from the specified
w
descriptors and the specified rendered size in the sizes
attribute. It can then choose any of the given resources
depending on the user's screen's pixel density, zoom level, and possibly other factors such as
the user's network conditions.
If the user's screen is 320 CSS pixels wide, this is equivalent
to specifying wolf-400.jpg 1.25x, wolf-800.jpg 2.5x, wolf-1600.jpg 5x
.
On the other hand, if the user's screen is 1200 CSS pixels wide,
this is equivalent to specifying wolf-400.jpg 0.33x, wolf-800.jpg 0.67x, wolf-1600.jpg 1.33x
. By using the
w
descriptors and the sizes
attribute, the user agent can choose the correct image source to download regardless of how
large the user's device is.
For backwards compatibility, one of the URLs is specified in the img
element's
src
attribute. In new user agents, the src
attribute is ignored when the srcset
attribute uses w
descriptors.
In this example, the web page has three layouts depending on the width of the
viewport. The narrow layout has one column of images (the width of each image is
about 100%), the middle layout has two columns of images (the width of each image is about
50%), and the widest layout has three columns of images, and some page margin (the width of
each image is about 33%). It breaks between these layouts when the viewport is
30em
wide and 50em
wide, respectively.
<img sizes="(max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src="swing-400.jpg" alt="Kettlebell Swing">
The sizes
attribute sets up the layout breakpoints at
30em
and 50em
, and declares the image sizes
between these breakpoints to be 100vw
, 50vw
, or
calc(33vw - 100px)
. These sizes do not necessarily have to match up
exactly with the actual image width as specified in the CSS.
The user agent will pick a width from the sizes
attribute, using the first item with a <media-condition> (the part in
parentheses) that evaluates to true, or using the last item (calc(33vw -
100px)
) if they all evaluate to false.
For example, if the viewport width is 29em
, then (max-width: 30em)
evaluates to true and 100vw
is used,
so the image size, for the purpose of resource selection, is 29em
. If
the viewport width is instead 32em
, then
(max-width: 30em)
evaluates to false, but
(max-width: 50em)
evaluates to true
and 50vw
is used, so the image size, for the purpose of resource
selection, is 16em
(half the viewport width). Notice that
the slightly wider viewport results in a smaller image because of the different
layout.
The user agent can then calculate the effective pixel density and choose an appropriate resource similarly to the previous example.
This example is the same as the previous example, but the image is lazy-loaded. In this case, the sizes
attribute can use the auto
keyword, and the user agent will use the width
attribute (or the width specified in CSS) for the
source size.
<img loading="lazy" width="200" height="200" sizes="auto"
srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src="swing-400.jpg" alt="Kettlebell Swing">
For better backwards-compatibility with legacy user agents that don't support the auto
keyword, fallback sizes can be specified if desired.
<img loading="lazy" width="200" height="200"
sizes="auto, (max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src="swing-400.jpg" alt="Kettlebell Swing">
The picture
element and the source
element, together with the media
attribute, can be used to provide multiple images that
vary the image content (for instance the smaller image might be a cropped version of the bigger
image).
<picture>
<source media="(min-width: 45em)" srcset="large.jpg">
<source media="(min-width: 32em)" srcset="med.jpg">
<img src="small.jpg" alt="The wolf runs through the snow.">
</picture>
The user agent will choose the first source
element for which the media query
in the media
attribute matches, and then choose an
appropriate URL from its srcset
attribute.
The rendered size of the image varies depending on which resource is chosen. To specify dimensions that the user agent can use before having downloaded the image, CSS can be used.
img { width: 300px; height: 300px }
@media (min-width: 32em) { img { width: 500px; height:300px } }
@media (min-width: 45em) { img { width: 700px; height:400px } }
This example combines art direction- and device-pixel-ratio-based selection. A banner that takes half the viewport is provided in two versions, one for wide screens and one for narrow screens.
<h1>
<picture>
<source media="(max-width: 500px)" srcset="banner-phone.jpeg, banner-phone-HD.jpeg 2x">
<img src="banner.jpeg" srcset="banner-HD.jpeg 2x" alt="The Breakfast Combo">
</picture>
</h1>
The type
attribute on the source
element
can be used to provide multiple images in different formats.
<h2>From today's featured article</h2>
<picture>
<source srcset="/uploads/100-marie-lloyd.webp" type="image/webp">
<source srcset="/uploads/100-marie-lloyd.jxr" type="image/vnd.ms-photo">
<img src="/uploads/100-marie-lloyd.jpg" alt="" width="100" height="150">
</picture>
<p><b><a href="/wiki/Marie_Lloyd">Marie Lloyd</a></b> (1870–1922)
was an English <a href="/wiki/Music_hall">music hall</a> singer, ...
In this example, the user agent will choose the first source that has a type
attribute with a supported MIME type. If the user agent
supports WebP images, the first source
element will be chosen. If not, but the
user agent does support JPEG XR images, the second source
element will be chosen.
If neither of those formats are supported, the img
element will be chosen.
CSS and media queries can be used to construct graphical page layouts that adapt dynamically to
the user's environment, in particular to different viewport dimensions and pixel
densities. For content, however, CSS does not help; instead, we have the img
element's
srcset
attribute and the picture
element.
This section walks through a sample case showing how to use these features.
Consider a situation where on wide screens (wider than 600 CSS
pixels) a 300×150 image named a-rectangle.png
is to be used,
but on smaller screens (600 CSS pixels and less), a smaller
100×100 image called a-square.png
is to be used. The markup for this
would look like this:
<figure>
<picture>
<source srcset="a-square.png" media="(max-width: 600px)">
<img src="a-rectangle.png" alt="Barney Frank wears a suit and glasses.">
</picture>
<figcaption>Barney Frank, 2011</figcaption>
</figure>
For details on what to put in the alt
attribute, see the Requirements for providing text to act as an alternative for
images section.
The problem with this is that the user agent does not necessarily know what dimensions to use for the image when the image is loading. To avoid the layout having to be reflowed multiple times as the page is loading, CSS and CSS media queries can be used to provide the dimensions:
<style>
#a { width: 300px; height: 150px; }
@media (max-width: 600px) { #a { width: 100px; height: 100px; } }
</style>
<figure>
<picture>
<source srcset="a-square.png" media="(max-width: 600px)">
<img src="a-rectangle.png" alt="Barney Frank wears a suit and glasses." id="a">
</picture>
<figcaption>Barney Frank, 2011</figcaption>
</figure>
Alternatively, the width
and height
attributes can be used to provide the width and height for
legacy user agents, using CSS just for the user agents that support picture
:
<style media="(max-width: 600px)">
#a { width: 100px; height: 100px; }
</style>
<figure>
<picture>
<source srcset="a-square.png" media="(max-width: 600px)">
<img src="a-rectangle.png" width="300" height="150"
alt="Barney Frank wears a suit and glasses." id="a">
</picture>
<figcaption>Barney Frank, 2011</figcaption>
</figure>
The img
element is used with the src
attribute,
which gives the URL of the image to use for legacy user agents that do not support the
picture
element. This leads to a question of which image to provide in the src
attribute.
If the author wants the biggest image in legacy user agents, the markup could be as follows:
<picture>
<source srcset="pear-mobile.jpeg" media="(max-width: 720px)">
<source srcset="pear-tablet.jpeg" media="(max-width: 1280px)">
<img src="pear-desktop.jpeg" alt="The pear is juicy.">
</picture>
However, if legacy mobile user agents are more important, one can list all three images in the
source
elements, overriding the src
attribute
entirely.
<picture>
<source srcset="pear-mobile.jpeg" media="(max-width: 720px)">
<source srcset="pear-tablet.jpeg" media="(max-width: 1280px)">
<source srcset="pear-desktop.jpeg">
<img src="pear-mobile.jpeg" alt="The pear is juicy.">
</picture>
Since at this point the src
attribute is actually being
ignored entirely by picture
-supporting user agents, the src
attribute can default to any image, including one that is neither
the smallest nor biggest:
<picture>
<source srcset="pear-mobile.jpeg" media="(max-width: 720px)">
<source srcset="pear-tablet.jpeg" media="(max-width: 1280px)">
<source srcset="pear-desktop.jpeg">
<img src="pear-tablet.jpeg" alt="The pear is juicy.">
</picture>
Above the max-width
media feature is used, giving the maximum
(viewport) dimensions that an image is intended for. It is also possible to use min-width
instead.
<picture>
<source srcset="pear-desktop.jpeg" media="(min-width: 1281px)">
<source srcset="pear-tablet.jpeg" media="(min-width: 721px)">
<img src="pear-mobile.jpeg" alt="The pear is juicy.">
</picture>
source
,
img
, and link
elementsA srcset attribute is an attribute with requirements defined in this section.
If present, its value must consist of one or more image candidate strings, each separated from the next by a U+002C COMMA character (,). If an image candidate string contains no descriptors and no ASCII whitespace after the URL, the following image candidate string, if there is one, must begin with one or more ASCII whitespace.
An image candidate string consists of the following components, in order, with the further restrictions described below this list:
Zero or more ASCII whitespace.
A valid non-empty URL that does not start or end with a U+002C COMMA character (,), referencing a non-interactive, optionally animated, image resource that is neither paged nor scripted.
Zero or more ASCII whitespace.
Zero or one of the following:
A width descriptor, consisting of: ASCII whitespace, a valid non-negative integer giving a number greater than zero representing the width descriptor value, and a U+0077 LATIN SMALL LETTER W character.
A pixel density descriptor, consisting of: ASCII whitespace, a valid floating-point number giving a number greater than zero representing the pixel density descriptor value, and a U+0078 LATIN SMALL LETTER X character.
Zero or more ASCII whitespace.
There must not be an image candidate string for an element that has the same width descriptor value as another image candidate string's width descriptor value for the same element.
There must not be an image candidate string for an element that has the same
pixel density descriptor value as another image candidate string's
pixel density descriptor value for the same element. For the purpose of this
requirement, an image candidate string with no descriptors is equivalent to an
image candidate string with a 1x
descriptor.
If an image candidate string for an element has the width descriptor specified, all other image candidate strings for that element must also have the width descriptor specified.
The specified width in an image candidate string's width descriptor must match the natural width in the resource given by the image candidate string's URL, if it has a natural width.
If an element has a sizes attribute present, all image candidate strings for that element must have the width descriptor specified.
A sizes attribute is an attribute with requirements defined in this section.
If present, the value must be a valid source size list.
A valid source size list is a string that matches the following grammar: CSSVALUES MQ
<source-size-list> = <source-size>#? , <source-size-value>
<source-size> = <media-condition> <source-size-value> | auto
<source-size-value> = <length> | auto
A <source-size-value> that is a <length> must not be negative, and must not use CSS functions other than the math functions.
The keyword auto
is a width that is
computed in parse a sizes attribute. If present, it must be the first entry and the
entire <source-size-list> value must either be the string "auto
" (ASCII case-insensitive) or start with the string "auto,
" (ASCII case-insensitive).
If the img
element that initiated the image loading (with the
update the image data or react to environment
changes algorithms) allows auto-sizes and is being rendered,
then auto
is the concrete object size width.
Otherwise, the auto
value is ignored and the next
source size is used instead, if any.
The auto
keyword may be specified in the sizes
attribute of source
elements and sizes
attribute of img
elements, if the following
conditions are met. Otherwise, auto
must not be
specified.
The element is a source
element with a following sibling
img
element.
The element is an img
element.
The img
element referenced in either condition above allows
auto-sizes.
In addition, it is strongly encouraged to specify dimensions using the width
and height
attributes
or with CSS. Without specified dimensions, the image will likely render with 300x150 dimensions
because sizes="auto"
implies contain-intrinsic-size: 300px
150px
in the Rendering section.
The <source-size-value> gives the intended layout width of the image. The author can specify different widths for different environments with <media-condition>s.
Percentages are not allowed in a <source-size-value>, to avoid confusion about what it would be relative to. The 'vw' unit can be used for sizes relative to the viewport width.
An img
element has a current request and a pending request.
The current request is initially set to a new image request.
The pending request is initially set to null.
An image request has a state, current URL, and image data.
An image request's state is one of the following:
An image request's current URL is initially the empty string.
An image request's image data is the decoded image data.
When an image request's state is either partially available or completely available, the image request is said to be available.
When an img
element's current request's state is completely available and the
user agent can decode the media data without errors, then the img
element is said to
be fully decodable.
An image request's state is initially unavailable.
When an img
element's current request is available, the img
element provides a paint
source whose width is the image's density-corrected natural width (if any), whose height is the image's density-corrected natural height
(if any), and whose appearance is the natural appearance of the image.
An img
element is said to use srcset
or
picture
if it has a srcset
attribute
specified or if it has a parent that is a picture
element.
Each img
element has a last selected source, which must initially be
null.
Each image request has a current pixel density, which must initially be 1.
Each image request has preferred density-corrected dimensions, which is either a struct consisting of a width and a height or is null. It must initially be null.
To determine the density-corrected
natural width and height of an img
element img:
Let dim be img's current request's preferred density-corrected dimensions.
The preferred density-corrected dimensions are set in the prepare an image for presentation algorithm based on meta information in the image.
If dim is null, set dim to img's natural dimensions.
Set dim's width to dim's width divided by img's current request's current pixel density.
Set dim's height to dim's height divided by img's current request's current pixel density.
Return dim.
For example, if the current pixel density is 3.125, that means that there are 300 device pixels per CSS inch, and thus if the image data is 300x600, it has density-corrected natural width and height of 96 CSS pixels by 192 CSS pixels.
All img
and link
elements are associated with a source set.
A source set is an ordered set of zero or more image sources and a source size.
An image source is a URL, and optionally either a pixel density descriptor, or a width descriptor.
A source size is a <source-size-value>.
When a source size has a unit relative to the viewport,
it must be interpreted relative to the img
element's node document's
viewport. Other units must be interpreted the same as in Media Queries.
MQ
A parse error for algorithms in this section indicates a non-fatal mismatch between input and requirements. User agents are encouraged to expose parse errors somehow.
Whether the image is fetched successfully or not (e.g. whether the response status was an ok status) must be ignored when determining the image's type and whether it is a valid image.
This allows servers to return images with error responses, and have them displayed.
The user agent should apply the image sniffing rules to determine the type of the image, with the image's associated Content-Type headers giving the official type. If these rules are not applied, then the type of the image must be the type given by the image's associated Content-Type headers.
User agents must not support non-image resources with the img
element (e.g. XML
files whose document element is an HTML element). User agents must not run executable
code (e.g. scripts) embedded in the image resource. User agents must only display the first page
of a multipage resource (e.g. a PDF file). User agents must not allow the resource to act in an
interactive fashion, but should honour any animation in the resource.
This specification does not specify which image types are to be supported.
By default, images are obtained immediately. User agents may provide users with the option to instead obtain them on-demand. (The on-demand option might be used by bandwidth-constrained users, for example.)
When obtaining images immediately, the user agent must synchronously update the image
data of the img
element, with the restart animation flag set if so
stated, whenever that element is created or has experienced relevant mutations.
When obtaining images on demand, the user agent must update the image data of an
img
element whenever it needs the image data (i.e., on demand), but only if the
img
element's current request's state is unavailable. When an
img
element has experienced relevant mutations, if the user agent only
obtains images on demand, the img
element's current request's state must return to unavailable.
The relevant mutations for an img
element are as follows:
The element's src
, srcset
, width
, or sizes
attributes are set, changed, or removed.
The element's src
attribute is set to the same value as the previous value.
This must set the restart animation flag for the update the image data algorithm.
The element's crossorigin
attribute's state is changed.
The element's referrerpolicy
attribute's
state is changed.
The img
or source
HTML element insertion steps or
HTML element removing steps count the mutation as a relevant mutation.
The element's parent is a picture
element and a source
element
that is a previous sibling has its srcset
, sizes
, media
, type
, width
or height
attributes set, changed, or removed.
The element's adopting steps are run.
If the element allows auto-sizes: the element starts or stops being rendered, or its concrete object size width changes. This must set the maybe omit events flag for the update the image data algorithm.
Each Document
object must have a list of available images. Each image
in this list is identified by a tuple consisting of an absolute URL, a CORS
settings attribute mode, and, if the mode is not No
CORS, an origin.
Each image furthermore has an ignore higher-layer caching flag.
User agents may copy entries from one Document
object's list of available images to another at any time (e.g. when the
Document
is created, user agents can add to it all the images that are loaded in
other Document
s), but must not change the keys of entries copied in this way when
doing so, and must unset the ignore higher-layer caching flag for the copied entry.
User agents may also remove images from such lists at any time (e.g. to save
memory).
User agents must remove entries in the list of available images as appropriate
given higher-layer caching semantics for the resource (e.g. the HTTP `Cache-Control
` response header) when the ignore
higher-layer caching flag is unset.
The list of available images is intended to enable synchronous
switching when changing the src
attribute to a URL that has
previously been loaded, and to avoid re-downloading images in the same document even when they
don't allow caching per HTTP. It is not used to avoid re-downloading the same image while the
previous image is still loading.
The user agent can also store the image data separately from the list of available images.
For example, if a resource has the HTTP response header
`Cache-Control: must-revalidate
`, and its ignore higher-layer
caching flag is unset, the user agent would remove it from the list of available
images but could keep the image data separately, and use that if the server responds with a
304 Not Modified
status.
Image data is usually encoded in order to reduce file size. This means that in order for the user agent to present the image to the screen, the data needs to be decoded. Decoding is the process which converts an image's media data into a bitmap form, suitable for presentation to the screen. Note that this process can be slow relative to other processes involved in presenting content. Thus, the user agent can choose when to perform decoding, in order to create the best user experience.
Image decoding is said to be synchronous if it prevents presentation of other content until it is finished. Typically, this has an effect of atomically presenting the image and any other content at the same time. However, this presentation is delayed by the amount of time it takes to perform the decode.
Image decoding is said to be asynchronous if it does not prevent presentation of other content. This has an effect of presenting non-image content faster. However, the image content is missing on screen until the decode finishes. Once the decode is finished, the screen is updated with the image.
In both synchronous and asynchronous decoding modes, the final content is presented to screen after the same amount of time has elapsed. The main difference is whether the user agent presents non-image content ahead of presenting the final content.
In order to aid the user agent in deciding whether to perform synchronous or asynchronous
decode, the decoding
attribute can be set on
img
elements. The possible values of the decoding
attribute are the following image decoding
hint keywords:
Keyword | State | Description |
---|---|---|
sync
| Sync | Indicates a preference to decode this image synchronously for atomic presentation with other content. |
async
| Async | Indicates a preference to decode this image asynchronously to avoid delaying presentation of other content. |
auto
| Auto | Indicates no preference in decoding mode (the default). |
When decoding an image, the user agent should
respect the preference indicated by the decoding
attribute's state. If the state indicated is auto, then the user agent is free to choose any
decoding behavior.
It is also possible to control the decoding behavior using the decode()
method. Since the decode()
method performs decoding independently from the process responsible for
presenting content to screen, it is unaffected by the decoding
attribute.
This algorithm cannot be called from steps running in parallel. If a user agent needs to call this algorithm from steps running in parallel, it needs to queue a task to do so.
When the user agent is to update the image data of an img
element,
optionally with the restart animations flag set, optionally with the maybe omit
events flag set, it must run the following steps:
If the element's node document is not fully active, then:
Continue running this algorithm in parallel.
Wait until the element's node document is fully active.
If another instance of this algorithm for this img
element was started after this instance
(even if it aborted and is no longer running), then return.
Queue a microtask to continue this algorithm.
If the user agent cannot support images, or its support for images has been disabled, then abort the image request for the current request and the pending request, set current request's state to unavailable, set pending request to null, and return.
Let previous URL be the current request's current URL.
Let selected source be null and selected pixel density be undefined.
If the element does not use srcset
or picture
and
it has a src
attribute specified whose value is not the empty
string, then set selected source to the value of the element's src
attribute and set selected pixel density to
1.0.
Set the element's last selected source to selected source.
If selected source is not null, then:
Let urlString be the result of encoding-parsing-and-serializing a URL given selected source, relative to the element's node document.
If urlString is failure, then abort this inner set of steps.
Let key be a tuple consisting of urlString, the img
element's crossorigin
attribute's mode, and, if that
mode is not No CORS, the node
document's origin.
If the list of available images contains an entry for key, then:
Set the ignore higher-layer caching flag for that entry.
Abort the image request for the current request and the pending request.
Set pending request to null.
Let current request be a new image request whose image data is that of the entry and whose state is completely available.
Prepare current request for presentation given img.
Set current request's current pixel density to selected pixel density.
Queue an element task on the DOM manipulation task source
given the img
element and the following steps:
If restart animation is set, then restart the animation.
Set current request's current URL to urlString.
If maybe omit events is not set or previousURL is not equal to
urlString, then fire an event named
load
at the img
element.
Abort the update the image data algorithm.
Queue a microtask to perform the rest of this algorithm, allowing the task that invoked this algorithm to continue.
If another instance of this algorithm for this img
element was started after
this instance (even if it aborted and is no longer running), then return.
Only the last instance takes effect, to avoid multiple requests when, for
example, the src
, srcset
,
and crossorigin
attributes are all set in
succession.
Let selected source and selected pixel density be the URL and pixel density that results from selecting an image source, respectively.
If selected source is null, then:
Set the current request's state to broken, abort the image request for the current request and the pending request, and set pending request to null.
Queue an element task on the DOM manipulation task source given
the img
element and the following steps:
Change the current request's current URL to the empty string.
If all of the following are true:
the element has a src
attribute or it uses srcset
or
picture
; and
maybe omit events is not set or previousURL is not the empty string,
then fire an event named error
at the img
element.
Return.
Let urlString be the result of encoding-parsing-and-serializing a URL given selected source, relative to the element's node document.
If urlString is failure, then:
Abort the image request for the current request and the pending request.
Set the current request's state to broken.
Set pending request to null.
Queue an element task on the DOM manipulation task
source given the img
element and the following steps:
Change the current request's current URL to selected source.
If maybe omit events is not set or previousURL is not equal to
selected source, then fire an event
named error
at the img
element.
Return.
If the pending request is not null and urlString is the same as the pending request's current URL, then return.
If urlString is the same as the current request's current URL and current request's state is partially available, then
abort the image request for the pending request, queue an element
task on the DOM manipulation task source given the img
element
to restart the animation if restart animation is set, and return.
Abort the image request for the pending request.
Set image request to a new image request whose current URL is urlString.
If current request's state is unavailable or broken, then set the current request to image request. Otherwise, set the pending request to image request.
Let request be the result of creating a potential-CORS request given urlString, "image
", and the current state of the element's crossorigin
content attribute.
Set request's client to the element's node document's relevant settings object.
If the element uses srcset
or
picture
, set request's initiator to "imageset
".
Set request's referrer
policy to the current state of the element's referrerpolicy
attribute.
Set request's priority to the current state of the
element's fetchpriority
attribute.
Let delay load event be true if the img
's lazy loading
attribute is in the Eager state, or if
scripting is disabled for the img
, and
false otherwise.
If the will lazy load element steps given the img
return true,
then:
Set the img
's lazy load resumption steps to the rest of this
algorithm starting with the step labeled fetch the image.
Start intersection-observing a lazy loading element for the
img
element.
Return.
Fetch the image: Fetch request. Return from this algorithm, and run the remaining steps as part of the fetch's processResponse for the response response.
The resource obtained in this fashion, if any, is image request's image data. It can be either CORS-same-origin or
CORS-cross-origin; this affects the image's interaction with other APIs (e.g.,
when used on a canvas
).
When delay load event is true, fetching the image must delay the load event of the element's node document until the task that is queued by the networking task source once the resource has been fetched (defined below) has been run.
This, unfortunately, can be used to perform a rudimentary port scan of the user's local network (especially in conjunction with scripting, though scripting isn't actually necessary to carry out such an attack). User agents may implement cross-origin access control policies that are stricter than those described above to mitigate this attack, but unfortunately such policies are typically not compatible with existing web content.
As soon as possible, jump to the first applicable entry from the following list:
multipart/x-mixed-replace
The next task that is queued by the networking task source while the image is being fetched must run the following steps:
If image request is the pending request and at least one body part has been completely decoded, abort the image request for the current request, and upgrade the pending request to the current request.
Otherwise, if image request is the pending request and the user agent is able to determine that image request's image is corrupted in some fatal way such that the image dimensions cannot be obtained, abort the image request for the current request, upgrade the pending request to the current request, and set the current request's state to broken.
Otherwise, if image request is the current request, its state is unavailable, and the user agent is able to determine image request's image's width and height, set the current request's state to partially available.
Otherwise, if image request is the current request, its state is unavailable, and the user agent is able to determine that image request's image is corrupted in some fatal way such that the image dimensions cannot be obtained, set the current request's state to broken.
Each task that is queued by the networking task source while the image is being
fetched must update the presentation of the image, but as each new body part comes in, if the
user agent is able to determine the image's width and height, it must prepare the img
element's current request
for presentation given the img
element and replace the previous image.
Once one body part has been completely decoded, perform the following steps:
Set the img
element's current request's state to completely
available.
If maybe omit events is not set or previousURL is not equal to
urlString, then queue an element task on the DOM manipulation task source
given the img
element to fire an event
named load
at the img
element.
The next task that is queued by the networking task source while the image is being fetched must run the following steps:
If the user agent is able to determine image request's image's width and height, and image request is pending request, set image request's state to partially available.
Otherwise, if the user agent is able to determine image request's image's
width and height, and image request is current request, prepare image request for
presentation given the img
element and set image request's
state to partially
available.
Otherwise, if the user agent is able to determine that image request's image is corrupted in some fatal way such that the image dimensions cannot be obtained, and image request is pending request:
Abort the image request for the current request and the pending request.
Upgrade the pending request to the current request.
Set current request's state to broken.
Fire an event named error
at the img
element.
Otherwise, if the user agent is able to determine that image request's image is corrupted in some fatal way such that the image dimensions cannot be obtained, and image request is current request:
Abort the image request for image request.
If maybe omit events is not set or previousURL is not equal to
urlString, then fire an event named
error
at the img
element.
That task, and each subsequent task, that is queued by the networking task source while the image is being fetched, if image request is the current request, must update the presentation of the image appropriately (e.g., if the image is a progressive JPEG, each packet can improve the resolution of the image).
Furthermore, the last task that is queued by the networking task source once the resource has been fetched must additionally run these steps:
If image request is the pending request,
abort the image request for the current request,
upgrade the pending request to the current request and
prepare image request for
presentation given the img
element.
Set image request to the completely available state.
Add the image to the list of available images using the key key, with the ignore higher-layer caching flag set.
If maybe omit events is not set or previousURL is not equal to
urlString, then fire an event named
load
at the img
element.
The image data is not in a supported file format; the user agent must set image
request's state to broken, abort the image request for the current
request and the pending request, upgrade the pending request to the
current request if image request is the pending request, and
then, if maybe omit events is not set or previousURL is not equal to
urlString, queue an element task on the DOM manipulation task
source given the img
element to fire an
event named error
at the img
element.
While a user agent is running the above algorithm for an element x, there must be a strong reference from the element's node document to the element x, even if that element is not connected.
To abort the image request for an image request or null image request means to run the following steps:
If image request is null, then return.
Forget image request's image data, if any.
Abort any instance of the fetching algorithm for image request, discarding any pending tasks generated by that algorithm.
To upgrade the pending request to the current request for an img
element means to run the following steps:
Let the img
element's current request be the pending request.
Let the img
element's pending request be null.
To prepare an image for presentation for an image request req given image element img:
Let exifTagMap be the EXIF tags obtained from req's image data, as defined by the relevant codec. EXIF
Let physicalWidth and physicalHeight be the width and height obtained from req's image data, as defined by the relevant codec.
Let dimX be the value of exifTagMap's tag 0xA002
(PixelXDimension
).
Let dimY be the value of exifTagMap's tag 0xA003
(PixelYDimension
).
Let resX be the value of exifTagMap's tag 0x011A
(XResolution
).
Let resY be the value of exifTagMap's tag 0x011B
(YResolution
).
Let resUnit be the value of exifTagMap's tag 0x0128
(ResolutionUnit
).
If either dimX or dimY is not a positive integer, then return.
If either resX or resY is not a positive floating-point number, then return.
If resUnit is not equal to 2
(Inch
), then return.
Let widthFromDensity be the value of physicalWidth, multiplied by 72 and divided by resX.
Let heightFromDensity be the value of physicalHeight, multiplied by 72 and divided by resY.
If widthFromDensity is not equal to dimX or heightFromDensity is not equal to dimY, then return.
If req's image data is CORS-cross-origin, then set img's natural dimensions to dimX and dimY, scale img's pixel data accordingly, and return.
Set req's preferred density-corrected dimensions to a struct with its width set to dimX and its height set to dimY.
Update req's img
element's presentation appropriately.
Resolution in EXIF is equivalent to CSS points per inch, therefore 72 is the base for computing size from resolution.
It is not yet specified what would be the case if EXIF arrives after the image is already presented. See issue #4929.
To select an image source given an img
element el:
Update the source set for el.
If el's source set is empty, return null as the URL and undefined as the pixel density.
Return the result of selecting an image from el's source set.
To select an image source from a source set given a source set sourceSet:
If an entry b in sourceSet has the same associated pixel density descriptor as an earlier entry a in sourceSet, then remove entry b. Repeat this step until none of the entries in sourceSet have the same associated pixel density descriptor as an earlier entry.
In an implementation-defined manner, choose one image source from sourceSet. Let this be selectedSource.
Return selectedSource and its associated pixel density.
When asked to create a source set given a string default source, a string srcset, a string sizes, and an element or null img:
Let source set be an empty source set.
If srcset is not an empty string, then set source set to the result of parsing srcset.
Let source size be the result of parsing sizes with img.
If default source is not the empty string and source set does not contain an image source with a pixel density descriptor value of 1, and no image source with a width descriptor, append default source to source set.
Normalize the source densities of source set.
Return source set.
When asked to update the source set for a given img
or
link
element el, user agents must do the following:
Set el's source set to an empty source set.
Let elements be « el ».
If el is an img
element whose parent node is a
picture
element, then replace the contents of
elements with el's parent node's child elements, retaining relative
order.
Let img be el if el is an img
element,
otherwise null.
For each child in elements:
If child is el:
Let default source be the empty string.
Let srcset be the empty string.
Let sizes be the empty string.
If el is an img
element that has a srcset
attribute, then set srcset to that
attribute's value.
Otherwise, if el is a link
element that has an imagesrcset
attribute, then set srcset to
that attribute's value.
If el is an img
element that has a sizes
attribute, then set sizes to that attribute's
value.
Otherwise, if el is a link
element that has an imagesizes
attribute, then set sizes to that
attribute's value.
If el is an img
element that has a src
attribute, then set default source to that
attribute's value.
Otherwise, if el is a link
element that has an href
attribute, then set default source to that
attribute's value.
Let el's source set be the result of creating a source set given default source, srcset, sizes, and img.
Return.
If el is a link
element, then elements
contains only el, so this step will be reached immediately and the rest of the
algorithm will not run.
If child is not a source
element, then
continue.
If child does not have a srcset
attribute, continue to the next child.
Parse child's srcset attribute and let the returned source set be source set.
If source set has zero image sources, continue to the next child.
If child has a media
attribute, and
its value does not match the environment,
continue to the next child.
Parse child's sizes attribute with img, and let source set's source size be the returned value.
If child has a type
attribute, and its
value is an unknown or unsupported MIME type, continue to the next child.
If child has width
or height
attributes, set el's dimension attribute source to
child. Otherwise, set el's dimension attribute source to
el.
Normalize the source densities of source set.
Let el's source set be source set.
Return.
Each img
element independently considers its previous sibling
source
elements plus the img
element itself for selecting an image
source, ignoring any other (invalid) elements, including other img
elements in
the same picture
element, or source
elements that are following siblings
of the relevant img
element.
When asked to parse a srcset attribute from an element, parse the value of the element's srcset attribute as follows:
Let input be the value passed to this algorithm.
Let position be a pointer into input, initially pointing at the start of the string.
Let candidates be an initially empty source set.
Splitting loop: Collect a sequence of code points that are ASCII whitespace or U+002C COMMA characters from input given position. If any U+002C COMMA characters were collected, that is a parse error.
If position is past the end of input, return candidates.
Collect a sequence of code points that are not ASCII whitespace from input given position, and let that be url.
Let descriptors be a new empty list.
If url ends with U+002C (,), then:
Remove all trailing U+002C COMMA characters from url. If this removed more than one character, that is a parse error.
Otherwise:
Descriptor tokenizer: Skip ASCII whitespace within input given position.
Let current descriptor be the empty string.
Let state be in descriptor.
Let c be the character at position. Do the following depending on the value of state. For the purpose of this step, "EOF" is a special character representing that position is past the end of input.
Do the following, depending on the value of c:
If current descriptor is not empty, append current descriptor to descriptors and let current descriptor be the empty string. Set state to after descriptor.
Advance position to the next character in input. If current descriptor is not empty, append current descriptor to descriptors. Jump to the step labeled descriptor parser.
Append c to current descriptor. Set state to in parens.
If current descriptor is not empty, append current descriptor to descriptors. Jump to the step labeled descriptor parser.
Append c to current descriptor.
Do the following, depending on the value of c:
Append c to current descriptor. Set state to in descriptor.
Append current descriptor to descriptors. Jump to the step labeled descriptor parser.
Append c to current descriptor.
Do the following, depending on the value of c:
Stay in this state.
Jump to the step labeled descriptor parser.
Set state to in descriptor. Set position to the previous character in input.
Advance position to the next character in input. Repeat this step.
In order to be compatible with future additions, this algorithm supports multiple descriptors and descriptors with parens.
Descriptor parser: Let error be no.
Let width be absent.
Let density be absent.
Let future-compat-h be absent.
For each descriptor in descriptors, run the appropriate set of steps from the following list:
If the user agent does not support the sizes
attribute,
let error be yes.
A conforming user agent will support the sizes
attribute.
However, user agents typically implement and ship features in an incremental manner in practice.
If width and density are not both absent, then let error be yes.
Apply the rules for parsing non-negative integers to the descriptor. If the result is 0, let error be yes. Otherwise, let width be the result.
If width, density and future-compat-h are not all absent, then let error be yes.
Apply the rules for parsing floating-point number values to the descriptor. If the result is less than 0, let error be yes. Otherwise, let density be the result.
If density is 0, the natural dimensions will be infinite. User agents are expected to have limits in how big images can be rendered.
This is a parse error.
If future-compat-h and density are not both absent, then let error be yes.
Apply the rules for parsing non-negative integers to the descriptor. If the result is 0, let error be yes. Otherwise, let future-compat-h be the result.
Let error be yes.
If future-compat-h is not absent and width is absent, let error be yes.
If error is still no, then append a new image source to candidates whose URL is url, associated with a width width if not absent and a pixel density density if not absent. Otherwise, there is a parse error.
Return to the step labeled splitting loop.
When asked to parse a sizes attribute from an element element, with an
img
element or null img:
Let unparsed sizes list be the result of parsing a comma-separated list of component values from the value of element's sizes attribute (or the empty string, if the attribute is absent). CSSSYNTAX
Let size be null.
For each unparsed size in unparsed sizes list:
Remove all consecutive <whitespace-token>s from the end of unparsed size. If unparsed size is now empty, then that is a parse error; continue.
If the last component value in unparsed size is a valid non-negative <source-size-value>, then set size to its value and remove the component value from unparsed size. Any CSS function other than the math functions is invalid. Otherwise, there is a parse error; continue.
If size is auto
, and img
is not null, and img is being rendered, and img
allows auto-sizes, then set size to the concrete object
size width of img, in CSS pixels.
If size is still auto
,
then it will be ignored.
Remove all consecutive <whitespace-token>s from the end of unparsed size. If unparsed size is now empty:
If this was not the last item in unparsed sizes list, that is a parse error.
If size is not auto
, then return
size. Otherwise, continue.
Parse the remaining component values in unparsed size as a <media-condition>. If it does not parse correctly, or it does parse correctly but the <media-condition> evaluates to false, continue. MQ
If size is not auto
, then return
size. Otherwise, continue.
Return 100vw
.
It is invalid to use a bare <source-size-value> that is a <length>
(without an accompanying <media-condition>)
as an entry in the <source-size-list> that is not the last entry.
However, the parsing algorithm allows it at any point in the <source-size-list>,
and will accept it immediately as the size
if the preceding entries in the list weren't used.
This is to enable future extensions,
and protect against simple author errors such as a final trailing comma.
A bare auto
keyword is allowed to have other entries
following it to provide a fallback for legacy user agents.
An image source can have a pixel density descriptor, a width descriptor, or no descriptor at all accompanying its URL. Normalizing a source set gives every image source a pixel density descriptor.
When asked to normalize the source densities of a source set source set, the user agent must do the following:
Let source size be source set's source size.
For each image source in source set:
If the image source has a pixel density descriptor, continue to the next image source.
Otherwise, if the image source has a width descriptor, replace the width
descriptor with a pixel density descriptor with a value of the width descriptor value divided by the source size and a unit
of x
.
If the source size is 0, then the density would be infinity, which results in the natural dimensions being 0 by 0.
Otherwise, give the image source a pixel density descriptor of 1x
.
The user agent may at any time run the following algorithm to update an img
element's image in order to react to changes in the
environment. (User agents are not required to ever run this algorithm; for example,
if the user is not looking at the page any more, the user agent might want to wait until the user
has returned to the page before determining which image to use, in case the environment changes
again in the meantime.)
User agents are encouraged to run this algorithm in particular when the user changes
the viewport's size (e.g. by resizing the window or changing the page zoom), and when
an img
element is inserted into a
document, so that the density-corrected natural width and height match the
new viewport, and so that the correct image is chosen when art direction
is involved.
Await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended. (Steps in synchronous sections are marked with ⌛.)
⌛ If the img
element does not use srcset
or
picture
, its node document is not fully active, has
image data whose resource type is multipart/x-mixed-replace
, or the pending
request is not null, then return.
⌛ Let selected source and selected pixel density be the URL and pixel density that results from selecting an image source, respectively.
⌛ If selected source is null, then return.
⌛ If selected source and selected pixel density are the same as the element's last selected source and current pixel density, then return.
⌛ Let urlString be the result of encoding-parsing-and-serializing a URL given selected source, relative to the element's node document.
⌛ If urlString is failure, then return.
⌛ Let corsAttributeState be the state of the element's crossorigin
content attribute.
⌛ Let origin be the img
element's node
document's origin.
⌛ Let client be the img
element's node
document's relevant settings object.
⌛ Let key be a tuple consisting of urlString, corsAttributeState, and, if corsAttributeState is not No CORS, origin.
⌛ Let image request be a new image request whose current URL is urlString.
⌛ Let the element's pending request be image request.
End the synchronous section, continuing the remaining steps in parallel.
If the list of available images contains an entry for key, then set image request's image data to that of the entry. Continue to the next step.
Otherwise:
Let request be the result of creating a potential-CORS request given
urlString, "image
", and
corsAttributeState.
Set request's client to
client, initiator to "imageset
", and set request's synchronous
flag.
Set request's
referrer policy to the current state of
the element's referrerpolicy
attribute.
Set request's priority to the current state of the element's fetchpriority
attribute.
Let response be the result of fetching request.
If response's unsafe response is a network error or
if the image format is unsupported (as determined by applying the image sniffing rules, again as mentioned earlier),
or if the user agent is able to determine that image request's image is corrupted in
some fatal way such that the image dimensions cannot be obtained, or if the resource type is
multipart/x-mixed-replace
, then let pending request be null and abort
these steps.
Otherwise, response's unsafe response is image
request's image data. It can be either
CORS-same-origin or CORS-cross-origin; this affects the image's
interaction with other APIs (e.g., when used on a canvas
).
Queue an element task on the DOM manipulation task source given
the img
element and the following steps:
If the img
element has experienced relevant mutations
since this algorithm started, then let pending request be null and abort these
steps.
Let the img
element's last selected source be selected
source and the img
element's current pixel density be
selected pixel density.
Set the image request's state to completely available.
Add the image to the list of available images using the key key, with the ignore higher-layer caching flag set.
Upgrade the pending request to the current request.
Prepare image request for
presentation given the img
element.
Fire an event named load
at the img
element.
Except where otherwise specified, the alt
attribute must be
specified and its value must not be empty; the value must be an appropriate replacement for the
image. The specific requirements for the alt
attribute depend on
what the image is intended to represent, as described in the following sections.
The most general rule to consider when writing alternative text is the following: the
intent is that replacing every image with the text of its alt
attribute does not change the meaning of the page.
So, in general, alternative text can be written by considering what one would have written had one not been able to include the image.
A corollary to this is that the alt
attribute's value should
never contain text that could be considered the image's caption, title, or
legend. It is supposed to contain replacement text that could be used by users
instead of the image; it is not meant to supplement the image. The title
attribute can be used for supplemental information.
Another corollary is that the alt
attribute's value should
not repeat information that is already provided in the prose next to the image.
One way to think of alternative text is to think about how you would read the page containing the image to someone over the phone, without mentioning that there is an image present. Whatever you say instead of the image is typically a good start for writing the alternative text.
When an a
element that creates a hyperlink, or a button
element, has no textual content but contains one or more images, the alt
attributes must contain text that together convey the purpose of
the link or button.
In this example, a user is asked to pick their preferred color from a list of three. Each color is given by an image, but for users who have configured their user agent not to display images, the color names are used instead:
<h1>Pick your color</h1>
<ul>
<li><a href="green.html"><img src="green.jpeg" alt="Green"></a></li>
<li><a href="blue.html"><img src="blue.jpeg" alt="Blue"></a></li>
<li><a href="red.html"><img src="red.jpeg" alt="Red"></a></li>
</ul>
In this example, each button has a set of images to indicate the kind of color output desired by the user. The first image is used in each case to give the alternative text.
<button name="rgb"><img src="red" alt="RGB"><img src="green" alt=""><img src="blue" alt=""></button>
<button name="cmyk"><img src="cyan" alt="CMYK"><img src="magenta" alt=""><img src="yellow" alt=""><img src="black" alt=""></button>
Since each image represents one part of the text, it could also be written like this:
<button name="rgb"><img src="red" alt="R"><img src="green" alt="G"><img src="blue" alt="B"></button>
<button name="cmyk"><img src="cyan" alt="C"><img src="magenta" alt="M"><img src="yellow" alt="Y"><img src="black" alt="K"></button>
However, with other alternative text, this might not work, and putting all the alternative text into one image in each case might make more sense:
<button name="rgb"><img src="red" alt="sRGB profile"><img src="green" alt=""><img src="blue" alt=""></button>
<button name="cmyk"><img src="cyan" alt="CMYK profile"><img src="magenta" alt=""><img src="yellow" alt=""><img src="black" alt=""></button>
Sometimes something can be more clearly stated in graphical form, for example as a flowchart, a
diagram, a graph, or a simple map showing directions. In such cases, an image can be given using
the img
element, but the lesser textual version must still be given, so that users
who are unable to view the image (e.g. because they have a very slow connection, or because they
are using a text-only browser, or because they are listening to the page being read out by a
hands-free automobile voice web browser, or simply because they are blind) are still able to
understand the message being conveyed.
The text must be given in the alt
attribute, and must convey
the same message as the image specified in the src
attribute.
It is important to realize that the alternative text is a replacement for the image, not a description of the image.
In the following example we have a flowchart
in image form, with text in the alt
attribute rephrasing the
flowchart in prose form:
<p>In the common case, the data handled by the tokenization stage
comes from the network, but it can also come from script.</p>
<p><img src="images/parsing-model-overview.svg" alt="The Network
passes data to the Input Stream Preprocessor, which passes it to the
Tokenizer, which passes it to the Tree Construction stage. From there,
data goes to both the DOM and to Script Execution. Script Execution is
linked to the DOM, and, using document.write(), passes data to the
Tokenizer."></p>
Here's another example, showing a good solution and a bad solution to the problem of including an image in a description.
First, here's the good solution. This sample shows how the alternative text should just be what you would have put in the prose if the image had never existed.
<!-- This is the correct way to do things. -->
<p>
You are standing in an open field west of a house.
<img src="house.jpeg" alt="The house is white, with a boarded front door.">
There is a small mailbox here.
</p>
Second, here's the bad solution. In this incorrect way of doing things, the alternative text is simply a description of the image, instead of a textual replacement for the image. It's bad because when the image isn't shown, the text doesn't flow as well as in the first example.
<!-- This is the wrong way to do things. -->
<p>
You are standing in an open field west of a house.
<img src="house.jpeg" alt="A white house, with a boarded front door.">
There is a small mailbox here.
</p>
Text such as "Photo of white house with boarded door" would be equally bad alternative text
(though it could be suitable for the title
attribute or in the
figcaption
element of a figure
with this image).
A document can contain information in iconic form. The icon is intended to help users of visual browsers to recognize features at a glance.
In some cases, the icon is supplemental to a text label conveying the same meaning. In those
cases, the alt
attribute must be present but must be empty.
Here the icons are next to text that conveys the same meaning, so they have an empty alt
attribute:
<nav>
<p><a href="/help/"><img src="/icons/help.png" alt=""> Help</a></p>
<p><a href="/configure/"><img src="/icons/configuration.png" alt="">
Configuration Tools</a></p>
</nav>
In other cases, the icon has no text next to it describing what it means; the icon is supposed
to be self-explanatory. In those cases, an equivalent textual label must be given in the alt
attribute.
Here, posts on a news site are labeled with an icon indicating their topic.
<body>
<article>
<header>
<h1>Ratatouille wins <i>Best Movie of the Year</i> award</h1>
<p><img src="movies.png" alt="Movies"></p>
</header>
<p>Pixar has won yet another <i>Best Movie of the Year</i> award,
making this its 8th win in the last 12 years.</p>
</article>
<article>
<header>
<h1>Latest TWiT episode is online</h1>
<p><img src="podcasts.png" alt="Podcasts"></p>
</header>
<p>The latest TWiT episode has been posted, in which we hear
several tech news stories as well as learning much more about the
iPhone. This week, the panelists compare how reflective their
iPhones' Apple logos are.</p>
</article>
</body>
Many pages include logos, insignia, flags, or emblems, which stand for a particular entity such as a company, organization, project, band, software package, country, or some such.
If the logo is being used to represent the entity, e.g. as a page heading, the alt
attribute must contain the name of the entity being represented by
the logo. The alt
attribute must not contain text like
the word "logo", as it is not the fact that it is a logo that is being conveyed, it's the entity
itself.
If the logo is being used next to the name of the entity that it represents, then the logo is
supplemental, and its alt
attribute must instead be empty.
If the logo is merely used as decorative material (as branding, or, for example, as a side image in an article that mentions the entity to which the logo belongs), then the entry below on purely decorative images applies. If the logo is actually being discussed, then it is being used as a phrase or paragraph (the description of the logo) with an alternative graphical representation (the logo itself), and the first entry above applies.
In the following snippets, all four of the above cases are present. First, we see a logo used to represent a company:
<h1><img src="XYZ.gif" alt="The XYZ company"></h1>
Next, we see a paragraph which uses a logo right next to the company name, and so doesn't have any alternative text:
<article>
<h2>News</h2>
<p>We have recently been looking at buying the <img src="alpha.gif"
alt=""> ΑΒΓ company, a small Greek company
specializing in our type of product.</p>
In this third snippet, we have a logo being used in an aside, as part of the larger article discussing the acquisition:
<aside><p><img src="alpha-large.gif" alt=""></p></aside>
<p>The ΑΒΓ company has had a good quarter, and our
pie chart studies of their accounts suggest a much bigger blue slice
than its green and orange slices, which is always a good sign.</p>
</article>
Finally, we have an opinion piece talking about a logo, and the logo is therefore described in detail in the alternative text.
<p>Consider for a moment their logo:</p>
<p><img src="/images/logo" alt="It consists of a green circle with a
green question mark centered inside it."></p>
<p>How unoriginal can you get? I mean, oooooh, a question mark, how
<em>revolutionary</em>, how utterly <em>ground-breaking</em>, I'm
sure everyone will rush to adopt those specifications now! They could
at least have tried for some sort of, I don't know, sequence of
rounded squares with varying shades of green and bold white outlines,
at least that would look good on the cover of a blue book.</p>
This example shows how the alternative text should be written such that if the image isn't available, and the text is used instead, the text flows seamlessly into the surrounding text, as if the image had never been there in the first place.
Sometimes, an image just consists of text, and the purpose of the image is not to highlight the actual typographic effects used to render the text, but just to convey the text itself.
In such cases, the alt
attribute must be present but must
consist of the same text as written in the image itself.
Consider a graphic containing the text "Earth Day", but with the letters all decorated with flowers and plants. If the text is merely being used as a heading, to spice up the page for graphical users, then the correct alternative text is just the same text "Earth Day", and no mention need be made of the decorations:
<h1><img src="earthdayheading.png" alt="Earth Day"></h1>
An illuminated manuscript might use graphics for some of its images. The alternative text in such a situation is just the character that the image represents.
<p><img src="initials/o.svg" alt="O">nce upon a time and a long long time ago, late at
night, when it was dark, over the hills, through the woods, across a great ocean, in a land far
away, in a small house, on a hill, under a full moon...
When an image is used to represent a character that cannot otherwise be represented in Unicode, for example gaiji, itaiji, or new characters such as novel currency symbols, the alternative text should be a more conventional way of writing the same thing, e.g. using the phonetic hiragana or katakana to give the character's pronunciation.
In this example from 1997, a new-fangled currency symbol that looks like a curly E with two bars in the middle instead of one is represented using an image. The alternative text gives the character's pronunciation.
<p>Only <img src="euro.png" alt="euro ">5.99!
An image should not be used if characters would serve an identical purpose. Only when the text cannot be directly represented using text, e.g., because of decorations or because there is no appropriate character (as in the case of gaiji), would an image be appropriate.
If an author is tempted to use an image because their default system font does not support a given character, then web fonts are a better solution than images.
In many cases, the image is actually just supplementary, and its presence merely reinforces the
surrounding text. In these cases, the alt
attribute must be
present but its value must be the empty string.
In general, an image falls into this category if removing the image doesn't make the page any less useful, but including the image makes it a lot easier for users of visual browsers to understand the concept.
A flowchart that repeats the previous paragraph in graphical form:
<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<p><img src="images/parsing-model-overview.svg" alt=""></p>
In these cases, it would be wrong to include alternative text that consists of just a caption.
If a caption is to be included, then either the title
attribute
can be used, or the figure
and figcaption
elements can be used. In the
latter case, the image would in fact be a phrase or paragraph with an alternative graphical
representation, and would thus require alternative text.
<!-- Using the title="" attribute -->
<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<p><img src="images/parsing-model-overview.svg" alt=""
title="Flowchart representation of the parsing model."></p>
<!-- Using <figure> and <figcaption> -->
<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<figure>
<img src="images/parsing-model-overview.svg" alt="The Network leads to
the Input Stream Preprocessor, which leads to the Tokenizer, which
leads to the Tree Construction stage. The Tree Construction stage
leads to two items. The first is Script Execution, which leads via
document.write() back to the Tokenizer. The second item from which
Tree Construction leads is the DOM. The DOM is related to the Script
Execution.">
<figcaption>Flowchart representation of the parsing model.</figcaption>
</figure>
<!-- This is WRONG. Do not do this. Instead, do what the above examples do. -->
<p>The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</p>
<p><img src="images/parsing-model-overview.svg"
alt="Flowchart representation of the parsing model."></p>
<!-- Never put the image's caption in the alt="" attribute! -->
A graph that repeats the previous paragraph in graphical form:
<p>According to a study covering several billion pages,
about 62% of documents on the web in 2007 triggered the Quirks
rendering mode of web browsers, about 30% triggered the Almost
Standards mode, and about 9% triggered the Standards mode.</p>
<p><img src="rendering-mode-pie-chart.png" alt=""></p>
Sometimes, an image is not critical to the content, but is nonetheless neither purely
decorative nor entirely redundant with the text. In these cases, the alt
attribute must be present, and its value should either be the
empty string, or a textual representation of the information that the image conveys. If the image
has a caption giving the image's title, then the alt
attribute's value must not be empty (as that would be quite confusing for non-visual readers).
Consider a news article about a political figure, in which the individual's face was shown in an image. The image is not purely decorative, as it is relevant to the story. The image is not entirely redundant with the story either, as it shows what the politician looks like. Whether any alternative text need be provided is an authoring decision, decided by whether the image influences the interpretation of the prose.
In this first variant, the image is shown without context, and no alternative text is provided:
<p><img src="president.jpeg" alt=""> Ahead of today's referendum,
the President wrote an open letter to all registered voters. In it, she admitted that the country was
divided.</p>
If the picture is just a face, there might be no value in describing it. It's of no interest to the reader whether the individual has red hair or blond hair, whether the individual has white skin or black skin, whether the individual has one eye or two eyes.
However, if the picture is more dynamic, for instance showing the politician as angry, or particularly happy, or devastated, some alternative text would be useful in setting the tone of the article, a tone that might otherwise be missed:
<p><img src="president.jpeg" alt="The President is sad.">
Ahead of today's referendum, the President wrote an open letter to all
registered voters. In it, she admitted that the country was divided.
</p>
<p><img src="president.jpeg" alt="The President is happy!">
Ahead of today's referendum, the President wrote an open letter to all
registered voters. In it, she admitted that the country was divided.
</p>
Whether the individual was "sad" or "happy" makes a difference to how the rest of the paragraph is to be interpreted: is she likely saying that she is unhappy with the country being divided, or is she saying that the prospect of a divided country is good for her political career? The interpretation varies based on the image.
If the image has a caption, then including alternative text avoids leaving the non-visual user confused as to what the caption refers to.
<p>Ahead of today's referendum, the President wrote an open letter to
all registered voters. In it, she admitted that the country was divided.</p>
<figure>
<img src="president.jpeg"
alt="A high forehead, cheerful disposition, and dark hair round out the President's face.">
<figcaption> The President of Ruritania. Photo © 2014 PolitiPhoto. </figcaption>
</figure>
If an image is decorative but isn't especially page-specific — for example an image that forms part of a site-wide design scheme — the image should be specified in the site's CSS, not in the markup of the document.
However, a decorative image that isn't discussed by the surrounding text but still has some
relevance can be included in a page using the img
element. Such images are
decorative, but still form part of the content. In these cases, the alt
attribute must be present but its value must be the empty
string.
Examples where the image is purely decorative despite being relevant would include things like a photo of the Black Rock City landscape in a blog post about an event at Burning Man, or an image of a painting inspired by a poem, on a page reciting that poem. The following snippet shows an example of the latter case (only the first verse is included in this snippet):
<h1>The Lady of Shalott</h1>
<p><img src="shalott.jpeg" alt=""></p>
<p>On either side the river lie<br>
Long fields of barley and of rye,<br>
That clothe the wold and meet the sky;<br>
And through the field the road run by<br>
To many-tower'd Camelot;<br>
And up and down the people go,<br>
Gazing where the lilies blow<br>
Round an island there below,<br>
The island of Shalott.</p>
When a picture has been sliced into smaller image files that are then displayed together to
form the complete picture again, one of the images must have its alt
attribute set as per the relevant rules that would be appropriate
for the picture as a whole, and then all the remaining images must have their alt
attribute set to the empty string.
In the following example, a picture representing a company logo for XYZ Corp has been split into two pieces, the first containing the letters "XYZ" and the second with the word "Corp". The alternative text ("XYZ Corp") is all in the first image.
<h1><img src="logo1.png" alt="XYZ Corp"><img src="logo2.png" alt=""></h1>
In the following example, a rating is shown as three filled stars and two empty stars. While the alternative text could have been "★★★☆☆", the author has instead decided to more helpfully give the rating in the form "3 out of 5". That is the alternative text of the first image, and the rest have blank alternative text.
<p>Rating: <meter max=5 value=3><img src="1" alt="3 out of 5"
><img src="1" alt=""><img src="1" alt=""><img src="0" alt=""
><img src="0" alt=""></meter></p>
Generally, image maps should be used instead of slicing an image for links.
However, if an image is indeed sliced and any of the components of the sliced picture are the
sole contents of links, then one image per link must have alternative text in its alt
attribute representing the purpose of the link.
In the following example, a picture representing the flying spaghetti monster emblem, with each of the left noodly appendages and the right noodly appendages in different images, so that the user can pick the left side or the right side in an adventure.
<h1>The Church</h1>
<p>You come across a flying spaghetti monster. Which side of His
Noodliness do you wish to reach out for?</p>
<p><a href="?go=left" ><img src="fsm-left.png" alt="Left side. "></a
><img src="fsm-middle.png" alt=""
><a href="?go=right"><img src="fsm-right.png" alt="Right side."></a></p>
In some cases, the image is a critical part of the content. This could be the case, for instance, on a page that is part of a photo gallery. The image is the whole point of the page containing it.
How to provide alternative text for an image that is a key part of the content depends on the image's provenance.
When it is possible for detailed alternative text to be provided, for example if the image is
part of a series of screenshots in a magazine review, or part of a comic strip, or is a
photograph in a blog entry about that photograph, text that can serve as a substitute for the
image must be given as the contents of the alt
attribute.
A screenshot in a gallery of screenshots for a new OS, with some alternative text:
<figure>
<img src="KDE%20Light%20desktop.png"
alt="The desktop is blue, with icons along the left hand side in
two columns, reading System, Home, K-Mail, etc. A window is
open showing that menus wrap to a second line if they
cannot fit in the window. The window has a list of icons
along the top, with an address bar below it, a list of
icons for tabs along the left edge, a status bar on the
bottom, and two panes in the middle. The desktop has a bar
at the bottom of the screen with a few buttons, a pager, a
list of open applications, and a clock.">
<figcaption>Screenshot of a KDE desktop.</figcaption>
</figure>
A graph in a financial report:
<img src="sales.gif"
title="Sales graph"
alt="From 1998 to 2005, sales increased by the following percentages
with each year: 624%, 75%, 138%, 40%, 35%, 9%, 21%">
Note that "sales graph" would be inadequate alternative text for a sales graph. Text that would be a good caption is not generally suitable as replacement text.
In certain cases, the nature of the image might be such that providing thorough alternative text is impractical. For example, the image could be indistinct, or could be a complex fractal, or could be a detailed topographical map.
In these cases, the alt
attribute must contain some
suitable alternative text, but it may be somewhat brief.
Sometimes there simply is no text that can do justice to an image. For example, there is little that can be said to usefully describe a Rorschach inkblot test. However, a description, even if brief, is still better than nothing:
<figure>
<img src="/commons/a/a7/Rorschach1.jpg" alt="A shape with left-right
symmetry with indistinct edges, with a small gap in the center, two
larger gaps offset slightly from the center, with two similar gaps
under them. The outline is wider in the top half than the bottom
half, with the sides extending upwards higher than the center, and
the center extending below the sides.">
<figcaption>A black outline of the first of the ten cards
in the Rorschach inkblot test.</figcaption>
</figure>
Note that the following would be a very bad use of alternative text:
<!-- This example is wrong. Do not copy it. -->
<figure>
<img src="/commons/a/a7/Rorschach1.jpg" alt="A black outline
of the first of the ten cards in the Rorschach inkblot test.">
<figcaption>A black outline of the first of the ten cards
in the Rorschach inkblot test.</figcaption>
</figure>
Including the caption in the alternative text like this isn't useful because it effectively duplicates the caption for users who don't have images, taunting them twice yet not helping them any more than if they had only read or heard the caption once.
Another example of an image that defies full description is a fractal, which, by definition, is infinite in detail.
The following example shows one possible way of providing alternative text for the full view of an image of the Mandelbrot set.
<img src="ms1.jpeg" alt="The Mandelbrot set appears as a cardioid with
its cusp on the real axis in the positive direction, with a smaller
bulb aligned along the same center line, touching it in the negative
direction, and with these two shapes being surrounded by smaller bulbs
of various sizes.">
Similarly, a photograph of a person's face, for example in a biography, can be considered quite relevant and key to the content, but it can be hard to fully substitute text for:
<section class="bio">
<h1>A Biography of Isaac Asimov</h1>
<p>Born <b>Isaak Yudovich Ozimov</b> in 1920, Isaac was a prolific author.</p>
<p><img src="headpics/asimov.jpeg" alt="Isaac Asimov had dark hair, a tall forehead, and wore glasses.
Later in life, he wore long white sideburns."></p>
<p>Asimov was born in Russia, and moved to the US when he was three years old.</p>
<p>...</p>
</section>
In such cases it is unnecessary (and indeed discouraged) to include a reference to the presence of the image itself in the alternative text, since such text would be redundant with the browser itself reporting the presence of the image. For example, if the alternative text was "A photo of Isaac Asimov", then a conforming user agent might read that out as "(Image) A photo of Isaac Asimov" rather than the more useful "(Image) Isaac Asimov had dark hair, a tall forehead, and wore glasses...".
In some unfortunate cases, there might be no alternative text available at all, either because the image is obtained in some automated fashion without any associated alternative text (e.g., a webcam), or because the page is being generated by a script using user-provided images where the user did not provide suitable or usable alternative text (e.g. photograph sharing sites), or because the author does not themself know what the images represent (e.g. a blind photographer sharing an image on their blog).
In such cases, the alt
attribute may be omitted, but one of
the following conditions must be met as well:
The title
attribute is present and has a non-empty
value.
Relying on the title
attribute is currently
discouraged as many user agents do not expose the attribute in an accessible manner as
required by this specification (e.g. requiring a pointing device such as a mouse to cause a
tooltip to appear, which excludes keyboard-only users and touch-only users, such as anyone
with a modern phone or tablet).
Such cases are to be kept to an absolute minimum. If there is even the slightest
possibility of the author having the ability to provide real alternative text, then it would not
be acceptable to omit the alt
attribute.
A photo on a photo-sharing site, if the site received the image with no metadata other than the caption, could be marked up as follows:
<figure>
<img src="1100670787_6a7c664aef.jpg">
<figcaption>Bubbles traveled everywhere with us.</figcaption>
</figure>
It would be better, however, if a detailed description of the important parts of the image obtained from the user and included on the page.
A blind user's blog in which a photo taken by the user is shown. Initially, the user might not have any idea what the photo they took shows:
<article>
<h1>I took a photo</h1>
<p>I went out today and took a photo!</p>
<figure>
<img src="photo2.jpeg">
<figcaption>A photograph taken blindly from my front porch.</figcaption>
</figure>
</article>
Eventually though, the user might obtain a description of the image from their friends and could then include alternative text:
<article>
<h1>I took a photo</h1>
<p>I went out today and took a photo!</p>
<figure>
<img src="photo2.jpeg" alt="The photograph shows my squirrel
feeder hanging from the edge of my roof. It is half full, but there
are no squirrels around. In the background, out-of-focus trees fill the
shot. The feeder is made of wood with a metal grate, and it contains
peanuts. The edge of the roof is wooden too, and is painted white
with light blue streaks.">
<figcaption>A photograph taken blindly from my front porch.</figcaption>
</figure>
</article>
Sometimes the entire point of the image is that a textual description is not available, and
the user is to provide the description. For instance, the point of a CAPTCHA image is to see if
the user can literally read the graphic. Here is one way to mark up a CAPTCHA (note the title
attribute):
<p><label>What does this image say?
<img src="captcha.cgi?id=8934" title="CAPTCHA">
<input type=text name=captcha></label>
(If you cannot see the image, you can use an <a
href="?audio">audio</a> test instead.)</p>
Another example would be software that displays images and asks for alternative text precisely for the purpose of then writing a page with correct alternative text. Such a page could have a table of images, like this:
<table>
<thead>
<tr> <th> Image <th> Description
<tbody>
<tr>
<td> <img src="2421.png" title="Image 640 by 100, filename 'banner.gif'">
<td> <input name="alt2421">
<tr>
<td> <img src="2422.png" title="Image 200 by 480, filename 'ad3.gif'">
<td> <input name="alt2422">
</table>
Notice that even in this example, as much useful information as possible is still included
in the title
attribute.
Since some users cannot use images at all (e.g. because they have a very slow
connection, or because they are using a text-only browser, or because they are listening to the
page being read out by a hands-free automobile voice web browser, or simply because they are
blind), the alt
attribute is only allowed to be omitted rather
than being provided with replacement text when no alternative text is available and none can be
made available, as in the above examples. Lack of effort from the part of the author is not an
acceptable reason for omitting the alt
attribute.
Generally authors should avoid using img
elements for purposes other than showing
images.
If an img
element is being used for purposes other than showing an image, e.g. as
part of a service to count page views, then the alt
attribute
must be the empty string.
In such cases, the width
and height
attributes should both be set to zero.
This section does not apply to documents that are publicly accessible, or whose target audience is not necessarily personally known to the author, such as documents on a web site, emails sent to public mailing lists, or software documentation.
When an image is included in a private communication (such as an HTML email) aimed at a
specific person who is known to be able to view images, the alt
attribute may be omitted. However, even in such cases authors are strongly urged to include
alternative text (as appropriate according to the kind of image involved, as described in the
above entries), so that the email is still usable should the user use a mail client that does not
support images, or should the document be forwarded on to other users whose abilities might not
include easily seeing images.
Markup generators (such as WYSIWYG authoring tools) should, wherever possible, obtain alternative text from their users. However, it is recognized that in many cases, this will not be possible.
For images that are the sole contents of links, markup generators should examine the link target to determine the title of the target, or the URL of the target, and use information obtained in this manner as the alternative text.
For images that have captions, markup generators should use the figure
and
figcaption
elements, or the title
attribute, to
provide the image's caption.
As a last resort, implementers should either set the alt
attribute to the empty string, under the assumption that the image is a purely decorative image
that doesn't add any information but is still specific to the surrounding content, or omit the
alt
attribute altogether, under the assumption that the image is
a key part of the content.
Markup generators may specify a generator-unable-to-provide-required-alt
attribute on img
elements for which they have been unable to obtain alternative text
and for which they have therefore omitted the alt
attribute. The
value of this attribute must be the empty string. Documents containing such attributes are not
conforming, but conformance checkers will silently
ignore this error.
This is intended to avoid markup generators from being pressured into replacing
the error of omitting the alt
attribute with the even more
egregious error of providing phony alternative text, because state-of-the-art automated
conformance checkers cannot distinguish phony alternative text from correct alternative text.
Markup generators should generally avoid using the image's own filename as the alternative text. Similarly, markup generators should avoid generating alternative text from any content that will be equally available to presentation user agents (e.g., web browsers).
This is because once a page is generated, it will typically not be updated, whereas the browsers that later read the page can be updated by the user, therefore the browser is likely to have more up-to-date and finely-tuned heuristics than the markup generator did when generating the page.
A conformance checker must report the lack of an alt
attribute as an error unless one of the conditions listed below applies:
The img
element is in a figure
element that satisfies the conditions described above.
The img
element has a title
attribute with a
value that is not the empty string (also as described
above).
The conformance checker has been configured to assume that the document is an email or document intended for a specific person who is known to be able to view images.
The img
element has a (non-conforming) generator-unable-to-provide-required-alt
attribute whose value is the empty string. A conformance checker that is not reporting the lack
of an alt
attribute as an error must also not report the
presence of the empty generator-unable-to-provide-required-alt
attribute as an error. (This case does not represent a case where the document is conforming,
only that the generator could not determine appropriate alternative text — validators are
not required to show an error in this case, because such an error might encourage markup
generators to include bogus alternative text purely in an attempt to silence validators.
Naturally, conformance checkers may report the lack of an alt
attribute as an error even in the presence of the generator-unable-to-provide-required-alt
attribute; for example, there could be a user option to report all conformance errors
even those that might be the more or less inevitable result of using a markup
generator.)
iframe
elementsrc
srcdoc
name
sandbox
allow
allowfullscreen
width
height
referrerpolicy
loading
[Exposed=Window]
interface HTMLIFrameElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString src;
[CEReactions] attribute (TrustedHTML
or DOMString) srcdoc;
[CEReactions] attribute DOMString name;
[SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
[CEReactions] attribute DOMString allow;
[CEReactions] attribute boolean allowFullscreen;
[CEReactions] attribute DOMString width;
[CEReactions] attribute DOMString height;
[CEReactions] attribute DOMString referrerPolicy;
[CEReactions] attribute DOMString loading;
readonly attribute Document? contentDocument;
readonly attribute WindowProxy? contentWindow;
Document? getSVGDocument();
// also has obsolete members
};
HTMLIFrameElement
.The iframe
element represents its content navigable.
The src
attribute
gives the URL of a page that the element's content navigable is to
contain. The attribute, if present, must be a valid non-empty URL potentially surrounded by
spaces. If the itemprop
attribute is specified on an
iframe
element, then the src
attribute must
also be specified.
The srcdoc
attribute gives the content of the page that the element's content navigable is to
contain. The value of the attribute is used to construct an iframe
srcdoc
document, which is a Document
whose
URL matches about:srcdoc
.
The srcdoc
attribute, if present, must have a value
using the HTML syntax that consists of the following syntactic components, in the
given order:
html
element.The above requirements apply in XML documents as well.
Here a blog uses the srcdoc
attribute in conjunction
with the sandbox
attribute described below to provide
users of user agents that support this feature with an extra layer of protection from script
injection in the blog post comments:
<article>
<h1>I got my own magazine!</h1>
<p>After much effort, I've finally found a publisher, and so now I
have my own magazine! Isn't that awesome?! The first issue will come
out in September, and we have articles about getting food, and about
getting in boxes, it's going to be great!</p>
<footer>
<p>Written by <a href="/users/cap">cap</a>, 1 hour ago.
</footer>
<article>
<footer> Thirteen minutes ago, <a href="/users/ch">ch</a> wrote: </footer>
<iframe sandbox srcdoc="<p>did you get a cover picture yet?"></iframe>
</article>
<article>
<footer> Nine minutes ago, <a href="/users/cap">cap</a> wrote: </footer>
<iframe sandbox srcdoc="<p>Yeah, you can see it <a href="/gallery?mode=cover&amp;page=1">in my gallery</a>."></iframe>
</article>
<article>
<footer> Five minutes ago, <a href="/users/ch">ch</a> wrote: </footer>
<iframe sandbox srcdoc="<p>hey that's earl's table.
<p>you should get earl&amp;me on the next cover."></iframe>
</article>
Notice the way that quotes have to be escaped (otherwise the srcdoc
attribute would end prematurely), and the way raw
ampersands (e.g. in URLs or in prose) mentioned in the sandboxed content have to be
doubly escaped — once so that the ampersand is preserved when originally parsing
the srcdoc
attribute, and once more to prevent the
ampersand from being misinterpreted when parsing the sandboxed content.
Furthermore, notice that since the DOCTYPE is optional in
iframe
srcdoc
documents, and the html
,
head
, and body
elements have optional
start and end tags, and the title
element is also optional in iframe
srcdoc
documents, the markup in a srcdoc
attribute can be
relatively succinct despite representing an entire document, since only the contents of the
body
element need appear literally in the syntax. The other elements are still
present, but only by implication.
In the HTML syntax, authors need only remember to use U+0022
QUOTATION MARK characters (") to wrap the attribute contents and then to escape all U+0026
AMPERSAND (&) and U+0022 QUOTATION MARK (") characters, and to specify the sandbox
attribute, to ensure safe embedding of content. (And
remember to escape ampersands before quotation marks, to ensure quotation marks become "
and not &quot;.)
In XML the U+003C LESS-THAN SIGN character (<) needs to be escaped as well. In order to prevent attribute-value normalization, some of XML's whitespace characters — specifically U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED (LF), and U+000D CARRIAGE RETURN (CR) — also need to be escaped. XML
If the src
attribute and the srcdoc
attribute are both specified together, the srcdoc
attribute takes priority. This allows authors to provide
a fallback URL for legacy user agents that do not support the srcdoc
attribute.
The iframe
HTML element insertion steps, given
insertedNode, are:
If insertedNode's shadow-including root's browsing context is null, then return.
Create a new child navigable for insertedNode.
If insertedNode has a sandbox
attribute, then parse the sandboxing
directive given the attribute's value and insertedNode's
iframe
sandboxing flag set.
Process the iframe
attributes for insertedNode, with
initialInsertion set to true.
The iframe
HTML element removing steps, given
removedNode, are to destroy a child navigable given
removedNode.
This happens without any unload
events firing
(the element's content document is destroyed, not unloaded).
Although iframe
s are processed while in a shadow tree,
per the above, several other aspects of their behavior are not well-defined with regards to
shadow trees. See issue #763 for more
detail.
Whenever an iframe
element with a non-null content navigable has its
srcdoc
attribute set, changed, or removed, the user
agent must process the iframe
attributes.
Similarly, whenever an iframe
element with a non-null content
navigable but with no srcdoc
attribute specified
has its src
attribute set, changed, or removed, the user
agent must process the iframe
attributes.
To process the iframe
attributes for an element element,
with an optional boolean initialInsertion (default false):
If element's srcdoc
attribute is
specified, then:
Set element's current navigation was lazy loaded boolean to false.
If the will lazy load element steps given element return true, then:
Set element's lazy load resumption steps to the rest of this algorithm starting with the step labeled navigate to the srcdoc resource.
Set element's current navigation was lazy loaded boolean to true.
Start intersection-observing a lazy loading element for element.
Return.
Navigate to the srcdoc resource: Navigate an iframe
or
frame
given element, about:srcdoc
, the empty
string, and the value of element's srcdoc
attribute.
The resulting Document
must be considered an iframe
srcdoc
document.
Otherwise:
Let url be the result of running the shared attribute processing steps
for iframe
and frame
elements given element and
initialInsertion.
If url is null, then return.
If url matches about:blank
and
initialInsertion is true, then:
Run the iframe load event steps given element.
Return.
Let referrerPolicy be the current state of element's referrerpolicy
content attribute.
Set element's current navigation was lazy loaded boolean to false.
If the will lazy load element steps given element return true, then:
Set element's lazy load resumption steps to the rest of this algorithm starting with the step labeled navigate.
Set element's current navigation was lazy loaded boolean to true.
Start intersection-observing a lazy loading element for element.
Return.
Navigate: Navigate an iframe
or frame
given element, url, and referrerPolicy.
The shared attribute processing steps
for iframe
and frame
elements, given an element
element and a boolean initialInsertion, are:
Let url be the URL record about:blank
.
If element has a src
attribute specified,
and its value is not the empty string, then:
Let maybeURL be the result of encoding-parsing a URL given that attribute's value, relative to element's node document.
If maybeURL is not failure, then set url to maybeURL.
If the inclusive ancestor navigables of element's node navigable contains a navigable whose active document's URL equals url with exclude fragments set to true, then return null.
If url matches about:blank
and
initialInsertion is true, then perform the URL and history update steps
given element's content navigable's active
document and url.
This is necessary in case url is something like about:blank?foo
. If url is just plain about:blank
, this will do nothing.
Return url.
To navigate an iframe
or frame
given an element
element, a URL url, a referrer policy
referrerPolicy, and an optional string-or-null srcdocString (default
null):
Let historyHandling be "auto
".
If element's content navigable's active document is not completely loaded, then set
historyHandling to "replace
".
If element is an iframe
, then set element's pending resource-timing start time to
the current high resolution time given element's
node document's relevant global object.
Navigate element's content navigable to url using element's node document, with historyHandling set to historyHandling, referrerPolicy set to referrerPolicy, and documentResource set to srcdocString.
Each Document
has an iframe load in progress flag and a mute
iframe load flag. When a Document
is created, these flags must be unset for
that Document
.
To run the iframe load event steps, given an iframe
element
element:
Assert: element's content navigable is not null.
Let childDocument be element's content navigable's active document.
If childDocument has its mute iframe load flag set, then return.
If element's pending resource-timing start time is not null, then:
Let global be element's node document's relevant global object.
Let fallbackTimingInfo be a new fetch timing info whose start time is element's pending resource-timing start time and whose response end time is the current high resolution time given global.
Mark resource timing given fallbackTimingInfo, url,
"iframe
", global, the empty string, a new
response body info, and 0.
Set element's pending resource-timing start time to null.
Set childDocument's iframe load in progress flag.
Fire an event named load
at element.
Unset childDocument's iframe load in progress flag.
This, in conjunction with scripting, can be used to probe the URL space of the local network's HTTP servers. User agents may implement cross-origin access control policies that are stricter than those described above to mitigate this attack, but unfortunately such policies are typically not compatible with existing web content.
If an element type potentially delays the load event, then for each element element of that type, the user agent must delay the load event of element's node document if element's content navigable is non-null and any of the following are true:
element's content navigable's active document is not ready for post-load tasks;
element's content navigable's is delaying load
events is true; or
anything is delaying the load event of element's content navigable's active document.
If, during the handling of the load
event,
element's content navigable is again navigated, that will further delay the load event.
Each iframe
element has an associated current navigation was lazy
loaded boolean, initially false. It is set and unset in the process the
iframe
attributes algorithm.
An iframe
element whose current navigation was lazy loaded boolean is
false potentially delays the load event.
Each iframe
element has an associated null or
DOMHighResTimeStamp
pending resource-timing start time,
initially set to null.
If, when the element is created, the srcdoc
attribute is not set, and the src
attribute is either also not set or set but its value cannot
be parsed, the element's content
navigable will remain at the initial
about:blank
Document
.
If the user navigates away from this page, the
iframe
's content navigable's active
WindowProxy
object will proxy new Window
objects for new
Document
objects, but the src
attribute will
not change.
The name
attribute, if present, must be a valid navigable target name. The given value is
used to name the element's content navigable if present when that is created.
The sandbox
attribute, when specified, enables a set of extra restrictions on any content hosted by the
iframe
. Its value must be an unordered set of unique space-separated
tokens that are ASCII case-insensitive. The allowed values are:
allow-downloads
allow-forms
allow-modals
allow-orientation-lock
allow-pointer-lock
allow-popups
allow-popups-to-escape-sandbox
allow-presentation
allow-same-origin
allow-scripts
allow-top-navigation
allow-top-navigation-by-user-activation
allow-top-navigation-to-custom-protocols
When the attribute is set, the content is treated as being from a unique opaque origin, forms, scripts, and various potentially
annoying APIs are disabled, and links are prevented from targeting other navigables. The allow-same-origin
keyword causes the
content to be treated as being from its real origin instead of forcing it into an opaque origin; the allow-top-navigation
keyword allows the
content to navigate its traversable navigable;
the allow-top-navigation-by-user-activation
keyword behaves similarly but allows such navigation only when the
browsing context's active window has transient
activation; the allow-top-navigation-to-custom-protocols
reenables navigations toward non fetch scheme to be handed off to external software; and the allow-forms
, allow-modals
, allow-orientation-lock
, allow-pointer-lock
, allow-popups
, allow-presentation
, allow-scripts
, and allow-popups-to-escape-sandbox
keywords re-enable forms, modal dialogs, screen orientation lock, the pointer lock API, popups,
the presentation API, scripts, and the creation of unsandboxed auxiliary browsing contexts respectively. The allow-downloads
keyword allows content to
perform downloads. POINTERLOCK SCREENORIENTATION PRESENTATION
The allow-top-navigation
and allow-top-navigation-by-user-activation
keywords must not both be specified, as doing so is redundant; only allow-top-navigation
will have an effect
in such non-conformant markup.
Similarly, the allow-top-navigation-to-custom-protocols
keyword must not be specified if either allow-top-navigation
or allow-popups
are specified, as doing so is
redundant.
To allow alert()
, confirm()
, and prompt()
inside
sandboxed content, both the allow-modals
and allow-same-origin
keywords need to
be specified, and the loaded URL needs to be same origin with the top-level
origin. Without the allow-same-origin
keyword, the content is
always treated as cross-origin, and cross-origin content cannot show simple
dialogs.
Setting both the allow-scripts
and allow-same-origin
keywords together when the
embedded page has the same origin as the page containing the iframe
allows the embedded page to simply remove the sandbox
attribute and then reload itself, effectively breaking out of the sandbox altogether.
These flags only take effect when the content navigable of the
iframe
element is navigated. Removing them, or
removing the entire sandbox
attribute, has no effect on
an already-loaded page.
Potentially hostile files should not be served from the same server as the file
containing the iframe
element. Sandboxing hostile content is of minimal help if an
attacker can convince the user to just visit the hostile content directly, rather than in the
iframe
. To limit the damage that can be caused by hostile HTML content, it should be
served from a separate dedicated domain. Using a different domain ensures that scripts in the
files are unable to attack the site, even if the user is tricked into visiting those pages
directly, without the protection of the sandbox
attribute.
When an iframe
element's sandbox
attribute is set or changed while it has a non-null content navigable, the user
agent must parse the sandboxing directive
given the attribute's value and the iframe
element's iframe
sandboxing flag set.
When an iframe
element's sandbox
attribute is removed while it has a non-null content navigable, the user agent must
empty the iframe
element's iframe
sandboxing flag set.
In this example, some completely-unknown, potentially hostile, user-provided HTML content is embedded in a page. Because it is served from a separate domain, it is affected by all the normal cross-site restrictions. In addition, the embedded page has scripting disabled, plugins disabled, forms disabled, and it cannot navigate any frames or windows other than itself (or any frames or windows it itself embeds).
<p>We're not scared of you! Here is your content, unedited:</p>
<iframe sandbox src="https://usercontent.example.net/getusercontent.cgi?id=12193"></iframe>
It is important to use a separate domain so that if the attacker convinces the user to visit that page directly, the page doesn't run in the context of the site's origin, which would make the user vulnerable to any attack found in the page.
In this example, a gadget from another site is embedded. The gadget has scripting and forms enabled, and the origin sandbox restrictions are lifted, allowing the gadget to communicate with its originating server. The sandbox is still useful, however, as it disables plugins and popups, thus reducing the risk of the user being exposed to malware and other annoyances.
<iframe sandbox="allow-same-origin allow-forms allow-scripts"
src="https://maps.example.com/embedded.html"></iframe>
Suppose a file A contained the following fragment:
<iframe sandbox="allow-same-origin allow-forms" src=B></iframe>
Suppose that file B contained an iframe also:
<iframe sandbox="allow-scripts" src=C></iframe>
Further, suppose that file C contained a link:
<a href=D>Link</a>
For this example, suppose all the files were served as text/html
.
Page C in this scenario has all the sandboxing flags set. Scripts are disabled, because the
iframe
in A has scripts disabled, and this overrides the allow-scripts
keyword set on the
iframe
in B. Forms are also disabled, because the inner iframe
(in B)
does not have the allow-forms
keyword
set.
Suppose now that a script in A removes all the sandbox
attributes in A and B.
This would change nothing immediately. If the user clicked the link in C, loading page D into
the iframe
in B, page D would now act as if the iframe
in B had the
allow-same-origin
and allow-forms
keywords set, because that was the
state of the content navigable in the iframe
in A when page B was
loaded.
Generally speaking, dynamically removing or changing the sandbox
attribute is ill-advised, because it can make it quite
hard to reason about what will be allowed and what will not.
The allow
attribute, when specified, determines the container
policy that will be used when the permissions policy for a
Document
in the iframe
's content navigable is initialized.
Its value must be a serialized permissions
policy. PERMISSIONSPOLICY
In this example, an iframe
is used to embed a map from an online navigation
service. The allow
attribute is used to enable the
Geolocation API within the nested context.
<iframe src="https://maps.example.com/" allow="geolocation"></iframe>
The allowfullscreen
attribute is a boolean
attribute. When specified, it indicates that Document
objects in the
iframe
element's content navigable will be initialized with a permissions policy which allows the "fullscreen
" feature to be used from any origin. This is enforced by
the process permissions policy
attributes algorithm. PERMISSIONSPOLICY
Here, an iframe
is used to embed a player from a video site. The allowfullscreen
attribute is needed to enable the
player to show its video fullscreen.
<article>
<header>
<p><img src="/usericons/1627591962735"> <b>Fred Flintstone</b></p>
<p><a href="/posts/3095182851" rel=bookmark>12:44</a> — <a href="#acl-3095182851">Private Post</a></p>
</header>
<p>Check out my new ride!</p>
<iframe src="https://video.example.com/embed?id=92469812" allowfullscreen></iframe>
</article>
Neither allow
nor allowfullscreen
can grant access to a feature in an
iframe
element's content navigable if the element's node
document is not already allowed to use that feature.
To determine whether a Document
object document
is allowed to use the policy-controlled-feature feature, run these
steps:
If document's browsing context is null, then return false.
If document is not fully active, then return false.
If the result of running is feature enabled in document
for origin on feature, document, and document's origin is "Enabled
", then return
true.
Return false.
Because they only influence the permissions policy of the content
navigable's active document, the allow
and allowfullscreen
attributes only take effect when the
content navigable of the iframe
is navigated. Adding or removing them has no effect on an already-loaded
document.
The iframe
element supports dimension attributes for cases where the
embedded content has specific dimensions (e.g. ad units have well-defined dimensions).
An iframe
element never has fallback content, as it will always
create a new child navigable, regardless of whether the specified initial
contents are successfully used.
The referrerpolicy
attribute is a
referrer policy attribute. Its purpose is to set the referrer policy
used when processing the iframe
attributes. REFERRERPOLICY
The loading
attribute is a lazy
loading attribute. Its purpose is to indicate the policy for loading iframe
elements that are outside the viewport.
When the loading
attribute's state is changed to the
Eager state, the user agent must run these
steps:
Let resumptionSteps be the iframe
element's lazy load
resumption steps.
If resumptionSteps is null, then return.
Set the iframe
's lazy load resumption steps to null.
Invoke resumptionSteps.
Descendants of iframe
elements represent nothing. (In legacy user agents that do
not support iframe
elements, the contents would be parsed as markup that could act as
fallback content.)
The HTML parser treats markup inside iframe
elements as
text.
The IDL attributes src
, name
, sandbox
, and allow
must
reflect the respective content attributes of the same name.
The srcdoc
getter steps are:
Let attribute be the result of running get an attribute by namespace and local
name given null, srcdoc
's local name, and this.
If attribute is null, then return the empty string.
Return attribute's value.
The srcdoc
setter steps
are:
Let compliantString be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, the given value, "HTMLIFrameElement srcdoc
", and "script
".
Set an attribute value given
this, srcdoc
's local name, and
compliantString.
The supported tokens for sandbox
's DOMTokenList
are the allowed
values defined in the sandbox
attribute and supported by
the user agent.
The allowFullscreen
IDL attribute must
reflect the allowfullscreen
content
attribute.
The referrerPolicy
IDL attribute must
reflect the referrerpolicy
content
attribute, limited to only known values.
The loading
IDL attribute must reflect the loading
content attribute, limited to only known
values.
The contentDocument
getter steps are to return the
this's content document.
The contentWindow
getter steps are to return
this's content window.
Here is an example of a page using an iframe
to include advertising from an
advertising broker:
<iframe src="https://ads.example.com/?customerid=923513721&format=banner"
width="468" height="60"></iframe>
embed
elementsrc
type
width
height
[Exposed=Window]
interface HTMLEmbedElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString src;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString width;
[CEReactions] attribute DOMString height;
Document? getSVGDocument();
// also has obsolete members
};
The embed
element provides an integration point for an external application or
interactive content.
The src
attribute
gives the URL of the resource being embedded. The attribute, if present, must contain
a valid non-empty URL potentially surrounded by spaces.
If the itemprop
attribute is specified on an
embed
element, then the src
attribute must also
be specified.
The type
attribute,
if present, gives the MIME type by which the plugin to instantiate is selected. The
value must be a valid MIME type string. If both the type
attribute and the src
attribute are present, then the type
attribute must specify
the same type as the explicit Content-Type metadata of the
resource given by the src
attribute.
While any of the following conditions are occurring, any plugin instantiated for
the element must be removed, and the embed
element represents
nothing:
The element has neither a src
attribute nor a type
attribute.
The element has a media element ancestor.
The element has an ancestor object
element that is not showing its
fallback content.
An embed
element is said to be potentially
active when the following conditions are all met simultaneously:
The element is in a document or was in a document the last time the event loop reached step 1.
The element's node document is fully active.
The element has either a src
attribute set or a
type
attribute set (or both).
The element's src
attribute is either absent or its
value is not the empty string.
The element is not a descendant of a media element.
The element is not a descendant of an object
element that is not showing its
fallback content.
The element is being rendered, or was being rendered the last time the event loop reached step 1.
Whenever an embed
element that was not potentially active becomes potentially active, and whenever a potentially active embed
element that is
remaining potentially active and has its src
attribute set, changed, or removed or its type
attribute set, changed, or removed, the user agent must
queue an element task on the embed task source given the element
to run the embed
element setup steps for that element.
The embed
element setup steps for a given embed
element
element are as follows:
If another task has since been queued to run the
embed
element setup steps for element, then return.
If element has a src
attribute set, then:
Let url be the result of encoding-parsing a URL given
element's src
attribute's value, relative to
element's node document.
If url is failure, then return.
Let request be a new request whose
URL is url, client is element's node
document's relevant settings object, destination is "embed
",
credentials mode is "include
", mode is "navigate
", initiator
type is "embed
", and whose use-URL-credentials flag
is set.
Fetch request, with processResponse set to the following steps given response response:
If another task has since been queued to run
the embed
element setup steps for element, then
return.
If response is a network error, then fire an event named load
at element, and return.
Let type be the result of determining the type of content given element and response.
Switch on type:
Display no plugin for element.
If element's content navigable is null, then create a new child navigable for element.
Navigate element's content
navigable to response's URL using element's node
document, with response set to
response, and historyHandling set to "replace
".
element's src
attribute
does not get updated if the content navigable gets further navigated to
other locations.
element now represents its content navigable.
Fetching the resource must delay the load event of element's node document.
Otherwise, display no plugin for element.
To determine the type of the content given an
embed
element element and a response response, run the following steps:
If element has a type
attribute, and that
attribute's value is a type that a plugin supports, then return the value of the
type
attribute.
If the path component of response's url matches a pattern that a plugin supports, then return the type that that plugin can handle.
For example, a plugin might say that it can handle URLs with path components that end with the four character string
".swf
".
If response has explicit Content-Type metadata, and that value is a type that a plugin supports, then return that value.
Return null.
It is intentional that the above algorithm allows response to have a non-ok status. This allows servers to return data for plugins even with error responses (e.g., HTTP 500 Internal Server Error codes can still contain plugin data).
To display no plugin for an embed
element element:
Destroy a child navigable given element.
Display an indication that no plugin could be found for element, as the contents of element.
element now represents nothing.
The embed
element has no fallback content; its
descendants are ignored.
Whenever an embed
element that was potentially
active stops being potentially active, any
plugin that had been instantiated for that element must be unloaded.
The embed
element potentially delays the load event.
The embed
element supports dimension attributes.
The IDL attributes src
and type
each must reflect the respective content
attributes of the same name.
object
elementdata
type
name
form
width
height
[Exposed=Window]
interface HTMLObjectElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString data;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString name;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute DOMString width;
[CEReactions] attribute DOMString height;
readonly attribute Document? contentDocument;
readonly attribute WindowProxy? contentWindow;
Document? getSVGDocument();
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
undefined setCustomValidity(DOMString error);
// also has obsolete members
};
Depending on the type of content instantiated by the
object
element, the node also supports other
interfaces.
HTMLObjectElement
.The object
element can represent an external resource, which, depending on the
type of the resource, will either be treated as an image or as a child
navigable.
The data
attribute
specifies the URL of the resource. It must be present, and must contain a
valid non-empty URL potentially surrounded by spaces.
The type
attribute,
if present, specifies the type of the resource. If present, the attribute must be a valid
MIME type string.
The name
attribute, if present, must be a valid navigable target name. The given value is
used to name the element's content navigable, if applicable, and if present when the
element's content navigable is created.
Whenever one of the following conditions occur:
object
elements changes to or from showing its
fallback content,
classid
attribute is set, changed, or
removed,
classid
attribute is not present, and
its data
attribute is set, changed, or removed,
classid
attribute nor its
data
attribute are present, and its type
attribute is set, changed, or removed,
...the user agent must queue an element task on the DOM manipulation task
source given the object
element to run the following steps to (re)determine
what the object
element represents. This task
being queued or actively running must delay the load
event of the element's node document.
If the user has indicated a preference that this object
element's fallback
content be shown instead of the element's usual behavior, then jump to the step below
labeled fallback.
For example, a user could ask for the element's fallback content to be shown because that content uses a format that the user finds more accessible.
If the element has an ancestor media element, or has an ancestor
object
element that is not showing its fallback content, or if
the element is not in a document whose browsing
context is non-null, or if the element's node document is not fully
active, or if the element is still in the stack of open elements of an
HTML parser or XML parser, or if the element is not being
rendered, then jump to the step below labeled fallback.
If the data
attribute is present and its value is
not the empty string, then:
If the type
attribute is present and its value is
not a type that the user agent supports, then the user agent may jump to the step below labeled
fallback without fetching the content to examine its real type.
Let url be the result of encoding-parsing a URL given the data
attribute's value, relative to the element's node
document.
If url is failure, then fire an
event named error
at the element and jump to the step
below labeled fallback.
Let request be a new request whose
URL is url, client is the element's node document's
relevant settings object, destination is "object
",
credentials mode is "include
", mode is "navigate
", initiator
type is "object
", and whose use-URL-credentials
flag is set.
Fetch request.
Fetching the resource must delay the load event of the element's node document until the task that is queued by the networking task source once the resource has been fetched (defined next) has been run.
If the resource is not yet available (e.g. because the resource was not available in the cache, so that loading the resource required making a request over the network), then jump to the step below labeled fallback. The task that is queued by the networking task source once the resource is available must restart this algorithm from this step. Resources can load incrementally; user agents may opt to consider a resource "available" whenever enough data has been obtained to begin processing the resource.
If the load failed (e.g. there was an HTTP 404 error, there was a DNS error), fire an event named error
at the element, then jump to the step below labeled fallback.
Determine the resource type, as follows:
Let the resource type be unknown.
If the user agent is configured to strictly obey Content-Type headers for this resource, and the resource has associated Content-Type metadata, then let the resource type be the type specified in the resource's Content-Type metadata, and jump to the step below labeled handler.
This can introduce a vulnerability, wherein a site is trying to embed a resource that uses a particular type, but the remote site overrides that and instead furnishes the user agent with a resource that triggers a different type of content with different security characteristics.
Run the appropriate set of steps from the following list:
Let binary be false.
If the type specified in the resource's Content-Type
metadata is "text/plain
", and the result of applying the rules for distinguishing if a resource is
text or binary to the resource is that the resource is not
text/plain
, then set binary to true.
If the type specified in the resource's Content-Type
metadata is "application/octet-stream
", then set binary to true.
If binary is false, then let the resource type be the type specified in the resource's Content-Type metadata, and jump to the step below labeled handler.
If there is a type
attribute present on the
object
element, and its value is not application/octet-stream
,
then run the following steps:
If the attribute's value is a type that starts with "image/
" that is
not also an XML MIME type, then let the resource type be the
type specified in that type
attribute.
Jump to the step below labeled handler.
If there is a type
attribute present on the
object
element, then let the tentative type be the type
specified in that type
attribute.
Otherwise, let tentative type be the computed type of the resource.
If tentative type is not
application/octet-stream
, then let resource type be
tentative type and jump to the step below labeled
handler.
If applying the URL parser algorithm to the URL of the specified resource (after any redirects) results in a URL record whose path component matches a pattern that a plugin supports, then let resource type be the type that that plugin can handle.
For example, a plugin might say that it can handle resources with path components that end with the four character string
".swf
".
It is possible for this step to finish, or for one of the substeps above to jump straight to the next step, with resource type still being unknown. In both cases, the next step will trigger fallback.
Handler: Handle the content as given by the first of the following cases that matches:
image/
"If the object
element's content navigable is null, then
create a new child navigable for the element.
Let response be the response from fetch.
If response's URL does not match about:blank
, then
navigate the element's content navigable to
response's URL using the element's
node document, with historyHandling set to
"replace
".
The data
attribute of the
object
element doesn't get updated if the content navigable gets
further navigated to other locations.
The object
element represents its content
navigable.
image/
", and support
for images has not been disabledDestroy a child navigable given the object
element.
Apply the image sniffing rules to determine the type of the image.
The object
element represents the specified image.
If the image cannot be rendered, e.g. because it is malformed or in an unsupported format, jump to the step below labeled fallback.
The given resource type is not supported. Jump to the step below labeled fallback.
If the previous step ended with the resource type being unknown, this is the case that is triggered.
The element's contents are not part of what the object
element
represents.
If the object
element does not represent its content navigable,
then once the resource is completely loaded, queue an element task on the
DOM manipulation task source given the object
element to fire an event named load
at the element.
If the element does represent its content navigable,
then an analogous task will be queued when the created Document
is completely finished loading.
Return.
Fallback: The object
element represents the element's
children. This is the element's fallback content. Destroy a child
navigable given the element.
Due to the algorithm above, the contents of object
elements act as fallback
content, used only when referenced resources can't be shown (e.g. because it returned a 404
error). This allows multiple object
elements to be nested inside each other,
targeting multiple user agents with different capabilities, with the user agent picking the first
one it supports.
The object
element potentially delays the load event.
The form
attribute is used to explicitly associate the
object
element with its form owner.
The object
element supports dimension attributes.
The IDL attributes data
, type
, and name
each must reflect the respective content
attributes of the same name.
The contentDocument
getter steps are to return
this's content document.
The contentWindow
getter steps are to return
this's content window.
The willValidate
, validity
, and validationMessage
attributes, and the checkValidity()
, reportValidity()
, and setCustomValidity()
methods, are part of the
constraint validation API. The form
IDL attribute
is part of the element's forms API.
In this example, an HTML page is embedded in another using the object
element.
<figure>
<object data="clock.html"></object>
<figcaption>My HTML Clock</figcaption>
</figure>
video
elementcontrols
attribute: Interactive content.src
attribute:
zero or more track
elements, then
transparent, but with no media element descendants.src
attribute: zero or more source
elements, then
zero or more track
elements, then
transparent, but with no media element descendants.src
crossorigin
poster
preload
autoplay
playsinline
loop
muted
controls
width
height
[Exposed=Window]
interface HTMLVideoElement : HTMLMediaElement {
[HTMLConstructor] constructor();
[CEReactions] attribute unsigned long width;
[CEReactions] attribute unsigned long height;
readonly attribute unsigned long videoWidth;
readonly attribute unsigned long videoHeight;
[CEReactions] attribute USVString poster;
[CEReactions] attribute boolean playsInline;
};
HTMLVideoElement
.A video
element is used for playing videos or movies, and audio files with
captions.
Content may be provided inside the video
element. User agents
should not show this content to the user; it is intended for older web browsers which do
not support video
, so that text can be shown to the users of these older browsers
informing them of how to access the video contents.
In particular, this content is not intended to address accessibility concerns. To
make video content accessible to the partially sighted, the blind, the hard-of-hearing, the deaf,
and those with other physical or cognitive disabilities, a variety of features are available.
Captions can be provided, either embedded in the video stream or as external files using the
track
element. Sign-language tracks can be embedded in the video stream. Audio
descriptions can be embedded in the video stream or in text form using a WebVTT file
referenced using the track
element and synthesized into speech by the user agent.
WebVTT can also be used to provide chapter titles. For users who would rather not use a media
element at all, transcripts or other textual alternatives can be provided by simply linking to
them in the prose near the video
element. WEBVTT
The video
element is a media element whose media data is
ostensibly video data, possibly with associated audio data.
The src
, crossorigin
,
preload
, autoplay
,
loop
, muted
, and controls
attributes are the attributes common to all media elements.
The poster
attribute gives the URL of an image file that the user agent can show while no video
data is available. The attribute, if present, must contain a valid non-empty URL
potentially surrounded by spaces.
If the specified resource is to be used, then, when the element is created or when the poster
attribute is set, changed, or removed, the user agent must
run the following steps to determine the element's poster frame (regardless of the
value of the element's show poster flag):
If there is an existing instance of this algorithm running for this video
element, abort that instance of this algorithm without changing the poster
frame.
If the poster
attribute's value is the empty string
or if the attribute is absent, then there is no poster frame; return.
Let url be the result of encoding-parsing a URL given the poster
attribute's value, relative to the element's node
document.
If url is failure, then return. There is no poster frame.
Let request be a new request whose URL is url, client is the element's node document's
relevant settings object, destination is "image
", initiator type is "video
",
credentials mode is "include
", and whose use-URL-credentials flag is set.
Fetch request. This must delay the load event of the element's node document.
If an image is thus obtained, the poster frame is that image. Otherwise, there is no poster frame.
The image given by the poster
attribute,
the poster frame, is intended to be a representative frame of the
video (typically one of the first non-blank frames) that gives the user an idea of what the video
is like.
The playsinline
attribute is a boolean
attribute. If present, it serves as a hint to the user agent that the video ought to be
displayed "inline" in the document by default, constrained to the element's playback area, instead
of being displayed fullscreen or in an independent resizable window.
The absence of the playsinline
attribute does not imply that the video will display fullscreen by default. Indeed, most user
agents have chosen to play all videos inline by default, and in such user agents the playsinline
attribute has no effect.
A video
element represents what is given for the first matching condition in the
list below:
readyState
attribute is either HAVE_NOTHING
, or HAVE_METADATA
but no video data has yet been obtained at
all, or the element's readyState
attribute is any
subsequent value but the media resource does not have a video channel)video
element represents its poster frame, if any,
or else transparent black with no natural dimensions.video
element is paused, the current playback position is the first frame of video,
and the element's show poster flag is setvideo
element represents its poster frame, if any,
or else the first frame of the video.video
element is paused, and the
frame of video corresponding to the current playback
position is not available (e.g. because the video is seeking or buffering)video
element is neither potentially playing nor paused (e.g. when seeking or stalled)video
element represents the last frame of the video to have
been rendered.video
element is pausedvideo
element represents the frame of video corresponding to
the current playback position.video
element has a video channel and is potentially
playing)video
element represents the frame of video at the continuously
increasing "current" position. When the
current playback position changes such that the last frame rendered is no longer the
frame corresponding to the current playback position in the video, the new frame
must be rendered.Frames of video must be obtained from the video track that was selected when the event loop last reached step 1.
Which frame in a video stream corresponds to a particular playback position is defined by the video stream's format.
The video
element also represents any text track cues whose text track cue active flag is set and whose
text track is in the showing mode, and any
audio from the media resource, at the current playback position.
Any audio associated with the media resource must, if played, be played synchronized with the current playback position, at the element's effective media volume. The user agent must play the audio from audio tracks that were enabled when the event loop last reached step 1.
In addition to the above, the user agent may provide messages to the user (such as "buffering", "no video loaded", "error", or more detailed information) by overlaying text or icons on the video or other areas of the element's playback area, or in another appropriate manner.
User agents that cannot render the video may instead make the element represent a link to an external video playback utility or to the video data itself.
When a video
element's media resource has a video channel, the
element provides a paint source whose width is the media resource's
natural width, whose height is the
media resource's natural
height, and whose appearance is the frame of video corresponding to the current playback position, if that is available, or else
(e.g. when the video is seeking or buffering) its previous appearance, if any, or else (e.g.
because the video is still loading the first frame) blackness.
video.videoWidth
video.videoHeight
These attributes return the natural dimensions of the video, or 0 if the dimensions are not known.
The natural width and natural height of the media resource are the dimensions of the resource in CSS pixels after taking into account the resource's dimensions, aspect ratio, clean aperture, resolution, and so forth, as defined for the format used by the resource. If an anamorphic format does not define how to apply the aspect ratio to the video data's dimensions to obtain the "correct" dimensions, then the user agent must apply the ratio by increasing one dimension and leaving the other unchanged.
The videoWidth
IDL attribute must return the natural width of the video in CSS pixels. The videoHeight
IDL attribute must return the natural height of the video in CSS pixels. If the element's readyState
attribute is HAVE_NOTHING
, then the attributes must return 0.
Whenever the natural width
or natural height of the video changes
(including, for example, because the selected video
track was changed), if the element's readyState
attribute is not HAVE_NOTHING
, the user agent must
queue a media element task given the media element to fire an event named resize
at the media element.
The video
element supports dimension attributes.
In the absence of style rules to the contrary, video content should be rendered inside the element's playback area such that the video content is shown centered in the playback area at the largest possible size that fits completely within it, with the video content's aspect ratio being preserved. Thus, if the aspect ratio of the playback area does not match the aspect ratio of the video, the video will be shown letterboxed or pillarboxed. Areas of the element's playback area that do not contain the video represent nothing.
In user agents that implement CSS, the above requirement can be implemented by using the style rule suggested in the Rendering section.
The natural width of a video
element's playback area is the
natural width of the poster frame, if that is available and the
element currently represents its poster frame; otherwise, it is the natural width of the video resource, if that is
available; otherwise the natural width is missing.
The natural height of a video
element's playback area is the
natural height of the poster frame, if that is available and the
element currently represents its poster frame; otherwise it is the natural height of the video resource, if that is
available; otherwise the natural height is missing.
The default object size is a width of 300 CSS pixels and a height of 150 CSS pixels. CSSIMAGES
User agents should provide controls to enable or disable the display of closed captions, audio description tracks, and other additional data associated with the video stream, though such features should, again, not interfere with the page's normal rendering.
User agents may allow users to view the video content in manners more suitable to the user,
such as fullscreen or in an independent resizable window. User agents may even trigger such a
viewing mode by default upon playing a video, although they should not do so when the playsinline
attribute is specified. As with the other user
interface features, controls to enable this should not interfere with the page's normal rendering
unless the user agent is exposing a user
interface. In such an independent viewing mode, however, user agents may make full user
interfaces visible, even if the controls
attribute is
absent.
User agents may allow video playback to affect system features that could interfere with the user's experience; for example, user agents could disable screensavers while video playback is in progress.
The poster
IDL attribute must reflect the poster
content
attribute.
The playsInline
IDL attribute must reflect
the playsinline
content attribute.
This example shows how to detect when a video has failed to play correctly:
<script>
function failed(e) {
// video playback failed - show a message saying why
switch (e.target.error.code) {
case e.target.error.MEDIA_ERR_ABORTED:
alert('You aborted the video playback.');
break;
case e.target.error.MEDIA_ERR_NETWORK:
alert('A network error caused the video download to fail part-way.');
break;
case e.target.error.MEDIA_ERR_DECODE:
alert('The video playback was aborted due to a corruption problem or because the video used features your browser did not support.');
break;
case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
alert('The video could not be loaded, either because the server or network failed or because the format is not supported.');
break;
default:
alert('An unknown error occurred.');
break;
}
}
</script>
<p><video src="tgif.vid" autoplay controls onerror="failed(event)"></video></p>
<p><a href="tgif.vid">Download the video file</a>.</p>
audio
elementcontrols
attribute: Interactive content.controls
attribute: Palpable content.src
attribute:
zero or more track
elements, then
transparent, but with no media element descendants.src
attribute: zero or more source
elements, then
zero or more track
elements, then
transparent, but with no media element descendants.src
crossorigin
preload
autoplay
loop
muted
controls
[Exposed=Window,
LegacyFactoryFunction=Audio(optional DOMString src)]
interface HTMLAudioElement : HTMLMediaElement {
[HTMLConstructor] constructor();
};
HTMLAudioElement
.An audio
element represents a sound or audio stream.
Content may be provided inside the audio
element. User agents
should not show this content to the user; it is intended for older web browsers which do
not support audio
, so that text can be shown to the users of these older browsers
informing them of how to access the audio contents.
In particular, this content is not intended to address accessibility concerns. To
make audio content accessible to the deaf or to those with other physical or cognitive
disabilities, a variety of features are available. If captions or a sign language video are
available, the video
element can be used instead of the audio
element to
play the audio, allowing users to enable the visual alternatives. Chapter titles can be provided
to aid navigation, using the track
element and a WebVTT file. And,
naturally, transcripts or other textual alternatives can be provided by simply linking to them in
the prose near the audio
element. WEBVTT
The audio
element is a media element whose media data is
ostensibly audio data.
The src
, crossorigin
,
preload
, autoplay
,
loop
, muted
, and controls
attributes are the attributes common to all media elements.
audio = new Audio([ url ])
Returns a new audio
element, with the src
attribute set to the value passed in the argument, if applicable.
A legacy factory function is provided for creating HTMLAudioElement
objects (in
addition to the factory methods from DOM such as createElement()
): Audio(src)
. When invoked, the legacy factory function
must perform the following steps:
Let document be the current global object's associated Document
.
Let audio be the result of creating an
element given document, audio
, and the HTML
namespace.
Set an attribute value for
audio using "preload
" and "auto
".
If src is given, then set
an attribute value for audio using "src
"
and src. (This will cause the user
agent to invoke the object's resource selection
algorithm before returning.)
Return audio.
track
elementkind
src
srclang
label
default
[Exposed=Window]
interface HTMLTrackElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString kind;
[CEReactions] attribute USVString src;
[CEReactions] attribute DOMString srclang;
[CEReactions] attribute DOMString label;
[CEReactions] attribute boolean default;
const unsigned short NONE = 0;
const unsigned short LOADING = 1;
const unsigned short LOADED = 2;
const unsigned short ERROR = 3;
readonly attribute unsigned short readyState;
readonly attribute TextTrack track;
};
HTMLTrackElement
.The track
element allows authors to specify explicit external timed text tracks for media elements. It
does not represent anything on its own.
The kind
attribute is
an enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
subtitles
| Subtitles | Transcription or translation of the dialogue, suitable for when the sound is available but not understood (e.g. because the user does not understand the language of the media resource's audio track). Overlaid on the video. |
captions
| Captions | Transcription or translation of the dialogue, sound effects, relevant musical cues, and other relevant audio information, suitable for when sound is unavailable or not clearly audible (e.g. because it is muted, drowned-out by ambient noise, or because the user is deaf). Overlaid on the video; labeled as appropriate for the hard-of-hearing. |
descriptions
| Descriptions | Textual descriptions of the video component of the media resource, intended for audio synthesis when the visual component is obscured, unavailable, or not usable (e.g. because the user is interacting with the application without a screen while driving, or because the user is blind). Synthesized as audio. |
chapters
| Chapters metadata | Tracks intended for use from script. Not displayed by the user agent. |
metadata
| Metadata |
The attribute's missing value default is the subtitles state, and its invalid value default is the metadata state.
The src
attribute
gives the URL of the text track data. The value must be a valid non-empty URL
potentially surrounded by spaces. This attribute must be present.
The element has an associated track URL (a string), initially the empty string.
When the element's src
attribute is set, run these steps:
Let trackURL be failure.
Let value be the element's src
attribute
value.
If value is not the empty string, then set trackURL to the result of encoding-parsing-and-serializing a URL given value, relative to the element's node document.
Set the element's track URL to trackURL if it is not failure; otherwise to the empty string.
If the element's track URL identifies a WebVTT resource, and the element's kind
attribute is not in the chapters metadata or metadata state, then the WebVTT file must be a
WebVTT file using cue text. WEBVTT
The srclang
attribute gives the language of the text track data. The value must be a valid BCP 47 language
tag. This attribute must be present if the element's kind
attribute is in the subtitles state.
BCP47
If the element has a srclang
attribute whose value is
not the empty string, then the element's track language is the value of the attribute.
Otherwise, the element has no track language.
The label
attribute
gives a user-readable title for the track. This title is used by user agents when listing subtitle, caption, and audio description tracks in their user interface.
The value of the label
attribute, if the attribute is
present, must not be the empty string. Furthermore, there must not be two track
element children of the same media element whose kind
attributes are in the same state, whose srclang
attributes are both missing or have values that
represent the same language, and whose label
attributes are
again both missing or both have the same value.
If the element has a label
attribute whose value is not
the empty string, then the element's track label is the value of the attribute.
Otherwise, the element's track label is an empty string.
The default
attribute is a boolean attribute, which, if specified, indicates that the track is to
be enabled if the user's preferences do not indicate that another track would be more
appropriate.
Each media element must have no more than one track
element child
whose kind
attribute is in the subtitles or captions state and whose default
attribute is specified.
Each media element must have no more than one track
element child
whose kind
attribute is in the description state and whose default
attribute is specified.
Each media element must have no more than one track
element child
whose kind
attribute is in the chapters metadata state and whose default
attribute is specified.
There is no limit on the number of track
elements whose kind
attribute is in the metadata state and whose default
attribute is specified.
track.readyState
Returns the text track readiness state, represented by a number from the following list:
track.NONE (0)
The text track not loaded state.
track.LOADING (1)
The text track loading state.
track.LOADED (2)
The text track loaded state.
track.ERROR (3)
The text track failed to load state.
track.track
Returns the TextTrack
object corresponding to the text track of the
track
element.
The readyState
attribute must return the numeric value
corresponding to the text track readiness state of the track
element's
text track, as defined by the following list:
NONE
(numeric value 0)LOADING
(numeric value 1)LOADED
(numeric value 2)ERROR
(numeric value 3)The track
IDL
attribute must, on getting, return the track
element's text track's
corresponding TextTrack
object.
The src
, srclang
, label
, and default
IDL
attributes must reflect the respective content attributes of the same name. The kind
IDL attribute
must reflect the content attribute of the same name, limited to only known
values.
This video has subtitles in several languages:
<video src="brave.webm">
<track kind=subtitles src=brave.en.vtt srclang=en label="English">
<track kind=captions src=brave.en.hoh.vtt srclang=en label="English for the Hard of Hearing">
<track kind=subtitles src=brave.fr.vtt srclang=fr lang=fr label="Français">
<track kind=subtitles src=brave.de.vtt srclang=de lang=de label="Deutsch">
</video>
(The lang
attributes on the last two describe the language of
the label
attribute, not the language of the subtitles
themselves. The language of the subtitles is given by the srclang
attribute.)
HTMLMediaElement objects (audio
and video
, in this
specification) are simply known as media elements.
enum CanPlayTypeResult { "" /* empty string */, "maybe", "probably" };
typedef (MediaStream or MediaSource or Blob) MediaProvider;
[Exposed=Window]
interface HTMLMediaElement : HTMLElement {
// error state
readonly attribute MediaError? error;
// network state
[CEReactions] attribute USVString src;
attribute MediaProvider? srcObject;
readonly attribute USVString currentSrc;
[CEReactions] attribute DOMString? crossOrigin;
const unsigned short NETWORK_EMPTY = 0;
const unsigned short NETWORK_IDLE = 1;
const unsigned short NETWORK_LOADING = 2;
const unsigned short NETWORK_NO_SOURCE = 3;
readonly attribute unsigned short networkState;
[CEReactions] attribute DOMString preload;
readonly attribute TimeRanges buffered;
undefined load();
CanPlayTypeResult canPlayType(DOMString type);
// ready state
const unsigned short HAVE_NOTHING = 0;
const unsigned short HAVE_METADATA = 1;
const unsigned short HAVE_CURRENT_DATA = 2;
const unsigned short HAVE_FUTURE_DATA = 3;
const unsigned short HAVE_ENOUGH_DATA = 4;
readonly attribute unsigned short readyState;
readonly attribute boolean seeking;
// playback state
attribute double currentTime;
undefined fastSeek(double time);
readonly attribute unrestricted double duration;
object getStartDate();
readonly attribute boolean paused;
attribute double defaultPlaybackRate;
attribute double playbackRate;
attribute boolean preservesPitch;
readonly attribute TimeRanges played;
readonly attribute TimeRanges seekable;
readonly attribute boolean ended;
[CEReactions] attribute boolean autoplay;
[CEReactions] attribute boolean loop;
Promise<undefined> play();
undefined pause();
// controls
[CEReactions] attribute boolean controls;
attribute double volume;
attribute boolean muted;
[CEReactions] attribute boolean defaultMuted;
// tracks
[SameObject] readonly attribute AudioTrackList audioTracks;
[SameObject] readonly attribute VideoTrackList videoTracks;
[SameObject] readonly attribute TextTrackList textTracks;
TextTrack addTextTrack(TextTrackKind kind, optional DOMString label = "", optional DOMString language = "");
};
The media element attributes, src
, crossorigin
, preload
, autoplay
,
loop
, muted
, and
controls
, apply to all media elements. They are defined in this section.
Media elements are used to present audio data, or video and audio data, to the user. This is referred to as media data in this section, since this section applies equally to media elements for audio or for video. The term media resource is used to refer to the complete set of media data, e.g. the complete video file, or complete audio file.
A media resource has an associated
origin, which is either "none
",
"multiple
", "rewritten
", or an
origin. It is initially set to "none
".
A media resource can have multiple audio and video tracks. For the purposes of a
media element, the video data of the media resource is only that of the
currently selected track (if any) as given by the element's videoTracks
attribute when the event loop last
reached step 1, and the audio data of the media resource is the result of mixing all
the currently enabled tracks (if any) given by the element's audioTracks
attribute when the event loop last
reached step 1.
Both audio
and video
elements can be used for both audio
and video. The main difference between the two is simply that the audio
element has
no playback area for visual content (such as video or captions), whereas the video
element does.
Each media element has a unique media element event task source.
To queue a media element task with a media element element and a series of steps steps, queue an element task on the media element's media element event task source given element and steps.
media.error
Returns a MediaError
object representing the current error state of the
element.
Returns null if there is no error.
All media elements have an associated error status, which
records the last error the element encountered since its resource selection algorithm was last invoked. The
error
attribute,
on getting, must return the MediaError
object created for this last error, or null if
there has not been an error.
[Exposed=Window]
interface MediaError {
const unsigned short MEDIA_ERR_ABORTED = 1;
const unsigned short MEDIA_ERR_NETWORK = 2;
const unsigned short MEDIA_ERR_DECODE = 3;
const unsigned short MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
readonly attribute unsigned short code;
readonly attribute DOMString message;
};
media.error.code
Returns the current error's error code, from the list below.
media.error.message
Returns a specific informative diagnostic message about the error condition encountered. The message and message format are not generally uniform across different user agents. If no such message is available, then the empty string is returned.
Every MediaError
object has a message, which is a string, and a code, which is one of the following:
MEDIA_ERR_ABORTED
(numeric value 1)MEDIA_ERR_NETWORK
(numeric value 2)MEDIA_ERR_DECODE
(numeric value 3)MEDIA_ERR_SRC_NOT_SUPPORTED
(numeric value 4)src
attribute or assigned media provider object was not suitable.To create a MediaError
, given an
error code which is one of the above values, return a new MediaError
object whose
code is the given error code and whose message is a string containing any details the user
agent is able to supply about the cause of the error condition, or the empty string if the user
agent is unable to supply such details. This message string must not contain only the information
already available via the supplied error code; for example, it must not simply be a translation of
the code into a string format. If no additional information is available beyond that provided by
the error code, the message must be set to the
empty string.
The code
getter steps are to return this's code.
The message
getter steps are to return this's message.
The src
content
attribute on media elements gives the URL of the
media resource (video, audio) to show. The attribute, if present, must contain a valid
non-empty URL potentially surrounded by spaces.
If the itemprop
attribute is specified on the media
element, then the src
attribute must also be
specified.
The crossorigin
content attribute on media elements is a CORS settings attribute.
If a media element is created with a
src
attribute, the user agent must immediately invoke the
media element's resource selection
algorithm.
If a src
attribute of a media element is set
or changed, the user agent must invoke the media element's media element load
algorithm. (Removing the src
attribute does
not do this, even if there are source
elements present.)
The src
IDL
attribute on media elements must reflect the
content attribute of the same name.
The crossOrigin
IDL attribute must reflect
the crossorigin
content attribute, limited to
only known values.
A media provider object is an object that can represent a media
resource, separate from a URL. MediaStream
objects,
MediaSource
objects, and Blob
objects are all media provider objects.
Each media element can have an assigned media provider object, which is a media provider object. When a media element is created, it has no assigned media provider object.
media.srcObject [ = source ]
Allows the media element to be assigned a media provider object.
media.currentSrc
Returns the URL of the current media resource, if any.
Returns the empty string when there is no media resource, or it doesn't have a URL.
The currentSrc
IDL attribute must initially be set to the
empty string. Its value is changed by the resource
selection algorithm defined below.
The srcObject
IDL attribute, on getting, must return the
element's assigned media provider object, if any, or null otherwise. On setting, it
must set the element's assigned media provider object to the new value, and then
invoke the element's media element load algorithm.
There are three ways to specify a media resource: the srcObject
IDL attribute, the src
content attribute, and source
elements. The IDL
attribute takes priority, followed by the content attribute, followed by the elements.
A media resource can be described in terms of its type, specifically a
MIME type, in some cases with a codecs
parameter. (Whether the
codecs
parameter is allowed or not depends on the MIME type.)
RFC6381
Types are usually somewhat incomplete descriptions; for example "video/mpeg
" doesn't say anything except what the container type is, and even a
type like "video/mp4; codecs="avc1.42E01E, mp4a.40.2"
" doesn't
include information like the actual bitrate (only the maximum bitrate). Thus, given a type, a user
agent can often only know whether it might be able to play media of that type (with
varying levels of confidence), or whether it definitely cannot play media of that
type.
A type that the user agent knows it cannot render is one that describes a resource that the user agent definitely does not support, for example because it doesn't recognize the container type, or it doesn't support the listed codecs.
The MIME type "application/octet-stream
" with no parameters is never
a type that the user agent knows it cannot render. User agents must treat that type
as equivalent to the lack of any explicit Content-Type metadata
when it is used to label a potential media resource.
Only the MIME type "application/octet-stream
" with no
parameters is special-cased here; if any parameter appears with it, it will be treated just like
any other MIME type. This is a deviation from the rule that unknown MIME type parameters should be
ignored.
media.canPlayType(type)
Returns the empty string (a negative response), "maybe", or "probably" based on how confident the user agent is that it can play media resources of the given type.
The canPlayType(type)
method must return
the empty string if type is a type
that the user agent knows it cannot render or is the type
"application/octet-stream
"; it must return "probably
" if
the user agent is confident that the type represents a media resource that it can
render if used in with this audio
or video
element; and it must return
"maybe
" otherwise. Implementers are encouraged to
return "maybe
" unless the type can be
confidently established as being supported or not. Generally, a user agent should never return
"probably
" for a type that allows the codecs
parameter if that parameter is not present.
This script tests to see if the user agent supports a (fictional) new format to dynamically
decide whether to use a video
element:
<section id="video">
<p><a href="playing-cats.nfv">Download video</a></p>
</section>
<script>
const videoSection = document.getElementById('video');
const videoElement = document.createElement('video');
const support = videoElement.canPlayType('video/x-new-fictional-format;codecs="kittens,bunnies"');
if (support === "probably") {
videoElement.setAttribute("src", "playing-cats.nfv");
videoSection.replaceChildren(videoElement);
}
</script>
The type
attribute of the
source
element allows the user agent to avoid downloading resources that use formats
it cannot render.
media.networkState
Returns the current state of network activity for the element, from the codes in the list below.
As media elements interact with the network, their current
network activity is represented by the networkState
attribute. On getting, it must return
the current network state of the element, which must be one of the following values:
NETWORK_EMPTY
(numeric value 0)NETWORK_IDLE
(numeric value 1)NETWORK_LOADING
(numeric value 2)NETWORK_NO_SOURCE
(numeric value 3)The resource selection algorithm defined
below describes exactly when the networkState
attribute changes value and what events fire to indicate changes in this state.
media.load()
Causes the element to reset and start selecting and loading a new media resource from scratch.
All media elements have a can autoplay flag, which must begin in the true state, and a delaying-the-load-event flag, which must begin in the false state. While the delaying-the-load-event flag is true, the element must delay the load event of its document.
When the load()
method on a media element is invoked, the user agent must run the media element
load algorithm.
A media element has an associated boolean is currently stalled, which is initially false.
The media element load algorithm consists of the following steps.
Set this element's is currently stalled to false.
Abort any already-running instance of the resource selection algorithm for this element.
Let pending tasks be a list of all tasks from the media element's media element event task source in one of the task queues.
For each task in pending tasks that would resolve pending play promises or reject pending play promises, immediately resolve or reject those promises in the order the corresponding tasks were queued.
Remove each task in pending tasks from its task queue.
Basically, pending events and callbacks are discarded and promises in-flight to be resolved/rejected are resolved/rejected immediately when the media element starts loading a new resource.
If the media element's networkState
is set to NETWORK_LOADING
or NETWORK_IDLE
, queue a media element task
given the media element to fire an event
named abort
at the media element.
If the media element's networkState
is not set to NETWORK_EMPTY
, then:
Queue a media element task given the media element to fire an event named emptied
at the media element.
If a fetching process is in progress for the media element, the user agent should stop it.
If the media element's assigned media provider object is a
MediaSource
object, then detach it.
Forget the media element's media-resource-specific tracks.
If readyState
is not set to HAVE_NOTHING
, then set it to that state.
If the paused
attribute is false, then:
Set the paused
attribute to true.
Take pending play promises and reject pending play promises
with the result and an "AbortError
"
DOMException
.
If seeking
is true, set it to false.
Set the current playback position to 0.
Set the official playback position to 0.
If this changed the official playback position, then queue a media
element task given the media element to fire an event named timeupdate
at the media element.
Set the timeline offset to Not-a-Number (NaN).
Update the duration
attribute to Not-a-Number
(NaN).
The user agent will not fire a durationchange
event for this particular change of
the duration.
Set the playbackRate
attribute to the value of
the defaultPlaybackRate
attribute.
Set the error
attribute to null and the
can autoplay flag to true.
Invoke the media element's resource selection algorithm.
Playback of any previously playing media resource for this element stops.
The resource selection algorithm for a media element is as follows. This algorithm is always invoked as part of a task, but one of the first steps in the algorithm is to return and continue running the remaining steps in parallel. In addition, this algorithm interacts closely with the event loop mechanism; in particular, it has synchronous sections (which are triggered as part of the event loop algorithm). Steps in such sections are marked with ⌛.
Set the element's networkState
attribute to
the NETWORK_NO_SOURCE
value.
Set the element's show poster flag to true.
Set the media element's delaying-the-load-event flag to true (this delays the load event).
Await a stable state, allowing the task that invoked this algorithm to continue. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended. (Steps in synchronous sections are marked with ⌛.)
⌛ If the media element's blocked-on-parser flag is false, then populate the list of pending text tracks.
⌛ If the media element has an assigned media provider object, then let mode be object.
⌛ Otherwise, if the media element has no assigned media provider
object but has a src
attribute, then let mode be attribute.
⌛ Otherwise, if the media element does not have an assigned media provider
object and does not have a src
attribute, but does have a source
element child, then
let mode be children and let candidate
be the first such source
element child in tree order.
⌛ Otherwise, the media element has no assigned media provider
object and has neither a src
attribute nor a source
element child:
⌛ Set the networkState
to NETWORK_EMPTY
.
⌛ Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
End the synchronous section and return.
⌛ Set the media element's networkState
to NETWORK_LOADING
.
⌛ Queue a media element task given the media element to
fire an event named loadstart
at the media element.
Run the appropriate steps from the following list:
⌛ Set the currentSrc
attribute to
the empty string.
End the synchronous section, continuing the remaining steps in parallel.
Run the resource fetch algorithm with the assigned media provider object. If that algorithm returns without aborting this one, then the load failed.
Failed with media provider: Reaching this step indicates that the media resource failed to load. Take pending play promises and queue a media element task given the media element to run the dedicated media source failure steps with the result.
Wait for the task queued by the previous step to have executed.
Return. The element won't attempt to load another resource until this algorithm is triggered again.
⌛ If the src
attribute's value is the empty string, then end the synchronous section, and jump
down to the failed with attribute step below.
⌛ Let urlRecord be the result of encoding-parsing a URL
given the src
attribute's value, relative to the
media element's node document when the src
attribute was last changed.
⌛ If urlRecord is not failure, then set the currentSrc
attribute to the result of applying the URL serializer to urlRecord.
End the synchronous section, continuing the remaining steps in parallel.
If urlRecord is not failure, then run the resource fetch algorithm with urlRecord. If that algorithm returns without aborting this one, then the load failed.
Failed with attribute: Reaching this step indicates that the media resource failed to load or that urlRecord is failure. Take pending play promises and queue a media element task given the media element to run the dedicated media source failure steps with the result.
Wait for the task queued by the previous step to have executed.
Return. The element won't attempt to load another resource until this algorithm is triggered again.
⌛ Let pointer be a position defined by two adjacent nodes in the media element's child list, treating the start of the list (before the first child in the list, if any) and end of the list (after the last child in the list, if any) as nodes in their own right. One node is the node before pointer, and the other node is the node after pointer. Initially, let pointer be the position between the candidate node and the next node, if there are any, or the end of the list, if it is the last node.
As nodes are inserted and removed into the media element, pointer must be updated as follows:
Other changes don't affect pointer.
⌛ Process candidate: If candidate does not have a
src
attribute, or if its src
attribute's value is the empty string, then end the
synchronous section, and jump down to the failed with elements step
below.
⌛ If candidate has a media
attribute whose value does not match the
environment, then end the synchronous section, and jump down to the
failed with elements step below.
⌛ Let urlRecord be the result of encoding-parsing a URL
given candidate's src
attribute's value,
relative to candidate's node document when the src
attribute was last changed.
⌛ If urlRecord is failure, then end the synchronous section, and jump down to the failed with elements step below.
⌛ If candidate has a type
attribute whose value, when parsed as a MIME
type (including any codecs described by the codecs
parameter, for
types that define that parameter), represents a type that the user agent knows it cannot
render, then end the synchronous section, and jump down to the failed with elements step below.
⌛ Set the currentSrc
attribute to
the result of applying the URL serializer to
urlRecord.
End the synchronous section, continuing the remaining steps in parallel.
Run the resource fetch algorithm with urlRecord. If that algorithm returns without aborting this one, then the load failed.
Failed with elements: Queue a media element task given the
media element to fire an event named
error
at candidate.
Await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended. (Steps in synchronous sections are marked with ⌛.)
⌛ Forget the media element's media-resource-specific tracks.
⌛ Find next candidate: Let candidate be null.
⌛ Search loop: If the node after pointer is the end of the list, then jump to the waiting step below.
⌛ If the node after pointer is a source
element,
let candidate be that element.
⌛ Advance pointer so that the node before pointer is now the node that was after pointer, and the node after pointer is the node after the node that used to be after pointer, if any.
⌛ If candidate is null, jump back to the search loop step. Otherwise, jump back to the process candidate step.
⌛ Waiting: Set the element's networkState
attribute to the NETWORK_NO_SOURCE
value.
⌛ Set the element's show poster flag to true.
⌛ Queue a media element task given the media element to set the element's delaying-the-load-event flag to false. This stops delaying the load event.
End the synchronous section, continuing the remaining steps in parallel.
Wait until the node after pointer is a node other than the end of the list. (This step might wait forever.)
Await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended. (Steps in synchronous sections are marked with ⌛.)
⌛ Set the element's delaying-the-load-event flag back to true (this delays the load event again, in case it hasn't been fired yet).
⌛ Set the networkState
back to NETWORK_LOADING
.
⌛ Jump back to the find next candidate step above.
The dedicated media source failure steps with a list of promises promises are the following steps:
Set the error
attribute to the result of
creating a MediaError
with MEDIA_ERR_SRC_NOT_SUPPORTED
.
Forget the media element's media-resource-specific tracks.
Set the element's networkState
attribute to
the NETWORK_NO_SOURCE
value.
Set the element's show poster flag to true.
Fire an event named error
at the media element.
Reject pending play promises with promises and a
"NotSupportedError
" DOMException
.
Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
To verify a media response given a response
response, a media resource resource, and
"entire resource
" or a
(number, number or "until end
") tuple byteRange:
If response is a network error, then return false.
If byteRange is "entire resource
", then return
true.
Let internalResponse be response's unsafe response.
If internalResponse's status is 200, then return true.
If internalResponse's status is not 206, then return false.
If the result of extracting content-range values from internalResponse is failure, then return false.
Note that the extracted values are not used, and in particular are not compared
to byteRange. So this step serves as syntactic validation of the `Content-Range
` header, but if the `Content-Range
` values on the response mismatch the `Range
` values on the request, that is not considered a failure.
Let origin be "rewritten
" if
internalResponse's URL is null; otherwise
internalResponse's URL's
origin.
Let previousOrigin be resource's origin.
If any of the following are true:
previousOrigin is "none
";
origin and previousOrigin are "rewritten
";
or
origin and previousOrigin are origins, and origin is same origin with previousOrigin,
then set resource's origin to origin.
Otherwise, if response is CORS-cross-origin, then return false.
Otherwise, set resource's origin to
"multiple
".
This ensures that opaque responses with range headers do not leak information by being patched together with other responses from different origins.
Return true.
The resource fetch algorithm for a media element and a given URL record or media provider object is as follows:
If the algorithm was invoked with media provider object or a URL record whose blob URL entry is a blob URL entry whose object is a media provider object, then let mode be local. Otherwise, let mode be remote.
If mode is remote, then let the current media resource be the resource given by the URL record passed to this algorithm; otherwise, let the current media resource be the resource given by the media provider object. Either way, the current media resource is now the element's media resource.
Remove all media-resource-specific text tracks from the media element's list of pending text tracks, if any.
Run the appropriate steps from the following list:
Optionally, run the following substeps. This is the expected behavior if the user agent
intends to not attempt to fetch the resource until the user requests it explicitly (e.g. as
a way to implement the preload
attribute's none
keyword).
Set the networkState
to NETWORK_IDLE
.
Queue a media element task given the media element to
fire an event named suspend
at the element.
Queue a media element task given the media element to set the element's delaying-the-load-event flag to false. This stops delaying the load event.
Wait for the task to be run.
Wait for an implementation-defined event (e.g., the user requesting that the media element begin playback).
Set the element's delaying-the-load-event flag back to true (this delays the load event again, in case it hasn't been fired yet).
Set the networkState
to NETWORK_LOADING
.
Let destination be "audio
" if the media
element is an audio
element, or "video
"
otherwise.
Let request be the result of creating a potential-CORS request given
current media resource's URL record, destination, and the
current state of media element's
crossorigin
content attribute.
Set request's client to the media element's node document's relevant settings object.
Set request's initiator type to destination.
Let byteRange, which is "entire resource
" or a
(number, number or "until end
") tuple, be the byte range required to satisfy
missing data in media data. This value is implementation-defined
and may rely on codec, network conditions or other heuristics. The user-agent may determine
to fetch the resource in full, in which case byteRange would be
"entire resource
", to fetch from a byte offset until the end,
in which case byteRange would be
(number, "until end
"), or to fetch a range between two byte offsets,
im which case byteRange would be a (number, number) tuple representing the two
offsets.
If byteRange is not "entire resource
", then:
If byteRange[1] is "until end
" then
add a range header to request given
byteRange[0].
Otherwise, add a range header to request given byteRange[0] and byteRange[1].
Fetch request, with processResponse set to the following steps given response response:
Let global be the media element's node document's relevant global object.
Let updateMedia be to queue a media element task given the media element to run the first appropriate steps from the media data processing steps list below. (A new task is used for this so that the work described below occurs relative to the appropriate media element event task source rather than using the networking task source.)
Let processEndOfMedia be the following step: If the fetching process has completed without errors, including decoding the media data, and if all of the data is available to the user agent without network access, then, the user agent must move on to the final step below. This might never happen, e.g. when streaming an infinite resource such as web radio, or if the resource is longer than the user agent's ability to cache data.
If the result of verifying response given the current media resource and byteRange is false, then abort these steps.
Otherwise, incrementally read response's body given updateMedia, processEndOfMedia, an empty algorithm, and global.
Update the media data with the contents of response's
unsafe response obtained in this fashion. response can be
CORS-same-origin or CORS-cross-origin; this affects whether
subtitles referenced in the media data are exposed in the API and, for
video
elements, whether acanvas
gets tainted when the video is
drawn on it.
The media element stall timeout is an implementation-defined length of time, which should be about three seconds. When a media element that is actively attempting to obtain media data has failed to receive any data for a duration equal to the media element stall timeout, the user agent must queue a media element task given the media element to:
Fire an event named stalled
at the element.
Set the element's is currently stalled to true.
User agents may allow users to selectively block or slow media data downloads. When a media element's download has been blocked altogether, the user agent must act as if it was stalled (as opposed to acting as if the connection was closed). The rate of the download may also be throttled automatically by the user agent, e.g. to balance the download with other connections sharing the same bandwidth.
User agents may decide to not download more content at any time,
e.g. after buffering five minutes of a one hour media resource, while waiting for the user
to decide whether to play the resource or not, while waiting for user input in an
interactive resource, or when the user navigates away from the page. When a media
element's download has been suspended, the user agent must queue a media
element task given the media element to set the networkState
to NETWORK_IDLE
and fire an event named suspend
at the element. If and when downloading of the
resource resumes, the user agent must queue a media element task given the
media element to set the networkState
to NETWORK_LOADING
. Between the queuing of these
tasks, the load is suspended (so progress
events
don't fire, as described above).
The preload
attribute provides a hint
regarding how much buffering the author thinks is advisable, even in the absence of the autoplay
attribute.
When a user agent decides to completely suspend a download, e.g., if it is waiting until the user starts playback before downloading any further content, the user agent must queue a media element task given the media element to set the element's delaying-the-load-event flag to false. This stops delaying the load event.
Although the above steps give an algorithm for issuing requests, the user agent may use other means besides those exact ones, especially in the face of error conditions. For example, the user agent may reconnect to the server or switch to a streaming protocol. The user agent must only consider the resource erroneous, and proceed into the error branches of the above steps, if the user agent has given up trying to fetch the resource.
To determine the format of the media resource, the user agent must use the rules for sniffing audio and video specifically.
While the load is not suspended (see below), every 350ms (±200ms) or for every byte received, whichever is least frequent, queue a media element task given the media element to:
Fire an event named progress
at the element.
Set the element's is currently stalled to false.
While the user agent might still need network access to obtain parts of the media resource, the user agent must remain on this step.
For example, if the user agent has discarded the first half of a video, the
user agent will remain at this step even once the playback has
ended, because there is always the chance the user will seek back to the start. In fact,
in this situation, once playback has ended, the user agent
will end up firing a suspend
event, as described
earlier.
The resource described by the current media resource, if any, contains the media data. It is CORS-same-origin.
If the current media resource is a raw data stream (e.g. from a
File
object), then to determine the format of the media resource,
the user agent must use the rules for sniffing
audio and video specifically. Otherwise, if the data stream is pre-decoded, then the
format is the format given by the relevant specification.
Whenever new data for the current media resource becomes available, queue a media element task given the media element to run the first appropriate steps from the media data processing steps list below.
When the current media resource is permanently exhausted (e.g. all the bytes of
a Blob
have been processed), if there were no decoding errors, then the user
agent must move on to the final step below. This might never happen, e.g. if the
current media resource is a MediaStream
.
The media data processing steps list is as follows:
DNS errors, HTTP 4xx and 5xx errors (and equivalents in other protocols), and other fatal network errors that occur before the user agent has established whether the current media resource is usable, as well as the file using an unsupported container format, or using unsupported codecs for all the data, must cause the user agent to execute the following steps:
The user agent should cancel the fetching process.
Abort this subalgorithm, returning to the resource selection algorithm.
Create an AudioTrack
object to represent the audio track.
Update the media element's audioTracks
attribute's AudioTrackList
object with the new AudioTrack
object.
Let enable be unknown.
If either the media resource or the URL of the current media resource indicate a particular set of audio tracks to enable, or if the user agent has information that would facilitate the selection of specific audio tracks to improve the user's experience, then: if this audio track is one of the ones to enable, then set enable to true, otherwise, set enable to false.
This could be triggered by media fragment syntax, but it could also be triggered e.g. by the user agent selecting a 5.1 surround sound audio track over a stereo audio track.
If enable is still unknown, then, if the media element does not yet have an enabled audio track, then set enable to true, otherwise, set enable to false.
If enable is true, then enable this audio track, otherwise, do not enable this audio track.
Fire an event named addtrack
at this AudioTrackList
object,
using TrackEvent
, with the track
attribute initialized to the new AudioTrack
object.
Create a VideoTrack
object to represent the video track.
Update the media element's videoTracks
attribute's VideoTrackList
object with the new VideoTrack
object.
Let enable be unknown.
If either the media resource or the URL of the current media resource indicate a particular set of video tracks to enable, or if the user agent has information that would facilitate the selection of specific video tracks to improve the user's experience, then: if this video track is the first such video track, then set enable to true, otherwise, set enable to false.
This could again be triggered by media fragment syntax.
If enable is still unknown, then, if the media element does not yet have a selected video track, then set enable to true, otherwise, set enable to false.
If enable is true, then select this track and unselect any
previously selected video tracks, otherwise, do not select this video track. If other tracks
are unselected, then a change
event will be fired.
Fire an event named addtrack
at this VideoTrackList
object,
using TrackEvent
, with the track
attribute initialized to the new VideoTrack
object.
This indicates that the resource is usable. The user agent must follow these substeps:
Establish the media timeline for the purposes of the current playback position and the earliest possible position, based on the media data.
Update the timeline offset to the date and time that corresponds to the zero time in the media timeline established in the previous step, if any. If no explicit time and date is given by the media resource, the timeline offset must be set to Not-a-Number (NaN).
Set the current playback position and the official playback position to the earliest possible position.
Update the duration
attribute with the time of
the last frame of the resource, if known, on the media timeline established
above. If it is not known (e.g. a stream that is in principle infinite), update the duration
attribute to the value positive Infinity.
The user agent will queue a media
element task given the media element to fire an event named durationchange
at the element at this point.
For video
elements, set the videoWidth
and videoHeight
attributes, and queue a media
element task given the media element to fire an event named resize
at the media element.
Further resize
events will be fired
if the dimensions subsequently change.
Set the readyState
attribute to HAVE_METADATA
.
A loadedmetadata
DOM event
will be fired as part of setting the readyState
attribute to a new value.
Let jumped be false.
If the media element's default playback start position is greater than zero, then seek to that time, and let jumped be true.
Let the media element's default playback start position be zero.
Let the initial playback position be zero.
If either the media resource or the URL of the current media resource indicate a particular start time, then set the initial playback position to that time and, if jumped is still false, seek to that time.
For example, with media formats that support media fragment syntax, the fragment can be used to indicate a start position.
If there is no enabled audio track, then
enable an audio track. This will cause a change
event to be fired.
If there is no selected video track,
then select a video track. This will cause a change
event to be fired.
Once the readyState
attribute reaches HAVE_CURRENT_DATA
, after
the loadeddata
event has been fired, set the
element's delaying-the-load-event flag to false. This stops delaying the load event.
A user agent that is attempting to reduce network usage while still fetching
the metadata for each media resource would also stop buffering at this point,
following the rules described previously, which involve the
networkState
attribute switching to the NETWORK_IDLE
value and a suspend
event firing.
The user agent is required to determine the duration of the media resource and go through this step before playing.
Fire an event named progress
at the media element.
Set the networkState
to NETWORK_IDLE
and fire an event named
suspend
at the media element.
If the user agent ever discards any media data and then needs to resume the
network activity to obtain it again, then it must queue a media element task
given the media element to set the networkState
to NETWORK_LOADING
.
If the user agent can keep the media resource loaded, then the algorithm will continue to its final step below, which aborts the algorithm.
Fatal network errors that occur after the user agent has established whether the current media resource is usable (i.e. once the media element's
readyState
attribute is no longer HAVE_NOTHING
) must cause the user agent to execute the
following steps:
The user agent should cancel the fetching process.
Set the error
attribute to the result of
creating a MediaError
with MEDIA_ERR_NETWORK
.
Set the element's networkState
attribute
to the NETWORK_IDLE
value.
Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
Fire an event named error
at the media element.
Abort the overall resource selection algorithm.
Fatal errors in decoding the media data that occur after the user agent has
established whether the current media resource is usable (i.e. once the media element's
readyState
attribute is no longer HAVE_NOTHING
) must cause the
user agent to execute the following steps:
The user agent should cancel the fetching process.
Set the error
attribute to the result of
creating a MediaError
with MEDIA_ERR_DECODE
.
Set the element's networkState
attribute
to the NETWORK_IDLE
value.
Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
Fire an event named error
at the media element.
Abort the overall resource selection algorithm.
The fetching process is aborted by the user, e.g. because the user
pressed a "stop" button, the user agent must execute the following steps. These steps are not
followed if the load()
method itself is invoked while
these steps are running, as the steps above handle that particular kind of abort.
The user agent should cancel the fetching process.
Set the error
attribute to the result of
creating a MediaError
with MEDIA_ERR_ABORTED
.
Fire an event named abort
at the media element.
If the media element's readyState
attribute has a value equal to HAVE_NOTHING
, set
the element's networkState
attribute to the
NETWORK_EMPTY
value, set the element's
show poster flag to true, and fire an
event named emptied
at the element.
Otherwise, set the element's networkState
attribute to the NETWORK_IDLE
value.
Set the element's delaying-the-load-event flag to false. This stops delaying the load event.
Abort the overall resource selection algorithm.
The server returning data that is partially usable but cannot be optimally rendered must cause the user agent to render just the bits it can handle, and ignore the rest.
If the media data is CORS-same-origin, run the steps to expose a media-resource-specific text track with the relevant data.
Cross-origin videos do not expose their subtitles, since that would allow attacks such as hostile sites reading subtitles from confidential videos on a user's intranet.
Final step: If the user agent ever reaches this step (which can only happen if the entire resource gets loaded and kept available): abort the overall resource selection algorithm.
When a media element is to forget the media element's media-resource-specific
tracks, the user agent must remove from the media element's list of text
tracks all the media-resource-specific
text tracks, then empty the media element's audioTracks
attribute's AudioTrackList
object,
then empty the media element's videoTracks
attribute's VideoTrackList
object. No events (in particular, no removetrack
events) are fired as part of this; the error
and emptied
events, fired by the algorithms that invoke this one, can be used instead.
The preload
attribute is an enumerated attribute with the following keywords and
states:
Keyword | State | Brief description |
---|---|---|
auto
| Automatic | Hints to the user agent that the user agent can put the user's needs first without risk to the server, up to and including optimistically downloading the entire resource. |
(the empty string) | ||
none
| None | Hints to the user agent that either the author does not expect the user to need the media resource, or that the server wants to minimize unnecessary traffic. This state does not provide a hint regarding how aggressively to actually download the media resource if buffering starts anyway (e.g. once the user hits "play"). |
metadata
| Metadata | Hints to the user agent that the author does not expect the user to need the media resource, but that fetching the resource metadata (dimensions, track list, duration, etc.), and maybe even the first few frames, is reasonable. If the user agent precisely fetches no more than the metadata, then the media element will end up with its readyState attribute set to HAVE_METADATA ; typically though, some frames will be obtained as well and it will probably be HAVE_CURRENT_DATA or HAVE_FUTURE_DATA .
When the media resource is playing, hints to the user agent that bandwidth is to be considered scarce, e.g. suggesting throttling the download so that the media data is obtained at the slowest possible rate that still maintains consistent playback.
|
The attribute's missing value default and invalid value default are both implementation-defined, though the Metadata state is suggested as a compromise between reducing server load and providing an optimal user experience.
The attribute can be changed even once the media resource is being buffered or played; the descriptions in the table above are to be interpreted with that in mind.
Authors might switch the attribute from "none
" or "metadata
" to "auto
" dynamically once the user begins playback. For
example, on a page with many videos this might be used to indicate that the many videos are not to
be downloaded unless requested, but that once one is requested it is to be downloaded
aggressively.
The preload
attribute is intended to provide a hint to
the user agent about what the author thinks will lead to the best user experience. The attribute
may be ignored altogether, for example based on explicit user preferences or based on the
available connectivity.
The preload
IDL attribute must reflect the content attribute of the same name, limited to
only known values.
The autoplay
attribute can override the
preload
attribute (since if the media plays, it naturally
has to buffer first, regardless of the hint given by the preload
attribute). Including both is not an error, however.
media.buffered
Returns a TimeRanges
object that represents the ranges of the media
resource that the user agent has buffered.
The buffered
attribute must return a new static
normalized TimeRanges
object that represents the ranges of the
media resource, if any, that the user agent has buffered, at the time the attribute
is evaluated. Users agents must accurately determine the ranges available, even for media streams
where this can only be determined by tedious inspection.
Typically this will be a single range anchored at the zero point, but if, e.g. the user agent uses HTTP range requests in response to seeking, then there could be multiple ranges.
User agents may discard previously buffered data.
Thus, a time position included within a range of the objects return by the buffered
attribute at one time can end up being not included in
the range(s) of objects returned by the same attribute at later times.
Returning a new object each time is a bad pattern for attribute getters and is only enshrined here as it would be costly to change it. It is not to be copied to new APIs.
media.duration
Returns the length of the media resource, in seconds, assuming that the start of the media resource is at time zero.
Returns NaN if the duration isn't available.
Returns Infinity for unbounded streams.
media.currentTime [ = value ]
Returns the official playback position, in seconds.
Can be set, to seek to the given time.
A media resource has a media timeline that maps times (in seconds) to positions in the media resource. The origin of a timeline is its earliest defined position. The duration of a timeline is its last defined position.
Establishing the media
timeline: if the media resource somehow specifies an explicit timeline whose
origin is not negative (i.e. gives each frame a specific time offset and gives the first frame a
zero or positive offset), then the media timeline should be that timeline. (Whether
the media resource can specify a timeline or not depends on the media resource's format.) If the media resource specifies an
explicit start time and date, then that time and date should be considered the zero point
in the media timeline; the timeline offset will be the time and date,
exposed using the getStartDate()
method.
If the media resource has a discontinuous timeline, the user agent must extend the timeline used at the start of the resource across the entire resource, so that the media timeline of the media resource increases linearly starting from the earliest possible position (as defined below), even if the underlying media data has out-of-order or even overlapping time codes.
For example, if two clips have been concatenated into one video file, but the video format exposes the original times for the two clips, the video data might expose a timeline that goes, say, 00:15..00:29 and then 00:05..00:38. However, the user agent would not expose those times; it would instead expose the times as 00:15..00:29 and 00:29..01:02, as a single video.
In the rare case of a media resource that does not have an explicit timeline, the zero time on the media timeline should correspond to the first frame of the media resource. In the even rarer case of a media resource with no explicit timings of any kind, not even frame durations, the user agent must itself determine the time for each frame in an implementation-defined manner.
An example of a file format with no explicit timeline but with explicit frame
durations is the Animated GIF format. An example of a file format with no explicit timings at all
is the JPEG-push format (multipart/x-mixed-replace
with JPEG frames, often
used as the format for MJPEG streams).
If, in the case of a resource with no timing information, the user agent will nonetheless be able to seek to an earlier point than the first frame originally provided by the server, then the zero time should correspond to the earliest seekable time of the media resource; otherwise, it should correspond to the first frame received from the server (the point in the media resource at which the user agent began receiving the stream).
At the time of writing, there is no known format that lacks explicit frame time offsets yet still supports seeking to a frame before the first frame sent by the server.
Consider a stream from a TV broadcaster, which begins streaming on a sunny Friday afternoon in
October, and always sends connecting user agents the media data on the same media timeline, with
its zero time set to the start of this stream. Months later, user agents connecting to this
stream will find that the first frame they receive has a time with millions of seconds. The getStartDate()
method would always return the date that the
broadcast started; this would allow controllers to display real times in their scrubber (e.g.
"2:30pm") rather than a time relative to when the broadcast began ("8 months, 4 hours, 12
minutes, and 23 seconds").
Consider a stream that carries a video with several concatenated fragments, broadcast by a
server that does not allow user agents to request specific times but instead just streams the
video data in a predetermined order, with the first frame delivered always being identified as
the frame with time zero. If a user agent connects to this stream and receives fragments defined
as covering timestamps 2010-03-20 23:15:00 UTC to 2010-03-21 00:05:00 UTC and 2010-02-12 14:25:00
UTC to 2010-02-12 14:35:00 UTC, it would expose this with a media timeline starting
at 0s and extending to 3,600s (one hour). Assuming the streaming server disconnected at the end
of the second clip, the duration
attribute would then
return 3,600. The getStartDate()
method would return a
Date
object with a time corresponding to 2010-03-20 23:15:00 UTC. However, if a
different user agent connected five minutes later, it would (presumably) receive
fragments covering timestamps 2010-03-20 23:20:00 UTC to 2010-03-21 00:05:00 UTC and 2010-02-12
14:25:00 UTC to 2010-02-12 14:35:00 UTC, and would expose this with a media timeline
starting at 0s and extending to 3,300s (fifty five minutes). In this case, the getStartDate()
method would return a Date
object
with a time corresponding to 2010-03-20 23:20:00 UTC.
In both of these examples, the seekable
attribute
would give the ranges that the controller would want to actually display in its UI; typically, if
the servers don't support seeking to arbitrary times, this would be the range of time from the
moment the user agent connected to the stream up to the latest frame that the user agent has
obtained; however, if the user agent starts discarding earlier information, the actual range
might be shorter.
In any case, the user agent must ensure that the earliest possible position (as defined below) using the established media timeline, is greater than or equal to zero.
The media timeline also has an associated clock. Which clock is used is user-agent defined, and may be media resource-dependent, but it should approximate the user's wall clock.
Media elements have a current playback position, which must initially (i.e. in the absence of media data) be zero seconds. The current playback position is a time on the media timeline.
Media elements also have an official playback position, which must initially be set to zero seconds. The official playback position is an approximation of the current playback position that is kept stable while scripts are running.
Media elements also have a default playback start position, which must initially be set to zero seconds. This time is used to allow the element to be seeked even before the media is loaded.
Each media element has a show poster flag. When a media
element is created, this flag must be set to true. This flag is used to control when the
user agent is to show a poster frame for a video
element instead of showing the video
contents.
The currentTime
attribute must, on getting, return the
media element's default playback start position, unless that is zero, in
which case it must return the element's official playback position. The returned
value must be expressed in seconds. On setting, if the media element's readyState
is HAVE_NOTHING
, then it must set the media
element's default playback start position to the new value; otherwise, it must
set the official playback position to the new value and then seek to the new value. The new value must be interpreted as being
in seconds.
If the media resource is a streaming resource, then the user agent might be unable to obtain certain parts of the resource after it has expired from its buffer. Similarly, some media resources might have a media timeline that doesn't start at zero. The earliest possible position is the earliest position in the stream or resource that the user agent can ever obtain again. It is also a time on the media timeline.
The earliest possible position is not explicitly exposed in the API;
it corresponds to the start time of the first range in the seekable
attribute's TimeRanges
object, if any, or
the current playback position otherwise.
When the earliest possible position changes, then: if the current playback
position is before the earliest possible position, the user agent must seek to the earliest possible position; otherwise, if
the user agent has not fired a timeupdate
event at
the element in the past 15 to 250ms and is not still running event handlers for such an event,
then the user agent must queue a media element task given the media
element to fire an event named timeupdate
at the element.
Because of the above requirement and the requirement in the resource fetch algorithm that kicks in when the metadata of the clip becomes known, the current playback position can never be less than the earliest possible position.
If at any time the user agent learns that an audio or video track has ended and all media data relating to that track corresponds to parts of the media timeline that are before the earliest possible position, the user agent may queue a media element task given the media element to run these steps:
Remove the track from the audioTracks
attribute's AudioTrackList
object or the videoTracks
attribute's VideoTrackList
object
as appropriate.
Fire an event named removetrack
at the media element's
aforementioned AudioTrackList
or VideoTrackList
object, using
TrackEvent
, with the track
attribute
initialized to the AudioTrack
or VideoTrack
object representing the
track.
The duration
attribute must return the time of the end of the
media resource, in seconds, on the media timeline. If no media
data is available, then the attributes must return the Not-a-Number (NaN) value. If the
media resource is not known to be bounded (e.g. streaming radio, or a live event with
no announced end time), then the attribute must return the positive Infinity value.
The user agent must determine the duration of the media resource before playing
any part of the media data and before setting readyState
to a value greater than or equal to HAVE_METADATA
, even if doing so requires fetching multiple
parts of the resource.
When the length of the media resource changes to a known value
(e.g. from being unknown to known, or from a previously established length to a new length) the
user agent must queue a media element task given the media element to
fire an event named durationchange
at the media element. (The
event is not fired when the duration is reset as part of loading a new media resource.) If the
duration is changed such that the current playback position ends up being greater
than the time of the end of the media resource, then the user agent must also seek to the time of the end of the media resource.
If an "infinite" stream ends for some reason, then the duration would change
from positive Infinity to the time of the last frame or sample in the stream, and the durationchange
event would be fired. Similarly, if the
user agent initially estimated the media resource's duration instead of determining
it precisely, and later revises the estimate based on new information, then the duration would
change and the durationchange
event would be
fired.
Some video files also have an explicit date and time corresponding to the zero time in the media timeline, known as the timeline offset. Initially, the timeline offset must be set to Not-a-Number (NaN).
The getStartDate()
method must return a new Date
object representing the current
timeline offset.
The loop
attribute is a boolean attribute that, if specified, indicates that the media
element is to seek back to the start of the media resource upon reaching the
end.
The loop
IDL
attribute must reflect the content attribute of the same name.
media.readyState
Returns a value that expresses the current state of the element with respect to rendering the current playback position, from the codes in the list below.
Media elements have a ready state, which describes to what degree they are ready to be rendered at the current playback position. The possible values are as follows; the ready state of a media element at any particular time is the greatest value describing the state of the element:
HAVE_NOTHING
(numeric value 0)No information regarding the media resource is available. No data for the
current playback position is available. Media
elements whose networkState
attribute are set
to NETWORK_EMPTY
are always in the HAVE_NOTHING
state.
HAVE_METADATA
(numeric value 1)Enough of the resource has been obtained that the duration of the resource is available.
In the case of a video
element, the dimensions of the video are also available. No
media data is available for the immediate current playback
position.
HAVE_CURRENT_DATA
(numeric value 2)Data for the immediate current playback position is available, but either not
enough data is available that the user agent could successfully advance the current
playback position in the direction of playback at all without immediately
reverting to the HAVE_METADATA
state, or there is no
more data to obtain in the direction of playback. For example, in video this
corresponds to the user agent having data from the current frame, but not the next frame, when
the current playback position is at the end of the current frame; and to when playback has ended.
HAVE_FUTURE_DATA
(numeric value 3)Data for the immediate current playback position is available, as well as
enough data for the user agent to advance the current playback position in the
direction of playback at least a little without immediately reverting to the HAVE_METADATA
state, and the text tracks are
ready. For example, in video this corresponds to the user agent having data for at least
the current frame and the next frame when the current playback position is at the
instant in time between the two frames, or to the user agent having the video data for the
current frame and audio data to keep playing at least a little when the current playback
position is in the middle of a frame. The user agent cannot be in this state if playback has ended, as the current playback position
can never advance in this case.
HAVE_ENOUGH_DATA
(numeric value 4)All the conditions described for the HAVE_FUTURE_DATA
state are met, and, in addition,
either of the following conditions is also true:
playbackRate
, would not overtake the available data
before playback reaches the end of the media resource.In practice, the difference between HAVE_METADATA
and HAVE_CURRENT_DATA
is negligible. Really the only time
the difference is relevant is when painting a video
element onto a
canvas
, where it distinguishes the case where something will be drawn (HAVE_CURRENT_DATA
or greater) from the case where
nothing is drawn (HAVE_METADATA
or less). Similarly,
the difference between HAVE_CURRENT_DATA
(only
the current frame) and HAVE_FUTURE_DATA
(at least
this frame and the next) can be negligible (in the extreme, only one frame). The only time that
distinction really matters is when a page provides an interface for "frame-by-frame"
navigation.
When the ready state of a media element whose networkState
is not NETWORK_EMPTY
changes, the user agent must follow the steps
given below:
Apply the first applicable set of substeps from the following list:
HAVE_NOTHING
,
and the new ready state is HAVE_METADATA
Queue a media element task given the media element to fire an event named loadedmetadata
at the element.
Before this task is run, as part of the event loop mechanism, the
rendering will have been updated to resize the video
element if appropriate.
HAVE_METADATA
and the new ready state is HAVE_CURRENT_DATA
or greaterIf this is the first time this occurs for this media
element since the load()
algorithm was last
invoked, the user agent must queue a media element task given the media
element to fire an event named loadeddata
at the element.
If the new ready state is HAVE_FUTURE_DATA
or HAVE_ENOUGH_DATA
, then the relevant steps
below must then be run also.
HAVE_FUTURE_DATA
or more, and the new ready state is
HAVE_CURRENT_DATA
or lessIf the media element was potentially
playing before its readyState
attribute
changed to a value lower than HAVE_FUTURE_DATA
, and the element has not
ended playback, and playback has not stopped due to errors,
paused for user interaction, or paused for in-band content, the user
agent must queue a media element task given the media element to
fire an event named timeupdate
at the element, and queue a media
element task given the media element to fire an event named waiting
at the element.
HAVE_CURRENT_DATA
or less, and the new ready state
is HAVE_FUTURE_DATA
The user agent must queue a media element task given the media
element to fire an event named canplay
at the element.
If the element's paused
attribute is false, the user
agent must notify about playing for the element.
HAVE_ENOUGH_DATA
If the previous ready state was HAVE_CURRENT_DATA
or less, the user agent must
queue a media element task given the media element to fire an event named canplay
at the element, and, if the element's paused
attribute is false, notify about playing
for the element.
The user agent must queue a media element task given the media
element to fire an event named canplaythrough
at the element.
If the element is not eligible for autoplay, then the user agent must abort these substeps.
The user agent may run the following substeps:
paused
attribute to false.play
at the element.Alternatively, if the element is a video
element, the user agent may start
observing whether the element intersects the
viewport. When the element starts intersecting
the viewport, if the element is still eligible for autoplay, run the
substeps above. Optionally, when the element stops intersecting the viewport, if the can autoplay flag is still
true and the autoplay
attribute is still specified,
run the following substeps:
pause
at the element.The substeps for playing and pausing can run multiple times as the element starts or stops intersecting the viewport, as long as the can autoplay flag is true.
User agents do not need to support autoplay, and it is suggested that user
agents honor user preferences on the matter. Authors are urged to use the autoplay
attribute rather than using script to force the
video to play, so as to allow the user to override the behavior if so desired.
It is possible for the ready state of a media element to jump between these states
discontinuously. For example, the state of a media element can jump straight from HAVE_METADATA
to HAVE_ENOUGH_DATA
without passing through the HAVE_CURRENT_DATA
and HAVE_FUTURE_DATA
states.
The readyState
IDL attribute must, on getting, return the
value described above that describes the current ready state of the media
element.
The autoplay
attribute is a boolean attribute.
When present, the user agent (as described in the algorithm described herein)
will automatically begin playback of the media resource as soon as it can do so
without stopping.
Authors are urged to use the autoplay
attribute rather than using script to trigger automatic playback, as this allows the user to
override the automatic playback when it is not desired, e.g. when using a screen reader. Authors
are also encouraged to consider not using the automatic playback behavior at all, and instead to
let the user agent wait for the user to start playback explicitly.
The autoplay
IDL attribute must reflect the
content attribute of the same name.
media.paused
Returns true if playback is paused; false otherwise.
media.ended
Returns true if playback has reached the end of the media resource.
media.defaultPlaybackRate [ = value ]
Returns the default rate of playback, for when the user is not fast-forwarding or reversing through the media resource.
Can be set, to change the default rate of playback.
The default rate has no direct effect on playback, but if the user switches to a fast-forward mode, when they return to the normal playback mode, it is expected that the rate of playback will be returned to the default rate of playback.
media.playbackRate [ = value ]
Returns the current rate playback, where 1.0 is normal speed.
Can be set, to change the rate of playback.
media.preservesPitch
Returns true if pitch-preserving algorithms are used when the playbackRate
is not 1.0. The default value is true.
Can be set to false to have the media resource's audio pitch change up or down
depending on the playbackRate
. This is useful for
aesthetic and performance reasons.
media.played
Returns a TimeRanges
object that represents the ranges of the media
resource that the user agent has played.
media.play()
Sets the paused
attribute to false, loading the
media resource and beginning playback if necessary. If the playback had ended, will
restart it from the start.
media.pause()
Sets the paused
attribute to true, loading the
media resource if necessary.
The paused
attribute represents whether the media element is paused or not. The attribute must
initially be true.
A media element is a blocked media element if its readyState
attribute is in the HAVE_NOTHING
state, the HAVE_METADATA
state, or the HAVE_CURRENT_DATA
state, or if the element has
paused for user interaction or paused for in-band content.
A media element is said to be potentially
playing when its paused
attribute is false, the
element has not ended playback, playback has not stopped due to errors,
and the element is not a blocked media element.
A waiting
DOM event can be fired as a result of an element that is
potentially playing stopping playback due to its readyState
attribute changing to a value lower than HAVE_FUTURE_DATA
.
A media element is said to be eligible for autoplay when all of the following are true:
its can autoplay flag is true;
its paused
attribute is true;
it has an autoplay
attribute
specified;
its node document's active sandboxing flag set does not have the sandboxed automatic features browsing context flag set; and
its node document is allowed to use the "autoplay
" feature.
A media element is said to be allowed to play if the user agent and the system allow media playback in the current context.
For example, a user agent could allow playback only when the media
element's Window
object has transient activation, but an
exception could be made to allow playback while muted.
A media element is said to have ended playback when:
The element's readyState
attribute is HAVE_METADATA
or greater, and
Either:
The current playback position is the end of the media resource, and
The direction of playback is forwards, and
The media element does not have a loop
attribute specified.
Or:
The current playback position is the earliest possible position, and
The direction of playback is backwards.
The ended
attribute must return true if, the last time the event loop reached step 1, the media element had ended playback and the
direction of playback was forwards, and false otherwise.
A media element is said to have stopped due to errors when the
element's readyState
attribute is HAVE_METADATA
or greater, and the user agent encounters a non-fatal error during the processing of the
media data, and due to that error, is not able to play the content at the
current playback position.
A media element is said to have paused for user interaction when its
paused
attribute is false, the readyState
attribute is either HAVE_FUTURE_DATA
or HAVE_ENOUGH_DATA
and the user agent has reached a point
in the media resource where the user has to make a selection for the resource to
continue.
It is possible for a media element to have both ended playback and paused for user interaction at the same time.
When a media element that is potentially playing stops playing
because it has paused for user interaction, the user agent must queue a media
element task given the media element to fire
an event named timeupdate
at the element.
A media element is said to have paused for in-band content when its
paused
attribute is false, the readyState
attribute is either HAVE_FUTURE_DATA
or HAVE_ENOUGH_DATA
and the user agent has suspended
playback of the media resource in order to play content that is temporally anchored
to the media resource and has a nonzero length, or to play content that is
temporally anchored to a segment of the media resource but has a length longer than
that segment.
One example of when a media element would be paused for in-band content is when the user agent is playing audio descriptions from an external WebVTT file, and the synthesized speech generated for a cue is longer than the time between the text track cue start time and the text track cue end time.
When the current playback position reaches the end of the media resource when the direction of playback is forwards, then the user agent must follow these steps:
If the media element has a loop
attribute specified, then seek to the earliest
possible position of the media resource and return.
As defined above, the ended
IDL attribute starts
returning true once the event loop returns to step 1.
Queue a media element task given the media element and the following steps:
Fire an event named timeupdate
at the media element.
If the media element has ended playback, the direction of playback is forwards, and paused is false, then:
Set the paused
attribute to true.
Fire an event named pause
at the media element.
Take pending play promises and reject pending play promises
with the result and an "AbortError
"
DOMException
.
Fire an event named ended
at the media element.
When the current playback position reaches the earliest possible
position of the media resource when the direction of playback is
backwards, then the user agent must only queue a media element task given the
media element to fire an event named timeupdate
at the element.
The word "reaches" here does not imply that the current playback position needs to have changed during normal playback; it could be via seeking, for instance.
The defaultPlaybackRate
attribute gives the
desired speed at which the media resource is to play, as a multiple of its intrinsic
speed. The attribute is mutable: on getting it must return the last value it was set to, or 1.0 if
it hasn't yet been set; on setting the attribute must be set to the new value.
The defaultPlaybackRate
is used
by the user agent when it exposes a user
interface to the user.
The playbackRate
attribute gives the effective playback
rate, which is the speed at which the media resource plays, as a multiple of its
intrinsic speed. If it is not equal to the defaultPlaybackRate
, then the implication is that
the user is using a feature such as fast forward or slow motion playback. The attribute is
mutable: on getting it must return the last value it was set to, or 1.0 if it hasn't yet been set;
on setting, the user agent must follow these steps:
If the given value is not supported by the user agent, then throw a
"NotSupportedError
" DOMException
.
Set playbackRate
to the new value, and if the
element is potentially playing, change the playback speed.
When the defaultPlaybackRate
or playbackRate
attributes change value (either by being set
by script or by being changed directly by the user agent, e.g. in response to user control) the
user agent must queue a media element task given the media element to
fire an event named ratechange
at the media element. The user
agent must process attribute changes smoothly and must not introduce any perceivable gaps or
muting of playback in response.
The preservesPitch
getter steps are to return true if a
pitch-preserving algorithm is in effect during playback. The setter steps are to correspondingly
switch the pitch-preserving algorithm on or off, without any perceivable gaps or muting of
playback. By default, such a pitch-preserving algorithm must be in effect (i.e., the getter will
initially return true).
The played
attribute must return a new static normalized TimeRanges
object that
represents the ranges of points on the media timeline of the media
resource reached through the usual monotonic increase of the current playback
position during normal playback, if any, at the time the attribute is evaluated.
Returning a new object each time is a bad pattern for attribute getters and is only enshrined here as it would be costly to change it. It is not to be copied to new APIs.
Each media element has a list of pending play promises, which must initially be empty.
To take pending play promises for a media element, the user agent must run the following steps:
Let promises be an empty list of promises.
Copy the media element's list of pending play promises to promises.
Clear the media element's list of pending play promises.
To resolve pending play promises for a media element with a list of promises promises, the user agent must resolve each promise in promises with undefined.
To reject pending play promises for a media element with a list of promises promises and an exception name error, the user agent must reject each promise in promises with error.
To notify about playing for a media element, the user agent must run the following steps:
Take pending play promises and let promises be the result.
Queue a media element task given the element and the following steps:
Fire an event named playing
at the element.
Resolve pending play promises with promises.
When the play()
method on a media element is invoked, the user agent must run the following
steps.
If the media element is not allowed to play, then return
a promise rejected with a "NotAllowedError
"
DOMException
.
If the media element's error
attribute is
not null and its code is MEDIA_ERR_SRC_NOT_SUPPORTED
, then
return a promise rejected with a "NotSupportedError
"
DOMException
.
This means that the dedicated media source failure steps have run.
Playback is not possible until the media element load algorithm clears the error
attribute.
Let promise be a new promise and append promise to the list of pending play promises.
Run the internal play steps for the media element.
Return promise.
The internal play steps for a media element are as follows:
If the media element's networkState
attribute has the value NETWORK_EMPTY
, invoke the media element's
resource selection algorithm.
If the playback has ended and the direction of playback is forwards, seek to the earliest possible position of the media resource.
This will cause the user agent to queue a media
element task given the media element to fire an event named timeupdate
at the media element.
If the media element's paused
attribute
is true, then:
Change the value of paused
to false.
If the show poster flag is true, set the element's show poster flag to false and run the time marches on steps.
Queue a media element task given the media element to fire an event named play
at the element.
If the media element's readyState
attribute has the value HAVE_NOTHING
, HAVE_METADATA
, or HAVE_CURRENT_DATA
, queue a media element
task given the media element to fire an
event named waiting
at the element.
Otherwise, the media element's readyState
attribute has the value HAVE_FUTURE_DATA
or HAVE_ENOUGH_DATA
: notify about playing
for the element.
Otherwise, if the media element's readyState
attribute has the value HAVE_FUTURE_DATA
or HAVE_ENOUGH_DATA
, take pending play
promises and queue a media element task given the media element
to resolve pending play promises with the result.
The media element is already playing. However, it's possible that promise will be rejected before the queued task is run.
Set the media element's can autoplay flag to false.
When the pause()
method is invoked, and when the user agent is required to pause the media element,
the user agent must run the following steps:
If the media element's networkState
attribute has the value NETWORK_EMPTY
, invoke the media element's
resource selection algorithm.
Run the internal pause steps for the media element.
The internal pause steps for a media element are as follows:
Set the media element's can autoplay flag to false.
If the media element's paused
attribute
is false, run the following steps:
Change the value of paused
to true.
Take pending play promises and let promises be the result.
Queue a media element task given the media element and the following steps:
Fire an event named timeupdate
at the element.
Fire an event named pause
at the element.
Reject pending play promises with promises and an
"AbortError
" DOMException
.
Set the official playback position to the current playback position.
If the element's playbackRate
is positive or zero,
then the direction of playback is forwards. Otherwise, it is backwards.
When a media element is potentially playing and
its Document
is a fully active Document
, its current
playback position must increase monotonically at the element's playbackRate
units of media time per unit time of the
media timeline's clock. (This specification always refers to this as an
increase, but that increase could actually be a decrease if the element's playbackRate
is negative.)
The element's playbackRate
can be
0.0, in which case the current playback position doesn't move, despite playback not
being paused (paused
doesn't become true, and the pause
event doesn't fire).
This specification doesn't define how the user agent achieves the appropriate playback rate — depending on the protocol and media available, it is plausible that the user agent could negotiate with the server to have the server provide the media data at the appropriate rate, so that (except for the period between when the rate is changed and when the server updates the stream's playback rate) the client doesn't actually have to drop or interpolate any frames.
Any time the user agent provides a stable state, the official playback position must be set to the current playback position.
While the direction of playback is backwards, any corresponding audio must be
muted. While the element's playbackRate
is so low or so high that the user agent
cannot play audio usefully, the corresponding audio must also be muted. If the element's playbackRate
is not 1.0 and preservesPitch
is true, the user agent must apply pitch
adjustment to preserve the original pitch of the audio. Otherwise, the user agent must speed up
or slow down the audio without any pitch adjustment.
When a media element is potentially playing, its audio data played must be synchronized with the current playback position, at the element's effective media volume. The user agent must play the audio from audio tracks that were enabled when the event loop last reached step 1.
When a media element is not potentially playing, audio must not play for the element.
Media elements that are potentially playing while not in a document must not play any video, but should play any audio component. Media elements must not stop playing just because all references to them have been removed; only once a media element is in a state where no further audio could ever be played by that element may the element be garbage collected.
It is possible for an element to which no explicit references exist to play audio,
even if such an element is not still actively playing: for instance, it could be unpaused but
stalled waiting for content to buffer, or it could be still buffering, but with a
suspend
event listener that begins playback. Even a
media element whose media resource has no audio tracks could eventually play audio
again if it had an event listener that changes the media resource.
Each media element has a list of newly introduced cues, which must be initially empty. Whenever a text track cue is added to the list of cues of a text track that is in the list of text tracks for a media element, that cue must be added to the media element's list of newly introduced cues. Whenever a text track is added to the list of text tracks for a media element, all of the cues in that text track's list of cues must be added to the media element's list of newly introduced cues. When a media element's list of newly introduced cues has new cues added while the media element's show poster flag is not set, then the user agent must run the time marches on steps.
When a text track cue is removed from the list of cues of a text track that is in the list of text tracks for a media element, and whenever a text track is removed from the list of text tracks of a media element, if the media element's show poster flag is not set, then the user agent must run the time marches on steps.
When the current playback position of a media element changes (e.g. due to playback or seeking), the user agent must run the time marches on steps. To support use cases that depend on the timing accuracy of cue event firing, such as synchronizing captions with shot changes in a video, user agents should fire cue events as close as possible to their position on the media timeline, and ideally within 20 milliseconds. If the current playback position changes while the steps are running, then the user agent must wait for the steps to complete, and then must immediately rerun the steps. These steps are thus run as often as possible or needed.
If one iteration takes a long time, this can cause short duration
cues to be skipped over as the user agent rushes ahead to
"catch up", so these cues will not appear in the activeCues
list.
The time marches on steps are as follows:
Let current cues be a list of cues, initialized to contain all the cues of all the hidden or showing text tracks of the media element (not the disabled ones) whose start times are less than or equal to the current playback position and whose end times are greater than the current playback position.
Let other cues be a list of cues, initialized to contain all the cues of hidden and showing text tracks of the media element that are not present in current cues.
Let last time be the current playback position at the time this algorithm was last run for this media element, if this is not the first time it has run.
If the current playback position has, since the last time this algorithm was run, only changed through its usual monotonic increase during normal playback, then let missed cues be the list of cues in other cues whose start times are greater than or equal to last time and whose end times are less than or equal to the current playback position. Otherwise, let missed cues be an empty list.
Remove all the cues in missed cues that are also in the media element's list of newly introduced cues, and then empty the element's list of newly introduced cues.
If the time was reached through the usual monotonic increase of the current playback
position during normal playback, and if the user agent has not fired a timeupdate
event at the element in the past 15 to 250ms
and is not still running event handlers for such an event, then the user agent must queue a
media element task given the media element to fire an event named timeupdate
at the element. (In the other cases, such as
explicit seeks, relevant events get fired as part of the overall process of changing the
current playback position.)
The event thus is not to be fired faster than about 66Hz or slower than 4Hz (assuming the event handlers don't take longer than 250ms to run). User agents are encouraged to vary the frequency of the event based on the system load and the average cost of processing the event each time, so that the UI updates are not any more frequent than the user agent can comfortably handle while decoding the video.
If all of the cues in current cues have their text track cue active flag set, none of the cues in other cues have their text track cue active flag set, and missed cues is empty, then return.
If the time was reached through the usual monotonic increase of the current playback position during normal playback, and there are cues in other cues that have their text track cue pause-on-exit flag set and that either have their text track cue active flag set or are also in missed cues, then immediately pause the media element.
In the other cases, such as explicit seeks, playback is not paused by going past the end time of a cue, even if that cue has its text track cue pause-on-exit flag set.
Let events be a list of tasks, initially empty. Each task in this list will be associated with a text track, a text track cue, and a time, which are used to sort the list before the tasks are queued.
Let affected tracks be a list of text tracks, initially empty.
When the steps below say to prepare an event named event for a text track cue target with a time time, the user agent must run these steps:
Let track be the text track with which the text track cue target is associated.
Create a task to fire an event named event at target.
Add the newly created task to events, associated with the time time, the text track track, and the text track cue target.
Add track to affected tracks.
For each text track cue in missed
cues, prepare an event named enter
for the
TextTrackCue
object with the text track cue start time.
For each text track cue in other
cues that either has its text track cue active flag set or is in missed cues, prepare an event named exit
for the TextTrackCue
object with the later of the
text track cue end time and the text track cue start time.
For each text track cue in current
cues that does not have its text track cue active flag set, prepare an
event named enter
for the TextTrackCue
object with the text track cue start time.
Sort the tasks in events in ascending time order (tasks with earlier times first).
Further sort tasks in events that have the same time by the relative text track cue order of the text track cues associated with these tasks.
Finally, sort tasks in events that have the
same time and same text track cue order by placing tasks that fire enter
events before those that fire exit
events.
Queue a media element task given the media element for each task in events, in list order.
Sort affected tracks in the same order as the text tracks appear in the media element's list of text tracks, and remove duplicates.
For each text track in affected tracks, in the list order,
queue a media element task given the media element to fire an event named cuechange
at the TextTrack
object, and, if the
text track has a corresponding track
element, to then fire an event named cuechange
at the track
element as well.
Set the text track cue active flag of all the cues in the current cues, and unset the text track cue active flag of all the cues in the other cues.
Run the rules for updating the text track rendering of each of the text tracks in affected tracks that are showing, providing the text track's text track language as the fallback language if it is not the empty string. For example, for text tracks based on WebVTT, the rules for updating the display of WebVTT text tracks. WEBVTT
For the purposes of the algorithm above, a text track cue is considered to be part of a text track only if it is listed in the text track list of cues, not merely if it is associated with the text track.
If the media element's node document stops being a fully active document, then the playback will stop until the document is active again.
When a media element is removed
from a Document
, the user agent must run the following steps:
Await a stable state, allowing the task that removed the media element from the
Document
to continue. The synchronous section consists of all the
remaining steps of this algorithm. (Steps in the synchronous section are marked with
⌛.)
⌛ If the media element is in a document, return.
⌛ Run the internal pause steps for the media element.
media.seeking
Returns true if the user agent is currently seeking.
media.seekable
Returns a TimeRanges
object that represents the ranges of the media
resource to which it is possible for the user agent to seek.
media.fastSeek(time)
Seeks to near the given time as fast as possible, trading precision for speed. (To
seek to a precise time, use the currentTime
attribute.)
This does nothing if the media resource has not been loaded.
The seeking
attribute must initially have the value false.
The fastSeek(time)
method must seek to the time given by time, with the
approximate-for-speed flag set.
When the user agent is required to seek to a particular new playback position in the media resource, optionally with the approximate-for-speed flag set, it means that the user agent must run the following steps. This algorithm interacts closely with the event loop mechanism; in particular, it has a synchronous section (which is triggered as part of the event loop algorithm). Steps in that section are marked with ⌛.
Set the media element's show poster flag to false.
If the media element's readyState
is HAVE_NOTHING
, return.
If the element's seeking
IDL attribute is true,
then another instance of this algorithm is already running. Abort that other instance of the
algorithm without waiting for the step that it is running to complete.
Set the seeking
IDL attribute to true.
If the seek was in response to a DOM method call or setting of an IDL attribute, then continue the script. The remainder of these steps must be run in parallel. With the exception of the steps marked with ⌛, they could be aborted at any time by another instance of this algorithm being invoked.
If the new playback position is later than the end of the media resource, then let it be the end of the media resource instead.
If the new playback position is less than the earliest possible position, let it be that position instead.
If the (possibly now changed) new playback position is not in one of
the ranges given in the seekable
attribute, then let it
be the position in one of the ranges given in the seekable
attribute that is the nearest to the new
playback position. If two positions both satisfy that constraint (i.e. the new playback position is exactly in the middle between two ranges in the seekable
attribute) then use the position that is closest to
the current playback position. If there are no ranges given in the seekable
attribute then set the seeking
IDL attribute to false and return.
If the approximate-for-speed flag is set, adjust the new playback position to a value that will allow for playback to resume promptly. If new playback position before this step is before current playback position, then the adjusted new playback position must also be before the current playback position. Similarly, if the new playback position before this step is after current playback position, then the adjusted new playback position must also be after the current playback position.
For example, the user agent could snap to a nearby key frame, so that it doesn't have to spend time decoding then discarding intermediate frames before resuming playback.
Queue a media element task given the media element to fire an event named seeking
at the element.
Set the current playback position to the new playback position.
If the media element was potentially playing
immediately before it started seeking, but seeking caused its readyState
attribute to change to a value lower than HAVE_FUTURE_DATA
, then a waiting
event will be
fired at the element.
This step sets the current playback position, and thus can immediately trigger other conditions, such as the rules regarding when playback "reaches the end of the media resource" (part of the logic that handles looping), even before the user agent is actually able to render the media data for that position (as determined in the next step).
The currentTime
attribute returns
the official playback position, not the current playback position, and
therefore gets updated before script execution, separate from this algorithm.
Wait until the user agent has established whether or not the media data for the new playback position is available, and, if it is, until it has decoded enough data to play back that position.
Await a stable state. The synchronous section consists of all the remaining steps of this algorithm. (Steps in the synchronous section are marked with ⌛.)
⌛ Set the seeking
IDL attribute to
false.
⌛ Run the time marches on steps.
⌛ Queue a media element task given the media
element to fire an event named timeupdate
at the element.
⌛ Queue a media element task given the media element to
fire an event named seeked
at the element.
The seekable
attribute must return a new static
normalized TimeRanges
object that represents the ranges of the
media resource, if any, that the user agent is able to seek to, at the time the
attribute is evaluated.
If the user agent can seek to anywhere in the media resource, e.g.
because it is a simple movie file and the user agent and the server support HTTP Range requests,
then the attribute would return an object with one range, whose start is the time of the first
frame (the earliest possible position, typically zero), and whose end is the same as
the time of the first frame plus the duration
attribute's
value (which would equal the time of the last frame, and might be positive Infinity).
The range might be continuously changing, e.g. if the user agent is buffering a sliding window on an infinite stream. This is the behavior seen with DVRs viewing live TV, for instance.
Returning a new object each time is a bad pattern for attribute getters and is only enshrined here as it would be costly to change it. It is not to be copied to new APIs.
User agents should adopt a very liberal and optimistic view of what is seekable. User agents should also buffer recent content where possible to enable seeking to be fast.
For instance, consider a large video file served on an HTTP server without support for HTTP Range requests. A browser could implement this by only buffering the current frame and data obtained for subsequent frames, never allow seeking, except for seeking to the very start by restarting the playback. However, this would be a poor implementation. A high quality implementation would buffer the last few minutes of content (or more, if sufficient storage space is available), allowing the user to jump back and rewatch something surprising without any latency, and would in addition allow arbitrary seeking by reloading the file from the start if necessary, which would be slower but still more convenient than having to literally restart the video and watch it all the way through just to get to an earlier unbuffered spot.
Media resources might be internally scripted or interactive. Thus, a media element could play in a non-linear fashion. If this happens, the user agent must act as if the algorithm for seeking was used whenever the current playback position changes in a discontinuous fashion (so that the relevant events fire).
A media resource can have multiple embedded audio and video tracks. For example, in addition to the primary video and audio tracks, a media resource could have foreign-language dubbed dialogues, director's commentaries, audio descriptions, alternative angles, or sign-language overlays.
media.audioTracks
Returns an AudioTrackList
object representing the audio tracks available in the
media resource.
media.videoTracks
Returns a VideoTrackList
object representing the video tracks available in the
media resource.
The audioTracks
attribute of a media element
must return a live AudioTrackList
object representing the audio tracks
available in the media element's media resource.
The videoTracks
attribute of a media element
must return a live VideoTrackList
object representing the video tracks
available in the media element's media resource.
There are only ever one AudioTrackList
object and one
VideoTrackList
object per media element, even if another media
resource is loaded into the element: the objects are reused. (The AudioTrack
and VideoTrack
objects are not, though.)
AudioTrackList
and VideoTrackList
objectsThe AudioTrackList
and VideoTrackList
interfaces are used by
attributes defined in the previous section.
[Exposed=Window]
interface AudioTrackList : EventTarget {
readonly attribute unsigned long length;
getter AudioTrack (unsigned long index);
AudioTrack? getTrackById(DOMString id);
attribute EventHandler onchange;
attribute EventHandler onaddtrack;
attribute EventHandler onremovetrack;
};
[Exposed=Window]
interface AudioTrack {
readonly attribute DOMString id;
readonly attribute DOMString kind;
readonly attribute DOMString label;
readonly attribute DOMString language;
attribute boolean enabled;
};
[Exposed=Window]
interface VideoTrackList : EventTarget {
readonly attribute unsigned long length;
getter VideoTrack (unsigned long index);
VideoTrack? getTrackById(DOMString id);
readonly attribute long selectedIndex;
attribute EventHandler onchange;
attribute EventHandler onaddtrack;
attribute EventHandler onremovetrack;
};
[Exposed=Window]
interface VideoTrack {
readonly attribute DOMString id;
readonly attribute DOMString kind;
readonly attribute DOMString label;
readonly attribute DOMString language;
attribute boolean selected;
};
media.audioTracks.length
media.videoTracks.length
Returns the number of tracks in the list.
audioTrack = media.audioTracks[index]
videoTrack = media.videoTracks[index]
Returns the specified AudioTrack
or VideoTrack
object.
audioTrack = media.audioTracks.getTrackById(id)
videoTrack = media.videoTracks.getTrackById(id)
Returns the AudioTrack
or VideoTrack
object with the given
identifier, or null if no track has that identifier.
audioTrack.id
videoTrack.id
Returns the ID of the given track. This is the ID that can be used with a fragment if the format supports media fragment
syntax, and that can be used with the getTrackById()
method.
audioTrack.kind
videoTrack.kind
Returns the category the given track falls into. The possible track categories are given below.
audioTrack.label
videoTrack.label
Returns the label of the given track, if known, or the empty string otherwise.
audioTrack.language
videoTrack.language
Returns the language of the given track, if known, or the empty string otherwise.
audioTrack.enabled [ = value ]
Returns true if the given track is active, and false otherwise.
Can be set, to change whether the track is enabled or not. If multiple audio tracks are enabled simultaneously, they are mixed.
media.videoTracks.selectedIndex
Returns the index of the currently selected track, if any, or −1 otherwise.
videoTrack.selected [ = value ]
Returns true if the given track is active, and false otherwise.
Can be set, to change whether the track is selected or not. Either zero or one video track is selected; selecting a new track while a previous one is selected will unselect the previous one.
An AudioTrackList
object represents a dynamic list of zero or more audio tracks,
of which zero or more can be enabled at a time. Each audio track is represented by an
AudioTrack
object.
A VideoTrackList
object represents a dynamic list of zero or more video tracks, of
which zero or one can be selected at a time. Each video track is represented by a
VideoTrack
object.
Tracks in AudioTrackList
and VideoTrackList
objects must be
consistently ordered. If the media resource is in a format that defines an order,
then that order must be used; otherwise, the order must be the relative order in which the tracks
are declared in the media resource. The order used is called the natural order
of the list.
Each track in one of these objects thus has an index; the first has the index 0, and each subsequent track is numbered one higher than the previous one. If a media resource dynamically adds or removes audio or video tracks, then the indices of the tracks will change dynamically. If the media resource changes entirely, then all the previous tracks will be removed and replaced with new tracks.
The AudioTrackList
length
and VideoTrackList
length
attribute getters must return the number of tracks represented by their objects at the time of
getting.
The supported property indices of AudioTrackList
and
VideoTrackList
objects at any instant are the numbers from zero to the number of
tracks represented by the respective object minus one, if any tracks are represented. If an
AudioTrackList
or VideoTrackList
object represents no tracks, it has no
supported property indices.
To determine the value of an indexed property for a
given index index in an AudioTrackList
or VideoTrackList
object list, the user agent must return the AudioTrack
or
VideoTrack
object that represents the indexth track in list.
The AudioTrackList
getTrackById(id)
and
VideoTrackList
getTrackById(id)
methods must
return the first AudioTrack
or VideoTrack
object (respectively) in the
AudioTrackList
or VideoTrackList
object (respectively) whose identifier
is equal to the value of the id argument (in the natural order of the list, as defined
above). When no tracks match the given argument, the methods must return null.
The AudioTrack
and VideoTrack
objects represent specific tracks of a
media resource. Each track can have an identifier, category, label, and language.
These aspects of a track are permanent for the lifetime of the track; even if a track is removed
from a media resource's AudioTrackList
or VideoTrackList
objects, those aspects do not change.
In addition, AudioTrack
objects can each be enabled or disabled; this is the audio
track's enabled state. When an AudioTrack
is created, its enabled state
must be set to false (disabled). The resource fetch
algorithm can override this.
Similarly, a single VideoTrack
object per VideoTrackList
object can
be selected, this is the video track's selection state. When a VideoTrack
is
created, its selection state must be set to false (not selected). The resource fetch algorithm can override this.
The AudioTrack
id
and VideoTrack
id
attributes must return the
identifier of the track, if it has one, or the empty string otherwise. If the media
resource is in a format that supports media fragment syntax, the identifier
returned for a particular track must be the same identifier that would enable the track if used as
the name of a track in the track dimension of such a fragment. INBAND
For example, in Ogg files, this would be the Name header field of the track. OGGSKELETONHEADERS
The AudioTrack
kind
and VideoTrack
kind
attributes must return the
category of the track, if it has one, or the empty string otherwise.
The category of a track is the string given in the first column of the table below that is the
most appropriate for the track based on the definitions in the table's second and third columns,
as determined by the metadata included in the track in the media resource. The cell
in the third column of a row says what the category given in the cell in the first column of that
row applies to; a category is only appropriate for an audio track if it applies to audio tracks,
and a category is only appropriate for video tracks if it applies to video tracks. Categories must
only be returned for AudioTrack
objects if they are appropriate for audio, and must
only be returned for VideoTrack
objects if they are appropriate for video.
For Ogg files, the Role header field of the track gives the relevant metadata. For DASH media
resources, the Role
element conveys the information. For WebM, only the
FlagDefault
element currently maps to a value. Sourcing In-band
Media Resource Tracks from Media Containers into HTML has further details.
OGGSKELETONHEADERS DASH WEBMCG INBAND
Category | Definition | Applies to... | Examples |
---|---|---|---|
"alternative "
| A possible alternative to the main track, e.g. a different take of a song (audio), or a different angle (video). | Audio and video. | Ogg: "audio/alternate" or "video/alternate"; DASH: "alternate" without "main" and "commentary" roles, and, for audio, without the "dub" role (other roles ignored). |
"captions "
| A version of the main video track with captions burnt in. (For legacy content; new content would use text tracks.) | Video only. | DASH: "caption" and "main" roles together (other roles ignored). |
"descriptions "
| An audio description of a video track. | Audio only. | Ogg: "audio/audiodesc". |
"main "
| The primary audio or video track. | Audio and video. | Ogg: "audio/main" or "video/main"; WebM: the "FlagDefault" element is set; DASH: "main" role without "caption", "subtitle", and "dub" roles (other roles ignored). |
"main-desc "
| The primary audio track, mixed with audio descriptions. | Audio only. | AC3 audio in MPEG-2 TS: bsmod=2 and full_svc=1. |
"sign "
| A sign-language interpretation of an audio track. | Video only. | Ogg: "video/sign". |
"subtitles "
| A version of the main video track with subtitles burnt in. (For legacy content; new content would use text tracks.) | Video only. | DASH: "subtitle" and "main" roles together (other roles ignored). |
"translation "
| A translated version of the main audio track. | Audio only. | Ogg: "audio/dub". DASH: "dub" and "main" roles together (other roles ignored). |
"commentary "
| Commentary on the primary audio or video track, e.g. a director's commentary. | Audio and video. | DASH: "commentary" role without "main" role (other roles ignored). |
" " (empty string)
| No explicit kind, or the kind given by the track's metadata is not recognized by the user agent. | Audio and video. |
The AudioTrack
label
and VideoTrack
label
attributes must return the
label of the track, if it has one, or the empty string otherwise. INBAND
The AudioTrack
language
and VideoTrack
language
attributes must
return the BCP 47 language tag of the language of the track, if it has one, or the empty string
otherwise. If the user agent is not able to express that language as a BCP 47 language tag (for
example because the language information in the media resource's format is a
free-form string without a defined interpretation), then the method must return the empty string,
as if the track had no language. INBAND
The AudioTrack
enabled
attribute, on getting, must return true if
the track is currently enabled, and false otherwise. On setting, it must enable the track if the
new value is true, and disable it otherwise. (If the track is no longer in an
AudioTrackList
object, then the track being enabled or disabled has no effect beyond
changing the value of the attribute on the AudioTrack
object.)
Whenever an audio track in an AudioTrackList
that was
disabled is enabled, and whenever one that was enabled is disabled, the user agent must
queue a media element task given the media element to fire an event named change
at the AudioTrackList
object.
An audio track that has no data for a particular position on the media timeline, or that does not exist at that position, must be interpreted as being silent at that point on the timeline.
The VideoTrackList
selectedIndex
attribute must return the
index of the currently selected track, if any. If the VideoTrackList
object does not
currently represent any tracks, or if none of the tracks are selected, it must instead return
−1.
The VideoTrack
selected
attribute, on getting, must return true if
the track is currently selected, and false otherwise. On setting, it must select the track if the
new value is true, and unselect it otherwise. If the track is in a VideoTrackList
,
then all the other VideoTrack
objects in that list must be unselected. (If the track
is no longer in a VideoTrackList
object, then the track being selected or unselected
has no effect beyond changing the value of the attribute on the VideoTrack
object.)
Whenever a track in a VideoTrackList
that was previously
not selected is selected, and whenever the selected track in a VideoTrackList
is
unselected without a new track being selected in its stead, the user agent must queue a
media element task given the media element to fire an event named change
at the VideoTrackList
object. This task must be queued
before the task that fires the resize
event, if any.
A video track that has no data for a particular position on the media timeline must be interpreted as being transparent black at that point on the timeline, with the same dimensions as the last frame before that position, or, if the position is before all the data for that track, the same dimensions as the first frame for that track. A track that does not exist at all at the current position must be treated as if it existed but had no data.
For instance, if a video has a track that is only introduced after one hour of playback, and the user selects that track then goes back to the start, then the user agent will act as if that track started at the start of the media resource but was simply transparent until one hour in.
The following are the event handlers (and their corresponding event handler event types) that must be supported, as event handler IDL attributes,
by all objects implementing the AudioTrackList
and VideoTrackList
interfaces:
Event handler | Event handler event type |
---|---|
onchange | change
|
onaddtrack | addtrack
|
onremovetrack | removetrack
|
The audioTracks
and videoTracks
attributes allow scripts to select which track
should play, but it is also possible to select specific tracks declaratively, by specifying
particular tracks in the fragment of the
URL of the media resource. The format of the fragment depends on the MIME type of the
media resource. RFC2046 URL
In this example, a video that uses a format that supports media fragment syntax is embedded in such a way that the alternative angles labeled "Alternative" are enabled instead of the default video track.
<video src="myvideo#track=Alternative"></video>
A media element can have a group of associated text tracks, known as the media element's list of text tracks. The text tracks are sorted as follows:
The text tracks corresponding to track
element children of the media element, in tree order.
Any text tracks added using the addTextTrack()
method, in the order they were added,
oldest first.
Any media-resource-specific text tracks (text tracks corresponding to data in the media resource), in the order defined by the media resource's format specification.
A text track consists of:
This decides how the track is handled by the user agent. The kind is represented by a string. The possible strings are:
subtitles
captions
descriptions
chapters
metadata
The kind of track can change dynamically, in the case of
a text track corresponding to a track
element.
This is a human-readable string intended to identify the track for the user.
The label of a track can change dynamically, in the
case of a text track corresponding to a track
element.
When a text track label is the empty string, the user agent should automatically generate an appropriate label from the text track's other properties (e.g. the kind of text track and the text track's language) for use in its user interface. This automatically-generated label is not exposed in the API.
This is a string extracted from the media resource specifically for in-band metadata tracks to enable such tracks to be dispatched to different scripts in the document.
For example, a traditional TV station broadcast streamed on the web and augmented with web-specific interactive features could include text tracks with metadata for ad targeting, trivia game data during game shows, player states during sports games, recipe information during food programs, and so forth. As each program starts and ends, new tracks might be added or removed from the stream, and as each one is added, the user agent could bind them to dedicated script modules using the value of this attribute.
Other than for in-band metadata text tracks, the in-band metadata track dispatch type is the empty string. How this value is populated for different media formats is described in steps to expose a media-resource-specific text track.
This is a string (a BCP 47 language tag) representing the language of the text track's cues. BCP47
The language of a text track can change dynamically,
in the case of a text track corresponding to a track
element.
One of the following:
Indicates that the text track's cues have not been obtained.
Indicates that the text track is loading and there have been no fatal errors encountered so far. Further cues might still be added to the track by the parser.
Indicates that the text track has been loaded with no fatal errors.
Indicates that the text track was enabled, but when the user agent attempted to obtain it, this failed in some way (e.g., URL could not be parsed, network error, unknown text track format). Some or all of the cues are likely missing and will not be obtained.
The readiness state of a text track changes dynamically as the track is obtained.
One of the following:
Indicates that the text track is not active. Other than for the purposes of exposing the track in the DOM, the user agent is ignoring the text track. No cues are active, no events are fired, and the user agent will not attempt to obtain the track's cues.
Indicates that the text track is active, but that the user agent is not actively displaying the cues. If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily. The user agent is maintaining a list of which cues are active, and events are being fired accordingly.
Indicates that the text track is active. If no attempt has yet been made to obtain the
track's cues, the user agent will perform such an attempt momentarily. The user agent is
maintaining a list of which cues are active, and events are being fired accordingly. In
addition, for text tracks whose kind is subtitles
or captions
, the cues are being overlaid on the video
as appropriate; for text tracks whose kind is descriptions
, the user agent is making the
cues available to the user in a non-visual fashion; and for text tracks whose kind is chapters
, the user agent is making available to
the user a mechanism by which the user can navigate to any point in the media
resource by selecting a cue.
A list of text track cues, along with rules for updating the text track rendering. For example, for WebVTT, the rules for updating the display of WebVTT text tracks. WEBVTT
The list of cues of a text track can change dynamically, either because the text track has not yet been loaded or is still loading, or due to DOM manipulation.
Each text track has a corresponding TextTrack
object.
Each media element has a list of pending text tracks, which must initially be empty, a blocked-on-parser flag, which must initially be false, and a did-perform-automatic-track-selection flag, which must also initially be false.
When the user agent is required to populate the list of pending text tracks of a media element, the user agent must add to the element's list of pending text tracks each text track in the element's list of text tracks whose text track mode is not disabled and whose text track readiness state is loading.
Whenever a track
element's parent node changes, the user agent must remove the
corresponding text track from any list of pending text tracks that it is
in.
Whenever a text track's text track readiness state changes to either loaded or failed to load, the user agent must remove it from any list of pending text tracks that it is in.
When a media element is created by an HTML parser or XML parser, the user agent must set the element's blocked-on-parser flag to true. When a media element is popped off the stack of open elements of an HTML parser or XML parser, the user agent must honor user preferences for automatic text track selection, populate the list of pending text tracks, and set the element's blocked-on-parser flag to false.
The text tracks of a media element are ready when both the element's list of pending text tracks is empty and the element's blocked-on-parser flag is false.
Each media element has a pending text track change notification flag, which must initially be unset.
Whenever a text track that is in a media element's list of text tracks has its text track mode change value, the user agent must run the following steps for the media element:
If the media element's pending text track change notification flag is set, return.
Set the media element's pending text track change notification flag.
Queue a media element task given the media element to run these steps:
Unset the media element's pending text track change notification flag.
Fire an event named change
at the media element's textTracks
attribute's TextTrackList
object.
If the media element's show poster flag is not set, run the time marches on steps.
The task source for the tasks listed in this section is the DOM manipulation task source.
A text track cue is the unit of time-sensitive data in a text track, corresponding for instance for subtitles and captions to the text that appears at a particular time and disappears at another time.
Each text track cue consists of:
An arbitrary string.
The time, in seconds and fractions of a second, that describes the beginning of the range of the media data to which the cue applies.
The time, in seconds and fractions of a second, that describes the end of the range of the media data to which the cue applies, or positive Infinity for an unbounded text track cue.
A boolean indicating whether playback of the media resource is to pause when the end of the range to which the cue applies is reached.
Additional fields, as needed for the format, including the actual data of the cue. For example, WebVTT has a text track cue writing direction and so forth. WEBVTT
An unbounded text track cue is a text track cue with a text track cue end time set to positive Infinity. An active unbounded text track cue cannot become inactive through the usual monotonic increase of the current playback position during normal playback (e.g. a metadata cue for a chapter in a live event with no announced end time.)
The text track cue start time and text track cue end time can be negative. (The current playback position can never be negative, though, so cues entirely before time zero cannot be active.)
Each text track cue has a corresponding TextTrackCue
object (or more
specifically, an object that inherits from TextTrackCue
— for example, WebVTT
cues use the VTTCue
interface). A text track cue's in-memory
representation can be dynamically changed through this TextTrackCue
API.
WEBVTT
A text track cue is associated with rules for updating the text track
rendering, as defined by the specification for the specific kind of text track
cue. These rules are used specifically when the object representing the cue is added to a
TextTrack
object using the addCue()
method.
In addition, each text track cue has two pieces of dynamic information:
This flag must be initially unset. The flag is used to ensure events are fired appropriately when the cue becomes active or inactive, and to make sure the right cues are rendered.
The user agent must synchronously unset this flag whenever the text track cue is
removed from its text track's text track list of cues; whenever the
text track itself is removed from its media element's list of
text tracks or has its text track mode changed to disabled; and whenever the media element's readyState
is changed back to HAVE_NOTHING
. When the flag is unset in this way for one
or more cues in text tracks that were showing prior to the relevant incident, the user agent must, after having unset
the flag for all the affected cues, apply the rules for updating the text track
rendering of those text tracks. For example, for text tracks based on WebVTT, the rules for updating the display
of WebVTT text tracks. WEBVTT
This is used as part of the rendering model, to keep cues in a consistent position. It must initially be empty. Whenever the text track cue active flag is unset, the user agent must empty the text track cue display state.
The text track cues of a media element's text tracks are ordered relative to each other in the text track cue order, which is determined as follows: first group the cues by their text track, with the groups being sorted in the same order as their text tracks appear in the media element's list of text tracks; then, within each group, cues must be sorted by their start time, earliest first; then, any cues with the same start time must be sorted by their end time, latest first; and finally, any cues with identical end times must be sorted in the order they were last added to their respective text track list of cues, oldest first (so e.g. for cues from a WebVTT file, that would initially be the order in which the cues were listed in the file). WEBVTT
A media-resource-specific text track is a text track that corresponds to data found in the media resource.
Rules for processing and rendering such data are defined by the relevant specifications, e.g. the specification of the video format if the media resource is a video. Details for some legacy formats can be found in Sourcing In-band Media Resource Tracks from Media Containers into HTML. INBAND
When a media resource contains data that the user agent recognizes and supports as being equivalent to a text track, the user agent runs the steps to expose a media-resource-specific text track with the relevant data, as follows.
Associate the relevant data with a new text track and its corresponding new
TextTrack
object. The text track is a media-resource-specific
text track.
Set the new text track's kind, label, and language based on the semantics of the relevant data, as defined by the relevant specification. If there is no label in that data, then the label must be set to the empty string.
Associate the text track list of cues with the rules for updating the text track rendering appropriate for the format in question.
If the new text track's kind is chapters
or metadata
, then set the text track in-band
metadata track dispatch type as follows, based on the type of the media
resource:
CodecID
element. WEBMCGstsd
box of the
first stbl
box of the
first minf
box of the
first mdia
box of the
text track's trak
box in the
first moov
box
of the file be the stsd box, if any.
If the file has no stsd box, or if the stsd box has neither a mett
box nor a metx
box, then the text track
in-band metadata track dispatch type must be set to the empty string.
Otherwise, if the stsd box has a mett
box then the text
track in-band metadata track dispatch type must be set to the concatenation of the
string "mett
", a U+0020 SPACE character, and the value of the first mime_format
field of the first mett
box of the stsd
box, or the empty string if that field is absent in that box.
Otherwise, if the stsd box has no mett
box but has a metx
box then the text track in-band metadata track dispatch type
must be set to the concatenation of the string "metx
", a U+0020 SPACE
character, and the value of the first namespace
field of the first metx
box of the stsd box, or the empty string if that field is absent in
that box.
MPEG4
Populate the new text track's list of cues with the cues parsed so far, following the guidelines for exposing cues, and begin updating it dynamically as necessary.
Set the new text track's readiness state to loaded.
Set the new text track's mode to the mode consistent with the user's preferences and the requirements of the relevant specification for the data.
For instance, if there are no other active subtitles, and this is a forced subtitle track (a subtitle track giving subtitles in the audio track's primary language, but only for audio that is actually in another language), then those subtitles might be activated here.
Add the new text track to the media element's list of text tracks.
Fire an event named addtrack
at the media element's textTracks
attribute's TextTrackList
object,
using TrackEvent
, with the track
attribute initialized to the text track's TextTrack
object.
When a track
element is created, it must be associated with a new text
track (with its value set as defined below) and its corresponding new
TextTrack
object.
The text track kind is determined from the state of the element's kind
attribute according to the following table; for a state given
in a cell of the first column, the kind is the string given
in the second column:
State | String |
---|---|
Subtitles | subtitles
|
Captions | captions
|
Descriptions | descriptions
|
Chapters metadata | chapters
|
Metadata | metadata
|
The text track label is the element's track label.
The text track language is the element's track language, if any, or the empty string otherwise.
As the kind
, label
,
and srclang
attributes are set, changed, or removed, the
text track must update accordingly, as per the definitions above.
Changes to the track URL are handled in the algorithm below.
The text track readiness state is initially not loaded, and the text track mode is initially disabled.
The text track list of cues is initially empty. It is dynamically modified when the referenced file is parsed. Associated with the list are the rules for updating the text track rendering appropriate for the format in question; for WebVTT, this is the rules for updating the display of WebVTT text tracks. WEBVTT
When a track
element's parent element changes and the new parent is a media
element, then the user agent must add the track
element's corresponding
text track to the media element's list of text tracks, and
then queue a media element task given the media element to fire an event named addtrack
at the media element's textTracks
attribute's TextTrackList
object,
using TrackEvent
, with the track
attribute
initialized to the text track's TextTrack
object.
When a track
element's parent element changes and the old parent was a media
element, then the user agent must remove the track
element's corresponding
text track from the media element's list of text tracks,
and then queue a media element task given the media element to fire an event named removetrack
at the media element's textTracks
attribute's TextTrackList
object,
using TrackEvent
, with the track
attribute
initialized to the text track's TextTrack
object.
When a text track corresponding to a track
element is added to a
media element's list of text tracks, the user agent must queue a
media element task given the media element to run the following steps for the
media element:
If the element's blocked-on-parser flag is true, then return.
If the element's did-perform-automatic-track-selection flag is true, then return.
Honor user preferences for automatic text track selection for this element.
When the user agent is required to honor user preferences for automatic text track selection for a media element, the user agent must run the following steps:
Perform automatic text track selection for subtitles
and captions
.
Perform automatic text track selection for descriptions
.
If there are any text tracks in the media
element's list of text tracks whose text track kind is chapters
or metadata
that correspond to track
elements with a default
attribute set whose text
track mode is set to disabled, then set the
text track mode of all such tracks to hidden.
Set the element's did-perform-automatic-track-selection flag to true.
When the steps above say to perform automatic text track selection for one or more text track kinds, it means to run the following steps:
Let candidates be a list consisting of the text tracks in the media element's list of text tracks whose text track kind is one of the kinds that were passed to the algorithm, if any, in the order given in the list of text tracks.
If candidates is empty, then return.
If any of the text tracks in candidates have a text track mode set to showing, return.
If the user has expressed an interest in having a track from candidates enabled based on its text track kind, text track language, and text track label, then set its text track mode to showing.
For example, the user could have set a browser preference to the effect of "I want French captions whenever possible", or "If there is a subtitle track with 'Commentary' in the title, enable it", or "If there are audio description tracks available, enable one, ideally in Swiss German, but failing that in Standard Swiss German or Standard German".
Otherwise, if there are any text tracks in candidates that correspond to track
elements with a default
attribute set whose text track mode is
set to disabled, then set the text track
mode of the first such track to showing.
When a text track corresponding to a track
element experiences any of
the following circumstances, the user agent must start the track
processing
model for that text track and its track
element:
track
element is created.track
element's parent element changes and the new parent is a media
element.When a user agent is to start the track
processing model for a
text track and its track
element, it must run the following algorithm.
This algorithm interacts closely with the event loop mechanism; in particular, it has
a synchronous section (which is triggered as part of the event loop
algorithm). The steps in that section are marked with ⌛.
If another occurrence of this algorithm is already running for this text
track and its track
element, return, letting that other algorithm
take care of this element.
If the text track's text track mode is not set to one of hidden or showing, then return.
If the text track's track
element does not have a media
element as a parent, return.
Run the remainder of these steps in parallel, allowing whatever caused these steps to run to continue.
Top: Await a stable state. The synchronous section consists of the following steps. (The steps in the synchronous section are marked with ⌛.)
⌛ Set the text track readiness state to loading.
⌛ Let URL be the track URL of the
track
element.
⌛ If the track
element's parent is a media element then
let corsAttributeState be the state of the parent media element's crossorigin
content attribute. Otherwise, let
corsAttributeState be No CORS.
End the synchronous section, continuing the remaining steps in parallel.
If URL is not the empty string, then:
Let request be the result of creating a potential-CORS request given
URL, "track
", and corsAttributeState, and with the
same-origin fallback flag set.
Set request's client to the
track
element's node document's relevant settings
object.
Set request's initiator
type to "track
".
Fetch request.
The tasks queued by the fetching algorithm on the networking task source to process the data as it is being fetched must determine the type of the resource. If the type of the resource is not a supported text track format, the load will fail, as described below. Otherwise, the resource's data must be passed to the appropriate parser (e.g., the WebVTT parser) as it is received, with the text track list of cues being used for that parser's output. WEBVTT
The appropriate parser will incrementally update the text track list of cues during these networking task source tasks, as each such task is run with whatever data has been received from the network).
This specification does not currently say whether or how to check the MIME types of text tracks, or whether or how to perform file type sniffing using the actual file data. Implementers differ in their intentions on this matter and it is therefore unclear what the right solution is. In the absence of any requirement here, the HTTP specifications' strict requirement to follow the Content-Type header prevails ("Content-Type specifies the media type of the underlying data." ... "If and only if the media type is not given by a Content-Type field, the recipient MAY attempt to guess the media type via inspection of its content and/or the name extension(s) of the URI used to identify the resource.").
If fetching fails for any reason (network error, the server returns an error code, CORS
fails, etc.), or if URL is the empty string, then queue an element task
on the DOM manipulation task source given the media element to first
change the text track readiness state to failed to load and then fire an event
named error
at the track
element.
If fetching does not fail, but the type of the resource is not a supported
text track format, or the file was not successfully processed (e.g., the format in question is
an XML format and the file contained a well-formedness error that XML requires be
detected and reported to the application), then the task that
is queued on the networking task source
in which the aforementioned problem is found must change the text track readiness
state to failed to load and fire an event named error
at the track
element.
If fetching does not fail, and the file was successfully processed, then the final task that is queued by
the networking task source, after it has finished parsing the data, must change the
text track readiness state to loaded, and
fire an event named load
at the track
element.
If, while fetching is ongoing, either:
...then the user agent must abort fetching, discarding
any pending tasks generated by that algorithm (and in
particular, not adding any cues to the text track list of cues after the moment the
URL changed), and then queue an element task on the DOM manipulation task
source given the track
element that first changes the text track
readiness state to failed to load and
then fires an event named error
at the track
element.
Wait until the text track readiness state is no longer set to loading.
Wait until the track URL is no longer equal to URL, at the same time as the text track mode is set to hidden or showing.
Jump to the step labeled top.
Whenever a track
element has its src
attribute
set, changed, or removed, the user agent must immediately empty the element's text
track's text track list of cues. (This also causes the algorithm above to stop
adding cues from the resource being obtained using the previously given URL, if any.)
How a specific format's text track cues are to be interpreted for the purposes of processing by an HTML user agent is defined by that format. In the absence of such a specification, this section provides some constraints within which implementations can attempt to consistently expose such formats.
To support the text track model of HTML, each unit of timed data is converted to a text track cue. Where the mapping of the format's features to the aspects of a text track cue as defined in this specification are not defined, implementations must ensure that the mapping is consistent with the definitions of the aspects of a text track cue as defined above, as well as with the following constraints:
Should be set to the empty string if the format has no obvious analogue to a per-cue identifier.
Should be set to false.
[Exposed=Window]
interface TextTrackList : EventTarget {
readonly attribute unsigned long length;
getter TextTrack (unsigned long index);
TextTrack? getTrackById(DOMString id);
attribute EventHandler onchange;
attribute EventHandler onaddtrack;
attribute EventHandler onremovetrack;
};
media.textTracks.length
Returns the number of text tracks associated with the
media element (e.g. from track
elements). This is the number of text tracks in the media element's list of text
tracks.
media.textTracks[ n ]
Returns the TextTrack
object representing the nth text
track in the media element's list of text tracks.
textTrack = media.textTracks.getTrackById(id)
Returns the TextTrack
object with the given identifier, or null if no track has
that identifier.
A TextTrackList
object represents a dynamically updating list of text tracks in a given order.
The textTracks
attribute of media elements must return a TextTrackList
object representing the
TextTrack
objects of the text tracks in the
media element's list of text tracks, in the same order as in the
list of text tracks.
The length
attribute of a TextTrackList
object must return the number of text tracks in the list
represented by the TextTrackList
object.
The supported property indices of a TextTrackList
object at any
instant are the numbers from zero to the number of text tracks in
the list represented by the TextTrackList
object minus one, if any. If there are no
text tracks in the list, there are no supported property
indices.
To determine the value of an indexed property of a
TextTrackList
object for a given index index, the user agent must return
the indexth text track in the list represented by the
TextTrackList
object.
The getTrackById(id)
method must
return the first TextTrack
in the TextTrackList
object whose id
IDL attribute would return a value equal to the value of the
id argument. When no tracks match the given argument, the method must return null.
enum TextTrackMode { "disabled", "hidden", "showing" };
enum TextTrackKind { "subtitles", "captions", "descriptions", "chapters", "metadata" };
[Exposed=Window]
interface TextTrack : EventTarget {
readonly attribute TextTrackKind kind;
readonly attribute DOMString label;
readonly attribute DOMString language;
readonly attribute DOMString id;
readonly attribute DOMString inBandMetadataTrackDispatchType;
attribute TextTrackMode mode;
readonly attribute TextTrackCueList? cues;
readonly attribute TextTrackCueList? activeCues;
undefined addCue(TextTrackCue cue);
undefined removeCue(TextTrackCue cue);
attribute EventHandler oncuechange;
};
textTrack = media.addTextTrack(kind [, label [, language ] ])
Creates and returns a new TextTrack
object, which is also added to the
media element's list of text tracks.
textTrack.kind
Returns the text track kind string.
textTrack.label
Returns the text track label, if there is one, or the empty string otherwise (indicating that a custom label probably needs to be generated from the other attributes of the object if the object is exposed to the user).
textTrack.language
Returns the text track language string.
textTrack.id
Returns the ID of the given track.
For in-band tracks, this is the ID that can be used with a fragment if the format supports media fragment
syntax, and that can be used with the getTrackById()
method.
For TextTrack
objects corresponding to track
elements, this is the
ID of the track
element.
textTrack.inBandMetadataTrackDispatchType
Returns the text track in-band metadata track dispatch type string.
textTrack.mode [ = value ]
Returns the text track mode, represented by a string from the following list:
disabled
"The text track disabled mode.
hidden
"The text track hidden mode.
showing
"The text track showing mode.
Can be set, to change the mode.
textTrack.cues
Returns the text track list of cues, as a TextTrackCueList
object.
textTrack.activeCues
Returns the text track cues from the text track
list of cues that are currently active (i.e. that start before the current playback
position and end after it), as a TextTrackCueList
object.
textTrack.addCue(cue)
Adds the given cue to textTrack's text track list of cues.
textTrack.removeCue(cue)
Removes the given cue from textTrack's text track list of cues.
The addTextTrack(kind, label,
language)
method of media elements,
when invoked, must run the following steps:
Create a new TextTrack
object.
Create a new text track corresponding to the new object, and set its text track kind to kind, its text track label to label, its text track language to language, its text track readiness state to the text track loaded state, its text track mode to the text track hidden mode, and its text track list of cues to an empty list.
Initially, the text track list of cues is not associated with any rules for updating the text track rendering. When a text track cue is added to it, the text track list of cues has its rules permanently set accordingly.
Add the new text track to the media element's list of text tracks.
Queue a media element task given the media element to fire an event named addtrack
at the media element's textTracks
attribute's TextTrackList
object,
using TrackEvent
, with the track
attribute initialized to the new text track's TextTrack
object.
Return the new TextTrack
object.
The kind
attribute must return the text track kind of the text track that the
TextTrack
object represents.
The label
attribute must return the text track label of the text track that the
TextTrack
object represents.
The language
attribute must return the text track language of the text track that the
TextTrack
object represents.
The id
attribute
returns the track's identifier, if it has one, or the empty string otherwise. For tracks that
correspond to track
elements, the track's identifier is the value of the element's
id
attribute, if any. For in-band tracks, the track's identifier is
specified by the media resource. If the media resource is in a format
that supports media fragment syntax, the identifier returned for a particular track
must be the same identifier that would enable the track if used as the name of a track in the
track dimension of such a fragment.
The inBandMetadataTrackDispatchType
attribute must return the text track in-band metadata track dispatch type of the
text track that the TextTrack
object represents.
The mode
attribute, on getting, must return the string corresponding to the text track mode of
the text track that the TextTrack
object represents, as defined by the
following list:
disabled
"hidden
"showing
"On setting, if the new value isn't equal to what the attribute would currently return, the new value must be processed as follows:
disabled
"Set the text track mode of the text track that the
TextTrack
object represents to the text track disabled mode.
hidden
"Set the text track mode of the text track that the
TextTrack
object represents to the text track hidden mode.
showing
"Set the text track mode of the text track that the
TextTrack
object represents to the text track showing mode.
If the text track mode of the text track that the
TextTrack
object represents is not the text track disabled mode, then
the cues
attribute
must return a live TextTrackCueList
object that represents the subset of
the text track list of cues of the text track that the
TextTrack
object represents whose end
times occur at or after the earliest possible position when the script
started, in text track cue order. Otherwise, it must return null. For each
TextTrack
object, when an object is returned, the same TextTrackCueList
object must be returned each time.
The earliest possible position when the script started is whatever the earliest possible position was the last time the event loop reached step 1.
If the text track mode of the text track that the
TextTrack
object represents is not the text track disabled mode, then
the activeCues
attribute must return a live TextTrackCueList
object that represents the
subset of the text track list of cues of the text track that the
TextTrack
object represents whose active flag was set when the script
started, in text track cue order. Otherwise, it must return null. For each
TextTrack
object, when an object is returned, the same TextTrackCueList
object must be returned each time.
A text track cue's active flag was set when the script started if its text track cue active flag was set the last time the event loop reached step 1.
The addCue(cue)
method of TextTrack
objects, when invoked, must run the following steps:
If the text track list of cues does not yet have any associated rules for updating the text track rendering, then associate the text track list of cues with the rules for updating the text track rendering appropriate to cue.
If text track list of cues' associated rules for updating the text
track rendering are not the same rules for updating the text track rendering
as appropriate for cue, then throw an "InvalidStateError
"
DOMException
.
If the given cue is in a text track list of cues, then remove cue from that text track list of cues.
Add cue to the TextTrack
object's text track's
text track list of cues.
The removeCue(cue)
method of
TextTrack
objects, when invoked, must run the following steps:
If the given cue is not in the TextTrack
object's text
track's text track list of cues, then throw a
"NotFoundError
" DOMException
.
Remove cue from the TextTrack
object's text track's
text track list of cues.
In this example, an audio
element is used to play a specific sound-effect from a
sound file containing many sound effects. A cue is used to pause the audio, so that it ends
exactly at the end of the clip, even if the browser is busy running some script. If the page had
relied on script to pause the audio, then the start of the next clip might be heard if the
browser was not able to run the script at the exact time specified.
var sfx = new Audio('sfx.wav');
var sounds = sfx.addTextTrack('metadata');
// add sounds we care about
function addFX(start, end, name) {
var cue = new VTTCue(start, end, '');
cue.id = name;
cue.pauseOnExit = true;
sounds.addCue(cue);
}
addFX(12.783, 13.612, 'dog bark');
addFX(13.612, 15.091, 'kitten mew');
function playSound(id) {
sfx.currentTime = sounds.getCueById(id).startTime;
sfx.play();
}
// play a bark as soon as we can
sfx.oncanplaythrough = function () {
playSound('dog bark');
}
// meow when the user tries to leave,
// and have the browser ask them to stay
window.onbeforeunload = function (e) {
playSound('kitten mew');
e.preventDefault();
}
[Exposed=Window]
interface TextTrackCueList {
readonly attribute unsigned long length;
getter TextTrackCue (unsigned long index);
TextTrackCue? getCueById(DOMString id);
};
cuelist.length
Returns the number of cues in the list.
cuelist[index]
Returns the text track cue with index index in the list. The cues are sorted in text track cue order.
cuelist.getCueById(id)
Returns the first text track cue (in text track cue order) with text track cue identifier id.
Returns null if none of the cues have the given identifier or if the argument is the empty string.
A TextTrackCueList
object represents a dynamically updating list of text track cues in a given order.
The length
attribute must return the number of cues in the list represented by the TextTrackCueList
object.
The supported property indices of a TextTrackCueList
object at any
instant are the numbers from zero to the number of cues in the
list represented by the TextTrackCueList
object minus one, if any. If there are no
cues in the list, there are no supported property
indices.
To determine the value of an indexed property for a
given index index, the user agent must return the indexth text track
cue in the list represented by the TextTrackCueList
object.
The getCueById(id)
method, when
called with an argument other than the empty string, must return the first text track
cue in the list represented by the TextTrackCueList
object whose text
track cue identifier is id, if any, or null otherwise. If the argument is the
empty string, then the method must return null.
[Exposed=Window]
interface TextTrackCue : EventTarget {
readonly attribute TextTrack? track;
attribute DOMString id;
attribute double startTime;
attribute unrestricted double endTime;
attribute boolean pauseOnExit;
attribute EventHandler onenter;
attribute EventHandler onexit;
};
cue.track
Returns the TextTrack
object to which this text track cue belongs,
if any, or null otherwise.
cue.id [ = value ]
Returns the text track cue identifier.
Can be set.
cue.startTime [ = value ]
Returns the text track cue start time, in seconds.
Can be set.
cue.endTime [ = value ]
Returns the text track cue end time, in seconds.
Returns positive Infinity for an unbounded text track cue.
Can be set.
cue.pauseOnExit [ = value ]
Returns true if the text track cue pause-on-exit flag is set, false otherwise.
Can be set.
The track
attribute, on getting, must return the TextTrack
object of the text
track in whose list of cues the text
track cue that the TextTrackCue
object represents finds itself, if any; or
null otherwise.
The id
attribute, on getting, must return the text track cue identifier of the text
track cue that the TextTrackCue
object represents. On setting, the text
track cue identifier must be set to the new value.
The startTime
attribute, on getting, must return the
text track cue start time of the text track cue that the
TextTrackCue
object represents, in seconds. On setting, the text track cue
start time must be set to the new value, interpreted in seconds; then, if the
TextTrackCue
object's text track cue is in a text track's
list of cues, and that text track is in
a media element's list of text tracks, and the media
element's show poster flag is not set, then run the time marches on steps for that media element.
The endTime
attribute, on getting, must return the
text track cue end time of the text track cue that the
TextTrackCue
object represents, in seconds or positive Infinity. On setting, if the
new value is negative Infinity or a Not-a-Number (NaN) value, then throw a TypeError
exception. Otherwise, the text track cue end time must be set to the new value.
Then, if the TextTrackCue
object's text track cue is in a text
track's list of cues, and that text
track is in a media element's list of text tracks, and the
media element's show poster flag is not set, then run the time marches on steps for that media element.
The pauseOnExit
attribute, on getting, must return
true if the text track cue pause-on-exit flag of the text track cue that
the TextTrackCue
object represents is set; or false otherwise. On setting, the
text track cue pause-on-exit flag must be set if the new value is true, and must be
unset otherwise.
The following are the event handlers that (and their corresponding event handler event types) that must
be supported, as event handler IDL attributes, by all objects implementing the
TextTrackList
interface:
Event handler | Event handler event type |
---|---|
onchange | change
|
onaddtrack | addtrack
|
onremovetrack | removetrack
|
The following are the event handlers that (and their corresponding event handler event types) that must
be supported, as event handler IDL attributes, by all objects implementing the
TextTrack
interface:
Event handler | Event handler event type |
---|---|
oncuechange | cuechange
|
The following are the event handlers (and their corresponding event handler event types) that must
be supported, as event handler IDL attributes, by all objects implementing the
TextTrackCue
interface:
Event handler | Event handler event type |
---|---|
onenter | enter
|
onexit | exit
|
Text tracks can be used for storing data relating to the media data, for interactive or augmented views.
For example, a page showing a sports broadcast could include information about the current score. Suppose a robotics competition was being streamed live. The image could be overlaid with the scores, as follows:
In order to make the score display render correctly whenever the user seeks to an arbitrary point in the video, the metadata text track cues need to be as long as is appropriate for the score. For example, in the frame above, there would be maybe one cue that lasts the length of the match that gives the match number, one cue that lasts until the blue alliance's score changes, and one cue that lasts until the red alliance's score changes. If the video is just a stream of the live event, the time in the bottom right would presumably be automatically derived from the current video time, rather than based on a cue. However, if the video was just the highlights, then that might be given in cues also.
The following shows what fragments of this could look like in a WebVTT file:
WEBVTT ... 05:10:00.000 --> 05:12:15.000 matchtype:qual matchnumber:37 ... 05:11:02.251 --> 05:11:17.198 red:78 05:11:03.672 --> 05:11:54.198 blue:66 05:11:17.198 --> 05:11:25.912 red:80 05:11:25.912 --> 05:11:26.522 red:83 05:11:26.522 --> 05:11:26.982 red:86 05:11:26.982 --> 05:11:27.499 red:89 ...
The key here is to notice that the information is given in cues that span the length of time to which the relevant event applies. If, instead, the scores were given as zero-length (or very brief, nearly zero-length) cues when the score changes, for example saying "red+2" at 05:11:17.198, "red+3" at 05:11:25.912, etc, problems arise: primarily, seeking is much harder to implement, as the script has to walk the entire list of cues to make sure that no notifications have been missed; but also, if the cues are short it's possible the script will never see that they are active unless it listens to them specifically.
When using cues in this manner, authors are encouraged to use the cuechange
event to update the current annotations. (In
particular, using the timeupdate
event would be less
appropriate as it would require doing work even when the cues haven't changed, and, more
importantly, would introduce a higher latency between when the metadata cues become active and
when the display is updated, since timeupdate
events
are rate-limited.)
Other specifications or formats that need a URL to identify the return values of
the AudioTrack
kind
or
VideoTrack
kind
IDL attributes, or identify
the kind of text track, must use the
about:html-kind
URL.
The controls
attribute is a boolean attribute.
If present, it indicates that the author has not provided a scripted controller and would like the
user agent to provide its own set of controls.
If the attribute is present, or if scripting is disabled for the media element, then the user agent should expose a user interface to the user. This user interface should include features to begin playback, pause playback, seek to an arbitrary position in the content (if the content supports arbitrary seeking), change the volume, change the display of closed captions or embedded sign-language tracks, select different audio tracks or turn on audio descriptions, and show the media content in manners more suitable to the user (e.g. fullscreen video or in an independent resizable window). Other controls may also be made available.
Even when the attribute is absent, however, user agents may provide controls to affect playback
of the media resource (e.g. play, pause, seeking, track selection, and volume controls), but such
features should not interfere with the page's normal rendering. For example, such features could
be exposed in the media element's context menu, platform media keys, or a remote
control. The user agent may implement this simply by exposing a user interface to the user as described above (as if the controls
attribute was present).
If the user agent exposes a user interface to
the user by displaying controls over the media element, then the user agent
should suppress any user interaction events while the user agent is interacting with this
interface. (For example, if the user clicks on a video's playback control, mousedown
events and so forth would not simultaneously be fired at
elements on the page.)
Where possible (specifically, for starting, stopping, pausing, and unpausing playback, for seeking, for changing the rate of playback, for fast-forwarding or rewinding, for listing, enabling, and disabling text tracks, and for muting or changing the volume of the audio), user interface features exposed by the user agent must be implemented in terms of the DOM API described above, so that, e.g., all the same events fire.
Features such as fast-forward or rewind must be implemented by only changing the playbackRate
attribute (and not the defaultPlaybackRate
attribute).
Seeking must be implemented in terms of seeking to the requested position in the media element's media timeline. For media resources where seeking to an arbitrary position would be slow, user agents are encouraged to use the approximate-for-speed flag when seeking in response to the user manipulating an approximate position interface such as a seek bar.
The controls
IDL attribute must reflect the
content attribute of the same name.
media.volume [ = value ]
Returns the current playback volume, as a number in the range 0.0 to 1.0, where 0.0 is the quietest and 1.0 the loudest.
Can be set, to change the volume.
Throws an "IndexSizeError
" DOMException
if the new
value is not in the range 0.0 .. 1.0.
media.muted [ = value ]
Returns true if audio is muted, overriding the volume
attribute, and false if the volume
attribute is being
honored.
Can be set, to change whether the audio is muted or not.
A media element has a playback volume, which is a fraction in the range 0.0 (silent) to 1.0 (loudest). Initially, the volume should be 1.0, but user agents may remember the last set value across sessions, on a per-site basis or otherwise, so the volume may start at other values.
The volume
IDL attribute must return the playback volume of any
audio portions of the media element. On setting, if the new value is in the range 0.0
to 1.0 inclusive, the media element's playback
volume must be set to the new value. If the new value is outside the range 0.0 to 1.0
inclusive, then, on setting, an "IndexSizeError
"
DOMException
must be thrown instead.
A media element can also be muted. If anything is muting the element, then it is muted. (For example, when the direction of playback is backwards, the element is muted.)
The muted
IDL
attribute must return the value to which it was last set. When a media element is
created, if the element has a muted
content attribute
specified, then the muted
IDL attribute should be set to
true; otherwise, the user agents may set the value to the user's preferred value (e.g. remembering
the last set value across sessions, on a per-site basis or otherwise). While the muted
IDL attribute is set to true, the media element
must be muted.
Whenever either of the values that would be returned by the volume
and muted
IDL
attributes change, the user agent must queue a media element task given the
media element to fire an event named volumechange
at the media element. Then, if
the media element is not allowed to play, the user agent must run the
internal pause steps for the media element.
A user agent has an associated volume locked (a boolean). Its value is implementation-defined and determines whether the playback volume takes effect.
An element's effective media volume is determined as follows:
If the user has indicated that the user agent is to override the volume of the element, then return the volume desired by the user.
If the user agent's volume locked is true, then return the system volume.
If the element's audio output is muted, then return zero.
Let volume be the playback volume of the audio portions of the media element, in range 0.0 (silent) to 1.0 (loudest).
Return volume, interpreted relative to the range 0.0 to 1.0, with 0.0 being silent, and 1.0 being the loudest setting, values in between increasing in loudness. The range need not be linear. The loudest setting may be lower than the system's loudest possible setting; for example the user could have set a maximum volume.
The muted
content attribute on media elements is a boolean
attribute that controls the default state of the audio output of the media
resource, potentially overriding user preferences.
The defaultMuted
IDL attribute must reflect
the muted
content attribute.
This attribute has no dynamic effect (it only controls the default state of the element).
This video (an advertisement) autoplays, but to avoid annoying users, it does so without sound, and allows the user to turn the sound on. The user agent can pause the video if it's unmuted without a user interaction.
<video src="adverts.cgi?kind=video" controls autoplay loop muted></video>
Objects implementing the TimeRanges
interface
represent a list of ranges (periods) of time.
[Exposed=Window]
interface TimeRanges {
readonly attribute unsigned long length;
double start(unsigned long index);
double end(unsigned long index);
};
media.length
Returns the number of ranges in the object.
time = media.start(index)
Returns the time for the start of the range with the given index.
Throws an "IndexSizeError
" DOMException
if the index
is out of range.
time = media.end(index)
Returns the time for the end of the range with the given index.
Throws an "IndexSizeError
" DOMException
if the index
is out of range.
The length
IDL attribute must return the number of ranges represented by the object.
The start(index)
method must return the position
of the start of the indexth range represented by the object, in seconds measured from
the start of the timeline that the object covers.
The end(index)
method must return the position of
the end of the indexth range represented by the object, in seconds measured from the
start of the timeline that the object covers.
These methods must throw "IndexSizeError
" DOMException
s
if called with an index argument greater than or equal to the number of ranges
represented by the object.
When a TimeRanges
object is said to be a normalized TimeRanges
object,
the ranges it represents must obey the following criteria:
In other words, the ranges in such an object are ordered, don't overlap, and don't touch (adjacent ranges are folded into one bigger range). A range can be empty (referencing just a single moment in time), e.g. to indicate that only one frame is currently buffered in the case that the user agent has discarded the entire media resource except for the current frame, when a media element is paused.
Ranges in a TimeRanges
object must be inclusive.
Thus, the end of a range would be equal to the start of a following adjacent (touching but not overlapping) range. Similarly, a range covering a whole timeline anchored at zero would have a start equal to zero and an end equal to the duration of the timeline.
The timelines used by the objects returned by the buffered
, seekable
and
played
IDL attributes of media
elements must be that element's media timeline.
TrackEvent
interface[Exposed=Window]
interface TrackEvent : Event {
constructor(DOMString type, optional TrackEventInit eventInitDict = {});
readonly attribute (VideoTrack or AudioTrack or TextTrack)? track;
};
dictionary TrackEventInit : EventInit {
(VideoTrack or AudioTrack or TextTrack)? track = null;
};
event.track
Returns the track object (TextTrack
, AudioTrack
, or
VideoTrack
) to which the event relates.
The track
attribute must return the value it was initialized to. It represents the context information for
the event.
The following events fire on media elements as part of the processing model described above:
Event name | Interface | Fired when... | Preconditions |
---|---|---|---|
loadstart
| Event
| The user agent begins looking for media data, as part of the resource selection algorithm. | networkState equals NETWORK_LOADING
|
progress
| Event
| The user agent is fetching media data. | networkState equals NETWORK_LOADING
|
suspend
| Event
| The user agent is intentionally not currently fetching media data. | networkState equals NETWORK_IDLE
|
abort
| Event
| The user agent stops fetching the media data before it is completely downloaded, but not due to an error. | error is an object with the code MEDIA_ERR_ABORTED . networkState equals either NETWORK_EMPTY or NETWORK_IDLE , depending on when the download was aborted.
|
error
| Event
| An error occurs while fetching the media data or the type of the resource is not a supported media format. | error is an object with the code MEDIA_ERR_NETWORK or higher. networkState equals either NETWORK_EMPTY or NETWORK_IDLE , depending on when the download was aborted.
|
emptied
| Event
| A media element whose networkState
was previously not in the NETWORK_EMPTY state has
just switched to that state (either because of a fatal error during load that's about to be
reported, or because the load() method was invoked while
the resource selection algorithm was already
running).
| networkState is NETWORK_EMPTY ; all the IDL attributes are in their
initial states.
|
stalled
| Event
| The user agent is trying to fetch media data, but data is unexpectedly not forthcoming. | networkState is NETWORK_LOADING .
|
loadedmetadata
| Event
| The user agent has just determined the duration and dimensions of the media resource and the text tracks are ready. | readyState is newly equal to HAVE_METADATA or greater for the first time.
|
loadeddata
| Event
| The user agent can render the media data at the current playback position for the first time. | readyState newly increased to HAVE_CURRENT_DATA or greater for the first time.
|
canplay
| Event
| The user agent can resume playback of the media data, but estimates that if playback were to be started now, the media resource could not be rendered at the current playback rate up to its end without having to stop for further buffering of content. | readyState newly increased to HAVE_FUTURE_DATA or greater.
|
canplaythrough
| Event
| The user agent estimates that if playback were to be started now, the media resource could be rendered at the current playback rate all the way to its end without having to stop for further buffering. | readyState is newly equal to HAVE_ENOUGH_DATA .
|
playing
| Event
| Playback is ready to start after having been paused or delayed due to lack of media data. | readyState is newly greater than or equal to
HAVE_FUTURE_DATA and paused is false, or paused is newly false and readyState is greater than or equal to HAVE_FUTURE_DATA . Even if this event fires, the
element might still not be potentially playing, e.g. if the element is
paused for user interaction or paused for in-band content.
|
waiting
| Event
| Playback has stopped because the next frame is not available, but the user agent expects that frame to become available in due course. | readyState is less than or equal to HAVE_CURRENT_DATA , and paused is false. Either seeking is true, or the current playback position
is not contained in any of the ranges in buffered . It
is possible for playback to stop for other reasons without paused being false, but those reasons do not fire this event
(and when those situations resolve, a separate playing
event is not fired either): e.g., playback has ended, or
playback stopped due to errors, or the element has paused for user
interaction or paused for in-band content.
|
seeking
| Event
| The seeking IDL attribute changed to true, and the user agent has started seeking to a new position.
| |
seeked
| Event
| The seeking IDL attribute changed to false after the current playback position was changed.
| |
ended
| Event
| Playback has stopped because the end of the media resource was reached. | currentTime equals the end of the media
resource; ended is true.
|
durationchange
| Event
| The duration attribute has just been updated.
| |
timeupdate
| Event
| The current playback position changed as part of normal playback or in an especially interesting way, for example discontinuously. | |
play
| Event
| The element is no longer paused. Fired after the play()
method has returned, or when the autoplay attribute
has caused playback to begin.
| paused is newly false.
|
pause
| Event
| The element has been paused. Fired after the pause()
method has returned.
| paused is newly true.
|
ratechange
| Event
| Either the defaultPlaybackRate or the
playbackRate attribute has just been updated.
| |
resize
| Event
| One or both of the videoWidth and videoHeight attributes have just been updated.
| Media element is a video element; readyState is not HAVE_NOTHING
|
volumechange
| Event
| Either the volume attribute or the muted attribute has changed. Fired after the relevant
attribute's setter has returned.
|
The following event fires on source
elements:
Event name | Interface | Fired when... |
---|---|---|
error
| Event
| An error occurs while fetching the media data or the type of the resource is not a supported media format. |
The following events fire on AudioTrackList
, VideoTrackList
, and
TextTrackList
objects:
Event name | Interface | Fired when... |
---|---|---|
change
| Event
| One or more tracks in the track list have been enabled or disabled. |
addtrack
| TrackEvent
| A track has been added to the track list. |
removetrack
| TrackEvent
| A track has been removed from the track list. |
The following event fires on TextTrack
objects and track
elements:
Event name | Interface | Fired when... |
---|---|---|
cuechange
| Event
| One or more cues in the track have become active or stopped being active. |
The following events fire on track
elements:
Event name | Interface | Fired when... |
---|---|---|
error
| Event
| An error occurs while fetching the track data or the type of the resource is not supported text track format. |
load
| Event
| A track data has been fetched and successfully processed. |
The following events fire on TextTrackCue
objects:
Event name | Interface | Fired when... |
---|---|---|
enter
| Event
| The cue has become active. |
exit
| Event
| The cue has stopped being active. |
The main security and privacy implications of the video
and audio
elements come from the ability to embed media cross-origin. There are two directions that threats
can flow: from hostile content to a victim page, and from a hostile page to victim content.
If a victim page embeds hostile content, the threat is that the content might contain scripted
code that attempts to interact with the Document
that embeds the content. To avoid
this, user agents must ensure that there is no access from the content to the embedding page. In
the case of media content that uses DOM concepts, the embedded content must be treated as if it
was in its own unrelated top-level traversable.
For instance, if an SVG animation was embedded in a video
element,
the user agent would not give it access to the DOM of the outer page. From the perspective of
scripts in the SVG resource, the SVG file would appear to be in a lone top-level traversable
with no parent.
If a hostile page embeds victim content, the threat is that the embedding page could obtain
information from the content that it would not otherwise have access to. The API does expose some
information: the existence of the media, its type, its duration, its size, and the performance
characteristics of its host. Such information is already potentially problematic, but in practice
the same information can more or less be obtained using the img
element, and so it
has been deemed acceptable.
However, significantly more sensitive information could be obtained if the user agent further
exposes metadata within the content, such as subtitles. That information is therefore only exposed
if the video resource uses CORS. The crossorigin
attribute allows authors to enable CORS. FETCH
Without this restriction, an attacker could trick a user running within a corporate network into visiting a site that attempts to load a video from a previously leaked location on the corporation's intranet. If such a video included confidential plans for a new product, then being able to read the subtitles would present a serious confidentiality breach.
Playing audio and video resources on small devices such as set-top boxes or mobile phones is
often constrained by limited hardware resources in the device. For example, a device might only
support three simultaneous videos. For this reason, it is a good practice to release resources
held by media elements when they are done playing, either by
being very careful about removing all references to the element and allowing it to be garbage
collected, or, even better, by setting the element's src
attribute to an empty string. In cases where srcObject
was set, instead set the srcObject
to null.
Similarly, when the playback rate is not exactly 1.0, hardware, software, or format limitations can cause video frames to be dropped and audio to be choppy or muted.
How accurately various aspects of the media element API are implemented is considered a quality-of-implementation issue.
For example, when implementing the buffered
attribute,
how precise an implementation reports the ranges that have been buffered depends on how carefully
the user agent inspects the data. Since the API reports ranges as times, but the data is obtained
in byte streams, a user agent receiving a variable-bitrate stream might only be able to determine
precise times by actually decoding all of the data. User agents aren't required to do this,
however; they can instead return estimates (e.g. based on the average bitrate seen so far) which
get revised as more information becomes available.
As a general rule, user agents are urged to be conservative rather than optimistic. For example, it would be bad to report that everything had been buffered when it had not.
Another quality-of-implementation issue would be playing a video backwards when the codec is designed only for forward playback (e.g. there aren't many key frames, and they are far apart, and the intervening frames only have deltas from the previous frame). User agents could do a poor job, e.g. only showing key frames; however, better implementations would do more work and thus do a better job, e.g. actually decoding parts of the video forwards, storing the complete frames, and then playing the frames backwards.
Similarly, while implementations are allowed to drop buffered data at any time (there is no requirement that a user agent keep all the media data obtained for the lifetime of the media element), it is again a quality of implementation issue: user agents with sufficient resources to keep all the data around are encouraged to do so, as this allows for a better user experience. For example, if the user is watching a live stream, a user agent could allow the user only to view the live video; however, a better user agent would buffer everything and allow the user to seek through the earlier material, pause it, play it forwards and backwards, etc.
When a media element that is paused is removed from a document and not reinserted before the next time the event loop reaches step 1, implementations that are resource constrained are encouraged to take that opportunity to release all hardware resources (like video planes, networking resources, and data buffers) used by the media element. (User agents still have to keep track of the playback position and so forth, though, in case playback is later restarted.)
map
elementname
[Exposed=Window]
interface HTMLMapElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString name;
[SameObject] readonly attribute HTMLCollection areas;
};
HTMLMapElement
.The map
element, in conjunction with an img
element and any
area
element descendants, defines an image map. The element
represents its children.
The name
attribute gives
the map a name so that it can be referenced. The attribute must be present and must
have a non-empty value with no ASCII whitespace. The value of the name
attribute must not be equal to the value of the name
attribute of another map
element in the same
tree. If the id
attribute is also specified, both
attributes must have the same value.
map.areas
Returns an HTMLCollection
of the area
elements in the
map
.
The areas
attribute must return an HTMLCollection
rooted at the map
element, whose
filter matches only area
elements.
The IDL attribute name
must reflect the content attribute of the
same name.
Image maps can be defined in conjunction with other content on the page, to ease maintenance. This example is of a page with an image map at the top of the page and a corresponding set of text links at the bottom.
<!DOCTYPE HTML>
<HTML LANG="EN">
<TITLE>Babies™: Toys</TITLE>
<HEADER>
<H1>Toys</H1>
<IMG SRC="/images/menu.gif"
ALT="Babies™ navigation menu. Select a department to go to its page."
USEMAP="#NAV">
</HEADER>
...
<FOOTER>
<MAP NAME="NAV">
<P>
<A HREF="/clothes/">Clothes</A>
<AREA ALT="Clothes" COORDS="0,0,100,50" HREF="/clothes/"> |
<A HREF="/toys/">Toys</A>
<AREA ALT="Toys" COORDS="100,0,200,50" HREF="/toys/"> |
<A HREF="/food/">Food</A>
<AREA ALT="Food" COORDS="200,0,300,50" HREF="/food/"> |
<A HREF="/books/">Books</A>
<AREA ALT="Books" COORDS="300,0,400,50" HREF="/books/">
</P>
</MAP>
</FOOTER>
area
elementmap
element ancestor.alt
coords
shape
href
target
download
ping
rel
referrerpolicy
href
attribute: for authors; for implementers.[Exposed=Window]
interface HTMLAreaElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString alt;
[CEReactions] attribute DOMString coords;
[CEReactions] attribute DOMString shape;
[CEReactions] attribute DOMString target;
[CEReactions] attribute DOMString download;
[CEReactions] attribute USVString ping;
[CEReactions] attribute DOMString rel;
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[CEReactions] attribute DOMString referrerPolicy;
// also has obsolete members
};
HTMLAreaElement includes HTMLHyperlinkElementUtils;
HTMLAreaElement
.The area
element represents either a hyperlink with some text and a
corresponding area on an image map, or a dead area on an image map.
An area
element with a parent node must have a map
element
ancestor.
If the area
element has an href
attribute, then the area
element represents a hyperlink. In this case,
the alt
attribute must be
present. It specifies the text of the hyperlink. Its value must be text that, when presented with
the texts specified for the other hyperlinks of the image map, and with the
alternative text of the image, but without the image itself, provides the user with the same kind
of choice as the hyperlink would when used without its text but with its shape applied to the
image. The alt
attribute may be left blank if there is another
area
element in the same image map that points to the same resource and
has a non-blank alt
attribute.
If the area
element has no href
attribute, then the area represented by the element cannot be selected, and the alt
attribute must be omitted.
In both cases, the shape
and coords
attributes specify the area.
The shape
attribute is
an enumerated attribute with the following keywords and states:
Keyword | Conforming | State | Brief description | |
---|---|---|---|---|
circle
| Circle state | Circle state | Designates a circle, using exactly three integers in the coords attribute.
| |
circ
| No | |||
default
| Default state | This area is the whole image. (The coords
attribute is not used.)
| ||
poly
| Polygon state | Polygon state | Designates a polygon, using at-least six integers in the coords attribute.
| |
polygon
| No | |||
rect
| Rectangle state | Rectangle state | Designates a rectangle, using exactly four integers in the coords attribute.
| |
rectangle
| No |
The attribute's missing value default and invalid value default are both the rectangle state.
The coords
attribute
must, if specified, contain a valid list of floating-point numbers. This attribute
gives the coordinates for the shape described by the shape
attribute. The processing for this attribute is described as part of the image
map processing model.
In the circle state,
area
elements must have a coords
attribute
present, with three integers, the last of which must be non-negative. The first integer must be
the distance in CSS pixels from the left edge of the image to the
center of the circle, the second integer must be the distance in CSS
pixels from the top edge of the image to the center of the circle, and the third integer
must be the radius of the circle, again in CSS pixels.
In the default state,
area
elements must not have a coords
attribute. (The area is the whole image.)
In the polygon state,
area
elements must have a coords
attribute
with at least six integers, and the number of integers must be even. Each pair of integers must
represent a coordinate given as the distances from the left and the top of the image in CSS pixels respectively, and all the coordinates together must represent the
points of the polygon, in order.
In the rectangle state,
area
elements must have a coords
attribute
with exactly four integers, the first of which must be less than the third, and the second of
which must be less than the fourth. The four points must represent, respectively, the distance
from the left edge of the image to the left side of the rectangle, the distance from the top edge
to the top side, the distance from the left edge to the right side, and the distance from the top
edge to the bottom side, all in CSS pixels.
When user agents allow users to follow hyperlinks or
download hyperlinks created using the
area
element, the href
, target
, download
, and ping
attributes decide how the link is followed. The rel
attribute may be used to indicate to the user the likely
nature of the target resource before the user follows the link.
The target
, download
, ping
,
rel
, and referrerpolicy
attributes must be omitted if the
href
attribute is not present.
If the itemprop
attribute is specified on an
area
element, then the href
attribute must
also be specified.
The IDL attributes alt
, coords
, shape
, target
, download
, ping
, and rel
, each must reflect the respective content
attributes of the same name.
The IDL attribute relList
must reflect the rel
content attribute.
The IDL attribute referrerPolicy
must reflect the referrerpolicy
content attribute, limited to
only known values.
An image map allows geometric areas on an image to be associated with hyperlinks.
An image, in the form of an img
element, may be associated with an image map (in
the form of a map
element) by specifying a usemap
attribute on the img
element. The
usemap
attribute, if specified, must be a valid
hash-name reference to a map
element.
Consider an image that looks as follows:
If we wanted just the colored areas to be clickable, we could do it as follows:
<p>
Please select a shape:
<img src="shapes.png" usemap="#shapes"
alt="Four shapes are available: a red hollow box, a green circle, a blue triangle, and a yellow four-pointed star.">
<map name="shapes">
<area shape=rect coords="50,50,100,100"> <!-- the hole in the red box -->
<area shape=rect coords="25,25,125,125" href="red.html" alt="Red box.">
<area shape=circle coords="200,75,50" href="green.html" alt="Green circle.">
<area shape=poly coords="325,25,262,125,388,125" href="blue.html" alt="Blue triangle.">
<area shape=poly coords="450,25,435,60,400,75,435,90,450,125,465,90,500,75,465,60"
href="yellow.html" alt="Yellow star.">
</map>
</p>
If an img
element has a usemap
attribute specified, user agents must process it as follows:
Parse the attribute's value using the rules for parsing a hash-name reference
to a map
element, with the element as the context node. This will return either an
element (the map) or null.
If that returned null, then return. The image is not associated with an image map after all.
Otherwise, the user agent must collect all the area
elements that are
descendants of the map. Let those be the areas.
Having obtained the list of area
elements that form the image map (the areas), interactive user agents must process the list in one of two ways.
If the user agent intends to show the text that the img
element represents, then
it must use the following steps.
Remove all the area
elements in areas that have no href
attribute.
Remove all the area
elements in areas that have no alt
attribute, or whose alt
attribute's value is the empty string, if there is another area
element in
areas with the same value in the href
attribute and with a non-empty alt
attribute.
Each remaining area
element in areas represents a
hyperlink. Those hyperlinks should all be made available to the user in a manner
associated with the text of the img
.
In this context, user agents may represent area
and img
elements
with no specified alt
attributes, or whose alt
attributes are the empty string or some other non-visible text, in an
implementation-defined fashion intended to indicate the lack of suitable
author-provided text.
If the user agent intends to show the image and allow interaction with the image to select
hyperlinks, then the image must be associated with a set of layered shapes, taken from the
area
elements in areas, in reverse tree order (so the last
specified area
element in the map is the bottom-most shape, and
the first element in the map, in tree order, is the top-most shape).
Each area
element in areas must be processed as follows to
obtain a shape to layer onto the image:
Find the state that the element's shape
attribute
represents.
Use the rules for parsing a list of floating-point numbers to parse the
element's coords
attribute, if it is present, and let the
result be the coords list. If the attribute is absent, let the coords list
be the empty list.
If the number of items in the coords list is less than the minimum number
given for the area
element's current state, as per the following table, then the
shape is empty; return.
State | Minimum number of items |
---|---|
Circle state | 3 |
Default state | 0 |
Polygon state | 6 |
Rectangle state | 4 |
Check for excess items in the coords list as per the entry in the
following list corresponding to the shape
attribute's
state:
If the shape
attribute represents the rectangle state, and the first number in the list is
numerically greater than the third number in the list, then swap those two numbers around.
If the shape
attribute represents the rectangle state, and the second number in the list is
numerically greater than the fourth number in the list, then swap those two numbers around.
If the shape
attribute represents the circle state, and the third number in the list is less than
or equal to zero, then the shape is empty; return.
Now, the shape represented by the element is the one described for the entry in the list
below corresponding to the state of the shape
attribute:
Let x be the first number in coords, y be the second number, and r be the third number.
The shape is a circle whose center is x CSS pixels from the left edge of the image and y CSS pixels from the top edge of the image, and whose radius is r CSS pixels.
The shape is a rectangle that exactly covers the entire image.
Let xi be the (2i)th entry in coords, and yi be the (2i+1)th entry in coords (the first entry in coords being the one with index 0).
Let the coordinates be (xi, yi), interpreted in CSS pixels measured from the top left of the image, for all integer values of i from 0 to (N/2)-1, where N is the number of items in coords.
The shape is a polygon whose vertices are given by the coordinates, and whose interior is established using the even-odd rule. GRAPHICS
Let x1 be the first number in coords, y1 be the second number, x2 be the third number, and y2 be the fourth number.
The shape is a rectangle whose top-left corner is given by the coordinate (x1, y1) and whose bottom right corner is given by the coordinate (x2, y2), those coordinates being interpreted as CSS pixels from the top left corner of the image.
For historical reasons, the coordinates must be interpreted relative to the
displayed image after any stretching caused by the CSS 'width' and
'height' properties (or, for non-CSS browsers, the image element's width
and height
attributes — CSS browsers map
those attributes to the aforementioned CSS properties).
Browser zoom features and transforms applied using CSS or SVG do not affect the coordinates.
Pointing device interaction with an image associated with a set of layered shapes per the above
algorithm must result in the relevant user interaction events being first fired to the top-most
shape covering the point that the pointing device indicated, if any, or to the image element
itself, if there is no shape covering that point. User agents may also allow individual
area
elements representing hyperlinks to be selected
and activated (e.g. using a keyboard).
Because a map
element (and its area
elements) can be
associated with multiple img
elements, it is possible for an area
element to correspond to multiple focusable areas of the
document.
Image maps are live; if the DOM is mutated, then the user agent must act as if it had rerun the algorithms for image maps.
The MathML math
element falls into the embedded content,
phrasing content, flow content, and palpable content
categories for the purposes of the content models in this specification.
When the MathML annotation-xml
element contains elements from the
HTML namespace, such elements must all be flow content.
When the MathML token elements (mi
, mo
, mn
, ms
, and mtext
) are descendants of HTML elements, they may contain
phrasing content elements from the HTML namespace.
User agents must handle text other than inter-element whitespace found in MathML
elements whose content models do not allow straight text by pretending for the purposes of MathML
content models, layout, and rendering that the text is actually wrapped in a MathML
mtext
element. (Such text is not, however, conforming.)
User agents must act as if any MathML element whose contents does not match the element's
content model was replaced, for the purposes of MathML layout and rendering, by a MathML
merror
element containing some appropriate error message.
The semantics of MathML elements are defined by MathML and other applicable specifications. MATHML
Here is an example of the use of MathML in an HTML document:
<!DOCTYPE html>
<html lang="en">
<head>
<title>The quadratic formula</title>
</head>
<body>
<h1>The quadratic formula</h1>
<p>
<math>
<mi>x</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mo form="prefix">−</mo> <mi>b</mi>
<mo>±</mo>
<msqrt>
<msup> <mi>b</mi> <mn>2</mn> </msup>
<mo>−</mo>
<mn>4</mn> <mo></mo> <mi>a</mi> <mo></mo> <mi>c</mi>
</msqrt>
</mrow>
<mrow>
<mn>2</mn> <mo></mo> <mi>a</mi>
</mrow>
</mfrac>
</math>
</p>
</body>
</html>
The SVG svg
element falls into the embedded content,
phrasing content, flow content, and palpable content
categories for the purposes of the content models in this specification.
When the SVG foreignObject
element contains elements from the
HTML namespace, such elements must all be flow content.
The content model for the SVG title
element inside HTML
documents is phrasing content. (This further constrains the requirements given
in SVG 2.)
The semantics of SVG elements are defined by SVG 2 and other applicable specifications. SVG
doc = iframe.getSVGDocument()
doc = embed.getSVGDocument()
doc = object.getSVGDocument()
Returns the Document
object, in the case of iframe
,
embed
, or object
elements being used to embed SVG.
The getSVGDocument()
method steps are:
Let document be this's content document.
If document is non-null and was created by the page
load processing model for XML files section because the computed type of the resource in the navigate algorithm was
image/svg+xml
, then return document.
Return null.
Author requirements: The width
and
height
attributes on img
, iframe
,
embed
, object
, video
, source
when the parent
is a picture
element and, when their type
attribute is in the Image Button state,
input
elements may be specified to give the dimensions of the visual content of the
element (the width and height respectively, relative to the nominal direction of the output
medium), in CSS pixels. The attributes, if specified, must have values
that are valid non-negative integers.
The specified dimensions given may differ from the dimensions specified in the resource itself, since the resource may have a resolution that differs from the CSS pixel resolution. (On screens, CSS pixels have a resolution of 96ppi, but in general the CSS pixel resolution depends on the reading distance.) If both attributes are specified, then one of the following statements must be true:
The target ratio is the ratio of the natural width to the
natural height in the resource. The specified width and specified
height are the values of the width
and height
attributes respectively.
The two attributes must be omitted if the resource in question does not have both a natural width and a natural height.
If the two attributes are both 0, it indicates that the element is not intended for the user (e.g. it might be a part of a service to count page views).
The dimension attributes are not intended to be used to stretch the image.
User agent requirements: User agents are expected to use these attributes as hints for the rendering.
The width
and height
IDL attributes on the iframe
,
embed
, object
, source
, and video
elements must
reflect the respective content attributes of the same name.
For iframe
, embed
and object
the IDL
attributes are DOMString
; for video
and
source
the IDL attributes are unsigned
long
.
The corresponding IDL attributes for img
and
input
elements are defined in those respective elements'
sections, as they are slightly more specific to those elements' other behaviors.
table
elementcaption
element, followed by zero or more
colgroup
elements, followed optionally by a thead
element, followed by
either zero or more tbody
elements or one or more tr
elements, followed
optionally by a tfoot
element, optionally intermixed with one or more
script-supporting elements.[Exposed=Window]
interface HTMLTableElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute HTMLTableCaptionElement? caption;
HTMLTableCaptionElement createCaption();
[CEReactions] undefined deleteCaption();
[CEReactions] attribute HTMLTableSectionElement? tHead;
HTMLTableSectionElement createTHead();
[CEReactions] undefined deleteTHead();
[CEReactions] attribute HTMLTableSectionElement? tFoot;
HTMLTableSectionElement createTFoot();
[CEReactions] undefined deleteTFoot();
[SameObject] readonly attribute HTMLCollection tBodies;
HTMLTableSectionElement createTBody();
[SameObject] readonly attribute HTMLCollection rows;
HTMLTableRowElement insertRow(optional long index = -1);
[CEReactions] undefined deleteRow(long index);
// also has obsolete members
};
HTMLTableElement
.The table
element represents data with more than one dimension, in
the form of a table.
The table
element takes part in the table
model. Tables have rows, columns, and cells given by their descendants. The rows and
columns form a grid; a table's cells must completely cover that grid without overlap.
Precise rules for determining whether this conformance requirement is met are described in the description of the table model.
Authors are encouraged to provide information describing how to interpret complex tables. Guidance on how to provide such information is given below.
Tables must not be used as layout aids. Historically, some web authors have misused tables in HTML as a way to control their page layout. This usage is non-conforming, because tools attempting to extract tabular data from such documents would obtain very confusing results. In particular, users of accessibility tools like screen readers are likely to find it very difficult to navigate pages with tables used for layout.
There are a variety of alternatives to using HTML tables for layout, such as CSS grid layout, CSS flexible box layout ("flexbox"), CSS multi-column layout, CSS positioning, and the CSS table model. CSS
Tables can be complicated to understand and navigate. To help users with this, user agents should clearly delineate cells in a table from each other, unless the user agent has classified the table as a (non-conforming) layout table.
Authors and implementers are encouraged to consider using some of the table design techniques described below to make tables easier to navigate for users.
User agents, especially those that do table analysis on arbitrary content, are encouraged to find heuristics to determine which tables actually contain data and which are merely being used for layout. This specification does not define a precise heuristic, but the following are suggested as possible indicators:
Feature | Indication |
---|---|
The use of the role attribute with the value presentation
| Probably a layout table |
The use of the non-conforming border attribute with the non-conforming value 0
| Probably a layout table |
The use of the non-conforming cellspacing and
cellpadding attributes with the value 0
| Probably a layout table |
The use of caption , thead , or th elements
| Probably a non-layout table |
The use of the headers and scope attributes
| Probably a non-layout table |
The use of the non-conforming border attribute with a value other than 0
| Probably a non-layout table |
Explicit visible borders set using CSS | Probably a non-layout table |
The use of the summary attribute
| Not a good indicator (both layout and non-layout tables have historically been given this attribute) |
It is quite possible that the above suggestions are wrong. Implementers are urged to provide feedback elaborating on their experiences with trying to create a layout table detection heuristic.
If a table
element has a (non-conforming) summary
attribute, and the user agent has not classified the
table as a layout table, the user agent may report the contents of that attribute to the user.
table.caption [ = value ]
Returns the table's caption
element.
Can be set, to replace the caption
element.
caption = table.createCaption()
Ensures the table has a caption
element, and returns it.
table.deleteCaption()
Ensures the table does not have a caption
element.
table.tHead [ = value ]
Returns the table's thead
element.
Can be set, to replace the thead
element. If the new value is not a
thead
element, throws a "HierarchyRequestError
"
DOMException
.
thead = table.createTHead()
Ensures the table has a thead
element, and returns it.
table.deleteTHead()
Ensures the table does not have a thead
element.
table.tFoot [ = value ]
Returns the table's tfoot
element.
Can be set, to replace the tfoot
element. If the new value is not a
tfoot
element, throws a "HierarchyRequestError
"
DOMException
.
tfoot = table.createTFoot()
Ensures the table has a tfoot
element, and returns it.
table.deleteTFoot()
Ensures the table does not have a tfoot
element.
table.tBodies
Returns an HTMLCollection
of the tbody
elements of the
table.
tbody = table.createTBody()
Creates a tbody
element, inserts it into the table, and returns it.
table.rows
Returns an HTMLCollection
of the tr
elements of the
table.
tr = table.insertRow([ index ])
Creates a tr
element, along with a tbody
if required, inserts them
into the table at the position given by the argument, and returns the tr
.
The position is relative to the rows in the table. The index −1, which is the default if the argument is omitted, is equivalent to inserting at the end of the table.
If the given position is less than −1 or greater than the number of rows, throws an
"IndexSizeError
" DOMException
.
table.deleteRow(index)
Removes the tr
element with the given position in the table.
The position is relative to the rows in the table. The index −1 is equivalent to deleting the last row of the table.
If the given position is less than −1 or greater than the index of the last row, or if
there are no rows, throws an "IndexSizeError
"
DOMException
.
In all of the following attribute and method definitions, when an element is to be
table-created, that means to create an element given the
table
element's node document, the given local name, and the HTML
namespace.
The caption
IDL attribute must return, on getting, the first caption
element child of the
table
element, if any, or null otherwise. On setting, the first caption
element child of the table
element, if any, must be removed, and the new value, if
not null, must be inserted as the first node of the table
element.
The createCaption()
method must return the first
caption
element child of the table
element, if any; otherwise a new
caption
element must be table-created, inserted as the first node of the
table
element, and then returned.
The deleteCaption()
method must remove the first
caption
element child of the table
element, if any.
The tHead
IDL
attribute must return, on getting, the first thead
element child of the
table
element, if any, or null otherwise. On setting, if the new value is null or a
thead
element, the first thead
element child of the table
element, if any, must be removed, and the new value, if not null, must be inserted immediately
before the first element in the table
element that is neither a caption
element nor a colgroup
element, if any, or at the end of the table if there are no
such elements. If the new value is neither null nor a thead
element, then a
"HierarchyRequestError
" DOMException
must be thrown
instead.
The createTHead()
method must return the first
thead
element child of the table
element, if any; otherwise a new
thead
element must be table-created and inserted immediately before the
first element in the table
element that is neither a caption
element nor
a colgroup
element, if any, or at the end of the table if there are no such elements,
and then that new element must be returned.
The deleteTHead()
method must remove the first
thead
element child of the table
element, if any.
The tFoot
IDL
attribute must return, on getting, the first tfoot
element child of the
table
element, if any, or null otherwise. On setting, if the new value is null or a
tfoot
element, the first tfoot
element child of the table
element, if any, must be removed, and the new value, if not null, must be inserted at the end of
the table. If the new value is neither null nor a tfoot
element, then a
"HierarchyRequestError
" DOMException
must be thrown
instead.
The createTFoot()
method must return the first
tfoot
element child of the table
element, if any; otherwise a new
tfoot
element must be table-created and inserted at the end of the
table, and then that new element must be returned.
The deleteTFoot()
method must remove the first
tfoot
element child of the table
element, if any.
The tBodies
attribute must return an HTMLCollection
rooted at the table
node, whose
filter matches only tbody
elements that are children of the table
element.
The createTBody()
method must table-create a new tbody
element, insert it immediately
after the last tbody
element child in the table
element, if any, or at
the end of the table
element if the table
element has no
tbody
element children, and then must return the new tbody
element.
The rows
attribute must return an HTMLCollection
rooted at the table
node, whose
filter matches only tr
elements that are either children of the table
element, or children of thead
, tbody
, or tfoot
elements
that are themselves children of the table
element. The elements in the collection
must be ordered such that those elements whose parent is a thead
are included first,
in tree order, followed by those elements whose parent is either a table
or tbody
element, again in tree order, followed finally by those
elements whose parent is a tfoot
element, still in tree order.
The behavior of the insertRow(index)
method depends on the state
of the table. When it is called, the method must act as required by the first item in the
following list of conditions that describes the state of the table and the index
argument:
rows
collection:IndexSizeError
"
DOMException
.rows
collection has zero elements in it, and the
table
has no tbody
elements in it:tbody
element, then table-create a tr
element, then
append the tr
element to the tbody
element, then append the
tbody
element to the table
element, and finally return the
tr
element.rows
collection has zero elements in it:tr
element,
append it to the last tbody
element in the table, and return the tr
element.rows
collection:tr
element,
and append it to the parent of the last tr
element in the rows
collection. Then, the newly created tr
element
must be returned.tr
element,
insert it immediately before the indexth tr
element in the rows
collection, in the same parent, and finally must return the
newly created tr
element.When the deleteRow(index)
method is called, the user
agent must run the following steps:
If index is less than −1 or greater than or equal to the number of
elements in the rows
collection, then throw an
"IndexSizeError
" DOMException
.
If index is −1, then remove
the last element in the rows
collection from its parent, or
do nothing if the rows
collection is empty.
Otherwise, remove the indexth element
in the rows
collection from its parent.
Here is an example of a table being used to mark up a Sudoku puzzle. Observe the lack of headers, which are not necessary in such a table.
<style>
#sudoku { border-collapse: collapse; border: solid thick; }
#sudoku colgroup, table#sudoku tbody { border: solid medium; }
#sudoku td { border: solid thin; height: 1.4em; width: 1.4em; text-align: center; padding: 0; }
</style>
<h1>Today's Sudoku</h1>
<table id="sudoku">
<colgroup><col><col><col>
<colgroup><col><col><col>
<colgroup><col><col><col>
<tbody>
<tr> <td> 1 <td> <td> 3 <td> 6 <td> <td> 4 <td> 7 <td> <td> 9
<tr> <td> <td> 2 <td> <td> <td> 9 <td> <td> <td> 1 <td>
<tr> <td> 7 <td> <td> <td> <td> <td> <td> <td> <td> 6
<tbody>
<tr> <td> 2 <td> <td> 4 <td> <td> 3 <td> <td> 9 <td> <td> 8
<tr> <td> <td> <td> <td> <td> <td> <td> <td> <td>
<tr> <td> 5 <td> <td> <td> 9 <td> <td> 7 <td> <td> <td> 1
<tbody>
<tr> <td> 6 <td> <td> <td> <td> 5 <td> <td> <td> <td> 2
<tr> <td> <td> <td> <td> <td> 7 <td> <td> <td> <td>
<tr> <td> 9 <td> <td> <td> 8 <td> <td> 2 <td> <td> <td> 5
</table>
For tables that consist of more than just a grid of cells with headers in the first row and headers in the first column, and for any table in general where the reader might have difficulty understanding the content, authors should include explanatory information introducing the table. This information is useful for all users, but is especially useful for users who cannot see the table, e.g. users of screen readers.
Such explanatory information should introduce the purpose of the table, outline its basic cell structure, highlight any trends or patterns, and generally teach the user how to use the table.
For instance, the following table:
Negative | Characteristic | Positive |
---|---|---|
Sad | Mood | Happy |
Failing | Grade | Passing |
...might benefit from a description explaining the way the table is laid out, something like "Characteristics are given in the second column, with the negative side in the left column and the positive side in the right column".
There are a variety of ways to include this information, such as:
<p>In the following table, characteristics are given in the second
column, with the negative side in the left column and the positive
side in the right column.</p>
<table>
<caption>Characteristics with positive and negative sides</caption>
<thead>
<tr>
<th id="n"> Negative
<th> Characteristic
<th> Positive
<tbody>
<tr>
<td headers="n r1"> Sad
<th id="r1"> Mood
<td> Happy
<tr>
<td headers="n r2"> Failing
<th id="r2"> Grade
<td> Passing
</table>
caption
<table>
<caption>
<strong>Characteristics with positive and negative sides.</strong>
<p>Characteristics are given in the second column, with the
negative side in the left column and the positive side in the right
column.</p>
</caption>
<thead>
<tr>
<th id="n"> Negative
<th> Characteristic
<th> Positive
<tbody>
<tr>
<td headers="n r1"> Sad
<th id="r1"> Mood
<td> Happy
<tr>
<td headers="n r2"> Failing
<th id="r2"> Grade
<td> Passing
</table>
caption
, in a details
element<table>
<caption>
<strong>Characteristics with positive and negative sides.</strong>
<details>
<summary>Help</summary>
<p>Characteristics are given in the second column, with the
negative side in the left column and the positive side in the right
column.</p>
</details>
</caption>
<thead>
<tr>
<th id="n"> Negative
<th> Characteristic
<th> Positive
<tbody>
<tr>
<td headers="n r1"> Sad
<th id="r1"> Mood
<td> Happy
<tr>
<td headers="n r2"> Failing
<th id="r2"> Grade
<td> Passing
</table>
figure
<figure>
<figcaption>Characteristics with positive and negative sides</figcaption>
<p>Characteristics are given in the second column, with the
negative side in the left column and the positive side in the right
column.</p>
<table>
<thead>
<tr>
<th id="n"> Negative
<th> Characteristic
<th> Positive
<tbody>
<tr>
<td headers="n r1"> Sad
<th id="r1"> Mood
<td> Happy
<tr>
<td headers="n r2"> Failing
<th id="r2"> Grade
<td> Passing
</table>
</figure>
figure
's figcaption
<figure>
<figcaption>
<strong>Characteristics with positive and negative sides</strong>
<p>Characteristics are given in the second column, with the
negative side in the left column and the positive side in the right
column.</p>
</figcaption>
<table>
<thead>
<tr>
<th id="n"> Negative
<th> Characteristic
<th> Positive
<tbody>
<tr>
<td headers="n r1"> Sad
<th id="r1"> Mood
<td> Happy
<tr>
<td headers="n r2"> Failing
<th id="r2"> Grade
<td> Passing
</table>
</figure>
Authors may also use other techniques, or combinations of the above techniques, as appropriate.
The best option, of course, rather than writing a description explaining the way the table is laid out, is to adjust the table such that no explanation is needed.
In the case of the table used in the examples above, a simple rearrangement of the table so
that the headers are on the top and left sides removes the need for an explanation as well as
removing the need for the use of headers
attributes:
<table>
<caption>Characteristics with positive and negative sides</caption>
<thead>
<tr>
<th> Characteristic
<th> Negative
<th> Positive
<tbody>
<tr>
<th> Mood
<td> Sad
<td> Happy
<tr>
<th> Grade
<td> Failing
<td> Passing
</table>
Good table design is key to making tables more readable and usable.
In visual media, providing column and row borders and alternating row backgrounds can be very effective to make complicated tables more readable.
For tables with large volumes of numeric content, using monospaced fonts can help users see patterns, especially in situations where a user agent does not render the borders. (Unfortunately, for historical reasons, not rendering borders on tables is a common default.)
In speech media, table cells can be distinguished by reporting the corresponding headers before reading the cell's contents, and by allowing users to navigate the table in a grid fashion, rather than serializing the entire contents of the table in source order.
Authors are encouraged to use CSS to achieve these effects.
User agents are encouraged to render tables using these techniques whenever the page does not use CSS and the table is not classified as a layout table.
caption
elementtable
element.table
elements.[Exposed=Window]
interface HTMLTableCaptionElement : HTMLElement {
[HTMLConstructor] constructor();
// also has obsolete members
};
HTMLTableCaptionElement
.The caption
element represents the title of the table
that is its parent, if it has a parent and that is a table
element.
The caption
element takes part in the table model.
When a table
element is the only content in a figure
element other
than the figcaption
, the caption
element should be omitted in favor of
the figcaption
.
A caption can introduce context for a table, making it significantly easier to understand.
Consider, for instance, the following table:
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
In the abstract, this table is not clear. However, with a caption giving the table's number (for reference in the main prose) and explaining its use, it makes more sense:
<caption>
<p>Table 1.
<p>This table shows the total score obtained from rolling two
six-sided dice. The first row represents the value of the first die,
the first column the value of the second die. The total is given in
the cell that corresponds to the values of the two dice.
</caption>
This provides the user with more context:
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
colgroup
elementtable
element, after any
caption
elements and before any thead
,
tbody
, tfoot
, and tr
elements.span
attribute is present: Nothing.span
attribute is absent: Zero or more col
and template
elements.span
[Exposed=Window]
interface HTMLTableColElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute unsigned long span;
// also has obsolete members
};
HTMLTableColElement
.The colgroup
element represents a group of one or more columns in the table
that is its parent, if it has a
parent and that is a table
element.
If the colgroup
element contains no col
elements, then the element
may have a span
content attribute specified, whose value must be a valid non-negative integer greater
than zero and less than or equal to 1000.
The colgroup
element and its span
attribute take part in the table model.
The span
IDL attribute must reflect the content attribute of the same name. It is
clamped to the range [1, 1000], and its default value is 1.
col
elementcolgroup
element that doesn't have
a span
attribute.span
HTMLTableColElement
, as defined for colgroup
elements.If a col
element has a parent and that is a colgroup
element that
itself has a parent that is a table
element, then the col
element
represents one or more columns in the column group represented by that colgroup
.
The element may have a span
content attribute specified, whose value must be a
valid non-negative integer greater than zero and less than or equal to 1000.
The col
element and its span
attribute take
part in the table model.
tbody
elementtable
element, after any
caption
, colgroup
, and
thead
elements, but only if there are no
tr
elements that are children of the
table
element.tr
and script-supporting elements.[Exposed=Window]
interface HTMLTableSectionElement : HTMLElement {
[HTMLConstructor] constructor();
[SameObject] readonly attribute HTMLCollection rows;
HTMLTableRowElement insertRow(optional long index = -1);
[CEReactions] undefined deleteRow(long index);
// also has obsolete members
};
Uses HTMLTableSectionElement
. The
HTMLTableSectionElement
interface is also used for thead
and
tfoot
elements.
The tbody
element represents a block of rows that consist of a
body of data for the parent table
element, if the tbody
element has a
parent and it is a table
.
The tbody
element takes part in the table model.
tbody.rows
Returns an HTMLCollection
of the tr
elements of the table
section.
tr = tbody.insertRow([ index ])
Creates a tr
element, inserts it into the table section at the position given by
the argument, and returns the tr
.
The position is relative to the rows in the table section. The index −1, which is the default if the argument is omitted, is equivalent to inserting at the end of the table section.
If the given position is less than −1 or greater than the number of rows, throws an
"IndexSizeError
" DOMException
.
tbody.deleteRow(index)
Removes the tr
element with the given position in the table section.
The position is relative to the rows in the table section. The index −1 is equivalent to deleting the last row of the table section.
If the given position is less than −1 or greater than the index of the last row, or if
there are no rows, throws an "IndexSizeError
"
DOMException
.
The rows
attribute must return an HTMLCollection
rooted at this element, whose filter matches only tr
elements that are children of
this element.
The insertRow(index)
method must act as
follows:
If index is less than −1 or greater than the number of elements in the
rows
collection, throw an
"IndexSizeError
" DOMException
.
Let table row be the result of creating an
element given this element's node document, tr
, and the
HTML namespace.
If index is −1 or equal to the number of items in the rows
collection, then append table row to this element.
Otherwise, insert table row as a
child of this element, immediately before the indexth tr
element in the
rows
collection.
Return table row.
The deleteRow(index)
method must, when invoked,
act as follows:
If index is less than −1 or greater than or equal to the number of
elements in the rows
collection, then throw an
"IndexSizeError
" DOMException
.
If index is −1, then remove
the last element in the rows
collection from this
element, or do nothing if the rows
collection is
empty.
Otherwise, remove the indexth element
in the rows
collection from this element.
thead
elementtable
element, after any
caption
, and colgroup
elements and before any tbody
, tfoot
, and
tr
elements, but only if there are no other
thead
elements that are children of the
table
element.tr
and script-supporting elements.HTMLTableSectionElement
, as defined for tbody
elements.The thead
element represents the block of rows that consist of
the column labels (headers) and any ancillary non-header cells for the parent table
element, if the thead
element has a parent and it is a table
.
The thead
element takes part in the table model.
This example shows a thead
element being used. Notice the use of both
th
and td
elements in the thead
element: the first row is
the headers, and the second row is an explanation of how to fill in the table.
<table>
<caption> School auction sign-up sheet </caption>
<thead>
<tr>
<th><label for=e1>Name</label>
<th><label for=e2>Product</label>
<th><label for=e3>Picture</label>
<th><label for=e4>Price</label>
<tr>
<td>Your name here
<td>What are you selling?
<td>Link to a picture
<td>Your reserve price
<tbody>
<tr>
<td>Ms Danus
<td>Doughnuts
<td><img src="https://example.com/mydoughnuts.png" title="Doughnuts from Ms Danus">
<td>$45
<tr>
<td><input id=e1 type=text name=who required form=f>
<td><input id=e2 type=text name=what required form=f>
<td><input id=e3 type=url name=pic form=f>
<td><input id=e4 type=number step=0.01 min=0 value=0 required form=f>
</table>
<form id=f action="/auction.cgi">
<input type=button name=add value="Submit">
</form>
tfoot
elementtable
element, after any
caption
, colgroup
, thead
,
tbody
, and tr
elements, but only if there
are no other tfoot
elements that are children of the
table
element.tr
and script-supporting elements.HTMLTableSectionElement
, as defined for tbody
elements.The tfoot
element represents the block of rows that consist of
the column summaries (footers) for the parent table
element, if the
tfoot
element has a parent and it is a table
.
The tfoot
element takes part in the table
model.
tr
elementthead
element.tbody
element.tfoot
element.table
element, after any
caption
, colgroup
, and thead
elements, but only if there are no tbody
elements that
are children of the table
element.td
, th
, and script-supporting elements.[Exposed=Window]
interface HTMLTableRowElement : HTMLElement {
[HTMLConstructor] constructor();
readonly attribute long rowIndex;
readonly attribute long sectionRowIndex;
[SameObject] readonly attribute HTMLCollection cells;
HTMLTableCellElement insertCell(optional long index = -1);
[CEReactions] undefined deleteCell(long index);
// also has obsolete members
};
HTMLTableRowElement
.The tr
element represents a row of
cells in a table.
The tr
element takes part in the table model.
tr.rowIndex
Returns the position of the row in the table's rows
list.
Returns −1 if the element isn't in a table.
tr.sectionRowIndex
Returns the position of the row in the table section's rows
list.
Returns −1 if the element isn't in a table section.
tr.cells
Returns an HTMLCollection
of the td
and th
elements of
the row.
cell = tr.insertCell([ index ])
Creates a td
element, inserts it into the table row at the position given by the
argument, and returns the td
.
The position is relative to the cells in the row. The index −1, which is the default if the argument is omitted, is equivalent to inserting at the end of the row.
If the given position is less than −1 or greater than the number of cells, throws an
"IndexSizeError
" DOMException
.
tr.deleteCell(index)
Removes the td
or th
element with the given position in the
row.
The position is relative to the cells in the row. The index −1 is equivalent to deleting the last cell of the row.
If the given position is less than −1 or greater than the index of the last cell, or
if there are no cells, throws an "IndexSizeError
"
DOMException
.
The rowIndex
attribute must, if this element has a parent
table
element, or a parent tbody
, thead
, or
tfoot
element and a grandparent table
element, return the index
of this tr
element in that table
element's rows
collection. If there is no such table
element,
then the attribute must return −1.
The sectionRowIndex
attribute must, if this element has a
parent table
, tbody
, thead
, or tfoot
element,
return the index of the tr
element in the parent element's rows
collection (for tables, that's HTMLTableElement
's rows
collection; for table sections, that's
HTMLTableSectionElement
's rows
collection). If there is no such parent element, then the attribute must return −1.
The cells
attribute must return an HTMLCollection
rooted at this tr
element, whose
filter matches only td
and th
elements that are children of the
tr
element.
The insertCell(index)
method must act as
follows:
If index is less than −1 or greater than the number of elements in
the cells
collection, then throw an
"IndexSizeError
" DOMException
.
Let table cell be the result of creating an
element given this tr
element's node document, td
,
and the HTML namespace.
If index is equal to −1 or equal to the number of items in cells
collection, then append table cell to this tr
element.
Otherwise, insert table cell as a
child of this tr
element, immediately before the indexth td
or th
element in the cells
collection.
Return table cell.
The deleteCell(index)
method must act as
follows:
If index is less than −1 or greater than or equal to the number of
elements in the cells
collection, then throw an
"IndexSizeError
" DOMException
.
If index is −1, then remove
the last element in the cells
collection from its
parent, or do nothing if the cells
collection is
empty.
Otherwise, remove the indexth element
in the cells
collection from its parent.
td
elementtr
element.colspan
rowspan
headers
[Exposed=Window]
interface HTMLTableCellElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute unsigned long colSpan;
[CEReactions] attribute unsigned long rowSpan;
[CEReactions] attribute DOMString headers;
readonly attribute long cellIndex;
[CEReactions] attribute DOMString scope; // only conforming for th elements
[CEReactions] attribute DOMString abbr; // only conforming for th elements
// also has obsolete members
};
Uses HTMLTableCellElement
. The
HTMLTableCellElement
interface is also used for th
elements.
The td
element represents a data cell in a table.
The td
element and its colspan
, rowspan
, and headers
attributes take part in the table model.
User agents, especially in non-visual environments or where displaying the table as a 2D grid
is impractical, may give the user context for the cell when rendering the contents of a cell; for
instance, giving its position in the table model, or listing the cell's header cells
(as determined by the algorithm for assigning header cells). When a cell's header
cells are being listed, user agents may use the value of abbr
attributes on those header cells, if any, instead of the contents of the header cells
themselves.
In this example, we see a snippet of a web application consisting of a grid of editable cells
(essentially a simple spreadsheet). One of the cells has been configured to show the sum of the
cells above it. Three have been marked as headings, which use th
elements instead of
td
elements. A script would attach event handlers to these elements to maintain the
total.
<table>
<tr>
<th><input value="Name">
<th><input value="Paid ($)">
<tr>
<td><input value="Jeff">
<td><input value="14">
<tr>
<td><input value="Britta">
<td><input value="9">
<tr>
<td><input value="Abed">
<td><input value="25">
<tr>
<td><input value="Shirley">
<td><input value="2">
<tr>
<td><input value="Annie">
<td><input value="5">
<tr>
<td><input value="Troy">
<td><input value="5">
<tr>
<td><input value="Pierce">
<td><input value="1000">
<tr>
<th><input value="Total">
<td><output value="1060">
</table>
th
elementtr
element.header
, footer
,
sectioning content, or heading content descendants.colspan
rowspan
headers
scope
abbr
HTMLTableCellElement
, as defined for td
elements.The th
element represents a header cell in a table.
The th
element may have a scope
content attribute specified.
The scope
attribute is an enumerated attribute
with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
row
| row | The header cell applies to some of the subsequent cells in the same row(s). |
col
| column | The header cell applies to some of the subsequent cells in the same column(s). |
rowgroup
| row group | The header cell applies to all the remaining cells in the row group. |
colgroup
| column group | The header cell applies to all the remaining cells in the column group. |
The attribute's missing value default and invalid value default are both the auto state. (In this state the header cell applies to a set of cells selected based on context.)
A th
element's scope
attribute must not be in
the row group state if the element is not anchored in
a row group, nor in the column group state if the element is not anchored in a
column group.
The th
element may have an abbr
content attribute specified. Its value must be an
alternative label for the header cell, to be used when referencing the cell in other contexts
(e.g. when describing the header cells that apply to a data cell). It is typically an abbreviated
form of the full header cell, but can also be an expansion, or merely a different phrasing.
The th
element and its colspan
, rowspan
, headers
, and
scope
attributes take part in the table model.
The following example shows how the scope
attribute's rowgroup
value affects which data cells a header cell
applies to.
Here is a markup fragment showing a table:
<table>
<thead>
<tr> <th> ID <th> Measurement <th> Average <th> Maximum
<tbody>
<tr> <td> <th scope=rowgroup> Cats <td> <td>
<tr> <td> 93 <th> Legs <td> 3.5 <td> 4
<tr> <td> 10 <th> Tails <td> 1 <td> 1
<tbody>
<tr> <td> <th scope=rowgroup> English speakers <td> <td>
<tr> <td> 32 <th> Legs <td> 2.67 <td> 4
<tr> <td> 35 <th> Tails <td> 0.33 <td> 1
</table>
This would result in the following table:
ID | Measurement | Average | Maximum |
---|---|---|---|
Cats | |||
93 | Legs | 3.5 | 4 |
10 | Tails | 1 | 1 |
English speakers | |||
32 | Legs | 2.67 | 4 |
35 | Tails | 0.33 | 1 |
The headers in the first row all apply directly down to the rows in their column.
The headers with a scope
attribute in the rowgroup state apply to all the cells in their row
group other than the cells in the first column.
The remaining headers apply just to the cells to the right of them.
td
and th
elementsThe td
and th
elements may have a colspan
content attribute specified, whose value must be a
valid non-negative integer greater than zero and less than or equal to 1000.
The td
and th
elements may also have a rowspan
content attribute specified,
whose value must be a valid non-negative integer less than or equal to 65534. For
this attribute, the value zero means that the cell is to span all the remaining rows in the row
group.
These attributes give the number of columns and rows respectively that the cell is to span. These attributes must not be used to overlap cells, as described in the description of the table model.
The td
and th
element may have a headers
content attribute specified. The headers
attribute, if specified, must contain a string
consisting of an unordered set of unique space-separated tokens, none of which are
identical to another token and each of which must have the value of an ID of a th
element taking part in the same table as the td
or th
element (as defined by the table model).
A th
element with ID id is
said to be directly targeted by all td
and th
elements in the
same table that have headers
attributes whose values include as one of their tokens
the ID id. A th
element A is said to be targeted by a th
or td
element
B if either A is directly targeted by B or if there exists an element C that is itself
targeted by the element B and A is directly
targeted by C.
A th
element must not be targeted by itself.
The colspan
, rowspan
, and headers
attributes take part in the table model.
cell.cellIndex
Returns the position of the cell in the row's cells
list.
This does not necessarily correspond to the x-position of the cell in the table,
since earlier cells might cover multiple rows or columns.
Returns −1 if the element isn't in a row.
The colSpan
IDL attribute must reflect the colspan
content attribute. It is clamped to the
range [1, 1000], and its default value is 1.
The rowSpan
IDL attribute must reflect the rowspan
content attribute. It is clamped to the
range [0, 65534], and its default value is 1.
The headers
IDL attribute must reflect the content
attribute of the same name.
The cellIndex
IDL attribute must, if the element has a parent
tr
element, return the index of the cell's element in the parent element's cells
collection. If there is no such parent element, then the
attribute must return −1.
The scope
IDL attribute must reflect the content attribute of the same name, limited to
only known values.
The abbr
IDL
attribute must reflect the content attribute of the same name.
The various table elements and their content attributes together define the table model.
A table consists of cells aligned on a two-dimensional grid of
slots with coordinates (x, y). The grid is finite, and is either empty or has one or more slots. If the grid
has one or more slots, then the x coordinates are always in the range 0 ≤ x < xwidth, and the y coordinates are always in the
range 0 ≤ y < yheight. If one or both of xwidth and yheight are zero, then the
table is empty (has no slots). Tables correspond to table
elements.
A cell is a set of slots anchored at a slot (cellx, celly), and with
a particular width and height such that the cell covers
all the slots with coordinates (x, y) where cellx ≤ x < cellx+width and celly ≤ y < celly+height. Cells can either be data cells
or header cells. Data cells correspond to td
elements, and header cells
correspond to th
elements. Cells of both types can have zero or more associated
header cells.
It is possible, in certain error cases, for two cells to occupy the same slot.
A row is a complete set of slots from x=0 to x=xwidth-1, for a particular value of y. Rows usually
correspond to tr
elements, though a row group
can have some implied rows at the end in some cases involving
cells spanning multiple rows.
A column is a complete set of slots from y=0 to y=yheight-1, for a particular value of x. Columns can
correspond to col
elements. In the absence of col
elements, columns are
implied.
A row group is a set of rows anchored at a slot (0, groupy) with a particular height such that the row group
covers all the slots with coordinates (x, y) where 0 ≤ x < xwidth and groupy ≤ y < groupy+height. Row groups correspond to
tbody
, thead
, and tfoot
elements. Not every row is
necessarily in a row group.
A column group is a set of columns anchored at a slot (groupx, 0) with a particular width such that the column group
covers all the slots with coordinates (x, y) where groupx ≤ x < groupx+width and 0 ≤ y < yheight. Column
groups correspond to colgroup
elements. Not every column is necessarily in a column
group.
Row groups cannot overlap each other. Similarly, column groups cannot overlap each other.
A cell cannot cover slots that are from two or more row groups. It is, however, possible for a cell to be in multiple column groups. All the slots that form part of one cell are part of zero or one row groups and zero or more column groups.
In addition to cells, columns, rows, row groups, and column
groups, tables can have a caption
element
associated with them. This gives the table a heading, or legend.
A table model error is an error with the data represented by table
elements and their descendants. Documents must not have table model errors.
To determine which elements correspond to which slots in a table associated with a table
element, to determine the
dimensions of the table (xwidth and yheight), and to determine if there are any table model errors, user agents must use the following algorithm:
Let xwidth be zero.
Let yheight be zero.
Let pending tfoot
elements be a list of tfoot
elements, initially empty.
Let the table be the table represented
by the table
element. The xwidth and yheight variables give the table's
dimensions. The table is initially empty.
If the table
element has no children elements, then return the
table (which will be empty).
Associate the first caption
element child of the table
element with
the table. If there are no such children, then it has no associated
caption
element.
Let the current element be the first element child of the
table
element.
If a step in this algorithm ever requires the current element to be advanced to the next child of the table
when
there is no such next child, then the user agent must jump to the step labeled end, near
the end of this algorithm.
While the current element is not one of the following elements, advance the current element to the next
child of the table
:
colgroup
thead
tbody
tfoot
tr
If the current element is a colgroup
, follow these
substeps:
Column groups: Process the current element according to the appropriate case below:
col
element childrenFollow these steps:
Let xstart have the value of xwidth.
Let the current column be the first col
element child
of the colgroup
element.
Columns: If the current column col
element has
a span
attribute, then parse its value using the
rules for parsing non-negative integers.
If the result of parsing the value is not an error or zero, then let span be that value.
Otherwise, if the col
element has no span
attribute, or if trying to parse the attribute's value
resulted in an error or zero, then let span be 1.
If span is greater than 1000, let it be 1000 instead.
Increase xwidth by span.
Let the last span columns in
the table correspond to the current column
col
element.
If current column is not the last col
element child of
the colgroup
element, then let the current column be the
next col
element child of the colgroup
element, and return to
the step labeled columns.
Let all the last columns in the
table from x=xstart to
x=xwidth-1 form a new column group, anchored at the slot (xstart, 0), with width xwidth-xstart, corresponding to the colgroup
element.
col
element childrenIf the colgroup
element has a span
attribute, then parse its value using the rules for parsing non-negative
integers.
If the result of parsing the value is not an error or zero, then let span be that value.
Otherwise, if the colgroup
element has no span
attribute, or if trying to parse the attribute's
value resulted in an error or zero, then let span be 1.
If span is greater than 1000, let it be 1000 instead.
Increase xwidth by span.
Let the last span columns in
the table form a new column
group, anchored at the slot (xwidth-span, 0), with width span, corresponding to the colgroup
element.
Advance the current element
to the next child of the table
.
While the current element is not one of the following elements, advance the current element to the
next child of the table
:
colgroup
thead
tbody
tfoot
tr
If the current element is a colgroup
element, jump to the
step labeled column groups above.
Let ycurrent be zero.
Let the list of downward-growing cells be an empty list.
Rows: While the current element is not one of the following
elements, advance the current
element to the next child of the table
:
thead
tbody
tfoot
tr
If the current element is a tr
, then run the algorithm
for processing rows, advance the current element to the next child of the table
, and return to the
step labeled rows.
Run the algorithm for ending a row group.
If the current element is a tfoot
, then add that element to
the list of pending tfoot
elements, advance the current element to the next
child of the table
, and return to the step labeled rows.
The current element is either a thead
or a
tbody
.
Run the algorithm for processing row groups.
Advance the current element to
the next child of the table
.
Return to the step labeled rows.
End: For each tfoot
element in the list of pending
tfoot
elements, in tree order, run the algorithm for processing row
groups.
If there exists a row or column in the table containing only slots that do not have a cell anchored to them, then this is a table model error.
Return the table.
The algorithm for processing row groups, which is invoked by the set of steps above
for processing thead
, tbody
, and tfoot
elements, is:
Let ystart have the value of yheight.
For each tr
element that is a child of the element being processed, in tree
order, run the algorithm for processing rows.
If yheight > ystart, then let all the last rows in the table from y=ystart to y=yheight-1 form a new row group, anchored at the slot with coordinate (0, ystart), with height yheight-ystart, corresponding to the element being processed.
Run the algorithm for ending a row group.
The algorithm for ending a row group, which is invoked by the set of steps above when starting and ending a block of rows, is:
While ycurrent is less than yheight, follow these steps:
Run the algorithm for growing downward-growing cells.
Increase ycurrent by 1.
Empty the list of downward-growing cells.
The algorithm for processing rows, which is invoked by the set of steps above for
processing tr
elements, is:
If yheight is equal to ycurrent, then increase yheight by 1. (ycurrent is never greater than yheight.)
Let xcurrent be 0.
Run the algorithm for growing downward-growing cells.
If the tr
element being processed has no td
or th
element children, then increase ycurrent by 1, abort
this set of steps, and return to the algorithm above.
Let current cell be the first td
or th
element child
in the tr
element being processed.
Cells: While xcurrent is less than xwidth and the slot with coordinate (xcurrent, ycurrent) already has a cell assigned to it, increase xcurrent by 1.
If xcurrent is equal to xwidth, increase xwidth by 1. (xcurrent is never greater than xwidth.)
If the current cell has a colspan
attribute, then parse that attribute's
value, and let colspan be the result.
If parsing that value failed, or returned zero, or if the attribute is absent, then let colspan be 1, instead.
If colspan is greater than 1000, let it be 1000 instead.
If the current cell has a rowspan
attribute, then parse that attribute's
value, and let rowspan be the result.
If parsing that value failed or if the attribute is absent, then let rowspan be 1, instead.
If rowspan is greater than 65534, let it be 65534 instead.
If rowspan is zero and the table
element's
node document is not set to quirks mode, then let cell grows
downward be true, and set rowspan to 1. Otherwise, let cell grows downward be false.
If xwidth < xcurrent+colspan, then let xwidth be xcurrent+colspan.
If yheight < ycurrent+rowspan, then let yheight be ycurrent+rowspan.
Let the slots with coordinates (x, y) such that xcurrent ≤ x < xcurrent+colspan and ycurrent ≤ y < ycurrent+rowspan be covered by a new cell c, anchored at (xcurrent, ycurrent), which has width colspan and height rowspan, corresponding to the current cell element.
If the current cell element is a th
element, let this new
cell c be a header cell; otherwise, let it be a data cell.
To establish which header cells apply to the current cell element, use the algorithm for assigning header cells described in the next section.
If any of the slots involved already had a cell covering them, then this is a table model error. Those slots now have two cells overlapping.
If cell grows downward is true, then add the tuple {c, xcurrent, colspan} to the list of downward-growing cells.
Increase xcurrent by colspan.
If current cell is the last td
or th
element child in
the tr
element being processed, then increase ycurrent by 1, abort this set of steps, and return to the algorithm
above.
Let current cell be the next td
or th
element child
in the tr
element being processed.
Return to the step labeled cells.
When the algorithms above require the user agent to run the algorithm for growing downward-growing cells, the user agent must, for each {cell, cellx, width} tuple in the list of downward-growing cells, if any, extend the cell cell so that it also covers the slots with coordinates (x, ycurrent), where cellx ≤ x < cellx+width.
Each cell can be assigned zero or more header cells. The algorithm for assigning header cells to a cell principal cell is as follows.
Let header list be an empty list of cells.
Let (principalx, principaly) be the coordinate of the slot to which the principal cell is anchored.
headers
attribute specifiedTake the value of the principal cell's headers
attribute and split it on ASCII whitespace, letting id list be the
list of tokens obtained.
For each token in the id list, if the
first element in the Document
with an ID equal to
the token is a cell in the same table, and that cell is not the
principal cell, then add that cell to header list.
headers
attribute specifiedLet principalwidth be the width of the principal cell.
Let principalheight be the height of the principal cell.
For each value of y from principaly to principaly+principalheight-1, run the internal algorithm for scanning and assigning header cells, with the principal cell, the header list, the initial coordinate (principalx, y), and the increments Δx=−1 and Δy=0.
For each value of x from principalx to principalx+principalwidth-1, run the internal algorithm for scanning and assigning header cells, with the principal cell, the header list, the initial coordinate (x, principaly), and the increments Δx=0 and Δy=−1.
If the principal cell is anchored in a row group, then add all header cells that are row group headers and are anchored in the same row group with an x-coordinate less than or equal to principalx+principalwidth-1 and a y-coordinate less than or equal to principaly+principalheight-1 to header list.
If the principal cell is anchored in a column group, then add all header cells that are column group headers and are anchored in the same column group with an x-coordinate less than or equal to principalx+principalwidth-1 and a y-coordinate less than or equal to principaly+principalheight-1 to header list.
Remove all the empty cells from the header list.
Remove any duplicates from the header list.
Remove principal cell from the header list if it is there.
Assign the headers in the header list to the principal cell.
The internal algorithm for scanning and assigning header cells, given a principal cell, a header list, an initial coordinate (initialx, initialy), and Δx and Δy increments, is as follows:
Let x equal initialx.
Let y equal initialy.
Let opaque headers be an empty list of cells.
Let in header block be true, and let headers from current header block be a list of cells containing just the principal cell.
Let in header block be false and let headers from current header block be an empty list of cells.
Loop: Increment x by Δx; increment y by Δy.
For each invocation of this algorithm, one of Δx and Δy will be −1, and the other will be 0.
If either x or y are less than 0, then abort this internal algorithm.
If there is no cell covering slot (x, y), or if there is more than one cell covering slot (x, y), return to the substep labeled loop.
Let current cell be the cell covering slot (x, y).
Set in header block to true.
Add current cell to headers from current header block.
Let blocked be false.
If there are any cells in the opaque headers list anchored with the same x-coordinate as the current cell, and with the same width as current cell, then let blocked be true.
If the current cell is not a column header, then let blocked be true.
If there are any cells in the opaque headers list anchored with the same y-coordinate as the current cell, and with the same height as current cell, then let blocked be true.
If the current cell is not a row header, then let blocked be true.
If blocked is false, then add the current cell to the header list.
Set in header block to false. Add all the cells in headers from current header block to the opaque headers list, and empty the headers from current header block list.
Return to the step labeled loop.
A header cell anchored at the slot with coordinate (x, y) with width width and height height is said to be a column header if any of the following are true:
the cell's scope
attribute is in the column state; or
the cell's scope
attribute is in the auto state, and there are no data cells in any of the
cells covering slots with y-coordinates y .. y+height-1.
A header cell anchored at the slot with coordinate (x, y) with width width and height height is said to be a row header if any of the following are true:
the cell's scope
attribute is in the row state; or
the cell's scope
attribute is in the auto state, the cell is not a column
header, and there are no data cells in any of the cells covering slots with
x-coordinates x .. x+width-1.
A header cell is said to be a column group header if its scope
attribute is in the column group state.
A header cell is said to be a row group header if its scope
attribute is in the row group state.
A cell is said to be an empty cell if it contains no elements and its child text content, if any, consists only of ASCII whitespace.
The following shows how one might mark up the bottom part of table 45 of the Smithsonian physical tables, Volume 71:
<table>
<caption>Specification values: <b>Steel</b>, <b>Castings</b>,
Ann. A.S.T.M. A27-16, Class B;* P max. 0.06; S max. 0.05.</caption>
<thead>
<tr>
<th rowspan=2>Grade.</th>
<th rowspan=2>Yield Point.</th>
<th colspan=2>Ultimate tensile strength</th>
<th rowspan=2>Per cent elong. 50.8 mm or 2 in.</th>
<th rowspan=2>Per cent reduct. area.</th>
</tr>
<tr>
<th>kg/mm<sup>2</sup></th>
<th>lb/in<sup>2</sup></th>
</tr>
</thead>
<tbody>
<tr>
<td>Hard</td>
<td>0.45 ultimate</td>
<td>56.2</td>
<td>80,000</td>
<td>15</td>
<td>20</td>
</tr>
<tr>
<td>Medium</td>
<td>0.45 ultimate</td>
<td>49.2</td>
<td>70,000</td>
<td>18</td>
<td>25</td>
</tr>
<tr>
<td>Soft</td>
<td>0.45 ultimate</td>
<td>42.2</td>
<td>60,000</td>
<td>22</td>
<td>30</td>
</tr>
</tbody>
</table>
This table could look like this:
Grade. | Yield Point. | Ultimate tensile strength | Per cent elong. 50.8 mm or 2 in. | Per cent reduct. area. | |
---|---|---|---|---|---|
kg/mm2 | lb/in2 | ||||
Hard | 0.45 ultimate | 56.2 | 80,000 | 15 | 20 |
Medium | 0.45 ultimate | 49.2 | 70,000 | 18 | 25 |
Soft | 0.45 ultimate | 42.2 | 60,000 | 22 | 30 |
The following shows how one might mark up the gross margin table on page 46 of Apple, Inc's 10-K filing for fiscal year 2008:
<table>
<thead>
<tr>
<th>
<th>2008
<th>2007
<th>2006
<tbody>
<tr>
<th>Net sales
<td>$ 32,479
<td>$ 24,006
<td>$ 19,315
<tr>
<th>Cost of sales
<td> 21,334
<td> 15,852
<td> 13,717
<tbody>
<tr>
<th>Gross margin
<td>$ 11,145
<td>$ 8,154
<td>$ 5,598
<tfoot>
<tr>
<th>Gross margin percentage
<td>34.3%
<td>34.0%
<td>29.0%
</table>
This table could look like this:
2008 | 2007 | 2006 | |
---|---|---|---|
Net sales | $ 32,479 | $ 24,006 | $ 19,315 |
Cost of sales | 21,334 | 15,852 | 13,717 |
Gross margin | $ 11,145 | $ 8,154 | $ 5,598 |
Gross margin percentage | 34.3% | 34.0% | 29.0% |
The following shows how one might mark up the operating expenses table from lower on the same page of that document:
<table>
<colgroup> <col>
<colgroup> <col> <col> <col>
<thead>
<tr> <th> <th>2008 <th>2007 <th>2006
<tbody>
<tr> <th scope=rowgroup> Research and development
<td> $ 1,109 <td> $ 782 <td> $ 712
<tr> <th scope=row> Percentage of net sales
<td> 3.4% <td> 3.3% <td> 3.7%
<tbody>
<tr> <th scope=rowgroup> Selling, general, and administrative
<td> $ 3,761 <td> $ 2,963 <td> $ 2,433
<tr> <th scope=row> Percentage of net sales
<td> 11.6% <td> 12.3% <td> 12.6%
</table>
This table could look like this:
2008 | 2007 | 2006 | |
---|---|---|---|
Research and development | $ 1,109 | $ 782 | $ 712 |
Percentage of net sales | 3.4% | 3.3% | 3.7% |
Selling, general, and administrative | $ 3,761 | $ 2,963 | $ 2,433 |
Percentage of net sales | 11.6% | 12.3% | 12.6% |
A form is a component of a web page that has form controls, such as text, buttons, checkboxes, range, or color picker controls. A user can interact with such a form, providing data that can then be sent to the server for further processing (e.g. returning the results of a search or calculation). No client-side scripting is needed in many cases, though an API is available so that scripts can augment the user experience or use forms for purposes other than submitting data to a server.
Writing a form consists of several steps, which can be performed in any order: writing the user interface, implementing the server-side processing, and configuring the user interface to communicate with the server.
For the purposes of this brief introduction, we will create a pizza ordering form.
Any form starts with a form
element, inside which are placed the controls. Most
controls are represented by the input
element, which by default provides a text
control. To label a control, the label
element is used; the label text and the
control itself go inside the label
element. Each part of a form is considered a
paragraph, and is typically separated from other parts using p
elements.
Putting this together, here is how one might ask for the customer's name:
<form>
<p><label>Customer name: <input></label></p>
</form>
To let the user select the size of the pizza, we can use a set of radio buttons. Radio buttons
also use the input
element, this time with a type
attribute with the value radio
. To make the radio buttons work as a group, they are
given a common name using the name
attribute. To group a batch
of controls together, such as, in this case, the radio buttons, one can use the
fieldset
element. The title of such a group of controls is given by the first element
in the fieldset
, which has to be a legend
element.
<form>
<p><label>Customer name: <input></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size> Small </label></p>
<p><label> <input type=radio name=size> Medium </label></p>
<p><label> <input type=radio name=size> Large </label></p>
</fieldset>
</form>
Changes from the previous step are highlighted.
To pick toppings, we can use checkboxes. These use the input
element with a type
attribute with the value checkbox
:
<form>
<p><label>Customer name: <input></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size> Small </label></p>
<p><label> <input type=radio name=size> Medium </label></p>
<p><label> <input type=radio name=size> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox> Bacon </label></p>
<p><label> <input type=checkbox> Extra Cheese </label></p>
<p><label> <input type=checkbox> Onion </label></p>
<p><label> <input type=checkbox> Mushroom </label></p>
</fieldset>
</form>
The pizzeria for which this form is being written is always making mistakes, so it needs a way
to contact the customer. For this purpose, we can use form controls specifically for telephone
numbers (input
elements with their type
attribute set to tel
) and email addresses
(input
elements with their type
attribute set
to email
):
<form>
<p><label>Customer name: <input></label></p>
<p><label>Telephone: <input type=tel></label></p>
<p><label>Email address: <input type=email></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size> Small </label></p>
<p><label> <input type=radio name=size> Medium </label></p>
<p><label> <input type=radio name=size> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox> Bacon </label></p>
<p><label> <input type=checkbox> Extra Cheese </label></p>
<p><label> <input type=checkbox> Onion </label></p>
<p><label> <input type=checkbox> Mushroom </label></p>
</fieldset>
</form>
We can use an input
element with its type
attribute set to time
to ask for a delivery time. Many
of these form controls have attributes to control exactly what values can be specified; in this
case, three attributes of particular interest are min
, max
, and step
. These set the
minimum time, the maximum time, and the interval between allowed values (in seconds). This
pizzeria only delivers between 11am and 9pm, and doesn't promise anything better than 15 minute
increments, which we can mark up as follows:
<form>
<p><label>Customer name: <input></label></p>
<p><label>Telephone: <input type=tel></label></p>
<p><label>Email address: <input type=email></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size> Small </label></p>
<p><label> <input type=radio name=size> Medium </label></p>
<p><label> <input type=radio name=size> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox> Bacon </label></p>
<p><label> <input type=checkbox> Extra Cheese </label></p>
<p><label> <input type=checkbox> Onion </label></p>
<p><label> <input type=checkbox> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900"></label></p>
</form>
The textarea
element can be used to provide a multiline text control. In this
instance, we are going to use it to provide a space for the customer to give delivery
instructions:
<form>
<p><label>Customer name: <input></label></p>
<p><label>Telephone: <input type=tel></label></p>
<p><label>Email address: <input type=email></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size> Small </label></p>
<p><label> <input type=radio name=size> Medium </label></p>
<p><label> <input type=radio name=size> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox> Bacon </label></p>
<p><label> <input type=checkbox> Extra Cheese </label></p>
<p><label> <input type=checkbox> Onion </label></p>
<p><label> <input type=checkbox> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900"></label></p>
<p><label>Delivery instructions: <textarea></textarea></label></p>
</form>
Finally, to make the form submittable we use the button
element:
<form>
<p><label>Customer name: <input></label></p>
<p><label>Telephone: <input type=tel></label></p>
<p><label>Email address: <input type=email></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size> Small </label></p>
<p><label> <input type=radio name=size> Medium </label></p>
<p><label> <input type=radio name=size> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox> Bacon </label></p>
<p><label> <input type=checkbox> Extra Cheese </label></p>
<p><label> <input type=checkbox> Onion </label></p>
<p><label> <input type=checkbox> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900"></label></p>
<p><label>Delivery instructions: <textarea></textarea></label></p>
<p><button>Submit order</button></p>
</form>
The exact details for writing a server-side processor are out of scope for this specification.
For the purposes of this introduction, we will assume that the script at https://pizza.example.com/order.cgi
is configured to accept submissions using the
application/x-www-form-urlencoded
format,
expecting the following parameters sent in an HTTP POST body:
custname
custtel
custemail
size
small
, medium
, or large
topping
bacon
, cheese
, onion
, and mushroom
delivery
comments
Form submissions are exposed to servers in a variety of ways, most commonly as HTTP GET or POST
requests. To specify the exact method used, the method
attribute is specified on the form
element. This doesn't specify how the form data is
encoded, though; to specify that, you use the enctype
attribute. You also have to specify the URL of the service that will handle the
submitted data, using the action
attribute.
For each form control you want submitted, you then have to give a name that will be used to
refer to the data in the submission. We already specified the name for the group of radio buttons;
the same attribute (name
) also specifies the submission name.
Radio buttons can be distinguished from each other in the submission by giving them different
values, using the value
attribute.
Multiple controls can have the same name; for example, here we give all the checkboxes the same
name, and the server distinguishes which checkbox was checked by seeing which values are submitted
with that name — like the radio buttons, they are also given unique values with the value
attribute.
Given the settings in the previous section, this all becomes:
<form method="post"
enctype="application/x-www-form-urlencoded"
action="https://pizza.example.com/order.cgi">
<p><label>Customer name: <input name="custname"></label></p>
<p><label>Telephone: <input type=tel name="custtel"></label></p>
<p><label>Email address: <input type=email name="custemail"></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size value="small"> Small </label></p>
<p><label> <input type=radio name=size value="medium"> Medium </label></p>
<p><label> <input type=radio name=size value="large"> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
<p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
<p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
<p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery"></label></p>
<p><label>Delivery instructions: <textarea name="comments"></textarea></label></p>
<p><button>Submit order</button></p>
</form>
There is no particular significance to the way some of the attributes have their values quoted and others don't. The HTML syntax allows a variety of equally valid ways to specify attributes, as discussed in the syntax section.
For example, if the customer entered "Denise Lawrence" as their name, "555-321-8642" as their telephone number, did not specify an email address, asked for a medium-sized pizza, selected the Extra Cheese and Mushroom toppings, entered a delivery time of 7pm, and left the delivery instructions text control blank, the user agent would submit the following to the online web service:
custname=Denise+Lawrence&custtel=555-321-8642&custemail=&size=medium&topping=cheese&topping=mushroom&delivery=19%3A00&comments=
Forms can be annotated in such a way that the user agent will check the user's input before the form is submitted. The server still has to verify the input is valid (since hostile users can easily bypass the form validation), but it allows the user to avoid the wait incurred by having the server be the sole checker of the user's input.
The simplest annotation is the required
attribute,
which can be specified on input
elements to indicate that the form is not to be
submitted until a value is given. By adding this attribute to the customer name, pizza size, and
delivery time fields, we allow the user agent to notify the user when the user submits the form
without filling in those fields:
<form method="post"
enctype="application/x-www-form-urlencoded"
action="https://pizza.example.com/order.cgi">
<p><label>Customer name: <input name="custname" required></label></p>
<p><label>Telephone: <input type=tel name="custtel"></label></p>
<p><label>Email address: <input type=email name="custemail"></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size required value="small"> Small </label></p>
<p><label> <input type=radio name=size required value="medium"> Medium </label></p>
<p><label> <input type=radio name=size required value="large"> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
<p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
<p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
<p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery" required></label></p>
<p><label>Delivery instructions: <textarea name="comments"></textarea></label></p>
<p><button>Submit order</button></p>
</form>
It is also possible to limit the length of the input, using the maxlength
attribute. By adding this to the textarea
element, we can limit users to 1000 characters, preventing them from writing huge essays to the
busy delivery drivers instead of staying focused and to the point:
<form method="post"
enctype="application/x-www-form-urlencoded"
action="https://pizza.example.com/order.cgi">
<p><label>Customer name: <input name="custname" required></label></p>
<p><label>Telephone: <input type=tel name="custtel"></label></p>
<p><label>Email address: <input type=email name="custemail"></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size required value="small"> Small </label></p>
<p><label> <input type=radio name=size required value="medium"> Medium </label></p>
<p><label> <input type=radio name=size required value="large"> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
<p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
<p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
<p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery" required></label></p>
<p><label>Delivery instructions: <textarea name="comments" maxlength=1000></textarea></label></p>
<p><button>Submit order</button></p>
</form>
When a form is submitted, invalid
events are
fired at each form control that is invalid. This can be useful for displaying a summary of the
problems with the form, since typically the browser itself will only report one problem at a
time.
Some browsers attempt to aid the user by automatically filling form controls rather than having the user reenter their information each time. For example, a field asking for the user's telephone number can be automatically filled with the user's phone number.
To help the user agent with this, the autocomplete
attribute can be used to describe the field's purpose. In the case of this form, we have three
fields that can be usefully annotated in this way: the information about who the pizza is to be
delivered to. Adding this information looks like this:
<form method="post"
enctype="application/x-www-form-urlencoded"
action="https://pizza.example.com/order.cgi">
<p><label>Customer name: <input name="custname" required autocomplete="shipping name"></label></p>
<p><label>Telephone: <input type=tel name="custtel" autocomplete="shipping tel"></label></p>
<p><label>Email address: <input type=email name="custemail" autocomplete="shipping email"></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size required value="small"> Small </label></p>
<p><label> <input type=radio name=size required value="medium"> Medium </label></p>
<p><label> <input type=radio name=size required value="large"> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
<p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
<p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
<p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery" required></label></p>
<p><label>Delivery instructions: <textarea name="comments" maxlength=1000></textarea></label></p>
<p><button>Submit order</button></p>
</form>
Some devices, in particular those with virtual keyboards can provide the user with multiple input modalities. For example, when typing in a credit card number the user may wish to only see keys for digits 0-9, while when typing in their name they may wish to see a form field that by default capitalizes each word.
Using the inputmode
attribute we can select appropriate
input modalities:
<form method="post"
enctype="application/x-www-form-urlencoded"
action="https://pizza.example.com/order.cgi">
<p><label>Customer name: <input name="custname" required autocomplete="shipping name"></label></p>
<p><label>Telephone: <input type=tel name="custtel" autocomplete="shipping tel"></label></p>
<p><label>Buzzer code: <input name="custbuzz" inputmode="numeric"></label></p>
<p><label>Email address: <input type=email name="custemail" autocomplete="shipping email"></label></p>
<fieldset>
<legend> Pizza Size </legend>
<p><label> <input type=radio name=size required value="small"> Small </label></p>
<p><label> <input type=radio name=size required value="medium"> Medium </label></p>
<p><label> <input type=radio name=size required value="large"> Large </label></p>
</fieldset>
<fieldset>
<legend> Pizza Toppings </legend>
<p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
<p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
<p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
<p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
</fieldset>
<p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery" required></label></p>
<p><label>Delivery instructions: <textarea name="comments" maxlength=1000></textarea></label></p>
<p><button>Submit order</button></p>
</form>
The type
, autocomplete
, and inputmode
attributes can seem confusingly similar. For instance,
in all three cases, the string "email
" is a valid value. This section
attempts to illustrate the difference between the three attributes and provides advice suggesting
how to use them.
The type
attribute on input
elements decides
what kind of control the user agent will use to expose the field. Choosing between different
values of this attribute is the same choice as choosing whether to use an input
element, a textarea
element, a select
element, etc.
The autocomplete
attribute, in contrast, describes
what the value that the user will enter actually represents. Choosing between different values of
this attribute is the same choice as choosing what the label for the element will be.
First, consider telephone numbers. If a page is asking for a telephone number from the user,
the right form control to use is <input type=tel>
.
However, which autocomplete
value to use depends on
which phone number the page is asking for, whether they expect a telephone number in the
international format or just the local format, and so forth.
For example, a page that forms part of a checkout process on an e-commerce site for a customer buying a gift to be shipped to a friend might need both the buyer's telephone number (in case of payment issues) and the friend's telephone number (in case of delivery issues). If the site expects international phone numbers (with the country code prefix), this could thus look like this:
<p><label>Your phone number: <input type=tel name=custtel autocomplete="billing tel"></label>
<p><label>Recipient's phone number: <input type=tel name=shiptel autocomplete="shipping tel"></label>
<p>Please enter complete phone numbers including the country code prefix, as in "+1 555 123 4567".
But if the site only supports British customers and recipients, it might instead look like this
(notice the use of tel-national
rather than
tel
):
<p><label>Your phone number: <input type=tel name=custtel autocomplete="billing tel-national"></label>
<p><label>Recipient's phone number: <input type=tel name=shiptel autocomplete="shipping tel-national"></label>
<p>Please enter complete UK phone numbers, as in "(01632) 960 123".
Now, consider a person's preferred languages. The right autocomplete
value is language
. However, there could be a number of
different form controls used for the purpose: a text control (<input type=text>
), a drop-down list (<select>
), radio buttons (<input
type=radio>
), etc. It only depends on what kind of interface is desired.
Finally, consider names. If a page just wants one name from the user, then the relevant control
is <input type=text>
. If the page is asking for the
user's full name, then the relevant autocomplete
value
is name
.
<p><label>Japanese name: <input name="j" type="text" autocomplete="section-jp name"></label>
<label>Romanized name: <input name="e" type="text" autocomplete="section-en name"></label>
In this example, the "section-*
" keywords in
the autocomplete
attributes' values tell the user agent
that the two fields expect different names. Without them, the user agent could
automatically fill the second field with the value given in the first field when the user gave a
value to the first field.
The "-jp
" and "-en
" parts of the
keywords are opaque to the user agent; the user agent cannot guess, from those, that the two names
are expected to be in Japanese and English respectively.
Separate from the choices regarding type
and autocomplete
, the inputmode
attribute decides what kind of input modality (e.g.,
virtual keyboard) to use, when the control is a text control.
Consider credit card numbers. The appropriate input type is not <input type=number>
, as explained below; it is instead <input type=text>
. To encourage the user agent to use a
numeric input modality anyway (e.g., a virtual keyboard displaying only digits), the page would
use
<p><label>Credit card number:
<input name="cc" type="text" inputmode="numeric" pattern="[0-9]{8,19}" autocomplete="cc-number">
</label></p>
In this pizza delivery example, the times are specified in the format "HH:MM": two digits for the hour, in 24-hour format, and two digits for the time. (Seconds could also be specified, though they are not necessary in this example.)
In some locales, however, times are often expressed differently when presented to users. For example, in the United States, it is still common to use the 12-hour clock with an am/pm indicator, as in "2pm". In France, it is common to separate the hours from the minutes using an "h" character, as in "14h00".
Similar issues exist with dates, with the added complication that even the order of the components is not always consistent — for example, in Cyprus the first of February 2003 would typically be written "1/2/03", while that same date in Japan would typically be written as "2003年02月01日" — and even with numbers, where locales differ, for example, in what punctuation is used as the decimal separator and the thousands separator.
It is therefore important to distinguish the time, date, and number formats used in HTML and in form submissions, which are always the formats defined in this specification (and based on the well-established ISO 8601 standard for computer-readable date and time formats), from the time, date, and number formats presented to the user by the browser and accepted as input from the user by the browser.
The format used "on the wire", i.e., in HTML markup and in form submissions, is intended to be computer-readable and consistent irrespective of the user's locale. Dates, for instance, are always written in the format "YYYY-MM-DD", as in "2003-02-01". While some users might see this format, others might see it as "01.02.2003" or "February 1, 2003".
The time, date, or number given by the page in the wire format is then translated to the user's preferred presentation (based on user preferences or on the locale of the page itself), before being displayed to the user. Similarly, after the user inputs a time, date, or number using their preferred format, the user agent converts it back to the wire format before putting it in the DOM or submitting it.
This allows scripts in pages and on servers to process times, dates, and numbers in a consistent manner without needing to support dozens of different formats, while still supporting the users' needs.
See also the implementation notes regarding localization of form controls.
Mostly for historical reasons, elements in this section fall into several overlapping (but subtly different) categories in addition to the usual ones like flow content, phrasing content, and interactive content.
A number of the elements are form-associated elements, which means they can have a form owner.
button
fieldset
input
object
output
select
textarea
img
The form-associated elements fall into several subcategories:
Denotes elements that are listed in the form.elements
and fieldset.elements
APIs. These elements also
have a form
content attribute, and a matching form
IDL attribute, that allow authors to specify an explicit
form owner.
button
fieldset
input
object
output
select
textarea
Denotes elements that can be used for constructing the entry list when a
form
element is submitted.
button
input
select
textarea
Some submittable elements can be, depending on their attributes, buttons. The prose below defines when an element is a button. Some buttons are specifically submit buttons.
Denotes elements that can be affected when a form
element is reset.
input
output
select
textarea
Denotes elements that inherit the autocapitalize
and autocorrect
attributes from their form
owner.
button
fieldset
input
output
select
textarea
Some elements, not all of them form-associated,
are categorized as labelable elements. These are elements that
can be associated with a label
element.
button
input
(if the type
attribute is not in the Hidden state)meter
output
progress
select
textarea
form
elementform
element descendants.accept-charset
action
autocomplete
enctype
method
name
novalidate
target
rel
[Exposed=Window,
LegacyOverrideBuiltIns,
LegacyUnenumerableNamedProperties]
interface HTMLFormElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString acceptCharset;
[CEReactions] attribute USVString action;
[CEReactions] attribute DOMString autocomplete;
[CEReactions] attribute DOMString enctype;
[CEReactions] attribute DOMString encoding;
[CEReactions] attribute DOMString method;
[CEReactions] attribute DOMString name;
[CEReactions] attribute boolean noValidate;
[CEReactions] attribute DOMString target;
[CEReactions] attribute DOMString rel;
[SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[SameObject] readonly attribute HTMLFormControlsCollection elements;
readonly attribute unsigned long length;
getter Element (unsigned long index);
getter (RadioNodeList or Element) (DOMString name);
undefined submit();
undefined requestSubmit(optional HTMLElement? submitter = null);
[CEReactions] undefined reset();
boolean checkValidity();
boolean reportValidity();
};
HTMLFormElement
.The form
element represents a hyperlink that can be
manipulated through a collection of form-associated
elements, some of which can represent editable values that can be submitted to a server for
processing.
The accept-charset
attribute gives the character
encodings that are to be used for the submission. If specified, the value must be an ASCII
case-insensitive match for "UTF-8
". ENCODING
The name
attribute
represents the form
's name within the forms
collection. The value must not be the empty string, and the value must be unique amongst the
form
elements in the forms
collection that
it is in, if any.
The autocomplete
attribute is an enumerated
attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
on
| on | Form controls will have their autofill field name set to "on " by default.
|
off
| off | Form controls will have their autofill field name set to "off " by default.
|
The attribute's missing value default and invalid value default are both the on state.
The action
, enctype
,
method
, novalidate
,
and target
attributes are attributes for form
submission.
The rel
attribute on
form
elements controls what kinds of links the elements create. The attribute's value
must be a unordered set of unique space-separated tokens. The allowed keywords and their meanings are defined in an earlier section.
rel
's supported
tokens are the keywords defined in HTML link types which are
allowed on form
elements, impact the processing model, and are supported by the user
agent. The possible supported tokens are noreferrer
, noopener
, and opener
. rel
's supported tokens must only include the tokens from this
list that the user agent implements the processing model for.
form.elements
Returns an HTMLFormControlsCollection
of the form controls in the form
(excluding image buttons for historical reasons).
form.length
Returns the number of form controls in the form (excluding image buttons for historical reasons).
form[index]
Returns the indexth element in the form (excluding image buttons for historical reasons).
form[name]
Returns the form control (or, if there are several, a RadioNodeList
of the form
controls) in the form with the given ID or name
(excluding image buttons for historical reasons); or, if there
are none, returns the img
element with the given ID.
Once an element has been referenced using a particular name, that name will continue being
available as a way to reference that element in this method, even if the element's actual ID or name
changes, for as long as
the element remains in the tree.
If there are multiple matching items, then a RadioNodeList
object containing all
those elements is returned.
form.submit()
Submits the form, bypassing interactive
constraint validation and without firing a submit
event.
form.requestSubmit([ submitter ])
Requests to submit the form. Unlike submit()
, this
method includes interactive constraint
validation and firing a submit
event, either of which
can cancel submission.
The submitter argument can be used to point to a specific submit button, whose formaction
, formenctype
, formmethod
, formnovalidate
, and formtarget
attributes can impact submission. Additionally,
the submitter will be included when constructing the entry list for submission;
normally, buttons are excluded.
form.reset()
Resets the form.
form.checkValidity()
Returns true if the form's controls are all valid; otherwise, returns false.
form.reportValidity()
Returns true if the form's controls are all valid; otherwise, returns false and informs the user.
The autocomplete
IDL attribute must reflect
the content attribute of the same name, limited to only known values.
The name
and
rel
IDL attributes
must reflect the content attribute of the same name.
The acceptCharset
IDL attribute must reflect
the accept-charset
content attribute.
The relList
IDL attribute must reflect the rel
content
attribute.
The elements
IDL attribute must return an HTMLFormControlsCollection
rooted at the
form
element's root, whose filter matches listed elements whose form owner is the
form
element, with the exception of input
elements whose type
attribute is in the Image Button state, which must, for historical reasons, be
excluded from this particular collection.
The length
IDL
attribute must return the number of nodes represented by the elements
collection.
The supported property indices at any instant are the indices supported by the
object returned by the elements
attribute at that
instant.
To determine the value of an indexed property for a
form
element, the user agent must return the value returned by the item
method on the elements
collection, when invoked with the given index as its
argument.
Each form
element has a mapping of names to elements called the past names
map. It is used to persist names of controls even when they change names.
The supported property names consist of the names obtained from the following algorithm, in the order obtained from this algorithm:
Let sourced names be an initially empty ordered list of tuples consisting of a string, an element, a source, where the source is either id, name, or past, and, if the source is past, an age.
For each listed element candidate
whose form owner is the form
element, with the exception of any
input
elements whose type
attribute is in the
Image Button state:
If candidate has an id
attribute, add
an entry to sourced names with that id
attribute's value as the string, candidate as the element, and id as
the source.
If candidate has a name
attribute,
add an entry to sourced names with that name
attribute's value as the string, candidate
as the element, and name as the source.
For each img
element candidate whose form owner is the
form
element:
If candidate has an id
attribute, add
an entry to sourced names with that id
attribute's value as the string, candidate as the element, and id as
the source.
If candidate has a name
attribute,
add an entry to sourced names with that name
attribute's value as the string, candidate
as the element, and name as the source.
For each entry past entry in the past names map, add an entry to sourced names with the past entry's name as the string, past entry's element as the element, past as the source, and the length of time past entry has been in the past names map as the age.
Sort sourced names by tree order of the element entry of each tuple, sorting entries with the same element by putting entries whose source is id first, then entries whose source is name, and finally entries whose source is past, and sorting entries with the same element and source by their age, oldest first.
Remove any entries in sourced names that have the empty string as their name.
Remove any entries in sourced names that have the same name as an earlier entry in the map.
Return the list of names from sourced names, maintaining their relative order.
To determine the value of a named property name
for a form
element, the user agent must run the following steps:
Let candidates be a live RadioNodeList
object
containing all the listed elements, whose form
owner is the form
element, that have either an id
attribute or a name
attribute equal
to name, with the exception of input
elements whose type
attribute is in the Image Button state, in tree order.
If candidates is empty, let candidates be a live
RadioNodeList
object containing all the img
elements, whose form
owner is the form
element, that have either an id
attribute or a name
attribute
equal to name, in tree order.
If candidates is empty, name is the name of one of
the entries in the form
element's past names map: return the object
associated with name in that map.
If candidates contains more than one node, return candidates.
Otherwise, candidates contains exactly one node. Add a mapping from
name to the node in candidates in the form
element's past names map, replacing the previous entry with the same name, if
any.
Return the node in candidates.
If an element listed in a form
element's past names map changes
form owner, then its entries must be removed from that map.
The submit()
method steps are to submit this from
this, with submitted from submit()
method set to true.
The requestSubmit(submitter)
method, when
invoked, must run the following steps:
If submitter is not null, then:
If submitter is not a submit
button, then throw a TypeError
.
If submitter's form owner is not this form
element,
then throw a "NotFoundError
" DOMException
.
Otherwise, set submitter to this form
element.
Submit this form
element, from
submitter.
The reset()
method, when invoked, must run the following steps:
If the form
element is marked as locked for reset, then return.
Mark the form
element as locked for reset.
Reset the form
element.
Unmark the form
element as locked for reset.
If the checkValidity()
method is invoked, the user agent
must statically validate the constraints of the form
element, and return
true if the constraint validation return a positive result, and false if it returned a
negative result.
If the reportValidity()
method is invoked, the user agent
must interactively validate the constraints of the form
element, and
return true if the constraint validation return a positive result, and false if it returned
a negative result.
This example shows two search forms:
<form action="https://www.google.com/search" method="get">
<label>Google: <input type="search" name="q"></label> <input type="submit" value="Search...">
</form>
<form action="https://www.bing.com/search" method="get">
<label>Bing: <input type="search" name="q"></label> <input type="submit" value="Search...">
</form>
label
elementlabel
elements.for
[Exposed=Window]
interface HTMLLabelElement : HTMLElement {
[HTMLConstructor] constructor();
readonly attribute HTMLFormElement? form;
[CEReactions] attribute DOMString htmlFor;
readonly attribute HTMLElement? control;
};
HTMLLabelElement
.The label
element represents a caption in a user interface. The
caption can be associated with a specific form control, known as the
label
element's labeled control, either using the for
attribute, or by putting the form control inside the
label
element itself.
Except where otherwise specified by the following rules, a label
element has no
labeled control.
The for
attribute may
be specified to indicate a form control with which the caption is to be associated. If the
attribute is specified, the attribute's value must be the ID of a
labelable element in the same tree as the
label
element. If the attribute is specified and there is an element in
the tree whose ID is equal to the value of the for
attribute, and the first such element in tree
order is a labelable element, then that element is the
label
element's labeled control.
If the for
attribute is not specified, but the
label
element has a labelable element descendant,
then the first such descendant in tree order is the label
element's
labeled control.
The label
element's exact default presentation and behavior, in particular what
its activation behavior might be, if anything, should match the platform's label
behavior. The activation behavior of a label
element for events targeted
at interactive content descendants of a label
element, and any
descendants of those interactive content descendants, must be to do nothing.
Form-associated custom
elements are labelable elements, so for user agents
where the label
element's activation behavior impacts the labeled
control, both built-in and custom elements will be impacted.
For example, on platforms where clicking a label activates the form control, clicking the
label
in the following snippet could trigger the user agent to fire a click
event at the input
element, as if the
element itself had been triggered by the user:
<label><input type=checkbox name=lost> Lost</label>
Similarly, assuming my-checkbox
was declared as a
form-associated custom element (like in this
example), then the code
<label><my-checkbox name=lost></my-checkbox> Lost</label>
would have the same behavior, firing a click
event at the my-checkbox
element.
On other platforms, the behavior in both cases might be just to focus the control, or to do nothing.
The following example shows three form controls each with a label, two of which have small text showing the right format for users to use.
<p><label>Full name: <input name=fn> <small>Format: First Last</small></label></p>
<p><label>Age: <input name=age type=number min=0></label></p>
<p><label>Post code: <input name=pc> <small>Format: AB12 3CD</small></label></p>
label.control
Returns the form control that is associated with this element.
label.form
Returns the form owner of the form control that is associated with this element.
Returns null if there isn't one.
The htmlFor
IDL attribute must reflect the for
content
attribute.
The control
IDL attribute must return the label
element's labeled control, if any,
or null if there isn't one.
The form
IDL
attribute must run the following steps:
If the label
element has no labeled control, then return
null.
If the label
element's labeled control is not a
form-associated element, then return null.
Return the label
element's labeled control's form
owner (which can still be null).
The form
IDL attribute on the
label
element is different from the form
IDL
attribute on listed form-associated elements, and the label
element does not have a form
content attribute.
control.labels
Returns a NodeList
of all the label
elements that the form control
is associated with.
Labelable elements and all input
elements
have a live NodeList
object associated with them that represents the
list of label
elements, in tree order, whose labeled
control is the element in question. The labels
IDL attribute of labelable elements that are not form-associated custom elements, and the labels
IDL attribute of input
elements, on getting,
must return that NodeList
object, and that same value must always be returned, unless
this element is an input
element whose type
attribute is in the Hidden state, in which case it
must instead return null.
Form-associated custom elements don't have
a labels
IDL attribute. Instead, their
ElementInternals
object has a labels
IDL attribute. On getting, it must throw
a "NotSupportedError
" DOMException
if the target element is not a form-associated custom
element. Otherwise, it must return that NodeList
object, and that same value
must always be returned.
This (non-conforming) example shows what happens to the NodeList
and what labels
returns when an input
element has its type
attribute changed.
<!doctype html>
<p><label><input></label></p>
<script>
const input = document.querySelector('input');
const labels = input.labels;
console.assert(labels.length === 1);
input.type = 'hidden';
console.assert(labels.length === 0); // the input is no longer the label's labeled control
console.assert(input.labels === null);
input.type = 'checkbox';
console.assert(labels.length === 1); // the input is once again the label's labeled control
console.assert(input.labels === labels); // same value as returned originally
</script>
input
elementtype
attribute is not in the Hidden state: Interactive content.type
attribute is not in the Hidden state: Listed, labelable, submittable, resettable, and autocapitalize-and-autocorrect inheriting form-associated element.type
attribute is in the Hidden state: Listed, submittable, resettable, and autocapitalize-and-autocorrect inheriting form-associated element.type
attribute is not in the Hidden state: Palpable content.accept
alpha
alt
autocomplete
checked
colorspace
dirname
disabled
form
formaction
formenctype
formmethod
formnovalidate
formtarget
height
list
max
maxlength
min
minlength
multiple
name
pattern
placeholder
popovertarget
popovertargetaction
readonly
required
size
src
step
type
value
width
title
attribute has special semantics on this element.type
attribute in the Hidden state: for authors; for implementers.type
attribute in the Text state: for authors; for implementers.type
attribute in the Search state: for authors; for implementers.type
attribute in the Telephone state: for authors; for implementers.type
attribute in the URL state: for authors; for implementers.type
attribute in the Email state: for authors; for implementers.type
attribute in the Password state: for authors; for implementers.type
attribute in the Date state: for authors; for implementers.type
attribute in the Month state: for authors; for implementers.type
attribute in the Week state: for authors; for implementers.type
attribute in the Time state: for authors; for implementers.type
attribute in the Local Date and Time state: for authors; for implementers.type
attribute in the Number state: for authors; for implementers.type
attribute in the Range state: for authors; for implementers.type
attribute in the Color state: for authors; for implementers.type
attribute in the Checkbox state: for authors; for implementers.type
attribute in the Radio Button state: for authors; for implementers.type
attribute in the File Upload state: for authors; for implementers.type
attribute in the Submit Button state: for authors; for implementers.type
attribute in the Image Button state: for authors; for implementers.type
attribute in the Reset Button state: for authors; for implementers.type
attribute in the Button state: for authors; for implementers.[Exposed=Window]
interface HTMLInputElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString accept;
[CEReactions] attribute boolean alpha;
[CEReactions] attribute DOMString alt;
[CEReactions] attribute DOMString autocomplete;
[CEReactions] attribute boolean defaultChecked;
attribute boolean checked;
[CEReactions] attribute DOMString colorSpace;
[CEReactions] attribute DOMString dirName;
[CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
attribute FileList? files;
[CEReactions] attribute USVString formAction;
[CEReactions] attribute DOMString formEnctype;
[CEReactions] attribute DOMString formMethod;
[CEReactions] attribute boolean formNoValidate;
[CEReactions] attribute DOMString formTarget;
[CEReactions] attribute unsigned long height;
attribute boolean indeterminate;
readonly attribute HTMLDataListElement? list;
[CEReactions] attribute DOMString max;
[CEReactions] attribute long maxLength;
[CEReactions] attribute DOMString min;
[CEReactions] attribute long minLength;
[CEReactions] attribute boolean multiple;
[CEReactions] attribute DOMString name;
[CEReactions] attribute DOMString pattern;
[CEReactions] attribute DOMString placeholder;
[CEReactions] attribute boolean readOnly;
[CEReactions] attribute boolean required;
[CEReactions] attribute unsigned long size;
[CEReactions] attribute USVString src;
[CEReactions] attribute DOMString step;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString defaultValue;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString value;
attribute object? valueAsDate;
attribute unrestricted double valueAsNumber;
[CEReactions] attribute unsigned long width;
undefined stepUp(optional long n = 1);
undefined stepDown(optional long n = 1);
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
undefined setCustomValidity(DOMString error);
readonly attribute NodeList? labels;
undefined select();
attribute unsigned long? selectionStart;
attribute unsigned long? selectionEnd;
attribute DOMString? selectionDirection;
undefined setRangeText(DOMString replacement);
undefined setRangeText(DOMString replacement, unsigned long start, unsigned long end, optional SelectionMode selectionMode = "preserve");
undefined setSelectionRange(unsigned long start, unsigned long end, optional DOMString direction);
undefined showPicker();
// also has obsolete members
};
HTMLInputElement includes PopoverInvokerElement;
HTMLInputElement
.The input
element represents a typed data field, usually with a form
control to allow the user to edit the data.
The type
attribute
controls the data type (and associated control) of the element. It is an enumerated
attribute with the following keywords and states:
Keyword | State | Data type | Control type |
---|---|---|---|
hidden
| Hidden | An arbitrary string | n/a |
text
| Text | Text with no line breaks | A text control |
search
| Search | Text with no line breaks | Search control |
tel
| Telephone | Text with no line breaks | A text control |
url
| URL | An absolute URL | A text control |
email
| An email address or list of email addresses | A text control | |
password
| Password | Text with no line breaks (sensitive information) | A text control that obscures data entry |
date
| Date | A date (year, month, day) with no time zone | A date control |
month
| Month | A date consisting of a year and a month with no time zone | A month control |
week
| Week | A date consisting of a week-year number and a week number with no time zone | A week control |
time
| Time | A time (hour, minute, seconds, fractional seconds) with no time zone | A time control |
datetime-local
| Local Date and Time | A date and time (year, month, day, hour, minute, second, fraction of a second) with no time zone | A date and time control |
number
| Number | A numerical value | A text control or spinner control |
range
| Range | A numerical value, with the extra semantic that the exact value is not important | A slider control or similar |
color
| Color | An sRGB color with 8-bit red, green, and blue components | A color picker |
checkbox
| Checkbox | A set of zero or more values from a predefined list | A checkbox |
radio
| Radio Button | An enumerated value | A radio button |
file
| File Upload | Zero or more files each with a MIME type and optionally a filename | A label and a button |
submit
| Submit Button | An enumerated value, with the extra semantic that it must be the last value selected and initiates form submission | A button |
image
| Image Button | A coordinate, relative to a particular image's size, with the extra semantic that it must be the last value selected and initiates form submission | Either a clickable image, or a button |
reset
| Reset Button | n/a | A button |
button
| Button | n/a | A button |
The attribute's missing value default and invalid value default are both the Text state.
Which of the
accept
,
alpha
,
alt
,
autocomplete
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
readonly
,
required
,
size
,
src
,
step
, and
width
content attributes, the
checked
,
files
,
valueAsDate
,
valueAsNumber
, and
list
IDL attributes, the
select()
method, the
selectionStart
,
selectionEnd
, and
selectionDirection
, IDL attributes, the
setRangeText()
and
setSelectionRange()
methods, the
stepUp()
and
stepDown()
methods, and the
input
and
change
events apply to an
input
element depends on the state of its
type
attribute.
The subsections that define each type also clearly define in normative "bookkeeping" sections
which of these feature apply, and which do not apply, to each type. The behavior of
these features depends on whether they apply or not, as defined in their various sections (q.v.
for content attributes, for APIs, for events).
The following table is non-normative and summarizes which of those content attributes, IDL attributes, methods, and events apply to each state:
Hidden | Text, Search | Telephone, URL | Password | Date, Month, Week, Time | Local Date and Time | Number | Range | Color | Checkbox, Radio Button | File Upload | Submit Button | Image Button | Reset Button, Button | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Content attributes | |||||||||||||||
accept
| · | · | · | · | · | · | · | · | · | · | · | Yes | · | · | · |
alpha
| · | · | · | · | · | · | · | · | · | Yes | · | · | · | · | · |
alt
| · | · | · | · | · | · | · | · | · | · | · | · | · | Yes | · |
autocomplete
| Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | · | · | · | · | · |
checked
| · | · | · | · | · | · | · | · | · | · | Yes | · | · | · | · |
colorspace
| · | · | · | · | · | · | · | · | · | Yes | · | · | · | · | · |
dirname
| Yes | Yes | Yes | Yes | Yes | · | · | · | · | · | · | · | Yes | · | · |
formaction
| · | · | · | · | · | · | · | · | · | · | · | · | Yes | Yes | · |
formenctype
| · | · | · | · | · | · | · | · | · | · | · | · | Yes | Yes | · |
formmethod
| · | · | · | · | · | · | · | · | · | · | · | · | Yes | Yes | · |
formnovalidate
| · | · | · | · | · | · | · | · | · | · | · | · | Yes | Yes | · |
formtarget
| · | · | · | · | · | · | · | · | · | · | · | · | Yes | Yes | · |
height
| · | · | · | · | · | · | · | · | · | · | · | · | · | Yes | · |
list
| · | Yes | Yes | Yes | · | Yes | Yes | Yes | Yes | Yes | · | · | · | · | · |
max
| · | · | · | · | · | Yes | Yes | Yes | Yes | · | · | · | · | · | · |
maxlength
| · | Yes | Yes | Yes | Yes | · | · | · | · | · | · | · | · | · | · |
min
| · | · | · | · | · | Yes | Yes | Yes | Yes | · | · | · | · | · | · |
minlength
| · | Yes | Yes | Yes | Yes | · | · | · | · | · | · | · | · | · | · |
multiple
| · | · | · | Yes | · | · | · | · | · | · | · | Yes | · | · | · |
pattern
| · | Yes | Yes | Yes | Yes | · | · | · | · | · | · | · | · | · | · |
placeholder
| · | Yes | Yes | Yes | Yes | · | · | Yes | · | · | · | · | · | · | · |
popovertarget
| · | · | · | · | · | · | · | · | · | · | · | · | Yes | Yes | Yes |
popovertargetaction
| · | · | · | · | · | · | · | · | · | · | · | · | Yes | Yes | Yes |
readonly
| · | Yes | Yes | Yes | Yes | Yes | Yes | Yes | · | · | · | · | · | · | · |
required
| · | Yes | Yes | Yes | Yes | Yes | Yes | Yes | · | · | Yes | Yes | · | · | · |
size
| · | Yes | Yes | Yes | Yes | · | · | · | · | · | · | · | · | · | · |
src
| · | · | · | · | · | · | · | · | · | · | · | · | · | Yes | · |
step
| · | · | · | · | · | Yes | Yes | Yes | Yes | · | · | · | · | · | · |
width
| · | · | · | · | · | · | · | · | · | · | · | · | · | Yes | · |
IDL attributes and methods | |||||||||||||||
checked
| · | · | · | · | · | · | · | · | · | · | Yes | · | · | · | · |
files
| · | · | · | · | · | · | · | · | · | · | · | Yes | · | · | · |
value
| default | value | value | value | value | value | value | value | value | value | default/on | filename | default | default | default |
valueAsDate
| · | · | · | · | · | Yes | · | · | · | · | · | · | · | · | · |
valueAsNumber
| · | · | · | · | · | Yes | Yes | Yes | Yes | · | · | · | · | · | · |
list
| · | Yes | Yes | Yes | · | Yes | Yes | Yes | Yes | Yes | · | · | · | · | · |
select()
| · | Yes | Yes | Yes† | Yes | Yes† | Yes† | Yes† | · | Yes† | · | Yes† | · | · | · |
selectionStart
| · | Yes | Yes | · | Yes | · | · | · | · | · | · | · | · | · | · |
selectionEnd
| · | Yes | Yes | · | Yes | · | · | · | · | · | · | · | · | · | · |
selectionDirection
| · | Yes | Yes | · | Yes | · | · | · | · | · | · | · | · | · | · |
setRangeText()
| · | Yes | Yes | · | Yes | · | · | · | · | · | · | · | · | · | · |
setSelectionRange()
| · | Yes | Yes | · | Yes | · | · | · | · | · | · | · | · | · | · |
stepDown()
| · | · | · | · | · | Yes | Yes | Yes | Yes | · | · | · | · | · | · |
stepUp()
| · | · | · | · | · | Yes | Yes | Yes | Yes | · | · | · | · | · | · |
Events | |||||||||||||||
input event
| · | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | · | · | · |
change event
| · | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | · | · | · |
† If the control has no selectable text, the select()
method results in a no-op, with no
"InvalidStateError
" DOMException
.
Some states of the type
attribute define a value
sanitization algorithm.
Each input
element has a value, which is
exposed by the value
IDL attribute. Some states define an
algorithm to convert a string to a number,
an algorithm to convert a number to a
string, an algorithm to convert a string to a
Date
object, and an algorithm to
convert a Date
object to a string, which are used by max
, min
, step
, valueAsDate
,
valueAsNumber
, and stepUp()
.
An input
element's dirty value flag must be
set to true whenever the user interacts with the control in a way that changes the value. (It is also set to true when the value is programmatically
changed, as described in the definition of the value
IDL
attribute.)
The value
content
attribute gives the default value of the input
element. When the value
content attribute is
added, set, or removed, if the control's dirty value flag
is false, the user agent must set the value of the element
to the value of the value
content attribute, if there is
one, or the empty string otherwise, and then run the current value sanitization
algorithm, if one is defined.
Each input
element has a checkedness,
which is exposed by the checked
IDL attribute.
Each input
element has a boolean dirty checkedness flag. When it is true, the
element is said to have a dirty checkedness.
The dirty checkedness flag must be initially
set to false when the element is created, and must be set to true whenever the user interacts with
the control in a way that changes the checkedness.
The checked
content attribute is a boolean attribute that gives the default checkedness of the input
element. When the checked
content attribute is added, if
the control does not have dirty checkedness, the user
agent must set the checkedness of the element to true;
when the checked
content attribute is removed, if the
control does not have dirty checkedness, the user
agent must set the checkedness of the element to
false.
The reset algorithm for input
elements is to set its user validity,
dirty value flag, and
dirty checkedness flag
back to false, set the value of the element to the value
of the value
content attribute, if there is one, or the
empty string otherwise, set the checkedness of the
element to true if the element has a checked
content
attribute and false if it does not, empty the list of selected files, and then invoke the value
sanitization algorithm, if the type
attribute's
current state defines one.
Each input
element can be mutable. Except where
otherwise specified, an input
element is always mutable. Similarly, except where otherwise specified, the user
agent should not allow the user to modify the element's value or checkedness.
When an input
element is disabled, it is not mutable.
The readonly
attribute can also in some
cases (e.g. for the Date state, but not the Checkbox state) stop an input
element from
being mutable.
The cloning steps for input
elements
must propagate the value, dirty value flag, checkedness, and dirty checkedness flag from the node being cloned
to the copy.
The activation behavior for input
elements element, given
event, are these steps:
If element is not mutable and is not in the Checkbox state and is not in the Radio state, then return.
Run element's input activation behavior, if any, and do nothing otherwise.
Run the popover target attribute activation behavior given element and event's target.
Recall that an element's activation behavior runs for both
user-initiated activations and for synthetic activations (e.g., via el.click()
). User agents might also have behaviors for a given control — not
specified here — that are triggered only by true user-initiated activations. A common choice is to
show the picker, if applicable, for the control. In contrast, the input
activation behavior only shows pickers for the special historical cases of the File Upload and Color states.
The legacy-pre-activation behavior for input
elements are these
steps:
If this element's type
attribute is in the Checkbox state, then set this element's checkedness to its opposite value (i.e. true if it is false,
false if it is true) and set this element's indeterminate
IDL attribute to false.
If this element's type
attribute is in the Radio Button state, then get a reference to the element in
this element's radio button group that has its checkedness set to true, if any, and then set this element's
checkedness to true.
The legacy-canceled-activation behavior for input
elements are these
steps:
If the element's type
attribute is in the Checkbox state, then set the element's checkedness and the element's indeterminate
IDL attribute back to the values they had
before the legacy-pre-activation behavior was run.
If this element's type
attribute is in the Radio Button state, then if the element to which a
reference was obtained in the legacy-pre-activation behavior, if any, is still in
what is now this element's radio button group, if it still has one, and if so,
setting that element's checkedness to true; or else, if
there was no such element, or that element is no longer in this element's radio button
group, or if this element no longer has a radio button group, setting this
element's checkedness to false.
When an input
element is first created, the element's rendering and behavior must
be set to the rendering and behavior defined for the type
attribute's state, and the value sanitization algorithm, if one is defined for the
type
attribute's state, must be invoked.
When an input
element's type
attribute
changes state, the user agent must run the following steps:
If the previous state of the element's type
attribute
put the value
IDL attribute in the value mode, and the element's value is not the empty string, and the new state of the element's
type
attribute puts the value
IDL attribute in either the default mode or the default/on mode, then set the element's value
content attribute to the element's value.
Otherwise, if the previous state of the element's type
attribute put the value
IDL attribute in any mode other than the value mode, and the
new state of the element's type
attribute puts the value
IDL attribute in the value mode, then set the value of the element to the value of the value
content attribute, if there is one, or the empty string
otherwise, and then set the control's dirty value flag to
false.
Otherwise, if the previous state of the element's type
attribute put the value
IDL attribute in any mode other than the filename mode, and the new state of the element's type
attribute puts the value
IDL attribute in the filename mode, then set the value of the element to the empty string.
Update the element's rendering and behavior to the new state's.
Signal a type change for the element. (The Radio Button state uses this, in particular.)
Invoke the value sanitization algorithm, if one is defined for the type
attribute's new state.
Let previouslySelectable be true if setRangeText()
previously applied to the element, and false otherwise.
Let nowSelectable be true if setRangeText()
now applies to the element, and false otherwise.
If previouslySelectable is false and nowSelectable is true, set the
element's text entry cursor position to the
beginning of the text control, and set its selection
direction to "none
".
The name
attribute represents the element's name.
The dirname
attribute controls how the element's directionality is submitted.
The disabled
attribute is used to make the control non-interactive and to prevent its value from being submitted.
The form
attribute is used to explicitly associate the input
element with its form owner.
The autocomplete
attribute controls how the user agent provides autofill behavior.
The indeterminate
IDL attribute must initially be set to
false. On getting, it must return the last value it was set to. On setting, it must be set to the
new value. It has no effect except for changing the appearance of checkbox controls.
The accept
,
alpha
, alt
, max
, min
, multiple
, pattern
, placeholder
, required
, size
, src
, and step
IDL attributes must
reflect the respective content attributes of the same name. The dirName
IDL attribute must
reflect the dirname
content attribute. The readOnly
IDL
attribute must reflect the readonly
content
attribute. The defaultChecked
IDL attribute must
reflect the checked
content attribute. The
defaultValue
IDL attribute must reflect
the value
content attribute.
The colorSpace
IDL attribute must reflect the
colorspace
content attribute, limited to only
known values. The type
IDL attribute must reflect the respective
content attribute of the same name, limited to only known values. The maxLength
IDL attribute
must reflect the maxlength
content
attribute, limited to only non-negative numbers. The minLength
IDL
attribute must reflect the minlength
content attribute, limited to only non-negative numbers.
The IDL attributes width
and height
must return the rendered width and height of the
image, in CSS pixels, if an image is being rendered; or
else the natural width and height of the image, in
CSS pixels, if an image is available but not being rendered; or else 0,
if no image is available. When the input
element's type
attribute is not in the Image Button state, then no image is available. CSS
On setting, they must act as if they reflected the respective content attributes of the same name.
The willValidate
, validity
, and validationMessage
IDL attributes, and the checkValidity()
, reportValidity()
, and setCustomValidity()
methods, are part of the
constraint validation API. The labels
IDL
attribute provides a list of the element's label
s. The select()
, selectionStart
, selectionEnd
, selectionDirection
, setRangeText()
, and setSelectionRange()
methods and IDL attributes
expose the element's text selection. The disabled
,
form
, and name
IDL attributes
are part of the element's forms API.
type
attributetype=hidden
)When an input
element's type
attribute is in
the Hidden state, the rules in this section apply.
The input
element represents a value that is not intended to be
examined or manipulated by the user.
Constraint validation: If an input
element's type
attribute is in the Hidden state, it is barred from constraint
validation.
If the name
attribute is present and has a value that is an
ASCII case-insensitive match for "_charset_
", then the element's value
attribute must be omitted.
The
autocomplete
and
dirname
content attributes apply to this element.
The
value
IDL attribute applies to this element and is
in mode default.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
readonly
,
required
,
size
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
The input
and change
events do not apply.
type=text
) state and Search state (type=search
)When an input
element's type
attribute is in
the Text state or the Search state, the rules in this section apply.
The input
element represents a one line plain text edit control for
the element's value.
The difference between the Text state and the Search state is primarily stylistic: on platforms where search controls are distinguished from regular text controls, the Search state might result in an appearance consistent with the platform's search controls rather than appearing like a regular text control.
If the element is mutable, its value should be editable by the user. User agents must not allow users to insert U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters into the element's value.
If the element is mutable, the user agent should allow the user to change the writing direction of the element, setting it either to a left-to-right writing direction or a right-to-left writing direction. If the user does so, the user agent must then run the following steps:
Set the element's dir
attribute to "ltr
" if the user selected a left-to-right writing direction, and
"rtl
" if the user selected a right-to-left writing
direction.
Queue an element task on the user interaction task source given
the element to fire an event named input
at the element, with the bubbles
and composed
attributes initialized to true.
The value
attribute, if specified, must have a value that
contains no U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters.
The value sanitization algorithm is as follows: Strip newlines from the value.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
dirname
,
list
,
maxlength
,
minlength
,
pattern
,
placeholder
,
readonly
,
required
, and
size
content attributes;
list
,
selectionStart
,
selectionEnd
,
selectionDirection
, and
value
IDL attributes;
select()
,
setRangeText()
, and
setSelectionRange()
methods.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
max
,
min
,
multiple
,
popovertarget
,
popovertargetaction
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
valueAsDate
, and
valueAsNumber
IDL attributes;
stepDown()
and
stepUp()
methods.
type=tel
)When an input
element's type
attribute is in
the Telephone state, the rules in this section apply.
The input
element represents a control for editing a telephone number
given in the element's value.
If the element is mutable, its value should be editable by the user. User agents may change the spacing and, with care, the punctuation of values that the user enters. User agents must not allow users to insert U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters into the element's value.
The value
attribute, if specified, must have a value that
contains no U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters.
The value sanitization algorithm is as follows: Strip newlines from the value.
Unlike the URL and Email types, the Telephone type does not enforce a particular syntax. This is
intentional; in practice, telephone number fields tend to be free-form fields, because there are a
wide variety of valid phone numbers. Systems that need to enforce a particular format are
encouraged to use the pattern
attribute or the setCustomValidity()
method to hook into the client-side
validation mechanism.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
dirname
,
list
,
maxlength
,
minlength
,
pattern
,
placeholder
,
readonly
,
required
, and
size
content attributes;
list
,
selectionStart
,
selectionEnd
,
selectionDirection
, and
value
IDL attributes;
select()
,
setRangeText()
, and
setSelectionRange()
methods.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
max
,
min
,
multiple
,
popovertarget
,
popovertargetaction
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
valueAsDate
, and
valueAsNumber
IDL attributes;
stepDown()
and
stepUp()
methods.
type=url
)When an input
element's type
attribute is in
the URL state, the rules in this section apply.
The input
element represents a control for editing a single
absolute URL given in the element's value.
If the element is mutable, the user agent should allow the user to change the URL represented by its value. User agents may allow the user to set the value to a string that is not a valid absolute URL, but may also or instead automatically escape characters entered by the user so that the value is always a valid absolute URL (even if that isn't the actual value seen and edited by the user in the interface). User agents should allow the user to set the value to the empty string. User agents must not allow users to insert U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters into the value.
The value
attribute, if specified and not empty, must
have a value that is a valid URL potentially surrounded by spaces that is also an
absolute URL.
The value sanitization algorithm is as follows: Strip newlines from the value, then strip leading and trailing ASCII whitespace from the value.
Constraint validation: While the value of the element is neither the empty string nor a valid absolute URL, the element is suffering from a type mismatch.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
dirname
,
list
,
maxlength
,
minlength
,
pattern
,
placeholder
,
readonly
,
required
, and
size
content attributes;
list
,
selectionStart
,
selectionEnd
,
selectionDirection
, and
value
IDL attributes;
select()
,
setRangeText()
, and
setSelectionRange()
methods.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
max
,
min
,
multiple
,
popovertarget
,
popovertargetaction
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
valueAsDate
, and
valueAsNumber
IDL attributes;
stepDown()
and
stepUp()
methods.
If a document contained the following markup:
<input type="url" name="location" list="urls">
<datalist id="urls">
<option label="MIME: Format of Internet Message Bodies" value="https://www.rfc-editor.org/rfc/rfc2045">
<option label="HTML" value="https://html.spec.whatwg.org/">
<option label="DOM" value="https://dom.spec.whatwg.org/">
<option label="Fullscreen" value="https://fullscreen.spec.whatwg.org/">
<option label="Media Session" value="https://mediasession.spec.whatwg.org/">
<option label="The Single UNIX Specification, Version 3" value="http://www.unix.org/version3/">
</datalist>
...and the user had typed "spec.w", and the user agent had also found that the user
had visited https://url.spec.whatwg.org/#url-parsing
and https://streams.spec.whatwg.org/
in the recent past, then the rendering might look
like this:
The first four URLs in this sample consist of the four URLs in the author-specified list that match the text the user has entered, sorted in some implementation-defined manner (maybe by how frequently the user refers to those URLs). Note how the UA is using the knowledge that the values are URLs to allow the user to omit the scheme part and perform intelligent matching on the domain name.
The last two URLs (and probably many more, given the scrollbar's indications of more values being available) are the matches from the user agent's session history data. This data is not made available to the page DOM. In this particular case, the UA has no titles to provide for those values.
type=email
)When an input
element's type
attribute is in
the Email state, the rules in this section apply.
How the Email state operates depends on whether the
multiple
attribute is specified or not.
multiple
attribute is not specified on the
elementThe input
element represents a control for editing an email
address given in the element's value.
If the element is mutable, the user agent should allow the user to change the email address represented by its value. User agents may allow the user to set the value to a string that is not a valid email address. The user agent should act in a manner consistent with expecting the user to provide a single email address. User agents should allow the user to set the value to the empty string. User agents must not allow users to insert U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters into the value. User agents may transform the value for display and editing; in particular, user agents should convert punycode in the domain labels of the value to IDN in the display and vice versa.
Constraint validation: While the user interface is representing input that the user agent cannot convert to punycode, the control is suffering from bad input.
The value
attribute, if specified and not empty, must
have a value that is a single valid email address.
The value sanitization algorithm is as follows: Strip newlines from the value, then strip leading and trailing ASCII whitespace from the value.
Constraint validation: While the value of the element is neither the empty string nor a single valid email address, the element is suffering from a type mismatch.
multiple
attribute is specified on
the elementThe input
element represents a control for adding, removing, and
editing the email addresses given in the element's values.
If the element is mutable, the user agent should allow the user to add, remove, and edit the email addresses represented by its values. User agents may allow the user to set any individual value in the list of values to a string that is not a valid email address, but must not allow users to set any individual value to a string containing U+002C COMMA (,), U+000A LINE FEED (LF), or U+000D CARRIAGE RETURN (CR) characters. User agents should allow the user to remove all the addresses in the element's values. User agents may transform the values for display and editing; in particular, user agents should convert punycode in the domain labels of the value to IDN in the display and vice versa.
Constraint validation: While the user interface describes a situation where an individual value contains a U+002C COMMA (,) or is representing input that the user agent cannot convert to punycode, the control is suffering from bad input.
Whenever the user changes the element's values, the user agent must run the following steps:
Let latest values be a copy of the element's values.
Strip leading and trailing ASCII whitespace from each value in latest values.
Let the element's value be the result of concatenating all the values in latest values, separating each value from the next by a single U+002C COMMA character (,), maintaining the list's order.
The value
attribute, if specified, must have a value
that is a valid email address list.
The value sanitization algorithm is as follows:
Split on commas the element's value, strip leading and trailing ASCII whitespace from each resulting token, if any, and let the element's values be the (possibly empty) resulting list of (possibly empty) tokens, maintaining the original order.
Let the element's value be the result of concatenating the element's values, separating each value from the next by a single U+002C COMMA character (,), maintaining the list's order.
Constraint validation: While the value of the element is not a valid email address list, the element is suffering from a type mismatch.
When the multiple
attribute is set or removed, the
user agent must run the value sanitization algorithm.
A valid email address is a string that matches the email
production of the following ABNF, the character set for which is Unicode.
This ABNF implements the extensions described in RFC 1123. ABNF RFC5322
RFC1034 RFC1123
email = 1*( atext / "." ) "@" label *( "." label )
label = let-dig [ [ ldh-str ] let-dig ] ; limited to a length of 63 characters by RFC 1034 section 3.5
atext = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >
This requirement is a willful violation of RFC 5322, which defines a syntax for email addresses that is simultaneously too strict (before the "@" character), too vague (after the "@" character), and too lax (allowing comments, whitespace characters, and quoted strings in manners unfamiliar to most users) to be of practical use here.
The following JavaScript- and Perl-compatible regular expression is an implementation of the above definition.
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
A valid email address list is a set of comma-separated tokens, where each token is itself a valid email address. To obtain the list of tokens from a valid email address list, an implementation must split the string on commas.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
dirname
,
list
,
maxlength
,
minlength
,
multiple
,
pattern
,
placeholder
,
readonly
,
required
, and
size
content attributes;
list
and
value
IDL attributes;
select()
method.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
max
,
min
,
popovertarget
,
popovertargetaction
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
setRangeText()
,
setSelectionRange()
,
stepDown()
and
stepUp()
methods.
type=password
)When an input
element's type
attribute is in
the Password state, the rules in this section
apply.
The input
element represents a one line plain text edit control for
the element's value. The user agent should obscure the value
so that people other than the user cannot see it.
If the element is mutable, its value should be editable by the user. User agents must not allow users to insert U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters into the value.
The value
attribute, if specified, must have a value that
contains no U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR) characters.
The value sanitization algorithm is as follows: Strip newlines from the value.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
dirname
,
maxlength
,
minlength
,
pattern
,
placeholder
,
readonly
,
required
, and
size
content attributes;
selectionStart
,
selectionEnd
,
selectionDirection
, and
value
IDL attributes;
select()
,
setRangeText()
, and
setSelectionRange()
methods.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
min
,
multiple
,
popovertarget
,
popovertargetaction
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
list
,
valueAsDate
, and
valueAsNumber
IDL attributes;
stepDown()
and
stepUp()
methods.
type=date
)When an input
element's type
attribute is in
the Date state, the rules in this section apply.
The input
element represents a control for setting the element's
value to a string representing a specific date.
If the element is mutable, the user agent should allow the user to change the date represented by its value, as obtained by parsing a date from it. User agents must not allow the user to set the value to a non-empty string that is not a valid date string. If the user agent provides a user interface for selecting a date, then the value must be set to a valid date string representing the user's selection. User agents should allow the user to set the value to the empty string.
Constraint validation: While the user interface describes input that the user agent cannot convert to a valid date string, the control is suffering from bad input.
See the introduction section for a discussion of the difference between the input format and submission format for date, time, and number form controls, and the implementation notes regarding localization of form controls.
The value
attribute, if specified and not empty, must
have a value that is a valid date string.
The value sanitization algorithm is as follows: If the value of the element is not a valid date string, then set it to the empty string instead.
The min
attribute, if specified, must have a value that is
a valid date string. The max
attribute, if
specified, must have a value that is a valid date string.
The step
attribute is expressed in days. The step scale factor is 86,400,000
(which converts the days to milliseconds, as used in the other algorithms). The default step is 1 day.
When the element is suffering from a step mismatch, the user agent may round the element's value to the nearest date for which the element would not suffer from a step mismatch.
The algorithm to convert a string to a
number, given a string input, is as follows: If parsing a date from input results in an
error, then return an error; otherwise, return the number of milliseconds elapsed from midnight
UTC on the morning of 1970-01-01 (the time represented by the value "1970-01-01T00:00:00.0Z
") to midnight UTC on the morning of the parsed date, ignoring leap seconds.
The algorithm to convert a number to a
string, given a number input, is as follows: Return a
valid date string that represents the date that, in
UTC, is current input milliseconds after midnight UTC on the morning of
1970-01-01 (the time represented by the value "1970-01-01T00:00:00.0Z
").
The algorithm to convert a string to a
Date
object, given a string input, is as follows:
If parsing a date from input results
in an error, then return an error; otherwise, return a new
Date
object representing midnight UTC on the morning of the parsed date.
The algorithm to convert a
Date
object to a string, given a Date
object input, is
as follows: Return a valid date string that represents the date current at the time represented by input in the UTC
time zone.
The Date state (and other date- and time-related states described in subsequent sections) is not intended for the entry of values for which a precise date and time relative to the contemporary calendar cannot be established. For example, it would be inappropriate for the entry of times like "one millisecond after the big bang", "the early part of the Jurassic period", or "a winter around 250 BCE".
For the input of dates before the introduction of the Gregorian calendar, authors are
encouraged to not use the Date state (and the other
date- and time-related states described in subsequent sections), as user agents are not required
to support converting dates and times from earlier periods to the Gregorian calendar, and asking
users to do so manually puts an undue burden on users. (This is complicated by the manner in
which the Gregorian calendar was phased in, which occurred at different times in different
countries, ranging from partway through the 16th century all the way to early in the 20th.)
Instead, authors are encouraged to provide fine-grained input controls using the
select
element and input
elements with the Number state.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
list
,
max
,
min
,
readonly
,
required
, and
step
content attributes;
list
,
value
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
stepDown()
, and
stepUp()
methods.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
maxlength
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
size
,
src
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
selectionStart
,
selectionEnd
, and
selectionDirection
IDL attributes;
setRangeText()
, and
setSelectionRange()
methods.
type=month
)When an input
element's type
attribute is in
the Month state, the rules in this section apply.
The input
element represents a control for setting the element's
value to a string representing a specific month.
If the element is mutable, the user agent should allow the user to change the month represented by its value, as obtained by parsing a month from it. User agents must not allow the user to set the value to a non-empty string that is not a valid month string. If the user agent provides a user interface for selecting a month, then the value must be set to a valid month string representing the user's selection. User agents should allow the user to set the value to the empty string.
Constraint validation: While the user interface describes input that the user agent cannot convert to a valid month string, the control is suffering from bad input.
See the introduction section for a discussion of the difference between the input format and submission format for date, time, and number form controls, and the implementation notes regarding localization of form controls.
The value
attribute, if specified and not empty, must
have a value that is a valid month string.
The value sanitization algorithm is as follows: If the value of the element is not a valid month string, then set it to the empty string instead.
The min
attribute, if specified, must have a value that is
a valid month string. The max
attribute, if
specified, must have a value that is a valid month string.
The step
attribute is expressed in months. The step scale factor is 1 (there is no
conversion needed as the algorithms use months). The default step is 1 month.
When the element is suffering from a step mismatch, the user agent may round the element's value to the nearest month for which the element would not suffer from a step mismatch.
The algorithm to convert a string to a number, given a string input, is as follows: If parsing a month from input results in an error, then return an error; otherwise, return the number of months between January 1970 and the parsed month.
The algorithm to convert a number to a string, given a number input, is as follows: Return a valid month string that represents the month that has input months between it and January 1970.
The algorithm to convert a string to a
Date
object, given a string input, is as follows:
If parsing a month from input
results in an error, then return an error; otherwise, return a
new Date
object representing midnight UTC on the morning of the first day of
the parsed month.
The algorithm to convert a
Date
object to a string, given a Date
object input, is
as follows: Return a valid month string that represents the month current at the time represented by input in the UTC
time zone.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
list
,
max
,
min
,
readonly
,
required
, and
step
content attributes;
list
,
value
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
stepDown()
, and
stepUp()
methods.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
maxlength
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
size
,
src
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
selectionStart
,
selectionEnd
, and
selectionDirection
IDL attributes;
setRangeText()
, and
setSelectionRange()
methods.
type=week
)When an input
element's type
attribute is in
the Week state, the rules in this section apply.
The input
element represents a control for setting the element's
value to a string representing a specific week.
If the element is mutable, the user agent should allow the user to change the week represented by its value, as obtained by parsing a week from it. User agents must not allow the user to set the value to a non-empty string that is not a valid week string. If the user agent provides a user interface for selecting a week, then the value must be set to a valid week string representing the user's selection. User agents should allow the user to set the value to the empty string.
Constraint validation: While the user interface describes input that the user agent cannot convert to a valid week string, the control is suffering from bad input.
See the introduction section for a discussion of the difference between the input format and submission format for date, time, and number form controls, and the implementation notes regarding localization of form controls.
The value
attribute, if specified and not empty, must
have a value that is a valid week string.
The value sanitization algorithm is as follows: If the value of the element is not a valid week string, then set it to the empty string instead.
The min
attribute, if specified, must have a value that is
a valid week string. The max
attribute, if
specified, must have a value that is a valid week string.
The step
attribute is expressed in weeks. The step scale factor is 604,800,000
(which converts the weeks to milliseconds, as used in the other algorithms). The default step is 1 week. The default step base is −259,200,000 (the start
of week 1970-W01).
When the element is suffering from a step mismatch, the user agent may round the element's value to the nearest week for which the element would not suffer from a step mismatch.
The algorithm to convert a string to a
number, given a string input, is as follows: If parsing a week string from input results in
an error, then return an error; otherwise, return the number of milliseconds elapsed from midnight
UTC on the morning of 1970-01-01 (the time represented by the value "1970-01-01T00:00:00.0Z
") to midnight UTC on the morning of the Monday of the
parsed week, ignoring leap seconds.
The algorithm to convert a number to a
string, given a number input, is as follows: Return a
valid week string that represents the week that, in
UTC, is current input milliseconds after midnight UTC on the morning of
1970-01-01 (the time represented by the value "1970-01-01T00:00:00.0Z
").
The algorithm to convert a string to a
Date
object, given a string input, is as follows: If parsing a week from input results in an error, then
return an error; otherwise, return a new Date
object representing midnight UTC on the morning of the Monday of the parsed week.
The algorithm to convert a
Date
object to a string, given a Date
object input, is
as follows: Return a valid week string that represents the week current at the time represented by input in the UTC
time zone.
The following common input
element content attributes, IDL attributes, and
methods apply to the element:
autocomplete
,
list
,
max
,
min
,
readonly
,
required
, and
step
content attributes;
list
,
value
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
stepDown()
, and
stepUp()
methods.
The value
IDL attribute is in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
maxlength
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
size
,
src
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
selectionStart
,
selectionEnd
, and
selectionDirection
IDL attributes;
setRangeText()
, and
setSelectionRange()
methods.
type=time
)When an input
element's type
attribute is in
the Time state, the rules in this section apply.
The input
element represents a control for setting the element's
value to a string representing a specific time.
If the element is mutable, the user agent should allow the user to change the time represented by its value, as obtained by parsing a time from it. User agents must not allow the user to set the value to a non-empty string that is not a valid time string. If the user agent provides a user interface for selecting a time, then the value must be set to a valid time string representing the user's selection. User agents should allow the user to set the value to the empty string.
Constraint validation: While the user interface describes input that the user agent cannot convert to a valid time string, the control is suffering from bad input.
See the introduction section for a discussion of the difference between the input format and submission format for date, time, and number form controls, and the implementation notes regarding localization of form controls.
The value
attribute, if specified and not empty, must
have a value that is a valid time string.
The value sanitization algorithm is as follows: If the value of the element is not a valid time string, then set it to the empty string instead.
The form control has a periodic domain.
The min
attribute, if specified, must have a value that is
a valid time string. The max
attribute, if
specified, must have a value that is a valid time string.
The step
attribute is expressed in seconds. The step scale factor is 1000 (which
converts the seconds to milliseconds, as used in the other algorithms). The default step is 60 seconds.
When the element is suffering from a step mismatch, the user agent may round the element's value to the nearest time for which the element would not suffer from a step mismatch.
The algorithm to convert a string to a number, given a string input, is as follows: If parsing a time from input results in an error, then return an error; otherwise, return the number of milliseconds elapsed from midnight to the parsed time on a day with no time changes.
The algorithm to convert a number to a string, given a number input, is as follows: Return a valid time string that represents the time that is input milliseconds after midnight on a day with no time changes.
The algorithm to convert a string to a
Date
object, given a string input, is as
follows: If parsing a time from
input results
in an error, then return an error; otherwise, return a new
Date
object representing the parsed time in
UTC on 1970-01-01.
The algorithm to convert a
Date
object to a string, given a Date
object input, is
as follows: Return a valid time string that represents the UTC time component that is represented by input.
The following common input
element content attributes, IDL attributes, and
methods apply to the element:
autocomplete
,
list
,
max
,
min
,
readonly
,
required
, and
step
content attributes;
list
,
value
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
stepDown()
, and
stepUp()
methods.
The value
IDL attribute is in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
maxlength
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
size
,
src
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
selectionStart
,
selectionEnd
, and
selectionDirection
IDL attributes;
setRangeText()
, and
setSelectionRange()
methods.
type=datetime-local
)When an input
element's type
attribute is in
the Local Date and Time state, the rules in
this section apply.
The input
element represents a control for setting the element's
value to a string representing a local date and time, with no time-zone offset
information.
If the element is mutable, the user agent should allow the user to change the date and time represented by its value, as obtained by parsing a date and time from it. User agents must not allow the user to set the value to a non-empty string that is not a valid normalized local date and time string. If the user agent provides a user interface for selecting a local date and time, then the value must be set to a valid normalized local date and time string representing the user's selection. User agents should allow the user to set the value to the empty string.
Constraint validation: While the user interface describes input that the user agent cannot convert to a valid normalized local date and time string, the control is suffering from bad input.
See the introduction section for a discussion of the difference between the input format and submission format for date, time, and number form controls, and the implementation notes regarding localization of form controls.
The value
attribute, if specified and not empty, must
have a value that is a valid local date and time string.
The value sanitization algorithm is as follows: If the value of the element is a valid local date and time string, then set it to a valid normalized local date and time string representing the same date and time; otherwise, set it to the empty string instead.
The min
attribute, if specified, must have a value that is
a valid local date and time string. The max
attribute, if specified, must have a value that is a valid local date and time
string.
The step
attribute is expressed in seconds. The step scale factor is 1000 (which
converts the seconds to milliseconds, as used in the other algorithms). The default step is 60 seconds.
When the element is suffering from a step mismatch, the user agent may round the element's value to the nearest local date and time for which the element would not suffer from a step mismatch.
The algorithm to convert a string to a
number, given a string input, is as follows: If parsing a date and time from input results in an error, then return an error; otherwise, return the number of
milliseconds elapsed from midnight on the morning of 1970-01-01 (the time represented by the value
"1970-01-01T00:00:00.0
") to the parsed local date and time, ignoring leap seconds.
The algorithm to convert a number to a
string, given a number input, is as follows: Return a
valid normalized local date and time string that represents the date and time that is
input milliseconds after midnight on the morning of 1970-01-01 (the time
represented by the value "1970-01-01T00:00:00.0
").
See the note on historical dates in the Date state section.
The following common input
element content
attributes, IDL attributes, and methods apply to the element:
autocomplete
,
list
,
max
,
min
,
readonly
,
required
, and
step
content attributes;
list
,
value
, and
valueAsNumber
IDL attributes;
select()
,
stepDown()
, and
stepUp()
methods.
The value
IDL attribute is
in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not
apply to the element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
maxlength
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
size
,
src
, and
width
.
The following IDL attributes and methods do not apply to the
element:
checked
,
files
,
selectionStart
,
selectionEnd
,
selectionDirection
, and
valueAsDate
IDL attributes;
setRangeText()
, and
setSelectionRange()
methods.
The following example shows part of a flight booking application. The application uses an
input
element with its type
attribute set to
datetime-local
, and it then interprets the
given date and time in the time zone of the selected airport.
<fieldset>
<legend>Destination</legend>
<p><label>Airport: <input type=text name=to list=airports></label></p>
<p><label>Departure time: <input type=datetime-local name=totime step=3600></label></p>
</fieldset>
<datalist id=airports>
<option value=ATL label="Atlanta">
<option value=MEM label="Memphis">
<option value=LHR label="London Heathrow">
<option value=LAX label="Los Angeles">
<option value=FRA label="Frankfurt">
</datalist>
type=number
)When an input
element's type
attribute is in
the Number state, the rules in this section apply.
The input
element represents a control for setting the element's
value to a string representing a number.
If the element is mutable, the user agent should allow the user to change the number represented by its value, as obtained from applying the rules for parsing floating-point number values to it. User agents must not allow the user to set the value to a non-empty string that is not a valid floating-point number. If the user agent provides a user interface for selecting a number, then the value must be set to the best representation of the number representing the user's selection as a floating-point number. User agents should allow the user to set the value to the empty string.
Constraint validation: While the user interface describes input that the user agent cannot convert to a valid floating-point number, the control is suffering from bad input.
This specification does not define what user interface user agents are to use; user agent vendors are encouraged to consider what would best serve their users' needs. For example, a user agent in Persian or Arabic markets might support Persian and Arabic numeric input (converting it to the format required for submission as described above). Similarly, a user agent designed for Romans might display the value in Roman numerals rather than in decimal; or (more realistically) a user agent designed for the French market might display the value with apostrophes between thousands and commas before the decimals, and allow the user to enter a value in that manner, internally converting it to the submission format described above.
The value
attribute, if specified and not empty, must
have a value that is a valid floating-point number.
The value sanitization algorithm is as follows: If the value of the element is not a valid floating-point number, then set it to the empty string instead.
The min
attribute, if specified, must have a value that is
a valid floating-point number. The max
attribute,
if specified, must have a value that is a valid floating-point number.
The step scale factor is 1. The default step is 1 (allowing only integers to be selected by the user, unless the step base has a non-integer value).
When the element is suffering from a step mismatch, the user agent may round the element's value to the nearest number for which the element would not suffer from a step mismatch. If there are two such numbers, user agents are encouraged to pick the one nearest positive infinity.
The algorithm to convert a string to a number, given a string input, is as follows: If applying the rules for parsing floating-point number values to input results in an error, then return an error; otherwise, return the resulting number.
The algorithm to convert a number to a string, given a number input, is as follows: Return a valid floating-point number that represents input.
The following common input
element content attributes, IDL attributes, and
methods apply to the element:
autocomplete
,
list
,
max
,
min
,
placeholder
,
readonly
,
required
, and
step
content attributes;
list
,
value
, and
valueAsNumber
IDL attributes;
select()
,
stepDown()
, and
stepUp()
methods.
The value
IDL attribute is in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
maxlength
,
minlength
,
multiple
,
pattern
,
popovertarget
,
popovertargetaction
,
size
,
src
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
selectionStart
,
selectionEnd
,
selectionDirection
, and
valueAsDate
IDL attributes;
setRangeText()
, and
setSelectionRange()
methods.
Here is an example of using a numeric input control:
<label>How much do you want to charge? $<input type=number min=0 step=0.01 name=price></label>
As described above, a user agent might support numeric input in the user's local format, converting it to the format required for submission as described above. This might include handling grouping separators (as in "872,000,000,000") and various decimal separators (such as "3,99" vs "3.99") or using local digits (such as those in Arabic, Devanagari, Persian, and Thai).
The type=number
state
is not appropriate for input that happens to only consist of numbers but isn't strictly speaking a
number. For example, it would be inappropriate for credit card numbers or US postal codes. A
simple way of determining whether to use type=number
is to consider whether
it would make sense for the input control to have a spinbox interface (e.g. with "up" and "down"
arrows). Getting a credit card number wrong by 1 in the last digit isn't a minor mistake, it's as
wrong as getting every digit incorrect. So it would not make sense for the user to select a credit
card number using "up" and "down" buttons. When a spinbox interface is not appropriate, type=text
is probably the right choice (possibly with an inputmode
or pattern
attribute).
type=range
)When an input
element's type
attribute is in
the Range state, the rules in this section apply.
The input
element represents a control for setting the element's
value to a string representing a number, but with the
caveat that the exact value is not important, letting UAs provide a simpler interface than they
do for the Number state.
If the element is mutable, the user agent should allow the user to change the number represented by its value, as obtained from applying the rules for parsing floating-point number values to it. User agents must not allow the user to set the value to a string that is not a valid floating-point number. If the user agent provides a user interface for selecting a number, then the value must be set to a best representation of the number representing the user's selection as a floating-point number. User agents must not allow the user to set the value to the empty string.
Constraint validation: While the user interface describes input that the user agent cannot convert to a valid floating-point number, the control is suffering from bad input.
The value
attribute, if specified, must have a value
that is a valid floating-point number.
The value sanitization algorithm is as follows: If the value of the element is not a valid floating-point number, then set it to the best representation, as a floating-point number, of the default value.
The default value is the minimum plus half the difference between the minimum and the maximum, unless the maximum is less than the minimum, in which case the default value is the minimum.
When the element is suffering from an underflow, the user agent must set the element's value to the best representation, as a floating-point number, of the minimum.
When the element is suffering from an overflow, if the maximum is not less than the minimum, the user agent must set the element's value to a valid floating-point number that represents the maximum.
When the element is suffering from a step mismatch, the user agent must round the element's value to the nearest number for which the element would not suffer from a step mismatch, and which is greater than or equal to the minimum, and, if the maximum is not less than the minimum, which is less than or equal to the maximum, if there is a number that matches these constraints. If two numbers match these constraints, then user agents must use the one nearest to positive infinity.
For example, the markup
<input type="range" min=0 max=100 step=20 value=50>
results in a range control whose initial value is 60.
Here is an example of a range control using an autocomplete list with the list
attribute. This could be useful if there are values along
the full range of the control that are especially important, such as preconfigured light levels
or typical speed limits in a range control used as a speed control. The following markup
fragment:
<input type="range" min="-100" max="100" value="0" step="10" name="power" list="powers">
<datalist id="powers">
<option value="0">
<option value="-30">
<option value="30">
<option value="++50">
</datalist>
...with the following style sheet applied:
input { writing-mode: vertical-lr; height: 75px; width: 49px; background: #D5CCBB; color: black; }
...might render as:
Note how the UA determined the orientation of the control from the ratio of the
style-sheet-specified height and width properties. The colors were similarly derived from the
style sheet. The tick marks, however, were derived from the markup. In particular, the step
attribute has not affected the placement of tick marks,
the UA deciding to only use the author-specified completion values and then adding longer tick
marks at the extremes.
Note also how the invalid value ++50
was ignored.
For another example, consider the following markup fragment:
<input name=x type=range min=100 max=700 step=9.09090909 value=509.090909>
A user agent could display in a variety of ways, for instance:
Or, alternatively, for instance:
The user agent could pick which one to display based on the dimensions given in the style sheet. This would allow it to maintain the same resolution for the tick marks, despite the differences in width.
Finally, here is an example of a range control with two labeled values:
<input type="range" name="a" list="a-values">
<datalist id="a-values">
<option value="10" label="Low">
<option value="90" label="High">
</datalist>
With styles that make the control draw vertically, it might look as follows:
In this state, the range and step constraints are enforced even during user input, and there is no way to set the value to the empty string.
The min
attribute, if specified, must have a value that is
a valid floating-point number. The default
minimum is 0. The max
attribute, if specified, must
have a value that is a valid floating-point number. The default maximum is 100.
The step scale factor is
1. The default step is 1 (allowing only
integers, unless the min
attribute has a non-integer
value).
The algorithm to convert a string to a number, given a string input, is as follows: If applying the rules for parsing floating-point number values to input results in an error, then return an error; otherwise, return the resulting number.
The algorithm to convert a number to a string, given a number input, is as follows: Return the best representation, as a floating-point number, of input.
The following common input
element content attributes, IDL attributes, and
methods apply to the element:
autocomplete
,
list
,
max
,
min
, and
step
content attributes;
list
,
value
, and
valueAsNumber
IDL attributes;
stepDown()
and
stepUp()
methods.
The value
IDL attribute is in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
maxlength
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
readonly
,
required
,
size
,
src
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
selectionStart
,
selectionEnd
,
selectionDirection
, and
valueAsDate
IDL attributes;
select()
,
setRangeText()
, and
setSelectionRange()
methods.
type=color
)When an input
element's type
attribute is in
the Color state, the rules in this section apply.
The input
element represents a color well control, for setting the
element's value to a string representing the serialization
of a CSS color.
In this state, there is always a CSS color picked, and there is no way for the end user to set the value to the empty string.
The alpha
attribute
is a boolean attribute. If present, it indicates the CSS color's alpha component can
be manipulated by the end user and does not have to be fully opaque.
The colorspace
attribute indicates the color space of the serialized CSS color. It also hints at the desired user
interface for selecting a CSS color. It is an enumerated attribute with the following
keywords and states:
Keyword | State | Brief description |
---|---|---|
limited-srgb
| Limited sRGB | The CSS color is converted to the 'srgb' color space and limited to 8-bits per
component, e.g., "#123456 " or "color(srgb 0 1 0 / 0.5) ".
|
display-p3
| Display P3 | The CSS color is converted to the 'display-p3' color space, e.g., "color(display-p3 1.84 -0.19 0.72 / 0.6) ".
|
The attribute's missing value default and invalid value default are both the Limited sRGB state.
Whenever the element's alpha
or colorspace
attributes are changed, the user agent must run
update a color well control color given the element.
If the element is mutable, the user agent should allow the user to change the color represented by its value, as obtained from parsing it. User agents must not allow the user to set the value to a string that running update a color well control color for the element would not set it to. If the user agent provides a user interface for selecting a CSS color, then the value must be set to the result of serializing a color well control color given the element and the end user's selection.
The input activation behavior for such an element element is to show the picker, if applicable, for element.
Constraint validation: While the element's value is not the empty string and parsing it returns failure, the control is suffering from bad input.
The value
attribute, if specified and not the empty
string, must have a value that is a CSS color.
The value sanitization algorithm is as follows: Run update a color well control color for the element.
To update a color well control color, given an element element:
Assert: element is an input
element whose type
attribute is in the Color state.
Let color be the result of parsing element's value.
If color is failure, then set color to opaque black.
Set element's value to the result of serializing a color well control color given element and color.
To serialize a color well control color, given an element element and a CSS color color:
Assert: element is an input
element whose type
attribute is in the Color state.
Let htmlCompatible be false.
If element's alpha
attribute is not
specified, then set color's alpha component to be fully opaque.
If element's colorspace
attribute is
in the Limited sRGB state:
Set color to color converted to the 'srgb' color space.
Round each of color's components so they are in the range 0 to 255, inclusive. Components are to be rounded towards +∞.
If element's alpha
attribute is not
specified, then set htmlCompatible to true.
This intentionally uses a different serialization path for compatibility with an earlier version of the color well control.
Otherwise, set color to color converted to using the 'color()' function.
Otherwise:
Assert: element's colorspace
attribute is in the Display P3 state.
Set color to color converted to the 'display-p3' color space.
Return the result of serializing color. If htmlCompatible is true, then do so with HTML-compatible serialization requested.
The following common input
element content attributes and IDL attributes apply to the element:
alpha
,
autocomplete
,
colorspace
, and
list
content attributes;
list
and
value
IDL attributes;
select()
method.
The value
IDL attribute is in mode value.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alt
,
checked
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
readonly
,
required
,
size
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
and,
valueAsNumber
IDL attributes;
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
type=checkbox
)When an input
element's type
attribute is in
the Checkbox state, the rules in this section
apply.
The input
element represents a two-state control that represents the
element's checkedness state. If the element's checkedness state is true, the control represents a positive
selection, and if it is false, a negative selection. If the element's indeterminate
IDL attribute is set to true, then the
control's selection should be obscured as if the control was in a third, indeterminate, state.
The control is never a true tri-state control, even if the element's indeterminate
IDL attribute is set to true. The indeterminate
IDL attribute only gives the appearance of a
third state.
The input activation behavior is to run the following steps:
If the element is not connected, then return.
Fire an event named input
at the element with the bubbles
and composed
attributes initialized to true.
Fire an event named change
at the element with the bubbles
attribute initialized to true.
Constraint validation: If the element is required and its checkedness is false, then the element is suffering from being missing.
input.indeterminate [ = value ]
When set, overrides the rendering of checkbox controls so that the current value is not visible.
The following common input
element content attributes and IDL attributes apply to the element:
checked
, and
required
content attributes;
checked
and
value
IDL attributes.
The value
IDL attribute is in mode default/on.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
autocomplete
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
readonly
,
size
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the element:
files
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
type=radio
)When an input
element's type
attribute is in
the Radio Button state, the rules in this section
apply.
The input
element represents a control that, when used in conjunction
with other input
elements, forms a radio button group in which only one
control can have its checkedness state set to true. If
the element's checkedness state is true, the control
represents the selected control in the group, and if it is false, it indicates a control in the
group that is not selected.
The radio button group that contains an input
element
a also contains all the other input
elements b that fulfill all
of the following conditions:
input
element b's type
attribute is in the Radio
Button state.name
attribute, their name
attributes are not empty, and the value of a's name
attribute equals the value of b's name
attribute.A tree must not contain an input
element whose radio button group contains only that element.
When any of the following phenomena occur, if the element's checkedness state is true after the occurrence, the checkedness state of all the other elements in the same radio button group must be set to false:
name
attribute is set, changed, or
removed.The input activation behavior is to run the following steps:
If the element is not connected, then return.
Fire an event named input
at the element with the bubbles
and composed
attributes initialized to true.
Fire an event named change
at the element with the bubbles
attribute initialized to true.
Constraint validation: If an element in the radio button group is required, and all of the
input
elements in the radio button group have a
checkedness that is false, then the element is
suffering from being missing.
The following example, for some reason, has specified that puppers are both required and disabled:
<form>
<p><label><input type="radio" name="dog-type" value="pupper" required disabled> Pupper</label>
<p><label><input type="radio" name="dog-type" value="doggo"> Doggo</label>
<p><button>Make your choice</button>
</form>
If the user tries to submit this form without first selecting "Doggo", then both
input
elements will be suffering from being missing, since an element
in the radio button group is required
(viz. the first element), and both of the elements in the radio button group have a false checkedness.
On the other hand, if the user selects "Doggo" and then submits the form, then neither
input
element will be suffering from being missing, since while one of
them is required, not all of them have a false checkedness.
If none of the radio buttons in a radio button group are checked, then they will all be initially unchecked in the interface, until such time as one of them is checked (either by the user or by script).
The following common input
element content attributes and IDL attributes apply to the element:
checked
and
required
content attributes;
checked
and
value
IDL attributes.
The value
IDL attribute is in mode default/on.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
autocomplete
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
popovertarget
,
popovertargetaction
,
readonly
,
size
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the element:
files
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
type=file
)When an input
element's type
attribute is in
the File Upload state, the rules in this section
apply.
The input
element represents a list of selected files, each file consisting of a
filename, a file type, and a file body (the contents of the file).
Filenames must not contain path components, even in the case that a user has selected an entire directory hierarchy or multiple files with the same name from different directories. Path components, for the purposes of the File Upload state, are those parts of filenames that are separated by U+005C REVERSE SOLIDUS character (\) characters.
Unless the multiple
attribute is set, there must be
no more than one file in the list of selected
files.
The input activation behavior for such an element element is to show the picker, if applicable, for element.
If the element is mutable, the user agent should allow the user to change the files on the list in other ways also, e.g., adding or removing files by drag-and-drop. When the user does so, the user agent must update the file selection for the element.
If the element is not mutable, the user agent must not allow the user to change the element's selection.
To update the file selection for an element element:
Queue an element task on the user interaction task source given element and the following steps:
Update element's selected files so that it represents the user's selection.
Fire an event named input
at the input
element, with the bubbles
and composed
attributes initialized to true.
Fire an event named change
at the input
element, with the bubbles
attribute initialized to true.
Constraint validation: If the element is required and the list of selected files is empty, then the element is suffering from being missing.
The accept
attribute may be specified to provide user agents with a hint of what file types will be
accepted.
If specified, the attribute must consist of a set of comma-separated tokens, each of which must be an ASCII case-insensitive match for one of the following:
audio/*
"video/*
"image/*
"The tokens must not be ASCII case-insensitive matches for any of the other tokens (i.e. duplicates are not allowed). To obtain the list of tokens from the attribute, the user agent must split the attribute value on commas.
User agents may use the value of this attribute to display a more appropriate user interface
than a generic file picker. For instance, given the value image/*
, a user
agent could offer the user the option of using a local camera or selecting a photograph from their
photo collection; given the value audio/*
, a user agent could offer the user
the option of recording a clip using a headset microphone.
User agents should prevent the user from selecting files that are not accepted by one (or more) of these tokens.
Authors are encouraged to specify both any MIME types and any corresponding extensions when looking for data in a specific format.
For example, consider an application that converts Microsoft Word documents to Open Document Format files. Since Microsoft Word documents are described with a wide variety of MIME types and extensions, the site can list several, as follows:
<input type="file" accept=".doc,.docx,.xml,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document">
On platforms that only use file extensions to describe file types, the extensions listed here can be used to filter the allowed documents, while the MIME types can be used with the system's type registration table (mapping MIME types to extensions used by the system), if any, to determine any other extensions to allow. Similarly, on a system that does not have filenames or extensions but labels documents with MIME types internally, the MIME types can be used to pick the allowed files, while the extensions can be used if the system has an extension registration table that maps known extensions to MIME types used by the system.
Extensions tend to be ambiguous (e.g. there are an untold number of formats
that use the ".dat
" extension, and users can typically quite easily rename
their files to have a ".doc
" extension even if they are not Microsoft Word
documents), and MIME types tend to be unreliable (e.g. many formats have no formally registered
types, and many formats are in practice labeled using a number of different MIME types). Authors
are reminded that, as usual, data received from a client should be treated with caution, as it may
not be in an expected format even if the user is not hostile and the user agent fully obeyed the
accept
attribute's requirements.
For historical reasons, the value
IDL attribute prefixes
the filename with the string "C:\fakepath\
". Some legacy user agents
actually included the full path (which was a security vulnerability). As a result of this,
obtaining the filename from the value
IDL attribute in a
backwards-compatible way is non-trivial. The following function extracts the filename in a
suitably compatible manner:
function extractFilename(path) {
if (path.substr(0, 12) == "C:\\fakepath\\")
return path.substr(12); // modern browser
var x;
x = path.lastIndexOf('/');
if (x >= 0) // Unix-based path
return path.substr(x+1);
x = path.lastIndexOf('\\');
if (x >= 0) // Windows-based path
return path.substr(x+1);
return path; // just the filename
}
This can be used as follows:
<p><input type=file name=image onchange="updateFilename(this.value)"></p>
<p>The name of the file you picked is: <span id="filename">(none)</span></p>
<script>
function updateFilename(path) {
var name = extractFilename(path);
document.getElementById('filename').textContent = name;
}
</script>
The following common input
element content attributes and IDL attributes apply to the element:
accept
,
multiple
, and
required
content attributes;
files
and
value
IDL attributes;
select()
method.
The value
IDL attribute is in mode filename.
The input
and change
events apply.
The following content attributes must not be specified and do not apply to the
element:
alpha
,
alt
,
autocomplete
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
pattern
,
popovertarget
,
popovertargetaction
,
placeholder
,
readonly
,
size
,
src
,
step
, and
width
.
The element's value
attribute must be omitted.
The following IDL attributes and methods do not apply to the element:
checked
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
type=submit
)When an input
element's type
attribute is in
the Submit Button state, the rules in this section
apply.
The input
element represents a button that, when activated, submits the
form. If the element has a value
attribute,
the button's label must be the value of that attribute; otherwise, it must be an
implementation-defined string that means "Submit" or some such. The element is
a button, specifically a submit button.
Since the default label is implementation-defined, and the width of the button typically depends on the button's label, the button's width can leak a few bits of fingerprintable information. These bits are likely to be strongly correlated to the identity of the user agent and the user's locale.
The element's input activation behavior given event is as follows:
If the element does not have a form owner, then return.
If the element's node document is not fully active, then return.
Submit the element's form owner from the element with userInvolvement set to event's user navigation involvement.
The formaction
, formenctype
, formmethod
, formnovalidate
, and formtarget
attributes are attributes for form
submission.
The formnovalidate
attribute can be
used to make submit buttons that do not trigger the constraint validation.
The following common input
element content attributes and IDL attributes apply to the element:
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
popovertarget
, and
popovertargetaction
content
attributes; value
IDL attribute.
The value
IDL attribute is in mode default.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
autocomplete
,
checked
,
colorspace
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
readonly
,
required
,
size
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
The input
and change
events do not apply.
type=image
)When an input
element's type
attribute is in
the Image Button state, the rules in this section
apply.
The input
element represents either an image from which a user can
select a coordinate and submit the form, or alternatively a button from which the user can submit
the form. The element is a button, specifically a submit button.
The coordinate is sent to the server during form submission by sending two entries for the element, derived from the name
of the control but with ".x
" and ".y
" appended to
the name with the x and y components of the coordinate respectively.
The image is given by the src
attribute. The src
attribute must be present, and must contain a valid non-empty URL potentially surrounded by
spaces referencing a non-interactive, optionally animated, image resource that is neither
paged nor scripted.
When any of the these events occur
input
element's type
attribute is
first set to the Image Button state (possibly when
the element is first created), and the src
attribute is
presentinput
element's type
attribute is
changed back to the Image Button state, and the src
attribute is present, and its value has changed since the last
time the type
attribute was in the Image Button stateinput
element's type
attribute is in
the Image Button state, and the src
attribute is set or changedthen unless the user agent cannot support images, or its support for images has been disabled,
or the user agent only fetches images on demand, or the src
attribute's value is the empty string, run these steps:
Let url be the result of encoding-parsing a URL given the src
attribute's value, relative to the element's node
document.
If url is failure, then return.
Let request be a new request whose URL is url, client is the element's node document's
relevant settings object, destination is "image
", initiator type is "input
",
credentials mode is "include
", and whose use-URL-credentials flag is set.
Fetch request, with processResponseEndOfBody set to the following step given response response:
If the download was successful and the image is available, queue an element task on the
user interaction task source given the input
element to fire an event named load
at the input
element.
Otherwise, if the fetching process fails without a response from the remote server, or
completes but the image is not a valid or supported image, then queue an element
task on the user interaction task source given the input
element to fire an event named error
on the input
element.
Fetching the image must delay the load event of the element's node document until the task that is queued by the networking task source once the resource has been fetched (defined below) has been run.
If the image was successfully obtained, with no network errors, and the image's type is a supported image type, and the image is a valid image of that type, then the image is said to be available. If this is true before the image is completely downloaded, each task that is queued by the networking task source while the image is being fetched must update the presentation of the image appropriately.
The user agent should apply the image sniffing rules to determine the type of the image, with the image's associated Content-Type headers giving the official type. If these rules are not applied, then the type of the image must be the type given by the image's associated Content-Type headers.
User agents must not support non-image resources with the input
element. User
agents must not run executable code embedded in the image resource. User agents must only display
the first page of a multipage resource. User agents must not allow the resource to act in an
interactive fashion, but should honor any animation in the resource.
The alt
attribute
provides the textual label for the button for users and user agents who cannot use the image. The
alt
attribute must be present, and must contain a non-empty
string giving the label that would be appropriate for an equivalent button if the image was
unavailable.
The input
element supports dimension attributes.
If the src
attribute is set, and the image is available and the user agent is configured to display that image,
then the element represents a control for selecting a coordinate from the image specified by the
src
attribute. In that case, if the element is mutable, the user agent should allow the user to select this coordinate.
Otherwise, the element represents a submit button whose label is given by the
value of the alt
attribute.
The element's input activation behavior given event is as follows:
If the element does not have a form owner, then return.
If the element's node document is not fully active, then return.
If the user activated the control while explicitly selecting a coordinate, then set the element's selected coordinate to that coordinate.
This is only possible under the conditions outlined above, when the element represents a control for selecting such a coordinate. Even then, the user might activate the control without explicitly selecting a coordinate.
Submit the element's form owner from the element with userInvolvement set to event's user navigation involvement.
The element's selected coordinate consists of an x-component and a y-component. It is initially (0, 0). The coordinates represent the position relative to the edge of the element's image, with the coordinate space having the positive x direction to the right, and the positive y direction downwards.
The x-component must be a valid integer representing a number x in the range −(borderleft+paddingleft) ≤ x ≤ width+borderright+paddingright, where width is the rendered width of the image, borderleft is the width of the border on the left of the image, paddingleft is the width of the padding on the left of the image, borderright is the width of the border on the right of the image, and paddingright is the width of the padding on the right of the image, with all dimensions given in CSS pixels.
The y-component must be a valid integer representing a number y in the range −(bordertop+paddingtop) ≤ y ≤ height+borderbottom+paddingbottom, where height is the rendered height of the image, bordertop is the width of the border above the image, paddingtop is the width of the padding above the image, borderbottom is the width of the border below the image, and paddingbottom is the width of the padding below the image, with all dimensions given in CSS pixels.
Where a border or padding is missing, its width is zero CSS pixels.
The formaction
, formenctype
, formmethod
, formnovalidate
, and formtarget
attributes are attributes for form
submission.
image.width [ = value ]
image.height [ = value ]
These attributes return the actual rendered dimensions of the image, or 0 if the dimensions are not known.
They can be set, to change the corresponding content attributes.
The following common input
element content attributes and IDL attributes apply to the element:
alt
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
popovertarget
,
popovertargetaction
,
src
, and
width
content attributes;
value
IDL attribute.
The value
IDL attribute is in mode default.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
autocomplete
,
checked
,
colorspace
,
dirname
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
readonly
,
required
,
size
, and
step
.
The element's value
attribute must be omitted.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
The input
and change
events do not apply.
Many aspects of this state's behavior are similar to the behavior of the
img
element. Readers are encouraged to read that section, where many of the same
requirements are described in more detail.
Take the following form:
<form action="process.cgi">
<input type=image src=map.png name=where alt="Show location list">
</form>
If the user clicked on the image at coordinate (127,40) then the URL used to submit the form
would be "process.cgi?where.x=127&where.y=40
".
(In this example, it's assumed that for users who don't see the map, and who instead just see a button labeled "Show location list", clicking the button will cause the server to show a list of locations to pick from instead of the map.)
type=reset
)When an input
element's type
attribute is in
the Reset Button state, the rules in this section
apply.
The input
element represents a button that, when activated, resets the
form. If the element has a value
attribute,
the button's label must be the value of that attribute; otherwise, it must be an
implementation-defined string that means "Reset" or some such. The element is
a button.
Since the default label is implementation-defined, and the width of the button typically depends on the button's label, the button's width can leak a few bits of fingerprintable information. These bits are likely to be strongly correlated to the identity of the user agent and the user's locale.
The element's input activation behavior is as follows:
If the element does not have a form owner, then return.
If the element's node document is not fully active, then return.
Reset the form owner from the element.
Constraint validation: The element is barred from constraint validation.
The value
IDL attribute applies to this element and is in mode default.
The following common input
element content attributes apply to the element:
popovertarget
and
popovertargetaction
.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
autocomplete
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
readonly
,
required
,
size
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
The input
and change
events do not apply.
type=button
)When an input
element's type
attribute is in
the Button state, the rules in this section apply.
The input
element represents a button with no default behavior. A
label for the button must be provided in the value
attribute, though it may be the empty string. If the element has a value
attribute, the button's label must be the value of that
attribute; otherwise, it must be the empty string. The element is a button.
The element has no input activation behavior.
Constraint validation: The element is barred from constraint validation.
The value
IDL attribute applies to this element and is in mode default.
The following common input
element content attributes apply to the element:
popovertarget
and
popovertargetaction
.
The following content attributes must not be specified and do not apply to the
element:
accept
,
alpha
,
alt
,
autocomplete
,
checked
,
colorspace
,
dirname
,
formaction
,
formenctype
,
formmethod
,
formnovalidate
,
formtarget
,
height
,
list
,
max
,
maxlength
,
min
,
minlength
,
multiple
,
pattern
,
placeholder
,
readonly
,
required
,
size
,
src
,
step
, and
width
.
The following IDL attributes and methods do not apply to the element:
checked
,
files
,
list
,
selectionStart
,
selectionEnd
,
selectionDirection
,
valueAsDate
, and
valueAsNumber
IDL attributes;
select()
,
setRangeText()
,
setSelectionRange()
,
stepDown()
, and
stepUp()
methods.
The input
and change
events do not apply.
The formats shown to the user in date, time, and number controls is independent of the format used for form submission.
Browsers are encouraged to use user interfaces that present dates, times, and numbers according
to the conventions of either the locale implied by the input
element's
language or the user's preferred locale. Using the page's locale will ensure
consistency with page-provided data.
For example, it would be confusing to users if an American English page claimed that a Cirque De Soleil show was going to be showing on 02/03, but their browser, configured to use the British English locale, only showed the date 03/02 in the ticket purchase date picker. Using the page's locale would at least ensure that the date was presented in the same format everywhere. (There's still a risk that the user would end up arriving a month late, of course, but there's only so much that can be done about such cultural differences...)
input
element attributesThese attributes only apply to an input
element if its type
attribute is in a state whose definition
declares that the attribute applies. When an attribute
doesn't apply to an input
element, user agents must
ignore the attribute, regardless of the requirements and definitions below.
maxlength
and minlength
attributesThe maxlength
attribute, when it applies, is a
form control maxlength
attribute.
The minlength
attribute, when it applies, is a
form control minlength
attribute.
If the input
element has a maximum allowed value length, then the
length of the value of the element's value
attribute must be less than or equal to the element's maximum allowed value
length.
The following extract shows how a messaging client's text entry could be arbitrarily restricted to a fixed number of characters, thus forcing any conversation through this medium to be terse and discouraging intelligent discourse.
<label>What are you doing? <input name=status maxlength=140></label>
Here, a password is given a minimum length:
<p><label>Username: <input name=u required></label>
<p><label>Password: <input name=p required minlength=12></label>
size
attributeThe size
attribute
gives the number of characters that, in a visual rendering, the user agent is to allow the user to
see while editing the element's value.
The size
attribute, if specified, must have a value that
is a valid non-negative integer greater than zero.
If the attribute is present, then its value must be parsed using the rules for parsing non-negative integers, and if the result is a number greater than zero, then the user agent should ensure that at least that many characters are visible.
The size
IDL attribute is limited to only positive
numbers and has a default value of 20.
readonly
attributeThe readonly
attribute is a boolean attribute that controls whether or not the user can edit the
form control. When specified, the element is not mutable.
Constraint validation: If the readonly
attribute is specified on an input
element, the element is barred from constraint validation.
The difference between disabled
and readonly
is that read-only controls can still function,
whereas disabled controls generally do not function as controls until they are enabled. This is
spelled out in more detail elsewhere in this specification with normative requirements that refer
to the disabled concept (for example, the element's
activation behavior, whether or not it is a focusable area, or when
constructing the entry list). Any other behavior related to user interaction with
disabled controls, such as whether text can be selected or copied, is not defined in this
standard.
Only text controls can be made read-only, since for other controls (such as checkboxes and
buttons) there is no useful distinction between being read-only and being disabled, so the
readonly
attribute does not
apply.
In the following example, the existing product identifiers cannot be modified, but they are still displayed as part of the form, for consistency with the row representing a new product (where the identifier is not yet filled in).
<form action="products.cgi" method="post" enctype="multipart/form-data">
<table>
<tr> <th> Product ID <th> Product name <th> Price <th> Action
<tr>
<td> <input readonly="readonly" name="1.pid" value="H412">
<td> <input required="required" name="1.pname" value="Floor lamp Ulke">
<td> $<input required="required" type="number" min="0" step="0.01" name="1.pprice" value="49.99">
<td> <button formnovalidate="formnovalidate" name="action" value="delete:1">Delete</button>
<tr>
<td> <input readonly="readonly" name="2.pid" value="FG28">
<td> <input required="required" name="2.pname" value="Table lamp Ulke">
<td> $<input required="required" type="number" min="0" step="0.01" name="2.pprice" value="24.99">
<td> <button formnovalidate="formnovalidate" name="action" value="delete:2">Delete</button>
<tr>
<td> <input required="required" name="3.pid" value="" pattern="[A-Z0-9]+">
<td> <input required="required" name="3.pname" value="">
<td> $<input required="required" type="number" min="0" step="0.01" name="3.pprice" value="">
<td> <button formnovalidate="formnovalidate" name="action" value="delete:3">Delete</button>
</table>
<p> <button formnovalidate="formnovalidate" name="action" value="add">Add</button> </p>
<p> <button name="action" value="update">Save</button> </p>
</form>
required
attributeThe required
attribute is a boolean attribute. When specified, the element is required.
Constraint validation: If the element is required, and its value
IDL attribute applies and is in the mode value, and the element is mutable, and the element's value is the empty string, then the element is suffering
from being missing.
The following form has two required fields, one for an email address and one for a password. It also has a third field that is only considered valid if the user types the same password in the password field and this third field.
<h1>Create new account</h1>
<form action="/newaccount" method=post
oninput="up2.setCustomValidity(up2.value != up.value ? 'Passwords do not match.' : '')">
<p>
<label for="username">Email address:</label>
<input id="username" type=email required name=un>
<p>
<label for="password1">Password:</label>
<input id="password1" type=password required name=up>
<p>
<label for="password2">Confirm password:</label>
<input id="password2" type=password name=up2>
<p>
<input type=submit value="Create account">
</form>
For radio buttons, the required
attribute is
satisfied if any of the radio buttons in the group is
selected. Thus, in the following example, any of the radio buttons can be checked, not just the
one marked as required:
<fieldset>
<legend>Did the movie pass the Bechdel test?</legend>
<p><label><input type="radio" name="bechdel" value="no-characters"> No, there are not even two female characters in the movie. </label>
<p><label><input type="radio" name="bechdel" value="no-names"> No, the female characters never talk to each other. </label>
<p><label><input type="radio" name="bechdel" value="no-topic"> No, when female characters talk to each other it's always about a male character. </label>
<p><label><input type="radio" name="bechdel" value="yes" required> Yes. </label>
<p><label><input type="radio" name="bechdel" value="unknown"> I don't know. </label>
</fieldset>
To avoid confusion as to whether a radio button group is required or not, authors are encouraged to specify the attribute on all the radio buttons in a group. Indeed, in general, authors are encouraged to avoid having radio button groups that do not have any initially checked controls in the first place, as this is a state that the user cannot return to, and is therefore generally considered a poor user interface.
multiple
attributeThe multiple
attribute is a boolean attribute that indicates whether the user is to be allowed to
specify more than one value.
The following extract shows how an email client's "To" field could accept multiple email addresses.
<label>To: <input type=email multiple name=to></label>
If the user had, amongst many friends in their user contacts database, two friends "Spider-Man" (with address "spider@parker.example.net") and "Scarlet Witch" (with address "scarlet@avengers.example.net"), then, after the user has typed "s", the user agent might suggest these two email addresses to the user.
The page could also link in the user's contacts database from the site:
<label>To: <input type=email multiple name=to list=contacts></label>
...
<datalist id="contacts">
<option value="hedral@damowmow.com">
<option value="pillar@example.com">
<option value="astrophy@cute.example">
<option value="astronomy@science.example.org">
</datalist>
Suppose the user had entered "bob@example.net" into this text control, and then
started typing a second email address starting with "s". The user agent might show
both the two friends mentioned earlier, as well as the "astrophy" and "astronomy" values given in
the datalist
element.
The following extract shows how an email client's "Attachments" field could accept multiple files for upload.
<label>Attachments: <input type=file multiple name=att></label>
pattern
attributeThe pattern
attribute specifies a regular expression against which the control's value, or, when the multiple
attribute applies and is set, the control's values, are to be checked.
If specified, the attribute's value must match the JavaScript Pattern[+UnicodeSetsMode, +N]
production.
The compiled pattern regular expression of an input
element, if it
exists, is a JavaScript RegExp
object. It is determined as follows:
If the element does not have a pattern
attribute
specified, then return nothing. The element has no compiled pattern regular
expression.
Let pattern be the value of the pattern
attribute of the element.
Let regexpCompletion be RegExpCreate(pattern,
"v
").
If regexpCompletion is an abrupt completion, then return nothing. The element has no compiled pattern regular expression.
User agents are encouraged to log this error in a developer console, to aid debugging.
Let anchoredPattern be the string "^(?:
", followed by
pattern, followed by ")$
".
Return ! RegExpCreate(anchoredPattern, "v
").
The reasoning behind these steps, instead of just using the value of the pattern
attribute directly, is twofold. First, we want to
ensure that when matched against a string, the regular expression's start is anchored to the start
of the string and its end to the end of the string. Second, we want to ensure that the regular
expression is valid in standalone form, instead of only becoming valid after being surrounded by
the "^(?:
" and ")$
" anchors.
A RegExp
object regexp matches a string input, if !
RegExpBuiltinExec(regexp, input) is not null.
Constraint validation: If the element's value is not the empty string, and either the element's multiple
attribute is not specified or it does not apply to the input
element given its type
attribute's current state, and the element has a
compiled pattern regular expression but that regular expression does not match the element's value, then the element is suffering from a pattern
mismatch.
Constraint validation: If the element's value is not the empty string, and the element's multiple
attribute is specified and applies to the input
element, and the element has
a compiled pattern regular expression but that regular expression does not match each of the element's values, then the element is suffering from a pattern
mismatch.
When an input
element has a pattern
attribute specified, authors should include a title
attribute to give a description of the pattern. User
agents may use the contents of this attribute, if it is present, when informing the user that the
pattern is not matched, or at any other suitable time, such as in a tooltip or read out by
assistive technology when the control gains focus.
For example, the following snippet:
<label> Part number:
<input pattern="[0-9][A-Z]{3}" name="part"
title="A part number is a digit followed by three uppercase letters."/>
</label>
...could cause the UA to display an alert such as:
A part number is a digit followed by three uppercase letters. You cannot submit this form when the field is incorrect.
When a control has a pattern
attribute, the title
attribute, if used, must describe the pattern. Additional
information could also be included, so long as it assists the user in filling in the control.
Otherwise, assistive technology would be impaired.
For instance, if the title attribute contained the caption of the control, assistive technology could end up saying something like The text you have entered does not match the required pattern. Birthday, which is not useful.
UAs may still show the title
in non-error situations (for
example, as a tooltip when hovering over the control), so authors should be careful not to word
title
s as if an error has necessarily occurred.
min
and max
attributesSome form controls can have explicit constraints applied limiting the allowed range of values that the user can provide. Normally, such a range would be linear and continuous. A form control can have a periodic domain, however, in which case the form control's broadest possible range is finite, and authors can specify explicit ranges within it that span the boundaries.
Specifically, the broadest range of a type=time
control is midnight to midnight (24 hours), and
authors can set both continuous linear ranges (such as 9pm to 11pm) and discontinuous ranges
spanning midnight (such as 11pm to 1am).
The min
and max
attributes indicate the
allowed range of values for the element.
Their syntax is defined by the section that defines the type
attribute's current state.
If the element has a min
attribute, and the result of
applying the algorithm to convert a string to a
number to the value of the min
attribute is a number,
then that number is the element's minimum; otherwise, if the
type
attribute's current state defines a default minimum, then that is the minimum; otherwise, the element has no minimum.
The min
attribute also defines the step base.
If the element has a max
attribute, and the result of
applying the algorithm to convert a string to a
number to the value of the max
attribute is a number,
then that number is the element's maximum; otherwise, if the
type
attribute's current state defines a default maximum, then that is the maximum; otherwise, the element has no maximum.
If the element does not have a periodic domain, the
max
attribute's value (the maximum) must not be less than the min
attribute's value (its minimum).
If an element that does not have a periodic domain has a maximum that is less than its minimum, then so long as the element has a value, it will either be suffering from an underflow or suffering from an overflow.
An element has a reversed range if it has a periodic domain and its maximum is less than its minimum.
An element has range limitations if it has a defined minimum or a defined maximum.
Constraint validation: When the element has a minimum and does not have a reversed range, and the result of applying the algorithm to convert a string to a number to the string given by the element's value is a number, and the number obtained from that algorithm is less than the minimum, the element is suffering from an underflow.
Constraint validation: When the element has a maximum and does not have a reversed range, and the result of applying the algorithm to convert a string to a number to the string given by the element's value is a number, and the number obtained from that algorithm is more than the maximum, the element is suffering from an overflow.
Constraint validation: When an element has a reversed range, and the result of applying the algorithm to convert a string to a number to the string given by the element's value is a number, and the number obtained from that algorithm is more than the maximum and less than the minimum, the element is simultaneously suffering from an underflow and suffering from an overflow.
The following date control limits input to dates that are before the 1980s:
<input name=bday type=date max="1979-12-31">
The following number control limits input to whole numbers greater than zero:
<input name=quantity required="" type="number" min="1" value="1">
The following time control limits input to those minutes that occur between 9pm and 6am, defaulting to midnight:
<input name="sleepStart" type=time min="21:00" max="06:00" step="60" value="00:00">
step
attributeThe step
attribute
indicates the granularity that is expected (and required) of the value or values, by
limiting the allowed values. The section that defines the type
attribute's current state also defines the default step, the step scale factor, and in some cases the default step base, which are used in processing the
attribute as described below.
The step
attribute, if specified, must either have a
value that is a valid floating-point number that parses to a number that is greater than zero, or must have a
value that is an ASCII case-insensitive match for the string "any
".
The attribute provides the allowed value step for the element, as follows:
If the attribute does not apply, then there is no allowed value step.
Otherwise, if the attribute is absent, then the allowed value step is the default step multiplied by the step scale factor.
Otherwise, if the attribute's value is an ASCII case-insensitive match for the
string "any
", then there is no allowed
value step.
Otherwise, if the rules for parsing floating-point number values, when they are applied to the attribute's value, return an error, zero, or a number less than zero, then the allowed value step is the default step multiplied by the step scale factor.
Otherwise, the allowed value step is the number returned by the rules for parsing floating-point number values when they are applied to the attribute's value, multiplied by the step scale factor.
The step base is the value returned by the following algorithm:
If the element has a min
content attribute, and the
result of applying the algorithm to convert a
string to a number to the value of the min
content
attribute is not an error, then return that result.
If the element has a value
content attribute, and
the result of applying the algorithm to convert
a string to a number to the value of the value
content attribute is not an error, then return that result.
If a default step base is defined for
this element given its type
attribute's state, then return
it.
Return zero.
Constraint validation: When the element has an allowed value step, and the result of applying the algorithm to convert a string to a number to the string given by the element's value is a number, and that number subtracted from the step base is not an integral multiple of the allowed value step, the element is suffering from a step mismatch.
The following range control only accepts values in the range 0..1, and allows 256 steps in that range:
<input name=opacity type=range min=0 max=1 step=0.00392156863>
The following control allows any time in the day to be selected, with any accuracy (e.g. thousandth-of-a-second accuracy or more):
<input name=favtime type=time step=any>
Normally, time controls are limited to an accuracy of one minute.
list
attributeThe list
attribute is
used to identify an element that lists predefined options suggested to the user.
If present, its value must be the ID of a datalist
element in the same tree.
The suggestions source element is the first element in
the tree in tree order to have an ID
equal to the value of the list
attribute, if that element
is a datalist
element. If there is no list
attribute, or if there is no element with that ID, or if the
first element with that ID is not a datalist
element, then there is no suggestions source
element.
If there is a suggestions source element, then, when
the user agent is allowing the user to edit the input
element's value, the user agent should offer the suggestions represented by
the suggestions source element to the user in a manner
suitable for the type of control used. If appropriate, the user agent should use the suggestion's
label and value to identify the suggestion to the user.
User agents are encouraged to filter the suggestions represented by the suggestions source element when the number of suggestions is large, including only the most relevant ones (e.g. based on the user's input so far). No precise threshold is defined, but capping the list at four to seven values is reasonable. If filtering based on the user's input, user agents should search within both the label and value of the suggestions for matches. User agents should consider how input variations affect the matching process. Unicode normalization should be applied so that different underlying Unicode code point sequences, caused by different keyboard- or input-specific mechanisms, do not interfere with the matching process. Case variations should be ignored, which may require language-specific case mapping. For examples of these, see Character Model for the World Wide Web: String Matching. User agents may also provide other matching features: for illustration, a few examples include matching different forms of kana to each other (or to kanji), ignoring accents, or applying spelling correction. CHARMODNORM
This text field allows you to choose a type of JavaScript function.
<input type="text" list="function-types">
<datalist id="function-types">
<option value="function">function</option>
<option value="async function">async function</option>
<option value="function*">generator function</option>
<option value="=>">arrow function</option>
<option value="async =>">async arrow function</option>
<option value="async function*">async generator function</option>
</datalist>
For user agents that follow the above suggestions, both the label and value would be shown:
Then, typing "arrow" or "=>" would filter the list to the entries with labels "arrow function" and "async arrow function". Typing "generator" or "*" would filter the list to the entries with labels "generator function" and "async generator function".
As always, user agents are free to make user interface decisions which are appropriate for their particular requirements and for the user's particular circumstances. However, this has historically been an area of confusion for implementers, web developers, and users alike, so we've given some "should" suggestions above.
How user selections of suggestions are handled depends on whether the element is a control accepting a single value only, or whether it accepts multiple values:
multiple
attribute
specified or if the multiple
attribute does not applyWhen the user selects a suggestion, the input
element's value must be set to the selected suggestion's value, as if the user had written that value themself.
type
attribute is in the Email state and the element has a multiple
attribute specifiedWhen the user selects a suggestion, the user agent must either add a new entry to the
input
element's values, whose value
is the selected suggestion's value, or change an
existing entry in the input
element's values to have the value given by the selected
suggestion's value, as if the user had themself added
an entry with that value, or edited an existing entry to be that value. Which behavior is to be
applied depends on the user interface in an implementation-defined manner.
If the list
attribute does not
apply, there is no suggestions source element.
This URL field offers some suggestions.
<label>Homepage: <input name=hp type=url list=hpurls></label>
<datalist id=hpurls>
<option value="https://www.google.com/" label="Google">
<option value="https://www.reddit.com/" label="Reddit">
</datalist>
Other URLs from the user's history might show also; this is up to the user agent.
This example demonstrates how to design a form that uses the autocompletion list feature while still degrading usefully in legacy user agents.
If the autocompletion list is merely an aid, and is not important to the content, then simply
using a datalist
element with children option
elements is enough. To
prevent the values from being rendered in legacy user agents, they need to be placed inside the
value
attribute instead of inline.
<p>
<label>
Enter a breed:
<input type="text" name="breed" list="breeds">
<datalist id="breeds">
<option value="Abyssinian">
<option value="Alpaca">
<!-- ... -->
</datalist>
</label>
</p>
However, if the values need to be shown in legacy UAs, then fallback content can be placed
inside the datalist
element, as follows:
<p>
<label>
Enter a breed:
<input type="text" name="breed" list="breeds">
</label>
<datalist id="breeds">
<label>
or select one from the list:
<select name="breed">
<option value=""> (none selected)
<option>Abyssinian
<option>Alpaca
<!-- ... -->
</select>
</label>
</datalist>
</p>
The fallback content will only be shown in UAs that don't support datalist
. The
options, on the other hand, will be detected by all UAs, even though they are not children of the
datalist
element.
Note that if an option
element used in a datalist
is selected
, it will be selected by default by legacy UAs
(because it affects the select
element), but it will not have any effect on the
input
element in UAs that support datalist
.
placeholder
attributeThe placeholder
attribute represents a short
hint (a word or short phrase) intended to aid the user with data entry when the control has no
value. A hint could be a sample value or a brief description of the expected format. The
attribute, if specified, must have a value that contains no U+000A LINE FEED (LF) or U+000D
CARRIAGE RETURN (CR) characters.
The placeholder
attribute should not be used as an
alternative to a label
. For a longer hint or other advisory text, the title
attribute is more appropriate.
These mechanisms are very similar but subtly different: the hint given by the
control's label
is shown at all times; the short hint given in the placeholder
attribute is shown before the user enters a
value; and the hint in the title
attribute is shown when the user
requests further help.
User agents should present this hint to the user, after having stripped newlines from it, when the element's value is the empty string, especially if the control is not focused.
If a user agent normally doesn't show this hint to the user when the control is
focused, then the user agent should nonetheless show the hint for the control if it
was focused as a result of the autofocus
attribute, since
in that case the user will not have had an opportunity to examine the control before focusing
it.
Here is an example of a mail configuration user interface that uses the placeholder
attribute:
<fieldset>
<legend>Mail Account</legend>
<p><label>Name: <input type="text" name="fullname" placeholder="John Ratzenberger"></label></p>
<p><label>Address: <input type="email" name="address" placeholder="john@example.net"></label></p>
<p><label>Password: <input type="password" name="password"></label></p>
<p><label>Description: <input type="text" name="desc" placeholder="My Email Account"></label></p>
</fieldset>
In situations where the control's content has one directionality but the placeholder needs to have a different directionality, Unicode's bidirectional-algorithm formatting characters can be used in the attribute value:
<input name=t1 type=tel placeholder="‫ رقم الهاتف 1 ‮">
<input name=t2 type=tel placeholder="‫ رقم الهاتف 2 ‮">
For slightly more clarity, here's the same example using numeric character references instead of inline Arabic:
<input name=t1 type=tel placeholder="‫رقم الهاتف 1‮">
<input name=t2 type=tel placeholder="‫رقم الهاتف 2‮">
input
element APIsinput.value [ = value ]
Returns the current value of the form control.
Can be set, to change the value.
Throws an "InvalidStateError
" DOMException
if it is
set to any value other than the empty string when the control is a file upload control.
input.checked [ = value ]
Returns the current checkedness of the form control.
Can be set, to change the checkedness.
input.files [ = files ]
Returns a FileList
object listing the selected files of the form control.
Returns null if the control isn't a file control.
Can be set to a FileList
object to change the selected files of the form control. For
instance, as the result of a drag-and-drop operation.
input.valueAsDate [ = value ]
Returns a Date
object representing the form control's value, if applicable; otherwise, returns null.
Can be set, to change the value.
Throws an "InvalidStateError
" DOMException
if the
control isn't date- or time-based.
input.valueAsNumber [ = value ]
Returns a number representing the form control's value, if applicable; otherwise, returns NaN.
Can be set, to change the value. Setting this to NaN will set the underlying value to the empty string.
Throws an "InvalidStateError
" DOMException
if the
control is neither date- or time-based nor numeric.
input.stepUp([ n ])
input.stepDown([ n ])
Changes the form control's value by the value given in
the step
attribute, multiplied by n. The
default value for n is 1.
Throws "InvalidStateError
" DOMException
if the control
is neither date- or time-based nor numeric, or if the step
attribute's value is "any
".
input.list
Returns the datalist
element indicated by the list
attribute.
input.showPicker()
Shows any applicable picker UI for input, so that the user can select a value. (If no picker UI is implemented for the given control, then this method does nothing.)
Throws an "InvalidStateError
" DOMException
if
input is not mutable.
Throws a "NotAllowedError
" DOMException
if called
without transient user activation.
Throws a "SecurityError
" DOMException
if
input is inside a cross-origin iframe
, unless input is in the
File Upload or Color states.
The value
IDL
attribute allows scripts to manipulate the value of an
input
element. The attribute is in one of the following modes, which define its
behavior:
On getting, return the current value of the element.
On setting:
Let oldValue be the element's value.
Set the element's value to the new value.
Set the element's dirty value flag to true.
Invoke the value sanitization algorithm, if the element's type
attribute's current state defines one.
If the element's value (after applying the
value sanitization algorithm) is different from oldValue, and the
element has a text entry cursor position,
move the text entry cursor position to the
end of the text control, unselecting any selected text and resetting the selection direction to "none
".
On getting, if the element has a value
content
attribute, return that attribute's value; otherwise, return the empty string.
On setting, set the value of the element's value
content attribute to the new value.
On getting, if the element has a value
content
attribute, return that attribute's value; otherwise, return the string "on
".
On setting, set the value of the element's value
content attribute to the new value.
On getting, return the string "C:\fakepath\
" followed by the name of
the first file in the list of selected
files, if any, or the empty string if the list is empty.
On setting, if the new value is the empty string, empty the list of selected files; otherwise, throw an
"InvalidStateError
" DOMException
.
This "fakepath" requirement is a sad accident of history. See the example in the File Upload state section for more information.
Since path components are not permitted in filenames in the list of selected files, the "\fakepath\" cannot be mistaken for a path component.
The checked
IDL attribute allows scripts to manipulate the checkedness of an input
element. On getting, it
must return the current checkedness of the element; and
on setting, it must set the element's checkedness to the
new value and set the element's dirty checkedness
flag to true.
The files
IDL
attribute allows scripts to access the element's selected files.
On getting, if the IDL attribute applies, it must
return a FileList
object that represents the current selected files. The same object must be returned
until the list of selected files changes.
If the IDL attribute does not apply, then it must instead
return null. FILEAPI
On setting, it must run these steps:
If the IDL attribute does not apply or the given value is null, then return.
Replace the element's selected files with the given value.
The valueAsDate
IDL attribute represents the value of the element, interpreted as a date.
On getting, if the valueAsDate
attribute does not apply, as defined for the input
element's type
attribute's current state, then return null. Otherwise, run
the algorithm to convert a string to a
Date
object defined for that state to the element's value; if the algorithm returned a Date
object, then
return it, otherwise, return null.
On setting, if the valueAsDate
attribute does not apply, as defined for the input
element's type
attribute's current state, then throw an
"InvalidStateError
" DOMException
; otherwise, if the new
value is not null and not a Date
object throw a TypeError
exception;
otherwise, if the new value is null or a Date
object representing the NaN time value,
then set the value of the element to the empty string;
otherwise, run the algorithm to convert a
Date
object to a string, as defined for that state, on the new value, and set
the value of the element to the resulting string.
The valueAsNumber
IDL attribute represents the value of the element, interpreted as a number.
On getting, if the valueAsNumber
attribute does not apply, as defined for the input
element's type
attribute's current state, then return a Not-a-Number (NaN)
value. Otherwise, run the algorithm to convert a
string to a number defined for that state to the element's value; if the algorithm returned a number, then return it,
otherwise, return a Not-a-Number (NaN) value.
On setting, if the new value is infinite, then throw a TypeError
exception.
Otherwise, if the valueAsNumber
attribute does not apply, as defined for the input
element's type
attribute's current state, then throw an
"InvalidStateError
" DOMException
. Otherwise, if the new
value is a Not-a-Number (NaN) value, then set the value of
the element to the empty string. Otherwise, run the algorithm to convert a number to a string, as
defined for that state, on the new value, and set the value
of the element to the resulting string.
The stepDown(n)
and stepUp(n)
methods,
when invoked, must run the following algorithm:
If the stepDown()
and stepUp()
methods do not apply, as defined for the
input
element's type
attribute's current state,
then throw an "InvalidStateError
" DOMException
.
If the element has no allowed value step, then
throw an "InvalidStateError
" DOMException
.
If the element has a minimum and a maximum and the minimum is greater than the maximum, then return.
If the element has a minimum and a maximum and there is no value greater than or equal to the element's minimum and less than or equal to the element's maximum that, when subtracted from the step base, is an integral multiple of the allowed value step, then return.
If applying the algorithm to convert a string to a number to the string given by the element's value does not result in an error, then let value be the result of that algorithm. Otherwise, let value be zero.
Let valueBeforeStepping be value.
If value subtracted from the step
base is not an integral multiple of the allowed value
step, then set value to the nearest value that, when subtracted from
the step base, is an integral multiple of the allowed value step, and that is less than value if
the method invoked was the stepDown()
method, and more
than value otherwise.
Otherwise (value subtracted from the step base is an integral multiple of the allowed value step):
Let n be the argument.
Let delta be the allowed value step multiplied by n.
If the method invoked was the stepDown()
method,
negate delta.
Let value be the result of adding delta to value.
If the element has a minimum, and value is less than that minimum, then set value to the smallest value that, when subtracted from the step base, is an integral multiple of the allowed value step, and that is more than or equal to minimum.
If the element has a maximum, and value is greater than that maximum, then set value to the largest value that, when subtracted from the step base, is an integral multiple of the allowed value step, and that is less than or equal to maximum.
If either the method invoked was the stepDown()
method and value is greater than valueBeforeStepping, or the method
invoked was the stepUp()
method and value is
less than valueBeforeStepping, then return.
This ensures that invoking the stepUp()
method on the
input
element in the following example does not change the value of that element:
<input type=number value=1 max=0>
Let value as string be the result of running the algorithm to convert a number to a string, as
defined for the input
element's type
attribute's current state, on value.
Set the value of the element to value as string.
The list
IDL
attribute must return the current suggestions source
element, if any, or null otherwise.
The HTMLInputElement
showPicker()
and HTMLSelectElement
showPicker()
method steps are:
If this is not mutable, then throw
an "InvalidStateError
" DOMException
.
If this's relevant settings object's origin is not same origin with
this's relevant settings object's top-level origin, and
this is a select
element, or
this's type
attribute is not in the File Upload state or Color state, then throw a
"SecurityError
" DOMException
.
File and Color inputs are exempted from this check for historical reason: their input activation behavior also shows their pickers, and has never been guarded by an origin check.
If this's relevant global object does not have transient
activation, then throw a "NotAllowedError
"
DOMException
.
If this is a select
element, and this is not
being rendered, then throw a "NotSupportedError
"
DOMException
.
Show the picker, if applicable, for this.
To show the picker, if applicable for an input
or select
element element:
If element's relevant global object does not have transient activation, then return.
If element is not mutable, then return.
Consume user activation given element's relevant global object.
If element is an input
element and element's type
attribute is in the File Upload state, then run these steps in
parallel:
Optionally, wait until any prior execution of this algorithm has terminated.
Display a prompt to the user requesting that the user specify some files. If the multiple
attribute is not set on element, there
must be no more than one file selected; otherwise, any number may be selected. Files can be
from the filesystem or created on the fly, e.g., a picture taken from a camera connected to the
user's device.
Wait for the user to have made their selection.
If the user dismissed the prompt without changing their selection, then queue an
element task on the user interaction task source given element
to fire an event named cancel
at element, with the bubbles
attribute initialized to true.
Otherwise, update the file selection for element.
As with all user interface specifications, user agents have a good deal of
freedom in how they interpret these requirements. The above text implies that a user either
dismisses the prompt or changes their selection; exactly one of these will be true. But the
mapping of these possibilities to specific user interface elements is not mandated by the
standard. For example, a user agent might interpret clicking the "Cancel" button when files were
previously selected as a change of selection to select zero files, thus firing input
and change
. Or it might
interpret such a click as a dismissal that leaves the selection unchanged, thus firing cancel
. Similarly, it's up to the user agent whether re-selecting
the same files as were previously selected counts as a dismissal, or as a change of
selection.
Otherwise, the user agent should show any relevant user interface for selecting a value for element, in the way it normally would when the user interacts with the control. (If no such UI applies to element, then this step does nothing.)
If such a user interface is shown, it must respect the requirements stated in the relevant
parts of the specification for how element behaves given its type
attribute state. (For example, various sections describe
restrictions on the resulting value string.)
This step can have side effects, such as closing other pickers that were previously shown by
this algorithm. (If this closes a file selection picker, then per the above that will lead to
firing either input
and change
events, or a cancel
event.)
As of the time of this writing, typical browser implementations show such picker UI for:
input
elements whose type
attributes are in the Date, Month, Week,
Time, Local Date and Time, and Color states;
input
elements in various states that have a suggestions source element;
input
elements whose type
attribute
is in the File Upload state (although those are
handled via the special case above, instead of by this step); and
select
elements.
However, the intent of this step is to trigger any picker UI implementation. So for example, if a user agent implemented a password picker UI for the Password state, then this method would be expected to show that picker UI when called on a password input.
When the input
and change
events apply
(which is the case for all input
controls other than buttons and those with the type
attribute in the Hidden state), the events are fired to indicate that the
user has interacted with the control. The input
event fires
whenever the user has modified the data of the control. The change
event fires when the value is committed, if that makes sense
for the control, or else when the control loses focus.
In all cases, the input
event comes before the corresponding
change
event (if any).
When an input
element has a defined input activation behavior, the
rules for dispatching these events, if they apply, are
given in the section above that defines the type
attribute's
state. (This is the case for all input
controls with the type
attribute in the Checkbox state, the Radio Button state, or the File Upload state.)
For input
elements without a defined input activation behavior, but
to which these events apply, and for which the user
interface involves both interactive manipulation and an explicit commit action, then when the
user changes the element's value, the user agent must
queue an element task on the user interaction task source given the
input
element to fire an event named input
at the input
element, with the bubbles
and composed
attributes initialized to true, and any time the user commits the change, the user agent must
queue an element task on the user interaction task source given the
input
element to set its user validity to true and fire an event named change
at the input
element, with the bubbles
attribute initialized to true.
An example of a user interface involving both interactive manipulation and a
commit action would be a Range controls that use a
slider, when manipulated using a pointing device. While the user is dragging the control's knob,
input
events would fire whenever the position changed,
whereas the change
event would only fire when the user
let go of the knob, committing to a specific value.
For input
elements without a defined input activation behavior, but
to which these events apply, and for which the user
interface involves an explicit commit action but no intermediate manipulation, then any time the
user commits a change to the element's value, the user
agent must queue an element task on the user interaction task source
given the input
element to first fire an
event named input
at the input
element, with
the bubbles
and composed
attributes initialized to true, and then fire an event named change
at the input
element, with the bubbles
attribute initialized to true.
An example of a user interface with a commit action would be a Color control that consists of a single button that brings up a color wheel: if the value only changes when the dialog is closed, then that would be the explicit commit action. On the other hand, if manipulating the control changes the color interactively, then there might be no commit action.
Another example of a user interface with a commit action would be a Date control that allows both text-based user input and user selection from a drop-down calendar: while text input might not have an explicit commit step, selecting a date from the drop down calendar and then dismissing the drop down would be a commit action.
For input
elements without a defined input activation behavior, but
to which these events apply, any time the user causes
the element's value to change without an explicit commit
action, the user agent must queue an element task on the user interaction task
source given the input
element to fire an
event named input
at the input
element, with
the bubbles
and composed
attributes initialized to true. The corresponding
change
event, if any, will be fired when the control loses focus.
Examples of a user changing the element's value would include the user typing into a text control, pasting a new value into the control, or undoing an edit in that control. Some user interactions do not cause changes to the value, e.g., hitting the "delete" key in an empty text control, or replacing some text in the control with text from the clipboard that happens to be exactly the same text.
A Range control in the form of a slider that the user has focused and is interacting with using a keyboard would be another example of the user changing the element's value without a commit step.
In the case of tasks that just fire an input
event, user agents may wait for a suitable break in the user's
interaction before queuing the tasks; for example, a
user agent could wait for the user to have not hit a key for 100ms, so as to only fire the event
when the user pauses, instead of continuously for each keystroke.
When the user agent is to change an input
element's value on behalf of the user (e.g. as part of a form prefilling
feature), the user agent must queue an element task on the user interaction
task source given the input
element to first update the value accordingly, then fire an
event named input
at the input
element, with
the bubbles
and composed
attributes initialized to true, then fire an event named change
at the input
element, with the bubbles
attribute initialized to true.
These events are not fired in response to changes made to the values of form controls by scripts. (This is to make it easier to update the values of form controls in response to the user manipulating the controls, without having to then filter out the script's own changes to avoid an infinite loop.)
These events are also not fired when the browser changes the values of form controls as part of state restoration during navigation.
button
elementtabindex
attribute
specified.disabled
form
formaction
formenctype
formmethod
formnovalidate
formtarget
name
popovertarget
popovertargetaction
type
value
[Exposed=Window]
interface HTMLButtonElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute USVString formAction;
[CEReactions] attribute DOMString formEnctype;
[CEReactions] attribute DOMString formMethod;
[CEReactions] attribute boolean formNoValidate;
[CEReactions] attribute DOMString formTarget;
[CEReactions] attribute DOMString name;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString value;
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
undefined setCustomValidity(DOMString error);
readonly attribute NodeList labels;
};
HTMLButtonElement includes PopoverInvokerElement;
HTMLButtonElement
.The button
element represents a button labeled by its contents.
The element is a button.
The type
attribute
controls the behavior of the button when it is activated. It is an enumerated
attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
submit
| Submit Button | Submits the form. |
reset
| Reset Button | Resets the form. |
button
| Button | Does nothing. |
The attribute's missing value default and invalid value default are both the Submit Button state.
If the type
attribute is in the Submit Button state, the element is specifically a
submit button.
Constraint validation: If the type
attribute is in the Reset Button state or the
Button state, the element is barred from
constraint validation.
A button
element element's activation behavior given
event is:
If element is disabled, then return.
If element's node document is not fully active, then return.
If element has a form owner then switch on element's type
attribute's state, then:
Submit element's form owner from element with userInvolvement set to event's user navigation involvement.
Reset element's form owner.
Do nothing.
Run the popover target attribute activation behavior given element and event's target.
The form
attribute is used to explicitly associate the
button
element with its form owner. The name
attribute represents the element's name. The disabled
attribute is used to make the control non-interactive and
to prevent its value from being submitted. The formaction
,
formenctype
, formmethod
, formnovalidate
, and formtarget
attributes are attributes for form
submission.
The formnovalidate
attribute can be
used to make submit buttons that do not trigger the constraint validation.
The formaction
, formenctype
, formmethod
, formnovalidate
, and formtarget
must not be specified if the element's type
attribute is not in the Submit Button state.
The value
attribute gives the element's value for the purposes of form submission. The element's value is the value of the element's value
attribute, if there is one, or the empty string
otherwise.
A button (and its value) is only included in the form submission if the button itself was used to initiate the form submission.
The value
IDL attribute must reflect the content attribute of the same name.
The type
IDL
attribute must reflect the content attribute of the same name, limited to only
known values.
The willValidate
, validity
, and validationMessage
IDL attributes, and the checkValidity()
, reportValidity()
, and setCustomValidity()
methods, are part of the
constraint validation API. The labels
IDL
attribute provides a list of the element's label
s. The disabled
, form
, and
name
IDL attributes are part of the element's forms API.
The following button is labeled "Show hint" and pops up a dialog box when activated:
<button type=button
onclick="alert('This 15-20 minute piece was composed by George Gershwin.')">
Show hint
</button>
select
elementoption
, optgroup
, hr
, and script-supporting elements.autocomplete
disabled
form
multiple
name
required
size
multiple
attribute or a size
attribute with a value > 1: for authors; for implementers.[Exposed=Window]
interface HTMLSelectElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString autocomplete;
[CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute boolean multiple;
[CEReactions] attribute DOMString name;
[CEReactions] attribute boolean required;
[CEReactions] attribute unsigned long size;
readonly attribute DOMString type;
[SameObject] readonly attribute HTMLOptionsCollection options;
[CEReactions] attribute unsigned long length;
getter HTMLOptionElement? item(unsigned long index);
HTMLOptionElement? namedItem(DOMString name);
[CEReactions] undefined add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
[CEReactions] undefined remove(); // ChildNode overload
[CEReactions] undefined remove(long index);
[CEReactions] setter undefined (unsigned long index, HTMLOptionElement? option);
[SameObject] readonly attribute HTMLCollection selectedOptions;
attribute long selectedIndex;
attribute DOMString value;
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
undefined setCustomValidity(DOMString error);
undefined showPicker();
readonly attribute NodeList labels;
};
HTMLSelectElement
.The select
element represents a control for selecting amongst a set of
options.
The multiple
attribute is a boolean attribute. If the attribute is present, then the
select
element represents a control for selecting zero or more options
from the list of options. If the attribute is
absent, then the select
element represents a control for selecting a
single option from the list of options.
The size
attribute
gives the number of options to show to the user. The size
attribute, if specified, must have a value that is a valid non-negative integer
greater than zero.
The display size of a select
element is the
result of applying the rules for parsing non-negative integers to the value of
element's size
attribute, if it has one and parsing it is
successful. If applying those rules to the attribute's value is not successful, or if the size
attribute is absent, then the element's display size is 4 if the element's multiple
content attribute is present, and 1 otherwise.
The list of options for a select
element consists of all the option
element children of the select
element, and all the option
element children of all the optgroup
element
children of the select
element, in tree order.
The required
attribute is a boolean attribute. When specified, the user will be required to select
a value before submitting the form.
If a select
element has a required
attribute specified, does not have a multiple
attribute
specified, and has a display size of 1; and if the value of the first option
element in the
select
element's list of options (if
any) is the empty string, and that option
element's parent node is the
select
element (and not an optgroup
element), then that
option
is the select
element's placeholder label option.
If a select
element has a required
attribute specified, does not have a multiple
attribute
specified, and has a display size of 1, then the
select
element must have a placeholder label option.
In practice, the requirement stated in the paragraph above can only apply when a
select
element does not have a size
attribute
with a value greater than 1.
Constraint validation: If the element has its required
attribute specified, and either none of the
option
elements in the select
element's list of options have their selectedness set to true, or the only
option
element in the select
element's list of options with its selectedness set to true is the placeholder label
option, then the element is suffering from being missing.
If the multiple
attribute is absent, and the element
is not disabled, then the user agent should allow the
user to pick an option
element in its list
of options that is itself not disabled. Upon
this option
element being picked (either
through a click, or through unfocusing the element after changing its value, or through a menu command, or through any other mechanism), and before the
relevant user interaction event is queued (e.g. before the
click
event), the user agent must set the selectedness of the picked option
element
to true, set its dirtiness to true, and then
send select
update notifications.
If the multiple
attribute is absent, whenever an
option
element in the select
element's list of options has its selectedness set to true, and whenever an
option
element with its selectedness set to true is added to the
select
element's list of options,
the user agent must set the selectedness of all
the other option
elements in its list of
options to false.
If the multiple
attribute is absent and the
element's display size is greater than 1, then the user
agent should also allow the user to request that the option
whose selectedness is true, if any, be unselected. Upon this
request being conveyed to the user agent, and before the relevant user interaction event is queued (e.g. before the click
event), the user agent must set the selectedness of that option
element to
false, set its dirtiness to true, and then
send select
update notifications.
The selectedness setting algorithm, given a select
element
element, is to run the following steps:
If element's multiple
attribute is
absent, and element's display size is 1,
and no option
elements in the element's list of options have their selectedness set to true, then set the selectedness of the first option
element in the list of options in
tree order that is not disabled,
if any, to true, and return.
If element's multiple
attribute is
absent, and two or more option
elements in element's list of options have their selectedness set to true, then set the selectedness of all but the last option
element with its selectedness set to true in
the list of options in tree order
to false.
The option
HTML element insertion
steps, given insertedNode, are:
If insertedNode's parent is a select
element, or
insertedNode's parent is an optgroup
element whose parent is a
select
element, then run that select
element's selectedness
setting algorithm.
The option
HTML element removing
steps, given removedNode and oldParent, are:
If oldParent is a select
element, or oldParent is an
optgroup
element whose parent is a select
element, then run that
select
element's selectedness setting algorithm.
The optgroup
HTML element removing
steps, given removedNode and oldParent, are:
If oldParent is a select
element and removedNode has an
option child, then run oldParent's selectedness setting
algorithm.
If an option
element in the list of
options asks for a reset, then run that
select
element's selectedness setting algorithm.
If the multiple
attribute is present, and the
element is not disabled, then the user agent should
allow the user to toggle the selectedness of the option
elements in
its list of options that are themselves not disabled. Upon such an element being toggled (either through a click, or through a menu command, or any other mechanism), and before the relevant user
interaction event is queued (e.g. before a related click
event), the selectedness of the option
element must
be changed (from true to false or false to true), the dirtiness of the element must be set to true, and the
user agent must send select
update notifications.
When the user agent is to send select
update notifications, queue
an element task on the user interaction task source given the select
element to run these steps:
select
element's user validity to true.Fire an event named input
at the select
element, with the bubbles
and composed
attributes initialized to true.
Fire an event named change
at the select
element, with the bubbles
attribute initialized to true.
The reset algorithm for a select
element selectElement is:
Set selectElement's user validity to false.
For each optionElement of selectElement's list of options:
If optionElement has a selected
attribute, then set optionElement's selectedness to true; otherwise set it to
false.
Set optionElement's dirtiness to false.
Run the selectedness setting algorithm given selectElement.
The form
attribute is used to explicitly associate the select
element with its form owner.
The name
attribute represents the element's name.
The disabled
attribute is used to make the control non-interactive and to prevent its value from being submitted.
The autocomplete
attribute controls how the user agent provides autofill behavior.
A select
element that is not disabled is
mutable.
select.type
Returns "select-multiple
" if the element has a multiple
attribute, and "select-one
"
otherwise.
select.options
Returns an HTMLOptionsCollection
of the list of options.
select.length [ = value ]
Returns the number of elements in the list of options.
When set to a smaller number, truncates the number of option
elements in the
select
.
When set to a greater number, adds new blank option
elements to the
select
.
element = select.item(index)
select[index]
Returns the item with index index from the list of options. The items are sorted in tree order.
element = select.namedItem(name)
Returns the first item with ID or name
name from the list of options.
Returns null if no element with that ID could be found.
select.add(element [, before ])
Inserts element before the node given by before.
The before argument can be a number, in which case element is inserted before the item with that number, or an element from the list of options, in which case element is inserted before that element.
If before is omitted, null, or a number out of range, then element will be added at the end of the list.
This method will throw a "HierarchyRequestError
"
DOMException
if element is an ancestor of the element into which it is
to be inserted.
select.selectedOptions
Returns an HTMLCollection
of the list
of options that are selected.
select.selectedIndex [ = value ]
Returns the index of the first selected item, if any, or −1 if there is no selected item.
Can be set, to change the selection.
select.value [ = value ]
Returns the value of the first selected item, if any, or the empty string if there is no selected item.
Can be set, to change the selection.
select.showPicker()
Shows any applicable picker UI for select, so that the user can select a value.
Throws an "InvalidStateError
" DOMException
if
select is not mutable.
Throws a "NotAllowedError
" DOMException
if called
without transient user activation.
Throws a "SecurityError
" DOMException
if
select is inside a cross-origin iframe
.
Throws a "NotSupportedError
" DOMException
if
select is not being rendered.
The type
IDL
attribute, on getting, must return the string "select-one
" if the multiple
attribute is absent, and the string "select-multiple
" if the multiple
attribute is present.
The options
IDL attribute must return an
HTMLOptionsCollection
rooted at the select
node, whose filter matches
the elements in the list of options.
The options
collection is also mirrored on the
HTMLSelectElement
object. The supported property indices at any instant
are the indices supported by the object returned by the options
attribute at that instant.
The length
IDL attribute must return the number of nodes represented by the options
collection.
On setting, it must act like the attribute of the same name on the options
collection.
The item(index)
method must return the value returned
by the method of the same name on the options
collection, when invoked with the same argument.
The namedItem(name)
method must return the value
returned by the method of the same name on the
options
collection, when invoked with the same
argument.
When the user agent is to set the value of a new indexed
property or set the value of an existing indexed property for a
select
element, it must instead run the
corresponding algorithm on the select
element's options
collection.
Similarly, the add(element, before)
method must act
like its namesake method on that same options
collection.
The remove()
method must act like its namesake method on that same options
collection when it has arguments, and like its namesake
method on the ChildNode
interface implemented by the HTMLSelectElement
ancestor interface Element
when it has no arguments.
The selectedOptions
IDL attribute must return an
HTMLCollection
rooted at the select
node, whose filter matches the
elements in the list of options that have their
selectedness set to true.
The selectedIndex
IDL attribute, on getting, must
return the index of the first option
element in the list of options in tree
order that has its selectedness set to
true, if any. If there isn't one, then it must return −1.
On setting, the selectedIndex
attribute must set
the selectedness of all the option
elements in the list of options to false, and
then the option
element in the list of
options whose index is the given new value, if
any, must have its selectedness set to true and
its dirtiness set to true.
This can result in no element having a selectedness set to true even in the case of the
select
element having no multiple
attribute and a display size of 1.
The value
IDL attribute, on getting, must return the value of the
first option
element in the list of
options in tree order that has its selectedness set to true, if any. If there isn't one,
then it must return the empty string.
On setting, the value
attribute must set the selectedness of all the option
elements
in the list of options to false, and then the
first option
element in the list of
options, in tree order, whose value
is equal to the given new value, if any, must have its selectedness set to true and its dirtiness set to true.
This can result in no element having a selectedness set to true even in the case of the
select
element having no multiple
attribute and a display size of 1.
The multiple
, required
, and size
IDL attributes must
reflect the respective content attributes of the same name. The size
IDL attribute has a default value of 0.
For historical reasons, the default value of the size
IDL attribute does not return the actual size used, which, in
the absence of the size
content attribute, is either 1 or 4
depending on the presence of the multiple
attribute.
The willValidate
, validity
, and validationMessage
IDL attributes, and the checkValidity()
, reportValidity()
, and setCustomValidity()
methods, are part of the
constraint validation API. The labels
IDL
attribute provides a list of the element's label
s. The disabled
, form
, and
name
IDL attributes are part of the element's forms API.
The following example shows how a select
element can be used to offer the user
with a set of options from which the user can select a single option. The default option is
preselected.
<p>
<label for="unittype">Select unit type:</label>
<select id="unittype" name="unittype">
<option value="1"> Miner </option>
<option value="2"> Puffer </option>
<option value="3" selected> Snipey </option>
<option value="4"> Max </option>
<option value="5"> Firebot </option>
</select>
</p>
When there is no default option, a placeholder can be used instead:
<select name="unittype" required>
<option value=""> Select unit type </option>
<option value="1"> Miner </option>
<option value="2"> Puffer </option>
<option value="3"> Snipey </option>
<option value="4"> Max </option>
<option value="5"> Firebot </option>
</select>
Here, the user is offered a set of options from which they can select any number. By default, all five options are selected.
<p>
<label for="allowedunits">Select unit types to enable on this map:</label>
<select id="allowedunits" name="allowedunits" multiple>
<option value="1" selected> Miner </option>
<option value="2" selected> Puffer </option>
<option value="3" selected> Snipey </option>
<option value="4" selected> Max </option>
<option value="5" selected> Firebot </option>
</select>
</p>
Sometimes, a user has to select one or more items. This example shows such an interface.
<label>
Select the songs from that you would like on your Act II Mix Tape:
<select multiple required name="act2">
<option value="s1">It Sucks to Be Me (Reprise)
<option value="s2">There is Life Outside Your Apartment
<option value="s3">The More You Ruv Someone
<option value="s4">Schadenfreude
<option value="s5">I Wish I Could Go Back to College
<option value="s6">The Money Song
<option value="s7">School for Monsters
<option value="s8">The Money Song (Reprise)
<option value="s9">There's a Fine, Fine Line (Reprise)
<option value="s10">What Do You Do With a B.A. in English? (Reprise)
<option value="s11">For Now
</select>
</label>
Occasionally it can be useful to have a separator:
<label>
Select the song to play next:
<select required name="next">
<option value="sr">Random
<hr>
<option value="s1">It Sucks to Be Me (Reprise)
<option value="s2">There is Life Outside Your Apartment
…
datalist
elementoption
and script-supporting elements.[Exposed=Window]
interface HTMLDataListElement : HTMLElement {
[HTMLConstructor] constructor();
[SameObject] readonly attribute HTMLCollection options;
};
HTMLDataListElement
.The datalist
element represents a set of option
elements that
represent predefined options for other controls. In the rendering, the datalist
element represents nothing and it, along with its children, should
be hidden.
The datalist
element can be used in two ways. In the simplest case, the
datalist
element has just option
element children.
<label>
Animal:
<input name=animal list=animals>
<datalist id=animals>
<option value="Cat">
<option value="Dog">
</datalist>
</label>
In the more elaborate case, the datalist
element can be given contents that are to
be displayed for down-level clients that don't support datalist
. In this case, the
option
elements are provided inside a select
element inside the
datalist
element.
<label>
Animal:
<input name=animal list=animals>
</label>
<datalist id=animals>
<label>
or select from the list:
<select name=animal>
<option value="">
<option>Cat
<option>Dog
</select>
</label>
</datalist>
The datalist
element is hooked up to an input
element using the list
attribute on the input
element.
Each option
element that is a descendant of the datalist
element,
that is not disabled, and whose value is a string that isn't the empty string, represents a
suggestion. Each suggestion has a value and a label.
datalist.options
Returns an HTMLCollection
of the option
elements of the
datalist
element.
The options
IDL attribute must return an
HTMLCollection
rooted at the datalist
node, whose filter matches
option
elements.
Constraint validation: If an element has a datalist
element
ancestor, it is barred from constraint validation.
optgroup
elementselect
element.option
and script-supporting elements.disabled
label
[Exposed=Window]
interface HTMLOptGroupElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean disabled;
[CEReactions] attribute DOMString label;
};
HTMLOptGroupElement
.The optgroup
element represents a group of option
elements with a common label.
The element's group of option
elements consists of the option
elements that are children of the optgroup
element.
When showing option
elements in select
elements, user agents should
show the option
elements of such groups as being related to each other and separate
from other option
elements.
The disabled
attribute is a boolean
attribute and can be used to disable a group
of option
elements together.
The label
attribute must be specified. Its value gives the name of the group, for the purposes of the user
interface. User agents should use this attribute's value when labeling the group of
option
elements in a select
element.
The disabled
and label
attributes must
reflect the respective content attributes of the same name.
There is no way to select an optgroup
element. Only
option
elements can be selected. An optgroup
element merely provides a
label for a group of option
elements.
The following snippet shows how a set of lessons from three courses could be offered in a
select
drop-down widget:
<form action="courseselector.dll" method="get">
<p>Which course would you like to watch today?
<p><label>Course:
<select name="c">
<optgroup label="8.01 Physics I: Classical Mechanics">
<option value="8.01.1">Lecture 01: Powers of Ten
<option value="8.01.2">Lecture 02: 1D Kinematics
<option value="8.01.3">Lecture 03: Vectors
<optgroup label="8.02 Electricity and Magnetism">
<option value="8.02.1">Lecture 01: What holds our world together?
<option value="8.02.2">Lecture 02: Electric Field
<option value="8.02.3">Lecture 03: Electric Flux
<optgroup label="8.03 Physics III: Vibrations and Waves">
<option value="8.03.1">Lecture 01: Periodic Phenomenon
<option value="8.03.2">Lecture 02: Beats
<option value="8.03.3">Lecture 03: Forced Oscillations with Damping
</select>
</label>
<p><input type=submit value="▶ Play">
</form>
option
elementselect
element.datalist
element.optgroup
element.label
attribute and a value
attribute: Nothing.label
attribute but no value
attribute: Text.label
attribute and is not a
child of a datalist
element: Text that is not
inter-element whitespace.label
attribute and is a child
of a datalist
element: Text.disabled
label
selected
value
[Exposed=Window,
LegacyFactoryFunction=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)]
interface HTMLOptionElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute DOMString label;
[CEReactions] attribute boolean defaultSelected;
attribute boolean selected;
[CEReactions] attribute DOMString value;
[CEReactions] attribute DOMString text;
readonly attribute long index;
};
HTMLOptionElement
.The option
element represents an option in a select
element or as part of a list of suggestions in a datalist
element.
In certain circumstances described in the definition of the select
element, an
option
element can be a select
element's placeholder label
option. A placeholder label option does not represent an actual option, but
instead represents a label for the select
control.
The disabled
attribute is a boolean attribute. An option
element is disabled if its disabled
attribute is present or if it is a child of an
optgroup
element whose disabled
attribute is present.
An option
element that is disabled must
prevent any click
events that are queued on the user interaction task source from being dispatched on the
element.
The label
attribute provides a label for element. The label of an
option
element is the value of the label
content attribute, if there is one and its value is not the empty string, or, otherwise, the value
of the element's text
IDL attribute.
The label
content attribute, if specified, must not be
empty.
The value
attribute provides a value for element. The value of an
option
element is the value of the value
content attribute, if there is one, or, if there is not, the value of the element's text
IDL attribute.
The selected
attribute is a boolean attribute. It represents the default selectedness of the element.
The dirtiness of an option
element is
a boolean state, initially false. It controls whether adding or removing the selected
content attribute has any effect.
The selectedness of an option
element is a boolean state, initially false. Except where otherwise specified, when the element is
created, its selectedness must be set to true if
the element has a selected
attribute. Whenever an
option
element's selected
attribute is
added, if its dirtiness is false, its selectedness must be set to true. Whenever an
option
element's selected
attribute is
removed, if its dirtiness is false, its
selectedness must be set to false.
The Option()
constructor, when called with three
or fewer arguments, overrides the initial state of the selectedness state to always be false even if the third
argument is true (implying that a selected
attribute is
to be set). The fourth argument can be used to explicitly set the initial selectedness state when using the constructor.
A select
element whose multiple
attribute is not specified must not have more than one descendant option
element with
its selected
attribute set.
An option
element's index is the number of
option
elements that are in the same list of
options but that come before it in tree order. If the option
element is not in a list of options, then the
option
element's index is zero.
option.selected
Returns true if the element is selected, and false otherwise.
Can be set, to override the current state of the element.
option.index
Returns the index of the element in its select
element's options
list.
option.form
Returns the element's form
element, if any, or null otherwise.
option.text
Same as textContent
, except that spaces are collapsed and script
elements are skipped.
option = new Option([ text [, value [, defaultSelected [, selected ] ] ] ])
Returns a new option
element.
The text argument sets the contents of the element.
The value argument sets the value
attribute.
The defaultSelected argument sets the selected
attribute.
The selected argument sets whether or not the element is selected. If it is omitted, even if the defaultSelected argument is true, the element is not selected.
The disabled
IDL attribute must reflect the
content attribute of the same name. The defaultSelected
IDL attribute must
reflect the selected
content
attribute.
The label
IDL attribute, on getting, if there is a label
content
attribute, must return that attribute's value; otherwise, it must return the element's label. On setting, the element's label
content attribute must be set to the new value.
The value
IDL attribute, on getting, must return the element's value. On setting, the element's value
content attribute must be set to the new value.
The selected
IDL attribute, on getting, must return true if
the element's selectedness is true, and false
otherwise. On setting, it must set the element's selectedness to the new value, set its dirtiness to true, and then cause the element to
ask for a reset.
The index
IDL attribute must return the element's index.
The text
IDL
attribute, on getting, must return the result of stripping and collapsing ASCII whitespace from the concatenation of data of all the Text
node descendants of the
option
element, in tree order, excluding any that are descendants of
descendants of the option
element that are themselves script
or
SVG script
elements.
The text
attribute's setter must string replace
all with the given value within this element.
The form
IDL
attribute's behavior depends on whether the option
element is in a
select
element or not. If the option
has a select
element
as its parent, or has an optgroup
element as its parent and that
optgroup
element has a select
element as its parent, then the form
IDL attribute must return the same value as the form
IDL attribute on that select
element. Otherwise, it
must return null.
A legacy factory function is provided for creating HTMLOptionElement
objects (in
addition to the factory methods from DOM such as createElement()
): Option(text, value,
defaultSelected, selected)
. When invoked, the legacy factory
function must perform the following steps:
Let document be the current global object's associated Document
.
Let option be the result of creating an
element given document, option
, and the HTML
namespace.
If text is not the empty string, then append to option a new
Text
node whose data is text.
If value is given, then set
an attribute value for option using "value
" and value.
If defaultSelected is true, then set an attribute value for option
using "selected
" and the empty string.
If selected is true, then set option's selectedness to true; otherwise set its selectedness to false (even if defaultSelected is true).
Return option.
textarea
elementautocomplete
cols
dirname
disabled
form
maxlength
minlength
name
placeholder
readonly
required
rows
wrap
[Exposed=Window]
interface HTMLTextAreaElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString autocomplete;
[CEReactions] attribute unsigned long cols;
[CEReactions] attribute DOMString dirName;
[CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute long maxLength;
[CEReactions] attribute long minLength;
[CEReactions] attribute DOMString name;
[CEReactions] attribute DOMString placeholder;
[CEReactions] attribute boolean readOnly;
[CEReactions] attribute boolean required;
[CEReactions] attribute unsigned long rows;
[CEReactions] attribute DOMString wrap;
readonly attribute DOMString type;
[CEReactions] attribute DOMString defaultValue;
attribute [LegacyNullToEmptyString] DOMString value;
readonly attribute unsigned long textLength;
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
undefined setCustomValidity(DOMString error);
readonly attribute NodeList labels;
undefined select();
attribute unsigned long selectionStart;
attribute unsigned long selectionEnd;
attribute DOMString selectionDirection;
undefined setRangeText(DOMString replacement);
undefined setRangeText(DOMString replacement, unsigned long start, unsigned long end, optional SelectionMode selectionMode = "preserve");
undefined setSelectionRange(unsigned long start, unsigned long end, optional DOMString direction);
};
HTMLTextAreaElement
.The textarea
element represents a multiline plain text edit
control for the element's raw
value. The contents of the control represent the control's default value.
The raw value of a textarea
control must be initially the empty string.
This element has rendering requirements involving the bidirectional algorithm.
The readonly
attribute is a boolean
attribute used to control whether the text can be edited by the user or not.
In this example, a text control is marked read-only because it represents a read-only file:
Filename: <code>/etc/bash.bashrc</code>
<textarea name="buffer" readonly>
# System-wide .bashrc file for interactive bash(1) shells.
# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
...</textarea>
Constraint validation: If the readonly
attribute is specified on a textarea
element, the element is barred from constraint validation.
A textarea
element is mutable if it is
neither disabled nor has a readonly
attribute specified.
When a textarea
is mutable, its raw value should be editable by the user: the user
agent should allow the user to edit, insert, and remove text, and to insert and remove line breaks
in the form of U+000A LINE FEED (LF) characters. Any time the user causes the element's raw value to change, the user agent must queue an
element task on the user interaction task source given the
textarea
element to fire an event named
input
at the textarea
element, with the bubbles
and composed
attributes initialized to true. User agents may wait for a suitable break in the user's
interaction before queuing the task; for example, a user agent could wait for the user to have not
hit a key for 100ms, so as to only fire the event when the user pauses, instead of continuously
for each keystroke.
A textarea
element's dirty value flag must
be set to true whenever the user interacts with the control in a way that changes the raw value.
The cloning steps for textarea
elements must propagate the raw value and dirty value flag from the node being cloned to the copy.
The children changed steps for textarea
elements must, if the
element's dirty value flag is false, set the element's
raw value to its child text
content.
The reset algorithm for textarea
elements is to set the user validity to false, dirty value flag back to false, and set the raw value of element to its child text
content.
When a textarea
element is popped off the stack of open elements of
an HTML parser or XML parser, then the user agent must invoke the
element's reset algorithm.
If the element is mutable, the user agent should allow the user to change the writing direction of the element, setting it either to a left-to-right writing direction or a right-to-left writing direction. If the user does so, the user agent must then run the following steps:
Set the element's dir
attribute to "ltr
" if the user selected a left-to-right writing direction, and
"rtl
" if the user selected a right-to-left writing
direction.
Queue an element task on the user interaction task source given
the textarea
element to fire an event named
input
at the textarea
element, with the bubbles
and composed
attributes initialized to true.
The cols
attribute specifies the expected maximum number of characters per line. If the cols
attribute is specified, its value must be a valid
non-negative integer greater than zero. If applying the rules for
parsing non-negative integers to the attribute's value results in a number greater than
zero, then the element's character width is that
value; otherwise, it is 20.
The user agent may use the textarea
element's character width as a hint to the user as to how many
characters the server prefers per line (e.g. for visual user agents by making the width of the
control be that many characters). In visual renderings, the user agent should wrap the user's
input in the rendering so that each line is no wider than this number of characters.
The rows
attribute specifies the number of lines to show. If the rows
attribute is specified, its value must be a valid
non-negative integer greater than zero. If applying the rules for
parsing non-negative integers to the attribute's value results in a number greater than
zero, then the element's character height is that
value; otherwise, it is 2.
Visual user agents should set the height of the control to the number of lines given by character height.
The wrap
attribute is an enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
soft
| Soft | Text is not to be wrapped when submitted (though can still be wrapped in the rendering). |
hard
| Hard | Text is to have newlines added by the user agent so that the text is wrapped when it is submitted. |
The attribute's missing value default and invalid value default are both the Soft state.
If the element's wrap
attribute is in the Hard state, the cols
attribute must be specified.
For historical reasons, the element's value is normalized in three different ways for three
different purposes. The raw value is the value as
it was originally set. It is not normalized. The API
value is the value used in the value
IDL
attribute, textLength
IDL attribute, and by the
maxlength
and minlength
content attributes. It is normalized so that line
breaks use U+000A LINE FEED (LF) characters. Finally, there is the value, as used in form submission and other processing models in
this specification. It is normalized as for the API
value, and in addition, if necessary given the element's wrap
attribute, additional line breaks are inserted to wrap the
text at the given width.
The algorithm for obtaining the element's API value is to return the element's raw value, with newlines normalized.
The element's value is defined to be the element's API value with the textarea wrapping transformation applied. The textarea wrapping transformation is the following algorithm, as applied to a string:
If the element's wrap
attribute is in the Hard state, insert U+000A LINE FEED (LF) characters
into the string using an implementation-defined algorithm so that each line has no
more than character width characters. For the
purposes of this requirement, lines are delimited by the start of the string, the end of the
string, and U+000A LINE FEED (LF) characters.
The maxlength
attribute is a form control maxlength
attribute.
If the textarea
element has a maximum allowed value length, then the
element's children must be such that the length of the value of the element's
descendant text content with newlines
normalized is less than or equal to the element's maximum allowed value
length.
The minlength
attribute is a form control minlength
attribute.
The required
attribute is a boolean
attribute. When specified, the user will be required to enter a value before submitting the
form.
Constraint validation: If the element has its required
attribute specified, and the element is mutable, and the element's value is the empty string, then the element is suffering
from being missing.
The placeholder
attribute represents a short
hint (a word or short phrase) intended to aid the user with data entry when the control has no
value. A hint could be a sample value or a brief description of the expected format.
The placeholder
attribute should not be used as
an alternative to a label
. For a longer hint or other advisory text, the title
attribute is more appropriate.
These mechanisms are very similar but subtly different: the hint given by the
control's label
is shown at all times; the short hint given in the placeholder
attribute is shown before the user enters a
value; and the hint in the title
attribute is shown when the user
requests further help.
User agents should present this hint to the user when the element's value is the empty string and the control is not focused (e.g. by displaying it inside a blank unfocused control). All U+000D CARRIAGE RETURN U+000A LINE FEED character pairs (CRLF) in the hint, as well as all other U+000D CARRIAGE RETURN (CR) and U+000A LINE FEED (LF) characters in the hint, must be treated as line breaks when rendering the hint.
If a user agent normally doesn't show this hint to the user when the control is
focused, then the user agent should nonetheless show the hint for the control if it
was focused as a result of the autofocus
attribute, since
in that case the user will not have had an opportunity to examine the control before focusing
it.
The name
attribute represents the element's name.
The dirname
attribute controls how the element's directionality is submitted.
The disabled
attribute is used to make the control
non-interactive and to prevent its value from being submitted.
The form
attribute is used to explicitly associate the
textarea
element with its form owner.
The autocomplete
attribute controls how the user agent
provides autofill behavior.
textarea.type
Returns the string "textarea
".
textarea.value
Returns the current value of the element.
Can be set, to change the value.
The cols
, placeholder
, required
, rows
, and wrap
IDL
attributes must reflect the respective content attributes of the same name. The cols
and rows
attributes
are limited to only positive numbers with fallback. The cols
IDL attribute's default value is 20. The rows
IDL attribute's default value is 2. The dirName
IDL
attribute must reflect the dirname
content
attribute. The maxLength
IDL attribute must reflect the
maxlength
content attribute, limited to only
non-negative numbers. The minLength
IDL attribute must reflect the
minlength
content attribute, limited to only
non-negative numbers. The readOnly
IDL attribute must reflect the
readonly
content attribute.
The type
IDL attribute must return the value "textarea
".
The defaultValue
attribute's getter must return the
element's child text content.
The defaultValue
attribute's setter must
string replace all with the given value within this element.
The value
IDL attribute must, on getting, return the
element's API value. On setting, it must perform the
following steps:
Let oldAPIValue be this element's API value.
Set this element's raw value to the new value.
Set this element's dirty value flag to true.
If the new API value is different from
oldAPIValue, then move the text entry
cursor position to the end of the text control, unselecting any selected text and resetting the selection direction to "none
".
The textLength
IDL attribute must return the
length of the element's API value.
The willValidate
, validity
, and validationMessage
IDL attributes, and the checkValidity()
, reportValidity()
, and setCustomValidity()
methods, are part of the
constraint validation API. The labels
IDL
attribute provides a list of the element's label
s. The select()
, selectionStart
, selectionEnd
, selectionDirection
, setRangeText()
, and setSelectionRange()
methods and IDL attributes
expose the element's text selection. The disabled
,
form
, and name
IDL attributes
are part of the element's forms API.
Here is an example of a textarea
being used for unrestricted free-form text input
in a form:
<p>If you have any comments, please let us know: <textarea cols=80 name=comments></textarea></p>
To specify a maximum length for the comments, one can use the maxlength
attribute:
<p>If you have any short comments, please let us know: <textarea cols=80 name=comments maxlength=200></textarea></p>
To give a default value, text can be included inside the element:
<p>If you have any comments, please let us know: <textarea cols=80 name=comments>You rock!</textarea></p>
You can also give a minimum length. Here, a letter needs to be filled out by the user; a template (which is shorter than the minimum length) is provided, but is insufficient to submit the form:
<textarea required minlength="500">Dear Madam Speaker,
Regarding your letter dated ...
...
Yours Sincerely,
...</textarea>
A placeholder can be given as well, to suggest the basic form to the user, without providing an explicit template:
<textarea placeholder="Dear Francine,
They closed the parks this week, so we won't be able to
meet your there. Should we just have dinner?
Love,
Daddy"></textarea>
To have the browser submit the directionality of the element along with the
value, the dirname
attribute can be specified:
<p>If you have any comments, please let us know (you may use either English or Hebrew for your comments):
<textarea cols=80 name=comments dirname=comments.dir></textarea></p>
output
elementfor
form
name
[Exposed=Window]
interface HTMLOutputElement : HTMLElement {
[HTMLConstructor] constructor();
[SameObject, PutForwards=value] readonly attribute DOMTokenList htmlFor;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute DOMString name;
readonly attribute DOMString type;
[CEReactions] attribute DOMString defaultValue;
[CEReactions] attribute DOMString value;
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
undefined setCustomValidity(DOMString error);
readonly attribute NodeList labels;
};
HTMLOutputElement
.The output
element represents the result of a calculation performed
by the application, or the result of a user action.
This element can be contrasted with the samp
element, which is the
appropriate element for quoting the output of other programs run previously.
The for
content
attribute allows an explicit relationship to be made between the result of a calculation and the
elements that represent the values that went into the calculation or that otherwise influenced the
calculation. The for
attribute, if specified, must contain a
string consisting of an unordered set of unique space-separated tokens, none of which
are identical to another token and each of which must have the value of an ID of an element in the same tree.
The form
attribute is used to explicitly associate the
output
element with its form owner. The name
attribute represents the element's name. The output
element is associated with a form so that it can be easily referenced from the event
handlers of form controls; the element's value itself is not submitted when the form is
submitted.
The element has a default value override (null or a string). Initially it must be null.
The element's default value is determined by the following steps:
If this element's default value override is non-null, then return it.
Return this element's descendant text content.
The reset algorithm for output
elements is to run these steps:
String replace all with this element's default value within this element.
Set this element's default value override to null.
output.value [ = value ]
Returns the element's current value.
Can be set, to change the value.
output.defaultValue [ = value ]
Returns the element's current default value.
Can be set, to change the default value.
output.type
Returns the string "output
".
The value
getter steps are to return this's descendant text content.
The value
setter steps are:
Set this's default value override to its default value.
String replace all with the given value within this.
The defaultValue
getter steps are to return the result
of running this's default
value.
The defaultValue
setter steps are:
If this's default value override is null, then string replace all with the given value within this and return.
Set this's default value override to the given value.
The type
getter steps are to return "output
".
The htmlFor
IDL attribute must reflect the for
content attribute.
The willValidate
, validity
, and validationMessage
IDL attributes, and the checkValidity()
, reportValidity()
, and setCustomValidity()
methods, are part of the
constraint validation API. The labels
IDL
attribute provides a list of the element's label
s. The form
and name
IDL attributes are
part of the element's forms API.
A simple calculator could use output
for its display of calculated results:
<form onsubmit="return false" oninput="o.value = a.valueAsNumber + b.valueAsNumber">
<input id=a type=number step=any> +
<input id=b type=number step=any> =
<output id=o for="a b"></output>
</form>
In this example, an output
element is used to report the results of a calculation performed by a remote
server, as they come in:
<output id="result"></output>
<script>
var primeSource = new WebSocket('ws://primes.example.net/');
primeSource.onmessage = function (event) {
document.getElementById('result').value = event.data;
}
</script>
progress
elementprogress
element descendants.value
max
[Exposed=Window]
interface HTMLProgressElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute double value;
[CEReactions] attribute double max;
readonly attribute double position;
readonly attribute NodeList labels;
};
HTMLProgressElement
.The progress
element represents the completion progress of a task.
The progress is either indeterminate, indicating that progress is being made but that it is not
clear how much more work remains to be done before the task is complete (e.g. because the task is
waiting for a remote host to respond), or the progress is a number in the range zero to a maximum,
giving the fraction of work that has so far been completed.
There are two attributes that determine the current task completion represented by the element.
The value
attribute specifies how much of the task has been completed, and the max
attribute specifies how much work
the task requires in total. The units are arbitrary and not specified.
To make a determinate progress bar, add a value
attribute with the current progress (either a number from
0.0 to 1.0, or, if the max
attribute is specified, a number
from 0 to the value of the max
attribute). To make an
indeterminate progress bar, remove the value
attribute.
Authors are encouraged to also include the current value and the maximum value inline as text inside the element, so that the progress is made available to users of legacy user agents.
Here is a snippet of a web application that shows the progress of some automated task:
<section>
<h2>Task Progress</h2>
<p>Progress: <progress id=p max=100><span>0</span>%</progress></p>
<script>
var progressBar = document.getElementById('p');
function updateProgress(newValue) {
progressBar.value = newValue;
progressBar.getElementsByTagName('span')[0].textContent = newValue;
}
</script>
</section>
(The updateProgress()
method in this example would be called by some
other code on the page to update the actual progress bar as the task progressed.)
The value
and max
attributes, when present, must have values that are valid floating-point numbers. The value
attribute, if present, must have a value greater than or
equal to zero, and less than or equal to the value of the max
attribute, if present, or 1.0, otherwise. The max
attribute, if present, must have a value greater than
zero.
The progress
element is the wrong element to use for something that
is just a gauge, as opposed to task progress. For instance, indicating disk space usage using
progress
would be inappropriate. Instead, the meter
element is available
for such use cases.
User agent requirements: If the value
attribute is omitted, then the progress bar is an indeterminate progress bar. Otherwise, it is a
determinate progress bar.
If the progress bar is a determinate progress bar and the element has a max
attribute, the user agent must parse the max
attribute's value according to the rules for parsing
floating-point number values. If this does not result in an error, and if the parsed value
is greater than zero, then the maximum value of the
progress bar is that value. Otherwise, if the element has no max
attribute, or if it has one but parsing it resulted in an
error, or if the parsed value was less than or equal to zero, then the maximum value of the progress bar is 1.0.
If the progress bar is a determinate progress bar, user agents must parse the value
attribute's value according to the rules for
parsing floating-point number values. If this does not result in an error and the parsed
value is greater than zero, then the value of the
progress bar is that parsed value. Otherwise, if parsing the value
attribute's value resulted in an error or a number less
than or equal to zero, then the value of the progress
bar is zero.
If the progress bar is a determinate progress bar, then the current value is the maximum value, if value is greater than the maximum value, and value otherwise.
UA requirements for showing the progress bar: When representing a
progress
element to the user, the UA should indicate whether it is a determinate or
indeterminate progress bar, and in the former case, should indicate the relative position of the
current value relative to the maximum value.
progress.position
For a determinate progress bar (one with known current and maximum values), returns the result of dividing the current value by the maximum value.
For an indeterminate progress bar, returns −1.
If the progress bar is an indeterminate progress bar, then the position
IDL attribute
must return −1. Otherwise, it must return the result of dividing the current value by the maximum value.
If the progress bar is an indeterminate progress bar, then the value
IDL attribute, on
getting, must return 0. Otherwise, it must return the current value. On setting, the given value must be
converted to the best representation of the number as a floating-point number and
then the value
content attribute must be set to that
string.
Setting the value
IDL attribute to itself
when the corresponding content attribute is absent would change the progress bar from an
indeterminate progress bar to a determinate progress bar with no progress.
The max
IDL attribute must reflect the content attribute of the same name, limited to
only positive numbers. The default value for max
is 1.0.
The labels
IDL attribute provides a list of the element's
label
s.
meter
elementmeter
element descendants.value
min
max
low
high
optimum
[Exposed=Window]
interface HTMLMeterElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute double value;
[CEReactions] attribute double min;
[CEReactions] attribute double max;
[CEReactions] attribute double low;
[CEReactions] attribute double high;
[CEReactions] attribute double optimum;
readonly attribute NodeList labels;
};
HTMLMeterElement
.The meter
element represents a scalar measurement within a known
range, or a fractional value; for example disk usage, the relevance of a query result, or the
fraction of a voting population to have selected a particular candidate.
This is also known as a gauge.
The meter
element should not be used to indicate progress (as in a progress bar).
For that role, HTML provides a separate progress
element.
The meter
element also does not represent a scalar value of arbitrary
range — for example, it would be wrong to use this to report a weight, or height, unless
there is a known maximum value.
There are six attributes that determine the semantics of the gauge represented by the element.
The min
attribute
specifies the lower bound of the range, and the max
attribute specifies the upper bound. The value
attribute specifies
the value to have the gauge indicate as the "measured" value.
The other three attributes can be used to segment the gauge's range into "low", "medium", and
"high" parts, and to indicate which part of the gauge is the "optimum" part. The low
attribute specifies the range that is
considered to be the "low" part, and the high
attribute specifies the range that is considered to be
the "high" part. The optimum
attribute gives the position that is "optimum";
if that is higher than the "high" value then this indicates that the higher the value, the better;
if it's lower than the "low" mark then it indicates that lower values are better, and naturally if
it is in between then it indicates that neither high nor low values are good.
Authoring requirements: The value
attribute must be specified. The value
, min
, low
, high
, max
, and optimum
attributes,
when present, must have values that are valid
floating-point numbers.
In addition, the attributes' values are further constrained:
Let value be the value
attribute's
number.
If the min
attribute is specified, then let minimum be that attribute's value; otherwise, let it be zero.
If the max
attribute is specified, then let maximum be that attribute's value; otherwise, let it be 1.0.
The following inequalities must hold, as applicable:
minimum ≤ value ≤ maximum
minimum ≤ low
≤ maximum
(if low
is specified)
minimum ≤ high
≤
maximum (if high
is specified)
minimum ≤ optimum
≤
maximum (if optimum
is specified)
low
≤ high
(if both low
and high
are specified)
If no minimum or maximum is specified, then the range is assumed to be 0..1, and the value thus has to be within that range.
Authors are encouraged to include a textual representation of the gauge's state in the
element's contents, for users of user agents that do not support the meter
element.
When used with microdata, the meter
element's value
attribute provides the element's machine-readable value.
The following examples show three gauges that would all be three-quarters full:
Storage space usage: <meter value=6 max=8>6 blocks used (out of 8 total)</meter>
Voter turnout: <meter value=0.75><img alt="75%" src="graph75.png"></meter>
Tickets sold: <meter min="0" max="100" value="75"></meter>
The following example is incorrect use of the element, because it doesn't give a range (and since the default maximum is 1, both of the gauges would end up looking maxed out):
<p>The grapefruit pie had a radius of <meter value=12>12cm</meter>
and a height of <meter value=2>2cm</meter>.</p> <!-- BAD! -->
Instead, one would either not include the meter element, or use the meter element with a defined range to give the dimensions in context compared to other pies:
<p>The grapefruit pie had a radius of 12cm and a height of
2cm.</p>
<dl>
<dt>Radius: <dd> <meter min=0 max=20 value=12>12cm</meter>
<dt>Height: <dd> <meter min=0 max=10 value=2>2cm</meter>
</dl>
There is no explicit way to specify units in the meter
element, but the units may
be specified in the title
attribute in free-form text.
The example above could be extended to mention the units:
<dl>
<dt>Radius: <dd> <meter min=0 max=20 value=12 title="centimeters">12cm</meter>
<dt>Height: <dd> <meter min=0 max=10 value=2 title="centimeters">2cm</meter>
</dl>
User agent requirements: User agents must parse the min
, max
, value
, low
, high
, and optimum
attributes using the rules for parsing floating-point number values.
User agents must then use all these numbers to obtain values for six points on the gauge, as follows. (The order in which these are evaluated is important, as some of the values refer to earlier ones.)
If the min
attribute is specified and a value could be
parsed out of it, then the minimum value is that value. Otherwise, the minimum value is
zero.
If the max
attribute is specified and a value could be
parsed out of it, then the candidate maximum value is that value. Otherwise, the candidate
maximum value is 1.0.
If the candidate maximum value is greater than or equal to the minimum value, then the maximum value is the candidate maximum value. Otherwise, the maximum value is the same as the minimum value.
If the value
attribute is specified and a value could
be parsed out of it, then that value is the candidate actual value. Otherwise, the candidate
actual value is zero.
If the candidate actual value is less than the minimum value, then the actual value is the minimum value.
Otherwise, if the candidate actual value is greater than the maximum value, then the actual value is the maximum value.
Otherwise, the actual value is the candidate actual value.
If the low
attribute is specified and a value could be
parsed out of it, then the candidate low boundary is that value. Otherwise, the candidate low
boundary is the same as the minimum value.
If the candidate low boundary is less than the minimum value, then the low boundary is the minimum value.
Otherwise, if the candidate low boundary is greater than the maximum value, then the low boundary is the maximum value.
Otherwise, the low boundary is the candidate low boundary.
If the high
attribute is specified and a value could be
parsed out of it, then the candidate high boundary is that value. Otherwise, the candidate high
boundary is the same as the maximum value.
If the candidate high boundary is less than the low boundary, then the high boundary is the low boundary.
Otherwise, if the candidate high boundary is greater than the maximum value, then the high boundary is the maximum value.
Otherwise, the high boundary is the candidate high boundary.
If the optimum
attribute is specified and a value
could be parsed out of it, then the candidate optimum point is that value. Otherwise, the
candidate optimum point is the midpoint between the minimum value and the maximum value.
If the candidate optimum point is less than the minimum value, then the optimum point is the minimum value.
Otherwise, if the candidate optimum point is greater than the maximum value, then the optimum point is the maximum value.
Otherwise, the optimum point is the candidate optimum point.
All of which will result in the following inequalities all being true:
minimum value ≤ actual value ≤ maximum value
minimum value ≤ low boundary ≤ high boundary ≤ maximum value
minimum value ≤ optimum point ≤ maximum value
UA requirements for regions of the gauge: If the optimum point is equal to the low boundary or the high boundary, or anywhere in between them, then the region between the low and high boundaries of the gauge must be treated as the optimum region, and the low and high parts, if any, must be treated as suboptimal. Otherwise, if the optimum point is less than the low boundary, then the region between the minimum value and the low boundary must be treated as the optimum region, the region from the low boundary up to the high boundary must be treated as a suboptimal region, and the remaining region must be treated as an even less good region. Finally, if the optimum point is higher than the high boundary, then the situation is reversed; the region between the high boundary and the maximum value must be treated as the optimum region, the region from the high boundary down to the low boundary must be treated as a suboptimal region, and the remaining region must be treated as an even less good region.
UA requirements for showing the gauge: When representing a meter
element to the user, the UA should indicate the relative position of the actual value to the
minimum and maximum values, and the relationship between the actual value and the three regions of
the gauge.
The following markup:
<h3>Suggested groups</h3>
<menu>
<li><a href="?cmd=hsg" onclick="hideSuggestedGroups()">Hide suggested groups</a></li>
</menu>
<ul>
<li>
<p><a href="/group/comp.infosystems.www.authoring.stylesheets/view">comp.infosystems.www.authoring.stylesheets</a> -
<a href="/group/comp.infosystems.www.authoring.stylesheets/subscribe">join</a></p>
<p>Group description: <strong>Layout/presentation on the WWW.</strong></p>
<p><meter value="0.5">Moderate activity,</meter> Usenet, 618 subscribers</p>
</li>
<li>
<p><a href="/group/netscape.public.mozilla.xpinstall/view">netscape.public.mozilla.xpinstall</a> -
<a href="/group/netscape.public.mozilla.xpinstall/subscribe">join</a></p>
<p>Group description: <strong>Mozilla XPInstall discussion.</strong></p>
<p><meter value="0.25">Low activity,</meter> Usenet, 22 subscribers</p>
</li>
<li>
<p><a href="/group/mozilla.dev.general/view">mozilla.dev.general</a> -
<a href="/group/mozilla.dev.general/subscribe">join</a></p>
<p><meter value="0.25">Low activity,</meter> Usenet, 66 subscribers</p>
</li>
</ul>
Might be rendered as follows:
User agents may combine the value of the title
attribute and the other attributes to provide context-sensitive
help or inline text detailing the actual values.
For example, the following snippet:
<meter min=0 max=60 value=23.2 title=seconds></meter>
...might cause the user agent to display a gauge with a tooltip saying "Value: 23.2 out of 60." on one line and "seconds" on a second line.
The value
IDL
attribute, on getting, must return the actual value. On
setting, the given value must be converted to the best representation of the number as a
floating-point number and then the value
content
attribute must be set to that string.
The min
IDL
attribute, on getting, must return the minimum value.
On setting, the given value must be converted to the best representation of the number as a
floating-point number and then the min
content
attribute must be set to that string.
The max
IDL
attribute, on getting, must return the maximum value.
On setting, the given value must be converted to the best representation of the number as a
floating-point number and then the max
content
attribute must be set to that string.
The low
IDL
attribute, on getting, must return the low boundary. On
setting, the given value must be converted to the best representation of the number as a
floating-point number and then the low
content
attribute must be set to that string.
The high
IDL
attribute, on getting, must return the high boundary. On
setting, the given value must be converted to the best representation of the number as a
floating-point number and then the high
content
attribute must be set to that string.
The optimum
IDL attribute, on getting, must return the optimum
value. On setting, the given value must be converted to the best representation of
the number as a floating-point number and then the optimum
content attribute must be set to that string.
The labels
IDL attribute provides a list of the element's
label
s.
The following example shows how a gauge could fall back to localized or pretty-printed text.
<p>Disk usage: <meter min=0 value=170261928 max=233257824>170 261 928 bytes used
out of 233 257 824 bytes available</meter></p>
fieldset
elementlegend
element, followed by flow content.disabled
form
name
[Exposed=Window]
interface HTMLFieldSetElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute DOMString name;
readonly attribute DOMString type;
[SameObject] readonly attribute HTMLCollection elements;
readonly attribute boolean willValidate;
[SameObject] readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
undefined setCustomValidity(DOMString error);
};
HTMLFieldSetElement
.The fieldset
element represents a set of form controls (or other
content) grouped together, optionally with a caption. The caption is given by the first
legend
element that is a child of the fieldset
element, if any. The
remainder of the descendants form the group.
The disabled
attribute, when specified, causes all the
form control descendants of the fieldset
element, excluding those that are
descendants of the fieldset
element's first legend
element child, if
any, to be disabled.
A fieldset
element is a disabled
fieldset if it matches any of the following conditions:
disabled
attribute is specified
fieldset
element whose disabled
attribute is specified, and is not a
descendant of that fieldset
element's first legend
element child, if
any.The form
attribute is used to explicitly associate the
fieldset
element with its form owner. The name
attribute represents the element's name.
fieldset.type
Returns the string "fieldset".
fieldset.elements
Returns an HTMLCollection
of the form controls in the element.
The disabled
IDL attribute must reflect the
content attribute of the same name.
The type
IDL attribute must return the string "fieldset
".
The elements
IDL attribute must return an
HTMLCollection
rooted at the fieldset
element, whose filter matches
listed elements.
The willValidate
, validity
, and validationMessage
attributes, and the checkValidity()
, reportValidity()
, and setCustomValidity()
methods, are part of the
constraint validation API. The form
and name
IDL attributes are part of the element's forms API.
This example shows a fieldset
element being used to group a set of related
controls:
<fieldset>
<legend>Display</legend>
<p><label><input type=radio name=c value=0 checked> Black on White</label>
<p><label><input type=radio name=c value=1> White on Black</label>
<p><label><input type=checkbox name=g> Use grayscale</label>
<p><label>Enhance contrast <input type=range name=e list=contrast min=0 max=100 value=0 step=1></label>
<datalist id=contrast>
<option label=Normal value=0>
<option label=Maximum value=100>
</datalist>
</fieldset>
The following snippet shows a fieldset with a checkbox in the legend that controls whether or not the fieldset is enabled. The contents of the fieldset consist of two required text controls and an optional year/month control.
<fieldset name="clubfields" disabled>
<legend> <label>
<input type=checkbox name=club onchange="form.clubfields.disabled = !checked">
Use Club Card
</label> </legend>
<p><label>Name on card: <input name=clubname required></label></p>
<p><label>Card number: <input name=clubnum required pattern="[-0-9]+"></label></p>
<p><label>Expiry date: <input name=clubexp type=month></label></p>
</fieldset>
You can also nest fieldset
elements. Here is an example expanding on the previous
one that does so:
<fieldset name="clubfields" disabled>
<legend> <label>
<input type=checkbox name=club onchange="form.clubfields.disabled = !checked">
Use Club Card
</label> </legend>
<p><label>Name on card: <input name=clubname required></label></p>
<fieldset name="numfields">
<legend> <label>
<input type=radio checked name=clubtype onchange="form.numfields.disabled = !checked">
My card has numbers on it
</label> </legend>
<p><label>Card number: <input name=clubnum required pattern="[-0-9]+"></label></p>
</fieldset>
<fieldset name="letfields" disabled>
<legend> <label>
<input type=radio name=clubtype onchange="form.letfields.disabled = !checked">
My card has letters on it
</label> </legend>
<p><label>Card code: <input name=clublet required pattern="[A-Za-z]+"></label></p>
</fieldset>
</fieldset>
In this example, if the outer "Use Club Card" checkbox is not checked, everything inside the
outer fieldset
, including the two radio buttons in the legends of the two nested
fieldset
s, will be disabled. However, if the checkbox is checked, then the radio
buttons will both be enabled and will let you select which of the two inner
fieldset
s is to be enabled.
This example shows a grouping of controls where the legend
element both labels
the grouping, and the nested heading element surfaces the grouping in the document outline:
<fieldset>
<legend> <h2>
How can we best reach you?
</h2> </legend>
<p> <label>
<input type=radio checked name=contact_pref>
Phone
</label> </p>
<p> <label>
<input type=radio name=contact_pref>
Text
</label> </p>
<p> <label>
<input type=radio name=contact_pref>
Email
</label> </p>
</fieldset>
legend
elementfieldset
element.[Exposed=Window]
interface HTMLLegendElement : HTMLElement {
[HTMLConstructor] constructor();
readonly attribute HTMLFormElement? form;
// also has obsolete members
};
HTMLLegendElement
.The legend
element represents a caption for the rest of the contents
of the legend
element's parent fieldset
element, if
any.
legend.form
Returns the element's form
element, if any, or null otherwise.
The form
IDL
attribute's behavior depends on whether the legend
element is in a
fieldset
element or not. If the legend
has a fieldset
element as its parent, then the form
IDL attribute must
return the same value as the form
IDL attribute on that
fieldset
element. Otherwise, it must return null.
Most form controls have a value and a checkedness. (The latter is only used by input
elements.) These are used to describe how the user interacts with the control.
A control's value is its internal state. As such, it might not match the user's current input.
For instance, if a user enters the word "three" into a numeric field that expects digits, the user's input would
be the string "three" but the control's value would remain
unchanged. Or, if a user enters the email address " awesome@example.com"
(with leading whitespace) into an email field, the
user's input would be the string " awesome@example.com" but the browser's UI for
email fields might translate that into a value of "awesome@example.com
" (without the leading whitespace).
input
and textarea
elements have a dirty value flag.
This is used to track the interaction between the value and
default value. If it is false, value mirrors the default
value. If it is true, the default value is ignored.
input
, textarea
and select
elements have a
user validity boolean. It is initially set to false.
To define the behavior of constraint validation in the face of the input
element's multiple
attribute, input
elements
can also have separately defined values.
To define the behavior of the maxlength
and minlength
attributes, as well as other APIs specific to the
textarea
element, all form control with a value also have an algorithm for obtaining an API value. By
default this algorithm is to simply return the control's value.
The select
element does not have a value;
the selectedness of its option
elements is what is used instead.
A form control can be designated as mutable.
This determines (by means of definitions and requirements in this specification that rely on whether an element is so designated) whether or not the user can modify the value or checkedness of a form control, or whether or not a control can be automatically prefilled.
A form-associated element can have a relationship with a form
element, which is called the element's form
owner. If a form-associated element is not associated with a form
element, its form owner is said to be null.
A form-associated element has an associated parser inserted flag.
A form-associated element is, by default, associated with its nearest ancestor form
element (as described
below), but, if it is listed, may have a form
attribute specified to override this.
This feature allows authors to work around the lack of support for nested
form
elements.
If a listed form-associated element has a
form
attribute specified, then that attribute's value must be
the ID of a form
element in the element's
tree.
The rules in this section are complicated by the fact that although conforming
documents or trees will never contain nested form
elements, it is quite possible (e.g., using a script that performs DOM manipulation) to generate
trees that have such nested elements. They are also complicated by
rules in the HTML parser that, for historical reasons, can result in a form-associated
element being associated with a form
element that is not its ancestor.
When a form-associated element is created, its form owner must be initialized to null (no owner).
When a form-associated element is to be associated with a form, its form owner must be set to that form.
When a listed form-associated element's
form
attribute is set, changed, or removed, then the user
agent must reset the form owner of that element.
When a listed form-associated element has a
form
attribute and the ID of
any of the elements in the tree changes, then the user agent must reset the
form owner of that form-associated element.
When a listed form-associated element has a
form
attribute and an element with an ID is inserted
into or removed from the
Document
, then the user agent must reset the form owner of that
form-associated element.
The form owner is also reset by the HTML Standard's insertion steps and removing steps.
To reset the form owner of a form-associated element element:
Unset element's parser inserted flag.
If all of the following are true:
element's form owner is not null;
element is not listed or its form
content attribute is not present; and
element's form owner is its nearest form
element
ancestor after the change to the ancestor chain,
then return.
Set element's form owner to null.
If element is listed, has a form
content attribute, and is connected, then:
If the first element in element's tree, in tree
order, to have an ID that is identical to
element's form
content attribute's value, is a
form
element, then associate the
element with that form
element.
Otherwise, if element has an ancestor form
element, then associate element with the nearest such
ancestor form
element.
In the following non-conforming snippet
...
<form id="a">
<div id="b"></div>
</form>
<script>
document.getElementById('b').innerHTML =
'<table><tr><td></form><form id="c"><input id="d"></table>' +
'<input id="e">';
</script>
...
the form owner of "d" would be the inner nested form "c", while the form owner of "e" would be the outer form "a".
This happens as follows: First, the "e" node gets associated with "c" in the HTML
parser. Then, the innerHTML
algorithm moves the nodes
from the temporary document to the "b" element. At this point, the nodes see their ancestor chain
change, and thus all the "magic" associations done by the parser are reset to normal ancestor
associations.
This example is a non-conforming document, though, as it is a violation of the content models
to nest form
elements, and there is a parse error for the </form>
tag.
element.form
Returns the element's form owner.
Returns null if there isn't one.
Listed form-associated elements except for form-associated custom elements have a form
IDL attribute, which, on getting, must return the
element's form owner, or null if there isn't one.
Form-associated custom elements don't have
form
IDL attribute. Instead, their
ElementInternals
object has a form
IDL attribute. On getting, it must throw a
"NotSupportedError
" DOMException
if the target element is not a form-associated custom
element. Otherwise, it must return the element's form owner, or null if there
isn't one.
name
attributeThe name
content attribute gives the name of the form control, as
used in form submission and in the form
element's elements
object. If the attribute is specified, its value must
not be the empty string or isindex
.
A number of user agents historically implemented special support for first-in-form
text controls with the name isindex
, and this specification previously
defined related user agent requirements for it. However, some user agents subsequently dropped
that special support, and the related requirements were removed from this specification. So, to
avoid problematic reinterpretations in legacy user agents, the name isindex
is no longer allowed.
Other than isindex
, any non-empty value for name
is allowed. An ASCII case-insensitive match for
the name _charset_
is special: if used as
the name of a Hidden control with no value
attribute, then during submission the value
attribute is automatically given a value consisting of the
submission character encoding.
The name
IDL attribute must reflect the name
content attribute.
DOM clobbering is a common cause of security issues. Avoid using the names of
built-in form properties with the name
content attribute.
In this example, the input
element overrides the built-in method
property:
let form = document.createElement("form");
let input = document.createElement("input");
form.appendChild(input);
form.method; // => "get"
input.name = "method"; // DOM clobbering occurs here
form.method === input; // => true
Since the input name takes precedence over built-in form properties, the JavaScript reference
form.method
will point to the input
element named "method"
instead of the built-in method
property.
dirname
attributeThe dirname
attribute on a form control element enables the submission of the directionality of
the element, and gives the name of the control that contains this value during form
submission. If such an attribute is specified, its value must not be the empty string.
In this example, a form contains a text control and a submission button:
<form action="addcomment.cgi" method=post>
<p><label>Comment: <input type=text name="comment" dirname="comment.dir" required></label></p>
<p><button name="mode" type=submit value="add">Post Comment</button></p>
</form>
When the user submits the form, the user agent includes three fields, one called "comment", one called "comment.dir", and one called "mode"; so if the user types "Hello", the submission body might be something like:
comment=Hello&comment.dir=ltr&mode=add
If the user manually switches to a right-to-left writing direction and enters "مرحبا", the submission body might be something like:
comment=%D9%85%D8%B1%D8%AD%D8%A8%D8%A7&comment.dir=rtl&mode=add
maxlength
attributeA form
control maxlength
attribute, controlled by the dirty value flag, declares a limit on the number of characters a
user can input. The number of characters is measured using length and, in the case
of textarea
elements, with all newlines normalized to a single character (as opposed
to CRLF pairs).
If an element has its form control maxlength
attribute specified, the attribute's value must be a valid
non-negative integer. If the attribute is specified and applying the rules for
parsing non-negative integers to its value results in a number, then that number is the
element's maximum allowed value length. If the attribute is omitted or parsing its
value results in an error, then there is no maximum allowed value length.
Constraint validation: If an element has a maximum allowed value length, its dirty value flag is true, its value was last changed by a user edit (as opposed to a change made by a script), and the length of the element's API value is greater than the element's maximum allowed value length, then the element is suffering from being too long.
User agents may prevent the user from causing the element's API value to be set to a value whose length is greater than the element's maximum allowed value length.
In the case of textarea
elements, the API value and value
differ. In particular, newline normalization is applied
before the maximum allowed value length is checked (whereas the textarea
wrapping transformation is not applied).
minlength
attributeA form
control minlength
attribute, controlled by the dirty value flag, declares a lower bound on the number of
characters a user can input. The "number of characters" is measured using length and,
in the case of textarea
elements, with all newlines normalized to a single character
(as opposed to CRLF pairs).
The minlength
attribute does not imply the
required
attribute. If the form control has no required
attribute, then the value can still be omitted; the minlength
attribute only kicks in once the user has entered a
value at all. If the empty string is not allowed, then the required
attribute also needs to be set.
If an element has its form control minlength
attribute specified, the attribute's value must be a valid
non-negative integer. If the attribute is specified and applying the rules for
parsing non-negative integers to its value results in a number, then that number is the
element's minimum allowed value length. If the attribute is omitted or parsing its
value results in an error, then there is no minimum allowed value length.
If an element has both a maximum allowed value length and a minimum allowed value length, the minimum allowed value length must be smaller than or equal to the maximum allowed value length.
Constraint validation: If an element has a minimum allowed value length, its dirty value flag is true, its value was last changed by a user edit (as opposed to a change made by a script), its value is not the empty string, and the length of the element's API value is less than the element's minimum allowed value length, then the element is suffering from being too short.
In this example, there are four text controls. The first is required, and has to be at least 5 characters long. The other three are optional, but if the user fills one in, the user has to enter at least 10 characters.
<form action="/events/menu.cgi" method="post">
<p><label>Name of Event: <input required minlength=5 maxlength=50 name=event></label></p>
<p><label>Describe what you would like for breakfast, if anything:
<textarea name="breakfast" minlength="10"></textarea></label></p>
<p><label>Describe what you would like for lunch, if anything:
<textarea name="lunch" minlength="10"></textarea></label></p>
<p><label>Describe what you would like for dinner, if anything:
<textarea name="dinner" minlength="10"></textarea></label></p>
<p><input type=submit value="Submit Request"></p>
</form>
disabled
attributeThe disabled
content attribute is a boolean
attribute.
The disabled
attribute for
option
elements and the disabled
attribute for optgroup
elements are defined separately.
A form control is disabled if any of the following are true:
the element is a button
, input
, select
,
textarea
, or form-associated custom element, and the disabled
attribute is specified on this element (regardless of
its value); or
the element is a descendant of a fieldset
element whose disabled
attribute is specified, and is not a
descendant of that fieldset
element's first legend
element child, if
any.
A form control that is disabled must prevent any click
events that are queued on the
user interaction task source from being dispatched on the element.
Constraint validation: If an element is disabled, it is barred from constraint validation.
The disabled
IDL attribute must reflect the disabled
content attribute.
Attributes for form submission can be specified both on form
elements
and on submit buttons (elements that represent buttons
that submit forms, e.g. an input
element whose type
attribute is in the Submit Button state).
The attributes for form submission that may be specified on form
elements are action
, enctype
, method
, novalidate
, and target
.
The corresponding attributes for form submission that may be specified on submit buttons are formaction
, formenctype
, formmethod
, formnovalidate
, and formtarget
. When omitted, they default to the values given on
the corresponding attributes on the form
element.
The action
and
formaction
content attributes, if specified, must have a value that is a valid non-empty URL
potentially surrounded by spaces.
The action of an element is the value of the element's
formaction
attribute, if the element is a submit button and has such an attribute, or the value of its
form owner's action
attribute, if it has
one, or else the empty string.
The method
and
formmethod
content attributes are enumerated attributes with the
following keywords and states:
Keyword | State | Brief description |
---|---|---|
get
| GET | Indicates the form will use the HTTP GET method.
|
post
| POST | Indicates the form will use the HTTP POST method.
|
dialog
| Dialog | Indicates the form is intended to close the dialog box in which
the form finds itself, if any, and otherwise not submit.
|
The method
attribute's missing value default and invalid value default
are both the GET state.
The formmethod
attribute has no missing value default, and its invalid value
default is the GET state.
The method of an element is one of those states. If the
element is a submit button and has a formmethod
attribute, then the element's method is that attribute's state; otherwise, it is the form
owner's method
attribute's state.
Here the method
attribute is used to explicitly specify
the default value, "get
", so that the search
query is submitted in the URL:
<form method="get" action="/search.cgi">
<p><label>Search terms: <input type=search name=q></label></p>
<p><input type=submit></p>
</form>
On the other hand, here the method
attribute is used to
specify the value "post
", so that the user's
message is submitted in the HTTP request's body:
<form method="post" action="/post-message.cgi">
<p><label>Message: <input type=text name=m></label></p>
<p><input type=submit value="Submit message"></p>
</form>
In this example, a form
is used with a dialog
. The method
attribute's "dialog
" keyword is used to have the dialog
automatically close when the form is submitted.
<dialog id="ship">
<form method=dialog>
<p>A ship has arrived in the harbour.</p>
<button type=submit value="board">Board the ship</button>
<button type=submit value="call">Call to the captain</button>
</form>
</dialog>
<script>
var ship = document.getElementById('ship');
ship.showModal();
ship.onclose = function (event) {
if (ship.returnValue == 'board') {
// ...
} else {
// ...
}
};
</script>
The enctype
and
formenctype
content attributes are enumerated attributes with the
following keywords and states:
application/x-www-form-urlencoded
" keyword and
corresponding state.multipart/form-data
" keyword and corresponding
state.text/plain
" keyword and corresponding state.The attribute's missing value default and invalid value default are both the application/x-www-form-urlencoded
state.
The formenctype
attribute has no missing value default, and its invalid value
default is the application/x-www-form-urlencoded
state.
The enctype of an element is one of those three states.
If the element is a submit button and has a formenctype
attribute, then the element's enctype is that attribute's state; otherwise, it is the
form owner's enctype
attribute's state.
The target
and
formtarget
content attributes, if specified, must have values that are valid navigable target names or keywords.
The novalidate
and formnovalidate
content attributes are boolean attributes. If present, they indicate that the form is
not to be validated during submission.
The no-validate state of an element is true if the
element is a submit button and the element's formnovalidate
attribute is present, or if the element's
form owner's novalidate
attribute is present,
and false otherwise.
This attribute is useful to include "save" buttons on forms that have validation constraints, to allow users to save their progress even though they haven't fully entered the data in the form. The following example shows a simple form that has two required fields. There are three buttons: one to submit the form, which requires both fields to be filled in; one to save the form so that the user can come back and fill it in later; and one to cancel the form altogether.
<form action="editor.cgi" method="post">
<p><label>Name: <input required name=fn></label></p>
<p><label>Essay: <textarea required name=essay></textarea></label></p>
<p><input type=submit name=submit value="Submit essay"></p>
<p><input type=submit formnovalidate name=save value="Save essay"></p>
<p><input type=submit formnovalidate name=cancel value="Cancel"></p>
</form>
The action
IDL
attribute must reflect the content attribute of the same name, except that on
getting, when the content attribute is missing or its value is the empty string, the element's
node document's URL must be returned
instead. The target
IDL attribute must reflect the content attribute of the same name. The method
and enctype
IDL attributes must
reflect the respective content attributes of the same name, limited to only
known values. The encoding
IDL attribute must reflect the enctype
content attribute, limited to only known
values. The noValidate
IDL attribute must reflect the
novalidate
content attribute. The formAction
IDL attribute must reflect the formaction
content attribute, except that on getting, when the content attribute is missing or its value is
the empty string, the element's node document's URL must be returned instead. The formEnctype
IDL attribute must reflect the
formenctype
content attribute, limited to only
known values. The formMethod
IDL attribute must reflect the
formmethod
content attribute, limited to only known
values. The formNoValidate
IDL attribute must reflect
the formnovalidate
content attribute. The formTarget
IDL
attribute must reflect the formtarget
content attribute.
autocomplete
attributeUser agents sometimes have features for helping users fill forms in, for example prefilling the
user's address based on earlier user input. The autocomplete
content attribute can be used to hint to
the user agent how to, or indeed whether to, provide such a feature.
There are two ways this attribute is used. When wearing the autofill expectation
mantle, the autocomplete
attribute describes what
input is expected from users. When wearing the autofill anchor mantle, the autocomplete
attribute describes the meaning of the given
value.
On an input
element whose type
attribute is
in the Hidden state, the autocomplete
attribute wears the autofill anchor
mantle. In all other cases, it wears the autofill expectation mantle.
When wearing the autofill expectation mantle, the autocomplete
attribute, if specified, must have a value that
is an ordered set of space-separated tokens consisting of either a single token that
is an ASCII case-insensitive match for the string "off
", or a single token that is an ASCII
case-insensitive match for the string "on
",
or autofill detail tokens.
When wearing the autofill anchor
mantle, the autocomplete
attribute, if specified, must have a value that is an ordered set of
space-separated tokens consisting of just autofill detail tokens (i.e. the
"on
" and "off
" keywords are not allowed).
Autofill detail tokens are the following, in the order given below:
Optionally, a token whose first eight characters are an ASCII case-insensitive
match for the string "section-
", meaning that the field belongs to
the named group.
For example, if there are two shipping addresses in the form, then they could be marked up as:
<fieldset>
<legend>Ship the blue gift to...</legend>
<p> <label> Address: <textarea name=ba autocomplete="section-blue shipping street-address"></textarea> </label>
<p> <label> City: <input name=bc autocomplete="section-blue shipping address-level2"> </label>
<p> <label> Postal Code: <input name=bp autocomplete="section-blue shipping postal-code"> </label>
</fieldset>
<fieldset>
<legend>Ship the red gift to...</legend>
<p> <label> Address: <textarea name=ra autocomplete="section-red shipping street-address"></textarea> </label>
<p> <label> City: <input name=rc autocomplete="section-red shipping address-level2"> </label>
<p> <label> Postal Code: <input name=rp autocomplete="section-red shipping postal-code"> </label>
</fieldset>
Optionally, a token that is an ASCII case-insensitive match for one of the following strings:
shipping
", meaning the field is part of the
shipping address or contact information
billing
", meaning the field is part of the
billing address or contact information
Either of the following two options:
A token that is an ASCII case-insensitive match for one of the following autofill field names, excluding those that are inappropriate for the control:
name
"
honorific-prefix
"
given-name
"
additional-name
"
family-name
"
honorific-suffix
"
nickname
"
username
"
new-password
"
current-password
"
one-time-code
"
organization-title
"
organization
"
street-address
"
address-line1
"
address-line2
"
address-line3
"
address-level4
"
address-level3
"
address-level2
"
address-level1
"
country
"
country-name
"
postal-code
"
cc-name
"
cc-given-name
"
cc-additional-name
"
cc-family-name
"
cc-number
"
cc-exp
"
cc-exp-month
"
cc-exp-year
"
cc-csc
"
cc-type
"
transaction-currency
"
transaction-amount
"
language
"
bday
"
bday-day
"
bday-month
"
bday-year
"
sex
"
url
"
photo
"
(See the table below for descriptions of these values.)
The following, in the given order:
Optionally, a token that is an ASCII case-insensitive match for one of the following strings:
home
", meaning the field is for contacting
someone at their residence
work
", meaning the field is for contacting
someone at their workplace
mobile
", meaning the
field is for contacting someone regardless of location
fax
", meaning the field describes a fax
machine's contact details
pager
", meaning the field describes a
pager's or beeper's contact details
A token that is an ASCII case-insensitive match for one of the following autofill field names, excluding those that are inappropriate for the control:
tel
"
tel-country-code
"
tel-national
"
tel-area-code
"
tel-local
"
tel-local-prefix
"
tel-local-suffix
"
tel-extension
"
email
"
impp
"
(See the table below for descriptions of these values.)
Optionally, a token that is an ASCII case-insensitive match for the string
"webauthn
", meaning the user agent
should show public key credentials available via
conditional
mediation when the user interacts with the
form control. webauthn
is only valid for
input
and textarea
elements.
As noted earlier, the meaning of the attribute and its keywords depends on the mantle that the attribute is wearing.
The "off
" keyword indicates either that the control's
input data is particularly sensitive (for example the activation code for a nuclear weapon); or
that it is a value that will never be reused (for example a one-time-key for a bank login) and
the user will therefore have to explicitly enter the data each time, instead of being able to
rely on the UA to prefill the value for them; or that the document provides its own autocomplete
mechanism and does not want the user agent to provide autocompletion values.
The "on
" keyword indicates that the user agent is
allowed to provide the user with autocompletion values, but does not provide any further
information about what kind of data the user might be expected to enter. User agents would have
to use heuristics to decide what autocompletion values to suggest.
The autofill field listed above indicate that the user agent is allowed to provide the user with autocompletion values, and specifies what kind of value is expected. The meaning of each such keyword is described in the table below.
If the autocomplete
attribute is omitted, the default
value corresponding to the state of the element's form owner's autocomplete
attribute is used instead (either "on
" or "off
"). If there is no form owner, then the
value "on
" is used.
The autofill field listed above indicate that the value of the particular kind of value specified is that value provided for this element. The meaning of each such keyword is described in the table below.
In this example the page has explicitly specified the currency and amount of the transaction. The form requests a credit card and other billing details. The user agent could use this information to suggest a credit card that it knows has sufficient balance and that supports the relevant currency.
<form method=post action="step2.cgi">
<input type=hidden autocomplete=transaction-currency value="CHF">
<input type=hidden autocomplete=transaction-amount value="15.00">
<p><label>Credit card number: <input type=text inputmode=numeric autocomplete=cc-number></label>
<p><label>Expiry Date: <input type=month autocomplete=cc-exp></label>
<p><input type=submit value="Continue...">
</form>
The autofill field keywords relate to each other as described in the table below. Each field name
listed on a row of this table corresponds to the meaning given in the cell for that row in the
column labeled "Meaning". Some fields correspond to subparts of other fields; for example, a
credit card expiry date can be expressed as one field giving both the month and year of expiry
("cc-exp
"), or as two fields, one giving the
month ("cc-exp-month
") and one the year
("cc-exp-year
"). In such cases, the names of
the broader fields cover multiple rows, in which the narrower fields are defined.
Generally, authors are encouraged to use the broader fields rather than the narrower fields, as the narrower fields tend to expose Western biases. For example, while it is common in some Western cultures to have a given name and a family name, in that order (and thus often referred to as a first name and a surname), many cultures put the family name first and the given name second, and many others simply have one name (a mononym). Having a single field is therefore more flexible.
Some fields are only appropriate for certain form controls. An autofill field name is inappropriate for a control if the control does not belong to the group listed for that autofill field in the fifth column of the first row describing that autofill field in the table below. What controls fall into each group is described below the table.
Field name | Meaning | Canonical Format | Canonical Format Example | Control group | |||
---|---|---|---|---|---|---|---|
"name "
| Full name | Free-form text, no newlines | Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA | Text | |||
"honorific-prefix "
| Prefix or title (e.g. "Mr.", "Ms.", "Dr.", "Mlle") | Free-form text, no newlines | Sir | Text | |||
"given-name "
| Given name (in some Western cultures, also known as the first name) | Free-form text, no newlines | Timothy | Text | |||
"additional-name "
| Additional names (in some Western cultures, also known as middle names, forenames other than the first name) | Free-form text, no newlines | John | Text | |||
"family-name "
| Family name (in some Western cultures, also known as the last name or surname) | Free-form text, no newlines | Berners-Lee | Text | |||
"honorific-suffix "
| Suffix (e.g. "Jr.", "B.Sc.", "MBASW", "II") | Free-form text, no newlines | OM, KBE, FRS, FREng, FRSA | Text | |||
"nickname "
| Nickname, screen name, handle: a typically short name used instead of the full name | Free-form text, no newlines | Tim | Text | |||
"organization-title "
| Job title (e.g. "Software Engineer", "Senior Vice President", "Deputy Managing Director") | Free-form text, no newlines | Professor | Text | |||
"username "
| A username | Free-form text, no newlines | timbl | Username | |||
"new-password "
| A new password (e.g. when creating an account or changing a password) | Free-form text, no newlines | GUMFXbadyrS3 | Password | |||
"current-password "
| The current password for the account identified by the username field (e.g. when logging in)
| Free-form text, no newlines | qwerty | Password | |||
"one-time-code "
| One-time code used for verifying user identity | Free-form text, no newlines | 123456 | Password | |||
"organization "
| Company name corresponding to the person, address, or contact information in the other fields associated with this field | Free-form text, no newlines | World Wide Web Consortium | Text | |||
"street-address "
| Street address (multiple lines, newlines preserved) | Free-form text | 32 Vassar Street MIT Room 32-G524 | Multiline | |||
"address-line1 "
| Street address (one line per field) | Free-form text, no newlines | 32 Vassar Street | Text | |||
"address-line2 "
| Free-form text, no newlines | MIT Room 32-G524 | Text | ||||
"address-line3 "
| Free-form text, no newlines | Text | |||||
"address-level4 "
| The most fine-grained administrative level, in addresses with four administrative levels | Free-form text, no newlines | Text | ||||
"address-level3 "
| The third administrative level, in addresses with three or more administrative levels | Free-form text, no newlines | Text | ||||
"address-level2 "
| The second administrative level, in addresses with two or more administrative levels; in the countries with two administrative levels, this would typically be the city, town, village, or other locality within which the relevant street address is found | Free-form text, no newlines | Cambridge | Text | |||
"address-level1 "
| The broadest administrative level in the address, i.e. the province within which the locality is found; for example, in the US, this would be the state; in Switzerland it would be the canton; in the UK, the post town | Free-form text, no newlines | MA | Text | |||
"country "
| Country code | Valid ISO 3166-1-alpha-2 country code ISO3166 | US | Text | |||
"country-name "
| Country name | Free-form text, no newlines; derived from country in some cases
| US | Text | |||
"postal-code "
| Postal code, post code, ZIP code, CEDEX code (if CEDEX, append "CEDEX", and the arrondissement, if relevant, to the address-level2 field)
| Free-form text, no newlines | 02139 | Text | |||
"cc-name "
| Full name as given on the payment instrument | Free-form text, no newlines | Tim Berners-Lee | Text | |||
"cc-given-name "
| Given name as given on the payment instrument (in some Western cultures, also known as the first name) | Free-form text, no newlines | Tim | Text | |||
"cc-additional-name "
| Additional names given on the payment instrument (in some Western cultures, also known as middle names, forenames other than the first name) | Free-form text, no newlines | Text | ||||
"cc-family-name "
| Family name given on the payment instrument (in some Western cultures, also known as the last name or surname) | Free-form text, no newlines | Berners-Lee | Text | |||
"cc-number "
| Code identifying the payment instrument (e.g. the credit card number) | ASCII digits | 4114360123456785 | Text | |||
"cc-exp "
| Expiration date of the payment instrument | Valid month string | 2014-12 | Month | |||
"cc-exp-month "
| Month component of the expiration date of the payment instrument | Valid integer in the range 1..12 | 12 | Numeric | |||
"cc-exp-year "
| Year component of the expiration date of the payment instrument | Valid integer greater than zero | 2014 | Numeric | |||
"cc-csc "
| Security code for the payment instrument (also known as the card security code (CSC), card validation code (CVC), card verification value (CVV), signature panel code (SPC), credit card ID (CCID), etc.) | ASCII digits | 419 | Text | |||
"cc-type "
| Type of payment instrument | Free-form text, no newlines | Visa | Text | |||
"transaction-currency "
| The currency that the user would prefer the transaction to use | ISO 4217 currency code ISO4217 | GBP | Text | |||
"transaction-amount "
| The amount that the user would like for the transaction (e.g. when entering a bid or sale price) | Valid floating-point number | 401.00 | Numeric | |||
"language "
| Preferred language | Valid BCP 47 language tag BCP47 | en | Text | |||
"bday "
| Birthday | Valid date string | 1955-06-08 | Date | |||
"bday-day "
| Day component of birthday | Valid integer in the range 1..31 | 8 | Numeric | |||
"bday-month "
| Month component of birthday | Valid integer in the range 1..12 | 6 | Numeric | |||
"bday-year "
| Year component of birthday | Valid integer greater than zero | 1955 | Numeric | |||
"sex "
| Gender identity (e.g. Female, Fa'afafine) | Free-form text, no newlines | Male | Text | |||
"url "
| Home page or other web page corresponding to the company, person, address, or contact information in the other fields associated with this field | Valid URL string | https://www.w3.org/People/Berners-Lee/ | URL | |||
"photo "
| Photograph, icon, or other image corresponding to the company, person, address, or contact information in the other fields associated with this field | Valid URL string | https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-eighth.jpg | URL | |||
"tel "
| Full telephone number, including country code | ASCII digits and U+0020 SPACE characters, prefixed by a U+002B PLUS SIGN character (+) | +1 617 253 5702 | Tel | |||
"tel-country-code "
| Country code component of the telephone number | ASCII digits prefixed by a U+002B PLUS SIGN character (+) | +1 | Text | |||
"tel-national "
| Telephone number without the county code component, with a country-internal prefix applied if applicable | ASCII digits and U+0020 SPACE characters | 617 253 5702 | Text | |||
"tel-area-code "
| Area code component of the telephone number, with a country-internal prefix applied if applicable | ASCII digits | 617 | Text | |||
"tel-local "
| Telephone number without the country code and area code components | ASCII digits | 2535702 | Text | |||
"tel-local-prefix "
| First part of the component of the telephone number that follows the area code, when that component is split into two components | ASCII digits | 253 | Text | |||
"tel-local-suffix "
| Second part of the component of the telephone number that follows the area code, when that component is split into two components | ASCII digits | 5702 | Text | |||
"tel-extension "
| Telephone number internal extension code | ASCII digits | 1000 | Text | |||
"email "
| Email address | Valid email address | timbl@w3.org | Username | |||
"impp "
| URL representing an instant messaging protocol endpoint (for example, "aim:goim?screenname=example " or "xmpp:fred@example.net ")
| Valid URL string | irc://example.org/timbl,isuser | URL |
The groups correspond to controls as follows:
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
input
elements with a type
attribute in the Password state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
input
elements with a type
attribute in the URL state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
input
elements with a type
attribute in the Email state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
input
elements with a type
attribute in the Telephone state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
input
elements with a type
attribute in the Number state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
input
elements with a type
attribute in the Month state
textarea
elements
select
elements
input
elements with a type
attribute in the Hidden state
input
elements with a type
attribute in the Text state
input
elements with a type
attribute in the Search state
input
elements with a type
attribute in the Date state
textarea
elements
select
elements
Address levels: The "address-level1
" – "address-level4
" fields are used to describe
the locality of the street address. Different locales have different numbers of levels. For
example, the US uses two levels (state and town), the UK uses one or two depending on the address
(the post town, and in some cases the locality), and China can use three (province, city,
district). The "address-level1
" field
represents the widest administrative division. Different locales order the fields in different
ways; for example, in the US the town (level 2) precedes the state (level 1); while in Japan the
prefecture (level 1) precedes the city (level 2) which precedes the district (level 3). Authors
are encouraged to provide forms that are presented in a way that matches the country's conventions
(hiding, showing, and rearranging fields accordingly as the user changes the country).
Each input
element to which the autocomplete
attribute applies, each select
element, and each textarea
element, has an
autofill hint set, an autofill scope, an autofill field name, a
non-autofill credential type, and an IDL-exposed autofill value.
The autofill field name specifies the specific kind of data expected in the field,
e.g. "street-address
" or "cc-exp
".
The autofill hint set identifies what address or contact information type the user
agent is to look at, e.g. "shipping
fax
" or "billing
".
The non-autofill credential type identifies a type of
credential that may be offered by the user agent when the
user interacts with the field alongside other autofill field values. If this value is
"webauthn
" instead of null, selecting a credential of that type will resolve
a pending conditional
mediation
navigator.credentials.get()
request, instead of autofilling the field.
For example, a sign-in page could instruct the user agent to either autofill a saved password,
or show a public key credential that will resolve a pending
navigator.credentials.get()
request. A user can select either to sign-in.
<input name=password type=password autocomplete="current-password webauthn">
The autofill scope identifies the group of fields whose information concerns the
same subject, and consists of the autofill hint set with, if
applicable, the "section-*
" prefix, e.g. "billing
",
"section-parent shipping
", or "section-child shipping
home
".
These values are defined as the result of running the following algorithm:
If the element has no autocomplete
attribute,
then jump to the step labeled default.
Let tokens be the result of splitting the attribute's value on ASCII whitespace.
If tokens is empty, then jump to the step labeled default.
Let index be the index of the last token in tokens.
Let field be the indexth token in tokens.
Set the category, maximum tokens pair to the result of determining a field's category given field.
If category is null, then jump to the step labeled default.
If the number of tokens in tokens is greater than maximum tokens, then jump to the step labeled default.
If category is Off or Automatic but the element's autocomplete
attribute is wearing the autofill anchor
mantle, then jump to the step labeled default.
If category is Off, let the element's autofill field name
be the string "off
", let its autofill hint set be empty, and
let its IDL-exposed autofill value be the string "off
". Then,
return.
If category is Automatic, let the element's autofill field
name be the string "on
", let its autofill hint set be
empty, and let its IDL-exposed autofill value be the string "on
". Then, return.
Let scope tokens be an empty list.
Let hint tokens be an empty set.
Let credential type be null.
Let IDL value have the same value as field.
If category is Credential and the indexth token in tokens is
an ASCII case-insensitive match for "webauthn
", then run the substeps that follow:
Set credential type to "webauthn
".
If the indexth token in tokens is the first entry, then skip to the step labeled done.
Decrement index by one.
Set the category, maximum tokens pair to the result of determining a field's category given the indexth token in tokens.
If category is not Normal and category is not Contact, then jump to the step labeled default.
If index is greater than maximum tokens minus one (i.e. if the number of remaining tokens is greater than maximum tokens), then jump to the step labeled default.
Set IDL value to the concatenation of the indexth token in tokens, a U+0020 SPACE character, and the previous value of IDL value.
If the indexth token in tokens is the first entry, then skip to the step labeled done.
Decrement index by one.
If category is Contact and the indexth token in tokens is an ASCII case-insensitive match for one of the strings in the following list, then run the substeps that follow:
home
"
work
"
mobile
"
fax
"
pager
"
The substeps are:
Let contact be the matching string from the list above.
Insert contact at the start of scope tokens.
Add contact to hint tokens.
Let IDL value be the concatenation of contact, a U+0020 SPACE character, and the previous value of IDL value.
If the indexth entry in tokens is the first entry, then skip to the step labeled done.
Decrement index by one.
If the indexth token in tokens is an ASCII case-insensitive match for one of the strings in the following list, then run the substeps that follow:
shipping
"
billing
"
The substeps are:
Let mode be the matching string from the list above.
Insert mode at the start of scope tokens.
Add mode to hint tokens.
Let IDL value be the concatenation of mode, a U+0020 SPACE character, and the previous value of IDL value.
If the indexth entry in tokens is the first entry, then skip to the step labeled done.
Decrement index by one.
If the indexth entry in tokens is not the first entry, then jump to the step labeled default.
If the first eight characters of the indexth token in tokens are not
an ASCII case-insensitive match for the string "section-
", then jump to the step labeled
default.
Let section be the indexth token in tokens, converted to ASCII lowercase.
Insert section at the start of scope tokens.
Let IDL value be the concatenation of section, a U+0020 SPACE character, and the previous value of IDL value.
Done: Let the element's autofill hint set be hint tokens.
Let the element's non-autofill credential type be credential type.
Let the element's autofill scope be scope tokens.
Let the element's autofill field name be field.
Let the element's IDL-exposed autofill value be IDL value.
Return.
Default: Let the element's IDL-exposed autofill value be the empty string, and its autofill hint set and autofill scope be empty.
If the element's autocomplete
attribute is
wearing the autofill anchor mantle, then let the element's autofill field
name be the empty string and return.
Let form be the element's form owner, if any, or null otherwise.
If form is not null and form's autocomplete
attribute is in the off state, then let the element's
autofill field name be "off
".
Otherwise, let the element's autofill field name be "on
".
To determine a field's category, given field:
If the field is not an ASCII case-insensitive match for one of the tokens given in the first column of the following table, return the pair (null, null).
Token | Maximum number of tokens | Category |
---|---|---|
"off "
| 1 | Off |
"on "
| 1 | Automatic |
"name "
| 3 | Normal |
"honorific-prefix "
| 3 | Normal |
"given-name "
| 3 | Normal |
"additional-name "
| 3 | Normal |
"family-name "
| 3 | Normal |
"honorific-suffix "
| 3 | Normal |
"nickname "
| 3 | Normal |
"organization-title "
| 3 | Normal |
"username "
| 3 | Normal |
"new-password "
| 3 | Normal |
"current-password "
| 3 | Normal |
"one-time-code "
| 3 | Normal |
"organization "
| 3 | Normal |
"street-address "
| 3 | Normal |
"address-line1 "
| 3 | Normal |
"address-line2 "
| 3 | Normal |
"address-line3 "
| 3 | Normal |
"address-level4 "
| 3 | Normal |
"address-level3 "
| 3 | Normal |
"address-level2 "
| 3 | Normal |
"address-level1 "
| 3 | Normal |
"country "
| 3 | Normal |
"country-name "
| 3 | Normal |
"postal-code "
| 3 | Normal |
"cc-name "
| 3 | Normal |
"cc-given-name "
| 3 | Normal |
"cc-additional-name "
| 3 | Normal |
"cc-family-name "
| 3 | Normal |
"cc-number "
| 3 | Normal |
"cc-exp "
| 3 | Normal |
"cc-exp-month "
| 3 | Normal |
"cc-exp-year "
| 3 | Normal |
"cc-csc "
| 3 | Normal |
"cc-type "
| 3 | Normal |
"transaction-currency "
| 3 | Normal |
"transaction-amount "
| 3 | Normal |
"language "
| 3 | Normal |
"bday "
| 3 | Normal |
"bday-day "
| 3 | Normal |
"bday-month "
| 3 | Normal |
"bday-year "
| 3 | Normal |
"sex "
| 3 | Normal |
"url "
| 3 | Normal |
"photo "
| 3 | Normal |
"tel "
| 4 | Contact |
"tel-country-code "
| 4 | Contact |
"tel-national "
| 4 | Contact |
"tel-area-code "
| 4 | Contact |
"tel-local "
| 4 | Contact |
"tel-local-prefix "
| 4 | Contact |
"tel-local-suffix "
| 4 | Contact |
"tel-extension "
| 4 | Contact |
"email "
| 4 | Contact |
"impp "
| 4 | Contact |
"webauthn "
| 5 | Credential |
Otherwise, let maximum tokens and category be the values of the cells in the second and third columns of that row respectively.
Return the pair (category, maximum tokens).
For the purposes of autofill, a control's data depends on the kind of control:
input
element with its type
attribute
in the Email state and with the multiple
attribute specifiedinput
elementtextarea
elementselect
element with its multiple
attribute specifiedoption
elements in the select
element's list of options that have their selectedness set to true.select
elementoption
element in the select
element's list of options that has its selectedness set to true.How to process the autofill hint set, autofill scope, and
autofill field name depends on the mantle that the autocomplete
attribute is wearing.
When an element's autofill field name is "off
", the user agent should not remember the control's
data, and should not offer past values to the user.
In addition, when an element's autofill field name is "off
", values are
reset when reactivating a document.
Banks frequently do not want UAs to prefill login information:
<p><label>Account: <input type="text" name="ac" autocomplete="off"></label></p>
<p><label>PIN: <input type="password" name="pin" autocomplete="off"></label></p>
When an element's autofill field name is not "off
", the user agent may store the control's
data, and may offer previously stored values to the user.
For example, suppose a user visits a page with this control:
<select name="country">
<option>Afghanistan
<option>Albania
<option>Algeria
<option>Andorra
<option>Angola
<option>Antigua and Barbuda
<option>Argentina
<option>Armenia
<!-- ... -->
<option>Yemen
<option>Zambia
<option>Zimbabwe
</select>
This might render as follows:
Suppose that on the first visit to this page, the user selects "Zambia". On the second visit, the user agent could duplicate the entry for Zambia at the top of the list, so that the interface instead looks like this:
When the autofill field name is "on
", the user agent should attempt to use heuristics to
determine the most appropriate values to offer the user, e.g. based on the element's name
value, the position of the element in its tree,
what other fields exist in the form, and so forth.
When the autofill field name is one of the names of the autofill fields described above, the user agent should provide suggestions that match the meaning of the field name as given in the table earlier in this section. The autofill hint set should be used to select amongst multiple possible suggestions.
For example, if a user once entered one address into fields that used the
"shipping
" keyword, and another address into
fields that used the "billing
" keyword, then in
subsequent forms only the first address would be suggested for form controls whose autofill
hint set contains the keyword "shipping
". Both addresses might be suggested,
however, for address-related form controls whose autofill hint set does not contain
either keyword.
When the autofill field name is not the empty string, then the user agent must act as if the user had specified the control's data for the given autofill hint set, autofill scope, and autofill field name combination.
When the user agent autofills form controls, elements
with the same form owner and the same autofill scope must use data
relating to the same person, address, payment instrument, and contact details. When a user agent autofills "country
" and "country-name
" fields with the same form
owner and autofill scope, and the user agent has a value for the country
" field(s), then the "country-name
" field(s) must be filled using a
human-readable name for the same country. When a user agent fills in multiple fields at
once, all fields with the same autofill field name, form owner and
autofill scope must be filled with the same value.
Suppose a user agent knows of two phone numbers, +1 555 123 1234 and +1 555 666
7777. It would not be conforming for the user agent to fill a field with autocomplete="shipping tel-local-prefix"
with the value "123" and another field
in the same form with autocomplete="shipping tel-local-suffix"
with the
value "7777". The only valid prefilled values given the aforementioned information would be "123"
and "1234", or "666" and "7777", respectively.
Similarly, if a form for some reason contained both a "cc-exp
" field and a "cc-exp-month
" field, and the user agent
prefilled the form, then the month component of the former would have to match the latter.
This requirement interacts with the autofill anchor mantle also. Consider the following markup snippet:
<form>
<input type=hidden autocomplete="nickname" value="TreePlate">
<input type=text autocomplete="nickname">
</form>
The only value that a conforming user agent could suggest in the text control is "TreePlate",
the value given by the hidden input
element.
The "section-*
" tokens in the autofill scope are opaque;
user agents must not attempt to derive meaning from the precise values of these tokens.
For example, it would not be conforming if the user agent decided that it
should offer the address it knows to be the user's daughter's address for
"section-child
" and the addresses it knows to be the user's spouses'
addresses for "section-spouse
".
The autocompletion mechanism must be implemented by the user agent acting as if the user had modified the control's data, and must be done at a time where the element is mutable (e.g. just after the element has been inserted into the document, or when the user agent stops parsing). User agents must only prefill controls using values that the user could have entered.
For example, if a select
element only has option
elements with values "Steve" and "Rebecca", "Jay", and "Bob", and has an autofill field
name "given-name
", but the user
agent's only idea for what to prefill the field with is "Evan", then the user agent cannot prefill
the field. It would not be conforming to somehow set the select
element to the value
"Evan", since the user could not have done so themselves.
A user agent prefilling a form control must not discriminate between form controls that are
in a document tree and those that are connected; that is, it is not
conforming to make the decision on whether or not to autofill based on whether the element's
root is a shadow root versus a Document
.
A user agent prefilling a form control's value must not cause that control to suffer from a type mismatch, suffer from being too long, suffer from being too short, suffer from an underflow, suffer from an overflow, or suffer from a step mismatch. A user agent prefilling a form control's value must not cause that control to suffer from a pattern mismatch either. Where possible given the control's constraints, user agents must use the format given as canonical in the aforementioned table. Where it's not possible for the canonical format to be used, user agents should use heuristics to attempt to convert values so that they can be used.
For example, if the user agent knows that the user's middle name is "Ines", and attempts to prefill a form control that looks like this:
<input name=middle-initial maxlength=1 autocomplete="additional-name">
...then the user agent could convert "Ines" to "I" and prefill it that way.
A more elaborate example would be with month values. If the user agent knows that the user's birthday is the 27th of July 2012, then it might try to prefill all of the following controls with slightly different values, all driven from this information:
| 2012-07 |
The day is dropped since the Month state only accepts a
month/year combination. (Note that this example is non-conforming, because the autofill
field name bday is not allowed with the
Month state.)
|
| July | The user agent picks the month from the listed options, either by noticing there are twelve options and picking the 7th, or by recognizing that one of the strings (three characters "Jul" followed by a newline and a space) is a close match for the name of the month (July) in one of the user agent's supported languages, or through some other similar mechanism. |
| 7 | User agent converts "July" to a month number in the range 1..12, like the field. |
| 6 | User agent converts "July" to a month number in the range 0..11, like the field. |
| User agent doesn't fill in the field, since it can't make a good guess as to what the form expects. |
A user agent may allow the user to override an element's autofill field name, e.g.
to change it from "off
" to "on
" to allow values to be remembered and prefilled despite
the page author's objections, or to always "off
",
never remembering values.
More specifically, user agents may in particular consider replacing the autofill field
name of form controls that match the description given in the first column of the following
table, when their autofill field name is either "on
" or "off
", with the value given in the second cell of that
row. If this table is used, the replacements must be done in tree order, since all
but the first row references the autofill field name of earlier elements. When the
descriptions below refer to form controls being preceded or followed by others, they mean in the
list of listed elements that share the same form
owner.
Form control | New autofill field name |
---|---|
an input element whose type attribute is in
the Text state that is followed by an
input element whose type attribute is in
the Password state
|
"username "
|
an input element whose type attribute is in
the Password state that is preceded by an
input element whose autofill field name is "username "
|
"current-password "
|
an input element whose type attribute is in
the Password state that is preceded by an
input element whose autofill field name is "current-password "
|
"new-password "
|
an input element whose type attribute is in
the Password state that is preceded by an
input element whose autofill field name is "new-password "
|
"new-password "
|
The autocomplete
IDL attribute, on getting, must return the
element's IDL-exposed autofill value, and on setting, must reflect the
content attribute of the same name.
The input
and textarea
elements define several attributes and methods
for handling their selection. Their shared algorithms are defined here.
element.select()
Selects everything in the text control.
element.selectionStart [ = value ]
Returns the offset to the start of the selection.
Can be set, to change the start of the selection.
element.selectionEnd [ = value ]
Returns the offset to the end of the selection.
Can be set, to change the end of the selection.
element.selectionDirection [ = value ]
Returns the current direction of the selection.
Can be set, to change the direction of the selection.
The possible values are "forward
", "backward
",
and "none
".
element.setSelectionRange(start, end [, direction])
Changes the selection to cover the given substring in the given direction. If the direction is omitted, it will be reset to be the platform default (none or forward).
element.setRangeText(replacement [, start, end [, selectionMode ] ])
Replaces a range of text with the new text. If the start and end arguments are not provided, the range is assumed to be the selection.
The final argument determines how the selection will be set after the text has been replaced. The possible values are:
select
"start
"end
"preserve
"All input
elements to which these APIs apply, and all textarea
elements, have either a
selection or a text entry cursor position at all times (even for
elements that are not being rendered), measured in offsets into the code units of the control's relevant value. The initial state must
consist of a text entry cursor at the
beginning of the control.
For input
elements, these APIs must operate on the element's value. For textarea
elements, these APIs must
operate on the element's API value. In the below
algorithms, we call the value string being operated on the relevant value.
The use of API value instead of raw value for textarea
elements means
that U+000D (CR) characters are normalized away. For example,
<textarea id="demo"></textarea>
<script>
demo.value = "A\r\nB";
demo.setRangeText("replaced", 0, 2);
assert(demo.value === "replacedB");
</script>
If we had operated on the raw value of "A\r\nB
", then we would have replaced the characters "A\r
", ending up with a result of "replaced\nB
". But since
we used the API value of "A\nB
", we replaced the characters "A\n
", giving "replacedB
".
Characters with no visible rendering, such as U+200D ZERO WIDTH JOINER, still count as characters. Thus, for instance, the selection can include just an invisible character, and the text insertion cursor can be placed to one side or another of such a character.
Whenever the relevant value changes for an element to which these APIs apply, run these steps:
If the element has a selection:
If the start of the selection is now past the end of the relevant value, set it to the end of the relevant value.
If the end of the selection is now past the end of the relevant value, set it to the end of the relevant value.
If the user agent does not support empty selection, and both the start and end of the selection are now pointing to the end of the relevant value, then instead set the element's text entry cursor position to the end of the relevant value, removing any selection.
Otherwise, the element must have a text entry cursor position position. If it is now past the end of the relevant value, set it to the end of the relevant value.
In some cases where the relevant value changes, other parts of the
specification will also modify the text entry cursor
position, beyond just the clamping steps above. For example, see the value
setter for textarea
.
Where possible, user interface features for changing the text selection in input
and
textarea
elements must be implemented using the set the selection range
algorithm so that, e.g., all the same events fire.
The selections of input
and
textarea
elements have a selection direction, which is either "forward
", "backward
", or "none
".
The exact meaning of the selection direction depends on the platform. This direction is set when
the user manipulates the selection. The initial selection direction must be "none
" if the platform supports that direction, or "forward
" otherwise.
To set the selection direction of an element to a given direction, update the
element's selection direction to the given direction, unless the direction is "none
" and the platform does not support that direction; in that case, update the
element's selection direction to "forward
".
On Windows, the direction indicates the position of the caret relative to
the selection: a "forward
" selection has the caret at the end of the
selection and a "backward
" selection has the caret at the start of the
selection. Windows has no "none
" direction.
On Mac, the direction indicates which end of the selection is affected when the user adjusts
the size of the selection using the arrow keys with the Shift modifier: the "forward
" direction means the end of the selection is modified, and the "backward
" direction means the start of the selection is modified. The "none
" direction is the default on Mac, it indicates that no particular direction
has yet been selected. The user sets the direction implicitly when first adjusting the selection,
based on which directional arrow key was used.
The select()
method, when invoked, must run the
following steps:
If this element is an input
element, and either select()
does not
apply to this element or the corresponding control has no selectable text, return.
For instance, in a user agent where <input type=color>
is rendered as a color well with a
picker, as opposed to a text control accepting a hexadecimal color code, there would be no
selectable text, and thus calls to the method are ignored.
Set the selection range with 0 and infinity.
The selectionStart
attribute's getter must run
the following steps:
If this element is an input
element, and selectionStart
does
not apply to this element, return null.
If there is no selection, return the code unit offset within the relevant value to the character that immediately follows the text entry cursor.
Return the code unit offset within the relevant value to the character that immediately follows the start of the selection.
The selectionStart
attribute's setter
must run the following steps:
If this element is an input
element, and selectionStart
does
not apply to this element, throw an "InvalidStateError
"
DOMException
.
Let end be the value of this element's selectionEnd
attribute.
If end is less than the given value, set end to the given value.
Set the selection range with the given value, end, and the value
of this element's selectionDirection
attribute.
The selectionEnd
attribute's getter must run the
following steps:
If this element is an input
element, and selectionEnd
does
not apply to this element, return null.
If there is no selection, return the code unit offset within the relevant value to the character that immediately follows the text entry cursor.
Return the code unit offset within the relevant value to the character that immediately follows the end of the selection.
The selectionEnd
attribute's setter must
run the following steps:
If this element is an input
element, and selectionEnd
does not
apply to this element, throw an "InvalidStateError
"
DOMException
.
Set the selection range with the value of this element's selectionStart
attribute, the given value, and
the value of this element's selectionDirection
attribute.
The selectionDirection
attribute's getter
must run the following steps:
If this element is an input
element, and selectionDirection
does not apply to this element, return null.
Return this element's selection direction.
The selectionDirection
attribute's
setter must run the following steps:
If this element is an input
element, and selectionDirection
does not apply to this element, throw an
"InvalidStateError
" DOMException
.
Set the selection range with the value of this element's selectionStart
attribute, the value of this
element's selectionEnd
attribute, and the
given value.
The setSelectionRange(start, end,
direction)
method, when invoked, must run the following steps:
If this element is an input
element, and setSelectionRange()
does not apply to this element, throw an
"InvalidStateError
" DOMException
.
Set the selection range with start, end, and direction.
To set the selection range with an integer or null start, an integer or null or the special value infinity end, and optionally a string direction, run the following steps:
If start is null, let start be zero.
If end is null, let end be zero.
Set the selection of the text control to the sequence of code units within the relevant value starting with the code unit at the startth position (in logical order) and ending with the code unit at the (end-1)th position. Arguments greater than the length of the relevant value of the text control (including the special value infinity) must be treated as pointing at the end of the text control. If end is less than or equal to start then the start of the selection and the end of the selection must both be placed immediately before the character with offset end. In UAs where there is no concept of an empty selection, this must set the cursor to be just before the character with offset end.
If direction is not identical to either "backward
" or "forward
", or if the direction
argument was not given, set direction to "none
".
Set the selection direction of the text control to direction.
If the previous steps caused the selection of the text control to be modified (in
either extent or direction), then queue an
element task on the user interaction task source given the element to fire an event named select
at the element, with the bubbles
attribute initialized to
true.
The setRangeText(replacement, start,
end, selectMode)
method, when invoked, must run the following
steps:
If this element is an input
element, and setRangeText()
does
not apply to this element, throw an "InvalidStateError
"
DOMException
.
Set this element's dirty value flag to true.
If the method has only one argument, then let start and end have the values of the selectionStart
attribute and the selectionEnd
attribute respectively.
Otherwise, let start, end have the values of the second and third arguments respectively.
If start is greater than end, then throw an
"IndexSizeError
" DOMException
.
If start is greater than the length of the relevant value of the text control, then set it to the length of the relevant value of the text control.
If end is greater than the length of the relevant value of the text control, then set it to the length of the relevant value of the text control.
Let selection start be the current value of the selectionStart
attribute.
Let selection end be the current value of the selectionEnd
attribute.
If start is less than end, delete the sequence of code units within the element's relevant value starting with the code unit at the startth position and ending with the code unit at the (end-1)th position.
Insert the value of the first argument into the text of the relevant value of the text control, immediately before the startth code unit.
Let new length be the length of the value of the first argument.
Let new end be the sum of start and new length.
Run the appropriate set of substeps from the following list:
select
"Let selection start be start.
Let selection end be new end.
start
"Let selection start and selection end be start.
end
"Let selection start and selection end be new end.
preserve
"Let old length be end minus start.
Let delta be new length minus old length.
If selection start is greater than end, then increment it by delta. (If delta is negative, i.e. the new text is shorter than the old text, then this will decrease the value of selection start.)
Otherwise: if selection start is greater than start, then set it to start. (This snaps the start of the selection to the start of the new text if it was in the middle of the text that it replaced.)
If selection end is greater than end, then increment it by delta in the same way.
Otherwise: if selection end is greater than start, then set it to new end. (This snaps the end of the selection to the end of the new text if it was in the middle of the text that it replaced.)
Set the selection range with selection start and selection end.
The setRangeText()
method uses the
following enumeration: "select", "start", "end",
"preserve" (default).
enum SelectionMode {
"select",
"start",
"end",
"preserve" // default
};
To obtain the currently selected text, the following JavaScript suffices:
var selectionText = control.value.substring(control.selectionStart, control.selectionEnd);
...where control is the input
or textarea
element.
To add some text at the start of a text control, while maintaining the text selection, the three attributes must be preserved:
var oldStart = control.selectionStart;
var oldEnd = control.selectionEnd;
var oldDirection = control.selectionDirection;
var prefix = "http://";
control.value = prefix + control.value;
control.setSelectionRange(oldStart + prefix.length, oldEnd + prefix.length, oldDirection);
...where control is the input
or textarea
element.
A submittable element is a candidate for constraint
validation except when a condition has barred
the element from constraint validation. (For example, an element is barred from
constraint validation if it has a datalist
element ancestor.)
An element can have a custom validity error message defined. Initially, an element
must have its custom validity error message set to the empty string. When its value
is not the empty string, the element is suffering from a custom error. It can be set
using the setCustomValidity()
method, except for
form-associated custom elements. Form-associated custom elements can have a
custom validity error message set via their ElementInternals
object's
setValidity()
method. The user agent should use the
custom validity error message when alerting the user to the problem with the
control.
An element can be constrained in various ways. The following is the list of validity states that a form control can be in, making the control invalid for the purposes of constraint validation. (The definitions below are non-normative; other parts of this specification define more precisely when each state applies or does not.)
When a control has no value but has a required
attribute (input
required
, textarea
required
); or, more complicated rules for
select
elements and controls in radio button
groups, as specified in their sections.
When the setValidity()
method sets
valueMissing
flag to true for a
form-associated custom element.
When a control that allows arbitrary user input has a value that is not in the correct syntax (Email, URL).
When the setValidity()
method sets
typeMismatch
flag to true for a
form-associated custom element.
When a control has a value that doesn't satisfy the
pattern
attribute.
When the setValidity()
method sets
patternMismatch
flag to true for a
form-associated custom element.
When a control has a value that is too long for the
form control maxlength
attribute
(input
maxlength
, textarea
maxlength
).
When the setValidity()
method sets
tooLong
flag to true for a
form-associated custom element.
When a control has a value that is too short for the
form control minlength
attribute
(input
minlength
, textarea
minlength
).
When the setValidity()
method sets
tooShort
flag to true for a
form-associated custom element.
When a control has a value that is not the empty
string and is too low for the min
attribute.
When the setValidity()
method sets
rangeUnderflow
flag to true for a
form-associated custom element.
When a control has a value that is not the empty
string and is too high for the max
attribute.
When the setValidity()
method sets
rangeOverflow
flag to true for a
form-associated custom element.
When a control has a value that doesn't fit the
rules given by the step
attribute.
When the setValidity()
method sets
stepMismatch
flag to true for a
form-associated custom element.
When a control has incomplete input and the user agent does not think the user ought to be able to submit the form in its current state.
When the setValidity()
method sets
badInput
flag to true for a form-associated custom element.
When a control's custom validity error message (as set by the element's
setCustomValidity()
method or
ElementInternals
's setValidity()
method) is
not the empty string.
An element can still suffer from these states even when the element is disabled; thus these states can be represented in the DOM even if validating the form during submission wouldn't indicate a problem to the user.
An element satisfies its constraints if it is not suffering from any of the above validity states.
When the user agent is required to statically validate the constraints of
form
element form, it must run the following steps, which return
either a positive result (all the controls in the form are valid) or a negative
result (there are invalid controls) along with a (possibly empty) list of elements that are
invalid and for which no script has claimed responsibility:
Let controls be a list of all the submittable elements whose form owner is form, in tree order.
Let invalid controls be an initially empty list of elements.
For each element field in controls, in tree order:
If field is not a candidate for constraint validation, then move on to the next element.
Otherwise, if field satisfies its constraints, then move on to the next element.
Otherwise, add field to invalid controls.
If invalid controls is empty, then return a positive result.
Let unhandled invalid controls be an initially empty list of elements.
For each element field in invalid controls, if any, in tree order:
Let notCanceled be the result of firing an
event named invalid
at field, with the
cancelable
attribute initialized to true.
If notCanceled is true, then add field to unhandled invalid controls.
Return a negative result with the list of elements in the unhandled invalid controls list.
If a user agent is to interactively validate the constraints of form
element form, then the user agent must run the following steps:
Statically validate the constraints of form, and let unhandled invalid controls be the list of elements returned if the result was negative.
If the result was positive, then return that result.
Report the problems with the constraints of at least one of the elements given in unhandled invalid controls to the user.
User agents may focus one of those elements in the process, by running the focusing steps for that element, and may change the scrolling position of the document, or perform some other action that brings the element to the user's attention. For elements that are form-associated custom elements, user agents should use their validation anchor instead, for the purposes of these actions.
User agents may report more than one constraint violation.
User agents may coalesce related constraint violation reports if appropriate (e.g. if multiple radio buttons in a group are marked as required, only one error need be reported).
If one of the controls is not being rendered (e.g. it has the hidden
attribute set) then user agents may report a script
error.
Return a negative result.
element.willValidate
Returns true if the element will be validated when the form is submitted; false otherwise.
element.setCustomValidity(message)
Sets a custom error, so that the element would fail to validate. The given message is the message to be shown to the user when reporting the problem to the user.
If the argument is the empty string, clears the custom error.
element.validity.valueMissing
Returns true if the element has no value but is a required field; false otherwise.
element.validity.typeMismatch
Returns true if the element's value is not in the correct syntax; false otherwise.
element.validity.patternMismatch
Returns true if the element's value doesn't match the provided pattern; false otherwise.
element.validity.tooLong
Returns true if the element's value is longer than the provided maximum length; false otherwise.
element.validity.tooShort
Returns true if the element's value, if it is not the empty string, is shorter than the provided minimum length; false otherwise.
element.validity.rangeUnderflow
Returns true if the element's value is lower than the provided minimum; false otherwise.
element.validity.rangeOverflow
Returns true if the element's value is higher than the provided maximum; false otherwise.
element.validity.stepMismatch
Returns true if the element's value doesn't fit the rules given by the step
attribute; false otherwise.
element.validity.badInput
Returns true if the user has provided input in the user interface that the user agent is unable to convert to a value; false otherwise.
element.validity.customError
Returns true if the element has a custom error; false otherwise.
element.validity.valid
Returns true if the element's value has no validity problems; false otherwise.
valid = element.checkValidity()
Returns true if the element's value has no validity problems; false otherwise. Fires an
invalid
event at the element in the latter case.
valid = element.reportValidity()
Returns true if the element's value has no validity problems; otherwise, returns false, fires
an invalid
event at the element, and (if the event isn't
canceled) reports the problem to the user.
element.validationMessage
Returns the error message that would be shown to the user if the element was to be checked for validity.
The willValidate
attribute's getter must return true, if
this element is a candidate for constraint validation, and false otherwise (i.e.,
false if any conditions are barring it from
constraint validation).
The willValidate
attribute of
ElementInternals
interface, on getting, must throw a
"NotSupportedError
" DOMException
if the target element is not a form-associated custom
element. Otherwise, it must return true if the target
element is a candidate for constraint validation, and false otherwise.
The setCustomValidity(error)
method steps
are:
Set error to the result of normalizing newlines given error.
Set the custom validity error message to error.
In the following example, a script checks the value of a form control each time it is edited,
and whenever it is not a valid value, uses the setCustomValidity()
method to set an appropriate
message.
<label>Feeling: <input name=f type="text" oninput="check(this)"></label>
<script>
function check(input) {
if (input.value == "good" ||
input.value == "fine" ||
input.value == "tired") {
input.setCustomValidity('"' + input.value + '" is not a feeling.');
} else {
// input is fine -- reset the error message
input.setCustomValidity('');
}
}
</script>
The validity
attribute's getter must return a
ValidityState
object that represents the validity states of this
element. This object is live.
The validity
attribute of
ElementInternals
interface, on getting, must throw a
"NotSupportedError
" DOMException
if the target element is not a form-associated custom
element. Otherwise, it must return a ValidityState
object that represents the
validity states of the target element. This
object is live.
[Exposed=Window]
interface ValidityState {
readonly attribute boolean valueMissing;
readonly attribute boolean typeMismatch;
readonly attribute boolean patternMismatch;
readonly attribute boolean tooLong;
readonly attribute boolean tooShort;
readonly attribute boolean rangeUnderflow;
readonly attribute boolean rangeOverflow;
readonly attribute boolean stepMismatch;
readonly attribute boolean badInput;
readonly attribute boolean customError;
readonly attribute boolean valid;
};
A ValidityState
object has the following attributes. On getting, they must return
true if the corresponding condition given in the following list is true, and false otherwise.
valueMissing
The control is suffering from being missing.
typeMismatch
The control is suffering from a type mismatch.
patternMismatch
The control is suffering from a pattern mismatch.
tooLong
The control is suffering from being too long.
tooShort
The control is suffering from being too short.
rangeUnderflow
The control is suffering from an underflow.
rangeOverflow
The control is suffering from an overflow.
stepMismatch
The control is suffering from a step mismatch.
badInput
The control is suffering from bad input.
customError
The control is suffering from a custom error.
valid
None of the other conditions are true.
The check validity steps for an element element are:
If element is a candidate for constraint validation and does not satisfy its constraints, then:
Fire an event named invalid
at element, with the cancelable
attribute initialized to true (though canceling
has no effect).
Return false.
Return true.
The checkValidity()
method, when invoked, must run the
check validity steps on this element.
The checkValidity()
method of the
ElementInternals
interface must run these steps:
Let element be this ElementInternals
's target element.
If element is not a form-associated custom element, then throw a
"NotSupportedError
" DOMException
.
Run the check validity steps on element.
The report validity steps for an element element are:
If element is a candidate for constraint validation and does not satisfy its constraints, then:
Let report be the result of firing an
event named invalid
at element, with the
cancelable
attribute initialized to true.
If report is true, then report the problems with the constraints of this element to the user. When reporting the problem with the constraints to the user, the user agent may run the focusing steps for element, and may change the scrolling position of the document, or perform some other action that brings element to the user's attention. User agents may report more than one constraint violation, if element suffers from multiple problems at once.
Return false.
Return true.
The reportValidity()
method, when invoked, must run the
report validity steps on this element.
The reportValidity()
method of the
ElementInternals
interface must run these steps:
Let element be this ElementInternals
's target element.
If element is not a form-associated custom element, then throw a
"NotSupportedError
" DOMException
.
Run the report validity steps on element.
The validationMessage
attribute's getter must run
these steps:
If this element is not a candidate for constraint validation or if this element satisfies its constraints, then return the empty string.
Return a suitably localized message that the user agent would show the user if this were the only form control with a validity constraint problem. If the user agent would not actually show a textual message in such a situation (e.g., it would show a graphical cue instead), then return a suitably localized message that expresses (one or more of) the validity constraint(s) that the control does not satisfy. If the element is a candidate for constraint validation and is suffering from a custom error, then the custom validity error message should be present in the return value.
Servers should not rely on client-side validation. Client-side validation can be intentionally bypassed by hostile users, and unintentionally bypassed by users of older user agents or automated tools that do not implement these features. The constraint validation features are only intended to improve the user experience, not to provide any kind of security mechanism.
When a form is submitted, the data in the form is converted into the structure specified by the enctype, and then sent to the destination specified by the action using the given method.
For example, take the following form:
<form action="/find.cgi" method=get>
<input type=text name=t>
<input type=search name=q>
<input type=submit>
</form>
If the user types in "cats" in the first field and "fur" in the second, and then hits the
submit button, then the user agent will load /find.cgi?t=cats&q=fur
.
On the other hand, consider this form:
<form action="/find.cgi" method=post enctype="multipart/form-data">
<input type=text name=t>
<input type=search name=q>
<input type=submit>
</form>
Given the same user input, the result on submission is quite different: the user agent instead does an HTTP POST to the given URL, with as the entity body something like the following text:
------kYFrd4jNJEgCervE Content-Disposition: form-data; name="t" cats ------kYFrd4jNJEgCervE Content-Disposition: form-data; name="q" fur ------kYFrd4jNJEgCervE--
A form
element's default button is the first submit button in tree order whose form
owner is that form
element.
If the user agent supports letting the user submit a form implicitly (for example, on some
platforms hitting the "enter" key while a text control is focused implicitly submits
the form), then doing so for a form, whose default button has activation
behavior and is not disabled, must cause the user
agent to fire a click
event at that default
button.
There are pages on the web that are only usable if there is a way to implicitly submit forms, so user agents are strongly encouraged to support this.
If the form has no submit button, then the implicit submission mechanism must perform the following steps:
If the form has more than one field that blocks implicit submission, then return.
Submit the form
element from the
form
element itself with userInvolvement set
to "activation
".
For the purpose of the previous paragraph, an element is a field that blocks implicit
submission of a form
element if it is an input
element whose
form owner is that form
element and whose type
attribute is in one of the following states:
Text,
Search,
Telephone,
URL,
Email,
Password,
Date,
Month,
Week,
Time,
Local Date and Time,
Number
Each form
element has a constructing entry list boolean, initially
false.
Each form
element has a firing submission events boolean, initially
false.
To submit a form
element form
from an element submitter (typically a button), given an optional boolean submitted from submit()
method (default false) and an optional
user navigation involvement userInvolvement (default "none
"):
If form cannot navigate, then return.
If form's constructing entry list is true, then return.
Let form document be form's node document.
If form document's active sandboxing flag set has its sandboxed forms browsing context flag set, then return.
If submitted from submit()
method is false,
then:
If form's firing submission events is true, then return.
Set form's firing submission events to true.
For each element field in the list of submittable elements whose form owner is form, set field's user validity to true.
If the submitter element's no-validate state is false, then interactively validate the constraints of form and examine the result. If the result is negative (i.e., the constraint validation concluded that there were invalid fields and probably informed the user of this), then:
Set form's firing submission events to false.
Return.
Let submitterButton be null if submitter is form. Otherwise, let submitterButton be submitter.
Let shouldContinue be the result of firing an
event named submit
at form using
SubmitEvent
, with the submitter
attribute initialized to submitterButton, the bubbles
attribute initialized to true, and the cancelable
attribute initialized to true.
Set form's firing submission events to false.
If shouldContinue is false, then return.
If form cannot navigate, then return.
Cannot navigate is run again as dispatching the submit
event could have changed the outcome.
Let encoding be the result of picking an encoding for the form.
Let entry list be the result of constructing the entry list with form, submitter, and encoding.
Assert: entry list is not null.
If form cannot navigate, then return.
Cannot navigate is run again as dispatching the formdata
event in constructing the entry list
could have changed the outcome.
Let method be the submitter element's method.
If method is dialog, then:
If form does not have an ancestor dialog
element, then
return.
Let subject be form's nearest ancestor dialog
element.
Let result be null.
If submitter is an input
element whose type
attribute is in the Image Button state, then:
Let (x, y) be the selected coordinate.
Set result to the concatenation of x, ",
", and y.
Otherwise, if submitter has a value, then set result to that value.
Close the dialog subject with result.
Return.
Let action be the submitter element's action.
If action is the empty string, let action be the URL of the form document.
Let parsed action be the result of encoding-parsing a URL given action, relative to submitter's node document.
If parsed action is failure, then return.
Let scheme be the scheme of parsed action.
Let enctype be the submitter element's enctype.
Let formTarget be null.
If the submitter element is a submit
button and it has a formtarget
attribute, then
set formTarget to the formtarget
attribute
value.
Let target be the result of getting an element's target given submitter's form owner and formTarget.
Let noopener be the result of getting an element's noopener with form, parsed action, and target.
Let targetNavigable be the first return value of applying the rules for choosing a navigable given target, form's node navigable, and noopener.
If targetNavigable is null, then return.
Let historyHandling be "auto
".
If form document equals targetNavigable's active document, and form document has not yet
completely loaded, then set historyHandling to "replace
".
Select the appropriate row in the table below based on scheme as given by the first cell of each row. Then, select the appropriate cell on that row based on method as given in the first cell of each column. Then, jump to the steps named in that cell and defined below the table.
GET | POST | |
---|---|---|
http
| Mutate action URL | Submit as entity body |
https
| Mutate action URL | Submit as entity body |
ftp
| Get action URL | Get action URL |
javascript
| Get action URL | Get action URL |
data
| Mutate action URL | Get action URL |
mailto
| Mail with headers | Mail as body |
If scheme is not one of those listed in this table, then the behavior is not defined by this specification. User agents should, in the absence of another specification defining this, act in a manner analogous to that defined in this specification for similar schemes.
Each form
element has a planned navigation, which is either null or a
task; when the form
is first created, its
planned navigation must be set to null. In the behaviors described below, when the
user agent is required to plan to navigate to a URL url given
an optional POST resource-or-null postResource (default null), it must
run the following steps:
Let referrerPolicy be the empty string.
If the form
element's link types include the noreferrer
keyword, then set referrerPolicy to "no-referrer
".
If the form
has a non-null planned navigation, remove it from
its task queue.
Queue an element task on the DOM manipulation task source given
the form
element and the following steps:
Set the form
's planned navigation to null.
Navigate targetNavigable to url
using the form
element's node document, with historyHandling set to historyHandling, userInvolvement set to userInvolvement,
referrerPolicy set to referrerPolicy,
documentResource set to postResource, and formDataEntryList set to entry
list.
Set the form
's planned navigation to the just-queued task.
The behaviors are as follows:
Let pairs be the result of converting to a list of name-value pairs with entry list.
Let query be the result of running the
application/x-www-form-urlencoded
serializer with pairs
and encoding.
Set parsed action's query component to query.
Plan to navigate to parsed action.
Assert: method is POST.
Switch on enctype:
application/x-www-form-urlencoded
Let pairs be the result of converting to a list of name-value pairs with entry list.
Let body be the result of running the
application/x-www-form-urlencoded
serializer with pairs
and encoding.
Set body to the result of encoding body.
Let mimeType be `application/x-www-form-urlencoded
`.
multipart/form-data
Let body be the result of running the multipart/form-data
encoding algorithm with entry list
and encoding.
Let mimeType be the isomorphic
encoding of the concatenation of "multipart/form-data; boundary=
" and the multipart/form-data
boundary string generated by the multipart/form-data
encoding algorithm.
text/plain
Let pairs be the result of converting to a list of name-value pairs with entry list.
Let body be the result of running the text/plain
encoding algorithm with pairs.
Set body to the result of encoding body using encoding.
Let mimeType be `text/plain
`.
Plan to navigate to parsed action given a POST resource whose request body is body and request content-type is mimeType.
Plan to navigate to parsed action.
entry list is discarded.
Let pairs be the result of converting to a list of name-value pairs with entry list.
Let headers be the result of running the
application/x-www-form-urlencoded
serializer with pairs
and encoding.
Replace occurrences of U+002B PLUS SIGN characters (+) in headers with
the string "%20
".
Set parsed action's query to headers.
Plan to navigate to parsed action.
Let pairs be the result of converting to a list of name-value pairs with entry list.
Switch on enctype:
text/plain
Let body be the result of running the text/plain
encoding algorithm with pairs.
Set body to the result of running UTF-8 percent-encode on body using the default encode set. URL
Let body be the result of running the
application/x-www-form-urlencoded
serializer with pairs
and encoding.
If parsed action's query is null, then set it to the empty string.
If parsed action's query is not the empty string, then append a single U+0026 AMPERSAND character (&) to it.
Append "body=
" to parsed action's query.
Append body to parsed action's query.
Plan to navigate to parsed action.
An entry list is a list of entries, typically representing the contents of a form. An entry is a tuple consisting of a name (a scalar value string) and a value (either a scalar value
string or a File
object).
To create an entry given a string
name, a string or Blob
object value, and optionally a
scalar value string filename:
Set name to the result of converting name into a scalar value string.
If value is a string, then set value to the result of converting value into a scalar value string.
Otherwise:
If value is not a File
object, then set value to a
new File
object, representing the same bytes, whose name
attribute value is "blob
".
If filename is given, then set value to a new File
object, representing the same bytes, whose name
attribute
is filename.
These operations will create a new File
object if either
filename is given or the passed Blob
is not a File
object.
In those cases, the identity of the passed Blob
object is not kept.
Return an entry whose name is name and whose value is value.
To construct the entry list given a form, an optional submitter (default null), and an optional encoding (default UTF-8):
If form's constructing entry list is true, then return null.
Set form's constructing entry list to true.
Let controls be a list of all the submittable elements whose form owner is form, in tree order.
Let entry list be a new empty entry list.
For each element field in controls, in tree order:
If any of the following are true:
field has a datalist
element ancestor;
field is disabled;
field is a button but it is not submitter;
field is an input
element whose type
attribute is in the Checkbox state and whose checkedness is false; or
field is an input
element whose type
attribute is in the Radio Button state and whose checkedness is false,
then continue.
If the field element is an input
element whose type
attribute is in the Image Button state, then:
If the field element is not submitter, then continue.
If the field element has a name
attribute specified and its value is not the empty string, let name be that value
followed by U+002E (.). Otherwise, let name be the empty string.
Let namex be the concatenation of name and U+0078 (x).
Let namey be the concatenation of name and U+0079 (y).
Let (x, y) be the selected coordinate.
Create an entry with namex and x, and append it to entry list.
Create an entry with namey and y, and append it to entry list.
Continue.
If the field is a form-associated custom element, then perform the entry construction algorithm given field and entry list, then continue.
If either the field element does not have a
name
attribute specified, or its
name
attribute's value is the empty string, then
continue.
Let name be the value of the field element's
name
attribute.
If the field element is a select
element, then for each
option
element in the select
element's list of options whose selectedness is true and that is not disabled, create an entry with
name and the value of the
option
element, and append it to entry
list.
Otherwise, if the field element is an input
element whose
type
attribute is in the Checkbox state or the Radio Button state, then:
If the field element has a value
attribute specified, then let value
be the value of that attribute; otherwise, let value be the string "on
".
Create an entry with name and value, and append it to entry list.
Otherwise, if the field element is an input
element whose type
attribute is in the File Upload state, then:
If there are no selected files,
then create an entry with name and a new File
object
with an empty name, application/octet-stream
as type, and an empty body, and
append it to entry list.
Otherwise, for each file in selected
files, create an entry with name and a File
object representing the file, and append it to entry
list.
Otherwise, if the field element is an input
element whose type
attribute is in the Hidden state and name is an ASCII
case-insensitive match for "_charset_
":
Let charset be the name of encoding.
Create an entry with name and charset, and append it to entry list.
Otherwise, create an entry with name and the value of the field element, and append it to entry list.
If the element has a dirname
attribute, that
attribute's value is not the empty string, and the element is an auto-directionality form-associated
element:
Let dirname be the value of the element's dirname
attribute.
Let dir be the string "ltr
" if the
directionality of the element is 'ltr', and "rtl
" otherwise (i.e., when the directionality of the element is
'rtl').
Create an entry with dirname and dir, and append it to entry list.
Let form data be a new FormData
object associated with
entry list.
Fire an event named
formdata
at form using
FormDataEvent
, with the formData
attribute initialized to form data and the
bubbles
attribute initialized to true.
Set form's constructing entry list to false.
Return a clone of entry list.
If the user agent is to pick an encoding for a form, it must run the following steps:
Let encoding be the document's character encoding.
If the form
element has an accept-charset
attribute, set encoding to
the return value of running these substeps:
Let input be the value of the form
element's accept-charset
attribute.
Let candidate encoding labels be the result of splitting input on ASCII whitespace.
Let candidate encodings be an empty list of character encodings.
For each token in candidate encoding labels in turn (in the order in which they were found in input), get an encoding for the token and, if this does not result in failure, append the encoding to candidate encodings.
If candidate encodings is empty, return UTF-8.
Return the first encoding in candidate encodings.
Return the result of getting an output encoding from encoding.
The application/x-www-form-urlencoded
and text/plain
encoding algorithms take a list of name-value pairs, where the values
must be strings, rather than an entry list where the value can be a
File
. The following algorithm performs the conversion.
To convert to a list of name-value pairs an entry list entry list, run these steps:
Let list be an empty list of name-value pairs.
For each entry of entry list:
Let name be entry's name, with every occurrence of U+000D (CR) not followed by U+000A (LF), and every occurrence of U+000A (LF) not preceded by U+000D (CR), replaced by a string consisting of U+000D (CR) and U+000A (LF).
If entry's value is a
File
object, then let value be entry's value's name
. Otherwise, let
value be entry's value.
Replace every occurrence of U+000D (CR) not followed by U+000A (LF), and every occurrence of U+000A (LF) not preceded by U+000D (CR), in value, by a string consisting of U+000D (CR) and U+000A (LF).
Append to list a new name-value pair whose name is name and whose value is value.
Return list.
See URL for details
on application/x-www-form-urlencoded
. URL
The multipart/form-data
encoding algorithm, given an entry
list entry list and an encoding encoding, is as
follows:
For each entry of entry list:
Replace every occurrence of U+000D (CR) not followed by U+000A (LF), and every occurrence of U+000A (LF) not preceded by U+000D (CR), in entry's name, by a string consisting of a U+000D (CR) and U+000A (LF).
If entry's value is not a
File
object, then replace every occurrence of U+000D (CR) not followed by U+000A
(LF), and every occurrence of U+000A (LF) not preceded by U+000D (CR), in entry's
value, by a string consisting of a U+000D (CR) and
U+000A (LF).
Return the byte sequence resulting from encoding the entry list using the rules
described by RFC 7578, Returning Values from Forms: multipart/form-data
, given the following conditions:
RFC7578
Each entry in entry list is a field, the name of the entry is the field name and the value of the entry is the field value.
The order of parts must be the same as the order of fields in entry list. Multiple entries with the same name must be treated as distinct fields.
Field names, field values for non-file fields, and filenames for file fields, in the
generated multipart/form-data
resource must be set to the result of encoding the corresponding entry's name or value with
encoding, converted to a byte sequence.
For field names and filenames for file fields, the result of the encoding in the
previous bullet point must be escaped by replacing any 0x0A (LF) bytes with the byte sequence
`%0A
`, 0x0D (CR) with `%0D
` and 0x22 (") with
`%22
`. The user agent must not perform any other escapes.
The parts of the generated multipart/form-data
resource that correspond to
non-file fields must not have a `Content-Type
` header specified.
The boundary used by the user agent in generating the return value of this algorithm is
the multipart/form-data
boundary string. (This value is used to
generate the MIME type of the form submission payload generated by this algorithm.)
For details on how to interpret multipart/form-data
payloads, see RFC 7578.
RFC7578
The text/plain
encoding algorithm, given a list of name-value
pairs pairs, is as follows:
Let result be the empty string.
For each pair in pairs:
Append pair's name to result.
Append a single U+003D EQUALS SIGN character (=) to result.
Append pair's value to result.
Append a U+000D CARRIAGE RETURN (CR) U+000A LINE FEED (LF) character pair to result.
Return result.
Payloads using the text/plain
format are intended to be human readable. They are
not reliably interpretable by computer, as the format is ambiguous (for example, there is no way
to distinguish a literal newline in a value from the newline at the end of the value).
SubmitEvent
interface[Exposed=Window]
interface SubmitEvent : Event {
constructor(DOMString type, optional SubmitEventInit eventInitDict = {});
readonly attribute HTMLElement? submitter;
};
dictionary SubmitEventInit : EventInit {
HTMLElement? submitter = null;
};
event.submitter
Returns the element representing the submit button that triggered the form submission, or null if the submission was not triggered by a button.
The submitter
attribute must return the value it was
initialized to.
FormDataEvent
interface[Exposed=Window]
interface FormDataEvent : Event {
constructor(DOMString type, FormDataEventInit eventInitDict);
readonly attribute FormData formData;
};
dictionary FormDataEventInit : EventInit {
required FormData formData;
};
event.formData
Returns a FormData
object representing names and values of elements associated
to the target form
. Operations on the FormData
object will affect form
data to be submitted.
The formData
attribute must return the value it was
initialized to. It represents a FormData
object associated to the entry
list that is constructed when the
form
is submitted.
When a form
element form is reset, run these steps:
Let reset be the result of firing an
event named reset
at form, with the bubbles
and cancelable
attributes initialized to true.
If reset is true, then invoke the reset algorithm of each resettable element whose form owner is form.
Each resettable element defines its own reset algorithm. Changes made to form controls as part of
these algorithms do not count as changes caused by the user (and thus, e.g., do not cause input
events to fire).
details
elementsummary
element followed by flow content.name
open
[Exposed=Window]
interface HTMLDetailsElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString name;
[CEReactions] attribute boolean open;
};
HTMLDetailsElement
.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:
name
attribute, their name
attributes are not the empty string, and the value of
a's name
attribute equals the value of
b's name
attribute.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:
Assert: element has an open
attribute.
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:
If the open
attribute is set on
otherElement, then:
Assert: otherElement is the only element in
groupMembers that has the open
attribute
set.
Remove the open
attribute on otherElement.
Break.
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:
If the open
attribute is set on
otherElement, then:
Remove the open
attribute on element.
Break.
The name
and open
IDL attributes must reflect the respective content attributes of the same name.
The ancestor details revealing algorithm is to run the following steps on currentNode:
While currentNode has a parent node within the flat tree:
If currentNode is slotted into the second slot of a details
element:
Set currentNode to the details
element which
currentNode is slotted into.
If the open
attribute is not set on
currentNode, then set
the open
attribute on currentNode to the
empty string.
Otherwise, set currentNode to the parent node of currentNode within the flat tree.
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
elementdetails
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:
If this summary
element has no parent, then return false.
Let parent be this summary
element's parent.
If parent is not a details
element, then return false.
If parent's first summary
element child is not this
summary
element, then return false.
Return 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 Hidden State 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 hidden
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 commandAn 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 Hidden State of the command is true (hidden)
if the element has a hidden
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 commandA button
element always defines a
command.
The Label, Access Key, Hidden State, 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 commandAn 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 Hidden State of the command is true (hidden)
if the element has a hidden
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 commandAn 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 Hidden State of the command is true (hidden)
if the element has a hidden
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 commandA 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 Hidden State, 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 elementsAn 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 Hidden State of the command is true (hidden)
if the element has a hidden
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
elementopen
[Exposed=Window]
interface HTMLDialogElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean open;
attribute DOMString returnValue;
[CEReactions] undefined show();
[CEReactions] undefined showModal();
[CEReactions] undefined close(optional DOMString returnValue);
};
HTMLDialogElement
.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.
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.
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 close()
method to close the dialog, or the hidden
attribute to hide it.
The tabindex
attribute must not be specified on
dialog
elements.
dialog.show()
Displays the dialog
element.
dialog.showModal()
Displays the dialog
element and makes it the top-most modal dialog.
This method honors the autofocus
attribute.
dialog.close([ result ])
Closes the dialog
element.
The argument, if provided, provides a return value.
dialog.returnValue [ = result ]
Returns the dialog
's return value.
Can be set, to update the return value.
Every dialog
element has a dialog toggle task tracker, which is a
toggle task tracker or null, initially null.
To queue a dialog toggle event task given a dialog
element
element, a string oldState, and a string newState:
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 and the newState
attribute
initialized to newState.
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.
The show()
method steps are:
If this has an open
attribute and the
is modal flag 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.
If this has an open
attribute, then
return.
Queue a dialog toggle event task given subject, "closed
", and "open
".
Add an open
attribute to this, whose
value is the empty string.
Set this's previously focused element to the focused element.
Let hideUntil be the result of running topmost popover ancestor given this, null, and false.
If hideUntil is null, then set hideUntil to this's node document.
Run hide all popovers until given hideUntil, false, and true.
Run the dialog focusing steps given this.
The showModal()
method steps are:
If this has an open
attribute and the
is modal flag of this is true, then return.
If this has an open
attribute, then
throw an "InvalidStateError
" DOMException
.
If this's node document is not fully active, then
throw an "InvalidStateError
" DOMException
.
If this is not connected, then throw an
"InvalidStateError
" DOMException
.
If this 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
", and the newState
attribute initialized to "open
" at this is false, then
return.
If this has an open
attribute,
then return.
If this is not connected, then return.
If this is in the popover showing state, then return.
Queue a dialog toggle event task given subject, "closed
", and "open
".
Add an open
attribute to this, whose
value is the empty string.
Set the is modal flag of this to true.
Let this's node document be blocked by the modal dialog this.
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 this's node document's top layer does not already contain this, then add an element to the top layer given this.
Set this's close watcher to the result of establishing a close watcher given this's relevant global object, with:
cancelAction given
canPreventClose being to return the result of firing an event named cancel
at this, with the cancelable
attribute initialized to
canPreventClose.
closeAction being to close the dialog given this and null.
Set this's previously focused element to the focused element.
Let hideUntil be the result of running topmost popover ancestor given this, null, and false.
If hideUntil is null, then set hideUntil to this's node document.
Run hide all popovers until given hideUntil, false, and true.
Run the dialog focusing steps given this.
The dialog focusing steps, given a dialog
element subject,
are as follows:
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
HTML element removing steps, given removedNode
and oldParent, are:
If removedNode's close watcher is not null, then:
Destroy removedNode's close watcher.
Set removedNode's close watcher to null.
If removedNode's node document's top layer contains removedNode, then remove an element from the top layer immediately given removedNode.
Set the is modal flag of removedNode to false.
The close(returnValue)
method steps are:
If returnValue is not given, then set it to null.
Close the dialog this with returnValue.
When a dialog
element subject is to be closed, with null or a string result, 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
" and the newState
attribute
initialized to "closed
" at subject.
If subject does not have an open
attribute, then return.
Queue a dialog toggle event task given subject, "open
", and "closed
".
Remove subject's open
attribute.
If the is modal flag 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 the is modal flag of subject to false.
If result is not null, then set the returnValue
attribute to result.
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 element, 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.
If subject's close watcher is not null, then:
Destroy subject's close watcher.
Set subject's close watcher to null.
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.
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 hidden
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.
Each dialog
element has a close watcher,
which is a close watcher or null, initially null.
Each dialog
element has an is modal flag. When a dialog
element is created, this flag must be set to false.
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 popover
attribute set this element to the currently focused element during the show popover algorithm.
The open
IDL
attribute must reflect the open
content
attribute.
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>
Scripts allow authors to add interactivity to their documents.
Authors are encouraged to use declarative alternatives to scripting where possible, as declarative mechanisms are often more maintainable, and many users disable scripting.
For example, instead of using a script to show or hide a section to show more details, the
details
element could be used.
Authors are also encouraged to make their applications degrade gracefully in the absence of scripting support.
For example, if an author provides a link in a table header to dynamically resort the table, the link could also be made to function without scripts by requesting the sorted table from the server.
script
elementsrc
attribute, depends on the value of the type
attribute, but must match
script content restrictions.src
attribute, the element must be either empty or contain only
script documentation that also matches script
content restrictions.src
type
nomodule
async
defer
crossorigin
integrity
referrerpolicy
blocking
fetchpriority
[Exposed=Window]
interface HTMLScriptElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute USVString src;
[CEReactions] attribute DOMString type;
[CEReactions] attribute boolean noModule;
[CEReactions] attribute boolean async;
[CEReactions] attribute boolean defer;
[CEReactions] attribute DOMString? crossOrigin;
[CEReactions] attribute DOMString text;
[CEReactions] attribute DOMString integrity;
[CEReactions] attribute DOMString referrerPolicy;
[SameObject, PutForwards=value] readonly attribute DOMTokenList blocking;
[CEReactions] attribute DOMString fetchPriority;
static boolean supports(DOMString type);
// also has obsolete members
};
HTMLScriptElement
.The script
element allows authors to include dynamic script and data blocks in
their documents. The element does not represent content for the
user.
The type
attribute
allows customization of the type of script represented:
Omitting the attribute, setting it to the empty string, or setting it to a
JavaScript MIME type essence match, means that the script is a classic
script, to be interpreted according to the JavaScript Script top-level production. Classic scripts are affected by the
async
and defer
attributes, but only when the src
attribute is set.
Authors should omit the type
attribute instead of
redundantly setting it.
Setting the attribute to an ASCII case-insensitive match for "module
" means that the script is a JavaScript module script, to
be interpreted according to the JavaScript Module top-level
production. Module scripts are not affected by the defer
attribute, but are affected by the async
attribute (regardless of the state of the src
attribute).
Setting the attribute to an ASCII case-insensitive match for "importmap
" means that the script is an import map, containing
JSON that will be used to control the behavior of module specifier resolution. Import maps can only be inline, i.e., the src
attribute and most other attributes are meaningless and not
to be used with them.
Setting the attribute to any other value means that the script is a data
block, which is not processed. None of the script
attributes (except type
itself) have any effect on data blocks. Authors must use
a valid MIME type string that is not a JavaScript MIME type essence
match to denote data blocks.
The requirement that data blocks
must be denoted using a valid MIME type string is in place to
avoid potential future collisions. If this specification ever adds additional types of
script, they will be triggered by setting the type
attribute to something which is not a MIME type, like how
the "module
" value denotes module
scripts. By using a valid MIME type string now, you ensure that your data block will not
ever be reinterpreted as a different script type, even in future user agents.
Classic scripts and JavaScript module scripts can be embedded inline, or be
imported from an external file using the src
attribute, which if specified gives the URL
of the external script resource to use. If src
is specified,
it must be a valid non-empty URL potentially surrounded by spaces.
The contents of inline script
elements, or the external script resource, must
conform with the requirements of the JavaScript specification's Script or Module productions, for classic scripts and JavaScript module scripts respectively. JAVASCRIPT
The contents of the external script resource for CSS module scripts must conform to the requirements of the CSS specification. CSS
The contents of the external script resource for JSON module scripts must conform to the requirements of the JSON specification. JSON
The contents of inline script
elements for import
maps must conform with the import map authoring requirements.
For import map script
elements, the src
, async
, nomodule
, defer
,
crossorigin
, integrity
, and referrerpolicy
attributes must not be specified.
A document must not have more than one import map script
element.
When used to include data blocks, the data must be embedded
inline, the format of the data must be given using the type
attribute, and the contents of the script
element must conform to the requirements
defined for the format used. The src
, async
, nomodule
,
defer
, crossorigin
, integrity
, referrerpolicy
, and fetchpriority
attributes must not be specified.
The nomodule
attribute is a boolean attribute that prevents a script from being executed in user
agents that support module scripts. This allows selective
execution of module scripts in modern user agents and classic scripts in older user agents, as shown below. The nomodule
attribute must not be specified on module scripts (and will be ignored if it is).
The async
and
defer
attributes are
boolean attributes that indicate how the script should be
evaluated. Classic scripts may specify defer
or async
, but must
not specify either unless the src
attribute is present.
Module scripts may specify the async
attribute, but must not specify the defer
attribute.
There are several possible modes that can be selected using these attributes, and depending on the script's type.
For classic scripts, if the async
attribute is present, then the classic script will be
fetched in parallel to parsing and evaluated as soon as it is available (potentially
before parsing completes). If the async
attribute is not
present but the defer
attribute is present, then the
classic script will be fetched in parallel and evaluated when the page has finished
parsing. If neither attribute is present, then the script is fetched and evaluated immediately,
blocking parsing until these are both complete.
For module scripts, if the async
attribute is present, then the module script and all its
dependencies will be fetched in parallel to parsing, and the module script will
be evaluated as soon as it is available (potentially before parsing completes). Otherwise, the
module script and its dependencies will be fetched in parallel to parsing and
evaluated when the page has finished parsing. (The defer
attribute has no effect on module scripts.)
This is all summarized in the following schematic diagram:
The exact processing details for these attributes are, for mostly historical
reasons, somewhat non-trivial, involving a number of aspects of HTML. The implementation
requirements are therefore by necessity scattered throughout the specification. The algorithms
below (in this section) describe the core of this processing, but these algorithms reference and
are referenced by the parsing rules for script
start and end tags in HTML, in foreign content,
and in XML, the rules for the document.write()
method, the handling of scripting, etc.
When inserted using the document.write()
method, script
elements usually
execute (typically blocking further script execution or HTML parsing). When inserted using the
innerHTML
and outerHTML
attributes, they do not execute at all.
The defer
attribute may be specified even if the async
attribute is specified, to cause legacy web browsers that
only support defer
(and not async
) to fall back to the defer
behavior instead of the blocking behavior that
is the default.
The crossorigin
attribute is a CORS settings
attribute. For classic scripts, it controls whether
error information will be exposed, when the script is obtained from other origins. For module scripts, it
controls the credentials mode used for
cross-origin requests.
Unlike classic scripts, module scripts require the use of the CORS protocol for cross-origin fetching.
The integrity
attribute represents the integrity
metadata for requests which this element is responsible for. The value is text. The integrity
attribute must not be specified when the src
attribute is not specified. SRI
The referrerpolicy
attribute is a referrer
policy attribute. Its purpose is to set the referrer policy used when fetching the script, as well as any scripts imported from it.
REFERRERPOLICY
An example of a script
element's referrer policy being used when fetching
imported scripts but not other subresources:
<script referrerpolicy="origin">
fetch('/api/data'); // not fetched with <script>'s referrer policy
import('./utils.mjs'); // is fetched with <script>'s referrer policy ("origin" in this case)
</script>
The blocking
attribute is a blocking attribute.
The fetchpriority
attribute is a
fetch priority attribute. Its purpose is to set the priority used when fetching the script.
Changing the src
, type
, nomodule
, async
, defer
, crossorigin
, integrity
, referrerpolicy
, and fetchpriority
attributes dynamically has no direct
effect; these attributes are only used at specific times described below.
The IDL attributes src
, type
, defer
, integrity
, and blocking
, must each
reflect the respective content attributes of the same name.
The referrerPolicy
IDL attribute must
reflect the referrerpolicy
content
attribute, limited to only known values.
The fetchPriority
IDL attribute must
reflect the fetchpriority
content attribute, limited to only known values.
The crossOrigin
IDL attribute must reflect
the crossorigin
content attribute, limited to
only known values.
The noModule
IDL attribute must reflect the
nomodule
content attribute.
The async
getter steps are:
If this's force async is true, then return true.
If this's async
content attribute is
present, then return true.
Return false.
The async
setter steps are:
Set this's force async to false.
If the given value is true, then set this's async
content attribute to the empty string.
Otherwise, remove this's async
content attribute.
script.text [ = value ]
Returns the child text content of the element.
Can be set, to replace the element's children with the given value.
HTMLScriptElement
.supports(type)
Returns true if the given type is a script type supported by the user agent. The
possible script types in this specification are "classic
", "module
", and "importmap
", but others might be added in
the future.
The text
attribute's getter must return this script
element's child text
content.
The text
attribute's setter must string replace
all with the given value within this script
element.
The supports(type)
method steps are:
If type is "classic
", then return
true.
If type is "module
", then return
true.
If type is "importmap
", then return
true.
Return false.
The type argument has to exactly match these values; we do not
perform an ASCII case-insensitive match. This is different from how type
content attribute values are treated, and how
DOMTokenList
's supports()
method
works, but it aligns with the WorkerType
enumeration used in the Worker()
constructor.
In this example, two script
elements are used. One embeds an external
classic script, and the other includes some data as a data block.
<script src="game-engine.js"></script>
<script type="text/x-game-map">
........U.........e
o............A....e
.....A.....AAA....e
.A..AAA...AAAAA...e
</script>
The data in this case might be used by the script to generate the map of a video game. The data doesn't have to be used that way, though; maybe the map data is actually embedded in other parts of the page's markup, and the data block here is just used by the site's search engine to help users who are looking for particular features in their game maps.
The following sample shows how a script
element can be used to define a function
that is then used by other parts of the document, as part of a classic script. It
also shows how a script
element can be used to invoke script while the document is
being parsed, in this case to initialize the form's output.
<script>
function calculate(form) {
var price = 52000;
if (form.elements.brakes.checked)
price += 1000;
if (form.elements.radio.checked)
price += 2500;
if (form.elements.turbo.checked)
price += 5000;
if (form.elements.sticker.checked)
price += 250;
form.elements.result.value = price;
}
</script>
<form name="pricecalc" onsubmit="return false" onchange="calculate(this)">
<fieldset>
<legend>Work out the price of your car</legend>
<p>Base cost: £52000.</p>
<p>Select additional options:</p>
<ul>
<li><label><input type=checkbox name=brakes> Ceramic brakes (£1000)</label></li>
<li><label><input type=checkbox name=radio> Satellite radio (£2500)</label></li>
<li><label><input type=checkbox name=turbo> Turbo charger (£5000)</label></li>
<li><label><input type=checkbox name=sticker> "XZ" sticker (£250)</label></li>
</ul>
<p>Total: £<output name=result></output></p>
</fieldset>
<script>
calculate(document.forms.pricecalc);
</script>
</form>
The following sample shows how a script
element can be used to include an
external JavaScript module script.
<script type="module" src="app.mjs"></script>
This module, and all its dependencies (expressed through JavaScript import
statements in the source file), will be fetched. Once the entire
resulting module graph has been imported, and the document has finished parsing, the contents of
app.mjs
will be evaluated.
Additionally, if code from another script
element in the same Window
imports the module from app.mjs
(e.g. via import
"./app.mjs";
), then the same JavaScript module script created by the
former script
element will be imported.
This example shows how to include a JavaScript module script for modern user agents, and a classic script for older user agents:
<script type="module" src="app.mjs"></script>
<script nomodule defer src="classic-app-bundle.js"></script>
In modern user agents that support JavaScript module
scripts, the script
element with the nomodule
attribute will be ignored, and the
script
element with a type
of "module
" will be fetched and evaluated (as a JavaScript module
script). Conversely, older user agents will ignore the script
element with a
type
of "module
", as that is an
unknown script type for them — but they will have no problem fetching and evaluating the other
script
element (as a classic script), since they do not implement the
nomodule
attribute.
The following sample shows how a script
element can be used to write an inline
JavaScript module script that performs a number of substitutions on the document's
text, in order to make for a more interesting reading experience (e.g. on a news site):
XKCD1288
<script type="module">
import { walkAllTextNodeDescendants } from "./dom-utils.mjs";
const substitutions = new Map([
["witnesses", "these dudes I know"]
["allegedly", "kinda probably"]
["new study", "Tumblr post"]
["rebuild", "avenge"]
["space", "spaaace"]
["Google glass", "Virtual Boy"]
["smartphone", "Pokédex"]
["electric", "atomic"]
["Senator", "Elf-Lord"]
["car", "cat"]
["election", "eating contest"]
["Congressional leaders", "river spirits"]
["homeland security", "Homestar Runner"]
["could not be reached for comment", "is guilty and everyone knows it"]
]);
function substitute(textNode) {
for (const [before, after] of substitutions.entries()) {
textNode.data = textNode.data.replace(new RegExp(`\\b${before}\\b`, "ig"), after);
}
}
walkAllTextNodeDescendants(document.body, substitute);
</script>
Some notable features gained by using a JavaScript module script include the ability to import
functions from other JavaScript modules, strict mode by default, and how top-level declarations
do not introduce new properties onto the global object. Also note that no matter
where this script
element appears in the document, it will not be evaluated until
both document parsing has complete and its dependency (dom-utils.mjs
) has
been fetched and evaluated.
The following sample shows how a JSON module script can be imported from inside a JavaScript module script:
<script type="module">
import peopleInSpace from "http://api.open-notify.org/astros.json" with { type: "json" };
const list = document.querySelector("#people-in-space");
for (const { craft, name } of peopleInSpace.people) {
const li = document.createElement("li");
li.textContent = `${name} / ${craft}`;
list.append(li);
}
</script>
MIME type checking for module scripts is strict. In order for the fetch of the JSON
module script to succeed, the HTTP response must have a JSON MIME type, for
example Content-Type: text/json
. On the other hand, if the with { type: "json" }
part of the statement is omitted, it is assumed that the
intent is to import a JavaScript module script, and the fetch will fail if the HTTP
response has a MIME type that is not a JavaScript MIME type.
A script
element has several associated pieces of state.
A script
element has a parser document, which is either null or a
Document
, initially null. It is set by the HTML parser and the
XML parser on script
elements they insert, and affects the processing
of those elements. script
elements with non-null parser documents are known as parser-inserted.
A script
element has a preparation-time document, which is either null
or a Document
, initially null. It is used to prevent scripts that move between
documents during preparation from executing.
A script
element has a force
async boolean, initially true. It is set to false by the HTML parser and the
XML parser on script
elements they insert, and when the element gets an
async
content attribute added.
A script
element has a from an external
file boolean, initially false. It is determined when the script is prepared, based on the src
attribute of the element at that time.
A script
element has a ready to be parser-executed boolean, initially
false. This is used only used for elements that are also parser-inserted, to let the
parser know when to execute the script.
A script
element has an already started boolean, initially false.
A script
element has a delaying the
load event boolean, initially false.
A script
element has a type, which is
either null, "classic
", "module
", or "importmap
", initially null. It is determined when the element is prepared, based on the type
attribute of the element at that time.
A script
element has a result, which is either "uninitialized
", null (representing an error), a script, or an import map parse result. It is
initially "uninitialized
".
A script
element has steps to run when the result
is ready, which are a series of steps or null, initially null. To mark as ready a
script
element el given a script, import map parse result, or null
result:
Set el's result to result.
If el's steps to run when the result is ready are not null, then run them.
Set el's steps to run when the result is ready to null.
Set el's delaying the load event to false.
A script
element el is implicitly potentially
render-blocking if el's type is
"classic
", el is parser-inserted, and
el does not have an async
or defer
attribute.
The cloning steps for a script
element el being cloned to a copy copy are to set copy's
already started to el's already started.
When an async
attribute is added to a
script
element el, the user agent must set el's
force async to false.
Whenever a script
element el's delaying the load event is true, the user agent must
delay the load event of el's preparation-time document.
The script
HTML element post-connection steps, given
insertedNode, are:
If insertedNode is not connected, then return.
This can happen in the case where an earlier-inserted script
removes a
later-inserted script
. For instance:
<script>
const script1 = document.createElement('script');
script1.innerText = `
document.querySelector('#script2').remove();
`;
const script2 = document.createElement('script');
script2.id = 'script2';
script2.textContent = `console.log('script#2 running')`;
document.body.append(script1, script2);
</script>
Nothing is printed to the console in this example. By the time the HTML element
post-connection steps run for the first script
that was atomically inserted
by append()
, it can observe that the second
script
is already connected to the DOM. It removes the second
script
, so that by the time its HTML element post-connection
steps run, it is no longer connected, and does not get prepared.
If insertedNode is parser-inserted, then return.
Prepare the script element given insertedNode.
The script
children changed steps are:
Run the script
HTML element post-connection steps, given the
script
element.
This has an interesting implication on the execution order of a script
element
and any newly-inserted child script
elements. Consider the following snippet:
<script id=outer-script></script>
<script>
const outerScript = document.querySelector('#outer-script');
const start = new Text('console.log(1);');
const innerScript = document.createElement('script');
innerScript.textContent = `console.log('inner script executing')`;
const end = new Text('console.log(2);');
outerScript.append(start, innerScript, end);
// Logs:
// 1
// 2
// inner script executing
</script>
By the time the second script block executes, the outer-script
has
already been prepared, but because it is empty,
it did not execute and therefore is not marked as already started. The atomic
insertion of the Text
nodes and nested script
element have the
following effects:
All three child nodes get atomically inserted as children of outer-script
; all of their insertion
steps run, which have no observable consequences in this case.
The outer-script
's children changed steps run, which
prepares that script; because its body is now
non-empty, this executes the contents of the two Text
nodes, in order.
The script
HTML element post-connection steps finally run for
innerScript
, causing its body to execute.
The following attribute change
steps, given element, localName, oldValue,
value, and namespace, are used for all script
elements:
If namespace is not null, then return.
If localName is src
, then run the
script
HTML element post-connection steps, given
element.
To prepare the script element given a script
element el:
If el's already started is true, then return.
Let parser document be el's parser document.
Set el's parser document to null.
This is done so that if parser-inserted script
elements fail to run
when the parser tries to run them, e.g. because they are empty or specify an unsupported
scripting language, another script can later mutate them and cause them to run again.
If parser document is non-null and el does not have an async
attribute, then set el's force async to true.
This is done so that if a parser-inserted script
element fails to
run when the parser tries to run it, but it is later executed after a script dynamically
updates it, it will execute in an async fashion even if the async
attribute isn't set.
Let source text be el's child text content.
If el has no src
attribute, and source text is the empty string,
then return.
If el is not connected, then return.
If any of the following are true:
el has a type
attribute whose value is
the empty string;
el has no type
attribute but it has a
language
attribute and that attribute's
value is the empty string; or
el has neither a type
attribute nor a
language
attribute,
then let the script block's type string for this script
element be
"text/javascript
".
Otherwise, if el has a type
attribute, then
let the script block's type string be the value of that attribute with leading and trailing ASCII whitespace
stripped.
Otherwise, el has a non-empty language
attribute; let the script block's type string be the concatenation of "text/
" and the value of el's language
attribute.
The language
attribute is never
conforming, and is always ignored if there is a type
attribute present.
If the script block's type string is a JavaScript MIME type essence
match, then set el's type to "classic
".
Otherwise, if the script block's type string is an ASCII
case-insensitive match for the string "module
", then set
el's type to "module
".
Otherwise, if the script block's type string is an ASCII
case-insensitive match for the string "importmap
", then set
el's type to "importmap
".
Otherwise, return. (No script is executed, and el's type is left as null.)
If parser document is non-null, then set el's parser document back to parser document and set el's force async to false.
Set el's already started to true.
Set el's preparation-time document to its node document.
If parser document is non-null, and parser document is not equal to el's preparation-time document, then return.
If scripting is disabled for el, then return.
The definition of scripting is
disabled means that, amongst others, the following scripts will not execute: scripts in
XMLHttpRequest
's responseXML
documents, scripts in DOMParser
-created documents, scripts in documents created by
XSLTProcessor
's transformToDocument
feature, and scripts
that are first inserted by a script into a Document
that was created using the
createDocument()
API. XHR
DOMPARSING XSLTP DOM
If el has a nomodule
content attribute
and its type is "classic
",
then return.
This means specifying nomodule
on a
module script has no effect; the algorithm continues onward.
If el does not have a src
content attribute, and the Should element's inline
behavior be blocked by Content Security Policy? algorithm returns "Blocked
" when given el, "script
", and
source text, then return. CSP
If el has an event
attribute and a for
attribute, and el's type is "classic
", then:
Let for be the value of el's for
attribute.
Let event be the value of el's event
attribute.
Strip leading and trailing ASCII whitespace from event and for.
If for is not an ASCII case-insensitive match for the string
"window
", then return.
If event is not an ASCII case-insensitive match for either the
string "onload
" or the string "onload()
", then
return.
If el has a charset
attribute, then let
encoding be the result of getting an encoding from the value of the
charset
attribute.
If el does not have a charset
attribute, or if getting an encoding failed, then let encoding be
el's node document's the
encoding.
If el's type is "module
", this encoding will be ignored.
Let classic script CORS setting be the current state of el's crossorigin
content attribute.
Let module script credentials mode be the CORS settings attribute
credentials mode for el's crossorigin
content attribute.
Let cryptographic nonce be el's [[CryptographicNonce]] internal slot's value.
If el has an integrity
attribute,
then let integrity metadata be that attribute's value.
Otherwise, let integrity metadata be the empty string.
Let referrer policy be the current state of el's referrerpolicy
content attribute.
Let fetch priority be the current state of el's fetchpriority
content attribute.
Let parser metadata be "parser-inserted
" if
el is parser-inserted, and "not-parser-inserted
"
otherwise.
Let options be a script fetch options whose cryptographic nonce is cryptographic nonce, integrity metadata is integrity metadata, parser metadata is parser metadata, credentials mode is module script credentials mode, referrer policy is referrer policy, and fetch priority is fetch priority.
Let settings object be el's node document's relevant settings object.
If el has a src
content attribute, then:
If el's type is "importmap
", then queue an element task on the DOM
manipulation task source given el to fire
an event named error
at el, and
return.
External import map scripts are not currently supported. See WICG/import-maps issue #235 for discussions on adding support.
Let src be the value of el's src
attribute.
If src is the empty string, then queue an element task on the
DOM manipulation task source given el to fire an event named error
at el, and return.
Set el's from an external file to true.
Let url be the result of encoding-parsing a URL given src, relative to el's node document.
If url is failure, then queue an element task on the DOM
manipulation task source given el to fire
an event named error
at el, and
return.
If el is potentially render-blocking, then block rendering on el.
Set el's delaying the load event to true.
If el is currently render-blocking, then set options's render-blocking to true.
Let onComplete given result be the following steps:
Mark as ready el given result.
Switch on el's type:
classic
"Fetch a classic script given url, settings object, options, classic script CORS setting, encoding, and onComplete.
module
"If el does not have an integrity
attribute, then set options's integrity metadata to the result of
resolving a module integrity metadata with url and settings
object.
Fetch an external module script graph given url, settings object, options, and onComplete.
For performance reasons, user agents may start fetching the classic script or module graph
(as defined above) as soon as the src
attribute is set,
instead, in the hope that el will become connected (and that the crossorigin
attribute won't change value in the
meantime). Either way, once el becomes connected, the load must have
started as described in this step. If the UA performs such prefetching, but el
never becomes connected, or the src
attribute is
dynamically changed, or the crossorigin
attribute is dynamically changed, then the
user agent will not execute the script so obtained, and the fetching process will have been
effectively wasted.
If el does not have a src
content
attribute:
Let base URL be el's node document's document base URL.
Switch on el's type:
classic
"Let script be the result of creating a classic script using source text, settings object, base URL, and options.
Mark as ready el given script.
module
"Set el's delaying the load event to true.
If el is potentially render-blocking, then:
Block rendering on el.
Set options's render-blocking to true.
Fetch an inline module script graph, given source text, base URL, settings object, options, and with the following steps given result:
Queue an element task on the networking task source given el to perform the following steps:
Mark as ready el given result.
Queueing a task here means that, even if the inline module script has no dependencies or synchronously results in a parse error, we won't proceed to execute the script element synchronously.
importmap
"Let result be the result of creating an import map parse result given source text and base URL.
Mark as ready el given result.
If el's type is "classic
" and el has a src
attribute, or el's type is "module
":
Assert: el's result
is "uninitialized
".
If el has an async
attribute or el's force async is true:
Let scripts be el's preparation-time document's set of scripts that will execute as soon as possible.
Append el to scripts.
Set el's steps to run when the result is ready to the following:
Execute the script element el.
Remove el from scripts.
Otherwise, if el is not parser-inserted:
Let scripts be el's preparation-time document's list of scripts that will execute in order as soon as possible.
Append el to scripts.
Set el's steps to run when the result is ready to the following:
If scripts[0] is not el, then abort these steps.
While scripts is not empty, and scripts[0]'s result is not "uninitialized
":
Execute the script element scripts[0].
Remove scripts[0].
Otherwise, if el has a
defer
attribute or el's type is "module
":
Append el to its parser document's list of scripts that will execute when the document has finished parsing.
Set el's steps to run when the result is ready to the following: set el's ready to be parser-executed to true. (The parser will handle executing the script.)
Otherwise:
Set el's parser document's pending parsing-blocking script to el.
Block rendering on el.
Set el's steps to run when the result is ready to the following: set el's ready to be parser-executed to true. (The parser will handle executing the script.)
Otherwise:
Assert: el's result
is not "uninitialized
".
If all of the following are true:
classic
";then:
Set el's parser document's pending parsing-blocking script to el.
Set el's ready to be parser-executed to true. (The parser will handle executing the script.)
Otherwise, immediately execute the script element el, even if other scripts are already executing.
Each Document
has a pending parsing-blocking script, which is a
script
element or null, initially null.
Each Document
has a set of scripts that will execute as soon as
possible, which is a set of script
elements, initially empty.
Each Document
has a list of scripts that will execute in order as soon as
possible, which is a list of script
elements, initially
empty.
Each Document
has a list of scripts that will execute when the document has
finished parsing, which is a list of script
elements, initially
empty.
If a script
element that blocks a parser gets moved to another
Document
before it would normally have stopped blocking that parser, it nonetheless
continues blocking that parser until the condition that causes it to be blocking the parser no
longer applies (e.g., if the script is a pending parsing-blocking script because the
original Document
has a style sheet that is blocking scripts when it was
parsed, but then the script is moved to another Document
before the blocking style
sheet(s) loaded, the script still blocks the parser until the style sheets are all loaded, at
which time the script executes and the parser is unblocked).
To execute the script element given a
script
element el:
Let document be el's node document.
If el's preparation-time document is not equal to document, then return.
Unblock rendering on el.
If el's result is null, then fire an event named error
at el, and return.
If el's from an external file is
true, or el's type is "module
", then increment document's ignore-destructive-writes
counter.
Switch on el's type:
classic
"Let oldCurrentScript be the value to which document's currentScript
object was most recently
set.
If el's root is not a shadow root, then
set document's currentScript
attribute to el. Otherwise, set it to null.
This does not use the in a document tree check, as
el could have been removed from the document prior to execution, and in that
scenario currentScript
still needs to
point to it.
Run the classic script given by el's result.
Set document's currentScript
attribute to
oldCurrentScript.
module
"Assert: document's currentScript
attribute is null.
Run the module script given by el's result.
importmap
"Register an import map given el's relevant global object and el's result.
Decrement the ignore-destructive-writes counter of document, if it was incremented in the earlier step.
If el's from an external file is
true, then fire an event named load
at el.
User agents are not required to support JavaScript. This standard needs to be updated
if a language other than JavaScript comes along and gets similar wide adoption by web browsers.
Until such a time, implementing other languages is in conflict with this standard, given the
processing model defined for the script
element.
Servers should use text/javascript
for JavaScript resources, in accordance with
Updates to ECMAScript Media Types. Servers should not use other
JavaScript MIME types for JavaScript resources, and
must not use non-JavaScript MIME types.
RFC9239
For external JavaScript resources, MIME type parameters in `Content-Type
` headers
are generally ignored. (In some cases the `charset
` parameter has an
effect.) However, for the script
element's type
attribute they are significant; it uses the JavaScript
MIME type essence match concept.
For example, scripts with their type
attribute set to "text/javascript; charset=utf-8
" will not be
evaluated, even though that is a valid JavaScript MIME type when parsed.
Furthermore, again for external JavaScript resources, special considerations apply around
`Content-Type
` header processing as detailed in the prepare the script
element algorithm and Fetch. FETCH
script
elementsThe easiest and safest way to avoid the rather strange restrictions described in
this section is to always escape an ASCII case-insensitive match for "<!--
" as "\x3C!--
", "<script
" as "\x3Cscript
", and "</script
" as "\x3C/script
" when these sequences appear
in literals in scripts (e.g. in strings, regular expressions, or comments), and to avoid writing
code that uses such constructs in expressions. Doing so avoids the pitfalls that the restrictions
in this section are prone to triggering: namely, that, for historical reasons, parsing of
script
blocks in HTML is a strange and exotic practice that acts unintuitively in the
face of these sequences.
The script
element's descendant text content must match the script
production in the following ABNF, the character set for which is Unicode.
ABNF
script = outer *( comment-open inner comment-close outer )
outer = < any string that doesn't contain a substring that matches not-in-outer >
not-in-outer = comment-open
inner = < any string that doesn't contain a substring that matches not-in-inner >
not-in-inner = comment-close / script-open
comment-open = "<!--"
comment-close = "-->"
script-open = "<" s c r i p t tag-end
s = %x0053 ; U+0053 LATIN CAPITAL LETTER S
s =/ %x0073 ; U+0073 LATIN SMALL LETTER S
c = %x0043 ; U+0043 LATIN CAPITAL LETTER C
c =/ %x0063 ; U+0063 LATIN SMALL LETTER C
r = %x0052 ; U+0052 LATIN CAPITAL LETTER R
r =/ %x0072 ; U+0072 LATIN SMALL LETTER R
i = %x0049 ; U+0049 LATIN CAPITAL LETTER I
i =/ %x0069 ; U+0069 LATIN SMALL LETTER I
p = %x0050 ; U+0050 LATIN CAPITAL LETTER P
p =/ %x0070 ; U+0070 LATIN SMALL LETTER P
t = %x0054 ; U+0054 LATIN CAPITAL LETTER T
t =/ %x0074 ; U+0074 LATIN SMALL LETTER T
tag-end = %x0009 ; U+0009 CHARACTER TABULATION (tab)
tag-end =/ %x000A ; U+000A LINE FEED (LF)
tag-end =/ %x000C ; U+000C FORM FEED (FF)
tag-end =/ %x0020 ; U+0020 SPACE
tag-end =/ %x002F ; U+002F SOLIDUS (/)
tag-end =/ %x003E ; U+003E GREATER-THAN SIGN (>)
When a script
element contains script documentation, there are
further restrictions on the contents of the element, as described in the section below.
The following script illustrates this issue. Suppose you have a script that contains a string, as in:
const example = 'Consider this string: <!-- <script>';
console.log(example);
If one were to put this string directly in a script
block, it would violate the
restrictions above:
<script>
const example = 'Consider this string: <!-- <script>';
console.log(example);
</script>
The bigger problem, though, and the reason why it would violate those restrictions, is that
actually the script would get parsed weirdly: the script block above is not terminated.
That is, what looks like a "</script>
" end tag in this snippet is
actually still part of the script
block. The script doesn't execute (since it's not
terminated); if it somehow were to execute, as it might if the markup looked as follows, it would
fail because the script (highlighted here) is not valid JavaScript:
<script>
const example = 'Consider this string: <!-- <script>';
console.log(example);
</script>
<!-- despite appearances, this is actually part of the script still! -->
<script>
... // this is the same script block still...
</script>
What is going on here is that for legacy reasons, "<!--
" and "<script
" strings in script
elements in HTML need to be balanced
in order for the parser to consider closing the block.
By escaping the problematic strings as mentioned at the top of this section, the problem is avoided entirely:
<script>
// Note: `\x3C` is an escape sequence for `<`.
const example = 'Consider this string: \x3C!-- \x3Cscript>';
console.log(example);
</script>
<!-- this is just a comment between script blocks -->
<script>
... // this is a new script block
</script>
It is possible for these sequences to naturally occur in script expressions, as in the following examples:
if (x<!--y) { ... }
if ( player<script ) { ... }
In such cases the characters cannot be escaped, but the expressions can be rewritten so that the sequences don't occur, as in:
if (x < !--y) { ... }
if (!--y > x) { ... }
if (!(--y) > x) { ... }
if (player < script) { ... }
if (script > player) { ... }
Doing this also avoids a different pitfall as well: for related historical reasons, the string "<!--" in classic scripts is actually treated as a line comment start, just like "//".
If a script
element's src
attribute is
specified, then the contents of the script
element, if any, must be such that the
value of the text
IDL attribute, which is derived from the
element's contents, matches the documentation
production in the following
ABNF, the character set for which is Unicode. ABNF
documentation = *( *( space / tab / comment ) [ line-comment ] newline )
comment = slash star *( not-star / star not-slash ) 1*star slash
line-comment = slash slash *not-newline
; characters
tab = %x0009 ; U+0009 CHARACTER TABULATION (tab)
newline = %x000A ; U+000A LINE FEED (LF)
space = %x0020 ; U+0020 SPACE
star = %x002A ; U+002A ASTERISK (*)
slash = %x002F ; U+002F SOLIDUS (/)
not-newline = %x0000-0009 / %x000B-10FFFF
; a scalar value other than U+000A LINE FEED (LF)
not-star = %x0000-0029 / %x002B-10FFFF
; a scalar value other than U+002A ASTERISK (*)
not-slash = %x0000-002E / %x0030-10FFFF
; a scalar value other than U+002F SOLIDUS (/)
This corresponds to putting the contents of the element in JavaScript comments.
This requirement is in addition to the earlier restrictions on the syntax of
contents of script
elements.
This allows authors to include documentation, such as license information or API information,
inside their documents while still referring to external script files. The syntax is constrained
so that authors don't accidentally include what looks like valid script while also providing a
src
attribute.
<script src="cool-effects.js">
// create new instances using:
// var e = new Effect();
// start the effect using .play, stop using .stop:
// e.play();
// e.stop();
</script>
script
elements and XSLTThis specification does not define how XSLT interacts with the script
element.
However, in the absence of another specification actually defining this, here are some guidelines
for implementers, based on existing implementations:
When an XSLT transformation program is triggered by an <?xml-stylesheet?>
processing instruction and the browser implements a
direct-to-DOM transformation, script
elements created by the XSLT processor need to
have its parser document set correctly, and run in document order (modulo scripts
marked defer
or async
), immediately, as the transformation is
occurring.
The XSLTProcessor
transformToDocument()
method adds elements
to a Document
object with a null browsing
context, and, accordingly, any script
elements they create need to have
their already started set to true in the prepare the script element
algorithm and never get executed (scripting is
disabled). Such script
elements still need to have their parser
document set, though, such that their async
IDL
attribute will return false in the absence of an async
content attribute.
The XSLTProcessor
transformToFragment()
method needs to
create a fragment that is equivalent to one built manually by creating the elements using document.createElementNS()
. For instance, it needs
to create script
elements with null parser document and with their
already started set to false, so that they will execute when the fragment is
inserted into a document.
The main distinction between the first two cases and the last case is that the first two
operate on Document
s and the last operates on a fragment.
noscript
elementhead
element of an HTML document, if there are no ancestor noscript
elements.noscript
elements.head
element: in any order, zero or more link
elements, zero or more style
elements, and zero or more meta
elements.head
element: transparent, but there must be no noscript
element descendants.HTMLElement
.The noscript
element represents nothing if scripting is enabled, and represents its children if
scripting is disabled. It is used to present different
markup to user agents that support scripting and those that don't support scripting, by affecting
how the document is parsed.
When used in HTML documents, the allowed content model is as follows:
head
element, if scripting is
disabled for the noscript
elementThe noscript
element must contain only link
, style
,
and meta
elements.
head
element, if scripting is enabled
for the noscript
elementThe noscript
element must contain only text, except that invoking the
HTML fragment parsing algorithm with
the noscript
element as the context
element and the text contents as the input must result in a list of nodes
that consists only of link
, style
, and meta
elements that
would be conforming if they were children of the noscript
element, and no parse errors.
head
elements, if scripting is
disabled for the noscript
elementThe noscript
element's content model is transparent, with the
additional restriction that a noscript
element must not have a noscript
element as an ancestor (that is, noscript
can't be nested).
head
elements, if scripting is
enabled for the noscript
elementThe noscript
element must contain only text, except that the text must be such
that running the following algorithm results in a conforming document with no
noscript
elements and no script
elements, and such that no step in the
algorithm throws an exception or causes an HTML parser to flag a parse
error:
script
element from the document.noscript
element in the document. For every
noscript
element in that list, perform the following steps:
noscript
element.outerHTML
attribute of the
noscript
element to the value of s. (This, as a side-effect, causes
the noscript
element to be removed from the document.)All these contortions are required because, for historical reasons, the
noscript
element is handled differently by the HTML parser based on
whether scripting was enabled or not when the parser was
invoked.
The noscript
element must not be used in XML documents.
The noscript
element is only effective in the HTML
syntax, it has no effect in the XML syntax. This is because the way it works
is by essentially "turning off" the parser when scripts are enabled, so that the contents of the
element are treated as pure text and not as real elements. XML does not define a mechanism by
which to do this.
The noscript
element has no other requirements. In particular, children of the
noscript
element are not exempt from form submission, scripting, and so
forth, even when scripting is enabled for the element.
In the following example, a noscript
element is
used to provide fallback for a script.
<form action="calcSquare.php">
<p>
<label for=x>Number</label>:
<input id="x" name="x" type="number">
</p>
<script>
var x = document.getElementById('x');
var output = document.createElement('p');
output.textContent = 'Type a number; it will be squared right then!';
x.form.appendChild(output);
x.form.onsubmit = function () { return false; }
x.oninput = function () {
var v = x.valueAsNumber;
output.textContent = v + ' squared is ' + v * v;
};
</script>
<noscript>
<input type=submit value="Calculate Square">
</noscript>
</form>
When script is disabled, a button appears to do the calculation on the server side. When script is enabled, the value is computed on-the-fly instead.
The noscript
element is a blunt instrument. Sometimes, scripts might be enabled,
but for some reason the page's script might fail. For this reason, it's generally better to avoid
using noscript
, and to instead design the script to change the page from being a
scriptless page to a scripted page on the fly, as in the next example:
<form action="calcSquare.php">
<p>
<label for=x>Number</label>:
<input id="x" name="x" type="number">
</p>
<input id="submit" type=submit value="Calculate Square">
<script>
var x = document.getElementById('x');
var output = document.createElement('p');
output.textContent = 'Type a number; it will be squared right then!';
x.form.appendChild(output);
x.form.onsubmit = function () { return false; }
x.oninput = function () {
var v = x.valueAsNumber;
output.textContent = v + ' squared is ' + v * v;
};
var submit = document.getElementById('submit');
submit.parentNode.removeChild(submit);
</script>
</form>
The above technique is also useful in XML documents, since noscript
is not allowed there.
template
elementcolgroup
element that doesn't have a span
attribute.shadowrootmode
shadowrootdelegatesfocus
shadowrootclonable
shadowrootserializable
[Exposed=Window]
interface HTMLTemplateElement : HTMLElement {
[HTMLConstructor] constructor();
readonly attribute DocumentFragment content;
[CEReactions] attribute DOMString shadowRootMode;
[CEReactions] attribute boolean shadowRootDelegatesFocus;
[CEReactions] attribute boolean shadowRootClonable;
[CEReactions] attribute boolean shadowRootSerializable;
};
HTMLTemplateElement
.The template
element is used to declare fragments of HTML that can be cloned and
inserted in the document by script.
In a rendering, the template
element represents nothing.
The shadowrootmode
content attribute is an
enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
open
| open | The template element represents an open declarative shadow root. |
closed
| closed | The template element represents a closed declarative shadow root. |
The shadowrootmode
attribute's invalid value default and missing value default are both the none state.
The shadowrootdelegatesfocus
content
attribute is a boolean attribute.
The shadowrootclonable
content attribute is a
boolean attribute.
The shadowrootserializable
content
attribute is a boolean attribute.
The template contents of a template
element are not children of the element itself.
It is also possible, as a result of DOM manipulation, for a template
element to contain Text
nodes and element nodes; however, having any is a violation
of the template
element's content model, since its content model is defined as nothing.
For example, consider the following document:
<!doctype html>
<html lang="en">
<head>
<title>Homework</title>
<body>
<template id="template"><p>Smile!</p></template>
<script>
let num = 3;
const fragment = document.getElementById('template').content.cloneNode(true);
while (num-- > 1) {
fragment.firstChild.before(fragment.firstChild.cloneNode(true));
fragment.firstChild.textContent += fragment.lastChild.textContent;
}
document.body.appendChild(fragment);
</script>
</html>
The p
element in the template
is not a child of the
template
in the DOM; it is a child of the DocumentFragment
returned by
the template
element's content
IDL
attribute.
If the script were to call appendChild()
on the
template
element, that would add a child to the template
element (as
for any other element); however, doing so is a violation of the template
element's
content model.
template.content
Returns the template contents (a DocumentFragment
).
Each template
element has an associated DocumentFragment
object that
is its template contents. The template contents have no conformance requirements. When a template
element
is created, the user agent must run the following steps to establish the template
contents:
Let doc be the template
element's node document's appropriate template contents owner
document.
Create a DocumentFragment
object whose node document is
doc and host is the
template
element.
Set the template
element's template contents to the newly
created DocumentFragment
object.
A Document
doc's appropriate template contents owner
document is the Document
returned by the following algorithm:
If doc is not a Document
created by this algorithm, then:
If doc does not yet have an associated inert template document, then:
Let new doc be a new Document
(whose browsing context is null). This is "a
Document
created by this algorithm" for the purposes of the step above.
If doc is an HTML document, mark new doc as an HTML document also.
Let doc's associated inert template document be new doc.
Set doc to doc's associated inert template document.
Each Document
not created by this algorithm thus gets a single
Document
to act as its proxy for owning the template contents of all
its template
elements, so that they aren't in a browsing context and
thus remain inert (e.g. scripts do not run). Meanwhile, template
elements inside
Document
objects that are created by this algorithm just reuse the same
Document
owner for their contents.
Return doc.
The adopting steps
(with node and oldDocument as parameters) for template
elements
are the following:
Let doc be node's node document's appropriate template contents owner document.
node's node document is the Document
object
that node was just adopted into.
Adopt node's
template contents (a DocumentFragment
object) into doc.
The content
getter steps are to return
template
's template contents, if the template contents is
not a ShadowRoot
node; otherwise null.
The shadowRootMode
IDL attribute
must reflect the shadowrootmode
content attribute, limited to only known values.
The shadowRootDelegatesFocus
IDL attribute
must reflect the shadowrootdelegatesfocus
content
attribute.
The shadowRootClonable
IDL
attribute must reflect the shadowrootclonable
content attribute.
The shadowRootSerializable
IDL attribute must reflect the shadowrootserializable
content attribute.
The cloning steps for a template
element node being cloned to a copy copy must run the
following steps:
If the clone children flag is not set in the calling clone algorithm, return.
Let copied contents be the result of cloning all the children of node's template contents, with document set to copy's template contents's node document, and with the clone children flag set.
Append copied contents to copy's template contents.
In this example, a script populates a table four-column with data from a data structure, using
a template
to provide the element structure instead of manually generating the
structure from markup.
<!DOCTYPE html>
<html lang='en'>
<title>Cat data</title>
<script>
// Data is hard-coded here, but could come from the server
var data = [
{ name: 'Pillar', color: 'Ticked Tabby', sex: 'Female (neutered)', legs: 3 },
{ name: 'Hedral', color: 'Tuxedo', sex: 'Male (neutered)', legs: 4 },
];
</script>
<table>
<thead>
<tr>
<th>Name <th>Color <th>Sex <th>Legs
<tbody>
<template id="row">
<tr><td><td><td><td>
</template>
</table>
<script>
var template = document.querySelector('#row');
for (var i = 0; i < data.length; i += 1) {
var cat = data[i];
var clone = template.content.cloneNode(true);
var cells = clone.querySelectorAll('td');
cells[0].textContent = cat.name;
cells[1].textContent = cat.color;
cells[2].textContent = cat.sex;
cells[3].textContent = cat.legs;
template.parentNode.appendChild(clone);
}
</script>
This example uses cloneNode()
on the
template
's contents; it could equivalently have used document.importNode()
, which does the same thing. The
only difference between these two APIs is when the node document is updated: with
cloneNode()
it is updated when the nodes are appended
with appendChild()
, with document.importNode()
it is updated when the nodes are
cloned.
template
elements with XSLT and XPathThis specification does not define how XSLT and XPath interact with the template
element. However, in the absence of another specification actually defining this, here are some
guidelines for implementers, which are intended to be consistent with other processing described
in this specification:
An XSLT processor based on an XML parser that acts as described
in this specification needs to act as if template
elements contain as
descendants their template contents for the purposes of the transform.
An XSLT processor that outputs a DOM needs to ensure that nodes that would go into a
template
element are instead placed into the element's template
contents.
XPath evaluation using the XPath DOM API when applied to a Document
parsed
using the HTML parser or the XML parser described in this specification
needs to ignore template contents.
slot
elementname
[Exposed=Window]
interface HTMLSlotElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString name;
sequence<Node> assignedNodes(optional AssignedNodesOptions options = {});
sequence<Element> assignedElements(optional AssignedNodesOptions options = {});
undefined assign((Element or Text)... nodes);
};
dictionary AssignedNodesOptions {
boolean flatten = false;
};
HTMLSlotElement
.The slot
element defines a slot. It is
typically used in a shadow tree. A slot
element represents
its assigned nodes, if any, and its contents otherwise.
The name
content
attribute may contain any string value. It represents a slot's
name.
The name
attribute is used to assign slots to other elements: a slot
element with a
name
attribute creates a named slot to which any element is assigned if that element has a slot
attribute whose
value matches that name
attribute's value, and the
slot
element is a child of the shadow tree whose root's
host has that corresponding slot
attribute value.
slot.name
slot.assignedNodes()
slot.assignedNodes({ flatten: true })
slot
elements encountered therein, recursively,
until there are no slot
elements left.slot.assignedElements()
slot.assignedElements({ flatten: true })
assignedNodes({ flatten: true
})
, limited to elements.slot.assign(...nodes)
Sets slot's manually assigned nodes to the given nodes.
The name
IDL
attribute must reflect the content attribute of the same name.
The slot
element has manually assigned
nodes, which is an ordered set of slottables set by assign()
.
This set is initially empty.
The manually assigned nodes set can be implemented using weak references to the slottables, because this set is not directly accessible from script.
The assignedNodes(options)
method steps
are:
If options["flatten
"] is
false, then return this's assigned nodes.
Return the result of finding flattened slottables with this.
The assignedElements(options)
method
steps are:
If options["flatten
"] is
false, then return this's assigned nodes, filtered to contain only
Element
nodes.
Return the result of finding flattened slottables with this,
filtered to contain only Element
nodes.
The assign(...nodes)
method steps are:
For each node of this's manually assigned nodes, set node's manual slot assignment to null.
Let nodesSet be a new ordered set.
For each node of nodes:
If node's manual slot assignment refers to a slot, then remove node from that slot's manually assigned nodes.
Set node's manual slot assignment to this.
Append node to nodesSet.
Set this's manually assigned nodes to nodesSet.
Run assign slottables for a tree for this's root.
canvas
elementa
elements, img
elements with
usemap
attributes, button
elements,
input
elements whose type
attribute are in
the Checkbox or Radio Button states, input
elements that are
buttons, and select
elements with a multiple
attribute or a display size greater than 1.width
height
typedef (CanvasRenderingContext2D or ImageBitmapRenderingContext or WebGLRenderingContext or WebGL2RenderingContext or GPUCanvasContext) RenderingContext;
[Exposed=Window]
interface HTMLCanvasElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute unsigned long width;
[CEReactions] attribute unsigned long height;
RenderingContext? getContext(DOMString contextId, optional any options = null);
USVString toDataURL(optional DOMString type = "image/png", optional any quality);
undefined toBlob(BlobCallback _callback, optional DOMString type = "image/png", optional any quality);
OffscreenCanvas transferControlToOffscreen();
};
callback BlobCallback = undefined (Blob? blob);
HTMLCanvasElement
.The canvas
element provides scripts with a resolution-dependent bitmap canvas,
which can be used for rendering graphs, game graphics, art, or other visual images on the fly.
Authors should not use the canvas
element in a document when a more suitable
element is available. For example, it is inappropriate to use a canvas
element to
render a page heading: if the desired presentation of the heading is graphically intense, it
should be marked up using appropriate elements (typically h1
) and then styled using
CSS and supporting technologies such as shadow trees.
When authors use the canvas
element, they must also provide content that, when
presented to the user, conveys essentially the same function or purpose as the
canvas
's bitmap. This content may be placed as content of the canvas
element. The contents of the canvas
element, if any, are the element's fallback
content.
In interactive visual media, if scripting is enabled for
the canvas
element, and if support for canvas
elements has been enabled,
then the canvas
element represents embedded content
consisting of a dynamically created image, the element's bitmap.
In non-interactive, static, visual media, if the canvas
element has been
previously associated with a rendering context (e.g. if the page was viewed in an interactive
visual medium and is now being printed, or if some script that ran during the page layout process
painted on the element), then the canvas
element represents
embedded content with the element's current bitmap and size. Otherwise, the element
represents its fallback content instead.
In non-visual media, and in visual media if scripting is
disabled for the canvas
element or if support for canvas
elements
has been disabled, the canvas
element represents its fallback
content instead.
When a canvas
element represents embedded content, the
user can still focus descendants of the canvas
element (in the fallback
content). When an element is focused, it is the target of keyboard interaction
events (even though the element itself is not visible). This allows authors to make an interactive
canvas keyboard-accessible: authors should have a one-to-one mapping of interactive regions to focusable areas in the fallback content. (Focus has no
effect on mouse interaction events.) UIEVENTS
An element whose nearest canvas
element ancestor is being rendered
and represents embedded content is an element that is being used as
relevant canvas fallback content.
The canvas
element has two attributes to control the size of the element's bitmap:
width
and height
. These attributes,
when specified, must have values that are valid
non-negative integers. The rules for parsing non-negative
integers must be used to obtain their numeric
values. If an attribute is missing, or if parsing its value returns an error, then the
default value must be used instead. The width
attribute defaults to 300, and the height
attribute
defaults to 150.
When setting the value of the width
or height
attribute, if the context mode of the canvas
element is set to placeholder, the
user agent must throw an "InvalidStateError
" DOMException
and leave the attribute's value unchanged.
The natural dimensions of the canvas
element when it
represents embedded content are equal to the dimensions of the
element's bitmap.
The user agent must use a square pixel density consisting of one pixel of image data per
coordinate space unit for the bitmaps of a canvas
and its rendering contexts.
A canvas
element can be sized arbitrarily by a style sheet, its
bitmap is then subject to the 'object-fit' CSS property.
The bitmaps of canvas
elements, the bitmaps of ImageBitmap
objects,
as well as some of the bitmaps of rendering contexts, such as those described in the sections on
the CanvasRenderingContext2D
and ImageBitmapRenderingContext
objects
below, have an origin-clean flag, which can be
set to true or false. Initially, when the canvas
element or ImageBitmap
object is created, its bitmap's origin-clean
flag must be set to true.
A canvas
element can have a rendering context bound to it. Initially, it does not
have a bound rendering context. To keep track of whether it has a rendering context or not, and
what kind of rendering context it is, a canvas
also has a canvas context mode, which is initially none but can be changed to either placeholder, 2d, bitmaprenderer, webgl, webgl2, or webgpu by algorithms defined in this specification.
When its canvas context mode is none, a canvas
element has no rendering context,
and its bitmap must be transparent black with a natural width equal
to the numeric value of the element's width
attribute and a natural height equal to
the numeric value of the element's height
attribute, those values being interpreted in CSS pixels, and being updated as the attributes are set, changed, or
removed.
When its canvas context mode is placeholder, a canvas
element has no
rendering context. It serves as a placeholder for an OffscreenCanvas
object, and
the content of the canvas
element is updated by the OffscreenCanvas
object's rendering context.
When a canvas
element represents embedded content, it provides a
paint source whose width is the element's natural width, whose height
is the element's natural height, and whose appearance is the element's bitmap.
Whenever the width
and height
content attributes are set, removed, changed, or
redundantly set to the value they already have, then the user agent must perform the action
from the row of the following table that corresponds to the canvas
element's context mode.
Context Mode |
Action |
---|---|
2d |
Follow the steps to set bitmap
dimensions to the numeric values
of the |
webgl or webgl2 |
Follow the behavior defined in the WebGL specifications. WEBGL |
webgpu |
Follow the behavior defined in WebGPU. WEBGPU |
bitmaprenderer |
If the context's bitmap
mode is set to blank,
run the steps to set an |
placeholder |
Do nothing. |
none |
Do nothing. |
The width
and height
IDL attributes must reflect the respective content attributes of the same name, with
the same defaults.
context = canvas.getContext(contextId [, options ])
Returns an object that exposes an API for drawing on the canvas. contextId
specifies the desired API: "2d
", "bitmaprenderer
", "webgl
", "webgl2
", or "webgpu
". options is handled by that API.
This specification defines the "2d
" and "bitmaprenderer
" contexts below. The WebGL
specifications define the "webgl
" and "webgl2
" contexts. WebGPU defines the "webgpu
" context. WEBGL WEBGPU
Returns null if contextId is not supported, or if the canvas has already been
initialized with another context type (e.g., trying to get a "2d
" context after getting a "webgl
" context).
The getContext(contextId, options)
method of the canvas
element, when invoked, must run these steps:
If options is not an object, then set options to null.
Set options to the result of converting options to a JavaScript value.
Run the steps in the cell of the following table whose column header matches this
canvas
element's canvas context
mode and whose row header matches contextId:
none | 2d | bitmaprenderer | webgl or webgl2 | webgpu | placeholder | |
---|---|---|---|---|---|---|
"2d "
|
| Return the same object as was returned the last time the method was invoked with this same first argument. | Return null. | Return null. | Return null. |
Throw an "InvalidStateError " DOMException .
|
"bitmaprenderer "
|
| Return null. | Return the same object as was returned the last time the method was invoked with this same first argument. | Return null. | Return null. |
Throw an "InvalidStateError " DOMException .
|
"webgl " or "webgl2 ", if the user agent supports the WebGL
feature in its current configuration
|
| Return null. | Return null. | Return the same object as was returned the last time the method was invoked with this same first argument. | Return null. |
Throw an "InvalidStateError " DOMException .
|
"webgpu ", if the user
agent supports the WebGPU feature in its current configuration
|
| Return null. | Return null. | Return null. | Return the same object as was returned the last time the method was invoked with this same first argument. |
Throw an "InvalidStateError " DOMException .
|
An unsupported value* | Return null. | Return null. | Return null. | Return null. | Return null. |
Throw an "InvalidStateError " DOMException .
|
* For example, the "webgl
" or "webgl2
" value in the case of a user agent having exhausted
the graphics hardware's abilities and having no software fallback implementation.
url = canvas.toDataURL([ type [, quality ] ])
Returns a data:
URL for the image in the
canvas.
The first argument, if provided, controls the type of the image to be returned (e.g. PNG or
JPEG). The default is "image/png
"; that type is also used if the given type isn't
supported. The second argument applies if the type is an image format that supports variable
quality (such as "image/jpeg
"), and is a number in the range 0.0 to 1.0 inclusive
indicating the desired quality level for the resulting image.
When trying to use types other than "image/png
", authors can check if the image
was really returned in the requested format by checking to see if the returned string starts
with one of the exact strings "data:image/png,
" or "data:image/png;
". If it does, the image is PNG, and thus the requested type was
not supported. (The one exception to this is if the canvas has either no height or no width, in
which case the result might simply be "data:,
".)
canvas.toBlob(callback [, type [, quality ] ])
Creates a Blob
object representing a file containing the image in the canvas,
and invokes a callback with a handle to that object.
The second argument, if provided, controls the type of the image to be returned (e.g. PNG or
JPEG). The default is "image/png
"; that type is also used if the given type isn't
supported. The third argument applies if the type is an image format that supports variable
quality (such as "image/jpeg
"), and is a number in the range 0.0 to 1.0 inclusive
indicating the desired quality level for the resulting image.
canvas.transferControlToOffscreen()
Returns a newly created OffscreenCanvas
object that uses the
canvas
element as a placeholder. Once the canvas
element has become a
placeholder for an OffscreenCanvas
object, its natural size can no longer be
changed, and it cannot have a rendering context. The content of the placeholder canvas is
updated on the OffscreenCanvas
's relevant agent's event loop's update the rendering
steps.
The toDataURL(type, quality)
method,
when invoked, must run these steps:
If this canvas
element's bitmap's origin-clean flag is set to false, then throw a
"SecurityError
" DOMException
.
If this canvas
element's bitmap has no pixels (i.e. either its horizontal
dimension or its vertical dimension is zero) then return the string "data:,
". (This is the shortest data:
URL; it represents the empty string in a text/plain
resource.)
Let file be a
serialization of this canvas
element's bitmap as a file, passing
type and quality if given.
If file is null then return "data:,
".
Return a data:
URL representing
file. RFC2397
The toBlob(callback, type,
quality)
method, when invoked, must run these steps:
If this canvas
element's bitmap's origin-clean flag is set to false, then throw a
"SecurityError
" DOMException
.
Let result be null.
If this canvas
element's bitmap has pixels (i.e., neither its horizontal
dimension nor its vertical dimension is zero), then set result to a copy of this
canvas
element's bitmap.
Run these steps in parallel:
If result is non-null, then set result to a serialization of result as a file with type and quality if given.
Queue an element task on the
canvas blob serialization task
source given the canvas
element to run these steps:
If result is non-null, then set result to a new
Blob
object, created in the relevant
realm of this canvas
element, representing result.
FILEAPI
Invoke callback with
« result » and "report
".
The transferControlToOffscreen()
method,
when invoked, must run these steps:
If this canvas
element's context
mode is not set to none, throw an
"InvalidStateError
" DOMException
.
Let offscreenCanvas be a new OffscreenCanvas
object with its
width and height equal to the values of the width
and height
content attributes of this
canvas
element.
Set the placeholder canvas
element of offscreenCanvas to a weak reference to this canvas
element.
Set this canvas
element's context
mode to placeholder.
Return offscreenCanvas.
typedef (HTMLImageElement or
SVGImageElement) HTMLOrSVGImageElement;
typedef (HTMLOrSVGImageElement or
HTMLVideoElement or
HTMLCanvasElement or
ImageBitmap or
OffscreenCanvas or
VideoFrame) CanvasImageSource;
enum PredefinedColorSpace { "srgb", "display-p3" };
enum CanvasFillRule { "nonzero", "evenodd" };
dictionary CanvasRenderingContext2DSettings {
boolean alpha = true;
boolean desynchronized = false;
PredefinedColorSpace colorSpace = "srgb";
boolean willReadFrequently = false;
};
enum ImageSmoothingQuality { "low", "medium", "high" };
[Exposed=Window]
interface CanvasRenderingContext2D {
// back-reference to the canvas
readonly attribute HTMLCanvasElement canvas;
CanvasRenderingContext2DSettings getContextAttributes();
};
CanvasRenderingContext2D includes CanvasState;
CanvasRenderingContext2D includes CanvasTransform;
CanvasRenderingContext2D includes CanvasCompositing;
CanvasRenderingContext2D includes CanvasImageSmoothing;
CanvasRenderingContext2D includes CanvasFillStrokeStyles;
CanvasRenderingContext2D includes CanvasShadowStyles;
CanvasRenderingContext2D includes CanvasFilters;
CanvasRenderingContext2D includes CanvasRect;
CanvasRenderingContext2D includes CanvasDrawPath;
CanvasRenderingContext2D includes CanvasUserInterface;
CanvasRenderingContext2D includes CanvasText;
CanvasRenderingContext2D includes CanvasDrawImage;
CanvasRenderingContext2D includes CanvasImageData;
CanvasRenderingContext2D includes CanvasPathDrawingStyles;
CanvasRenderingContext2D includes CanvasTextDrawingStyles;
CanvasRenderingContext2D includes CanvasPath;
interface mixin CanvasState {
// state
undefined save(); // push state on state stack
undefined restore(); // pop state stack and restore state
undefined reset(); // reset the rendering context to its default state
boolean isContextLost(); // return whether context is lost
};
interface mixin CanvasTransform {
// transformations (default transform is the identity matrix)
undefined scale(unrestricted double x, unrestricted double y);
undefined rotate(unrestricted double angle);
undefined translate(unrestricted double x, unrestricted double y);
undefined transform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
[NewObject] DOMMatrix getTransform();
undefined setTransform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
undefined setTransform(optional DOMMatrix2DInit transform = {});
undefined resetTransform();
};
interface mixin CanvasCompositing {
// compositing
attribute unrestricted double globalAlpha; // (default 1.0)
attribute DOMString globalCompositeOperation; // (default "source-over")
};
interface mixin CanvasImageSmoothing {
// image smoothing
attribute boolean imageSmoothingEnabled; // (default true)
attribute ImageSmoothingQuality imageSmoothingQuality; // (default low)
};
interface mixin CanvasFillStrokeStyles {
// colors and styles (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces)
attribute (DOMString or CanvasGradient or CanvasPattern) strokeStyle; // (default black)
attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black)
CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1);
CanvasGradient createConicGradient(double startAngle, double x, double y);
CanvasPattern? createPattern(CanvasImageSource image, [LegacyNullToEmptyString] DOMString repetition);
};
interface mixin CanvasShadowStyles {
// shadows
attribute unrestricted double shadowOffsetX; // (default 0)
attribute unrestricted double shadowOffsetY; // (default 0)
attribute unrestricted double shadowBlur; // (default 0)
attribute DOMString shadowColor; // (default transparent black)
};
interface mixin CanvasFilters {
// filters
attribute DOMString filter; // (default "none")
};
interface mixin CanvasRect {
// rects
undefined clearRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
undefined fillRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
undefined strokeRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
};
interface mixin CanvasDrawPath {
// path API (see also CanvasPath)
undefined beginPath();
undefined fill(optional CanvasFillRule fillRule = "nonzero");
undefined fill(Path2D path, optional CanvasFillRule fillRule = "nonzero");
undefined stroke();
undefined stroke(Path2D path);
undefined clip(optional CanvasFillRule fillRule = "nonzero");
undefined clip(Path2D path, optional CanvasFillRule fillRule = "nonzero");
boolean isPointInPath(unrestricted double x, unrestricted double y, optional CanvasFillRule fillRule = "nonzero");
boolean isPointInPath(Path2D path, unrestricted double x, unrestricted double y, optional CanvasFillRule fillRule = "nonzero");
boolean isPointInStroke(unrestricted double x, unrestricted double y);
boolean isPointInStroke(Path2D path, unrestricted double x, unrestricted double y);
};
interface mixin CanvasUserInterface {
undefined drawFocusIfNeeded(Element element);
undefined drawFocusIfNeeded(Path2D path, Element element);
};
interface mixin CanvasText {
// text (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces)
undefined fillText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
undefined strokeText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
TextMetrics measureText(DOMString text);
};
interface mixin CanvasDrawImage {
// drawing images
undefined drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy);
undefined drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
undefined drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
};
interface mixin CanvasImageData {
// pixel manipulation
ImageData createImageData([EnforceRange] long sw, [EnforceRange] long sh, optional ImageDataSettings settings = {});
ImageData createImageData(ImageData imagedata);
ImageData getImageData([EnforceRange] long sx, [EnforceRange] long sy, [EnforceRange] long sw, [EnforceRange] long sh, optional ImageDataSettings settings = {});
undefined putImageData(ImageData imagedata, [EnforceRange] long dx, [EnforceRange] long dy);
undefined putImageData(ImageData imagedata, [EnforceRange] long dx, [EnforceRange] long dy, [EnforceRange] long dirtyX, [EnforceRange] long dirtyY, [EnforceRange] long dirtyWidth, [EnforceRange] long dirtyHeight);
};
enum CanvasLineCap { "butt", "round", "square" };
enum CanvasLineJoin { "round", "bevel", "miter" };
enum CanvasTextAlign { "start", "end", "left", "right", "center" };
enum CanvasTextBaseline { "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" };
enum CanvasDirection { "ltr", "rtl", "inherit" };
enum CanvasFontKerning { "auto", "normal", "none" };
enum CanvasFontStretch { "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "normal", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded" };
enum CanvasFontVariantCaps { "normal", "small-caps", "all-small-caps", "petite-caps", "all-petite-caps", "unicase", "titling-caps" };
enum CanvasTextRendering { "auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision" };
interface mixin CanvasPathDrawingStyles {
// line caps/joins
attribute unrestricted double lineWidth; // (default 1)
attribute CanvasLineCap lineCap; // (default "butt")
attribute CanvasLineJoin lineJoin; // (default "miter")
attribute unrestricted double miterLimit; // (default 10)
// dashed lines
undefined setLineDash(sequence<unrestricted double> segments); // default empty
sequence<unrestricted double> getLineDash();
attribute unrestricted double lineDashOffset;
};
interface mixin CanvasTextDrawingStyles {
// text
attribute DOMString font; // (default 10px sans-serif)
attribute CanvasTextAlign textAlign; // (default: "start")
attribute CanvasTextBaseline textBaseline; // (default: "alphabetic")
attribute CanvasDirection direction; // (default: "inherit")
attribute DOMString letterSpacing; // (default: "0px")
attribute CanvasFontKerning fontKerning; // (default: "auto")
attribute CanvasFontStretch fontStretch; // (default: "normal")
attribute CanvasFontVariantCaps fontVariantCaps; // (default: "normal")
attribute CanvasTextRendering textRendering; // (default: "auto")
attribute DOMString wordSpacing; // (default: "0px")
};
interface mixin CanvasPath {
// shared path API methods
undefined closePath();
undefined moveTo(unrestricted double x, unrestricted double y);
undefined lineTo(unrestricted double x, unrestricted double y);
undefined quadraticCurveTo(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y);
undefined bezierCurveTo(unrestricted double cp1x, unrestricted double cp1y, unrestricted double cp2x, unrestricted double cp2y, unrestricted double x, unrestricted double y);
undefined arcTo(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radius);
undefined rect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
undefined roundRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h, optional (unrestricted double or DOMPointInit or sequence<(unrestricted double or DOMPointInit)>) radii = 0);
undefined arc(unrestricted double x, unrestricted double y, unrestricted double radius, unrestricted double startAngle, unrestricted double endAngle, optional boolean counterclockwise = false);
undefined ellipse(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean counterclockwise = false);
};
[Exposed=(Window,Worker)]
interface CanvasGradient {
// opaque object
undefined addColorStop(double offset, DOMString color);
};
[Exposed=(Window,Worker)]
interface CanvasPattern {
// opaque object
undefined setTransform(optional DOMMatrix2DInit transform = {});
};
[Exposed=(Window,Worker)]
interface TextMetrics {
// x-direction
readonly attribute double width; // advance width
readonly attribute double actualBoundingBoxLeft;
readonly attribute double actualBoundingBoxRight;
// y-direction
readonly attribute double fontBoundingBoxAscent;
readonly attribute double fontBoundingBoxDescent;
readonly attribute double actualBoundingBoxAscent;
readonly attribute double actualBoundingBoxDescent;
readonly attribute double emHeightAscent;
readonly attribute double emHeightDescent;
readonly attribute double hangingBaseline;
readonly attribute double alphabeticBaseline;
readonly attribute double ideographicBaseline;
};
dictionary ImageDataSettings {
PredefinedColorSpace colorSpace;
};
[Exposed=(Window,Worker),
Serializable]
interface ImageData {
constructor(unsigned long sw, unsigned long sh, optional ImageDataSettings settings = {});
constructor(Uint8ClampedArray data, unsigned long sw, optional unsigned long sh, optional ImageDataSettings settings = {});
readonly attribute unsigned long width;
readonly attribute unsigned long height;
readonly attribute Uint8ClampedArray data;
readonly attribute PredefinedColorSpace colorSpace;
};
[Exposed=(Window,Worker)]
interface Path2D {
constructor(optional (Path2D or DOMString) path);
undefined addPath(Path2D path, optional DOMMatrix2DInit transform = {});
};
Path2D includes CanvasPath;
To maintain compatibility with existing web content, user agents need to
enumerate methods defined in CanvasUserInterface
immediately after the stroke()
method on CanvasRenderingContext2D
objects.
context = canvas.getContext('2d' [, { [ alpha: true ] [, desynchronized: false ] [, colorSpace: 'srgb'] [, willReadFrequently: false ]} ])
Returns a CanvasRenderingContext2D
object that is permanently bound to a
particular canvas
element.
If the alpha
member is
false, then the context is forced to always be opaque.
If the desynchronized
member is
true, then the context might be desynchronized.
The colorSpace
member
specifies the color space of the rendering
context.
If the willReadFrequently
member is true, then the context is marked for readback optimization.
context.canvas
Returns the canvas
element.
attributes = context.getContextAttributes()
Returns an object whose:
alpha
member is true if the context has an alpha
channel, or false if it was forced to be opaque.desynchronized
member is true if the context can be desynchronized.colorSpace
member is
a string indicating the context's color
space.willReadFrequently
member is true if the context is marked for readback
optimization.A CanvasRenderingContext2D
object has an output bitmap that
is initialized when the object is created.
The output bitmap has an origin-clean flag, which can be set to true or false. Initially, when one of these bitmaps is created, its origin-clean flag must be set to true.
The CanvasRenderingContext2D
object also has an alpha boolean. When a
CanvasRenderingContext2D
object's alpha is false, then its alpha channel must be fixed to 1.0
(fully opaque) for all pixels, and attempts to change the alpha component of any pixel must be
silently ignored.
Thus, the bitmap of such a context starts off as opaque black instead
of transparent black; clearRect()
always results in opaque black pixels, every fourth byte from getImageData()
is always 255, the putImageData()
method effectively ignores every
fourth byte in its input, and so on. However, the alpha component of styles and images drawn
onto the canvas are still honoured up to the point where they would impact the output
bitmap's alpha channel; for instance, drawing a 50% transparent white square on a freshly
created output bitmap with its alpha set
to false will result in a fully-opaque gray square.
The CanvasRenderingContext2D
object also has a desynchronized boolean. When a
CanvasRenderingContext2D
object's desynchronized is true, then the user agent may
optimize the rendering of the canvas to reduce the latency, as measured from input events to
rasterization, by desynchronizing the canvas paint cycle from the event loop, bypassing the
ordinary user agent rendering algorithm, or both. Insofar as this mode involves bypassing the
usual paint mechanisms, rasterization, or both, it might introduce visible tearing artifacts.
The user agent usually renders on a buffer which is not being displayed, quickly swapping it and the one being scanned out for presentation; the former buffer is called back buffer and the latter front buffer. A popular technique for reducing latency is called front buffer rendering, also known as single buffer rendering, where rendering happens in parallel and racily with the scanning out process. This technique reduces the latency at the price of potentially introducing tearing artifacts and can be used to implement in total or part of the desynchronized boolean. MULTIPLEBUFFERING
The desynchronized boolean can be useful when implementing certain kinds of applications, such as drawing applications, where the latency between input and rasterization is critical.
The CanvasRenderingContext2D
object also has a will read frequently boolean. When a
CanvasRenderingContext2D
object's will read frequently is true, the user agent
may optimize the canvas for readback operations.
On most devices the user agent needs to decide whether to store the canvas's
output bitmap on the GPU (this is also called "hardware accelerated"), or on the CPU
(also called "software"). Most rendering operations are more performant for accelerated canvases,
with the major exception being readback with getImageData()
, toDataURL()
, or toBlob()
. CanvasRenderingContext2D
objects with
will read frequently equal to true tell
the user agent that the webpage is likely to perform many readback operations and that it is
advantageous to use a software canvas.
The CanvasRenderingContext2D
object also has a color space setting of type
PredefinedColorSpace
. The CanvasRenderingContext2D
object's color space indicates the color space for the
output bitmap.
The getContextAttributes()
method
steps are to return «[ "alpha
" →
this's alpha, "desynchronized
" →
this's desynchronized, "colorSpace
" → this's
color space, "willReadFrequently
" →
this's will read frequently
]».
The CanvasRenderingContext2D
2D rendering context represents a flat linear
Cartesian surface whose origin (0,0) is at the top left corner, with the coordinate space having
x values increasing when going right, and y values increasing when going
down. The x-coordinate of the right-most edge is equal to the width of the rendering
context's output bitmap in CSS pixels; similarly, the
y-coordinate of the bottom-most edge is equal to the height of the rendering context's
output bitmap in CSS pixels.
The size of the coordinate space does not necessarily represent the size of the actual bitmaps that the user agent will use internally or during rendering. On high-definition displays, for instance, the user agent may internally use bitmaps with four device pixels per unit in the coordinate space, so that the rendering remains at high quality throughout. Anti-aliasing can similarly be implemented using oversampling with bitmaps of a higher resolution than the final image on the display.
Using CSS pixels to describe the size of a rendering context's output bitmap does not mean that when rendered the canvas will cover an equivalent area in CSS pixels. CSS pixels are reused for ease of integration with CSS features, such as text layout.
In other words, the canvas
element below's rendering context has a 200x200
output bitmap (which internally uses CSS pixels as a
unit for ease of integration with CSS) and is rendered as 100x100 CSS
pixels:
<canvas width=200 height=200 style=width:100px;height:100px>
The 2D context creation algorithm, which is passed a target (a
canvas
element) and options, consists of running these steps:
Let settings be the result of converting options to the dictionary type
CanvasRenderingContext2DSettings
. (This can throw an exception.).
Let context be a new CanvasRenderingContext2D
object.
Initialize context's canvas
attribute to point to target.
Set context's output bitmap to the same bitmap as target's bitmap (so that they are shared).
Set bitmap dimensions to
the numeric values of target's width
and height
content attributes.
Set context's alpha to
settings["alpha
"].
Set context's desynchronized to settings["desynchronized
"].
Set context's color space to
settings["colorSpace
"].
Set context's will read frequently to
settings["willReadFrequently
"].
Return context.
When the user agent is to set bitmap dimensions to width and height, it must run these steps:
Reset the rendering context to its default state.
Resize the output bitmap to the new width and height.
Let canvas be the canvas
element to which the rendering
context's canvas
attribute was initialized.
If the numeric value of
canvas's width
content
attribute differs from width, then set canvas's width
content attribute to the shortest possible string
representing width as a valid non-negative integer.
If the numeric value of
canvas's height
content
attribute differs from height, then set canvas's height
content attribute to the shortest possible string
representing height as a valid non-negative integer.
Only one square appears to be drawn in the following example:
// canvas is a reference to a <canvas> element
var context = canvas.getContext('2d');
context.fillRect(0,0,50,50);
canvas.setAttribute('width', '300'); // clears the canvas
context.fillRect(0,100,50,50);
canvas.width = canvas.width; // clears the canvas
context.fillRect(100,0,50,50); // only this square remains
The canvas
attribute must return the value it was
initialized to when the object was created.
The PredefinedColorSpace
enumeration is used to specify the color space of the canvas's backing store.
The "srgb
" value indicates the 'srgb'
color space.
The "display-p3
" value indicates the
'display-p3' color space.
The algorithm for converting between color spaces can be found in the Converting Colors section of CSS Color. CSSCOLOR
The CanvasFillRule
enumeration is used to select the fill rule
algorithm by which to determine if a point is inside or outside a path.
The value "nonzero
" value indicates the nonzero winding
rule, wherein
a point is considered to be outside a shape if the number of times a half-infinite straight
line drawn from that point crosses the shape's path going in one direction is equal to the
number of times it crosses the path going in the other direction.
The "evenodd
" value indicates the even-odd rule,
wherein
a point is considered to be outside a shape if the number of times a half-infinite straight
line drawn from that point crosses the shape's path is even.
If a point is not outside a shape, it is inside the shape.
The ImageSmoothingQuality
enumeration is used to express a preference for the
interpolation quality to use when smoothing images.
The "low
" value indicates a preference
for a low level of image interpolation quality. Low-quality image interpolation may be more
computationally efficient than higher settings.
The "medium
" value indicates a
preference for a medium level of image interpolation quality.
The "high
" value indicates a preference
for a high level of image interpolation quality. High-quality image interpolation may be more
computationally expensive than lower settings.
Bilinear scaling is an example of a relatively fast, lower-quality image-smoothing algorithm. Bicubic or Lanczos scaling are examples of image-smoothing algorithms that produce higher-quality output. This specification does not mandate that specific interpolation algorithms be used.
The output bitmap, when it is not directly displayed by the user agent,
implementations can, instead of updating this bitmap, merely remember the sequence of drawing
operations that have been applied to it until such time as the bitmap's actual data is needed
(for example because of a call to drawImage()
, or
the createImageBitmap()
factory method). In many
cases, this will be more memory efficient.
The bitmap of a canvas
element is the one bitmap that's pretty much always going
to be needed in practice. The output bitmap of a rendering context, when it has one,
is always just an alias to a canvas
element's bitmap.
Additional bitmaps are sometimes needed, e.g. to enable fast drawing when the canvas is being painted at a different size than its natural size, or to enable double buffering so that graphics updates, like page scrolling for example, can be processed concurrently while canvas draw commands are being executed.
Objects that implement the CanvasState
interface maintain a stack of drawing
states. Drawing states consist of:
The current transformation matrix.
The current clipping region.
The current letter spacing, word spacing, fill style, stroke style, filter, global alpha, compositing and blending operator, and shadow color.
The current values of the following attributes: lineWidth
, lineCap
, lineJoin
, miterLimit
, lineDashOffset
, shadowOffsetX
, shadowOffsetY
, shadowBlur
, font
, textAlign
, textBaseline
, direction
, fontKerning
, fontStretch
, fontVariantCaps
, textRendering
, imageSmoothingEnabled
, imageSmoothingQuality
.
The current dash list.
The rendering context's bitmaps are not part of the drawing state, as they
depend on whether and how the rendering context is bound to a canvas
element.
Objects that implement the CanvasState
mixin have a context lost boolean, that is initialized to false
when the object is created. The context lost
value is updated in the context lost steps.
context.save()
Pushes the current state onto the stack.
context.restore()
Pops the top state on the stack, restoring the context to that state.
context.reset()
Resets the rendering context, which includes the backing buffer, the drawing state stack, path, and styles.
context.isContextLost()
Returns true if the rendering context was lost. Context loss can occur due to driver crashes, running out of memory, etc. In these cases, the canvas loses its backing storage and takes steps to reset the rendering context to its default state.
The save()
method
steps are to push a copy of the current drawing state onto the drawing state stack.
The restore()
method steps are to pop the top entry in the drawing state stack, and reset the drawing state it
describes. If there is no saved state, then the method must do nothing.
The reset()
method steps are to reset the rendering context to its default state.
To reset the rendering context to its default state:
Clear canvas's bitmap to transparent black.
Empty the list of subpaths in context's current default path.
Clear the context's drawing state stack.
Reset everything that drawing state consists of to their initial values.
The isContextLost()
method steps are to return
this's context lost.
context.lineWidth [ = value ]
styles.lineWidth [ = value ]
Returns the current line width.
Can be set, to change the line width. Values that are not finite values greater than zero are ignored.
context.lineCap [ = value ]
styles.lineCap [ = value ]
Returns the current line cap style.
Can be set, to change the line cap style.
The possible line cap styles are "butt
", "round
", and "square
". Other values are ignored.
context.lineJoin [ = value ]
styles.lineJoin [ = value ]
Returns the current line join style.
Can be set, to change the line join style.
The possible line join styles are "bevel
", "round
", and "miter
". Other values are ignored.
context.miterLimit [ = value ]
styles.miterLimit [ = value ]
Returns the current miter limit ratio.
Can be set, to change the miter limit ratio. Values that are not finite values greater than zero are ignored.
context.setLineDash(segments)
styles.setLineDash(segments)
Sets the current line dash pattern (as used when stroking). The argument is a list of distances for which to alternately have the line on and the line off.
segments = context.getLineDash()
segments = styles.getLineDash()
Returns a copy of the current line dash pattern. The array returned will always have an even number of entries (i.e. the pattern is normalized).
context.lineDashOffset
styles.lineDashOffset
Returns the phase offset (in the same units as the line dash pattern).
Can be set, to change the phase offset. Values that are not finite values are ignored.
Objects that implement the CanvasPathDrawingStyles
interface have attributes and
methods (defined in this section) that control how lines are treated by the object.
The lineWidth
attribute gives the width of lines, in
coordinate space units. On getting, it must return the current value. On setting, zero, negative,
infinite, and NaN values must be ignored, leaving the value unchanged; other values must change
the current value to the new value.
When the object implementing the CanvasPathDrawingStyles
interface is created, the
lineWidth
attribute must initially have the value
1.0.
The lineCap
attribute defines the type of endings that
UAs will place on the end of lines. The three valid values are "butt
",
"round
", and "square
".
On getting, it must return the current value. On setting, the current value must be changed to the new value.
When the object implementing the CanvasPathDrawingStyles
interface is created, the
lineCap
attribute must initially have the value
"butt
".
The lineJoin
attribute defines the type of corners that
UAs will place where two lines meet. The three valid values are "bevel
",
"round
", and "miter
".
On getting, it must return the current value. On setting, the current value must be changed to the new value.
When the object implementing the CanvasPathDrawingStyles
interface is created, the
lineJoin
attribute must initially have the value
"miter
".
When the lineJoin
attribute has the value "miter
", strokes use the miter limit ratio to decide how to render joins. The
miter limit ratio can be explicitly set using the miterLimit
attribute. On getting, it must return the current value. On setting, zero, negative, infinite, and
NaN values must be ignored, leaving the value unchanged; other values must change the current
value to the new value.
When the object implementing the CanvasPathDrawingStyles
interface is created, the
miterLimit
attribute must initially have the value
10.0.
Each CanvasPathDrawingStyles
object has a dash list, which is either
empty or consists of an even number of non-negative numbers. Initially, the dash list
must be empty.
The setLineDash(segments)
method, when invoked, must run
these steps:
If any value in segments is not finite (e.g. an Infinity or a NaN value), or if any value is negative (less than zero), then return (without throwing an exception; user agents could show a message on a developer console, though, as that would be helpful for debugging).
If the number of elements in segments is odd, then let segments be the concatenation of two copies of segments.
Let the object's dash list be segments.
When the getLineDash()
method is invoked, it must return a
sequence whose values are the values of the object's dash list, in the same
order.
It is sometimes useful to change the "phase" of the dash pattern, e.g. to achieve a "marching
ants" effect. The phase can be set using the lineDashOffset
attribute. On getting, it must
return the current value. On setting, infinite and NaN values must be ignored, leaving the value
unchanged; other values must change the current value to the new value.
When the object implementing the CanvasPathDrawingStyles
interface is created, the
lineDashOffset
attribute must initially have
the value 0.0.
When a user agent is to trace a path, given an object style
that implements the CanvasPathDrawingStyles
interface, it must run the following
algorithm. This algorithm returns a new path.
Let path be a copy of the path being traced.
Prune all zero-length line segments from path.
Remove from path any subpaths containing no lines (i.e. subpaths with just one point).
Replace each point in each subpath of path other than the first point and the last point of each subpath by a join that joins the line leading to that point to the line leading out of that point, such that the subpaths all consist of two points (a starting point with a line leading out of it, and an ending point with a line leading into it), one or more lines (connecting the points and the joins), and zero or more joins (each connecting one line to another), connected together such that each subpath is a series of one or more lines with a join between each one and a point on each end.
Add a straight closing line to each closed subpath in path connecting the last point and the first point of that subpath; change the last point to a join (from the previously last line to the newly added closing line), and change the first point to a join (from the newly added closing line to the first line).
If style's dash list is empty, then jump to the step labeled convert.
Let pattern width be the concatenation of all the entries of style's dash list, in coordinate space units.
For each subpath subpath in path, run the following substeps. These substeps mutate the subpaths in path in vivo.
Let subpath width be the length of all the lines of subpath, in coordinate space units.
Let offset be the value of style's lineDashOffset
, in coordinate space
units.
While offset is greater than pattern width, decrement it by pattern width.
While offset is less than zero, increment it by pattern width.
Define L to be a linear coordinate line defined along all lines in subpath, such that the start of the first line in the subpath is defined as coordinate 0, and the end of the last line in the subpath is defined as coordinate subpath width.
Let position be zero minus offset.
Let index be 0.
Let current state be off (the other states being on and zero-on).
Dash on: Let segment length be the value of style's dash list's indexth entry.
Increment position by segment length.
If position is greater than subpath width, then end these substeps for this subpath and start them again for the next subpath; if there are no more subpaths, then jump to the step labeled convert instead.
If segment length is nonzero, then let current state be on.
Increment index by one.
Dash off: Let segment length be the value of style's dash list's indexth entry.
Let start be the offset position on L.
Increment position by segment length.
If position is less than zero, then jump to the step labeled post-cut.
If start is less than zero, then let start be zero.
If position is greater than subpath width, then let end be the offset subpath width on L. Otherwise, let end be the offset position on L.
Jump to the first appropriate step:
Do nothing, just continue to the next step.
Cut the line on which end finds itself short at end and place a point there, cutting in two the subpath that it was in; remove all line segments, joins, points, and subpaths that are between start and end; and finally place a single point at start with no lines connecting to it.
The point has a directionality for the purposes of drawing line caps (see below). The directionality is the direction that the original line had at that point (i.e. when L was defined above).
Cut the line on which start finds itself into two at start and place a point there, cutting in two the subpath that it was in, and similarly cut the line on which end finds itself short at end and place a point there, cutting in two the subpath that it was in, and then remove all line segments, joins, points, and subpaths that are between start and end.
If start and end are the same point, then this results in just the line being cut in two and two points being inserted there, with nothing being removed, unless a join also happens to be at that point, in which case the join must be removed.
Post-cut: If position is greater than subpath width, then jump to the step labeled convert.
If segment length is greater than zero, then let positioned-at-on-dash be false.
Increment index by one. If it is equal to the number of entries in style's dash list, then let index be 0.
Return to the step labeled dash on.
Convert: This is the step that converts the path to a new path that represents its stroke.
Create a new path that describes the edge of the areas
that would be covered if a straight line of length equal to style's
lineWidth
was swept along each subpath in path while being kept at an angle such that the line is orthogonal to the path
being swept, replacing each point with the end cap necessary to satisfy style's lineCap
attribute as
described previously and elaborated below, and replacing each join with the join necessary to
satisfy style's lineJoin
type, as defined below.
Caps: Each point has a flat edge perpendicular to the direction of the line
coming out of it. This is then augmented according to the value of style's lineCap
. The "butt
" value means that no additional line cap is added. The "round
" value means that a semi-circle with the diameter equal to
style's lineWidth
width must
additionally be placed on to the line coming out of each point. The "square
" value means that a rectangle with the length of style's lineWidth
width and the
width of half style's lineWidth
width, placed flat against the edge
perpendicular to the direction of the line coming out of the point, must be added at each
point.
Points with no lines coming out of them must have two caps placed back-to-back as if it was really two points connected to each other by an infinitesimally short straight line in the direction of the point's directionality (as defined above).
Joins: In addition to the point where a join occurs, two additional points are relevant to each join, one for each line: the two corners found half the line width away from the join point, one perpendicular to each line, each on the side furthest from the other line.
A triangle connecting these two opposite corners with a straight line, with the third point
of the triangle being the join point, must be added at all joins. The lineJoin
attribute controls whether anything else is
rendered. The three aforementioned values have the following meanings:
The "bevel
" value means that this is all that is rendered at
joins.
The "round
" value means that an arc connecting the two aforementioned
corners of the join, abutting (and not overlapping) the aforementioned triangle, with the
diameter equal to the line width and the origin at the point of the join, must be added at
joins.
The "miter
" value means that a second triangle must (if it can given
the miter length) be added at the join, with one line being the line between the two
aforementioned corners, abutting the first triangle, and the other two being continuations of
the outside edges of the two joining lines, as long as required to intersect without going over
the miter length.
The miter length is the distance from the point where the join occurs to the intersection of
the line edges on the outside of the join. The miter limit ratio is the maximum allowed ratio of
the miter length to half the line width. If the miter length would cause the miter limit ratio
(as set by style's miterLimit
attribute) to be exceeded, then this second
triangle must not be added.
The subpaths in the newly created path must be oriented such that for any point, the number of times a half-infinite straight line drawn from that point crosses a subpath is even if and only if the number of times a half-infinite straight line drawn from that same point crosses a subpath going in one direction is equal to the number of times it crosses a subpath going in the other direction.
Return the newly created path.
context.font [ = value ]
styles.font [ = value ]
Returns the current font settings.
Can be set, to change the font. The syntax is the same as for the CSS 'font' property; values that cannot be parsed as CSS font values are ignored.
Relative keywords and lengths are computed relative to the font of the canvas
element.
context.textAlign [ = value ]
styles.textAlign [ = value ]
Returns the current text alignment settings.
Can be set, to change the alignment. The possible values are and their meanings are given
below. Other values are ignored. The default is "start
".
context.textBaseline [ = value ]
styles.textBaseline [ = value ]
Returns the current baseline alignment settings.
Can be set, to change the baseline alignment. The possible values and their meanings are
given below. Other values are ignored. The default is "alphabetic
".
context.direction [ = value ]
styles.direction [ = value ]
Returns the current directionality.
Can be set, to change the directionality. The possible values and their meanings are given
below. Other values are ignored. The default is "inherit
".
context.letterSpacing [ = value ]
styles.letterSpacing [ = value ]
Returns the current spacing between characters in the text.
Can be set, to change spacing between characters. Values that cannot be parsed as a CSS
<length> are ignored. The default is "0px
".
context.fontKerning [ = value ]
styles.fontKerning [ = value ]
Returns the current font kerning settings.
Can be set, to change the font kerning. The possible values and their meanings are given
below. Other values are ignored. The default is "auto
".
context.fontStretch [ = value ]
styles.fontStretch [ = value ]
Returns the current font stretch settings.
Can be set, to change the font stretch. The possible values and their meanings are given
below. Other values are ignored. The default is "normal
".
context.fontVariantCaps [ = value ]
styles.fontVariantCaps [ = value ]
Returns the current font variant caps settings.
Can be set, to change the font variant caps. The possible values and their meanings are given
below. Other values are ignored. The default is "normal
".
context.textRendering [ = value ]
styles.textRendering [ = value ]
Returns the current text rendering settings.
Can be set, to change the text rendering. The possible values and their meanings are given
below. Other values are ignored. The default is "auto
".
context.wordSpacing [ = value ]
styles.wordSpacing [ = value ]
Returns the current spacing between words in the text.
Can be set, to change spacing between words. Values that cannot be parsed as a CSS
<length> are ignored. The default is "0px
".
Objects that implement the CanvasTextDrawingStyles
interface have attributes
(defined in this section) that control how text is laid out (rasterized or outlined) by the
object. Such objects can also have a font style source object. For
CanvasRenderingContext2D
objects, this is the canvas
element given by
the value of the context's canvas
attribute. For
OffscreenCanvasRenderingContext2D
objects, this is the associated
OffscreenCanvas
object.
Font resolution for the font style source object requires a font
source. This is determined for a given object implementing
CanvasTextDrawingStyles
by the following steps: CSSFONTLOAD
If object's font style source object is a canvas
element, return the element's node document.
Otherwise, object's font style source object is an
OffscreenCanvas
object:
Let global be object's relevant global object.
If global is a Window
object, then return global's
associated Document
.
Assert: global implements
WorkerGlobalScope
.
Return global.
This is an example of font resolution with a regular canvas
element with ID c1
.
const font = new FontFace("MyCanvasFont", "url(mycanvasfont.ttf)");
documents.fonts.add(font);
const context = document.getElementById("c1").getContext("2d");
document.fonts.ready.then(function() {
context.font = "64px MyCanvasFont";
context.fillText("hello", 0, 0);
});
In this example, the canvas will display text using mycanvasfont.ttf
as
its font.
This is an example of how font resolution can happen using OffscreenCanvas
.
Assuming a canvas
element with ID c2
which is transferred to
a worker like so:
const offscreenCanvas = document.getElementById("c2").transferControlToOffscreen();
worker.postMessage(offscreenCanvas, [offscreenCanvas]);
Then, in the worker:
self.onmessage = function(ev) {
const transferredCanvas = ev.data;
const context = transferredCanvas.getContext("2d");
const font = new FontFace("MyFont", "url(myfont.ttf)");
self.fonts.add(font);
self.fonts.ready.then(function() {
context.font = "64px MyFont";
context.fillText("hello", 0, 0);
});
};
In this example, the canvas will display a text using myfont.ttf
.
Notice that the font is only loaded inside the worker, and not in the document context.
The font
IDL attribute, on setting, must be parsed as a CSS <'font'> value (but
without supporting property-independent style sheet syntax like 'inherit'), and the resulting font
must be assigned to the context, with the 'line-height' component forced to 'normal',
with the 'font-size' component converted to CSS pixels,
and with system fonts being computed to explicit values. If the new value is syntactically
incorrect (including using property-independent style sheet syntax like 'inherit' or 'initial'),
then it must be ignored, without assigning a new font value. CSS
Font family names must be interpreted in the context of the font style source
object when the font is to be used; any fonts embedded using @font-face
or loaded using FontFace
objects that are visible to the
font style source object must therefore be available once they are loaded. (Each font style source
object has a font source, which determines what fonts are available.) If a font
is used before it is fully loaded, or if the font style source object does not have
that font in scope at the time the font is to be used, then it must be treated as if it was an
unknown font, falling back to another as described by the relevant CSS specifications.
CSSFONTS CSSFONTLOAD
On getting, the font
attribute must return the serialized form of the current font of the context (with
no 'line-height' component). CSSOM
For example, after the following statement:
context.font = 'italic 400 12px/2 Unknown Font, sans-serif';
...the expression context.font
would evaluate to the string "italic 12px "Unknown Font", sans-serif
". The "400"
font-weight doesn't appear because that is the default value. The line-height doesn't appear
because it is forced to "normal", the default value.
When the object implementing the CanvasTextDrawingStyles
interface is created, the
font of the context must be set to 10px sans-serif. When the 'font-size' component is
set to lengths using percentages, 'em' or 'ex' units, or the 'larger' or
'smaller' keywords, these must be interpreted relative to the computed value of the
'font-size' property of the font style source object at the time that
the attribute is set, if it is an element. When the 'font-weight' component is set to
the relative values 'bolder' and 'lighter', these must be interpreted relative to the
computed value of the 'font-weight' property of the font style
source object at the time that the attribute is set, if it is an element. If the computed values are undefined for a particular case (e.g. because
the font style source object is not an element or is not being
rendered), then the relative keywords must be interpreted relative to the normal-weight
10px sans-serif default.
The textAlign
IDL attribute, on getting, must return
the current value. On setting, the current value must be changed to the new value. When the object
implementing the CanvasTextDrawingStyles
interface is created, the textAlign
attribute must initially have the value start
.
The textBaseline
IDL attribute, on getting, must
return the current value. On setting, the current value must be changed to the new value. When the
object implementing the CanvasTextDrawingStyles
interface is created, the textBaseline
attribute must initially have the value
alphabetic
.
The direction
IDL attribute, on getting, must return
the current value. On setting, the current value must be changed to the new value. When the object
implementing the CanvasTextDrawingStyles
interface is created, the direction
attribute must initially have the value "inherit
".
Objects that implement the CanvasTextDrawingStyles
interface have attributes that
control the spacing between letters and words. Such objects have associated letter spacing and word spacing values, which are CSS
<length> values. Initially, both must be the result of parsing "0px
" as a CSS
<length>.
The letterSpacing
getter steps
are to return the serialized form of
this's letter
spacing.
The letterSpacing
setter steps are:
Let parsed be the result of parsing the given value as a CSS <length>.
If parsed is failure, then return.
Set this's letter spacing to parsed.
The wordSpacing
getter steps are
to return the serialized form of
this's word
spacing.
The wordSpacing
setter steps are:
Let parsed be the result of parsing the given value as a CSS <length>.
If parsed is failure, then return.
Set this's word spacing to parsed.
The fontKerning
IDL attribute, on
getting, must return the current value. On setting, the current value must be changed to the new
value. When the object implementing the CanvasTextDrawingStyles
interface is created,
the fontKerning
attribute must
initially have the value "auto
".
The fontStretch
IDL attribute, on
getting, must return the current value. On setting, the current value must be changed to the new
value. When the object implementing the CanvasTextDrawingStyles
interface is created,
the fontStretch
attribute must
initially have the value "normal
".
The fontVariantCaps
IDL attribute, on
getting, must return the current value. On setting, the current value must be changed to the new
value. When the object implementing the CanvasTextDrawingStyles
interface is created,
the fontVariantCaps
attribute must
initially have the value "normal
".
The textRendering
IDL attribute, on
getting, must return the current value. On setting, the current value must be changed to the new
value. When the object implementing the CanvasTextDrawingStyles
interface is created,
the textRendering
attribute must
initially have the value "auto
".
The textAlign
attribute's allowed keywords are
as follows:
start
Align to the start edge of the text (left side in left-to-right text, right side in right-to-left text).
end
Align to the end edge of the text (right side in left-to-right text, left side in right-to-left text).
left
Align to the left.
right
Align to the right.
center
Align to the center.
The textBaseline
attribute's allowed keywords correspond to alignment points in the
font:
The keywords map to these alignment points as follows:
top
hanging
middle
alphabetic
ideographic
bottom
The direction
attribute's allowed keywords are
as follows:
ltr
Treat input to the text preparation algorithm as left-to-right text.
rtl
Treat input to the text preparation algorithm as right-to-left text.
inherit
Default to the directionality of the canvas
element or Document
as appropriate.
The fontKerning
attribute's allowed keywords
are as follows:
auto
Kerning is applied at the discretion of the user agent.
normal
Kerning is applied.
none
Kerning is not applied.
The fontStretch
attribute's allowed keywords
are as follows:
ultra-condensed
Same as CSS 'font-stretch' 'ultra-condensed' setting.
extra-condensed
Same as CSS 'font-stretch' 'extra-condensed' setting.
condensed
Same as CSS 'font-stretch' 'condensed' setting.
semi-condensed
Same as CSS 'font-stretch' 'semi-condensed' setting.
normal
The default setting, where width of the glyphs is at 100%.
semi-expanded
Same as CSS 'font-stretch' 'semi-expanded' setting.
expanded
Same as CSS 'font-stretch' 'expanded' setting.
extra-expanded
Same as CSS 'font-stretch' 'extra-expanded' setting.
ultra-expanded
Same as CSS 'font-stretch' 'ultra-expanded' setting.
The fontVariantCaps
attribute's allowed
keywords are as follows:
normal
None of the features listed below are enabled.
small-caps
Same as CSS 'font-variant-caps' 'small-caps' setting.
all-small-caps
Same as CSS 'font-variant-caps' 'all-small-caps' setting.
petite-caps
Same as CSS 'font-variant-caps' 'petite-caps' setting.
all-petite-caps
Same as CSS 'font-variant-caps' 'all-petite-caps' setting.
unicase
Same as CSS 'font-variant-caps' 'unicase' setting.
titling-caps
Same as CSS 'font-variant-caps' 'titling-caps' setting.
The textRendering
attribute's allowed
keywords are as follows:
auto
Same as 'auto' in SVG text-rendering property.
optimizeSpeed
Same as 'optimizeSpeed' in SVG text-rendering property.
optimizeLegibility
Same as 'optimizeLegibility' in SVG text-rendering property.
geometricPrecision
Same as 'geometricPrecision' in SVG text-rendering property.
The text preparation algorithm is as follows. It takes as input a string text,
a CanvasTextDrawingStyles
object target, and an optional length
maxWidth. It returns an array of glyph shapes, each positioned on a common coordinate
space, a physical alignment whose value is one of left, right, and
center, and an inline box. (Most callers of this algorithm ignore the
physical alignment and the inline box.)
If maxWidth was provided but is less than or equal to zero or equal to NaN, then return an empty array.
Replace all ASCII whitespace in text with U+0020 SPACE characters.
Let font be the current font of target, as given
by that object's font
attribute.
Apply the appropriate step from the following list to determine the value of direction:
direction
attribute has the value "ltr
"direction
attribute has the value "rtl
"Document
with a non-null document elementForm a hypothetical infinitely-wide CSS line box containing a single inline box containing the text text, with its CSS properties set as follows:
Property | Source |
---|---|
'direction' | direction |
'font' | font |
'font-kerning' | target's fontKerning |
'font-stretch' | target's fontStretch |
'font-variant-caps' | target's fontVariantCaps |
'letter-spacing' | target's letter spacing |
SVG text-rendering | target's textRendering |
'white-space' | 'pre' |
'word-spacing' | target's word spacing |
and with all other properties set to their initial values.
If maxWidth was provided and the hypothetical width of the inline box in the hypothetical line box is greater than maxWidth CSS pixels, then change font to have a more condensed font (if one is available or if a reasonably readable one can be synthesized by applying a horizontal scale factor to the font) or a smaller font, and return to the previous step.
The anchor point is a point on the inline box, and the physical
alignment is one of the values left, right, and center. These
variables are determined by the textAlign
and
textBaseline
values as follows:
Horizontal position:
textAlign
is left
textAlign
is start
and direction is
'ltr'textAlign
is end
and direction is 'rtl'textAlign
is right
textAlign
is end
and direction is 'ltr'textAlign
is start
and direction is
'rtl'textAlign
is center
Vertical position:
textBaseline
is top
textBaseline
is hanging
textBaseline
is middle
textBaseline
is alphabetic
textBaseline
is ideographic
textBaseline
is bottom
Let result be an array constructed by iterating over each glyph in the inline box from left to right (if any), adding to the array, for each glyph, the shape of the glyph as it is in the inline box, positioned on a coordinate space using CSS pixels with its origin at the anchor point.
Return result, physical alignment, and the inline box.
Objects that implement the CanvasPath
interface have a path. A path has a list of zero or
more subpaths. Each subpath consists of a list of one or more points, connected by straight or
curved line segments, and a flag indicating whether the subpath is closed or not. A
closed subpath is one where the last point of the subpath is connected to the first point of the
subpath by a straight line. Subpaths with only one point are ignored when painting the path.
Paths have a need new subpath flag. When this flag is set, certain APIs create a new subpath rather than extending the previous one. When a path is created, its need new subpath flag must be set.
When an object implementing the CanvasPath
interface is created, its path must be initialized to zero subpaths.
context.moveTo(x, y)
path.moveTo(x, y)
Creates a new subpath with the given point.
context.closePath()
path.closePath()
Marks the current subpath as closed, and starts a new subpath with a point the same as the start and end of the newly closed subpath.
context.lineTo(x, y)
path.lineTo(x, y)
Adds the given point to the current subpath, connected to the previous one by a straight line.
context.quadraticCurveTo(cpx, cpy, x, y)
path.quadraticCurveTo(cpx, cpy, x, y)
Adds the given point to the current subpath, connected to the previous one by a quadratic Bézier curve with the given control point.
context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
path.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
Adds the given point to the current subpath, connected to the previous one by a cubic Bézier curve with the given control points.
context.arcTo(x1, y1, x2, y2, radius)
path.arcTo(x1, y1, x2, y2, radius)
Adds an arc with the given control points and radius to the current subpath, connected to the previous point by a straight line.
Throws an "IndexSizeError
" DOMException
if the given
radius is negative.
context.arc(x, y, radius, startAngle, endAngle [, counterclockwise ])
path.arc(x, y, radius, startAngle, endAngle [, counterclockwise ])
Adds points to the subpath such that the arc described by the circumference of the circle described by the arguments, starting at the given start angle and ending at the given end angle, going in the given direction (defaulting to clockwise), is added to the path, connected to the previous point by a straight line.
Throws an "IndexSizeError
" DOMException
if the given
radius is negative.
context.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle [, counterclockwise])
path.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle [, counterclockwise])
Adds points to the subpath such that the arc described by the circumference of the ellipse described by the arguments, starting at the given start angle and ending at the given end angle, going in the given direction (defaulting to clockwise), is added to the path, connected to the previous point by a straight line.
Throws an "IndexSizeError
" DOMException
if the given
radius is negative.
context.rect(x, y, w, h)
path.rect(x, y, w, h)
Adds a new closed subpath to the path, representing the given rectangle.
context.roundRect(x, y, w, h, radii)
path.roundRect(x, y, w, h, radii)
Adds a new closed subpath to the path representing the given rounded rectangle. radii is either a list of radii or a single radius representing the corners of the rectangle in pixels. If a list is provided, the number and order of these radii function in the same way as the CSS 'border-radius' property. A single radius behaves the same way as a list with a single element.
If w and h are both greater than or equal to 0, or if both are smaller than 0, then the path is drawn clockwise. Otherwise, it is drawn counterclockwise.
When w is negative, the rounded rectangle is flipped horizontally, which means that the radius values that normally apply to the left corners are used on the right and vice versa. Similarly, when h is negative, the rounded rect is flipped vertically.
When a value r in radii is a number, the corresponding corner(s) are drawn as circular arcs of radius r.
When a value r in radii is an object with { x, y
}
properties, the corresponding corner(s) are drawn as elliptical arcs whose x
and y radii are equal to r.x and r.y, respectively.
When the sum of the radii of two corners of the same edge is greater than the length of the edge, all the radii of the rounded rectangle are scaled by a factor of length / (r1 + r2). If multiple edges have this property, the scale factor of the edge with the smallest scale factor is used. This is consistent with CSS behavior.
Throws a RangeError
if radii is a list whose
size is not one, two, three, or four.
Throws a RangeError
if a value in radii is a
negative number, or is an { x, y }
object whose x
or y
properties are negative numbers.
The following methods allow authors to manipulate the paths
of objects implementing the CanvasPath
interface.
For objects implementing the CanvasDrawPath
and CanvasTransform
interfaces, the points passed to the methods, and the resulting lines added to current
default path by these methods, must be transformed according to the current transformation matrix before being added to
the path.
The moveTo(x,
y)
method, when invoked, must run these steps:
If either of the arguments are infinite or NaN, then return.
Create a new subpath with the specified point as its first (and only) point.
When the user agent is to ensure there is a subpath for a coordinate (x,
y) on a path, the user agent must check to see if
the path has its need new subpath flag set. If it
does, then the user agent must create a new subpath with the point (x, y) as
its first (and only) point, as if the moveTo()
method
had been called, and must then unset the path's need new
subpath flag.
The closePath()
method, when invoked, must do nothing
if the object's path has no subpaths. Otherwise, it must mark the last subpath as closed, create a
new subpath whose first point is the same as the previous subpath's first point, and finally add
this new subpath to the path.
If the last subpath had more than one point in its list of points, then this is equivalent to adding a straight line connecting the last point back to the first point of the last subpath, thus "closing" the subpath.
New points and the lines connecting them are added to subpaths using the methods described below. In all cases, the methods only modify the last subpath in the object's path.
The lineTo(x,
y)
method, when invoked, must run these steps:
If either of the arguments are infinite or NaN, then return.
If the object's path has no subpaths, then ensure there is a subpath for (x, y).
Otherwise, connect the last point in the subpath to the given point (x, y) using a straight line, and then add the given point (x, y) to the subpath.
The quadraticCurveTo(cpx, cpy,
x, y)
method, when invoked, must run these steps:
If any of the arguments are infinite or NaN, then return.
Ensure there is a subpath for (cpx, cpy)
Connect the last point in the subpath to the given point (x, y) using a quadratic Bézier curve with control point (cpx, cpy). BEZIER
Add the given point (x, y) to the subpath.
The bezierCurveTo(cp1x, cp1y,
cp2x, cp2y, x, y)
method, when invoked,
must run these steps:
If any of the arguments are infinite or NaN, then return.
Ensure there is a subpath for (cp1x, cp1y).
Connect the last point in the subpath to the given point (x, y) using a cubic Bézier curve with control points (cp1x, cp1y) and (cp2x, cp2y). BEZIER
Add the point (x, y) to the subpath.
The arcTo(x1,
y1, x2, y2, radius)
method, when invoked,
must run these steps:
If any of the arguments are infinite or NaN, then return.
Ensure there is a subpath for (x1, y1).
If radius is negative, then throw an "IndexSizeError
"
DOMException
.
Let the point (x0, y0) be the last point in the subpath, transformed by the inverse of the current transformation matrix (so that it is in the same coordinate system as the points passed to the method).
If the point (x0, y0) is equal to the point (x1, y1), or if the point (x1, y1) is equal to the point (x2, y2), or if radius is zero, then add the point (x1, y1) to the subpath, and connect that point to the previous point (x0, y0) by a straight line.
Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line, then add the point (x1, y1) to the subpath, and connect that point to the previous point (x0, y0) by a straight line.
Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius, and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1), and that has a different point tangent to the half-infinite line that ends at the point (x1, y1) and crosses the point (x2, y2). The points at which this circle touches these two lines are called the start and end tangent points respectively. Connect the point (x0, y0) to the start tangent point by a straight line, adding the start tangent point to the subpath, and then connect the start tangent point to the end tangent point by The Arc, adding the end tangent point to the subpath.
The arc(x,
y, radius, startAngle, endAngle,
counterclockwise)
method, when invoked, must run the ellipse method
steps with this, x, y, radius, radius, 0,
startAngle, endAngle, and counterclockwise.
This makes it equivalent to ellipse()
except that both radii are equal and rotation is 0.
The ellipse(x,
y, radiusX, radiusY, rotation, startAngle,
endAngle, counterclockwise)
method, when invoked, must run the
ellipse method steps with this, x, y, radiusX,
radiusY, rotation, startAngle, endAngle, and
counterclockwise.
The determine the point on an ellipse steps, given ellipse, and angle, are:
Let eccentricCircle be the circle that shares its origin with ellipse, with a radius equal to the semi-major axis of ellipse.
Let outerPoint be the point on eccentricCircle's circumference at angle measured in radians clockwise from ellipse's semi-major axis.
Let chord be the line perpendicular to ellipse's major axis between this axis and outerPoint.
Return the point on chord that crosses ellipse's circumference.
The ellipse method steps, given canvasPath, x, y, radiusX, radiusY, rotation, startAngle, endAngle, and counterclockwise, are:
If any of the arguments are infinite or NaN, then return.
If either radiusX or radiusY are negative, then throw an
"IndexSizeError
" DOMException
.
If canvasPath's path has any subpaths, then add a straight line from the last point in the subpath to the start point of the arc.
Add the start and end points of the arc to the subpath, and connect them with an arc. The arc and its start and end points are defined as follows:
Consider an ellipse that has its origin at (x, y), that has a major-axis radius radiusX and a minor-axis radius radiusY, and that is rotated about its origin such that its semi-major axis is inclined rotation radians clockwise from the x-axis.
If counterclockwise is false and endAngle − startAngle is greater than or equal to 2π, or, if counterclockwise is true and startAngle − endAngle is greater than or equal to 2π, then the arc is the whole circumference of this ellipse, and both the start point and the end point are the result of running the determine the point on an ellipse steps given this ellipse and startAngle.
Otherwise, the start point is the result of running the determine the point on an ellipse steps given this ellipse and startAngle, the end point is the result of running the determine the point on an ellipse steps given this ellipse and endAngle, and the arc is the path along the circumference of this ellipse from the start point to the end point, going counterclockwise if counterclockwise is true, and clockwise otherwise. Since the points are on the ellipse, as opposed to being simply angles from zero, the arc can never cover an angle greater than 2π radians.
Even if the arc covers the entire circumference of the ellipse and there are no
other points in the subpath, the path is not closed unless the closePath()
method is appropriately invoked.
The rect(x,
y, w, h)
method, when invoked, must run these
steps:
If any of the arguments are infinite or NaN, then return.
Create a new subpath containing just the four points (x, y), (x+w, y), (x+w, y+h), (x, y+h), in that order, with those four points connected by straight lines.
Mark the subpath as closed.
Create a new subpath with the point (x, y) as the only point in the subpath.
The roundRect(x, y, w,
h, radii)
method steps are:
If any of x, y, w, or h are infinite or NaN, then return.
If radii is an unrestricted
double
or DOMPointInit
, then set radii to « radii
».
If radii is not a list of size one, two, three, or four, then throw a RangeError
.
Let normalizedRadii be an empty list.
For each radius of radii:
If radius is a DOMPointInit
:
If radius["x
"] or
radius["y
"] is infinite or NaN, then
return.
If radius["x
"] or
radius["y
"] is negative, then throw a RangeError
.
Otherwise, append radius to normalizedRadii.
If radius is a unrestricted
double
:
If radius is infinite or NaN, then return.
If radius is negative, then throw a RangeError
.
Otherwise, append «[ "x
" → radius,
"y
" → radius ]» to
normalizedRadii.
Let upperLeft, upperRight, lowerRight, and lowerLeft be null.
If normalizedRadii's size is 4, then set upperLeft to normalizedRadii[0], set upperRight to normalizedRadii[1], set lowerRight to normalizedRadii[2], and set lowerLeft to normalizedRadii[3].
If normalizedRadii's size is 3, then set upperLeft to normalizedRadii[0], set upperRight and lowerLeft to normalizedRadii[1], and set lowerRight to normalizedRadii[2].
If normalizedRadii's size is 2, then set upperLeft and lowerRight to normalizedRadii[0] and set upperRight and lowerLeft to normalizedRadii[1].
If normalizedRadii's size is 1, then set upperLeft, upperRight, lowerRight, and lowerLeft to normalizedRadii[0].
Corner curves must not overlap. Scale all radii to prevent this:
Let top be upperLeft["x
"] +
upperRight["x
"].
Let right be upperRight["y
"] + lowerRight["y
"].
Let bottom be lowerRight["x
"] + lowerLeft["x
"].
Let left be upperLeft["y
"]
+ lowerLeft["y
"].
Let scale be the minimum value of the ratios w / top, h / right, w / bottom, h / left.
If scale is less than 1, then set the x
and y
members of upperLeft,
upperRight, lowerLeft, and lowerRight to their current values
multiplied by scale.
Create a new subpath:
Move to the point (x + upperLeft["x
"], y).
Draw a straight line to the point (x + w −
upperRight["x
"], y).
Draw an arc to the point (x + w, y +
upperRight["y
"]).
Draw a straight line to the point (x + w, y +
h − lowerRight["y
"]).
Draw an arc to the point (x + w −
lowerRight["x
"], y +
h).
Draw a straight line to the point (x + lowerLeft["x
"], y + h).
Draw an arc to the point (x, y + h −
lowerLeft["y
"]).
Draw a straight line to the point (x, y +
upperLeft["y
"]).
Draw an arc to the point (x + upperLeft["x
"], y).
Mark the subpath as closed.
Create a new subpath with the point (x, y) as the only point in the subpath.
This is designed to behave similarly to the CSS 'border-radius' property.
Path2D
objectsPath2D
objects can be used to declare paths that are then later used on
objects implementing the CanvasDrawPath
interface. In addition to many of the APIs
described in earlier sections, Path2D
objects have methods to combine paths, and to
add text to paths.
path = new Path2D()
Creates a new empty Path2D
object.
path = new Path2D(path)
When path is a Path2D
object, returns a copy.
When path is a string, creates the path described by the argument, interpreted as SVG path data. SVG
path.addPath(path [, transform ])
Adds to the path the path given by the argument.
The Path2D(path)
constructor, when invoked, must run these
steps:
Let output be a new Path2D
object.
If path is not given, then return output.
If path is a Path2D
object, then add all subpaths of
path to output and return output. (In other words, it returns a
copy of the argument.)
Let svgPath be the result of parsing and interpreting path according to SVG 2's rules for path data. SVG
The resulting path could be empty. SVG defines error handling rules for parsing and applying path data.
Let (x, y) be the last point in svgPath.
Add all the subpaths, if any, from svgPath to output.
Create a new subpath in output with (x, y) as the only point in the subpath.
Return output.
The addPath(path,
transform)
method, when invoked on a Path2D
object
a, must run these steps:
If the Path2D
object path has no subpaths, then return.
Let matrix be the result of creating a DOMMatrix
from the 2D dictionary
transform.
If one or more of matrix's m11 element, m12 element, m21 element, m22 element, m41 element, or m42 element are infinite or NaN, then return.
Create a copy of all the subpaths in path. Let this copy be known as c.
Transform all the coordinates and lines in c by the transform matrix matrix.
Let (x, y) be the last point in the last subpath of c.
Add all the subpaths in c to a.
Create a new subpath in a with (x, y) as the only point in the subpath.
Objects that implement the CanvasTransform
interface have a current
transformation matrix, as well as methods (described in this section) to manipulate it. When
an object implementing the CanvasTransform
interface is created, its transformation
matrix must be initialized to the identity matrix.
The current transformation matrix is applied to coordinates when creating the
current default path, and when painting text, shapes, and Path2D
objects, on objects implementing the CanvasTransform
interface.
The transformations must be performed in reverse order.
For instance, if a scale transformation that doubles the width is applied to the canvas, followed by a rotation transformation that rotates drawing operations by a quarter turn, and a rectangle twice as wide as it is tall is then drawn on the canvas, the actual result will be a square.
context.scale(x, y)
Changes the current transformation matrix to apply a scaling transformation with the given characteristics.
context.rotate(angle)
Changes the current transformation matrix to apply a rotation transformation with the given characteristics. The angle is in radians.
context.translate(x, y)
Changes the current transformation matrix to apply a translation transformation with the given characteristics.
context.transform(a, b, c, d, e, f)
Changes the current transformation matrix to apply the matrix given by the arguments as described below.
matrix = context.getTransform()
Returns a copy of the current transformation matrix, as a newly created
DOMMatrix
object.
context.setTransform(a, b, c, d, e, f)
Changes the current transformation matrix to the matrix given by the arguments as described below.
context.setTransform(transform)
Changes the current transformation matrix to the matrix represented by
the passed DOMMatrix2DInit
dictionary.
context.resetTransform()
Changes the current transformation matrix to the identity matrix.
The scale(x,
y)
method, when invoked, must run these steps:
If either of the arguments are infinite or NaN, then return.
Add the scaling transformation described by the arguments to the current transformation matrix. The x argument represents the scale factor in the horizontal direction and the y argument represents the scale factor in the vertical direction. The factors are multiples.
The rotate(angle)
method, when invoked, must
run these steps:
If angle is infinite or NaN, then return.
Add the rotation transformation described by the argument to the current transformation matrix. The angle argument represents a clockwise rotation angle expressed in radians.
The translate(x, y)
method, when
invoked, must run these steps:
If either of the arguments are infinite or NaN, then return.
Add the translation transformation described by the arguments to the current transformation matrix. The x argument represents the translation distance in the horizontal direction and the y argument represents the translation distance in the vertical direction. The arguments are in coordinate space units.
The transform(a, b, c,
d, e, f)
method, when invoked, must run these
steps:
If any of the arguments are infinite or NaN, then return.
Replace the current transformation matrix with the result of multiplying the current transformation matrix with the matrix described by:
a | c | e |
b | d | f |
0 | 0 | 1 |
The arguments a, b, c, d, e, and f are sometimes called m11, m12, m21, m22, dx, and dy or m11, m21, m12, m22, dx, and dy. Care ought to be taken in particular with the order of the second and third arguments (b and c) as their order varies from API to API and APIs sometimes use the notation m12/m21 and sometimes m21/m12 for those positions.
The getTransform()
method, when invoked, must return
a newly created DOMMatrix
representing a copy of the current transformation
matrix matrix of the context.
This returned object is not live, so updating it will not affect the
current transformation matrix, and updating the current transformation
matrix will not affect an already returned DOMMatrix
.
The setTransform(a, b, c,
d, e, f)
method, when invoked, must run these
steps:
If any of the arguments are infinite or NaN, then return.
Reset the current transformation matrix to the matrix described by:
a | c | e |
b | d | f |
0 | 0 | 1 |
The setTransform(transform)
method, when invoked, must run these steps:
Let matrix be the result of creating a DOMMatrix
from the 2D dictionary
transform.
If one or more of matrix's m11 element, m12 element, m21 element, m22 element, m41 element, or m42 element are infinite or NaN, then return.
Reset the current transformation matrix to matrix.
The resetTransform()
method, when invoked, must
reset the current transformation matrix to the identity matrix.
Given a matrix of the form created by the transform()
and setTransform()
methods, i.e.,
a | c | e |
b | d | f |
0 | 0 | 1 |
the resulting transformed coordinates after transform matrix multiplication will be
xnew = a x + c y + e
ynew = b x + d y + f
Some methods on the CanvasDrawImage
and CanvasFillStrokeStyles
interfaces take the union type CanvasImageSource
as an argument.
This union type allows objects implementing any of the following interfaces to be used as image sources:
HTMLOrSVGImageElement
(img
or SVG image
elements)HTMLVideoElement
(video
elements)HTMLCanvasElement
(canvas
elements)OffscreenCanvas
ImageBitmap
VideoFrame
Although not formally specified as such, SVG image
elements are expected to be implemented nearly identical to img
elements. That is,
SVG image
elements share the fundamental concepts and features of
img
elements.
The ImageBitmap
interface can be created from a number of other
image-representing types, including ImageData
.
To check the usability of the image argument, where image
is a CanvasImageSource
object, run these steps:
Switch on image:
HTMLOrSVGImageElement
If image's current request's state is broken, then
throw an "InvalidStateError
" DOMException
.
If image is not fully decodable, then return bad.
If image has a natural width or natural height (or both) equal to zero, then return bad.
HTMLVideoElement
If image's readyState
attribute is either HAVE_NOTHING
or HAVE_METADATA
, then return bad.
HTMLCanvasElement
OffscreenCanvas
If image has either a horizontal dimension or a vertical dimension
equal to zero, then throw an "InvalidStateError
"
DOMException
.
ImageBitmap
VideoFrame
If image's [[Detached]] internal slot value
is set to true, then throw an "InvalidStateError
"
DOMException
.
Return good.
When a CanvasImageSource
object represents an HTMLOrSVGImageElement
,
the element's image must be used as the source image.
Specifically, when a CanvasImageSource
object represents an animated image in an
HTMLOrSVGImageElement
, the user agent must use the default image of the animation
(the one that the format defines is to be used when animation is not supported or is disabled),
or, if there is no such image, the first frame of the animation, when rendering the image for
CanvasRenderingContext2D
APIs.
When a CanvasImageSource
object represents an HTMLVideoElement
, then
the frame at the current playback position when the method with the argument is
invoked must be used as the source image when rendering the image for
CanvasRenderingContext2D
APIs, and the source image's dimensions must be the natural width and natural height of the media resource
(i.e., after any aspect-ratio correction has been applied).
When a CanvasImageSource
object represents an HTMLCanvasElement
, the
element's bitmap must be used as the source image.
When a CanvasImageSource
object represents an element that is being
rendered and that element has been resized, the original image data of the source image
must be used, not the image as it is rendered (e.g. width
and
height
attributes on the source element have no effect on how
the object is interpreted when rendering the image for CanvasRenderingContext2D
APIs).
When a CanvasImageSource
object represents an ImageBitmap
, the
object's bitmap image data must be used as the source image.
When a CanvasImageSource
object represents an OffscreenCanvas
, the
object's bitmap must be used as the source image.
When a CanvasImageSource
object represents a VideoFrame
, the object's
pixel data must be used as the source image, and the source image's dimensions must be the
object's [[display width]] and [[display height]].
An object image is not origin-clean if, switching on image's type:
HTMLOrSVGImageElement
image's current request's image data is CORS-cross-origin.
HTMLVideoElement
image's media data is CORS-cross-origin.
HTMLCanvasElement
ImageBitmap
OffscreenCanvas
image's bitmap's origin-clean flag is false.
context.fillStyle [ = value ]
Returns the current style used for filling shapes.
Can be set, to change the fill style.
The style can be either a string containing a CSS color, or a CanvasGradient
or
CanvasPattern
object. Invalid values are ignored.
context.strokeStyle [ = value ]
Returns the current style used for stroking shapes.
Can be set, to change the stroke style.
The style can be either a string containing a CSS color, or a CanvasGradient
or
CanvasPattern
object. Invalid values are ignored.
Objects that implement the CanvasFillStrokeStyles
interface have attributes and
methods (defined in this section) that control how shapes are treated by the object.
Such objects have associated fill
style and stroke style
values, which are either CSS colors, CanvasPattern
s, or CanvasGradient
s.
Initially, both must be the result of parsing
the string "#000000
".
When the value is a CSS color, it must not be affected by the transformation matrix when used to draw on bitmaps.
When set to a CanvasPattern
or CanvasGradient
object,
changes made to the object after the assignment do affect subsequent stroking or filling of
shapes.
The fillStyle
getter steps are:
If this's fill style is a CSS color, then return the serialization of that color with HTML-compatible serialization requested.
Return this's fill style.
The fillStyle
setter steps are:
If the given value is a string, then:
Let context be this's canvas
attribute's value, if that is an element;
otherwise null.
Let parsedValue be the result of parsing the given value with context if non-null.
If parsedValue is failure, then return.
Set this's fill style to parsedValue.
Return.
If the given value is a CanvasPattern
object that is marked as not origin-clean, then set
this's origin-clean flag to
false.
Set this's fill style to the given value.
The strokeStyle
getter steps are:
If this's stroke style is a CSS color, then return the serialization of that color with HTML-compatible serialization requested.
Return this's stroke style.
The strokeStyle
setter steps are:
If the given value is a string, then:
Let context be this's canvas
attribute's value, if that is an element;
otherwise null.
Let parsedValue be the result of parsing the given value with context if non-null.
If parsedValue is failure, then return.
Set this's stroke style to parsedValue.
Return.
If the given value is a CanvasPattern
object that is marked as not origin-clean, then set
this's origin-clean flag to
false.
Set this's stroke style to the given value.
There are three types of gradients, linear gradients, radial gradients, and conic gradients,
represented by objects implementing the opaque CanvasGradient
interface.
Once a gradient has been created (see below), stops are placed along it to define how the colors are distributed along the gradient. The color of the gradient at each stop is the color specified for that stop. Between each such stop, the colors and the alpha component must be linearly interpolated over the RGBA space without premultiplying the alpha value to find the color to use at that offset. Before the first stop, the color must be the color of the first stop. After the last stop, the color must be the color of the last stop. When there are no stops, the gradient is transparent black.
gradient.addColorStop(offset, color)
Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end.
Throws an "IndexSizeError
" DOMException
if the offset
is out of range. Throws a "SyntaxError
" DOMException
if
the color cannot be parsed.
gradient = context.createLinearGradient(x0, y0, x1, y1)
Returns a CanvasGradient
object that represents a linear gradient that paints
along the line given by the coordinates represented by the arguments.
gradient = context.createRadialGradient(x0, y0, r0, x1, y1, r1)
Returns a CanvasGradient
object that represents a radial gradient that paints
along the cone given by the circles represented by the arguments.
If either of the radii are negative, throws an "IndexSizeError
"
DOMException
exception.
gradient = context.createConicGradient(startAngle, x, y)
Returns a CanvasGradient
object that represents a conic gradient that paints
clockwise along the rotation around the center represented by the arguments.
The addColorStop(offset,
color)
method on the CanvasGradient
, when invoked, must run
these steps:
If the offset is less than 0 or greater than 1, then throw an
"IndexSizeError
" DOMException
.
Let parsed color be the result of parsing color.
No element is passed to the parser because CanvasGradient
objects
are canvas
-neutral — a CanvasGradient
object created by one
canvas
can be used by another, and there is therefore no way to know which is the
"element in question" at the time that the color is specified.
If parsed color is failure, throw a "SyntaxError
"
DOMException
.
Place a new stop on the gradient, at offset offset relative to the whole gradient, and with the color parsed color.
If multiple stops are added at the same offset on a gradient, then they must be placed in the order added, with the first one closest to the start of the gradient, and each subsequent one infinitesimally further along towards the end point (in effect causing all but the first and last stop added at each point to be ignored).
The createLinearGradient(x0, y0,
x1, y1)
method takes four arguments that represent the start
point (x0, y0) and end point (x1, y1) of the gradient.
The method, when invoked, must return a linear CanvasGradient
initialized with the
specified line.
Linear gradients must be rendered such that all points on a line perpendicular to the line that crosses the start and end points have the color at the point where those two lines cross (with the colors coming from the interpolation and extrapolation described above). The points in the linear gradient must be transformed as described by the current transformation matrix when rendering.
If x0 = x1 and y0 = y1, then the linear gradient must paint nothing.
The createRadialGradient(x0, y0,
r0, x1, y1, r1)
method takes six
arguments, the first three representing the start circle with origin (x0,
y0) and radius r0, and the last three representing the end circle with
origin (x1, y1) and radius r1. The values are in coordinate space
units. If either of r0 or r1 are negative, then an
"IndexSizeError
" DOMException
must be thrown. Otherwise,
the method, when invoked, must return a radial CanvasGradient
initialized with the
two specified circles.
Radial gradients must be rendered by following these steps:
If x0 = x1 and y0 = y1 and r0 = r1, then the radial gradient must paint nothing. Return.
Let x(ω) = (x1-x0)ω + x0
Let y(ω) = (y1-y0)ω + y0
Let r(ω) = (r1-r0)ω + r0
Let the color at ω be the color at that position on the gradient (with the colors coming from the interpolation and extrapolation described above).
For all values of ω where r(ω) > 0, starting with the value of ω nearest to positive infinity and ending with the value of ω nearest to negative infinity, draw the circumference of the circle with radius r(ω) at position (x(ω), y(ω)), with the color at ω, but only painting on the parts of the bitmap that have not yet been painted on by earlier circles in this step for this rendering of the gradient.
This effectively creates a cone, touched by the two circles defined in the creation of the gradient, with the part of the cone before the start circle (0.0) using the color of the first offset, the part of the cone after the end circle (1.0) using the color of the last offset, and areas outside the cone untouched by the gradient (transparent black).
The resulting radial gradient must then be transformed as described by the current transformation matrix when rendering.
The createConicGradient(startAngle,
x, y)
method takes three arguments, the first argument,
startAngle, represents the angle in radians at which the gradient begins, and the last
two arguments, (x, y), represent the center of the gradient in CSS pixels. The method, when invoked, must return a conic
CanvasGradient
initialized with the specified center and angle.
It follows the same rendering rule as CSS 'conic-gradient' and it is equivalent to CSS 'conic-gradient(from adjustedStartAnglerad at xpx ypx, angularColorStopList)'. Here:
adjustedStartAngle is given by startAngle + π/2;
angularColorStopList is given by the color stops that have been added to the
CanvasGradient
using addColorStop()
, with the color stop offsets
interpreted as percentages.
Gradients must be painted only where the relevant stroking or filling effects requires that they be drawn.
Patterns are represented by objects implementing the opaque CanvasPattern
interface.
pattern = context.createPattern(image, repetition)
Returns a CanvasPattern
object that uses the given image and repeats in the
direction(s) given by the repetition argument.
The allowed values for repetition are repeat
(both
directions), repeat-x
(horizontal only), repeat-y
(vertical only), and no-repeat
(neither). If the repetition
argument is empty, the value repeat
is used.
If the image isn't yet fully decoded, then nothing is drawn. If the image is a canvas with no
data, throws an "InvalidStateError
" DOMException
.
pattern.setTransform(transform)
Sets the transformation matrix that will be used when rendering the pattern during a fill or stroke painting operation.
The createPattern(image,
repetition)
method, when invoked, must run these steps:
Let usability be the result of checking the usability of image.
If usability is bad, then return null.
Assert: usability is good.
If repetition is the empty string, then set it to "repeat
".
If repetition is not identical to one of "repeat
", "repeat-x
", "repeat-y
",
or "no-repeat
", then throw a
"SyntaxError
" DOMException
.
Let pattern be a new CanvasPattern
object with the image
image and the repetition behavior given by repetition.
If image is not origin-clean, then mark pattern as not origin-clean.
Return pattern.
Modifying the image used when creating a CanvasPattern
object
after calling the createPattern()
method must
not affect the pattern(s) rendered by the CanvasPattern
object.
Patterns have a transformation matrix, which controls how the pattern is used when it is painted. Initially, a pattern's transformation matrix must be the identity matrix.
The setTransform(transform)
method,
when invoked, must run these steps:
Let matrix be the result of creating a DOMMatrix
from the 2D dictionary
transform.
If one or more of matrix's m11 element, m12 element, m21 element, m22 element, m41 element, or m42 element are infinite or NaN, then return.
Reset the pattern's transformation matrix to matrix.
When a pattern is to be rendered within an area, the user agent must run the following steps to determine what is rendered:
Create an infinite transparent black bitmap.
Place a copy of the image on the bitmap, anchored such that its top left corner is at the
origin of the coordinate space, with one coordinate space unit per CSS
pixel of the image, then place repeated copies of this image horizontally to the left and
right, if the repetition behavior is "repeat-x
", or vertically up and
down, if the repetition behavior is "repeat-y
", or in all four
directions all over the bitmap, if the repetition behavior is "repeat
".
If the original image data is a bitmap image, then the value painted at a point in the area
of the repetitions is computed by filtering the original image data. When scaling up, if the
imageSmoothingEnabled
attribute is
set to false, then the image must be rendered using nearest-neighbor interpolation. Otherwise,
the user agent may use any filtering algorithm (for example bilinear interpolation or
nearest-neighbor). User agents which support multiple filtering algorithms may use the value of
the imageSmoothingQuality
attribute
to guide the choice of filtering algorithm. When such a filtering algorithm requires a pixel
value from outside the original image data, it must instead use the value from wrapping the
pixel's coordinates to the original image's dimensions. (That is, the filter uses 'repeat'
behavior, regardless of the value of the pattern's repetition behavior.)
Transform the resulting bitmap according to the pattern's transformation matrix.
Transform the resulting bitmap again, this time according to the current transformation matrix.
Replace any part of the image outside the area in which the pattern is to be rendered with transparent black.
The resulting bitmap is what is to be rendered, with the same origin and same scale.
If a radial gradient or repeated pattern is used when the transformation matrix is singular, then the resulting style must be transparent black (otherwise the gradient or pattern would be collapsed to a point or line, leaving the other pixels undefined). Linear gradients and solid colors always define all points even with singular transformation matrices.
Objects that implement the CanvasRect
interface provide the following methods for
immediately drawing rectangles to the bitmap. The methods each take four arguments; the first two
give the x and y coordinates of the top left of the rectangle, and the
second two give the width w and height h of the rectangle, respectively.
The current transformation matrix must be applied to the following four coordinates, which form the path that must then be closed to get the specified rectangle: (x, y), (x+w, y), (x+w, y+h), (x, y+h).
Shapes are painted without affecting the current default path, and are subject to
the clipping region, and, with the exception of clearRect()
, also shadow
effects, global alpha, and the
current compositing and blending operator.
context.clearRect(x, y, w, h)
Clears all pixels on the bitmap in the given rectangle to transparent black.
context.fillRect(x, y, w, h)
Paints the given rectangle onto the bitmap, using the current fill style.
context.strokeRect(x, y, w, h)
Paints the box that outlines the given rectangle onto the bitmap, using the current stroke style.
The clearRect(x, y, w,
h)
method, when invoked, must run these steps:
If any of the arguments are infinite or NaN, then return.
Let pixels be the set of pixels in the specified rectangle that also intersect the current clipping region.
Clear the pixels in pixels to a transparent black, erasing any previous image.
If either height or width are zero, this method has no effect, since the set of pixels would be empty.
The fillRect(x,
y, w, h)
method, when invoked, must run these
steps:
If any of the arguments are infinite or NaN, then return.
If either w or h are zero, then return.
Paint the specified rectangular area using this's fill style.
The strokeRect(x, y, w,
h)
method, when invoked, must run these steps:
If any of the arguments are infinite or NaN, then return.
Take the result of tracing the path described below,
using the CanvasPathDrawingStyles
interface's line styles, and fill it with
this's stroke
style.
If both w and h are zero, the path has a single subpath with just one point (x, y), and no lines, and this method thus has no effect (the trace a path algorithm returns an empty path in that case).
If just one of either w or h is zero, then the path has a single subpath consisting of two points, with coordinates (x, y) and (x+w, y+h), in that order, connected by a single straight line.
Otherwise, the path has a single subpath consisting of four points, with coordinates (x, y), (x+w, y), (x+w, y+h), and (x, y+h), connected to each other in that order by straight lines.
context.fillText(text, x, y [, maxWidth ])
context.strokeText(text, x, y [, maxWidth ])
Fills or strokes (respectively) the given text at the given position. If a maximum width is provided, the text will be scaled to fit that width if necessary.
metrics = context.measureText(text)
Returns a TextMetrics
object with the metrics of the given text in the current
font.
metrics.width
metrics.actualBoundingBoxLeft
metrics.actualBoundingBoxRight
metrics.fontBoundingBoxAscent
metrics.fontBoundingBoxDescent
metrics.actualBoundingBoxAscent
metrics.actualBoundingBoxDescent
metrics.emHeightAscent
metrics.emHeightDescent
metrics.hangingBaseline
metrics.alphabeticBaseline
metrics.ideographicBaseline
Returns the measurement described below.
Objects that implement the CanvasText
interface provide the following methods for
rendering text.
The fillText(text, x, y,
maxWidth)
and strokeText(text, x, y,
maxWidth)
methods render the given
text at the given (x, y) coordinates ensuring that the text isn't
wider than maxWidth if specified, using the current font
, textAlign
, and textBaseline
values. Specifically, when the methods
are invoked, the user agent must run these steps:
If any of the arguments are infinite or NaN, then return.
Run the text preparation algorithm, passing it text, the object
implementing the CanvasText
interface, and, if the maxWidth argument was
provided, that argument. Let glyphs be the result.
Move all the shapes in glyphs to the right by x CSS pixels and down by y CSS pixels.
Paint the shapes given in glyphs, as transformed by the current transformation matrix, with each CSS pixel in the coordinate space of glyphs mapped to one coordinate space unit.
For fillText()
, this's fill style must be applied to the
shapes and this's stroke
style must be ignored. For strokeText()
,
the reverse holds: this's stroke style must be applied to the
result of tracing the shapes using the object implementing
the CanvasText
interface for the line styles, and this's fill style must be ignored.
These shapes are painted without affecting the current path, and are subject to shadow effects, global alpha, the clipping region, and the current compositing and blending operator.
The measureText(text)
method steps are to
run the text preparation algorithm, passing it text and the object
implementing the CanvasText
interface, and then using the returned inline
box must return a new TextMetrics
object with members behaving as described in
the following list: CSS
width
attributeThe width of that inline box, in CSS pixels. (The text's advance width.)
actualBoundingBoxLeft
attributeThe distance parallel to the baseline from the alignment point given by the textAlign
attribute to the left side of the bounding
rectangle of the given text, in CSS pixels; positive numbers
indicating a distance going left from the given alignment point.
The sum of this value and the next (actualBoundingBoxRight
) can be wider than
the width of the inline box (width
), in
particular with slanted fonts where characters overhang their advance width.
actualBoundingBoxRight
attributeThe distance parallel to the baseline from the alignment point given by the textAlign
attribute to the right side of the bounding
rectangle of the given text, in CSS pixels; positive numbers
indicating a distance going right from the given alignment point.
fontBoundingBoxAscent
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the ascent
metric of the first available font, in CSS
pixels; positive numbers indicating a distance going up from the given baseline.
This value and the next are useful when rendering a background that have to have
a consistent height even if the exact text being rendered changes. The actualBoundingBoxAscent
attribute (and
its corresponding attribute for the descent) are useful when drawing a bounding box around
specific text.
fontBoundingBoxDescent
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the descent
metric of the first available font, in CSS pixels;
positive numbers indicating a distance going down from the given baseline.
actualBoundingBoxAscent
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the top of the bounding
rectangle of the given text, in CSS pixels; positive numbers
indicating a distance going up from the given baseline.
This number can vary greatly based on the input text, even if the first font
specified covers all the characters in the input. For example, the actualBoundingBoxAscent
of a lowercase
"o" from an alphabetic baseline would be less than that of an uppercase "F". The
value can easily be negative; for example, the distance from the top of the em box (textBaseline
value "top
") to the top of the bounding rectangle when
the given text is just a single comma ",
" would likely (unless the font is
quite unusual) be negative.
actualBoundingBoxDescent
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the bottom of the bounding
rectangle of the given text, in CSS pixels; positive numbers
indicating a distance going down from the given baseline.
emHeightAscent
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the highest top of the em
squares in the inline box, in CSS pixels; positive numbers
indicating that the given baseline is below the top of that em square (so this value will usually
be positive). Zero if the given baseline is the top of that em square; half the font size if the
given baseline is the middle of that em square.
emHeightDescent
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the lowest bottom of the em
squares in the inline box, in CSS pixels; positive numbers
indicating that the given baseline is above the bottom of that em square. (Zero if the given baseline
is the bottom of that em square.)
hangingBaseline
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the hanging
baseline of the inline box, in CSS pixels;
positive numbers indicating that the given baseline is below the hanging baseline.
(Zero if the given baseline is the hanging baseline.)
alphabeticBaseline
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the alphabetic
baseline of the inline box, in CSS pixels;
positive numbers indicating that the given baseline is below the alphabetic
baseline. (Zero if the given baseline is the alphabetic baseline.)
ideographicBaseline
attributeThe distance from the horizontal line indicated by the textBaseline
attribute to the ideographic-under
baseline of the inline box, in CSS pixels;
positive numbers indicating that the given baseline is below the ideographic-under
baseline. (Zero if the given baseline is the ideographic-under
baseline.)
Glyphs rendered using fillText()
and
strokeText()
can spill out of the box given by the
font size (the em square size) and the width returned by measureText()
(the text width). Authors are encouraged
to use the bounding box values described above if this is an issue.
A future version of the 2D context API might provide a way to render fragments of documents, rendered using CSS, straight to the canvas. This would be provided in preference to a dedicated way of doing multiline layout.
Objects that implement the CanvasDrawPath
interface have a current default
path. There is only one current default path, it is not part of the
drawing state. The current default path is a path, as described above.
context.beginPath()
Resets the current default path.
context.fill([ fillRule ])
context.fill(path [, fillRule ])
Fills the subpaths of the current default path or the given path with the current fill style, obeying the given fill rule.
context.stroke()
context.stroke(path)
Strokes the subpaths of the current default path or the given path with the current stroke style.
context.clip([ fillRule ])
context.clip(path [, fillRule ])
Further constrains the clipping region to the current default path or the given path, using the given fill rule to determine what points are in the path.
context.isPointInPath(x, y [, fillRule ])
context.isPointInPath(path, x, y [, fillRule ])
Returns true if the given point is in the current default path or the given path, using the given fill rule to determine what points are in the path.
context.isPointInStroke(x, y)
context.isPointInStroke(path, x, y)
Returns true if the given point would be in the region covered by the stroke of the current default path or the given path, given the current stroke style.
The beginPath()
method steps are to empty the list of
subpaths in this's current default path so that it once again has zero
subpaths.
Where the following method definitions use the term intended path for a
Path2D
-or-null path, it means path itself if it is a
Path2D
object, or the current default path otherwise.
When the intended path is a Path2D
object, the coordinates and lines
of its subpaths must be transformed according to the current transformation matrix on the object
implementing the CanvasTransform
interface when used by these methods (without
affecting the Path2D
object itself). When the intended path is the current
default path, it is not affected by the transform. (This is because transformations
already affect the current default path when it is constructed, so applying it when
it is painted as well would result in a double transformation.)
The fill(fillRule)
method steps are to run the
fill steps given this, null, and fillRule.
The fill(path, fillRule)
method
steps are to run the fill steps given this, path, and
fillRule.
The fill steps, given a CanvasDrawPath
context, a
Path2D
-or-null path, and a fill rule fillRule,
are to fill all the subpaths of the intended path for path, using
context's fill style,
and using the fill rule indicated by fillRule. Open subpaths must be
implicitly closed when being filled (without affecting the actual subpaths).
The stroke()
method steps are to run the stroke
steps given this and null.
The stroke(path)
method steps are to run
the stroke steps given this and path.
The stroke steps, given a CanvasDrawPath
context and a
Path2D
-or-null path, are to trace the
intended path for path, using context's line styles as set by
its CanvasPathDrawingStyles
mixin, and then fill the resulting path using
context's stroke
style, using the nonzero winding
rule.
As a result of how the algorithm to trace a path is defined, overlapping parts of the paths in one stroke operation are treated as if their union was what was painted.
The stroke style is affected by the transformation during painting, even if the current default path is used.
Paths, when filled or stroked, must be painted without affecting the current default
path or any Path2D
objects, and must be subject to shadow effects, global
alpha, the clipping region, and the current compositing and blending
operator. (The effect of transformations is described above and varies based on which path
is being used.)
The clip(fillRule)
method steps are to run the
clip steps given this, null, and fillRule.
The clip(path, fillRule)
method
steps are to run the clip steps given this, path, and
fillRule.
The clip steps, given a CanvasDrawPath
context, a
Path2D
-or-null path, and a fill rule fillRule,
are to create a new clipping region by calculating the intersection of
context's current clipping region and the area described by the intended
path for path, using the fill rule indicated by
fillRule. Open subpaths must be implicitly closed when computing the clipping region,
without affecting the actual subpaths. The new clipping region replaces the current clipping
region.
When the context is initialized, its current clipping region must be set to the largest infinite surface (i.e. by default, no clipping occurs).
The isPointInPath(x, y,
fillRule)
method steps are to return the result of the is point in
path steps given this, null, x, y, and
fillRule.
The isPointInPath(path, x,
y, fillRule)
method steps are to return the result of the
is point in path steps given this, path, x, y,
and fillRule.
The is point in path steps, given a CanvasDrawPath
context,
a Path2D
-or-null path, two numbers x and y, and a
fill rule fillRule, are:
If x or y are infinite or NaN, then return false.
If the point given by the x and y coordinates, when treated as coordinates in the canvas coordinate space unaffected by the current transformation, is inside the intended path for path as determined by the fill rule indicated by fillRule, then return true. Open subpaths must be implicitly closed when computing the area inside the path, without affecting the actual subpaths. Points on the path itself must be considered to be inside the path.
Return false.
The isPointInStroke(x, y)
method steps are to return the result of the is point in stroke steps given
this, null, x, and y.
The isPointInStroke(path, x,
y)
method steps are to return the result of the is point in stroke
steps given this, path, x, and y.
The is point in stroke steps, given a CanvasDrawPath
context, a Path2D
-or-null path, and two numbers x
and y, are:
If x or y are infinite or NaN, then return false.
If the point given by the x and y coordinates, when treated as
coordinates in the canvas coordinate space unaffected by the current transformation, is inside
the path that results from tracing the intended
path for path, using the nonzero winding rule, and using
context's line styles as set by its CanvasPathDrawingStyles
mixin, then
return true. Points on the resulting path must be considered to be inside the path.
Return false.
This canvas
element has a couple of checkboxes. The path-related commands are
highlighted:
<canvas height=400 width=750>
<label><input type=checkbox id=showA> Show As</label>
<label><input type=checkbox id=showB> Show Bs</label>
<!-- ... -->
</canvas>
<script>
function drawCheckbox(context, element, x, y, paint) {
context.save();
context.font = '10px sans-serif';
context.textAlign = 'left';
context.textBaseline = 'middle';
var metrics = context.measureText(element.labels[0].textContent);
if (paint) {
context.beginPath();
context.strokeStyle = 'black';
context.rect(x-5, y-5, 10, 10);
context.stroke();
if (element.checked) {
context.fillStyle = 'black';
context.fill();
}
context.fillText(element.labels[0].textContent, x+5, y);
}
context.beginPath();
context.rect(x-7, y-7, 12 + metrics.width+2, 14);
context.drawFocusIfNeeded(element);
context.restore();
}
function drawBase() { /* ... */ }
function drawAs() { /* ... */ }
function drawBs() { /* ... */ }
function redraw() {
var canvas = document.getElementsByTagName('canvas')[0];
var context = canvas.getContext('2d');
context.clearRect(0, 0, canvas.width, canvas.height);
drawCheckbox(context, document.getElementById('showA'), 20, 40, true);
drawCheckbox(context, document.getElementById('showB'), 20, 60, true);
drawBase();
if (document.getElementById('showA').checked)
drawAs();
if (document.getElementById('showB').checked)
drawBs();
}
function processClick(event) {
var canvas = document.getElementsByTagName('canvas')[0];
var context = canvas.getContext('2d');
var x = event.clientX;
var y = event.clientY;
var node = event.target;
while (node) {
x -= node.offsetLeft - node.scrollLeft;
y -= node.offsetTop - node.scrollTop;
node = node.offsetParent;
}
drawCheckbox(context, document.getElementById('showA'), 20, 40, false);
if (context.isPointInPath(x, y))
document.getElementById('showA').checked = !(document.getElementById('showA').checked);
drawCheckbox(context, document.getElementById('showB'), 20, 60, false);
if (context.isPointInPath(x, y))
document.getElementById('showB').checked = !(document.getElementById('showB').checked);
redraw();
}
document.getElementsByTagName('canvas')[0].addEventListener('focus', redraw, true);
document.getElementsByTagName('canvas')[0].addEventListener('blur', redraw, true);
document.getElementsByTagName('canvas')[0].addEventListener('change', redraw, true);
document.getElementsByTagName('canvas')[0].addEventListener('click', processClick, false);
redraw();
</script>
context.drawFocusIfNeeded(element)
If element is focused, draws a focus ring around the current default path, following the platform conventions for focus rings.
context.drawFocusIfNeeded(path, element)
If element is focused, draws a focus ring around path, following the platform conventions for focus rings.
Objects that implement the CanvasUserInterface
interface provide the following
methods to draw focus rings.
The drawFocusIfNeeded(element)
method steps are to draw focus if needed given this,
element, and this's current default path.
The drawFocusIfNeeded(path,
element)
method steps are to draw focus if needed given
this, element, and path.
To draw focus if needed, given an object implementing
CanvasUserInterface
context, an element element, and a path path:
If element is not focused or is not a descendant of
context's canvas
element, then return.
Draw a focus ring of the appropriate style along path, following platform conventions.
Some platforms only draw focus rings around elements that have been focused from
the keyboard, and not those focused from the mouse. Other platforms simply don't draw focus
rings around some elements at all unless relevant accessibility features are enabled. This API
is intended to follow these conventions. User agents that implement distinctions based on the
manner in which the element was focused are encouraged to classify focus driven by the focus()
method based on the kind of user interaction event from which
the call was triggered (if any).
The focus ring should not be subject to the shadow effects,
the global alpha, the current
compositing and blending operator, the fill style, the stroke style, or any of the members
in the CanvasPathDrawingStyles
, CanvasTextDrawingStyles
interfaces,
but should be subject to the clipping region. (The effect of
transformations is described above and varies based on which path is being used.)
Inform the user that the focus is at the location given by the intended path. User agents may wait until the next time the event loop reaches its update the rendering step to optionally inform the user.
User agents should not implicitly close open subpaths in the intended path when drawing the focus ring.
This might be a moot point, however. For example, if the focus ring is drawn as an axis-aligned bounding rectangle around the points in the intended path, then whether the subpaths are closed or not has no effect. This specification intentionally does not specify precisely how focus rings are to be drawn: user agents are expected to honor their platform's native conventions.
"Inform the user", as used in this section, does not imply any persistent state change. It could mean, for instance, calling a system accessibility API to notify assistive technologies such as magnification tools so that the user's magnifier moves to the given area of the canvas. However, it does not associate the path with the element, or provide a region for tactile feedback, etc.
Objects that implement the CanvasDrawImage
interface have the drawImage()
method to
draw images.
This method can be invoked with three different sets of arguments:
drawImage(image, dx, dy)
drawImage(image, dx, dy, dw, dh)
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
context.drawImage(image, dx, dy)
context.drawImage(image, dx, dy, dw, dh)
context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
Draws the given image onto the canvas. The arguments are interpreted as follows:
If the image isn't yet fully decoded, then nothing is drawn. If the image is a canvas with no
data, throws an "InvalidStateError
" DOMException
.
When the drawImage()
method is invoked, the user
agent must run these steps:
If any of the arguments are infinite or NaN, then return.
Let usability be the result of checking the usability of image.
If usability is bad, then return (without drawing anything).
Establish the source and destination rectangles as follows:
If not specified, the dw and dh arguments must default to the values of sw and sh, interpreted such that one CSS pixel in the image is treated as one unit in the output bitmap's coordinate space. If the sx, sy, sw, and sh arguments are omitted, then they must default to 0, 0, the image's natural width in image pixels, and the image's natural height in image pixels, respectively. If the image has no natural dimensions, then the concrete object size must be used instead, as determined using the CSS "Concrete Object Size Resolution" algorithm, with the specified size having neither a definite width nor height, nor any additional constraints, the object's natural properties being those of the image argument, and the default object size being the size of the output bitmap. CSSIMAGES
The source rectangle is the rectangle whose corners are the four points (sx, sy), (sx+sw, sy), (sx+sw, sy+sh), (sx, sy+sh).
The destination rectangle is the rectangle whose corners are the four points (dx, dy), (dx+dw, dy), (dx+dw, dy+dh), (dx, dy+dh).
When the source rectangle is outside the source image, the source rectangle must be clipped to the source image and the destination rectangle must be clipped in the same proportion.
When the destination rectangle is outside the destination image (the output bitmap), the pixels that land outside the output bitmap are discarded, as if the destination was an infinite canvas whose rendering was clipped to the dimensions of the output bitmap.
If one of the sw or sh arguments is zero, then return. Nothing is painted.
Paint the region of the image argument specified by the source rectangle on the region of the rendering context's output bitmap specified by the destination rectangle, after applying the current transformation matrix to the destination rectangle.
The image data must be processed in the original direction, even if the dimensions given are negative.
When scaling up, if the imageSmoothingEnabled
attribute is set to
true, the user agent should attempt to apply a smoothing algorithm to the image data when it is
scaled. User agents which support multiple filtering algorithms may use the value of the imageSmoothingQuality
attribute to guide
the choice of filtering algorithm when the imageSmoothingEnabled
attribute is set to
true. Otherwise, the image must be rendered using nearest-neighbor interpolation.
This specification does not define the precise algorithm to use when scaling an
image down, or when scaling an image up when the imageSmoothingEnabled
attribute is set to
true.
When a canvas
element is drawn onto itself, the drawing
model requires the source to be copied before the image is drawn, so it is possible to
copy parts of a canvas
element onto overlapping parts of itself.
If the original image data is a bitmap image, then the value painted at a point in the destination rectangle is computed by filtering the original image data. The user agent may use any filtering algorithm (for example bilinear interpolation or nearest-neighbor). When the filtering algorithm requires a pixel value from outside the original image data, it must instead use the value from the nearest edge pixel. (That is, the filter uses 'clamp-to-edge' behavior.) When the filtering algorithm requires a pixel value from outside the source rectangle but inside the original image data, then the value from the original image data must be used.
Thus, scaling an image in parts or in whole will have the same effect. This does
mean that when sprites coming from a single sprite sheet are to be scaled, adjacent images in
the sprite sheet can interfere. This can be avoided by ensuring each sprite in the sheet is
surrounded by a border of transparent black, or by copying sprites to be scaled
into temporary canvas
elements and drawing the scaled sprites from there.
Images are painted without affecting the current path, and are subject to shadow effects, global alpha, the clipping region, and the current compositing and blending operator.
If image is not origin-clean, then set the
CanvasRenderingContext2D
's origin-clean flag to false.
imagedata = new ImageData(sw, sh [, settings])
Returns an ImageData
object with the given dimensions and the color space
indicated by settings. All the pixels in the returned object are transparent
black.
Throws an "IndexSizeError
" DOMException
if either of
the width or height arguments are zero.
imagedata = new ImageData(data, sw [, sh [, settings ] ])
Returns an ImageData
object using the data provided in the Uint8ClampedArray
argument, interpreted using the given
dimensions and the color space indicated by settings.
As each pixel in the data is represented by four numbers, the length of the data needs to be a multiple of four times the given width. If the height is provided as well, then the length needs to be exactly the width times the height times 4.
Throws an "IndexSizeError
" DOMException
if the given
data and dimensions can't be interpreted consistently, or if either dimension is zero.
imagedata = context.createImageData(imagedata)
Returns an ImageData
object with the same dimensions and color space as the
argument. All the pixels in the returned object are transparent black.
imagedata = context.createImageData(sw, sh [, settings])
Returns an ImageData
object with the given dimensions. The color space of the
returned object is the color space of
context unless overridden by settings. All the pixels in the returned
object are transparent black.
Throws an "IndexSizeError
" DOMException
if either of
the width or height arguments are zero.
imagedata = context.getImageData(sx, sy, sw, sh [, settings])
Returns an ImageData
object containing the image data for the given rectangle of
the bitmap. The color space of the returned object is the color space of context unless overridden
by settings.
Throws an "IndexSizeError
" DOMException
if the either
of the width or height arguments are zero.
imagedata.width
imagedata.height
Returns the actual dimensions of the data in the ImageData
object, in
pixels.
imagedata.data
Returns the one-dimensional array containing the data in RGBA order, as integers in the range 0 to 255.
imagedata.colorSpace
Returns the color space of the pixels.
context.putImageData(imagedata, dx, dy [, dirtyX, dirtyY, dirtyWidth, dirtyHeight ])
Paints the data from the given ImageData
object onto the bitmap. If a dirty
rectangle is provided, only the pixels from that rectangle are painted.
The globalAlpha
and globalCompositeOperation
properties, as
well as the shadow attributes, are ignored for the purposes of
this method call; pixels in the canvas are replaced wholesale, with no composition, alpha
blending, no shadows, etc.
Throws an "InvalidStateError
" DOMException
if the
imagedata object's data
attribute value's
[[ViewedArrayBuffer]] internal slot is detached.
Objects that implement the CanvasImageData
interface provide the following methods
for reading and writing pixel data to the bitmap.
The new ImageData(sw,
sh, settings)
constructor steps are:
If one or both of sw and sh are zero, then throw an
"IndexSizeError
" DOMException
.
Initialize this given sw, sh, and settings set to settings.
Initialize the image data of this to transparent black.
The new
ImageData(data, sw, sh, settings)
constructor steps are:
Let length be the number of bytes in data.
If length is not a nonzero integral multiple of four, then throw an
"InvalidStateError
" DOMException
.
Let length be length divided by four.
If length is not an integral multiple of sw, then throw an
"IndexSizeError
" DOMException
.
At this step, the length is guaranteed to be greater than zero (otherwise the second step above would have aborted the steps), so if sw is zero, this step will throw the exception and return.
Let height be length divided by sw.
If sh was given and its value is not equal to height, then throw an
"IndexSizeError
" DOMException
.
Initialize this given sw, sh, settings set to settings, and source set to data.
This step does not set this's data to a copy of data.
It sets it to the actual Uint8ClampedArray
object
passed as data.
The createImageData(sw, sh,
settings)
method steps are:
If one or both of sw and sh are zero, then throw an
"IndexSizeError
" DOMException
.
Let newImageData be a new ImageData
object.
Initialize newImageData given the absolute magnitude of sw, the absolute magnitude of sh, settings set to settings, and defaultColorSpace set to this's color space.
Initialize the image data of newImageData to transparent black.
Return newImageData.
The createImageData(imagedata)
method steps are:
Let newImageData be a new ImageData
object.
Initialize newImageData
given the value of imagedata's width
attribute, the value of imagedata's height
attribute, and defaultColorSpace set to the value of
imagedata's colorSpace
attribute.
Initialize the image data of newImageData to transparent black.
Return newImageData.
The getImageData(sx, sy, sw,
sh, settings)
method steps are:
If either the sw or sh arguments are zero, then throw an
"IndexSizeError
" DOMException
.
If the CanvasRenderingContext2D
's origin-clean flag is set to false, then throw a
"SecurityError
" DOMException
.
Let imageData be a new ImageData
object.
Initialize imageData given sw, sh, settings set to settings, and defaultColorSpace set to this's color space.
Let the source rectangle be the rectangle whose corners are the four points (sx, sy), (sx+sw, sy), (sx+sw, sy+sh), (sx, sy+sh).
Set the pixel values of imageData to be the pixels of this's
output bitmap in the area specified by the source rectangle in the bitmap's
coordinate space units, converted from this's color space to imageData's colorSpace
using 'relative-colorimetric'
rendering intent.
Set the pixels values of imageData for areas of the source rectangle that are outside of the output bitmap to transparent black.
Return imageData.
To initialize an ImageData
object imageData, given a
positive integer number of rows rows, a positive integer number of pixels per row
pixelsPerRow, an optional ImageDataSettings
settings, an optional Uint8ClampedArray
source, and an optional
PredefinedColorSpace
defaultColorSpace:
If source was given, then initialize the data
attribute of imageData to
source.
Otherwise (source was not given), initialize the data
attribute of imageData to a new Uint8ClampedArray
object. The Uint8ClampedArray
object must use a new Canvas
Pixel ArrayBuffer
for its storage, and must have a
zero start offset and a length equal to the length of its storage, in bytes. The Canvas
Pixel ArrayBuffer
must have the correct size to
store rows × pixelsPerRow pixels.
If the Canvas Pixel ArrayBuffer
cannot be
allocated, then rethrow the RangeError
thrown by JavaScript,
and return.
Initialize the width
attribute of imageData to
pixelsPerRow.
Initialize the height
attribute of imageData to
rows.
If settings was given and settings["colorSpace
"] exists, then initialize the colorSpace
attribute of imageData to
settings["colorSpace
"].
Otherwise, if defaultColorSpace was given, then initialize the colorSpace
attribute of imageData to
defaultColorSpace.
Otherwise, initialize the colorSpace
attribute of imageData to "srgb".
ImageData
objects are serializable objects. Their serialization
steps, given value and serialized, are:
Set serialized.[[Data]] to the sub-serialization of the value of
value's data
attribute.
Set serialized.[[Width]] to the value of value's width
attribute.
Set serialized.[[Height]] to the value of value's height
attribute.
Set serialized.[[ColorSpace]] to the value of value's colorSpace
attribute.
Their deserialization steps, given serialized, value, and targetRealm, are:
Initialize value's data
attribute
to the sub-deserialization of serialized.[[Data]].
Initialize value's width
attribute
to serialized.[[Width]].
Initialize value's height
attribute
to serialized.[[Height]].
Initialize value's colorSpace
attribute to serialized.[[ColorSpace]].
A Canvas Pixel ArrayBuffer
is an ArrayBuffer
whose data is represented in left-to-right order, row
by row top to bottom, starting with the top left, with each pixel's red, green, blue, and alpha
components being given in that order for each pixel. Each component of each pixel represented in
this array must be in the range 0..255, representing the 8 bit value for that component. The
components must be assigned consecutive indices starting with 0 for the top left pixel's red
component.
The putImageData()
method writes data from
ImageData
structures back to the rendering context's output bitmap. Its
arguments are: imagedata, dx, dy, dirtyX,
dirtyY, dirtyWidth, and dirtyHeight.
When the last four arguments to this method are omitted, they must be assumed to have the
values 0, 0, the width
member of the imagedata structure, and the height
member of the imagedata structure, respectively.
The method, when invoked, must act as follows:
Let buffer be imagedata's data
attribute value's [[ViewedArrayBuffer]] internal
slot.
If IsDetachedBuffer(buffer) is true, then throw an
"InvalidStateError
" DOMException
.
If dirtyWidth is negative, then let dirtyX be dirtyX+dirtyWidth, and let dirtyWidth be equal to the absolute magnitude of dirtyWidth.
If dirtyHeight is negative, then let dirtyY be dirtyY+dirtyHeight, and let dirtyHeight be equal to the absolute magnitude of dirtyHeight.
If dirtyX is negative, then let dirtyWidth be dirtyWidth+dirtyX, and let dirtyX be zero.
If dirtyY is negative, then let dirtyHeight be dirtyHeight+dirtyY, and let dirtyY be zero.
If dirtyX+dirtyWidth is greater than the width
attribute of the imagedata argument, then
let dirtyWidth be the value of that width
attribute, minus the value of dirtyX.
If dirtyY+dirtyHeight is greater than the height
attribute of the imagedata argument, then
let dirtyHeight be the value of that height
attribute, minus the value of dirtyY.
If, after those changes, either dirtyWidth or dirtyHeight are negative or zero, then return without affecting any bitmaps.
For all integer values of x and y where dirtyX ≤ x < dirtyX+dirtyWidth and dirtyY ≤ y < dirtyY+dirtyHeight, copy the
four channels of the pixel with coordinate (x, y) in
the imagedata data structure's Canvas Pixel
ArrayBuffer
to the pixel with coordinate (dx+x, dy+y)
in the rendering context's output bitmap.
Due to the lossy nature of converting between color spaces and converting to and
from premultiplied alpha color values, pixels
that have just been set using putImageData()
,
and are not completely opaque, might be returned to an equivalent getImageData()
as different values.
The current path, transformation matrix, shadow attributes, global alpha, the clipping region, and current compositing and blending operator must not affect the methods described in this section.
In the following example, the script generates an ImageData
object so that it can
draw onto it.
// canvas is a reference to a <canvas> element
var context = canvas.getContext('2d');
// create a blank slate
var data = context.createImageData(canvas.width, canvas.height);
// create some plasma
FillPlasma(data, 'green'); // green plasma
// add a cloud to the plasma
AddCloud(data, data.width/2, data.height/2); // put a cloud in the middle
// paint the plasma+cloud on the canvas
context.putImageData(data, 0, 0);
// support methods
function FillPlasma(data, color) { ... }
function AddCloud(data, x, y) { ... }
Here is an example of using getImageData()
and putImageData()
to implement an edge detection
filter.
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Edge detection demo</title>
<script>
var image = new Image();
function init() {
image.onload = demo;
image.src = "image.jpeg";
}
function demo() {
var canvas = document.getElementsByTagName('canvas')[0];
var context = canvas.getContext('2d');
// draw the image onto the canvas
context.drawImage(image, 0, 0);
// get the image data to manipulate
var input = context.getImageData(0, 0, canvas.width, canvas.height);
// get an empty slate to put the data into
var output = context.createImageData(canvas.width, canvas.height);
// alias some variables for convenience
// In this case input.width and input.height
// match canvas.width and canvas.height
// but we'll use the former to keep the code generic.
var w = input.width, h = input.height;
var inputData = input.data;
var outputData = output.data;
// edge detection
for (var y = 1; y < h-1; y += 1) {
for (var x = 1; x < w-1; x += 1) {
for (var c = 0; c < 3; c += 1) {
var i = (y*w + x)*4 + c;
outputData[i] = 127 + -inputData[i - w*4 - 4] - inputData[i - w*4] - inputData[i - w*4 + 4] +
-inputData[i - 4] + 8*inputData[i] - inputData[i + 4] +
-inputData[i + w*4 - 4] - inputData[i + w*4] - inputData[i + w*4 + 4];
}
outputData[(y*w + x)*4 + 3] = 255; // alpha
}
}
// put the image data back after manipulation
context.putImageData(output, 0, 0);
}
</script>
</head>
<body onload="init()">
<canvas></canvas>
</body>
</html>
Here is an example of color space conversion applied when drawing a solid color and
reading the result back using and getImageData()
.
<!DOCTYPE HTML>
<html lang="en">
<title>Color space image data demo</title>
<canvas></canvas>
<script>
const canvas = document.querySelector('canvas');
const context = canvas.getContext('2d', {colorSpace:'display-p3'});
// Draw a red rectangle. Note that the hex color notation
// specifies sRGB colors.
context.fillStyle = "#FF0000";
context.fillRect(0, 0, 64, 64);
// Get the image data.
const pixels = context.getImageData(0, 0, 1, 1);
// This will print 'display-p3', reflecting the default behavior
// of returning image data in the canvas's color space.
console.log(pixels.colorSpace);
// This will print the values 234, 51, and 35, reflecting the
// red fill color, converted to 'display-p3'.
console.log(pixels.data[0]);
console.log(pixels.data[1]);
console.log(pixels.data[2]);
</script>
context.globalAlpha [ = value ]
Returns the current global alpha value applied to rendering operations.
Can be set, to change the global alpha value. Values outside of the range 0.0 .. 1.0 are ignored.
context.globalCompositeOperation [ = value ]
Returns the current compositing and blending operator, from the values defined in Compositing and Blending. COMPOSITE
Can be set, to change the current compositing and blending operator. Unknown values are ignored.
Objects that implement the CanvasCompositing
interface have a global alpha value and a current compositing
and blending operator value that both affect all the drawing operations on this
object.
The global alpha value gives an alpha value that is applied to shapes and images before they are composited onto the output bitmap. The value ranges from 0.0 (fully transparent) to 1.0 (no additional transparency). It must initially have the value 1.0.
The globalAlpha
getter steps are to return
this's global alpha.
The globalAlpha
setter steps are:
If the given value is either infinite, NaN, or not in the range 0.0 to 1.0, then return.
Otherwise, set this's global alpha to the given value.
The current compositing and blending operator value controls how shapes and images
are drawn onto the output bitmap, once they have had the global alpha and the current transformation
matrix applied. Initially, it must be set to "source-over
".
The globalCompositeOperation
getter
steps are to return this's current compositing and blending
operator.
The globalCompositeOperation
setter steps
are:
If the given value is not identical to any of the values that the <blend-mode> or the <composite-mode> properties are defined to take, then return. COMPOSITE
Otherwise, set this's current compositing and blending operator to the given value.
context.imageSmoothingEnabled [ = value ]
Returns whether pattern fills and the drawImage()
method will attempt to smooth images if
their pixels don't line up exactly with the display, when scaling images up.
Can be set, to change whether images are smoothed (true) or not (false).
context.imageSmoothingQuality [ = value ]
Returns the current image-smoothing-quality preference.
Can be set, to change the preferred quality of image smoothing. The possible values are
"low
", "medium
" and "high
". Unknown values are ignored.
Objects that implement the CanvasImageSmoothing
interface have attributes that
control how image smoothing is performed.
The imageSmoothingEnabled
attribute, on
getting, must return the last value it was set to. On setting, it must be set to the new value.
When the object implementing the CanvasImageSmoothing
interface is created, the
attribute must be set to true.
The imageSmoothingQuality
attribute, on
getting, must return the last value it was set to. On setting, it must be set to the new value.
When the object implementing the CanvasImageSmoothing
interface is created, the
attribute must be set to "low
".
All drawing operations on an object which implements the CanvasShadowStyles
interface are affected by the four global shadow attributes.
context.shadowColor [ = value ]
Returns the current shadow color.
Can be set, to change the shadow color. Values that cannot be parsed as CSS colors are ignored.
context.shadowOffsetX [ = value ]
context.shadowOffsetY [ = value ]
Returns the current shadow offset.
Can be set, to change the shadow offset. Values that are not finite numbers are ignored.
context.shadowBlur [ = value ]
Returns the current level of blur applied to shadows.
Can be set, to change the blur level. Values that are not finite numbers greater than or equal to zero are ignored.
Objects which implement the CanvasShadowStyles
interface have an associated shadow color, which is a CSS color.
Initially, it must be transparent black.
The shadowColor
getter steps are to return the serialization of this's shadow color with HTML-compatible serialization
requested.
The shadowColor
setter steps are:
Let context be this's canvas
attribute's value, if that is an element; otherwise
null.
Let parsedValue be the result of parsing the given value with context if non-null.
If parsedValue is failure, then return.
Set this's shadow color to parsedValue.
The shadowOffsetX
and shadowOffsetY
attributes specify the distance that the shadow will be offset in the positive horizontal and
positive vertical distance respectively. Their values are in coordinate space units. They are not
affected by the current transformation matrix.
When the context is created, the shadow offset attributes must initially have the value 0.
On getting, they must return their current value. On setting, the attribute being set must be set to the new value, except if the value is infinite or NaN, in which case the new value must be ignored.
The shadowBlur
attribute specifies the level of the
blurring effect. (The units do not map to coordinate space units, and are not affected by the
current transformation matrix.)
When the context is created, the shadowBlur
attribute must initially have the value 0.
On getting, the attribute must return its current value. On setting, the attribute must be set to the new value, except if the value is negative, infinite or NaN, in which case the new value must be ignored.
Shadows are only drawn if the opacity component of
the alpha component of the shadow
color is nonzero and either the shadowBlur
is nonzero, or the shadowOffsetX
is nonzero, or
the shadowOffsetY
is nonzero.
When shadows are drawn, they must be rendered as follows:
Let A be an infinite transparent black bitmap on which the source image for which a shadow is being created has been rendered.
Let B be an infinite transparent black bitmap, with a coordinate space and an origin identical to A.
Copy the alpha channel of A to B, offset by shadowOffsetX
in the positive x
direction, and shadowOffsetY
in the positive
y direction.
If shadowBlur
is greater than 0:
Let σ be half the value of shadowBlur
.
Perform a 2D Gaussian Blur on B, using σ as the standard deviation.
User agents may limit values of σ to an implementation-specific maximum value to avoid exceeding hardware limitations during the Gaussian blur operation.
Set the red, green, and blue components of every pixel in B to the red, green, and blue components (respectively) of the shadow color.
Multiply the alpha component of every pixel in B by the alpha component of the shadow color.
The shadow is in the bitmap B, and is rendered as part of the drawing model described below.
If the current compositing and blending operator is "copy
", then shadows effectively won't render (since the shape will
overwrite the shadow).
All drawing operations on an object which implements the CanvasFilters
interface are affected by the global filter
attribute.
context.filter [ = value ]
Returns the current filter.
Can be set, to change the filter. Values can either be the string "none
" or a string parseable as a <filter-value-list>. Other
values are ignored.
Such objects have an associated current
filter, which is a string. Initially the current filter is set to the string "none
". Whenever the value of the current filter is the string "none
" filters will be disabled for the context.
The filter
getter steps are to return
this's current filter.
The filter
setter steps are:
If the given value is "none
", then set this's current filter to "none
"
and return.
Let parsedValue be the result of parsing the given values as a <filter-value-list>. If any property-independent style sheet syntax like 'inherit' or 'initial' is present, then this parsing must return failure.
If parsedValue is failure, then return.
Set this's current filter to the given value.
Though context.
will disable
filters for the context, filter
= "none
"context.
, filter
= ""context.
,
and filter
= nullcontext.
are all treated as unparseable inputs and the value of the current filter is left unchanged.filter
=
undefined
Coordinates used in the value of the current filter are interpreted such that one pixel is equivalent to one SVG user space unit and to one canvas coordinate space unit. Filter coordinates are not affected by the current transformation matrix. The current transformation matrix affects only the input to the filter. Filters are applied in the output bitmap's coordinate space.
When the value of the current filter is a
string parsable as a <filter-value-list> which defines lengths using
percentages or using 'em' or 'ex' units, these must be interpreted
relative to the computed value of the 'font-size' property of the
font style source object at the time that the attribute is set. If the computed values are undefined for a particular case (e.g. because
the font style source object is not an element or is not being
rendered), then the relative keywords must be interpreted relative to the default value of
the font
attribute. The 'larger' and 'smaller' keywords
are not supported.
If the value of the current filter is a string parseable as a <filter-value-list> with a reference to an SVG filter in the same document, and this SVG filter changes, then the changed filter is used for the next draw operation.
If the value of the current filter is a string parseable as a <filter-value-list> with a reference to an SVG filter in an external resource document and that document is not loaded when a drawing operation is invoked, then the drawing operation must proceed with no filtering.
Since drawing is performed using filter value "none
" until an
externally-defined filter has finished loading, authors might wish to determine whether such a
filter has finished loading before proceeding with a drawing operation. One way to accomplish
this is to load the externally-defined filter elsewhere within the same page in some element that
sends a load
event (for example, an SVG use
element), and wait for the load
event to be dispatched.
When a shape or image is painted, user agents must follow these steps, in the order given (or act as if they do):
Render the shape or image onto an infinite transparent black bitmap, creating image A, as described in the previous sections. For shapes, the current fill, stroke, and line styles must be honored, and the stroke must itself also be subjected to the current transformation matrix.
Multiply the alpha component of every pixel in A by global alpha
.
When the current filter is set to a
value other than "none
" and all the externally-defined filters it
references, if any, are in documents that are currently loaded, then use image A as
the input to the current filter, creating
image B. If the current filter
is a string parseable as a <filter-value-list>, then draw using the current filter in the same manner as SVG.
Otherwise, let B be an alias for A.
When shadows are drawn, render the shadow from image B, using the current shadow styles, creating image C.
When shadows are drawn, composite C within the clipping region over the current output bitmap using the current compositing and blending operator.
Composite B within the clipping region over the current output bitmap using the current compositing and blending operator.
When compositing onto the output bitmap, pixels that would fall outside of the output bitmap must be discarded.
When a canvas is interactive, authors should include focusable elements in the element's fallback content corresponding to each focusable part of the canvas, as in the example above.
When rendering focus rings, to ensure that focus rings have the appearance of native focus
rings, authors should use the drawFocusIfNeeded()
method, passing it the
element for which a ring is being drawn. This method only draws the focus ring if the element is
focused, so that it can simply be called whenever drawing the element, without
checking whether the element is focused or not first.
Authors should avoid implementing text editing controls
using the canvas
element. Doing so has a large number of disadvantages:
This is a huge amount of work, and authors are most strongly encouraged to avoid doing any of
it by instead using the input
element, the textarea
element, or the
contenteditable
attribute.
Here is an example of a script that uses canvas to draw pretty glowing lines.
<canvas width="800" height="450"></canvas>
<script>
var context = document.getElementsByTagName('canvas')[0].getContext('2d');
var lastX = context.canvas.width * Math.random();
var lastY = context.canvas.height * Math.random();
var hue = 0;
function line() {
context.save();
context.translate(context.canvas.width/2, context.canvas.height/2);
context.scale(0.9, 0.9);
context.translate(-context.canvas.width/2, -context.canvas.height/2);
context.beginPath();
context.lineWidth = 5 + Math.random() * 10;
context.moveTo(lastX, lastY);
lastX = context.canvas.width * Math.random();
lastY = context.canvas.height * Math.random();
context.bezierCurveTo(context.canvas.width * Math.random(),
context.canvas.height * Math.random(),
context.canvas.width * Math.random(),
context.canvas.height * Math.random(),
lastX, lastY);
hue = hue + 10 * Math.random();
context.strokeStyle = 'hsl(' + hue + ', 50%, 50%)';
context.shadowColor = 'white';
context.shadowBlur = 10;
context.stroke();
context.restore();
}
setInterval(line, 50);
function blank() {
context.fillStyle = 'rgba(0,0,0,0.1)';
context.fillRect(0, 0, context.canvas.width, context.canvas.height);
}
setInterval(blank, 40);
</script>
The 2D rendering context for canvas
is often used for sprite-based games. The
following example demonstrates this:
Here is the source for this example:
EXAMPLE canvas/blue-robot/index.html
ImageBitmap
rendering contextImageBitmapRenderingContext
is a performance-oriented interface that provides a
low overhead method for displaying the contents of ImageBitmap
objects. It uses
transfer semantics to reduce overall memory consumption. It also streamlines performance by
avoiding intermediate compositing, unlike the drawImage()
method of
CanvasRenderingContext2D
.
Using an img
element as an intermediate for getting an image resource into a
canvas, for example, would result in two copies of the decoded image existing in memory at the
same time: the img
element's copy, and the one in the canvas's backing store. This
memory cost can be prohibitive when dealing with extremely large images. This can be avoided by
using ImageBitmapRenderingContext
.
Using ImageBitmapRenderingContext
, here is how to transcode an image to the JPEG
format in a memory- and CPU-efficient way:
createImageBitmap(inputImageBlob).then(image => {
const canvas = document.createElement('canvas');
const context = canvas.getContext('bitmaprenderer');
context.transferFromImageBitmap(image);
canvas.toBlob(outputJPEGBlob => {
// Do something with outputJPEGBlob.
}, 'image/jpeg');
});
ImageBitmapRenderingContext
interface[Exposed=(Window,Worker)]
interface ImageBitmapRenderingContext {
readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
undefined transferFromImageBitmap(ImageBitmap? bitmap);
};
dictionary ImageBitmapRenderingContextSettings {
boolean alpha = true;
};
context = canvas.getContext('bitmaprenderer' [, { [ alpha: false ] } ])
Returns an ImageBitmapRenderingContext
object that is permanently bound to a
particular canvas
element.
If the alpha
setting is
provided and set to false, then the canvas is forced to always be opaque.
context.canvas
Returns the canvas
element that the context is bound to.
context.transferFromImageBitmap(imageBitmap)
Transfers the underlying bitmap data
from imageBitmap to context, and the bitmap becomes the contents of the
canvas
element to which context is bound.
context.transferFromImageBitmap(null)
Replaces contents of the canvas
element to which context is bound
with a transparent black bitmap whose size corresponds to the width
and height
content attributes of the canvas
element.
The canvas
attribute must return the
value it was initialized to when the object was created.
An ImageBitmapRenderingContext
object has an output bitmap, which is a
reference to bitmap data.
An ImageBitmapRenderingContext
object has a bitmap mode, which can be set to
valid or blank. A value of valid indicates that the context's
output bitmap refers to
bitmap data that was acquired via transferFromImageBitmap()
.
A value blank indicates that the
context's output
bitmap is a default transparent bitmap.
An ImageBitmapRenderingContext
object also has an alpha flag, which can be set to true or
false. When an ImageBitmapRenderingContext
object has its alpha flag set to false, the contents
of the canvas
element to which the context is bound are obtained by
compositing the context's output bitmap onto an
opaque black bitmap of the same size using the source-over compositing operator. If the alpha flag is set to true, then the
output bitmap is used as
the contents of the canvas
element to which the context is bound.
COMPOSITE
The step of compositing over an opaque black bitmap ought to be elided whenever equivalent results can be obtained more efficiently by other means.
When a user agent is required to set an ImageBitmapRenderingContext
's output
bitmap, with a context argument that is an
ImageBitmapRenderingContext
object and an optional argument bitmap that
refers to bitmap data, it must run these
steps:
If a bitmap argument was not provided, then:
Set context's bitmap mode to blank.
Let canvas be the canvas
element to which context
is bound.
Set context's output bitmap to be
transparent black with a natural width equal to the numeric value of canvas's width
attribute and a natural height equal
to the numeric value of canvas's
height
attribute, those values being interpreted
in CSS pixels.
Set the output bitmap's origin-clean flag to true.
If a bitmap argument was provided, then:
Set context's bitmap mode to valid.
Set context's output bitmap to refer to the same underlying bitmap data as bitmap, without making a copy.
The origin-clean flag of bitmap is included in the bitmap data to be referenced by context's output bitmap.
The ImageBitmapRenderingContext
creation algorithm, which is passed a
target and options, consists of running these steps:
Let settings be the result of converting options to the dictionary type
ImageBitmapRenderingContextSettings
. (This can throw an exception.)
Let context be a new ImageBitmapRenderingContext
object.
Initialize context's canvas
attribute to point to target.
Set context's output bitmap to the same bitmap as target's bitmap (so that they are shared).
Run the steps to set an ImageBitmapRenderingContext
's output
bitmap with context.
Initialize context's alpha flag to true.
Process each of the members of settings as follows:
alpha
Return context.
The transferFromImageBitmap(bitmap)
method, when invoked, must run these steps:
Let bitmapContext be the ImageBitmapRenderingContext
object on
which the transferFromImageBitmap()
method was called.
If bitmap is null, then run the steps to set an ImageBitmapRenderingContext's output bitmap, with bitmapContext as the context argument and no bitmap argument, then return.
If the value of bitmap's [[Detached]] internal slot is set to
true, then throw an "InvalidStateError
" DOMException
.
Run the steps to set an ImageBitmapRenderingContext
's output
bitmap, with the context argument equal to bitmapContext, and the
bitmap argument referring to bitmap's underlying bitmap data.
Set the value of bitmap's [[Detached]] internal slot to true.
Unset bitmap's bitmap data.
OffscreenCanvas
interfacetypedef (OffscreenCanvasRenderingContext2D or ImageBitmapRenderingContext or WebGLRenderingContext or WebGL2RenderingContext or GPUCanvasContext) OffscreenRenderingContext;
dictionary ImageEncodeOptions {
DOMString type = "image/png";
unrestricted double quality;
};
enum OffscreenRenderingContextId { "2d", "bitmaprenderer", "webgl", "webgl2", "webgpu" };
[Exposed=(Window,Worker), Transferable]
interface OffscreenCanvas : EventTarget {
constructor([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height);
attribute [EnforceRange] unsigned long long width;
attribute [EnforceRange] unsigned long long height;
OffscreenRenderingContext? getContext(OffscreenRenderingContextId contextId, optional any options = null);
ImageBitmap transferToImageBitmap();
Promise<Blob> convertToBlob(optional ImageEncodeOptions options = {});
attribute EventHandler oncontextlost;
attribute EventHandler oncontextrestored;
};
OffscreenCanvas
is an EventTarget
, so both
OffscreenCanvasRenderingContext2D
and WebGL can fire events at it.
OffscreenCanvasRenderingContext2D
can fire contextlost
and contextrestored
, and WebGL can fire webglcontextlost
and webglcontextrestored
.
WEBGL
OffscreenCanvas
objects are used to create rendering contexts, much like an
HTMLCanvasElement
, but with no connection to the DOM. This makes it possible to
use canvas rendering contexts in workers.
An OffscreenCanvas
object may hold a weak reference to a placeholder canvas
element, which is
typically in the DOM, whose embedded content is provided by the OffscreenCanvas
object. The bitmap of the OffscreenCanvas
object is pushed to the placeholder canvas
element as part of
the OffscreenCanvas
's relevant agent's event loop's update the rendering
steps.
offscreenCanvas = new OffscreenCanvas(width,
height)
Returns a new OffscreenCanvas
object that is not linked to a placeholder canvas
element, and whose
bitmap's size is determined by the width and height arguments.
context = offscreenCanvas.getContext(contextId [,
options ])
Returns an object that exposes an API for drawing on the OffscreenCanvas
object.
contextId specifies the desired API: "2d
", "bitmaprenderer
", "webgl
", "webgl2
", or "webgpu
". options is handled by that
API.
This specification defines the "2d
" context below,
which is similar but distinct from the "2d
"
context that is created from a canvas
element. The WebGL specifications define the
"webgl
" and "webgl2
" contexts. WebGPU defines the
"webgpu
" context. WEBGL
WEBGPU
Returns null if the canvas has already been initialized with another context type (e.g.,
trying to get a "2d
" context after getting a
"webgl
" context).
An OffscreenCanvas
object has an internal bitmap that is initialized when the object
is created. The width and height of the bitmap are
equal to the values of the width
and height
attributes of the OffscreenCanvas
object. Initially, all the bitmap's pixels are transparent black.
An OffscreenCanvas
object can have a rendering context bound to it. Initially,
it does not have a bound rendering context. To keep track of whether it has a rendering context
or not, and what kind of rendering context it is, an OffscreenCanvas
object also
has a context mode, which is initially none but can be changed to either 2d, bitmaprenderer, webgl, webgl2, webgpu, or detached by algorithms defined in this
specification.
The constructor OffscreenCanvas(width,
height)
, when invoked, must create a new OffscreenCanvas
object with its bitmap initialized to a rectangular
array of transparent black pixels of the dimensions specified by width and
height; and its width
and height
attributes initialized to width and
height respectively.
OffscreenCanvas
objects are transferable. Their transfer steps, given value and
dataHolder, are as follows:
If value's context mode is
not equal to none, then throw an
"InvalidStateError
" DOMException
.
Set value's context mode to detached.
Let width and height be the dimensions of value's bitmap.
Unset value's bitmap.
Set dataHolder.[[Width]] to width and dataHolder.[[Height]] to height.
Set dataHolder.[[PlaceholderCanvas]] to be a weak reference to
value's placeholder canvas
element, if value has one, or null if it does not.
Their transfer-receiving steps, given dataHolder and value, are:
Initialize value's bitmap to a rectangular array of transparent black pixels with width given by dataHolder.[[Width]] and height given by dataHolder.[[Height]].
If dataHolder.[[PlaceholderCanvas]] is not null, set value's placeholder canvas
element to
dataHolder.[[PlaceholderCanvas]] (while maintaining the weak reference
semantics).
The getContext(contextId,
options)
method of an OffscreenCanvas
object, when invoked,
must run these steps:
If options is not an object, then set options to null.
Set options to the result of converting options to a JavaScript value.
Run the steps in the cell of the following table whose column header matches this
OffscreenCanvas
object's context
mode and whose row header matches contextId:
none | 2d | bitmaprenderer | webgl or webgl2 | webgpu | detached | |
---|---|---|---|---|---|---|
"2d "
|
| Return the same object as was returned the last time the method was invoked with this same first argument. | Return null. | Return null. | Return null. |
Throw an "InvalidStateError " DOMException .
|
"bitmaprenderer "
|
| Return null. | Return the same object as was returned the last time the method was invoked with this same first argument. | Return null. | Return null. |
Throw an "InvalidStateError " DOMException .
|
"webgl " or "webgl2 "
|
| Return null. | Return null. | Return the same value as was returned the last time the method was invoked with this same first argument. | Return null. |
Throw an "InvalidStateError " DOMException .
|
"webgpu "
|
| Return null. | Return null. | Return null. | Return the same value as was returned the last time the method was invoked with this same first argument. |
Throw an "InvalidStateError " DOMException .
|
offscreenCanvas.width [
= value ]
offscreenCanvas.height [
= value ]
These attributes return the dimensions of the OffscreenCanvas
object's bitmap.
They can be set, to replace the bitmap with a new, transparent black bitmap of the specified dimensions (effectively resizing it).
If either the width
or height
attributes of
an OffscreenCanvas
object are set (to a new value or to the same value as before) and
the OffscreenCanvas
object's context
mode is 2d, then reset the rendering
context to its default state and resize the OffscreenCanvas
object's bitmap to the new values of the width
and height
attributes.
The resizing behavior for "webgl
" and "webgl2
" contexts is defined in the WebGL
specifications. WEBGL
The resizing behavior for "webgpu
" context
is defined in WebGPU. WEBGPU
If an OffscreenCanvas
object whose dimensions were changed has
a placeholder canvas
element, then
the placeholder canvas
element's
natural size will only be updated during the
OffscreenCanvas
's relevant agent's event loop's update the rendering steps.
promise = offscreenCanvas.convertToBlob([options])
Returns a promise that will fulfill with a new Blob
object representing a file
containing the image in the OffscreenCanvas
object.
The argument, if provided, is a dictionary that controls the encoding options of the image
file to be created. The type
field specifies the
file format and has a default value of "image/png
"; that type is also used if the
requested type isn't supported. If the image format supports variable quality (such as
"image/jpeg
"), then the quality
field is a number in the range 0.0 to 1.0 inclusive indicating the desired quality level for the
resulting image.
canvas.transferToImageBitmap()
Returns a newly created ImageBitmap
object with the image in the
OffscreenCanvas
object. The image in the OffscreenCanvas
object is
replaced with a new blank image.
The convertToBlob(options)
method,
when invoked, must run the following steps:
If the value of this OffscreenCanvas
object's [[Detached]]
internal slot is set to true, then return a promise rejected with an
"InvalidStateError
" DOMException
.
If this OffscreenCanvas
object's context mode is 2d and the rendering context's bitmap's origin-clean flag is set to false, then return
a promise rejected with a "SecurityError
"
DOMException
.
If this OffscreenCanvas
object's bitmap has no pixels (i.e., either its horizontal
dimension or its vertical dimension is zero) then return a promise rejected with an
"IndexSizeError
" DOMException
.
Let bitmap be a copy of this OffscreenCanvas
object's bitmap.
Let result be a new promise object.
Run these steps in parallel:
Let file be a
serialization of bitmap as a file, with options's type
and quality
if present.
Queue an element task on the canvas blob serialization task
source given the canvas
element to run these steps:
If file is null, then reject result with an
"EncodingError
" DOMException
.
Otherwise, resolve result with a new Blob
object, created in
the relevant realm of this
OffscreenCanvas
object, representing file.
FILEAPI
Return result.
The transferToImageBitmap()
method,
when invoked, must run the following steps:
If the value of this OffscreenCanvas
object's [[Detached]]
internal slot is set to true, then throw an "InvalidStateError
"
DOMException
.
If this OffscreenCanvas
object's context mode is set to none, then throw an
"InvalidStateError
" DOMException
.
Let image be a newly created ImageBitmap
object that references
the same underlying bitmap data as this OffscreenCanvas
object's bitmap.
Set this OffscreenCanvas
object's bitmap to reference a newly created bitmap of the same
dimensions and color space as the previous bitmap, and with its pixels initialized to
transparent black, or opaque black if the rendering context's alpha flag is set to false.
This means that if the rendering context of this OffscreenCanvas
is
a WebGLRenderingContext
, the value of preserveDrawingBuffer
will have no effect.
WEBGL
Return image.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by all objects implementing the
OffscreenCanvas
interface:
Event handler | Event handler event type |
---|---|
oncontextlost | contextlost
|
oncontextrestored | contextrestored
|
[Exposed=(Window,Worker)]
interface OffscreenCanvasRenderingContext2D {
readonly attribute OffscreenCanvas canvas;
};
OffscreenCanvasRenderingContext2D includes CanvasState;
OffscreenCanvasRenderingContext2D includes CanvasTransform;
OffscreenCanvasRenderingContext2D includes CanvasCompositing;
OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing;
OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles;
OffscreenCanvasRenderingContext2D includes CanvasShadowStyles;
OffscreenCanvasRenderingContext2D includes CanvasFilters;
OffscreenCanvasRenderingContext2D includes CanvasRect;
OffscreenCanvasRenderingContext2D includes CanvasDrawPath;
OffscreenCanvasRenderingContext2D includes CanvasText;
OffscreenCanvasRenderingContext2D includes CanvasDrawImage;
OffscreenCanvasRenderingContext2D includes CanvasImageData;
OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles;
OffscreenCanvasRenderingContext2D includes CanvasTextDrawingStyles;
OffscreenCanvasRenderingContext2D includes CanvasPath;
The OffscreenCanvasRenderingContext2D
object is a rendering context for drawing to
the bitmap of an OffscreenCanvas
object.
It is similar to the CanvasRenderingContext2D
object, with the following
differences:
there is no support for user interface features;
its canvas
attribute refers to an
OffscreenCanvas
object rather than a canvas
element;
An OffscreenCanvasRenderingContext2D
object has a bitmap that is initialized when the object is
created.
The bitmap has an origin-clean flag, which can be set to true or false. Initially, when one of these bitmaps is created, its origin-clean flag must be set to true.
An OffscreenCanvasRenderingContext2D
object also has an alpha flag, which can be set to true or false. Initially,
when the context is created, its alpha flag must be set to true. When an
OffscreenCanvasRenderingContext2D
object has its alpha flag set to false, then its alpha channel must be
fixed to 1.0 (fully opaque) for all pixels, and attempts to change the alpha component of any pixel
must be silently ignored.
An OffscreenCanvasRenderingContext2D
object also has a color space setting of type
PredefinedColorSpace
. The color space for the context's bitmap is set to the context's color space.
An OffscreenCanvasRenderingContext2D
object has an associated
OffscreenCanvas
object, which is the OffscreenCanvas
object
from which the OffscreenCanvasRenderingContext2D
object was created.
offscreenCanvas = offscreenCanvasRenderingContext2D.canvas
Returns the associated OffscreenCanvas
object.
The offscreen 2D context creation algorithm, which is passed a
target (an OffscreenCanvas
object) and optionally some arguments,
consists of running the following steps:
If the algorithm was passed some arguments, let arg be the first such argument. Otherwise, let arg be undefined.
Let settings be the result of converting arg to the dictionary type
CanvasRenderingContext2DSettings
. (This can throw an exception.).
Let context be a new OffscreenCanvasRenderingContext2D
object.
Set context's associated OffscreenCanvas
object to
target.
If settings["alpha
"] is false, then set
context's alpha flag to false.
Set context's color space
to settings["colorSpace
"].
Set context's bitmap to a newly
created bitmap with the dimensions specified by the width
and height
attributes of target, and set
target's bitmap to the same bitmap (so that they are shared).
If context's alpha flag is set to true, initialize all the pixels of context's bitmap to transparent black. Otherwise, initialize the pixels to opaque black.
Return context.
Implementations are encouraged to short-circuit the graphics update steps of
the window event loop for the purposes of updating the contents of a placeholder canvas
element to the
display. This could mean, for example, that the bitmap contents are copied directly to a graphics
buffer that is mapped to the physical display location of the placeholder canvas
element. This or
similar short-circuiting approaches can significantly reduce display latency, especially in cases
where the OffscreenCanvas
is updated from a
worker event loop and the window event loop of the placeholder canvas
element is busy.
However, such shortcuts cannot have any script-observable side-effects. This means that the
committed bitmap still needs to be sent to the placeholder canvas
element, in case the
element is used as a CanvasImageSource
, as an ImageBitmapSource
, or in
case toDataURL()
or toBlob()
are called on it.
The canvas
attribute, on getting, must return this
OffscreenCanvasRenderingContext2D
's associated OffscreenCanvas
object.
The canvas
APIs provide mechanisms for specifying the color space of the canvas's
backing store. The default backing store color space for all canvas APIs is
'srgb'.
Color space conversion must be applied to the canvas's
backing store when rendering the canvas to the output device. This color space conversion must be
identical to the color space conversion that would be applied to an img
element with
a color profile that specifies the same color
space as the canvas's backing store.
When drawing content to a 2D context, all inputs must be converted to the context's color space before drawing. Interpolation of gradient color stops must be performed on color values after conversion to the context's color space. Alpha blending must be performed on values after conversion to the context's color space.
There do not exist any inputs to a 2D context for which the color space is undefined. The color space for CSS colors is defined in CSS Color. The color space for images that specify no color profile information is assumed to be 'srgb', as specified in the Color Spaces of Untagged Colors section of CSS Color. CSSCOLOR
When a user agent is to create a serialization of the bitmap as a file, given a type and an optional quality, it must create an image file in the format given by type. If an error occurs during the creation of the image file (e.g. an internal encoder error), then the result of the serialization is null. PNG
The image file's pixel data must be the bitmap's pixel data scaled to one image pixel per coordinate space unit, and if the file format used supports encoding resolution metadata, the resolution must be given as 96dpi (one image pixel per CSS pixel).
If type is supplied, then it must be interpreted as a MIME type giving the format to use. If the type has any parameters, then it must be treated as not supported.
For example, the value "image/png
" would mean to generate a PNG
image, the value "image/jpeg
" would mean to generate a JPEG image, and the value
"image/svg+xml
" would mean to generate an SVG image (which would require that the
user agent track how the bitmap was generated, an unlikely, though potentially awesome,
feature).
User agents must support PNG ("image/png
"). User agents may support other types.
If the user agent does not support the requested type, then it must create the file using the PNG
format. PNG
User agents must convert the provided type to ASCII lowercase before establishing if they support that type.
For image types that do not support an alpha channel, the serialized image must be the bitmap image composited onto an opaque black background using the source-over compositing operator.
For image types that support color profiles, the serialized image must include a color profile indicating the color space of the underlying bitmap. For image types that do not support color profiles, the serialized image must be converted to the 'srgb' color space using 'relative-colorimetric' rendering intent.
Thus, in the 2D context, calling the drawImage()
method to render the output of the toDataURL()
or toBlob()
method to the canvas, given the appropriate dimensions,
has no visible effect beyond, at most, clipping colors of the canvas to a more narrow gamut.
If type is an image format that supports variable quality (such as
"image/jpeg
"), quality is given, and type is not
"image/png
", then, if quality is a Number
in the range 0.0 to 1.0 inclusive, the user agent must treat quality as the desired
quality level. Otherwise, the user agent must use its default quality value, as if the
quality argument had not been given.
The use of type-testing here, instead of simply declaring quality as
a Web IDL double
, is a historical artifact.
Different implementations can have slightly different interpretations of "quality". When the quality is not specified, an implementation-specific default is used that represents a reasonable compromise between compression ratio, image quality, and encoding time.
canvas
elementsInformation leakage can occur if scripts from one origin can access information (e.g. read pixels) from images from another origin (one that isn't the same).
To mitigate this, bitmaps used with canvas
elements, OffscreenCanvas
objects, and ImageBitmap
objects are defined to have a flag indicating whether they
are origin-clean. All bitmaps start with their
origin-clean set to true. The flag is set to
false when cross-origin images are used.
The toDataURL()
, toBlob()
, and getImageData()
methods check the flag and will
throw a "SecurityError
" DOMException
rather than leak
cross-origin data.
The value of the origin-clean flag is
propagated from a source's bitmap to a new ImageBitmap
object by createImageBitmap()
. Conversely, a destination canvas
element's bitmap will have its origin-clean flags set to false by drawImage
if the source image is an
ImageBitmap
object whose bitmap has its origin-clean flag set to false.
The flag can be reset in certain situations; for example, when changing the value of the
width
or the height
content attribute of the canvas
element
to which a CanvasRenderingContext2D
is bound, the bitmap is
cleared and its origin-clean flag is reset.
When using an ImageBitmapRenderingContext
, the value of the origin-clean flag is propagated from
ImageBitmap
objects when they are transferred to the canvas
via transferFromImageBitmap().
Premultiplied alpha refers to one way of representing transparency in an image, the other being non-premultiplied alpha.
Under non-premultiplied alpha, the red, green, and blue channels of a pixel represent that pixel's color, and its alpha channel represents that pixel's opacity.
Under premultiplied alpha, however, the red, green, and blue channels of a pixel represent the amounts of color that the pixel adds to the image, and its alpha channel represents the amount that the pixel obscures whatever is behind it.
For instance, assuming the color channels range from 0 (off) to 255 (full intensity), these example colors are represented in the following ways:
CSS color representation | Premultiplied representation | Non-premultiplied representation | Description of color | Image of color blended above other content |
---|---|---|---|---|
rgba(255, 127, 0, 1) | 255, 127, 0, 255 | 255, 127, 0, 255 | Completely-opaque orange | |
rgba(255, 255, 0, 0.5) | 127, 127, 0, 127 | 255, 255, 0, 127 | Halfway-opaque yellow | |
Unrepresentable | 255, 127, 0, 127 | Unrepresentable | Additive halfway-opaque orange | |
Unrepresentable | 255, 127, 0, 0 | Unrepresentable | Additive fully-transparent orange | |
rgba(255, 127, 0, 0) | 0, 0, 0, 0 | 255, 127, 0, 0 | Fully-transparent ("invisible") orange | |
rgba(0, 127, 255, 0) | 0, 0, 0, 0 | 255, 127, 0, 0 | Fully-transparent ("invisible") turquoise |
Converting a color value from a non-premultiplied representation to a premultiplied one involves multiplying the color's red, green, and blue channels by its alpha channel (remapping the range of the alpha channel such that "fully transparent" is 0, and "fully opaque" is 1).
Converting a color value from a premultiplied representation to a non-premultiplied one involves the inverse: dividing the color's red, green, and blue channels by its alpha channel.
As certain colors can only be represented under premultiplied alpha (for instance, additive colors), and others can only be represented under non-premultiplied alpha (for instance, "invisible" colors which hold certain red, green, and blue values even with no opacity); and division and multiplication on 8-bit integers (which is how canvas's colors are currently stored) entails a loss of precision, converting between premultiplied and non-premultiplied alpha is a lossy operation on colors that are not fully opaque.
A CanvasRenderingContext2D
's output bitmap and an
OffscreenCanvasRenderingContext2D
's bitmap must use premultiplied alpha to represent transparent colors.
It is important for canvas bitmaps to represent colors using premultiplied alpha
because it affects the range of representable colors. While additive colors cannot currently be
drawn onto canvases directly because CSS colors are non-premultiplied and cannot represent them,
it is still possible to, for instance, draw additive colors onto a WebGL canvas and then draw that
WebGL canvas onto a 2D canvas via drawImage()
.
Custom elements provide a way for authors to build their own fully-featured DOM elements. Although authors could always use non-standard elements in their documents, with application-specific behavior added after the fact by scripting or similar, such elements have historically been non-conforming and not very functional. By defining a custom element, authors can inform the parser how to properly construct an element and how elements of that class should react to changes.
Custom elements are part of a larger effort to "rationalise the platform", by explaining existing platform features (like the elements of HTML) in terms of lower-level author-exposed extensibility points (like custom element definition). Although today there are many limitations on the capabilities of custom elements—both functionally and semantically—that prevent them from fully explaining the behaviors of HTML's existing elements, we hope to shrink this gap over time.
For the purposes of illustrating how to create an autonomous custom element, let's define a custom element that encapsulates rendering a small icon for a country flag. Our goal is to be able to use it like so:
<flag-icon country="nl"></flag-icon>
To do this, we first declare a class for the custom element, extending
HTMLElement
:
class FlagIcon extends HTMLElement {
constructor() {
super();
this._countryCode = null;
}
static observedAttributes = ["country"];
attributeChangedCallback(name, oldValue, newValue) {
// name will always be "country" due to observedAttributes
this._countryCode = newValue;
this._updateRendering();
}
connectedCallback() {
this._updateRendering();
}
get country() {
return this._countryCode;
}
set country(v) {
this.setAttribute("country", v);
}
_updateRendering() {
// Left as an exercise for the reader. But, you'll probably want to
// check this.ownerDocument.defaultView to see if we've been
// inserted into a document with a browsing context, and avoid
// doing any work if not.
}
}
We then need to use this class to define the element:
customElements.define("flag-icon", FlagIcon);
At this point, our above code will work! The parser, whenever it sees the flag-icon
tag, will construct a new instance of our FlagIcon
class, and tell our code about its new country
attribute, which we then use to set the element's internal state and update its rendering (when
appropriate).
You can also create flag-icon
elements using the DOM API:
const flagIcon = document.createElement("flag-icon")
flagIcon.country = "jp"
document.body.appendChild(flagIcon)
Finally, we can also use the custom element constructor itself. That is, the above code is equivalent to:
const flagIcon = new FlagIcon()
flagIcon.country = "jp"
document.body.appendChild(flagIcon)
Adding a static formAssociated
property, with a true value, makes an
autonomous custom element a form-associated custom element. The
ElementInternals
interface helps you to implement functions and properties common
to form control elements.
class MyCheckbox extends HTMLElement {
static formAssociated = true;
static observedAttributes = ['checked'];
constructor() {
super();
this._internals = this.attachInternals();
this.addEventListener('click', this._onClick.bind(this));
}
get form() { return this._internals.form; }
get name() { return this.getAttribute('name'); }
get type() { return this.localName; }
get checked() { return this.hasAttribute('checked'); }
set checked(flag) { this.toggleAttribute('checked', Boolean(flag)); }
attributeChangedCallback(name, oldValue, newValue) {
// name will always be "checked" due to observedAttributes
this._internals.setFormValue(this.checked ? 'on' : null);
}
_onClick(event) {
this.checked = !this.checked;
}
}
customElements.define('my-checkbox', MyCheckbox);
You can use the custom element my-checkbox
like a built-in
form-associated element. For example, putting it in form
or label
associates the my-checkbox
element with them, and submitting the
form
will send data provided by my-checkbox
implementation.
<form action="..." method="...">
<label><my-checkbox name="agreed"></my-checkbox> I read the agreement.</label>
<input type="submit">
</form>
By using the appropriate properties of ElementInternals
, your custom element can
have default accessibility semantics. The following code expands our form-associated checkbox from
the previous section to properly set its default role and checkedness, as viewed by accessibility
technology:
class MyCheckbox extends HTMLElement {
static formAssociated = true;
static observedAttributes = ['checked'];
constructor() {
super();
this._internals = this.attachInternals();
this.addEventListener('click', this._onClick.bind(this));
this._internals.role = 'checkbox';
this._internals.ariaChecked = 'false';
}
get form() { return this._internals.form; }
get name() { return this.getAttribute('name'); }
get type() { return this.localName; }
get checked() { return this.hasAttribute('checked'); }
set checked(flag) { this.toggleAttribute('checked', Boolean(flag)); }
attributeChangedCallback(name, oldValue, newValue) {
// name will always be "checked" due to observedAttributes
this._internals.setFormValue(this.checked ? 'on' : null);
this._internals.ariaChecked = this.checked;
}
_onClick(event) {
this.checked = !this.checked;
}
}
customElements.define('my-checkbox', MyCheckbox);
Note that, like for built-in elements, these are only defaults, and can be overridden by the
page author using the role
and aria-*
attributes:
<!-- This markup is non-conforming -->
<input type="checkbox" checked role="button" aria-checked="false">
<!-- This markup is probably not what the custom element author intended -->
<my-checkbox role="button" checked aria-checked="false">
Custom element authors are encouraged to state what aspects of their accessibility semantics
are strong native semantics, i.e., should not be overridden by users of the custom element. In our
example, the author of the my-checkbox
element would state that its
role and aria-checked
values are strong
native semantics, thus discouraging code such as the above.
Customized built-in elements are a distinct kind of custom element, which are defined slightly differently and used very differently compared to autonomous custom elements. They exist to allow reuse of behaviors from the existing elements of HTML, by extending those elements with new custom functionality. This is important since many of the existing behaviors of HTML elements can unfortunately not be duplicated by using purely autonomous custom elements. Instead, customized built-in elements allow the installation of custom construction behavior, lifecycle hooks, and prototype chain onto existing elements, essentially "mixing in" these capabilities on top of the already-existing element.
Customized built-in elements require a distinct syntax from autonomous custom elements because user agents and other software key off an element's local name in order to identify the element's semantics and behavior. That is, the concept of customized built-in elements building on top of existing behavior depends crucially on the extended elements retaining their original local name.
In this example, we'll be creating a customized built-in element named plastic-button
, which behaves like a normal button but gets fancy animation
effects added whenever you click on it. We start by defining a class, just like before, although
this time we extend HTMLButtonElement
instead of HTMLElement
:
class PlasticButton extends HTMLButtonElement {
constructor() {
super();
this.addEventListener("click", () => {
// Draw some fancy animation effects!
});
}
}
When defining our custom element, we have to also specify the extends
option:
customElements.define("plastic-button", PlasticButton, { extends: "button" });
In general, the name of the element being extended cannot be determined simply by looking at
what element interface it extends, as many elements share the same interface (such as
q
and blockquote
both sharing HTMLQuoteElement
).
To construct our customized built-in element from parsed HTML source text, we use
the is
attribute on a button
element:
<button is="plastic-button">Click Me!</button>
Trying to use a customized built-in element as an autonomous custom
element will not work; that is, <plastic-button>Click
me?</plastic-button>
will simply create an HTMLElement
with no special
behavior.
If you need to create a customized built-in element programmatically, you can use the following
form of createElement()
:
const plasticButton = document.createElement("button", { is: "plastic-button" });
plasticButton.textContent = "Click me!";
And as before, the constructor will also work:
const plasticButton2 = new PlasticButton();
console.log(plasticButton2.localName); // will output "button"
console.assert(plasticButton2 instanceof PlasticButton);
console.assert(plasticButton2 instanceof HTMLButtonElement);
Note that when creating a customized built-in element programmatically, the is
attribute will not be present in the DOM, since it was not explicitly
set. However, it will be added to the output when
serializing:
console.assert(!plasticButton.hasAttribute("is"));
console.log(plasticButton.outerHTML); // will output '<button is="plastic-button"></button>'
Regardless of how it is created, all of the ways in which button
is special
apply to such "plastic buttons" as well: their focus behavior, ability to participate in form submission, the disabled
attribute, and so on.
Customized built-in elements are designed to allow extension of existing HTML
elements that have useful user-agent supplied behavior or APIs. As such, they can only extend
existing HTML elements defined in this specification, and cannot extend legacy elements such as
bgsound
, blink
, isindex
, keygen
,
multicol
, nextid
, or spacer
that have been defined to use
HTMLUnknownElement
as their element interface.
One reason for this requirement is future-compatibility: if a customized built-in
element was defined that extended a currently-unknown element, for example combobox
, this would prevent this specification from defining a combobox
element in the future, as consumers of the derived customized
built-in element would have come to depend on their base element having no interesting
user-agent-supplied behavior.
As specified below, and alluded to above, simply defining and using an element called
taco-button
does not mean that such elements represent buttons. That is, tools such as web browsers, search engines,
or accessibility technology will not automatically treat the resulting element as a button just
based on its defined name.
To convey the desired button semantics to a variety of users, while still using an autonomous custom element, a number of techniques would need to be employed:
The addition of the tabindex
attribute would make the
taco-button
focusable. Note that if the
taco-button
were to become logically disabled, the tabindex
attribute would need to be removed.
The addition of an ARIA role and various ARIA states and properties helps convey semantics
to accessibility technology. For example, setting the role to "button
" will convey the semantics that this is a button,
enabling users to successfully interact with the control using usual button-like interactions in
their accessibility technology. Setting the aria-label
property is necessary to give the button an accessible
name, instead of having accessibility technology traverse its child text nodes and
announce them. And setting the aria-disabled
state to
"true
" when the button is logically disabled conveys to accessibility
technology the button's disabled state.
The addition of event handlers to handle commonly-expected button behaviors helps convey
the semantics of the button to web browser users. In this case, the most relevant event handler
would be one that proxies appropriate keydown
events to
become click
events, so that you can activate the button both
with keyboard and by clicking.
In addition to any default visual styling provided for taco-button
elements, the visual styling will also need to be updated to reflect changes in logical state,
such as becoming disabled; that is, whatever style sheet has rules for taco-button
will also need to have rules for taco-button[disabled]
.
With these points in mind, a full-featured taco-button
that took on the
responsibility of conveying button semantics (including the ability to be disabled) might look
something like this:
class TacoButton extends HTMLElement {
static observedAttributes = ["disabled"];
constructor() {
super();
this._internals = this.attachInternals();
this._internals.role = "button";
this.addEventListener("keydown", e => {
if (e.code === "Enter" || e.code === "Space") {
this.dispatchEvent(new PointerEvent("click", {
bubbles: true,
cancelable: true
}));
}
});
this.addEventListener("click", e => {
if (this.disabled) {
e.preventDefault();
e.stopImmediatePropagation();
}
});
this._observer = new MutationObserver(() => {
this._internals.ariaLabel = this.textContent;
});
}
connectedCallback() {
this.setAttribute("tabindex", "0");
this._observer.observe(this, {
childList: true,
characterData: true,
subtree: true
});
}
disconnectedCallback() {
this._observer.disconnect();
}
get disabled() {
return this.hasAttribute("disabled");
}
set disabled(flag) {
this.toggleAttribute("disabled", Boolean(flag));
}
attributeChangedCallback(name, oldValue, newValue) {
// name will always be "disabled" due to observedAttributes
if (this.disabled) {
this.removeAttribute("tabindex");
this._internals.ariaDisabled = "true";
} else {
this.setAttribute("tabindex", "0");
this._internals.ariaDisabled = "false";
}
}
}
Even with this rather-complicated element definition, the element is not a pleasure to use for
consumers: it will be continually "sprouting" tabindex
attributes of its own volition, and its choice of tabindex="0"
focusability
behavior may not match the button
behavior on the current platform. This is because
as of now there is no way to specify default focus behavior for custom elements, forcing the use
of the tabindex
attribute to do so (even though it is usually
reserved for allowing the consumer to override default behavior).
In contrast, a simple customized built-in element, as shown in the previous
section, would automatically inherit the semantics and behavior of the button
element, with no need to implement these behaviors manually. In general, for any elements with
nontrivial behavior and semantics that build on top of existing elements of HTML, customized built-in elements will be easier to
develop, maintain, and consume.
Because element definition can occur at any time, a non-custom element could be created, and then later become a custom element after an appropriate definition is registered. We call this process "upgrading" the element, from a normal element into a custom element.
Upgrades enable scenarios where it may be
preferable for custom element definitions to be
registered after relevant elements have been initially created, such as by the parser. They allow
progressive enhancement of the content in the custom element. For example, in the following HTML
document the element definition for img-viewer
is loaded
asynchronously:
<!DOCTYPE html>
<html lang="en">
<title>Image viewer example</title>
<img-viewer filter="Kelvin">
<img src="images/tree.jpg" alt="A beautiful tree towering over an empty savannah">
</img-viewer>
<script src="js/elements/img-viewer.js" async></script>
The definition for the img-viewer
element here is loaded using a
script
element marked with the async
attribute, placed after the <img-viewer>
tag in the markup. While the
script is loading, the img-viewer
element will be treated as an undefined
element, similar to a span
. Once the script loads, it will define the img-viewer
element, and the existing img-viewer
element on
the page will be upgraded, applying the custom element's definition (which presumably includes
applying an image filter identified by the string "Kelvin", enhancing the image's visual
appearance).
Note that upgrades only apply to elements in the document tree. (Formally, elements that are connected.) An element that is not inserted into a document will stay un-upgraded. An example illustrates this point:
<!DOCTYPE html>
<html lang="en">
<title>Upgrade edge-cases example</title>
<example-element></example-element>
<script>
"use strict";
const inDocument = document.querySelector("example-element");
const outOfDocument = document.createElement("example-element");
// Before the element definition, both are HTMLElement:
console.assert(inDocument instanceof HTMLElement);
console.assert(outOfDocument instanceof HTMLElement);
class ExampleElement extends HTMLElement {}
customElements.define("example-element", ExampleElement);
// After element definition, the in-document element was upgraded:
console.assert(inDocument instanceof ExampleElement);
console.assert(!(outOfDocument instanceof ExampleElement));
document.body.appendChild(outOfDocument);
// Now that we've moved the element into the document, it too was upgraded:
console.assert(outOfDocument instanceof ExampleElement);
</script>
Built-in elements provided by user agents have certain states that can change over time
depending on user interaction and other factors, and are exposed to web authors through pseudo-classes. For example, some form controls have the "invalid"
state, which is exposed through the :invalid
pseudo-class.
Like built-in elements, custom elements can have various states to be in too, and custom element authors want to expose these states in a similar fashion as the built-in elements.
This is done via the :state()
pseudo-class. A custom
element author can use the states
property of
ElementInternals
to add and remove such custom states, which are then exposed as
arguments to the :state()
pseudo-class.
The following shows how :state()
can be used to style a
custom checkbox element. Assume that LabeledCheckbox
doesn't expose its
"checked" state via a content attribute.
<script>
class LabeledCheckbox extends HTMLElement {
constructor() {
super();
this._internals = this.attachInternals();
this.addEventListener('click', this._onClick.bind(this));
const shadowRoot = this.attachShadow({mode: 'closed'});
shadowRoot.innerHTML =
`<style>
:host::before {
content: '[ ]';
white-space: pre;
font-family: monospace;
}
:host(:state(checked))::before { content: '[x]' }
</style>
<slot>Label</slot>`;
}
get checked() { return this._internals.states.has('checked'); }
set checked(flag) {
if (flag)
this._internals.states.add('checked');
else
this._internals.states.delete('checked');
}
_onClick(event) {
this.checked = !this.checked;
}
}
customElements.define('labeled-checkbox', LabeledCheckbox);
</script>
<style>
labeled-checkbox { border: dashed red; }
labeled-checkbox:state(checked) { border: solid; }
</style>
<labeled-checkbox>You need to check this</labeled-checkbox>
Custom pseudo-classes can even target shadow parts. An extension of the above example shows this:
<script>
class QuestionBox extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({mode: 'closed'});
shadowRoot.innerHTML =
`<div><slot>Question</slot></div>
<labeled-checkbox part='checkbox'>Yes</labeled-checkbox>`;
}
}
customElements.define('question-box', QuestionBox);
</script>
<style>
question-box::part(checkbox) { color: red; }
question-box::part(checkbox):state(checked) { color: green; }
</style>
<question-box>Continue?</question-box>
When authoring custom element constructors, authors are bound by the following conformance requirements:
A parameter-less call to super()
must be the first statement in the
constructor body, to establish the correct prototype chain and this value before any
further code is run.
A return
statement must not appear anywhere inside the constructor
body, unless it is a simple early-return (return
or return
this
).
The constructor must not use the document.write()
or document.open()
methods.
The element's attributes and children must not be inspected, as in the non-upgrade case none will be present, and relying on upgrades makes the element less usable.
The element must not gain any attributes or children, as this violates the expectations of
consumers who use the createElement
or createElementNS
methods.
In general, work should be deferred to connectedCallback
as much as
possible—especially work involving fetching resources or rendering. However, note that connectedCallback
can be called more than once, so any initialization work that
is truly one-time will need a guard to prevent it from running twice.
In general, the constructor should be used to set up initial state and default values, and to set up event listeners and possibly a shadow root.
Several of these requirements are checked during element creation, either directly or indirectly, and failing to follow them will result in a custom element that cannot be instantiated by the parser or DOM APIs. This is true even if the work is done inside a constructor-initiated microtask, as a microtask checkpoint can occur immediately after construction.
When authoring custom element reactions, authors should avoid manipulating the node tree as this can lead to unexpected results.
An element's connectedCallback
can be queued before the element is
disconnected, but as the callback queue is still processed, it results in a connectedCallback
for an element that is no longer connected:
class CParent extends HTMLElement {
connectedCallback() {
this.firstChild.remove();
}
}
customElements.define("c-parent", CParent);
class CChild extends HTMLElement {
connectedCallback() {
console.log("CChild connectedCallback: isConnected =", this.isConnected);
}
}
customElements.define("c-child", CChild);
const parent = new CParent(),
child = new CChild();
parent.append(child);
document.body.append(parent);
// Logs:
// CChild connectedCallback: isConnected = false
A custom element is an element that is custom. Informally, this means that its constructor and prototype are defined by the author, instead of by the user agent. This author-supplied constructor function is called the custom element constructor.
Two distinct types of custom elements can be defined:
An autonomous custom element, which is defined with no extends
option. These types of custom elements have a local name equal to their
defined name.
A customized built-in element, which is defined with an extends
option. These types of custom elements have a local name equal to the
value passed in their extends
option, and their defined name is used as the value of the
is
attribute, which
therefore must be a valid custom element name.
After a custom element is created,
changing the value of the is
attribute does not
change the element's behavior, as it is saved on the element as its is
value.
Autonomous custom elements have the following element definition:
is
attributeform
, for form-associated custom elementsdisabled
, for form-associated custom elementsreadonly
, for form-associated custom elementsname
, for form-associated custom elementsHTMLElement
)An autonomous custom element does not have any special meaning: it represents its children. A customized built-in element inherits the semantics of the element that it extends.
Any namespace-less attribute that is relevant to the element's functioning, as determined by
the element's author, may be specified on an autonomous custom element, so long as
the attribute name is XML-compatible and contains no ASCII upper alphas. The exception is the is
attribute,
which must not be specified on an autonomous custom element (and which will have no
effect if it is).
Customized built-in elements follow the
normal requirements for attributes, based on the elements they extend. To add custom
attribute-based behavior, use data-*
attributes.
An autonomous custom element is called a form-associated custom element if the element is associated with a custom element definition whose form-associated field is set to true.
The name
attribute represents the form-associated
custom element's name. The disabled
attribute is
used to make the form-associated custom element non-interactive and to prevent its
submission value from being submitted. The form
attribute is used to explicitly associate the
form-associated custom element with its form owner.
The readonly
attribute of form-associated custom elements specifies that the element is barred
from constraint validation. User agents don't provide any other behavior for the attribute,
but custom element authors should, where possible, use its presence to make their control
non-editable in some appropriate fashion, similar to the behavior for the readonly attribute on built-in form controls.
Constraint validation: If the readonly
attribute is specified on a form-associated
custom element, the element is barred from constraint validation.
The reset algorithm for form-associated custom elements is to enqueue
a custom element callback reaction with the element, callback name "formResetCallback
", and an empty argument list.
A valid custom element name is a sequence of characters name that meets all of the following requirements:
name must match the PotentialCustomElementName
production:
PotentialCustomElementName ::=
[a-z] (PCENChar)* '-'
(PCENChar)*
PCENChar ::=
"-" | "." | [0-9] | "_" | [a-z] | #xB7 | [#xC0-#xD6] | [#xD8-#xF6] |
[#xF8-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x203F-#x2040] | [#x2070-#x218F] |
[#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
[#x10000-#xEFFFF]
This uses the EBNF notation from the XML specification. XML
name must not be any of the following:
annotation-xml
color-profile
font-face
font-face-src
font-face-uri
font-face-format
font-face-name
missing-glyph
The list of names above is the summary of all hyphen-containing element names from the applicable specifications, namely SVG 2 and MathML. SVG MATHML
These requirements ensure a number of goals for valid custom element names:
They start with an ASCII lower alpha, ensuring that the HTML parser will treat them as tags instead of as text.
They do not contain any ASCII upper alphas, ensuring that the user agent can always treat HTML elements ASCII-case-insensitively.
They contain a hyphen, used for namespacing and to ensure forward compatibility (since no elements will be added to HTML, SVG, or MathML with hyphen-containing local names in the future).
They can always be created with createElement()
and createElementNS()
, which have restrictions that go
beyond the parser's.
Apart from these restrictions, a large variety of names is allowed, to give maximum
flexibility for use cases like <math-α>
or <emotion-😍>
.
A custom element definition describes a custom element and consists of:
CustomElementConstructor
callback function type value wrapping
the custom element constructorsequence<DOMString>
connectedCallback
",
"disconnectedCallback
", "adoptedCallback
",
"attributeChangedCallback
",
"formAssociatedCallback
",
"formDisabledCallback
",
"formResetCallback
", and "formStateRestoreCallback
".
The corresponding values are either a Web IDL Function
callback function type value, or null. By default the value of each entry is null.attachInternals()
.
attachShadow()
.
To look up a custom element definition, given a document, namespace, localName, and is, perform the following steps. They will return either a custom element definition or null:
If namespace is not the HTML namespace, return null.
If document's browsing context is null, return null.
Let registry be document's relevant global object's
CustomElementRegistry
object.
If there is a custom element definition in registry with name and local name both equal to localName, return that custom element definition.
If there is a custom element definition in registry with name equal to is and local name equal to localName, return that custom element definition.
Return null.
CustomElementRegistry
interfaceEach Window
object is associated with a unique instance of a
CustomElementRegistry
object, allocated when the Window
object is
created.
Custom element registries are associated with Window
objects, instead
of Document
objects, since each custom element constructor inherits from
the HTMLElement
interface, and there is exactly one HTMLElement
interface per Window
object.
The customElements
attribute of the
Window
interface must return the CustomElementRegistry
object for that
Window
object.
[Exposed=Window]
interface CustomElementRegistry {
[CEReactions] undefined define(DOMString name, CustomElementConstructor constructor, optional ElementDefinitionOptions options = {});
(CustomElementConstructor or undefined) get(DOMString name);
DOMString? getName(CustomElementConstructor constructor);
Promise<CustomElementConstructor> whenDefined(DOMString name);
[CEReactions] undefined upgrade(Node root);
};
callback CustomElementConstructor = HTMLElement ();
dictionary ElementDefinitionOptions {
DOMString extends;
};
Every CustomElementRegistry
has a set of custom element definitions, initially empty. In general, algorithms in this
specification look up elements in the registry by any of name, local name, or constructor.
Every CustomElementRegistry
also has an element definition is running
flag which is used to prevent reentrant invocations of element definition. It is
initially unset.
Every CustomElementRegistry
also has a when-defined promise map,
mapping valid custom element names to promises. It
is used to implement the whenDefined()
method.
window.customElements.define(name,
constructor)
window.customElements.define(name, constructor,
{ extends: baseLocalName })
NotSupportedError
"
DOMException
will be thrown upon trying to extend a custom element or
an unknown element.window.customElements.get(name)
window.customElements.getName(constructor)
window.customElements.whenDefined(name)
SyntaxError
" DOMException
if not
given a valid custom element name.window.customElements.upgrade(root)
Element definition is a process of adding a custom element definition
to the CustomElementRegistry
. This is accomplished by the define()
method. When invoked,
the define(name, constructor,
options)
method must run these steps:
If IsConstructor(constructor) is false, then throw a
TypeError
.
If name is not a valid custom element name, then throw a
"SyntaxError
" DOMException
.
If this CustomElementRegistry
contains an entry with name name, then throw a
"NotSupportedError
" DOMException
.
If this CustomElementRegistry
contains an entry with constructor constructor,
then throw a "NotSupportedError
" DOMException
.
Let localName be name.
Let extends be the value of the extends
member of
options, or null if no such member exists.
If extends is not null, then:
If extends is a valid custom element name, then throw a
"NotSupportedError
" DOMException
.
If the element interface for extends and the HTML
namespace is HTMLUnknownElement
(e.g., if extends does not
indicate an element definition in this specification), then throw a
"NotSupportedError
" DOMException
.
Set localName to extends.
If this CustomElementRegistry
's element definition is running
flag is set, then throw a "NotSupportedError
" DOMException
.
Set this CustomElementRegistry
's element definition is running
flag.
Let formAssociated be false.
Let disableInternals be false.
Let disableShadow be false.
Let observedAttributes be an empty sequence<DOMString>
.
Run the following substeps while catching any exceptions:
Let prototype be ? Get(constructor, "prototype").
If prototype is not an Object, then throw a
TypeError
exception.
Let lifecycleCallbacks be a map with the keys "connectedCallback
", "disconnectedCallback
", "adoptedCallback
", and "attributeChangedCallback
", each
of which belongs to an entry whose value is null.
For each of the keys callbackName in lifecycleCallbacks, in the order listed in the previous step:
Let callbackValue be ? Get(prototype, callbackName).
If callbackValue is not undefined, then set the value of the entry in
lifecycleCallbacks with key callbackName to the result of converting callbackValue to the Web IDL
Function
callback type. Rethrow any exceptions from the
conversion.
If the value of the entry in lifecycleCallbacks with key "attributeChangedCallback
" is not null, then:
Let observedAttributesIterable be ? Get(constructor, "observedAttributes").
If observedAttributesIterable is not undefined, then set
observedAttributes to the result of converting observedAttributesIterable to a
sequence<DOMString>
. Rethrow any exceptions from the
conversion.
Let disabledFeatures be an empty sequence<DOMString>
.
Let disabledFeaturesIterable be ? Get(constructor, "disabledFeatures").
If disabledFeaturesIterable is not undefined, then set
disabledFeatures to the result of converting disabledFeaturesIterable to a sequence<DOMString>
. Rethrow any exceptions from the conversion.
Set disableInternals to true if disabledFeatures contains "internals
".
Set disableShadow to true if disabledFeatures contains "shadow
".
Let formAssociatedValue be ? Get( constructor, "formAssociated").
Set formAssociated to the result of
converting formAssociatedValue to a
boolean
. Rethrow any exceptions from the conversion.
If formAssociated is true, for each of
"formAssociatedCallback
", "formResetCallback
",
"formDisabledCallback
", and
"formStateRestoreCallback
" callbackName:
Let callbackValue be ? Get(prototype, callbackName).
If callbackValue is not undefined, then set the value of the entry in
lifecycleCallbacks with key callbackName to the result of converting callbackValue to the Web IDL
Function
callback type. Rethrow any exceptions from the
conversion.
Then, perform the following substep, regardless of whether the above steps threw an exception or not:
Unset this CustomElementRegistry
's element definition is
running flag.
Finally, if the first set of substeps threw an exception, then rethrow that exception (thus terminating this algorithm). Otherwise, continue onward.
Let definition be a new custom element definition with name name, local name localName, constructor constructor, observed attributes observedAttributes, lifecycle callbacks lifecycleCallbacks, form-associated formAssociated, disable internals disableInternals, and disable shadow disableShadow.
Add definition to this CustomElementRegistry
.
Let document be this CustomElementRegistry
's relevant global
object's associated
Document
.
Let upgrade candidates be all elements that are shadow-including descendants of document, whose namespace
is the HTML namespace and whose local name is localName, in
shadow-including tree order. Additionally, if extends is non-null, only
include elements whose is
value is equal to name.
For each element element in upgrade candidates, enqueue a custom element upgrade reaction given element and definition.
If this CustomElementRegistry
's when-defined promise map
contains an entry with key name:
Let promise be the value of that entry.
Resolve promise with constructor.
Delete the entry with key name from this
CustomElementRegistry
's when-defined promise map.
When invoked, the get(name)
method must run these
steps:
If this CustomElementRegistry
contains an entry with name name, then return that
entry's constructor.
Otherwise, return undefined.
The getName(constructor)
method
steps are:
If this CustomElementRegistry
contains an entry with constructor
constructor, then return that entry's name.
Return null.
When invoked, the whenDefined(name)
method
must run these steps:
If name is not a valid custom element name, then return a
promise rejected with a "SyntaxError
"
DOMException
.
If this CustomElementRegistry
contains an entry with name name, then return a
promise resolved with that entry's constructor.
Let map be this CustomElementRegistry
's when-defined
promise map.
If map does not contain an entry with key name, create an entry in map with key name and whose value is a new promise.
Let promise be the value of the entry in map with key name.
Return promise.
The whenDefined()
method can be
used to avoid performing an action until all appropriate custom
elements are defined. In this example, we
combine it with the :defined
pseudo-class to hide a
dynamically-loaded article's contents until we're sure that all of the autonomous custom elements it uses are defined.
articleContainer.hidden = true;
fetch(articleURL)
.then(response => response.text())
.then(text => {
articleContainer.innerHTML = text;
return Promise.all(
[...articleContainer.querySelectorAll(":not(:defined)")]
.map(el => customElements.whenDefined(el.localName))
);
})
.then(() => {
articleContainer.hidden = false;
});
When invoked, the upgrade(root)
method must run
these steps:
Let candidates be a list of all of root's shadow-including inclusive descendant elements, in shadow-including tree order.
For each candidate of candidates, try to upgrade candidate.
The upgrade()
method allows upgrading
of elements at will. Normally elements are automatically upgraded when they become
connected, but this method can be used if you need to upgrade before you're ready to
connect the element.
const el = document.createElement("spider-man");
class SpiderMan extends HTMLElement {}
customElements.define("spider-man", SpiderMan);
console.assert(!(el instanceof SpiderMan)); // not yet upgraded
customElements.upgrade(el);
console.assert(el instanceof SpiderMan); // upgraded!
To upgrade an element, given as input a custom element definition definition and an element element, run the following steps:
If element's custom element state is not "undefined
" or "uncustomized
", then return.
One scenario where this can occur due to reentrant invocation of this algorithm, as in the following example:
<!DOCTYPE html>
<x-foo id="a"></x-foo>
<x-foo id="b"></x-foo>
<script>
// Defining enqueues upgrade reactions for both "a" and "b"
customElements.define("x-foo", class extends HTMLElement {
constructor() {
super();
const b = document.querySelector("#b");
b.remove();
// While this constructor is running for "a", "b" is still
// undefined, and so inserting it into the document will enqueue a
// second upgrade reaction for "b" in addition to the one enqueued
// by defining x-foo.
document.body.appendChild(b);
}
})
</script>
This step will thus bail out the algorithm early when upgrade an element is invoked
with "b
" a second time.
Set element's custom element definition to definition.
Set element's custom element state to "failed
".
It will be set to "custom
" after the upgrade succeeds. For now,
we set it to "failed
" so that any reentrant invocations will hit the above early-exit step.
For each attribute in element's attribute list, in
order, enqueue a custom element callback reaction with element, callback
name "attributeChangedCallback
", and an argument list containing
attribute's local name, null, attribute's value, and attribute's
namespace.
If element is connected, then enqueue a custom element
callback reaction with element, callback name "connectedCallback
", and an empty argument list.
Add element to the end of definition's construction stack.
Let C be definition's constructor.
Run the following substeps while catching any exceptions:
If definition's disable shadow is true and
element's shadow root is
non-null, then throw a "NotSupportedError
"
DOMException
.
This is needed as attachShadow()
does not use look up a custom
element definition while attachInternals()
does.
Set element's custom element state to "precustomized
".
Let constructResult be the result of constructing C, with no arguments.
If C non-conformantly
uses an API decorated with the [CEReactions]
extended
attribute, then the reactions enqueued at the beginning of this algorithm will execute during
this step, before C finishes and control returns to this algorithm. Otherwise, they
will execute after C and the rest of the upgrade process finishes.
If SameValue(constructResult, element) is false, then
throw a TypeError
.
This can occur if C constructs another instance of the same custom
element before calling super()
, or if C uses JavaScript's
return
-override feature to return an arbitrary HTMLElement
object from the constructor.
Then, perform the following substep, regardless of whether the above steps threw an exception or not:
Remove the last entry from the end of definition's construction stack.
Assuming C calls super()
(as it will if it is conformant), and that the call succeeds, this will be
the already
constructed marker that replaced the element we pushed at the beginning
of this algorithm. (The HTML element constructor
carries out this replacement.)
If C does not call super()
(i.e. it is not conformant), or if any step in the HTML element constructor throws, then this entry will
still be element.
Finally, if the above steps threw an exception, then:
Set element's custom element definition to null.
Empty element's custom element reaction queue.
Rethrow the exception (thus terminating this algorithm).
If the above steps threw an exception, then element's custom
element state will remain "failed
" or "precustomized
".
If element is a form-associated custom element, then:
Reset the form owner of element. If element is
associated with a form
element, then
enqueue a custom element callback reaction with element, callback
name "formAssociatedCallback
", and « the associated form
».
If element is disabled, then
enqueue a custom element callback reaction with element, callback name
"formDisabledCallback
" and « true ».
Set element's custom
element state to "custom
".
To try to upgrade an element, given as input an element element, run the following steps:
Let definition be the result of looking up a custom element definition given element's node
document, element's namespace, element's local name, and
element's is
value.
If definition is not null, then enqueue a custom element upgrade reaction given element and definition.
A custom element possesses the ability to respond to certain occurrences by running author code:
When upgraded, its constructor is run, with no arguments.
When it becomes connected, its connectedCallback
is
called, with no arguments.
When it becomes disconnected, its disconnectedCallback
is called, with no arguments.
When it is adopted into a new document, its adoptedCallback
is called, given the old document and new document as
arguments.
When any of its attributes are changed, appended, removed, or replaced, its attributeChangedCallback
is called, given the attribute's local name, old value,
new value, and namespace as arguments. (An attribute's old or new value is considered to be null
when the attribute is added or removed, respectively.)
When the user agent resets the form owner of a
form-associated custom element and doing so changes the form owner, its formAssociatedCallback
is called, given the new form owner (or null if no owner)
as an argument.
When the form owner of a form-associated custom element is reset, its formResetCallback
is
called.
When the disabled state of a
form-associated custom element is changed, its formDisabledCallback
is called, given the new state as an
argument.
When user agent updates a form-associated custom element's value on behalf of
a user or as part of navigation, its formStateRestoreCallback
is called, given the new state and a string indicating
a reason, "autocomplete
" or "restore
", as
arguments.
We call these reactions collectively custom element reactions.
The way in which custom element reactions are invoked is done with special care, to avoid running author code during the middle of delicate operations. Effectively, they are delayed until "just before returning to user script". This means that for most purposes they appear to execute synchronously, but in the case of complicated composite operations (like cloning, or range manipulation), they will instead be delayed until after all the relevant user agent processing steps have completed, and then run together as a batch.
Additionally, the precise ordering of these reactions is managed via a somewhat-complicated stack-of-queues system, described below. The intention behind this system is to guaranteeIt is guaranteed that custom element reactions always are invoked in the same order as their triggering actions, at least within the local context of a single custom element. (Because custom element reaction code can perform its own mutations, it is not possible to give a global ordering guarantee across multiple elements.)
Each similar-origin window agent has a custom element reactions stack, which is initially empty. A similar-origin window agent's current element queue is the element queue at the top of its custom element reactions stack. Each item in the stack is an element queue, which is initially empty as well. Each item in an element queue is an element. (The elements are not necessarily custom yet, since this queue is used for upgrades as well.)
Each custom element reactions stack has an associated backup element
queue, which is an initially-empty element queue. Elements are pushed onto the
backup element queue during operations that affect the DOM without going through an
API decorated with [CEReactions]
, or through the parser's
create an element for the token algorithm. An example of this is a user-initiated
editing operation which modifies the descendants or attributes of an editable
element. To prevent reentrancy when processing the backup element queue, each
custom element reactions stack also has a processing the backup element
queue flag, initially unset.
All elements have an associated custom element reaction queue, initially empty. Each item in the custom element reaction queue is of one of two types:
An upgrade reaction, which will upgrade the custom element and contains a custom element definition; or
A callback reaction, which will call a lifecycle callback, and contains a callback function as well as a list of arguments.
This is all summarized in the following schematic diagram:
To enqueue an element on the appropriate element queue, given an element element, run the following steps:
Let reactionsStack be element's relevant agent's custom element reactions stack.
If reactionsStack is empty, then:
Add element to reactionsStack's backup element queue.
If reactionsStack's processing the backup element queue flag is set, then return.
Set reactionsStack's processing the backup element queue flag.
Queue a microtask to perform the following steps:
Invoke custom element reactions in reactionsStack's backup element queue.
Unset reactionsStack's processing the backup element queue flag.
Otherwise, add element to element's relevant agent's current element queue.
To enqueue a custom element callback reaction, given a custom element element, a callback name callbackName, and a list of arguments args, run the following steps:
Let definition be element's custom element definition.
Let callback be the value of the entry in definition's lifecycle callbacks with key callbackName.
If callback is null, then return.
If callbackName is "attributeChangedCallback
", then:
Let attributeName be the first element of args.
If definition's observed attributes does not contain attributeName, then return.
Add a new callback reaction to element's custom element reaction queue, with callback function callback and arguments args.
Enqueue an element on the appropriate element queue given element.
To enqueue a custom element upgrade reaction, given an element element and custom element definition definition, run the following steps:
Add a new upgrade reaction to element's custom element reaction queue, with custom element definition definition.
Enqueue an element on the appropriate element queue given element.
To invoke custom element reactions in an element queue queue, run the following steps:
While queue is not empty:
Let element be the result of dequeuing from queue.
Let reactions be element's custom element reaction queue.
Repeat until reactions is empty:
Remove the first element of reactions, and let reaction be that element. Switch on reaction's type:
Upgrade element using reaction's custom element definition.
If this throws an exception, catch it, and report it for reaction's custom element definition's constructor's corresponding JavaScript object's associated realm's global object.
Invoke reaction's
callback function with reaction's arguments and "report
", and callback this value
set to element.
To ensure custom element reactions are
triggered appropriately, we introduce the [CEReactions]
IDL extended attribute. It
indicates that the relevant algorithm is to be supplemented with additional steps in order to
appropriately track and invoke custom element
reactions.
The [CEReactions]
extended attribute must take no
arguments, and must not appear on anything other than an operation, attribute, setter, or deleter.
Additionally, it must not appear on readonly attributes.
Operations, attributes, setters, or deleters annotated with the [CEReactions]
extended attribute must run the following steps in place
of the ones specified in their description:
Push a new element queue onto this object's relevant agent's custom element reactions stack.
Run the originally-specified steps for this construct, catching any exceptions. If the steps return a value, let value be the returned value. If they throw an exception, let exception be the thrown exception.
Let queue be the result of popping from this object's relevant agent's custom element reactions stack.
Invoke custom element reactions in queue.
If an exception exception was thrown by the original steps, rethrow exception.
If a value value was returned from the original steps, return value.
The intent behind this extended attribute is somewhat subtle. One way of accomplishing its goals would be to say that every operation, attribute, setter, and deleter on the platform must have these steps inserted, and to allow implementers to optimize away unnecessary cases (where no DOM mutation is possible that could cause custom element reactions to occur).
However, in practice this imprecision could lead to non-interoperable implementations of custom element reactions, as some implementations might forget to invoke these steps in some cases. Instead, we settled on the approach of explicitly annotating all relevant IDL constructs, as a way of ensuring interoperable behavior and helping implementations easily pinpoint all cases where these steps are necessary.
Any nonstandard APIs introduced by the user agent that could modify the DOM in such a way as to
cause enqueuing a custom element
callback reaction or enqueuing a
custom element upgrade reaction, for example by modifying any attributes or child elements,
must also be decorated with the [CEReactions]
attribute.
As of the time of this writing, the following nonstandard or not-yet-standardized APIs are known to fall into this category:
HTMLInputElement
's webkitdirectory
and incremental
IDL attributes
HTMLLinkElement
's scope
IDL attribute
Certain capabilities are meant to be available to a custom element author, but not to a custom
element consumer. These are provided by the element.attachInternals()
method, which returns an instance of
ElementInternals
. The properties and methods of ElementInternals
allow
control over internal features which the user agent provides to all elements.
element.attachInternals()
Returns an ElementInternals
object targeting the custom element
element. Throws an exception if element is not a custom
element, if the "internals
" feature was disabled as part of the
element definition, or if it is called twice on the same element.
Each HTMLElement
has an attached internals (null or an
ElementInternals
object), initially null.
The attachInternals()
method steps are:
If this's is
value is not null, then throw a "NotSupportedError
"
DOMException
.
Let definition be the result of looking up a custom element definition given this's node
document, its namespace, its local name, and null as the is
value.
If definition is null, then throw an
"NotSupportedError
" DOMException
.
If definition's disable internals is true,
then throw a "NotSupportedError
" DOMException
.
If this's attached internals is non-null, then throw an
"NotSupportedError
" DOMException
.
If this's custom element state is not "precustomized
" or "custom
", then throw a
"NotSupportedError
" DOMException
.
Set this's attached internals to a new
ElementInternals
instance whose target
element is this.
Return this's attached internals.
ElementInternals
interfaceThe IDL for the ElementInternals
interface is as follows, with the various operations and attributes
defined in the following sections:
[Exposed=Window]
interface ElementInternals {
// Shadow root access
readonly attribute ShadowRoot
? shadowRoot;
// Form-associated custom elements
undefined setFormValue((File or USVString or FormData)? value,
optional (File or USVString or FormData)? state);
readonly attribute HTMLFormElement? form;
undefined setValidity(optional ValidityStateFlags flags = {},
optional DOMString message,
optional HTMLElement anchor);
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
readonly attribute NodeList labels;
// Custom state pseudo-class
[SameObject] readonly attribute CustomStateSet states;
};
// Accessibility semantics
ElementInternals includes ARIAMixin;
dictionary ValidityStateFlags {
boolean valueMissing = false;
boolean typeMismatch = false;
boolean patternMismatch = false;
boolean tooLong = false;
boolean tooShort = false;
boolean rangeUnderflow = false;
boolean rangeOverflow = false;
boolean stepMismatch = false;
boolean badInput = false;
boolean customError = false;
};
Each ElementInternals
has a target element,
which is a custom element.
internals.shadowRoot
Returns the ShadowRoot
for internals's target element, if the target
element is a shadow host, or null otherwise.
The shadowRoot
getter steps are:
Let target be this's target element.
If target is not a shadow host, then return null.
Let shadow be target's shadow root.
If shadow's available to element internals is false, then return null.
Return shadow.
internals.setFormValue(value)
Sets both the state and submission value of internals's target element to value.
If value is null, the element won't participate in form submission.
internals.setFormValue(value,
state)
Sets the submission value of internals's target element to value, and its state to state.
If value is null, the element won't participate in form submission.
internals.form
Returns the form owner of internals's target element.
internals.setValidity(flags,
message [, anchor ])
Marks internals's target element as
suffering from the constraints indicated by the flags argument, and sets the element's
validation message to message. If anchor is specified, the user agent might
use it to indicate problems with the constraints of internals's target element when the form owner is validated
interactively or reportValidity()
is
called.
internals.setValidity({})
Marks internals's target element as satisfying its constraints.
internals.willValidate
Returns true if internals's target element will be validated when the form is submitted; false otherwise.
internals.validity
Returns the ValidityState
object for internals's target element.
internals.validationMessage
Returns the error message that would be shown to the user if internals's target element was to be checked for validity.
valid = internals.checkValidity()
Returns true if internals's target
element has no validity problems; false otherwise. Fires an invalid
event at the element in the latter case.
valid = internals.reportValidity()
Returns true if internals's target
element has no validity problems; otherwise, returns false, fires an invalid
event at the element, and (if the event isn't canceled)
reports the problem to the user.
internals.labels
Returns a NodeList
of all the label
elements that
internals's target element is associated
with.
Each form-associated custom element has submission value. It is used to provide one or more
entries on form submission.
The initial value of submission value is null, and
submission value can be null, a string, a
File
, or a list of entries.
Each form-associated custom element has state.
It is information with which the user agent can restore a user's input for the element.
The initial value of state is null, and state can be null, a string, a File
, or a
list of entries.
The setFormValue()
method is used by
the custom element author to set the element's submission
value and state, thus communicating these to the user
agent.
When the user agent believes it is a good idea to restore a form-associated custom
element's state, for example after navigation or restarting the user agent, they may enqueue a
custom element callback reaction with that element, callback name "formStateRestoreCallback
", an argument list containing the state to be
restored, and "restore
".
If the user agent has a form-filling assist feature, then when the feature is invoked,
it may enqueue a custom element callback reaction with
a form-associated custom element, callback name
"formStateRestoreCallback
", an argument list containing the state value
determined by history of state value and some heuristics, and
"autocomplete
".
In general, the state is information specified by a user, and the submission value is a value after canonicalization or sanitization, suitable for submission to the server. The following examples makes this concrete:
Suppose that we have a form-associated custom element which asks a
user to specify a date. The user specifies "3/15/2019", but the control wishes to
submit "2019-03-15"
to the server. "3/15/2019" would be a state of the element, and "2019-03-15"
would be
a submission value.
Suppose you develop a custom element emulating a the behavior of the existing
checkbox input
type. Its submission value would be the value of its value
content attribute, or the string "on"
. Its state would be one of "checked"
, "unchecked"
, "checked/indeterminate"
, or "unchecked/indeterminate"
.
The setFormValue(value,
state)
method steps are:
Let element be this's target element.
If element is not a form-associated custom element, then throw a
"NotSupportedError
" DOMException
.
Set target element's submission value to value if value is
not a FormData
object, or to a clone of
value's entry list otherwise.
If the state argument of the function is omitted, set element's state to its submission value.
Otherwise, if state is a FormData
object, set element's
state to a clone of
state's entry list.
Otherwise, set element's state to state.
Each form-associated custom element has validity flags named
valueMissing
, typeMismatch
,
patternMismatch
, tooLong
,
tooShort
, rangeUnderflow
,
rangeOverflow
, stepMismatch
, and
customError
. They are false initially.
Each form-associated custom element has a validation message string. It is the empty string initially.
Each form-associated custom element has a validation anchor element. It is null initially.
The setValidity(flags, message,
anchor)
method steps are:
Let element be this's target element.
If element is not a form-associated custom element, then throw a
"NotSupportedError
" DOMException
.
If flags contains one or more true values and message is not given
or is the empty string, then throw a TypeError
.
For each entry flag → value of flags, set element's validity flag with the name flag to value.
Set element's validation message to the empty string if message is not given or all of element's validity flags are false, or to message otherwise.
If element's customError
validity flag is true, then set
element's custom validity error message to element's
validation message. Otherwise, set
element's custom validity error message to the empty string.
Set element's validation anchor to
null if anchor is not given. Otherwise, if anchor is not a
shadow-including descendant of element, then throw a
"NotFoundError
" DOMException
. Otherwise, set
element's validation anchor to
anchor.
The validationMessage
getter steps
are:
Let element be this's target element.
If element is not a form-associated custom element, then throw a
"NotSupportedError
" DOMException
.
Return element's validation message.
The entry construction algorithm for a form-associated custom element, given an element element and an entry list entry list, consists of the following steps:
If element's submission value is a list of entries, then append each item of element's submission value to entry list, and return.
In this case, user agent does not refer to the
name
content attribute value. An implementation of
form-associated custom element is responsible to decide names of
entries. They can be the
name
content attribute value, they can be strings based on
the name
content attribute value, or they can be unrelated
to the name
content attribute.
If the element does not have a name
attribute
specified, or its name
attribute's value is the empty string,
then return.
If the element's submission value is not
null, create an entry with the name
attribute
value and the submission value, and append it to entry list.
internals.role [ = value ]
Sets or retrieves the default ARIA role for internals's target element, which will be used unless the page author
overrides it using the role
attribute.
internals.aria* [ = value ]
Sets or retrieves various default ARIA states or property values for
internals's target element, which will be used
unless the page author overrides them using the aria-*
attributes.
By using the role
and aria*
properties of
ElementInternals
, custom element authors can set default accessibile roles, states,
and property values for their custom element, similar to how native elements behave. See the example above for more details.
Each custom element has an internal content attribute map, which is a map, initially empty. See the Requirements related to ARIA and to platform accessibility APIs section for information on how this impacts platform accessibility APIs.
internals.states.add(value)
Adds the string value to the element's states set to be exposed as a pseudo-class.
internals.states.has(value)
Returns true if value is in the element's states set, otherwise false.
internals.states.delete(value)
If the element's states set has value, then it will be removed and true will be returned. Otherwise, false will be returned.
internals.states.clear()
Removes all values from the element's states set.
for (const stateName of internals.states)
for (const stateName of internals.states.entries())
for (const stateName of internals.states.keys())
for (const stateName of internals.states.values())
Iterates over all values in the element's states set.
internals.states.forEach(callback)
Iterates over all values in the element's states set by calling callback once for each value.
internals.states.size
Returns the number of values in the element's states set.
Each custom element has a states set, which is a
CustomStateSet
, initially empty.
[Exposed=Window]
interface CustomStateSet {
setlike<DOMString>;
};
The states
getter steps are to return this's target
element's states set.
The states set can expose boolean states represented by existence/non-existence
of string values. If an author wants to expose a state which can have three values, it can be
converted to three exclusive boolean states. For example, a state called readyState
with "loading"
, "interactive"
, and "complete"
values can be mapped to
three exclusive boolean states, "loading"
, "interactive"
, and "complete"
:
// Change the readyState from anything to "complete".
this._readyState = "complete";
this._internals.states.delete("loading");
this._internals.states.delete("interactive");
this._internals.states.add("complete");
This specification does not provide a machine-readable way of describing breadcrumb navigation
menus. Authors are encouraged to just use a series of links in a paragraph. The nav
element can be used to mark the section containing these paragraphs as being navigation
blocks.
In the following example, the current page can be reached via two paths.
<nav>
<p>
<a href="/">Main</a> ▸
<a href="/products/">Products</a> ▸
<a href="/products/dishwashers/">Dishwashers</a> ▸
<a>Second hand</a>
</p>
<p>
<a href="/">Main</a> ▸
<a href="/second-hand/">Second hand</a> ▸
<a>Dishwashers</a>
</p>
</nav>
This specification does not define any markup specifically for marking up lists
of keywords that apply to a group of pages (also known as tag clouds). In general, authors
are encouraged to either mark up such lists using ul
elements with explicit inline
counts that are then hidden and turned into a presentational effect using a style sheet, or to use
SVG.
Here, three tags are included in a short tag cloud:
<style>
.tag-cloud > li > span { display: none; }
.tag-cloud > li { display: inline; }
.tag-cloud-1 { font-size: 0.7em; }
.tag-cloud-2 { font-size: 0.9em; }
.tag-cloud-3 { font-size: 1.1em; }
.tag-cloud-4 { font-size: 1.3em; }
.tag-cloud-5 { font-size: 1.5em; }
@media speech {
.tag-cloud > li > span { display:inline }
}
</style>
...
<ul class="tag-cloud">
<li class="tag-cloud-4"><a title="28 instances" href="/t/apple">apple</a> <span>(popular)</span>
<li class="tag-cloud-2"><a title="6 instances" href="/t/kiwi">kiwi</a> <span>(rare)</span>
<li class="tag-cloud-5"><a title="41 instances" href="/t/pear">pear</a> <span>(very popular)</span>
</ul>
The actual frequency of each tag is given using the title
attribute. A CSS style sheet is provided to convert the markup into a cloud of differently-sized
words, but for user agents that do not support CSS or are not visual, the markup contains
annotations like "(popular)" or "(rare)" to categorize the various tags by frequency, thus
enabling all users to benefit from the information.
The ul
element is used (rather than ol
) because the order is not
particularly important: while the list is in fact ordered alphabetically, it would convey the
same information if ordered by, say, the length of the tag.
The tag
rel
-keyword is
not used on these a
elements because they do not represent tags that apply
to the page itself; they are just part of an index listing the tags themselves.
This specification does not define a specific element for marking up conversations, meeting minutes, chat transcripts, dialogues in screenplays, instant message logs, and other situations where different players take turns in discourse.
Instead, authors are encouraged to mark up conversations using p
elements and
punctuation. Authors who need to mark the speaker for styling purposes are encouraged to use
span
or b
. Paragraphs with their text wrapped in the i
element can be used for marking up stage directions.
This example demonstrates this using an extract from Abbot and Costello's famous sketch, Who's on first:
<p> Costello: Look, you gotta first baseman?
<p> Abbott: Certainly.
<p> Costello: Who's playing first?
<p> Abbott: That's right.
<p> Costello becomes exasperated.
<p> Costello: When you pay off the first baseman every month, who gets the money?
<p> Abbott: Every dollar of it.
The following extract shows how an IM conversation log could be marked up, using the
data
element to provide Unix timestamps for each line. Note that the timestamps are
provided in a format that the time
element does not support, so the
data
element is used instead (namely, Unix time_t
timestamps).
Had the author wished to mark up the data using one of the date and time formats supported by the
time
element, that element could have been used instead of data
. This
could be advantageous as it would allow data analysis tools to detect the timestamps
unambiguously, without coordination with the page author.
<p> <data value="1319898155">14:22</data> <b>egof</b> I'm not that nerdy, I've only seen 30% of the star trek episodes
<p> <data value="1319898192">14:23</data> <b>kaj</b> if you know what percentage of the star trek episodes you have seen, you are inarguably nerdy
<p> <data value="1319898200">14:23</data> <b>egof</b> it's unarguably
<p> <data value="1319898228">14:23</data> <i>* kaj blinks</i>
<p> <data value="1319898260">14:24</data> <b>kaj</b> you are not helping your case
HTML does not have a good way to mark up graphs, so descriptions of interactive conversations
from games are more difficult to mark up. This example shows one possible convention using
dl
elements to list the possible responses at each point in the conversation.
Another option to consider is describing the conversation in the form of a DOT file, and
outputting the result as an SVG image to place in the document. DOT
<p> Next, you meet a fisher. You can say one of several greetings:
<dl>
<dt> "Hello there!"
<dd>
<p> She responds with "Hello, how may I help you?"; you can respond with:
<dl>
<dt> "I would like to buy a fish."
<dd> <p> She sells you a fish and the conversation finishes.
<dt> "Can I borrow your boat?"
<dd>
<p> She is surprised and asks "What are you offering in return?".
<dl>
<dt> "Five gold." (if you have enough)
<dt> "Ten gold." (if you have enough)
<dt> "Fifteen gold." (if you have enough)
<dd> <p> She lends you her boat. The conversation ends.
<dt> "A fish." (if you have one)
<dt> "A newspaper." (if you have one)
<dt> "A pebble." (if you have one)
<dd> <p> "No thanks", she replies. Your conversation options
at this point are the same as they were after asking to borrow
her boat, minus any options you've suggested before.
</dl>
</dd>
</dl>
</dd>
<dt> "Vote for me in the next election!"
<dd> <p> She turns away. The conversation finishes.
<dt> "Madam, are you aware that your fish are running away?"
<dd>
<p> She looks at you skeptically and says "Fish cannot run, miss".
<dl>
<dt> "You got me!"
<dd> <p> The fisher sighs and the conversation ends.
<dt> "Only kidding."
<dd> <p> "Good one!" she retorts. Your conversation options at this
point are the same as those following "Hello there!" above.
<dt> "Oh, then what are they doing?"
<dd> <p> She looks at her fish, giving you an opportunity to steal
her boat, which you do. The conversation ends.
</dl>
</dd>
</dl>
In some games, conversations are simpler: each character merely has a fixed set of lines that they say. In this example, a game FAQ/walkthrough lists some of the known possible responses for each character:
<section>
<h1>Dialogue</h1>
<p><small>Some characters repeat their lines in order each time you interact
with them, others randomly pick from amongst their lines. Those who respond in
order have numbered entries in the lists below.</small>
<h2>The Shopkeeper</h2>
<ul>
<li>How may I help you?
<li>Fresh apples!
<li>A loaf of bread for madam?
</ul>
<h2>The pilot</h2>
<p>Before the accident:
<ul>
<li>I'm about to fly out, sorry!
<li>Sorry, I'm just waiting for flight clearance and then I'll be off!
</ul>
<p>After the accident:
<ol>
<li>I'm about to fly out, sorry!
<li>Ok, I'm not leaving right now, my plane is being cleaned.
<li>Ok, it's not being cleaned, it needs a minor repair first.
<li>Ok, ok, stop bothering me! Truth is, I had a crash.
</ol>
<h2>Clan Leader</h2>
<p>During the first clan meeting:
<ul>
<li>Hey, have you seen my daughter? I bet she's up to something nefarious again...
<li>Nice weather we're having today, eh?
<li>The name is Bailey, Jeff Bailey. How can I help you today?
<li>A glass of water? Fresh from the well!
</ul>
<p>After the earthquake:
<ol>
<li>Everyone is safe in the shelter, we just have to put out the fire!
<li>I'll go and tell the fire brigade, you keep hosing it down!
</ol>
</section>
HTML does not have a dedicated mechanism for marking up footnotes. Here are the suggested alternatives.
For short inline annotations, the title
attribute could be used.
In this example, two parts of a dialogue are annotated with footnote-like content using the
title
attribute.
<p> <b>Customer</b>: Hello! I wish to register a complaint. Hello. Miss?
<p> <b>Shopkeeper</b>: <span title="Colloquial pronunciation of 'What do you'"
>Watcha</span> mean, miss?
<p> <b>Customer</b>: Uh, I'm sorry, I have a cold. I wish to make a complaint.
<p> <b>Shopkeeper</b>: Sorry, <span title="This is, of course, a lie.">we're
closing for lunch</span>.
Unfortunately, relying on the title
attribute is
currently discouraged as many user agents do not expose the attribute in an accessible manner as
required by this specification (e.g. requiring a pointing device such as a mouse to cause a
tooltip to appear, which excludes keyboard-only users and touch-only users, such as anyone with a
modern phone or tablet).
If the title
attribute is used, CSS can be used to
draw the reader's attention to the elements with the attribute.
For example, the following CSS places a dashed line below elements that have a title
attribute.
[title] { border-bottom: thin dashed; }
For longer annotations, the a
element should be used, pointing to an element later
in the document. The convention is that the contents of the link be a number in square
brackets.
In this example, a footnote in the dialogue links to a paragraph below the dialogue. The paragraph then reciprocally links back to the dialogue, allowing the user to return to the location of the footnote.
<p> Announcer: Number 16: The <i>hand</i>.
<p> Interviewer: Good evening. I have with me in the studio tonight
Mr Norman St John Polevaulter, who for the past few years has been
contradicting people. Mr Polevaulter, why <em>do</em> you
contradict people?
<p> Norman: I don't. <sup><a href="#fn1" id="r1">[1]</a></sup>
<p> Interviewer: You told me you did!
...
<section>
<p id="fn1"><a href="#r1">[1]</a> This is, naturally, a lie,
but paradoxically if it were true he could not say so without
contradicting the interviewer and thus making it false.</p>
</section>
For side notes, longer annotations that apply to entire sections of the text rather than just
specific words or sentences, the aside
element should be used.
In this example, a sidebar is given after a dialogue, giving it some context.
<p> <span class="speaker">Customer</span>: I will not buy this record, it is scratched.
<p> <span class="speaker">Shopkeeper</span>: I'm sorry?
<p> <span class="speaker">Customer</span>: I will not buy this record, it is scratched.
<p> <span class="speaker">Shopkeeper</span>: No no no, this's'a tobacconist's.
<aside>
<p>In 1970, the British Empire lay in ruins, and foreign
nationalists frequented the streets — many of them Hungarians
(not the streets — the foreign nationals). Sadly, Alexander
Yalt has been publishing incompetently-written phrase books.
</aside>
For figures or tables, footnotes can be included in the relevant figcaption
or
caption
element, or in surrounding prose.
In this example, a table has cells with footnotes that are given in prose. A
figure
element is used to give a single legend to the combination of the table and
its footnotes.
<figure>
<figcaption>Table 1. Alternative activities for knights.</figcaption>
<table>
<tr>
<th> Activity
<th> Location
<th> Cost
<tr>
<td> Dance
<td> Wherever possible
<td> £0<sup><a href="#fn1">1</a></sup>
<tr>
<td> Routines, chorus scenes<sup><a href="#fn2">2</a></sup>
<td> Undisclosed
<td> Undisclosed
<tr>
<td> Dining<sup><a href="#fn3">3</a></sup>
<td> Camelot
<td> Cost of ham, jam, and spam<sup><a href="#fn4">4</a></sup>
</table>
<p id="fn1">1. Assumed.</p>
<p id="fn2">2. Footwork impeccable.</p>
<p id="fn3">3. Quality described as "well".</p>
<p id="fn4">4. A lot.</p>
</figure>
An element is said to be actually disabled if it is one of the following:
button
element that is disabledinput
element that is disabledselect
element that is disabledtextarea
element that is disabledoptgroup
element that has a disabled
attributeoption
element that is disabledfieldset
element that is a disabled fieldsetThis definition is used to determine what elements are focusable and
which elements match the :enabled
and
:disabled
pseudo
classes.
CSS Values and Units leaves the case-sensitivity of attribute names for the purpose of the 'attr()' function to be defined by the host language. CSSVALUES
When comparing the attribute name part of a CSS 'attr()' function to the names of namespace-less attributes on HTML elements in HTML documents, the name part of the CSS 'attr()' function must first be converted to ASCII lowercase. The same function when compared to other attributes must be compared according to its original case. In both cases, to match the values must be identical to each other (and therefore the comparison is case sensitive).
This is the same as comparing the name part of a CSS attribute selector, specified in the next section.
Selectors leaves the case-sensitivity of element names, attribute names, and attribute values to be defined by the host language. SELECTORS
When comparing a CSS element type selector to the names of HTML elements in HTML documents, the CSS element type selector must first be converted to ASCII lowercase. The same selector when compared to other elements must be compared according to its original case. In both cases, to match the values must be identical to each other (and therefore the comparison is case sensitive).
When comparing the name part of a CSS attribute selector to the names of attributes on HTML elements in HTML documents, the name part of the CSS attribute selector must first be converted to ASCII lowercase. The same selector when compared to other attributes must be compared according to its original case. In both cases, the comparison is case-sensitive.
Attribute selectors on an HTML element in an HTML document must treat the values of attributes with the following names as ASCII case-insensitive:
accept
accept-charset
align
alink
axis
bgcolor
charset
checked
clear
codetype
color
compact
declare
defer
dir
direction
disabled
enctype
face
frame
hreflang
http-equiv
lang
language
link
media
method
multiple
nohref
noresize
noshade
nowrap
readonly
rel
rev
rules
scope
scrolling
selected
shape
target
text
type
valign
valuetype
vlink
For example, the selector [bgcolor="#ffffff"]
will match any HTML
element with a bgcolor
attribute with values including #ffffff
, #FFFFFF
and #fffFFF
. This
happens even if bgcolor
has no effect for a given element (e.g.,
div
).
The selector [type=a s]
will match any
HTML element with a type
attribute whose value is a
, but not whose value is A
, due to the s
flag.
All other attribute values and everything else must be treated as entirely identical to each other for the purposes of selector matching. This includes:
IDs and classes in no-quirks mode and limited-quirks mode
the names of elements not in the HTML namespace
the names of HTML elements in XML documents
the names of attributes of elements not in the HTML namespace
the names of attributes of HTML elements in XML documents
the names of attributes that themselves have namespaces
Selectors defines that ID and class selectors (such as #foo
and .bar
), when matched against elements in documents
that are in quirks mode, will be matched in an ASCII case-insensitive
manner. However, this does not apply for attribute selectors with "id
" or
"class
" as the name part. The selector [class="foobar"]
will treat its value as case-sensitive even in
quirks mode.
There are a number of dynamic selectors that can be used with HTML. This section defines when these selectors match HTML elements. SELECTORS CSSUI
:defined
The :defined
pseudo-class must match
any element that is defined.
:link
:visited
All a
elements that have an href
attribute, and all area
elements that have an href
attribute, must match one of :link
and :visited
.
Other specifications might apply more specific rules regarding how these elements are to match these pseudo-classes, to mitigate some privacy concerns that apply with straightforward implementations of this requirement.
:active
The :active
pseudo-class is defined to
match an element while an
element is being activated by the
user
.
To determine whether a particular element is being
activated for the purposes of defining the :active
pseudo-class only, an HTML user agent must use the first relevant entry in the
following list.
button
elementinput
element whose type
attribute is in the Submit Button, Image Button, Reset
Button, or Button statea
element that has an href
attributearea
element that has an href
attributeThe element is being activated if it is in a formal activation state.
For example, if the user is using a keyboard to push a button
element by pressing the space bar, the element would match this pseudo-class in
between the time that the element received the keydown
event and the time the element received the keyup
event.
The element is being activated.
An element is said to be in a formal activation state between the time the user begins to indicate an intent to trigger the element's activation behavior and either the time the user stops indicating an intent to trigger the element's activation behavior, or the time the element's activation behavior has finished running, which ever comes first.
An element is said to be being actively pointed at while the user indicates the element using a pointing device while that pointing device is in the "down" state (e.g. for a mouse, between the time the mouse button is pressed and the time it is depressed; for a finger in a multitouch environment, while the finger is touching the display surface).
Per the definition in Selectors, :active
also matches flat tree ancestors of
elements that are being activated.
SELECTORS
Additionally, any element that is the labeled control of a label
element that is currently matching :active
, also matches
:active
. (But, it does not count as being being activated.)
:hover
The :hover
pseudo-class is defined to
match an element while the user
designates an element with a pointing
device
. For the purposes of defining the :hover
pseudo-class only, an HTML user agent must consider an element as being one that
the user designates if it is an element that the user
indicates using a pointing device.
Per the definition in Selectors, :hover
also matches flat tree ancestors of elements
that are designated. SELECTORS
Additionally, any element that is the labeled control of a label
element that is currently matching :hover
, also matches
:hover
. (But, it does not count as being designated.)
Consider in particular a fragment such as:
<p> <label for=c> <input id=a> </label> <span id=b> <input id=c> </span> </p>
If the user designates the element with ID "a
" with their pointing
device, then the p
element (and all its ancestors not shown in the snippet
above), the label
element, the element with ID "a
", and
the element with ID "c
" will match the :hover
pseudo-class. The element with ID "a
" matches it by being designated; the
label
and p
elements match it because of the condition in
Selectors about flat tree ancestors; and the element with ID "c
" matches it through the additional condition above on labeled controls (i.e., its label
element matches :hover
). However, the element with ID "b
" does not match :hover
: its
flat tree descendant is not designated, even though that flat tree descendant matches :hover
.
:focus
For the purposes of the CSS :focus
pseudo-class, an element has the focus when:
it is not itself a navigable container; and
any of the following are true:
it is one of the elements listed in the current focus chain of the top-level traversable; or
its shadow root shadowRoot is not null and shadowRoot is the root of at least one element that has the focus.
:target
For the purposes of the CSS :target
pseudo-class, the Document
's target elements are a list
containing the Document
's target element, if it is not null, or
containing no elements, if it is. SELECTORS
:popover-open
The :popover-open
pseudo-class is
defined to match any HTML element whose popover
attribute is not in the no popover state and whose popover visibility
state is showing.
:enabled
The :enabled
pseudo-class must match any
button
, input
, select
, textarea
,
optgroup
, option
, fieldset
element, or
form-associated custom element that is not actually disabled.
:disabled
The :disabled
pseudo-class must match
any element that is actually disabled.
:checked
The :checked
pseudo-class must match any
element falling into one of the following categories:
input
elements whose type
attribute is in
the Checkbox state and whose checkedness state is trueinput
elements whose type
attribute is in
the Radio Button state and whose checkedness state is trueoption
elements whose selectedness is true:indeterminate
The :indeterminate
pseudo-class
must match any element falling into one of the following categories:
input
elements whose type
attribute is in
the Checkbox state and whose indeterminate
IDL attribute is set to trueinput
elements whose type
attribute is in
the Radio Button state and whose radio button
group contains no input
elements whose checkedness state is true.progress
elements with no value
content attribute:default
The :default
pseudo-class must match any
element falling into one of the following categories:
input
elements to which the checked
attribute applies and that have a checked
attributeoption
elements that have a selected
attribute:placeholder-shown
The :placeholder-shown
pseudo-class must match any element falling into one of the following
categories:
input
elements that have a placeholder
attribute whose value is currently being
presented to the usertextarea
elements that have a placeholder
attribute whose value is currently being
presented to the user:valid
The :valid
pseudo-class must match any
element falling into one of the following categories:
form
elements that are not the form owner of any elements that
themselves are candidates for constraint
validation but do not satisfy their
constraintsfieldset
elements that have no descendant elements that themselves are candidates for constraint validation but do
not satisfy their constraints:invalid
The :invalid
pseudo-class must match any
element falling into one of the following categories:
form
elements that are the form owner of one or more elements
that themselves are candidates for constraint
validation but do not satisfy their
constraintsfieldset
elements that have of one or more descendant elements that themselves
are candidates for constraint
validation but do not satisfy their
constraints:user-valid
The :user-valid
pseudo-class must
match input
, textarea
, and select
elements whose
user validity is true, are
candidates for constraint validation,
and that satisfy their constraints.
:user-invalid
The :user-invalid
pseudo-class must
match input
, textarea
, and select
elements whose
user validity is true, are
candidates for constraint validation
but do not satisfy their constraints.
:in-range
The :in-range
pseudo-class must match
all elements that are candidates for
constraint validation, have range limitations, and that are neither
suffering from an underflow nor suffering from an overflow.
:out-of-range
The :out-of-range
pseudo-class must
match all elements that are candidates for
constraint validation, have range limitations, and that are either
suffering from an underflow or suffering from an overflow.
:required
The :required
pseudo-class must match
any element falling into one of the following categories:
input
elements that are requiredselect
elements that have a required
attributetextarea
elements that have a required
attribute:optional
The :optional
pseudo-class must match
any element falling into one of the following categories:
input
elements to which the required
attribute applies that are not requiredselect
elements that do not have a required
attributetextarea
elements that do not have a required
attribute:autofill
:-webkit-autofill
The :autofill
and :-webkit-autofill
pseudo-classes must match input
elements which have
been autofilled by user agent. These pseudo-classes must stop matching if the user edits the
autofilled field.
One way such autofilling might happen is via the autocomplete
attribute, but user agents could autofill even
without that attribute being involved.
:read-only
:read-write
The :read-write
pseudo-class must
match any element falling into one of the following categories, which for the purposes of
Selectors are thus considered user-alterable: SELECTORS
input
elements to which the readonly
attribute applies, and that are mutable (i.e. that do not
have the readonly
attribute specified and that are not
disabled)textarea
elements that do not have a readonly
attribute, and that are not disabledinput
elements nor textarea
elementsThe :read-only
pseudo-class must match
all other HTML elements.
:modal
The :modal
pseudo-class must match any
element falling into one of the following categories:
dialog
elements whose is modal flag is true:dir(ltr)
The :dir(ltr)
pseudo-class must match all
elements whose directionality is 'ltr'.
:dir(rtl)
The :dir(rtl)
pseudo-class must match all
elements whose directionality is 'rtl'.
The :state(identifier)
pseudo-class must
match all custom elements whose states set's set entries
contains identifier.
:playing
The :playing
pseudo-class must match all
media elements whose paused
attribute is false.
:paused
The :paused
pseudo-class must match all
media elements whose paused
attribute is true.
:seeking
The :seeking
pseudo-class must match all
media elements whose seeking
attribute is true.
:buffering
The :buffering
pseudo-class must match
all media elements whose paused
attribute is false, networkState
attribute is NETWORK_LOADING
, and ready state is HAVE_CURRENT_DATA
or less.
:stalled
The :stalled
pseudo-class must match
all media elements that match the :buffering
pseudo-class and whose is
currently stalled is true.
:muted
The :muted
pseudo-class must match all
media elements that are muted.
:volume-locked
The :volume-locked
pseudo-class
must match all media elements when the user agent's
volume locked is true.
This specification does not define when an element matches the :lang()
dynamic pseudo-class, as it is defined in
sufficient detail in a language-agnostic fashion in Selectors.
SELECTORS
Sometimes, it is desirable to annotate content with specific machine-readable labels, e.g. to allow generic scripts to provide services that are customized to the page, or to enable content from a variety of cooperating authors to be processed by a single script in a consistent manner.
For this purpose, authors can use the microdata features described in this section. Microdata allows nested groups of name-value pairs to be added to documents, in parallel with the existing content.
At a high level, microdata consists of a group of name-value pairs. The groups are called items, and each name-value pair is a property. Items and properties are represented by regular elements.
To create an item, the itemscope
attribute is used.
To add a property to an item, the itemprop
attribute is used
on one of the item's descendants.
Here there are two items, each of which has the property "name":
<div itemscope>
<p>My name is <span itemprop="name">Elizabeth</span>.</p>
</div>
<div itemscope>
<p>My name is <span itemprop="name">Daniel</span>.</p>
</div>
Markup without the microdata-related attributes does not have any effect on the microdata model.
These two examples are exactly equivalent, at a microdata level, as the previous two examples respectively:
<div itemscope>
<p>My <em>name</em> is <span itemprop="name">E<strong>liz</strong>abeth</span>.</p>
</div>
<section>
<div itemscope>
<aside>
<p>My name is <span itemprop="name"><a href="/?user=daniel">Daniel</a></span>.</p>
</aside>
</div>
</section>
Properties generally have values that are strings.
Here the item has three properties:
<div itemscope>
<p>My name is <span itemprop="name">Neil</span>.</p>
<p>My band is called <span itemprop="band">Four Parts Water</span>.</p>
<p>I am <span itemprop="nationality">British</span>.</p>
</div>
When a string value is a URL, it is expressed using the a
element and
its href
attribute, the img
element and its
src
attribute, or other elements that link to or embed external
resources.
In this example, the item has one property, "image", whose value is a URL:
<div itemscope>
<img itemprop="image" src="google-logo.png" alt="Google">
</div>
When a string value is in some machine-readable format unsuitable for human consumption, it is
expressed using the value
attribute of the data
element, with the human-readable version given in the element's contents.
Here, there is an item with a property whose value is a product ID. The ID is not human-friendly, so the product's name is used the human-visible text instead of the ID.
<h1 itemscope>
<data itemprop="product-id" value="9678AOU879">The Instigator 2000</data>
</h1>
For numeric data, the meter
element and its value
attribute can be used instead.
Here a rating is given using a meter
element.
<div itemscope itemtype="http://schema.org/Product">
<span itemprop="name">Panasonic White 60L Refrigerator</span>
<img src="panasonic-fridge-60l-white.jpg" alt="">
<div itemprop="aggregateRating"
itemscope itemtype="http://schema.org/AggregateRating">
<meter itemprop="ratingValue" min=0 value=3.5 max=5>Rated 3.5/5</meter>
(based on <span itemprop="reviewCount">11</span> customer reviews)
</div>
</div>
Similarly, for date- and time-related data, the time
element and its datetime
attribute can be used instead.
In this example, the item has one property, "birthday", whose value is a date:
<div itemscope>
I was born on <time itemprop="birthday" datetime="2009-05-10">May 10th 2009</time>.
</div>
Properties can also themselves be groups of name-value pairs, by putting the itemscope
attribute on the element that declares the property.
Items that are not part of others are called top-level microdata items.
In this example, the outer item represents a person, and the inner one represents a band:
<div itemscope>
<p>Name: <span itemprop="name">Amanda</span></p>
<p>Band: <span itemprop="band" itemscope> <span itemprop="name">Jazz Band</span> (<span itemprop="size">12</span> players)</span></p>
</div>
The outer item here has two properties, "name" and "band". The "name" is "Amanda", and the "band" is an item in its own right, with two properties, "name" and "size". The "name" of the band is "Jazz Band", and the "size" is "12".
The outer item in this example is a top-level microdata item.
Properties that are not descendants of the element with the itemscope
attribute can be associated with the item using the itemref
attribute.
This attribute takes a list of IDs of elements to crawl in addition to crawling the children of
the element with the itemscope
attribute.
This example is the same as the previous one, but all the properties are separated from their items:
<div itemscope id="amanda" itemref="a b"></div>
<p id="a">Name: <span itemprop="name">Amanda</span></p>
<div id="b" itemprop="band" itemscope itemref="c"></div>
<div id="c">
<p>Band: <span itemprop="name">Jazz Band</span></p>
<p>Size: <span itemprop="size">12</span> players</p>
</div>
This gives the same result as the previous example. The first item has two properties, "name", set to "Amanda", and "band", set to another item. That second item has two further properties, "name", set to "Jazz Band", and "size", set to "12".
An item can have multiple properties with the same name and different values.
This example describes an ice cream, with two flavors:
<div itemscope>
<p>Flavors in my favorite ice cream:</p>
<ul>
<li itemprop="flavor">Lemon sorbet</li>
<li itemprop="flavor">Apricot sorbet</li>
</ul>
</div>
This thus results in an item with two properties, both "flavor", having the values "Lemon sorbet" and "Apricot sorbet".
An element introducing a property can also introduce multiple properties at once, to avoid duplication when some of the properties have the same value.
Here we see an item with two properties, "favorite-color" and "favorite-fruit", both set to the value "orange":
<div itemscope>
<span itemprop="favorite-color favorite-fruit">orange</span>
</div>
It's important to note that there is no relationship between the microdata and the content of the document where the microdata is marked up.
There is no semantic difference, for instance, between the following two examples:
<figure>
<img src="castle.jpeg">
<figcaption><span itemscope><span itemprop="name">The Castle</span></span> (1986)</figcaption>
</figure>
<span itemscope><meta itemprop="name" content="The Castle"></span>
<figure>
<img src="castle.jpeg">
<figcaption>The Castle (1986)</figcaption>
</figure>
Both have a figure with a caption, and both, completely unrelated to the figure, have an item with a name-value pair with the name "name" and the value "The Castle". The only difference is that if the user drags the caption out of the document, in the former case, the item will be included in the drag-and-drop data. In neither case is the image in any way associated with the item.
The examples in the previous section show how information could be marked up on a page that doesn't expect its microdata to be re-used. Microdata is most useful, though, when it is used in contexts where other authors and readers are able to cooperate to make new uses of the markup.
For this purpose, it is necessary to give each item a type, such as "https://example.com/person", or "https://example.org/cat", or "https://band.example.net/". Types are identified as URLs.
The type for an item is given as the value of an itemtype
attribute on the same element as the itemscope
attribute.
Here, the item's type is "https://example.org/animals#cat":
<section itemscope itemtype="https://example.org/animals#cat">
<h1 itemprop="name">Hedral</h1>
<p itemprop="desc">Hedral is a male american domestic
shorthair, with a fluffy black fur with white paws and belly.</p>
<img itemprop="img" src="hedral.jpeg" alt="" title="Hedral, age 18 months">
</section>
In this example the "https://example.org/animals#cat" item has three properties, a "name" ("Hedral"), a "desc" ("Hedral is..."), and an "img" ("hedral.jpeg").
The type gives the context for the properties, thus selecting a vocabulary: a property named
"class" given for an item with the type "https://census.example/person" might refer to the economic
class of an individual, while a property named "class" given for an item with the type
"https://example.com/school/teacher" might refer to the classroom a teacher has been assigned.
Several types can share a vocabulary. For example, the types "https://example.org/people/teacher
" and "https://example.org/people/engineer
" could be defined to use the same vocabulary
(though maybe some properties would not be especially useful in both cases, e.g. maybe the "https://example.org/people/engineer
" type might not typically be used with the
"classroom
" property). Multiple types defined to use the same vocabulary can
be given for a single item by listing the URLs as a space-separated list in the attribute' value.
An item cannot be given two types if they do not use the same vocabulary, however.
Sometimes, an item gives information about a topic that has a global identifier. For example, books can be identified by their ISBN number.
Vocabularies (as identified by the itemtype
attribute) can
be designed such that items get associated with their global
identifier in an unambiguous way by expressing the global identifiers as URLs given in an itemid
attribute.
The exact meaning of the URLs given in itemid
attributes depends on the vocabulary used.
Here, an item is talking about a particular book:
<dl itemscope
itemtype="https://vocab.example.net/book"
itemid="urn:isbn:0-330-34032-8">
<dt>Title
<dd itemprop="title">The Reality Dysfunction
<dt>Author
<dd itemprop="author">Peter F. Hamilton
<dt>Publication date
<dd><time itemprop="pubdate" datetime="1996-01-26">26 January 1996</time>
</dl>
The "https://vocab.example.net/book
" vocabulary in this example would
define that the itemid
attribute takes a urn:
URL pointing to the ISBN of the book.
Using microdata means using a vocabulary. For some purposes, an ad-hoc vocabulary is adequate. For others, a vocabulary will need to be designed. Where possible, authors are encouraged to re-use existing vocabularies, as this makes content re-use easier.
When designing new vocabularies, identifiers can be created either using URLs, or, for properties, as plain words (with no dots or colons). For URLs, conflicts with other vocabularies can be avoided by only using identifiers that correspond to pages that the author has control over.
For instance, if Jon and Adam both write content at example.com
, at https://example.com/~jon/...
and https://example.com/~adam/...
respectively, then
they could select identifiers of the form
"https://example.com/~jon/name" and "https://example.com/~adam/name"
respectively.
Properties whose names are just plain words can only be used within the context of the types for which they are intended; properties named using URLs can be reused in items of any type. If an item has no type, and is not part of another item, then if its properties have names that are just plain words, they are not intended to be globally unique, and are instead only intended for limited use. Generally speaking, authors are encouraged to use either properties with globally unique names (URLs) or ensure that their items are typed.
Here, an item is an "https://example.org/animals#cat", and most of the properties have names that are words defined in the context of that type. There are also a few additional properties whose names come from other vocabularies.
<section itemscope itemtype="https://example.org/animals#cat">
<h1 itemprop="name https://example.com/fn">Hedral</h1>
<p itemprop="desc">Hedral is a male American domestic
shorthair, with a fluffy <span
itemprop="https://example.com/color">black</span> fur with <span
itemprop="https://example.com/color">white</span> paws and belly.</p>
<img itemprop="img" src="hedral.jpeg" alt="" title="Hedral, age 18 months">
</section>
This example has one item with the type "https://example.org/animals#cat" and the following properties:
Property | Value |
name | Hedral |
https://example.com/fn | Hedral |
desc | Hedral is a male American domestic shorthair, with a fluffy black fur with white paws and belly. |
https://example.com/color | black |
https://example.com/color | white |
img | .../hedral.jpeg |
The microdata model consists of groups of name-value pairs known as items.
Each group is known as an item. Each item can have item types, a global identifier (if the vocabulary specified by the item types support global identifiers for items), and a list of name-value pairs. Each name in the name-value pair is known as a property, and each property has one or more values. Each value is either a string or itself a group of name-value pairs (an item). The names are unordered relative to each other, but if a particular name has multiple values, they do have a relative order.
Every HTML element may have an itemscope
attribute specified. The
itemscope
attribute is a boolean attribute.
An element with the itemscope
attribute specified creates a
new item, a group of name-value pairs.
Elements with an itemscope
attribute may have an itemtype
attribute
specified, to give the item types of the item.
The itemtype
attribute, if specified, must have a value that
is an unordered set of unique space-separated tokens, none of which are
identical to another token and each of which is a valid URL string that
is an absolute URL, and all of which are defined to use the same vocabulary. The
attribute's value must have at least one token.
The item types of an item are the tokens obtained
by splitting the element's itemtype
attribute's value on ASCII whitespace. If the itemtype
attribute is missing or parsing it in this way finds no
tokens, the item is said to have no item types.
The item types must all be types defined in applicable specifications and must all be defined to use the same vocabulary.
Except if otherwise specified by that specification, the URLs given as the item types should not be automatically dereferenced.
A specification could define that its item type can be dereferenced to provide the user with help information, for example. In fact, vocabulary authors are encouraged to provide useful information at the given URL.
Item types are opaque identifiers, and user agents must not dereference unknown item types, or otherwise deconstruct them, in order to determine how to process items that use them.
The itemtype
attribute must not be specified on elements
that do not have an itemscope
attribute specified.
An item is said to be a typed item when either it has an item type, or it is the value of a property of a typed item. The relevant types for a typed item is the item's item types, if it has any, or else is the relevant types of the item for which it is a property's value.
Elements with an itemscope
attribute and an itemtype
attribute that references a vocabulary that is defined to
support global identifiers for items may also have an itemid
attribute specified, to give a
global identifier for the item, so that it can be related to
other items on pages elsewhere on the web.
The itemid
attribute, if specified, must have a value that is
a valid URL potentially surrounded by spaces.
The global identifier of an item is the value of
its element's itemid
attribute, if it has one, parsed relative to the node document of the
element on which the attribute is specified. If the itemid
attribute is missing or if parsing it returns failure, it is said to have no global
identifier.
The itemid
attribute must not be specified on elements that do
not have both an itemscope
attribute and an itemtype
attribute specified, and must not be specified on elements
with an itemscope
attribute whose itemtype
attribute specifies a vocabulary that does not support
global identifiers for items, as defined by that vocabulary's specification.
The exact meaning of a global identifier is determined by the vocabulary's specification. It is up to such specifications to define whether multiple items with the same global identifier (whether on the same page or on different pages) are allowed to exist, and what the processing rules for that vocabulary are with respect to handling the case of multiple items with the same ID.
Elements with an itemscope
attribute may have an itemref
attribute
specified, to give a list of additional elements to crawl to find the name-value pairs of the
item.
The itemref
attribute, if specified, must have a value that
is an unordered set of unique space-separated tokens none of which are
identical to another token and consisting of IDs of
elements in the same tree.
The itemref
attribute must not be specified on elements that
do not have an itemscope
attribute specified.
The itemref
attribute is not part of the
microdata data model. It is merely a syntactic construct to aid authors in adding annotations to
pages where the data to be annotated does not follow a convenient tree structure. For example, it
allows authors to mark up data in a table so that each column defines a separate item, while keeping the properties in the cells.
This example shows a simple vocabulary used to describe the products of a model railway manufacturer. The vocabulary has just five property names:
This vocabulary has four defined item types:
Each item that uses this vocabulary can be given one or more of these types, depending on what the product is.
Thus, a locomotive might be marked up as:
<dl itemscope itemtype="https://md.example.com/loco
https://md.example.com/lighting">
<dt>Name:
<dd itemprop="name">Tank Locomotive (DB 80)
<dt>Product code:
<dd itemprop="product-code">33041
<dt>Scale:
<dd itemprop="scale">HO
<dt>Digital:
<dd itemprop="digital">Delta
</dl>
A turnout lantern retrofit kit might be marked up as:
<dl itemscope itemtype="https://md.example.com/track
https://md.example.com/lighting">
<dt>Name:
<dd itemprop="name">Turnout Lantern Kit
<dt>Product code:
<dd itemprop="product-code">74470
<dt>Purpose:
<dd>For retrofitting 2 <span itemprop="track-type">C</span> Track
turnouts. <meta itemprop="scale" content="HO">
</dl>
A passenger car with no lighting might be marked up as:
<dl itemscope itemtype="https://md.example.com/passengers">
<dt>Name:
<dd itemprop="name">Express Train Passenger Car (DB Am 203)
<dt>Product code:
<dd itemprop="product-code">8710
<dt>Scale:
<dd itemprop="scale">Z
</dl>
Great care is necessary when creating new vocabularies. Often, a hierarchical approach to types can be taken that results in a vocabulary where each item only ever has a single type, which is generally much simpler to manage.
itemprop
attributeEvery HTML element may have an itemprop
attribute specified, if doing so adds one or more properties to one or more items (as defined below).
The itemprop
attribute, if specified, must have a value
that is an unordered set of unique space-separated tokens none of which are
identical to another token, representing the names of the name-value pairs that it
adds. The attribute's value must have at least one token.
Each token must be either:
Specifications that introduce defined property names must ensure all such property names contain no U+002E FULL STOP characters (.), no U+003A COLON characters (:), and no ASCII whitespace.
The rules above disallow U+003A COLON characters (:) in non-URL values because otherwise they could not be distinguished from URLs. Values with U+002E FULL STOP characters (.) are reserved for future extensions. ASCII whitespace are disallowed because otherwise the values would be parsed as multiple tokens.
When an element with an itemprop
attribute adds a property to multiple items,
the requirement above regarding the tokens applies for each item
individually.
The property names of an element are the tokens that the element's itemprop
attribute is found to contain when its value is split on ASCII whitespace, with the order
preserved but with duplicates removed (leaving only the first occurrence of each name).
Within an item, the properties are unordered with respect to each other, except for properties with the same name, which are ordered in the order they are given by the algorithm that defines the properties of an item.
In the following example, the "a" property has the values "1" and "2", in that order, but whether the "a" property comes before the "b" property or not is not important:
<div itemscope>
<p itemprop="a">1</p>
<p itemprop="a">2</p>
<p itemprop="b">test</p>
</div>
Thus, the following is equivalent:
<div itemscope>
<p itemprop="b">test</p>
<p itemprop="a">1</p>
<p itemprop="a">2</p>
</div>
As is the following:
<div itemscope>
<p itemprop="a">1</p>
<p itemprop="b">test</p>
<p itemprop="a">2</p>
</div>
And the following:
<div id="x">
<p itemprop="a">1</p>
</div>
<div itemscope itemref="x">
<p itemprop="b">test</p>
<p itemprop="a">2</p>
</div>
The property value of a name-value pair added by an
element with an itemprop
attribute is as given for the first
matching case in the following list:
itemscope
attributeThe value is the item created by the element.
meta
elementThe value is the value of the element's content
attribute, if any, or the empty string if there is no such attribute.
audio
, embed
, iframe
,
img
, source
, track
, or video
elementThe value is the result of encoding-parsing-and-serializing a URL given the
element's src
attribute's value, relative to the element's node
document, at the time the attribute is set, or the empty string if there is no such
attribute or the result is failure.
a
, area
, or link
elementThe value is the result of encoding-parsing-and-serializing a URL given the
element's href
attribute's value, relative to the element's node
document, at the time the attribute is set, or the empty string if there is no such
attribute or the result is failure.
object
elementThe value is the result of encoding-parsing-and-serializing a URL given the
element's data
attribute's value, relative to the element's node
document, at the time the attribute is set, or the empty string if there is no such
attribute or the result is failure.
data
elementThe value is the value of the element's value
attribute,
if it has one, or the empty string otherwise.
meter
elementThe value is the value of the element's value
attribute,
if it has one, or the empty string otherwise.
time
elementThe value is the element's datetime value.
The value is the element's descendant text content.
The URL property elements are the a
, area
,
audio
, embed
, iframe
, img
, link
,
object
, source
, track
, and video
elements.
If a property's value, as defined by the property's definition, is an absolute URL, the property must be specified using a URL property element.
These requirements do not apply just because a property value happens to match the syntax for a URL. They only apply if the property is explicitly defined as taking such a value.
For example, a book about the first moon landing could be
called "mission:moon". A "title" property from a vocabulary that defines a title as being a string
would not expect the title to be given in an a
element, even though it looks like a
URL. On the other hand, if there was a (rather narrowly scoped!) vocabulary for
"books whose titles look like URLs" which had a "title" property defined to take a URL, then the
property would expect the title to be given in an a
element (or one of the
other URL property elements), because of the requirement above.
To find the properties of an item defined by the element root, the user agent must run the following steps. These steps are also used to flag microdata errors.
Let results, memory, and pending be empty lists of elements.
Add the element root to memory.
Add the child elements of root, if any, to pending.
If root has an itemref
attribute, split the value of that itemref
attribute on ASCII whitespace. For each resulting
token ID, if there is an element in the tree of root with the
ID ID, then add the first such element to
pending.
While pending is not empty:
Remove an element from pending and let current be that element.
If current is already in memory, there is a microdata error; continue.
Add current to memory.
If current does not have an itemscope
attribute, then: add all the child elements of current to
pending.
If current has an itemprop
attribute
specified and has one or more property names, then add current to
results.
Sort results in tree order.
Return results.
A document must not contain any items for which the algorithm to find the properties of an item finds any microdata errors.
An item is a top-level
microdata item if its element does not have an itemprop
attribute.
All itemref
attributes in a Document
must be
such that there are no cycles in the graph formed from representing each item in the Document
as a node in the graph and each
property of an item whose value is another item as an edge in the graph connecting
those two items.
A document must not contain any elements that have an itemprop
attribute that would not be found to be a property of any of
the items in that document were their properties all to be determined.
In this example, a single license statement is applied to two works, using itemref
from the items representing the works:
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Photo gallery</title>
</head>
<body>
<h1>My photos</h1>
<figure itemscope itemtype="http://n.whatwg.org/work" itemref="licenses">
<img itemprop="work" src="images/house.jpeg" alt="A white house, boarded up, sits in a forest.">
<figcaption itemprop="title">The house I found.</figcaption>
</figure>
<figure itemscope itemtype="http://n.whatwg.org/work" itemref="licenses">
<img itemprop="work" src="images/mailbox.jpeg" alt="Outside the house is a mailbox. It has a leaflet inside.">
<figcaption itemprop="title">The mailbox.</figcaption>
</figure>
<footer>
<p id="licenses">All images licensed under the <a itemprop="license"
href="http://www.opensource.org/licenses/mit-license.php">MIT
license</a>.</p>
</footer>
</body>
</html>
The above results in two items with the type "http://n.whatwg.org/work
",
one with:
images/house.jpeg
http://www.opensource.org/licenses/mit-license.php
...and one with:
images/mailbox.jpeg
http://www.opensource.org/licenses/mit-license.php
Currently, the itemscope
, itemprop
, and other microdata attributes are only defined for
HTML elements. This means that attributes with the literal names "itemscope
", "itemprop
", etc, do not cause microdata
processing to occur on elements in other namespaces, such as SVG.
Thus, in the following example there is only one item, not two.
<p itemscope></p> <!-- this is an item (with no properties and no type) -->
<svg itemscope></svg> <!-- this is not, it's just an SVG svg
element with an invalid unknown attribute -->
The vocabularies in this section are primarily intended to demonstrate how a vocabulary is specified, though they are also usable in their own right.
An item with the item type http://microformats.org/profile/hcard
represents a person's or
organization's contact information.
This vocabulary does not support global identifiers for items.
The following are the type's defined property names. They are based on the vocabulary defined in vCard Format Specification (vCard) and its extensions, where more information on how to interpret the values can be found. RFC6350
kind
Describes what kind of contact the item represents.
The value must be text that is identical to one of the kind strings.
A single property with the name kind
may be present within
each item with the type http://microformats.org/profile/hcard
.
fn
Gives the formatted text corresponding to the name of the person or organization.
The value must be text.
Exactly one property with the name fn
must be present within
each item with the type http://microformats.org/profile/hcard
.
n
Gives the structured name of the person or organization.
The value must be an item with zero or more of each of the family-name
, given-name
, additional-name
, honorific-prefix
, and honorific-suffix
properties.
Exactly one property with the name n
must be present within
each item with the type http://microformats.org/profile/hcard
.
family-name
(inside n
)Gives the family name of the person, or the full name of the organization.
The value must be text.
Any number of properties with the name family-name
may be present within the item that forms the value of the n
property of
an item with the type http://microformats.org/profile/hcard
.
given-name
(inside n
)Gives the given-name of the person.
The value must be text.
Any number of properties with the name given-name
may be present within the item that forms the value of the n
property of
an item with the type http://microformats.org/profile/hcard
.
additional-name
(inside n
)Gives the any additional names of the person.
The value must be text.
Any number of properties with the name additional-name
may be present within the item that forms the value of the n
property of
an item with the type http://microformats.org/profile/hcard
.
honorific-prefix
(inside n
)Gives the honorific prefix of the person.
The value must be text.
Any number of properties with the name honorific-prefix
may be present within the item that forms the value of the n
property of
an item with the type http://microformats.org/profile/hcard
.
honorific-suffix
(inside n
)Gives the honorific suffix of the person.
The value must be text.
Any number of properties with the name honorific-suffix
may be present within the item that forms the value of the n
property of
an item with the type http://microformats.org/profile/hcard
.
nickname
Gives the nickname of the person or organization.
The nickname is the descriptive name given instead of or in addition to the one
belonging to a person, place, or thing. It can also be used to specify a familiar form of a
proper name specified by the fn
or n
properties.
The value must be text.
Any number of properties with the name nickname
may be
present within each item with the type http://microformats.org/profile/hcard
.
photo
Gives a photograph of the person or organization.
The value must be an absolute URL.
Any number of properties with the name photo
may be
present within each item with the type http://microformats.org/profile/hcard
.
bday
Gives the birth date of the person or organization.
The value must be a valid date string.
A single property with the name bday
may be present within
each item with the type http://microformats.org/profile/hcard
.
anniversary
Gives the birth date of the person or organization.
The value must be a valid date string.
A single property with the name anniversary
may be
present within each item with the type http://microformats.org/profile/hcard
.
sex
Gives the biological sex of the person.
The value must be one of
F
, meaning "female",
M
, meaning "male",
N
, meaning "none or not applicable",
O
, meaning "other", or
U
, meaning "unknown".
A single property with the name sex
may be present within
each item with the type http://microformats.org/profile/hcard
.
gender-identity
Gives the gender identity of the person.
The value must be text.
A single property with the name gender-identity
may be present within each item with the type http://microformats.org/profile/hcard
.
adr
Gives the delivery address of the person or organization.
The value must be an item with zero or more type
,
post-office-box
, extended-address
, and street-address
properties, and optionally a locality
property, optionally a region
property, optionally a postal-code
property, and optionally a country-name
property.
If no type
properties are present within an item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
, then the address type string work
is
implied.
Any number of properties with the name adr
may be present
within each item with the type http://microformats.org/profile/hcard
.
type
(inside adr
)Gives the type of delivery address.
The value must be text that is identical to one of the address type strings.
Any number of properties with the name type
may be
present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
, but within each such adr
property item there must only
be one type
property per distinct value.
post-office-box
(inside adr
)Gives the post office box component of the delivery address of the person or organization.
The value must be text.
Any number of properties with the name post-office-box
may be present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
.
vCard urges authors not to use this field.
extended-address
(inside adr
)Gives an additional component of the delivery address of the person or organization.
The value must be text.
Any number of properties with the name extended-address
may be present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
.
vCard urges authors not to use this field.
street-address
(inside adr
)Gives the street address component of the delivery address of the person or organization.
The value must be text.
Any number of properties with the name street-address
may be present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
.
locality
(inside adr
)Gives the locality component (e.g. city) of the delivery address of the person or organization.
The value must be text.
A single property with the name locality
may be
present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
.
region
(inside adr
)Gives the region component (e.g. state or province) of the delivery address of the person or organization.
The value must be text.
A single property with the name region
may be
present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
.
postal-code
(inside adr
)Gives the postal code component of the delivery address of the person or organization.
The value must be text.
A single property with the name postal-code
may
be present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
.
country-name
(inside adr
)Gives the country name component of the delivery address of the person or organization.
The value must be text.
A single property with the name country-name
may be present within the item that forms the value of an adr
property
of an item with the type http://microformats.org/profile/hcard
.
tel
Gives the telephone number of the person or organization.
The value must be either text that can be
interpreted as a telephone number as defined in the CCITT specifications E.163 and X.121, or an
item with zero or more type
properties and exactly one value
property. E163 X121
If no type
properties are present within an item that forms the value of a tel
property
of an item with the type http://microformats.org/profile/hcard
, or if the value of such a tel
property is text, then the telephone type string
voice
is implied.
Any number of properties with the name tel
may be present
within each item with the type http://microformats.org/profile/hcard
.
type
(inside tel
)Gives the type of telephone number.
The value must be text that is identical to one of the telephone type strings.
Any number of properties with the name type
may be
present within the item that forms the value of a tel
property
of an item with the type http://microformats.org/profile/hcard
, but within each such tel
property item there must only
be one type
property per distinct value.
value
(inside tel
)Gives the actual telephone number of the person or organization.
The value must be text that can be interpreted as a telephone number as defined in the CCITT specifications E.163 and X.121. E163 X121
Exactly one property with the name value
must be
present within the item that forms the value of a tel
property
of an item with the type http://microformats.org/profile/hcard
.
email
Gives the email address of the person or organization.
The value must be text.
Any number of properties with the name email
may be
present within each item with the type http://microformats.org/profile/hcard
.
impp
Gives a URL for instant messaging and presence protocol communications with the person or organization.
The value must be an absolute URL.
Any number of properties with the name impp
may be present
within each item with the type http://microformats.org/profile/hcard
.
lang
Gives a language understood by the person or organization.
The value must be a valid BCP 47 language tag. BCP47
Any number of properties with the name lang
may be present
within each item with the type http://microformats.org/profile/hcard
.
tz
Gives the time zone of the person or organization.
The value must be text and must match the following syntax:
Any number of properties with the name tz
may be present
within each item with the type http://microformats.org/profile/hcard
.
geo
Gives the geographical position of the person or organization.
The value must be text and must match the following syntax:
The optional components marked with an asterisk (*) should be included, and should have six digits each.
The value specifies latitude and longitude, in that order (i.e., "LAT LON" ordering), in decimal degrees. The longitude represents the location east and west of the prime meridian as a positive or negative real number, respectively. The latitude represents the location north and south of the equator as a positive or negative real number, respectively.
Any number of properties with the name geo
may be present
within each item with the type http://microformats.org/profile/hcard
.
title
Gives the job title, functional position or function of the person or organization.
The value must be text.
Any number of properties with the name title
may be
present within each item with the type http://microformats.org/profile/hcard
.
role
Gives the role, occupation, or business category of the person or organization.
The value must be text.
Any number of properties with the name role
may be present
within each item with the type http://microformats.org/profile/hcard
.
logo
Gives the logo of the person or organization.
The value must be an absolute URL.
Any number of properties with the name logo
may be present
within each item with the type http://microformats.org/profile/hcard
.
agent
Gives the contact information of another person who will act on behalf of the person or organization.
The value must be either an item with the type http://microformats.org/profile/hcard
, or an absolute URL,
or text.
Any number of properties with the name agent
may be
present within each item with the type http://microformats.org/profile/hcard
.
org
Gives the name and units of the organization.
The value must be either text or an item with one organization-name
property and zero or more organization-unit
properties.
Any number of properties with the name org
may be present
within each item with the type http://microformats.org/profile/hcard
.
organization-name
(inside org
)Gives the name of the organization.
The value must be text.
Exactly one property with the name organization-name
must be present within the item that forms the value of an org
property
of an item with the type http://microformats.org/profile/hcard
.
organization-unit
(inside org
)Gives the name of the organization unit.
The value must be text.
Any number of properties with the name organization-unit
may be present within the item that forms the value of the org
property of an item with the type http://microformats.org/profile/hcard
.
member
Gives a URL that represents a member of the group.
The value must be an absolute URL.
Any number of properties with the name member
may be
present within each item with the type http://microformats.org/profile/hcard
if the item also has a property with the name kind
whose value is "group
".
related
Gives a relationship to another entity.
The value must be an item with one url
property and one rel
properties.
Any number of properties with the name related
may be
present within each item with the type http://microformats.org/profile/hcard
.
url
(inside related
)Gives the URL for the related entity.
The value must be an absolute URL.
Exactly one property with the name url
must be
present within the item that forms the value of a related
property of an item with the type http://microformats.org/profile/hcard
.
rel
(inside related
)Gives the relationship between the entity and the related entity.
The value must be text that is identical to one of the relationship strings.
Exactly one property with the name rel
must be
present within the item that forms the value of a related
property of an item with the type http://microformats.org/profile/hcard
.
categories
Gives the name of a category or tag that the person or organization could be classified as.
The value must be text.
Any number of properties with the name categories
may be present within each item with the type http://microformats.org/profile/hcard
.
note
Gives supplemental information or a comment about the person or organization.
The value must be text.
Any number of properties with the name note
may be present
within each item with the type http://microformats.org/profile/hcard
.
rev
Gives the revision date and time of the contact information.
The value must be text that is a valid global date and time string.
The value distinguishes the current revision of the information for other renditions of the information.
Any number of properties with the name rev
may be present
within each item with the type http://microformats.org/profile/hcard
.
sound
Gives a sound file relating to the person or organization.
The value must be an absolute URL.
Any number of properties with the name sound
may be
present within each item with the type http://microformats.org/profile/hcard
.
uid
Gives a globally unique identifier corresponding to the person or organization.
The value must be text.
A single property with the name uid
may be present within
each item with the type http://microformats.org/profile/hcard
.
url
Gives a URL relating to the person or organization.
The value must be an absolute URL.
Any number of properties with the name url
may be present
within each item with the type http://microformats.org/profile/hcard
.
The kind strings are:
individual
Indicates a single entity (e.g. a person).
group
Indicates multiple entities (e.g. a mailing list).
org
Indicates a single entity that is not a person (e.g. a company).
location
Indicates a geographical place (e.g. an office building).
The address type strings are:
home
Indicates a delivery address for a residence.
work
Indicates a delivery address for a place of work.
The telephone type strings are:
home
Indicates a residential number.
work
Indicates a telephone number for a place of work.
text
Indicates that the telephone number supports text messages (SMS).
voice
Indicates a voice telephone number.
fax
Indicates a facsimile telephone number.
cell
Indicates a cellular telephone number.
video
Indicates a video conferencing telephone number.
pager
Indicates a paging device telephone number.
textphone
Indicates a telecommunication device for people with hearing or speech difficulties.
The relationship strings are:
emergency
An emergency contact.
agent
Another entity that acts on behalf of this entity.
Has the meaning defined in XFN. XFN
Given a list of nodes nodes in a Document
, a user agent must
run the following algorithm to extract any vCard data represented
by those nodes (only the first vCard is returned):
If none of the nodes in nodes are items with the item type http://microformats.org/profile/hcard
, then there is no vCard. Abort the
algorithm, returning nothing.
Let node be the first node in nodes that is an
item with the item type http://microformats.org/profile/hcard
.
Let output be an empty string.
Add a vCard line with the type "BEGIN
" and the value
"VCARD
" to output.
Add a vCard line with the type "PROFILE
" and the value
"VCARD
" to output.
Add a vCard line with the type "VERSION
" and the value
"4.0
" to output.
Add a vCard line with the type "SOURCE
" and the result
of escaping the vCard text string that is the document's URL as the value to output.
If the title
element is not null, add a vCard line
with the type "NAME
" and with the result of escaping the vCard text
string obtained from the title
element's descendant
text content as the value to output.
Let sex be the empty string.
Let gender-identity be the empty string.
For each element element that is a property of the item node: for each name name in element's property names, run the following substeps:
Let parameters be an empty set of name-value pairs.
Run the appropriate set of substeps from the following list. The steps will set a variable value, which is used in the next step.
n
Let value be the empty string.
Append to value the result of collecting the first vCard
subproperty named family-name
in subitem.
Append to value the result of collecting the first vCard
subproperty named given-name
in subitem.
Append to value the result of collecting the first vCard
subproperty named additional-name
in
subitem.
Append to value the result of collecting the first vCard
subproperty named honorific-prefix
in subitem.
Append to value the result of collecting the first vCard
subproperty named honorific-suffix
in subitem.
adr
Let value be the empty string.
Append to value the result of collecting vCard
subproperties named post-office-box
in subitem.
Append to value the result of collecting vCard
subproperties named extended-address
in subitem.
Append to value the result of collecting vCard
subproperties named street-address
in subitem.
Append to value the result of collecting the first vCard
subproperty named locality
in subitem.
Append to value the result of collecting the first vCard
subproperty named region
in subitem.
Append to value the result of collecting the first vCard
subproperty named postal-code
in subitem.
Append to value the result of collecting the first vCard
subproperty named country-name
in
subitem.
If there is a property named type
in
subitem, and the first such property has a value that is not an item and whose value consists only of ASCII alphanumerics, then add a parameter named "TYPE
" whose value is the value of that property to
parameters.
org
Let value be the empty string.
Append to value the result of collecting the first vCard
subproperty named organization-name
in subitem.
For each property named organization-unit
in subitem, run the following steps:
If the value of the property is an item, then skip this property.
Append a U+003B SEMICOLON character (;) to value.
Append the result of escaping the vCard text string given by the value of the property to value.
http://microformats.org/profile/hcard
and name is related
Let value be the empty string.
If there is a property named url
in
subitem, and its element is a URL property
element, then append the result of escaping the vCard text string given
by the value of the first such property to
value, and add a parameter with the name "VALUE
" and the
value "URI
" to parameters.
If there is a property named rel
in
subitem, and the first such property has a value that is not an item and whose value consists only of ASCII alphanumerics, then add a parameter named "RELATION
" whose value is the value of that property to
parameters.
Let value be the result of collecting the first vCard
subproperty named value
in subitem.
If there is a property named type
in subitem, and
the first such property has a value that is
not an item and whose value consists only of ASCII alphanumerics, then add a parameter named "TYPE
" whose value is the value of that property to
parameters.
sex
If this is the first such property to be found, set sex to the property's value.
gender-identity
If this is the first such property to be found, set gender-identity to the property's value.
Let value be the property's value.
If element is one of the URL property elements, add
a parameter with the name "VALUE
" and the value "URI
" to parameters.
Otherwise, if name is bday
or
anniversary
and the value is
a valid date string, add a parameter with the name "VALUE
" and the value "DATE
" to parameters.
Otherwise, if name is rev
and
the value is a valid global date and time string, add a
parameter with the name "VALUE
" and the value "DATE-TIME
" to parameters.
Prefix every U+005C REVERSE SOLIDUS character (\) in value with another U+005C REVERSE SOLIDUS character (\).
Prefix every U+002C COMMA character (,) in value with a U+005C REVERSE SOLIDUS character (\).
Unless name is geo
, prefix
every U+003B SEMICOLON character (;) in value with a U+005C REVERSE
SOLIDUS character (\).
Replace every U+000D CARRIAGE RETURN U+000A LINE FEED character pair (CRLF) in value with a U+005C REVERSE SOLIDUS character (\) followed by a U+006E LATIN SMALL LETTER N character (n).
Replace every remaining U+000D CARRIAGE RETURN (CR) or U+000A LINE FEED (LF) character in value with a U+005C REVERSE SOLIDUS character (\) followed by a U+006E LATIN SMALL LETTER N character (n).
Add a vCard line with the type name, the parameters parameters, and the value value to output.
If either sex or gender-identity has a value that
is not the empty string, add a vCard line with the type "GENDER
" and the value consisting of the concatenation of sex,
a U+003B SEMICOLON character (;), and gender-identity to output.
Add a vCard line with the type "END
" and the value
"VCARD
" to output.
When the above algorithm says that the user agent is to add a vCard line consisting of a type type, optionally some parameters, and a value value to a string output, it must run the following steps:
Let line be an empty string.
Append type, converted to ASCII uppercase, to line.
If there are any parameters, then for each parameter, in the order that they were added, run these substeps:
Append a U+003B SEMICOLON character (;) to line.
Append the parameter's name to line.
Append a U+003D EQUALS SIGN character (=) to line.
Append the parameter's value to line.
Append a U+003A COLON character (:) to line.
Append value to line.
Let maximum length be 75.
While line's code point length is greater than maximum length:
Append the first maximum length code points of line to output.
Remove the first maximum length code points from line.
Append a U+000D CARRIAGE RETURN character (CR) to output.
Append a U+000A LINE FEED character (LF) to output.
Append a U+0020 SPACE character to output.
Let maximum length be 74.
Append (what remains of) line to output.
Append a U+000D CARRIAGE RETURN character (CR) to output.
Append a U+000A LINE FEED character (LF) to output.
When the steps above require the user agent to obtain the result of collecting vCard subproperties named subname in subitem, the user agent must run the following steps:
Let value be the empty string.
For each property named subname in the item subitem, run the following substeps:
If the value of the property is itself an item, then skip this property.
If this is not the first property named subname in subitem (ignoring any that were skipped by the previous step), then append a U+002C COMMA character (,) to value.
Append the result of escaping the vCard text string given by the value of the property to value.
Return value.
When the steps above require the user agent to obtain the result of collecting the first vCard subproperty named subname in subitem, the user agent must run the following steps:
If there are no properties named subname in subitem, then return the empty string.
If the value of the first property named subname in subitem is an item, then return the empty string.
Return the result of escaping the vCard text string given by the value of the first property named subname in subitem.
When the above algorithms say the user agent is to escape the vCard text string value, the user agent must use the following steps:
Prefix every U+005C REVERSE SOLIDUS character (\) in value with another U+005C REVERSE SOLIDUS character (\).
Prefix every U+002C COMMA character (,) in value with a U+005C REVERSE SOLIDUS character (\).
Prefix every U+003B SEMICOLON character (;) in value with a U+005C REVERSE SOLIDUS character (\).
Replace every U+000D CARRIAGE RETURN U+000A LINE FEED character pair (CRLF) in value with a U+005C REVERSE SOLIDUS character (\) followed by a U+006E LATIN SMALL LETTER N character (n).
Replace every remaining U+000D CARRIAGE RETURN (CR) or U+000A LINE FEED (LF) character in value with a U+005C REVERSE SOLIDUS character (\) followed by a U+006E LATIN SMALL LETTER N character (n).
Return the mutated value.
This algorithm can generate invalid vCard output, if the input does not conform to
the rules described for the http://microformats.org/profile/hcard
item type and defined property
names.
Here is a long example vCard for a fictional character called "Jack Bauer":
<section id="jack" itemscope itemtype="http://microformats.org/profile/hcard">
<h1 itemprop="fn">
<span itemprop="n" itemscope>
<span itemprop="given-name">Jack</span>
<span itemprop="family-name">Bauer</span>
</span>
</h1>
<img itemprop="photo" alt="" src="jack-bauer.jpg">
<p itemprop="org" itemscope>
<span itemprop="organization-name">Counter-Terrorist Unit</span>
(<span itemprop="organization-unit">Los Angeles Division</span>)
</p>
<p>
<span itemprop="adr" itemscope>
<span itemprop="street-address">10201 W. Pico Blvd.</span><br>
<span itemprop="locality">Los Angeles</span>,
<span itemprop="region">CA</span>
<span itemprop="postal-code">90064</span><br>
<span itemprop="country-name">United States</span><br>
</span>
<span itemprop="geo">34.052339;-118.410623</span>
</p>
<h2>Assorted Contact Methods</h2>
<ul>
<li itemprop="tel" itemscope>
<span itemprop="value">+1 (310) 597 3781</span> <span itemprop="type">work</span>
<meta itemprop="type" content="voice">
</li>
<li><a itemprop="url" href="https://en.wikipedia.org/wiki/Jack_Bauer">I'm on Wikipedia</a>
so you can leave a message on my user talk page.</li>
<li><a itemprop="url" href="http://www.jackbauerfacts.com/">Jack Bauer Facts</a></li>
<li itemprop="email"><a href="mailto:j.bauer@la.ctu.gov.invalid">j.bauer@la.ctu.gov.invalid</a></li>
<li itemprop="tel" itemscope>
<span itemprop="value">+1 (310) 555 3781</span> <span>
<meta itemprop="type" content="cell">mobile phone</span>
</li>
</ul>
<ins datetime="2008-07-20 21:00:00+01:00">
<meta itemprop="rev" content="2008-07-20 21:00:00+01:00">
<p itemprop="tel" itemscope><strong>Update!</strong>
My new <span itemprop="type">home</span> phone number is
<span itemprop="value">01632 960 123</span>.</p>
</ins>
</section>
The odd line wrapping is needed because newlines are meaningful in microdata: newlines would be preserved in a conversion to, for example, the vCard format.
This example shows a site's contact details (using the address
element)
containing an address with two street components:
<address itemscope itemtype="http://microformats.org/profile/hcard">
<strong itemprop="fn"><span itemprop="n" itemscope><span itemprop="given-name">Alfred</span>
<span itemprop="family-name">Person</span></span></strong> <br>
<span itemprop="adr" itemscope>
<span itemprop="street-address">1600 Amphitheatre Parkway</span> <br>
<span itemprop="street-address">Building 43, Second Floor</span> <br>
<span itemprop="locality">Mountain View</span>,
<span itemprop="region">CA</span> <span itemprop="postal-code">94043</span>
</span>
</address>
The vCard vocabulary can be used to just mark up people's names:
<span itemscope itemtype="http://microformats.org/profile/hcard"
><span itemprop=fn><span itemprop="n" itemscope><span itemprop="given-name"
>George</span> <span itemprop="family-name">Washington</span></span
></span></span>
This creates a single item with a two name-value pairs, one with the name "fn" and the value "George Washington", and the other with the name "n" and a second item as its value, the second item having the two name-value pairs "given-name" and "family-name" with the values "George" and "Washington" respectively. This is defined to map to the following vCard:
BEGIN:VCARD PROFILE:VCARD VERSION:4.0 SOURCE:document's address FN:George Washington N:Washington;George;;; END:VCARD
An item with the item type http://microformats.org/profile/hcalendar#vevent
represents
an event.
This vocabulary does not support global identifiers for items.
The following are the type's defined property names. They are based on the vocabulary defined in Internet Calendaring and Scheduling Core Object Specification (iCalendar), where more information on how to interpret the values can be found. RFC5545
Only the parts of the iCalendar vocabulary relating to events are used here; this vocabulary cannot express a complete iCalendar instance.
attach
Gives the address of an associated document for the event.
The value must be an absolute URL.
Any number of properties with the name attach
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
categories
Gives the name of a category or tag that the event could be classified as.
The value must be text.
Any number of properties with the name categories
may be present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
class
Gives the access classification of the information regarding the event.
The value must be text with one of the following values:
public
private
confidential
This is merely advisory and cannot be considered a confidentiality measure.
A single property with the name class
may be present
within each item with the type http://microformats.org/profile/hcalendar#vevent
.
comment
Gives a comment regarding the event.
The value must be text.
Any number of properties with the name comment
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
description
Gives a detailed description of the event.
The value must be text.
A single property with the name description
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
geo
Gives the geographical position of the event.
The value must be text and must match the following syntax:
The optional components marked with an asterisk (*) should be included, and should have six digits each.
The value specifies latitude and longitude, in that order (i.e., "LAT LON" ordering), in decimal degrees. The longitude represents the location east and west of the prime meridian as a positive or negative real number, respectively. The latitude represents the location north and south of the equator as a positive or negative real number, respectively.
A single property with the name geo
may be present within
each item with the type http://microformats.org/profile/hcalendar#vevent
.
location
Gives the location of the event.
The value must be text.
A single property with the name location
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
resources
Gives a resource that will be needed for the event.
The value must be text.
Any number of properties with the name resources
may
be present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
status
Gives the confirmation status of the event.
The value must be text with one of the following values:
tentative
confirmed
canceled
A single property with the name status
may be present
within each item with the type http://microformats.org/profile/hcalendar#vevent
.
summary
Gives a short summary of the event.
The value must be text.
User agents should replace U+000A LINE FEED (LF) characters in the value by U+0020 SPACE characters when using the value.
A single property with the name summary
may be present
within each item with the type http://microformats.org/profile/hcalendar#vevent
.
dtend
Gives the date and time by which the event ends.
If the property with the name dtend
is present within an
item with the type http://microformats.org/profile/hcalendar#vevent
that has a property
with the name dtstart
whose value is a valid date
string, then the value of the property with
the name dtend
must be text that is a valid date
string also. Otherwise, the value of the
property must be text that is a valid global date and time string.
In either case, the value be later in time than
the value of the dtstart
property of the same item.
The time given by the dtend
property is not
inclusive. For day-long events, therefore, the dtend
property's value will be the day after the
end of the event.
A single property with the name dtend
may be present
within each item with the type http://microformats.org/profile/hcalendar#vevent
, so long as that http://microformats.org/profile/hcalendar#vevent
does not have a
property with the name duration
.
dtstart
Gives the date and time at which the event starts.
The value must be text that is either a valid date string or a valid global date and time string.
Exactly one property with the name dtstart
must be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
duration
Gives the duration of the event.
The value must be text that is a valid vevent duration string.
The duration represented is the sum of all the durations represented by integers in the value.
A single property with the name duration
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
, so long as that http://microformats.org/profile/hcalendar#vevent
does not have a
property with the name dtend
.
transp
Gives whether the event is to be considered as consuming time on a calendar, for the purpose of free-busy time searches.
The value must be text with one of the following values:
opaque
transparent
A single property with the name transp
may be present
within each item with the type http://microformats.org/profile/hcalendar#vevent
.
contact
Gives the contact information for the event.
The value must be text.
Any number of properties with the name contact
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
url
Gives a URL for the event.
The value must be an absolute URL.
A single property with the name url
may be present within
each item with the type http://microformats.org/profile/hcalendar#vevent
.
uid
Gives a globally unique identifier corresponding to the event.
The value must be text.
A single property with the name uid
may be present within
each item with the type http://microformats.org/profile/hcalendar#vevent
.
exdate
Gives a date and time at which the event does not occur despite the recurrence rules.
The value must be text that is either a valid date string or a valid global date and time string.
Any number of properties with the name exdate
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
rdate
Gives a date and time at which the event recurs.
The value must be text that is one of the following:
Any number of properties with the name rdate
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
rrule
Gives a rule for finding dates and times at which the event occurs.
The value must be text that matches the RECUR value type defined in iCalendar. RFC5545
A single property with the name rrule
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
created
Gives the date and time at which the event information was first created in a calendaring system.
The value must be text that is a valid global date and time string.
A single property with the name created
may be present
within each item with the type http://microformats.org/profile/hcalendar#vevent
.
last-modified
Gives the date and time at which the event information was last modified in a calendaring system.
The value must be text that is a valid global date and time string.
A single property with the name last-modified
may be present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
sequence
Gives a revision number for the event information.
The value must be text that is a valid non-negative integer.
A single property with the name sequence
may be
present within each item with the type http://microformats.org/profile/hcalendar#vevent
.
A string is a valid vevent duration string if it matches the following pattern:
A U+0050 LATIN CAPITAL LETTER P character (P).
One of the following:
A valid non-negative integer followed by a U+0057 LATIN CAPITAL LETTER W character (W). The integer represents a duration of that number of weeks.
At least one, and possible both in this order, of the following:
A valid non-negative integer followed by a U+0044 LATIN CAPITAL LETTER D character (D). The integer represents a duration of that number of days.
A U+0054 LATIN CAPITAL LETTER T character (T) followed by any one of the following, or the first and second of the following in that order, or the second and third of the following in that order, or all three of the following in this order:
A valid non-negative integer followed by a U+0048 LATIN CAPITAL LETTER H character (H). The integer represents a duration of that number of hours.
A valid non-negative integer followed by a U+004D LATIN CAPITAL LETTER M character (M). The integer represents a duration of that number of minutes.
A valid non-negative integer followed by a U+0053 LATIN CAPITAL LETTER S character (S). The integer represents a duration of that number of seconds.
Given a list of nodes nodes in a Document
, a user agent must
run the following algorithm to extract any vEvent data
represented by those nodes:
If none of the nodes in nodes are items with the type http://microformats.org/profile/hcalendar#vevent
, then there is no
vEvent data. Abort the algorithm, returning nothing.
Let output be an empty string.
Add an iCalendar line with the type "BEGIN
" and the
value "VCALENDAR
" to output.
Add an iCalendar line with the type "PRODID
" and the
value equal to a user-agent-specific string representing the user agent to output.
Add an iCalendar line with the type "VERSION
" and the
value "2.0
" to output.
For each node node in nodes that is an item with the type http://microformats.org/profile/hcalendar#vevent
, run the following
steps:
Add an iCalendar line with the type "BEGIN
" and the
value "VEVENT
" to output.
Add an iCalendar line with the type "DTSTAMP
" and a
value consisting of an iCalendar DATE-TIME string representing the current date and time, with
the annotation "VALUE=DATE-TIME
", to output.
RFC5545
For each element element that is a property of the item node: for each name name in element's property names, run the appropriate set of substeps from the following list:
Skip the property.
dtend
dtstart
exdate
rdate
created
last-modified
Let value be the result of stripping all U+002D HYPHEN-MINUS (-) and U+003A COLON (:) characters from the property's value.
If the property's value is a valid date
string then add an iCalendar line with the type name
and the value value to output, with the annotation
"VALUE=DATE
".
Otherwise, if the property's value is a
valid global date and time string then add an iCalendar line with
the type name and the value value to output, with the annotation "VALUE=DATE-TIME
".
Otherwise, skip the property.
Add an iCalendar line with the type name and the property's value to output.
Add an iCalendar line with the type "END
" and the
value "VEVENT
" to output.
Add an iCalendar line with the type "END
" and the value
"VCALENDAR
" to output.
When the above algorithm says that the user agent is to add an iCalendar line consisting of a type type, a value value, and optionally an annotation, to a string output, it must run the following steps:
Let line be an empty string.
Append type, converted to ASCII uppercase, to line.
If there is an annotation:
Append a U+003B SEMICOLON character (;) to line.
Append the annotation to line.
Append a U+003A COLON character (:) to line.
Prefix every U+005C REVERSE SOLIDUS character (\) in value with another U+005C REVERSE SOLIDUS character (\).
Prefix every U+002C COMMA character (,) in value with a U+005C REVERSE SOLIDUS character (\).
Prefix every U+003B SEMICOLON character (;) in value with a U+005C REVERSE SOLIDUS character (\).
Replace every U+000D CARRIAGE RETURN U+000A LINE FEED character pair (CRLF) in value with a U+005C REVERSE SOLIDUS character (\) followed by a U+006E LATIN SMALL LETTER N character (n).
Replace every remaining U+000D CARRIAGE RETURN (CR) or U+000A LINE FEED (LF) character in value with a U+005C REVERSE SOLIDUS character (\) followed by a U+006E LATIN SMALL LETTER N character (n).
Append value to line.
Let maximum length be 75.
While line's code point length is greater than maximum length:
Append the first maximum length code points of line to output.
Remove the first maximum length code points from line.
Append a U+000D CARRIAGE RETURN character (CR) to output.
Append a U+000A LINE FEED character (LF) to output.
Append a U+0020 SPACE character to output.
Let maximum length be 74.
Append (what remains of) line to output.
Append a U+000D CARRIAGE RETURN character (CR) to output.
Append a U+000A LINE FEED character (LF) to output.
This algorithm can generate invalid iCalendar output, if the input does not
conform to the rules described for the http://microformats.org/profile/hcalendar#vevent
item type and defined property names.
Here is an example of a page that uses the vEvent vocabulary to mark up an event:
<body itemscope itemtype="http://microformats.org/profile/hcalendar#vevent">
...
<h1 itemprop="summary">Bluesday Tuesday: Money Road</h1>
...
<time itemprop="dtstart" datetime="2009-05-05T19:00:00Z">May 5th @ 7pm</time>
(until <time itemprop="dtend" datetime="2009-05-05T21:00:00Z">9pm</time>)
...
<a href="http://livebrum.co.uk/2009/05/05/bluesday-tuesday-money-road"
rel="bookmark" itemprop="url">Link to this page</a>
...
<p>Location: <span itemprop="location">The RoadHouse</span></p>
...
<p><input type=button value="Add to Calendar"
onclick="location = getCalendar(this)"></p>
...
<meta itemprop="description" content="via livebrum.co.uk">
</body>
The getCalendar()
function is left as an exercise for the reader.
The same page could offer some markup, such as the following, for copy-and-pasting into blogs:
<div itemscope itemtype="http://microformats.org/profile/hcalendar#vevent">
<p>I'm going to
<strong itemprop="summary">Bluesday Tuesday: Money Road</strong>,
<time itemprop="dtstart" datetime="2009-05-05T19:00:00Z">May 5th at 7pm</time>
to <time itemprop="dtend" datetime="2009-05-05T21:00:00Z">9pm</time>,
at <span itemprop="location">The RoadHouse</span>!</p>
<p><a href="http://livebrum.co.uk/2009/05/05/bluesday-tuesday-money-road"
itemprop="url">See this event on livebrum.co.uk</a>.</p>
<meta itemprop="description" content="via livebrum.co.uk">
</div>
An item with the item type http://n.whatwg.org/work
represents a work (e.g. an article, an
image, a video, a song, etc.). This type is primarily intended to allow authors to include
licensing information for works.
The following are the type's defined property names.
work
Identifies the work being described.
The value must be an absolute URL.
Exactly one property with the name work
must be present
within each item with the type http://n.whatwg.org/work
.
title
Gives the name of the work.
A single property with the name title
may be present
within each item with the type http://n.whatwg.org/work
.
author
Gives the name or contact information of one of the authors or creators of the work.
The value must be either an item with the type http://microformats.org/profile/hcard
, or text.
Any number of properties with the name author
may be
present within each item with the type http://n.whatwg.org/work
.
license
Identifies one of the licenses under which the work is available.
The value must be an absolute URL.
Any number of properties with the name license
may be
present within each item with the type http://n.whatwg.org/work
.
This example shows an embedded image entitled My Pond, licensed under the Creative Commons Attribution-Share Alike 4.0 International License and the MIT license simultaneously.
<figure itemscope itemtype="http://n.whatwg.org/work">
<img itemprop="work" src="mypond.jpeg">
<figcaption>
<p><cite itemprop="title">My Pond</cite></p>
<p><small>Licensed under the <a itemprop="license"
href="https://creativecommons.org/licenses/by-sa/4.0/">Creative
Commons Attribution-Share Alike 4.0 International License</a>
and the <a itemprop="license"
href="http://www.opensource.org/licenses/mit-license.php">MIT
license</a>.</small>
</figcaption>
</figure>
Given a list of nodes nodes in a Document
, a user agent must
run the following algorithm to extract the microdata from those nodes
into a JSON form:
Let result be an empty object.
Let items be an empty array.
For each node in nodes, check if the element is a top-level microdata item, and if it is then get the object for that element and add it to items.
Add an entry to result called "items
" whose
value is the array items.
Return the result of serializing result to JSON in the shortest
possible way (meaning no whitespace between tokens, no unnecessary zero digits in numbers, and
only using Unicode escapes in strings for characters that do not have a dedicated escape
sequence), and with a lowercase "e
" used, when appropriate, in the
representation of any numbers. JSON
This algorithm returns an object with a single property that is an array, instead of just returning an array, so that it is possible to extend the algorithm in the future if necessary.
When the user agent is to get the object for an item item, optionally with a list of elements memory, it must run the following substeps:
Let result be an empty object.
If no memory was passed to the algorithm, let memory be an empty list.
Add item to memory.
If the item has any item types, add an entry to result called "type
" whose value is an array listing the
item types of item, in the order they were specified on the
itemtype
attribute.
If the item has a global identifier, add an entry to result called "id
" whose value is the global
identifier of item.
Let properties be an empty object.
For each element element that has one or more property names and is one of the properties of the item item, in the order those elements are given by the algorithm that returns the properties of an item, run the following substeps:
Let value be the property value of element.
If value is an item, then: If value is in memory, then let value be
the string "ERROR
". Otherwise, get the object for value, passing a copy of memory, and then replace value with the object returned from those steps.
For each name name in element's property names, run the following substeps:
If there is no entry named name in properties, then add an entry named name to properties whose value is an empty array.
Append value to the entry named name in properties.
Add an entry to result called "properties
" whose
value is the object properties.
Return result.
For example, take this markup:
<!DOCTYPE HTML>
<html lang="en">
<title>My Blog</title>
<article itemscope itemtype="http://schema.org/BlogPosting">
<header>
<h1 itemprop="headline">Progress report</h1>
<p><time itemprop="datePublished" datetime="2013-08-29">today</time></p>
<link itemprop="url" href="?comments=0">
</header>
<p>All in all, he's doing well with his swim lessons. The biggest thing was he had trouble
putting his head in, but we got it down.</p>
<section>
<h1>Comments</h1>
<article itemprop="comment" itemscope itemtype="http://schema.org/UserComments" id="c1">
<link itemprop="url" href="#c1">
<footer>
<p>Posted by: <span itemprop="creator" itemscope itemtype="http://schema.org/Person">
<span itemprop="name">Greg</span>
</span></p>
<p><time itemprop="commentTime" datetime="2013-08-29">15 minutes ago</time></p>
</footer>
<p>Ha!</p>
</article>
<article itemprop="comment" itemscope itemtype="http://schema.org/UserComments" id="c2">
<link itemprop="url" href="#c2">
<footer>
<p>Posted by: <span itemprop="creator" itemscope itemtype="http://schema.org/Person">
<span itemprop="name">Charlotte</span>
</span></p>
<p><time itemprop="commentTime" datetime="2013-08-29">5 minutes ago</time></p>
</footer>
<p>When you say "we got it down"...</p>
</article>
</section>
</article>
It would be turned into the following JSON by the algorithm above (supposing that the page's
URL was https://blog.example.com/progress-report
):
{
"items": [
{
"type": [ "http://schema.org/BlogPosting" ],
"properties": {
"headline": [ "Progress report" ],
"datePublished": [ "2013-08-29" ],
"url": [ "https://blog.example.com/progress-report?comments=0" ],
"comment": [
{
"type": [ "http://schema.org/UserComments" ],
"properties": {
"url": [ "https://blog.example.com/progress-report#c1" ],
"creator": [
{
"type": [ "http://schema.org/Person" ],
"properties": {
"name": [ "Greg" ]
}
}
],
"commentTime": [ "2013-08-29" ]
}
},
{
"type": [ "http://schema.org/UserComments" ],
"properties": {
"url": [ "https://blog.example.com/progress-report#c2" ],
"creator": [
{
"type": [ "http://schema.org/Person" ],
"properties": {
"name": [ "Charlotte" ]
}
}
],
"commentTime": [ "2013-08-29" ]
}
}
]
}
}
]
}
hidden
attributeAll HTML elements may have the hidden
content attribute set. The hidden
attribute is an enumerated attribute with the
following keywords and states:
Keyword | State | Brief description |
---|---|---|
hidden
| hidden | Will not be rendered. |
(the empty string) | ||
until-found
| hidden until found | Will not be rendered, but content inside will be accessible to find-in-page and fragment navigation. |
The attribute's missing value default is the not hidden state, and its invalid value default is the hidden state.
When an element has the hidden
attribute in the hidden state, it indicates that the element is not yet, or
is no longer, directly relevant to the page's current state, or that it is being used to declare
content to be reused by other parts of the page as opposed to being directly accessed by the user.
User agents should not render elements that are in the hidden state. This requirement may be implemented
indirectly through the style layer. For example, a web browser could implement these requirements
using the rules suggested in the Rendering section.
When an element has the hidden
attribute in the hidden until found state, it indicates that the
element is hidden like the hidden state but the
content inside the element will be accessible to find-in-page and fragment navigation. When these features attempt to scroll to a
target which is in the element's subtree, the user agent will remove the hidden
attribute in order to reveal the content before scrolling to
it. In addition to removing the hidden
attribute, an event named
beforematch
is also fired on the element before the hidden
attribute is removed.
Web browsers will use 'content-visibility: hidden' instead of 'display: none' when the hidden
attribute is in the hidden until found state, as specified in the Rendering section.
Because this attribute is typically implemented using CSS, it's also possible to override it using CSS. For instance, a rule that applies 'display: block' to all elements will cancel the effects of the hidden state. Authors therefore have to take care when writing their style sheets to make sure that the attribute is still styled as expected. In addition, legacy user agents which don't support the hidden until found state will have 'display: none' instead of 'content-visibility: hidden', so authors are encouraged to make sure that their style sheets don't change the 'display' or 'content-visibility' properties of hidden until found elements.
Since elements with the hidden
attribute in the hidden until found state use 'content-visibility:
hidden' instead of 'display: none', there are two caveats of the hidden until found state that make it different
from the hidden state:
The element needs to be affected by layout containment in order to be revealed by find-in-page. This means that if the element in the hidden until found state has a 'display' value of 'none', 'contents', or 'inline', then the element will not be revealed by find-in-page.
The element will still have a generated box when in the hidden until found state, which means that borders, margin, and padding will still be rendered around the element.
In the following skeletal example, the attribute is used to hide the web game's main screen until the user logs in:
<h1>The Example Game</h1>
<section id="login">
<h2>Login</h2>
<form>
...
<!-- calls login() once the user's credentials have been checked -->
</form>
<script>
function login() {
// switch screens
document.getElementById('login').hidden = true;
document.getElementById('game').hidden = false;
}
</script>
</section>
<section id="game" hidden>
...
</section>
The hidden
attribute must not be used to hide content that
could legitimately be shown in another presentation. For example, it is incorrect to use hidden
to hide panels in a tabbed dialog, because the tabbed interface
is merely a kind of overflow presentation — one could equally well just show all the form
controls in one big page with a scrollbar. It is similarly incorrect to use this attribute to hide
content just from one presentation — if something is marked hidden
, it is hidden from all presentations, including, for instance,
screen readers.
Elements that are not themselves hidden
must not
hyperlink to elements that are hidden
. The for
attributes of label
and output
elements that are not
themselves hidden
must similarly not refer to elements that are
hidden
. In both cases, such references would cause user
confusion.
Elements and scripts may, however, refer to elements that are hidden
in other contexts.
For example, it would be incorrect to use the href
attribute to link to a section marked with the hidden
attribute.
If the content is not applicable or relevant, then there is no reason to link to it.
It would be fine, however, to use the ARIA aria-describedby
attribute to refer to descriptions that are
themselves hidden
. While hiding the descriptions implies that
they are not useful alone, they could be written in such a way that they are useful in the
specific context of being referenced from the elements that they describe.
Similarly, a canvas
element with the hidden
attribute could be used by a scripted graphics engine as an off-screen buffer, and a form control
could refer to a hidden form
element using its form
attribute.
Elements in a section hidden by the hidden
attribute are still
active, e.g. scripts and form controls in such sections still execute and submit respectively.
Only their presentation to the user changes.
The hidden
getter steps
are:
If the hidden
attribute is in the hidden until found state, then return "until-found
".
If the hidden
attribute is set, then return
true.
Return false.
The hidden
setter steps are:
If the given value is a string that is an ASCII case-insensitive match for
"until-found
", then set the hidden
attribute to "until-found
".
Otherwise, if the given value is false, then remove the hidden
attribute.
Otherwise, if the given value is the empty string, then remove the hidden
attribute.
Otherwise, if the given value is null, then remove the hidden
attribute.
Otherwise, if the given value is 0, then remove the hidden
attribute.
Otherwise, if the given value is NaN, then remove the hidden
attribute.
Otherwise, set the hidden
attribute to the empty
string.
The ancestor hidden-until-found revealing algorithm is to run the following steps on currentNode:
While currentNode has a parent node within the flat tree:
If currentNode has the hidden
attribute in the
hidden until found state, then:
Fire an event named beforematch
at currentNode.
Remove the hidden
attribute from
currentNode.
Set currentNode to the parent node of currentNode within the flat tree.
A traversable navigable's system visibility state, including its initial value upon creation, is determined by the user agent. It represents, for example, whether the browser window is minimized, a browser tab is currently in the background, or a system element such as a task switcher obscures the page.
When a user-agent determines that the system visibility state for traversable navigable traversable has changed to newState, it must run the following steps:
Let navigables be the inclusive descendant navigables of traversable's active document.
For each navigable of navigables in what order?:
Let document be navigable's active document.
Queue a global task on the user interaction task source given document's relevant global object to update the visibility state of document with newState.
A Document
has a visibility state, which is
either "hidden
" or "visible
", initially set to
"hidden
".
The visibilityState
getter steps are to return
this's visibility state.
The hidden
getter
steps are to return true if this's visibility state is
"hidden
", otherwise false.
To update the visibility state of Document
document to
visibilityState:
If document's visibility state equals visibilityState, then return.
Set document's visibility state to visibilityState.
Queue a new
VisibilityStateEntry
whose
visibility state is
visibilityState and whose timestamp is
the current high resolution time given document's
relevant global object.
Run the screen orientation change steps with document. SCREENORIENTATION
Run the view transition page visibility change steps with document.
Run any page visibility change steps which may be defined in other specifications, with visibility state and document.
It would be better if specification authors sent a pull request to add calls from here into their specifications directly, instead of using the page visibility change steps hook, to ensure well-defined cross-specification call order. As of the time of this writing the following specifications are known to have page visibility change steps, which will be run in an unspecified order: Device Posture API and Web NFC. DEVICEPOSTURE WEBNFC
Fire an event named visibilitychange
at
document, with its bubbles
attribute
initialized to true.
VisibilityStateEntry
interfaceThe VisibilityStateEntry
interface exposes visibility changes to the document,
from the moment the document becomes active.
function wasHiddenBeforeFirstContentfulPaint() {
const fcpEntry = performance.getEntriesByName("first-contentful-paint")[0];
const visibilityStateEntries = performance.getEntriesByType("visibility-state");
return visibilityStateEntries.some(e =>
e.startTime < fcpEntry.startTime &&
e.name === "hidden");
}
Since hiding a page can cause throttling of rendering and other user-agent operations, it is common to use visibility changes as an indication that such throttling has occurred. However, other things could also cause throttling in different browsers, such as long periods of inactivity.
[Exposed=(Window)]
interface VisibilityStateEntry : PerformanceEntry {
readonly attribute DOMString name; // shadows inherited name
readonly attribute DOMString entryType; // shadows inherited entryType
readonly attribute DOMHighResTimeStamp startTime; // shadows inherited startTime
readonly attribute unsigned long duration; // shadows inherited duration
};
The VisibilityStateEntry
has an associated
DOMHighResTimeStamp
timestamp.
The VisibilityStateEntry
has an associated "visible
" or
"hidden
" visibility state.
The name
getter steps are to return
this's visibility state.
The entryType
getter steps are to return
"visibility-state
".
The startTime
getter steps are to return
this's timestamp.
The duration
getter steps are to return
zero.
See also inert
for an explanation of the
attribute of the same name.
A node (in particular elements and text nodes) can be inert. When a node is inert:
Hit-testing must act as if the 'pointer-events' CSS property were set to 'none'.
Text selection functionality must act as if the 'user-select' CSS property were set to 'none'.
If it is editable, the node behaves as if it were non-editable.
The user agent should ignore the node for the purposes of find-in-page.
Inert nodes generally cannot be focused, and user agents do not expose the inert nodes to accessibility APIs or assistive technologies. Inert nodes that are commands will become inoperable to users, in the manner described above.
User agents may allow the user to override the restrictions on find-in-page and text selection, however.
By default, a node is not inert.
A Document
document is blocked by a modal dialog
subject if subject is the topmost dialog
element in
document's top layer. While document is so blocked, every node
that is connected to document, with the exception of the
subject element and its flat tree descendants, must become
inert.
subject can additionally become inert via the inert
attribute, but only if specified on subject itself
(i.e., subject escapes inertness of ancestors); subject's flat
tree descendants can become inert in a similar fashion.
The dialog
element's showModal()
method causes this mechanism to trigger, by adding the dialog
element to its
node document's top layer.
inert
attributeThe inert
attribute is a boolean attribute that
indicates, by its presence, that the element and all its flat tree descendants which
don't otherwise escape inertness (such as modal dialogs) are to be made inert by the
user agent.
An inert subtree should not contain any content or controls which are critical to
understanding or using aspects of the page which are not in the inert state. Content in an inert
subtree will not be perceivable by all users, or interactive. Authors should not specify elements
as inert unless the content they represent are also visually obscured in some way. In most cases,
authors should not specify the inert
attribute on individual form controls. In these
instances, the disabled
attribute is probably more
appropriate.
The following example shows how to mark partially loaded content, visually obscured by a "loading" message, as inert.
<section aria-labelledby=s1>
<h3 id=s1>Population by City</h3>
<div class=container>
<div class=loading><p>Loading...</p></div>
<div inert>
<form>
<fieldset>
<legend>Date range</legend>
<div>
<label for=start>Start</label>
<input type=date id=start>
</div>
<div>
<label for=end>End</label>
<input type=date id=end>
</div>
<div>
<button>Apply</button>
</div>
</fieldset>
</form>
<table>
<caption>From 20-- to 20--</caption>
<thead>
<tr>
<th>City</th>
<th>State</th>
<th>20-- Population</th>
<th>20-- Population</th>
<th>Percentage change</th>
</tr>
</thead>
<tbody>
<!-- ... -->
</tbody>
</table>
</div>
</div>
</section>
The "loading" overlay obscures the inert content, making it visually apparent that the inert
content is not presently accessible. Notice that the heading and "loading" text are not
descendants of the element with the inert
attribute. This will ensure this text is
accessible to all users, while the inert content cannot be interacted with by anyone.
By default, there is no persistent visual indication of an element or its subtree being
inert. Appropriate visual styles for such content is often context-dependent. For instance, an
inert off-screen navigation panel would not require a default style, as its off-screen position
visually obscures the content. Similarly, a modal dialog
element's backdrop will
serve as the means to visually obscure the inert content of the web page, rather than styling
the inert content specifically.
However, for many other situations authors are strongly encouraged to clearly mark what parts of their document are active and which are inert, to avoid user confusion. In particular, it is worth remembering that not all users can see all parts of a page at once; for example, users of screen readers, users on small devices or with magnifiers, and even users using particularly small windows might not be able to see the active part of a page and might get frustrated if inert sections are not obviously inert.
The inert
IDL attribute must reflect
the content attribute of the same name.
To prevent abuse of certain APIs that could be annoying to users (e.g., opening popups or vibrating phones), user agents allow these APIs only when the user is actively interacting with the web page or has interacted with the page at least once. This "active interaction" state is maintained through the mechanisms defined in this section.
For the purpose of tracking user activation, each Window
W has two
relevant values:
A last activation timestamp, which is either a
DOMHighResTimeStamp
, positive infinity (indicating that W has never been
activated), or negative infinity (indicating that the activation has been consumed). Initially positive infinity.
A last history-action activation timestamp, which is either a
DOMHighResTimeStamp
or positive infinity, initially positive infinity.
A user agent also defines a transient activation duration, which is a constant number indicating how long a user activation is available for certain user activation-gated APIs (e.g., for opening popups).
The transient activation duration is expected be at most a few seconds, so that the user can possibly perceive the link between an interaction with the page and the page calling the activation-gated API.
We then have the following boolean user activation states for W:
When the current high resolution time given W is greater than or equal to the last activation timestamp in W, W is said to have sticky activation.
This is W's historical activation state, indicating whether the user has ever interacted in W. It starts false, then changes to true (and never changes back to false) when W gets the very first activation notification.
When the current high resolution time given W is greater than or equal to the last activation timestamp in W, and less than the last activation timestamp in W plus the transient activation duration, then W is said to have transient activation.
This is W's current activation state, indicating whether the user has interacted in W recently. This starts with a false value, and remains true for a limited time after every activation notification W gets.
The transient activation state is considered expired if it becomes false because the transient activation duration time has elapsed since the last user activation. Note that it can become false even before the expiry time through an activation consumption.
When the last history-action activation timestamp of W is not equal to the last activation timestamp of W, then W is said to have history-action activation.
This is a special variant of user activation, used to allow access to certain session history APIs which, if used too frequently, would make it harder for the user to traverse back using browser UI. It starts with a false value, and becomes true whenever the user interacts with W, but is reset to false through history-action activation consumption. This ensures such APIs cannot be used multiple times in a row without an intervening user activation. But unlike transient activation, there is no time limit within which such APIs must be used.
The last activation timestamp and last history-action
activation timestamp are retained even after the Document
changes its
fully active status (e.g., after navigating away from a Document
, or
navigating to a cached Document
). This means sticky activation state
spans multiple navigations as long as the same Document
gets reused. For the
transient activation state, the original expiry time
remains unchanged (i.e., the state still expires within the transient activation
duration limit from the original activation triggering input event). It is
important to consider this when deciding whether to base certain things off sticky
activation or transient activation.
When a user interaction causes firing of an activation triggering input
event in a Document
document, the user agent must perform the
following activation notification steps before dispatching the event:
Assert: document is fully active.
Let windows be « document's relevant global object ».
Extend windows with the active window of each of document's ancestor navigables.
Extend windows with the active window of each of document's descendant navigables, filtered to include only those navigables whose active document's origin is same origin with document's origin.
For each window in windows:
Set window's last activation timestamp to the current high resolution time.
Notify the close watcher manager about user activation given window.
An activation triggering input event is any event whose isTrusted
attribute is true and whose type
is one of:
"keydown
", provided the key is neither the
Esc key nor a shortcut key reserved by the user agent;
"mousedown
";
"pointerdown
", provided the event's
pointerType
is "mouse
";
"pointerup
", provided the event's
pointerType
is not "mouse
"; or
"touchend
".
Activation consuming APIs defined in this and
other specifications can consume user activation by performing the following
steps, given a Window
W:
If W's navigable is null, then return.
Let top be W's navigable's top-level traversable.
Let navigables be the inclusive descendant navigables of top's active document.
Let windows be the list of Window
objects constructed by taking
the active window of each item in
navigables.
For each window in windows, if window's last activation timestamp is not positive infinity, then set window's last activation timestamp to negative infinity.
History-action activation-consuming
APIs can consume history-action user activation by performing the following
steps, given a Window
W:
If W's navigable is null, then return.
Let top be W's navigable's top-level traversable.
Let navigables be the inclusive descendant navigables of top's active document.
Let windows be the list of Window
objects constructed by taking
the active window of each item in
navigables.
For each window in windows, set window's last history-action activation timestamp to window's last activation timestamp.
Note the asymmetry in the sets of browsing
contexts in the page that are affected by an activation notification vs an
activation consumption: an activation consumption
changes (to false) the transient activation states for all browsing contexts in the
page, but an activation notification changes (to true) the states for a subset of those browsing
contexts. The exhaustive nature of consumption here is deliberate: it prevents malicious sites
from making multiple calls to an activation consuming API from a single user
activation (possibly by exploiting a deep hierarchy of iframe
s).
APIs that are dependent on user activation are classified into different levels:
These APIs require the sticky activation state to be true, so they are blocked until the very first user activation.
These APIs require the transient activation state to be true, but they don't consume it, so multiple calls are allowed per user activation until the transient state expires.
These APIs require the transient activation state to be true, and they consume user activation in each call to prevent multiple calls per user activation.
These APIs require the history-action activation state to be true, and they consume history-action user activation in each call to prevent multiple calls per user activation.
UserActivation
interfaceEach Window
has an associated UserActivation
, which is a
UserActivation
object. Upon creation of the Window
object, its
associated UserActivation
must be set to a new
UserActivation
object created in the Window
object's relevant realm.
[Exposed=Window]
interface UserActivation {
readonly attribute boolean hasBeenActive;
readonly attribute boolean isActive;
};
partial interface {
[SameObject] readonly attribute UserActivation
userActivation;
};
navigator.userActivation.hasBeenActive
Returns whether the window has sticky activation.
navigator.userActivation.isActive
Returns whether the window has transient activation.
The userActivation
getter steps are to return
this's relevant global object's associated
UserActivation
.
The hasBeenActive
getter steps are to return
true if this's relevant global object has sticky
activation, and false otherwise.
The isActive
getter steps are to return true if
this's relevant global object has transient activation,
and false otherwise.
For the purposes of user-agent automation and application testing, this specification defines the following extension command for the Web Driver specification. It is optional for a user agent to support the following extension command. WEBDRIVER
HTTP Method | URI Template |
---|---|
`POST ` |
/session/{session id}/window/consume-user-activation |
The remote end steps are:
Let window be current browsing context's active window.
Let consume be true if window has transient activation; otherwise false.
If consume is true, then consume user activation of window.
Return success with data consume.
Certain elements in HTML have an activation behavior, which means that the user
can activate them. This is always caused by a click
event.
The user agent should allow the user to manually trigger elements that have an activation
behavior, for instance using keyboard or voice input, or through mouse clicks. When the
user triggers an element with a defined activation behavior in a manner other than
clicking it, the default action of the interaction event must be to fire a click
event at the element.
element.click()
Acts as if the element was clicked.
Each element has an associated click in progress flag, which is initially unset.
The click()
method must run
the following steps:
If this element is a form control that is disabled, then return.
If this element's click in progress flag is set, then return.
Set this element's click in progress flag.
Fire a synthetic pointer event named click
at this element, with the not trusted flag set.
Unset this element's click in progress flag.
ToggleEvent
interface[Exposed=Window]
interface ToggleEvent : Event {
constructor(DOMString type, optional ToggleEventInit eventInitDict = {});
readonly attribute DOMString oldState;
readonly attribute DOMString newState;
};
dictionary ToggleEventInit : EventInit {
DOMString oldState = "";
DOMString newState = "";
};
event.oldState
Set to "closed
" when transitioning from closed to open, or set to
"open
" when transitioning from open to closed.
event.newState
Set to "open
" when transitioning from closed to open, or set to "closed
" when transitioning from open to closed.
The oldState
and newState
attributes must return the values they are
initialized to.
A toggle task tracker is a struct which has:
ToggleEvent
.oldState
attribute.An HTML user interface typically consists of multiple interactive widgets, such as form controls, scrollable regions, links, dialog boxes, browser tabs, and so forth. These widgets form a hierarchy, with some (e.g. browser tabs, dialog boxes) containing others (e.g. links, form controls).
When interacting with an interface using a keyboard, key input is channeled from the system, through the hierarchy of interactive widgets, to an active widget, which is said to be focused.
Consider an HTML application running in a browser tab running in a graphical environment. Suppose this application had a page with some text controls and links, and was currently showing a modal dialog, which itself had a text control and a button.
The hierarchy of focusable widgets, in this scenario, would include the browser window, which would have, amongst its children, the browser tab containing the HTML application. The tab itself would have as its children the various links and text controls, as well as the dialog. The dialog itself would have as its children the text control and the button.
If the widget with focus in this example was the text control in the dialog box, then key input would be channeled from the graphical system to ① the web browser, then to ② the tab, then to ③ the dialog, and finally to ④ the text control.
Keyboard events are always targeted at this focused element.
A top-level traversable has system focus when it can receive keyboard input channeled from the operating system, possibly targeted at one of its active document's descendant navigables.
A top-level traversable has user attention
when its system visibility state is "visible
", and it either
has system focus or user agent widgets directly related to it can receive keyboard
input channeled from the operating system.
User attention is lost when a browser window loses focus, whereas system focus might also be lost to other system widgets in the browser window such as a location bar.
A Document
d is a fully active descendant of
a top-level traversable with user attention when d is fully active
and d's node navigable's top-level
traversable has user attention.
The term focusable area is used to refer to regions of the interface that can further become the target of such keyboard input. Focusable areas can be elements, parts of elements, or other regions managed by the user agent.
Each focusable area has a DOM anchor, which is a Node
object
that represents the position of the focusable area in the DOM. (When the focusable
area is itself a Node
, it is its own DOM anchor.) The DOM anchor is
used in some APIs as a substitute for the focusable area when there is no other DOM object
to represent the focusable area.
The following table describes what objects can be focusable areas. The cells in the left column describe objects that can be focusable areas; the cells in the right column describe the DOM anchors for those elements. (The cells that span both columns are non-normative examples.)
Focusable area | DOM anchor |
---|---|
Examples | |
Elements that meet all the following criteria:
| The element itself. |
| |
The shapes of area elements in an image map associated with an
img element that is being rendered and is not inert.
|
The img element.
|
In the following example, the
| |
The user-agent provided subwidgets of elements that are being rendered and are not actually disabled or inert. | The element for which the focusable area is a subwidget. |
The controls in the user
interface for a | |
The scrollable regions of elements that are being rendered and are not inert. | The element for which the box that the scrollable region scrolls was created. |
The CSS 'overflow' property's 'scroll' value typically creates a scrollable region. | |
The viewport of a Document that has a non-null browsing context and is not inert.
|
The Document for which the viewport was created.
|
The contents of an | |
Any other element or part of an element determined by the user agent to be a focusable area, especially to aid with accessibility or to better match platform conventions. | The element. |
A user agent could make all list item bullets sequentially focusable, so that a user can more easily navigate lists. Similarly, a user agent could make all elements with |
A navigable container (e.g. an
iframe
) is a focusable area, but key events routed to a navigable
container get immediately routed to its content navigable's active document. Similarly, in sequential focus navigation a
navigable container essentially acts merely as a placeholder for its content
navigable's active document.
One focusable area in each Document
is designated the focused
area of the document. Which control is so designated changes over time, based on algorithms
in this specification.
Even if a document is not fully active and not shown to the user, it can still have a focused area of the document. If a document's fully active state changes, its focused area of the document will stay the same.
The currently focused area of a top-level traversable traversable is the focusable area-or-null returned by this algorithm:
If traversable does not have system focus, then return null.
Let candidate be traversable's active document.
While candidate's focused area is a navigable container with a non-null content navigable: set candidate to the active document of that navigable container's content navigable.
If candidate's focused area is non-null, set candidate to candidate's focused area.
Return candidate.
The current focus chain of a top-level traversable traversable is the focus chain of the currently focused area of traversable, if traversable is non-null, or an empty list otherwise.
An element that is the DOM anchor of a focusable area is said to gain focus when that focusable area becomes the currently focused area of a top-level traversable. When an element is the DOM anchor of a focusable area of the currently focused area of a top-level traversable, it is focused.
The focus chain of a focusable area subject is the ordered list constructed as follows:
Let output be an empty list.
Let currentObject be subject.
While true:
Append currentObject to output.
If currentObject is an area
element's shape, then append that area
element to output.
Otherwise, if currentObject's DOM anchor is an element that is not currentObject itself, then append currentObject's DOM anchor to output.
If currentObject is a focusable area, then set currentObject to currentObject's DOM anchor's node document.
Otherwise, if currentObject is a Document
whose node
navigable's parent is non-null, then set
currentObject to currentObject's node navigable's parent.
Otherwise, break.
Return output.
The chain starts with subject and (if subject is or can be
the currently focused area of a top-level traversable) continues up the focus
hierarchy up to the Document
of the top-level traversable.
All elements that are focusable areas are said to be focusable.
There are two special types of focusability for focusable areas:
A focusable area is said to be sequentially focusable if it is
included in its Document
's sequential focus navigation order and
the user agent determines that it is sequentially focusable.
A focusable area is said to be click focusable if the user agent determines that it is click focusable. User agents should consider focusable areas with non-null tabindex values to be click focusable.
Elements which are not focusable are not focusable areas, and thus not sequentially focusable and not click focusable.
Being focusable is a statement about whether an element can be focused
programmatically, e.g. via the focus()
method or autofocus
attribute. In contrast, sequentially
focusable and click focusable govern how the user agent responds to user
interaction: respectively, to sequential focus navigation and as activation behavior.
The user agent might determine that an element is not sequentially focusable even
if it is focusable and is included in its Document
's sequential
focus navigation order, according to user preferences. For example, macOS users can set
the user agent to skip non-form control elements, or can skip links when doing sequential
focus navigation with just the Tab key (as opposed to using both the
Option and Tab keys).
Similarly, the user agent might determine that an element is not click focusable even if it is focusable. For example, in some user agents, clicking on a non-editable form control does not focus it, i.e. the user agent has determined that such controls are not click focusable.
Thus, an element can be focusable, but neither sequentially focusable nor click focusable. For example, in some user agents, a non-editable form-control with a negative-integer tabindex value would not be focusable via user interaction, only via programmatic APIs.
When a user activates a click focusable focusable
area, the user agent must run the focusing steps on the focusable
area with focus trigger set to "click
".
Note that focusing is not an activation behavior, i.e. calling the
click()
method on an element or dispatching a synthetic click
event on it won't cause the element to get focused.
A node is a focus navigation scope owner if it is a Document
, a
shadow host, a slot, or an element in the popover showing state which also has a popover
invoker set.
Each focus navigation scope owner has a focus navigation scope, which is a list of elements. Its contents are determined as follows:
Every element element has an associated focus navigation owner, which is either null or a focus navigation scope owner. It is determined by the following algorithm:
If element's parent is null, then return null.
If element's parent is a shadow host, then return element's assigned slot.
If element's parent is a shadow root, then return the parent's host.
If element's parent is the document element, then return the parent's node document.
If element is in the popover showing state and has a popover invoker set, then return element.
Return element's parent's associated focus navigation owner.
Then, the contents of a given focus navigation scope owner owner's focus navigation scope are all elements whose associated focus navigation owner is owner.
The order of elements within a focus navigation scope does not impact any of the algorithms in this specification. Ordering only becomes important for the tabindex-ordered focus navigation scope and flattened tabindex-ordered focus navigation scope concepts defined below.
A tabindex-ordered focus navigation scope is a list of focusable areas and focus navigation scope owners. Every focus navigation scope owner owner has tabindex-ordered focus navigation scope, whose contents are determined as follows:
It contains all elements in owner's focus navigation scope that are themselves focus navigation scope owners, except the elements whose tabindex value is a negative integer.
It contains all of the focusable areas whose DOM anchor is an element in owner's focus navigation scope, except the focusable areas whose tabindex value is a negative integer.
The order within a tabindex-ordered focus navigation scope is determined by each element's tabindex value, as described in the section below.
The rules there do not give a precise ordering, as they are composed mostly of "should" statements and relative orderings.
A flattened tabindex-ordered focus navigation scope is a list of focusable areas. Every focus navigation scope owner owner owns a distinct flattened tabindex-ordered focus navigation scope, whose contents are determined by the following algorithm:
Let result be a clone of owner's tabindex-ordered focus navigation scope.
For each item of result:
If item is not a focus navigation scope owner, then continue.
If item is not a focusable area, then replace item with all of the items in item's flattened tabindex-ordered focus navigation scope.
Otherwise, insert the contents of item's flattened tabindex-ordered focus navigation scope after item.
tabindex
attributeThe tabindex
content attribute allows authors to make an element and regions that have the element as its
DOM anchor be focusable areas, allow or prevent
them from being sequentially focusable, and determine their relative ordering for
sequential focus navigation.
The name "tab index" comes from the common use of the Tab key to navigate through the focusable elements. The term "tabbing" refers to moving forward through sequentially focusable focusable areas.
The tabindex
attribute, if specified, must have a value
that is a valid integer. Positive numbers specify the relative position of the
element's focusable areas in the sequential focus
navigation order, and negative numbers indicate that the control is not
sequentially focusable.
Developers should use caution when using values other than 0 or −1 for their tabindex
attributes as this is complicated to do correctly.
The following provides a non-normative summary of the behaviors of the
possible tabindex
attribute values. The below
processing model gives the more precise rules.
tabindex
attribute value come later.Note that the tabindex
attribute cannot be used to make
an element non-focusable. The only way a page author can do that is by disabling the element, or making it
inert.
The tabindex value of an element is the value of its tabindex
attribute, parsed using the rules for parsing
integers. If parsing fails or the attribute is not specified, then the tabindex
value is null.
The tabindex value of a focusable area is the tabindex value of its DOM anchor.
The tabindex value of an element must be interpreted as follows:
The user agent should follow platform conventions to determine if the element should be considered as a focusable area and if so, whether the element and any focusable areas that have the element as their DOM anchor are sequentially focusable, and if so, what their relative position in their tabindex-ordered focus navigation scope is to be. If the element is a focus navigation scope owner, it must be included in its tabindex-ordered focus navigation scope even if it is not a focusable area.
The relative ordering within a tabindex-ordered focus navigation scope for elements and focusable areas that belong to the same focus navigation scope and whose tabindex value is null should be in shadow-including tree order.
Modulo platform conventions, it is suggested that the following elements should be considered as focusable areas and be sequentially focusable:
a
elements that have an href
attributebutton
elementsinput
elements whose type
attribute are
not in the Hidden stateselect
elementstextarea
elementssummary
elements that are the first summary
element child of a
details
elementdraggable
attribute set, if that would
enable the user agent to allow the user to begin drag operations for those elements without
the use of a pointing deviceThe user agent must consider the element as a focusable area, but should omit the element from any tabindex-ordered focus navigation scope.
One valid reason to ignore the requirement that sequential focus navigation not
allow the author to lead to the element would be if the user's only mechanism for moving the
focus is sequential focus navigation. For instance, a keyboard-only user would be unable to
click on a text control with a negative tabindex
, so that
user's user agent would be well justified in allowing the user to tab to the control
regardless.
The user agent must allow the element to be considered as a focusable area and should allow the element and any focusable areas that have the element as their DOM anchor to be sequentially focusable.
The relative ordering within a tabindex-ordered focus navigation scope for elements and focusable areas that belong to the same focus navigation scope and whose tabindex value is zero should be in shadow-including tree order.
The user agent must allow the element to be considered as a focusable area and should allow the element and any focusable areas that have the element as their DOM anchor to be sequentially focusable, and should place the element — referenced as candidate below — and the aforementioned focusable areas in the tabindex-ordered focus navigation scope where the element is a part of so that, relative to other elements and focusable areas that belong to the same focus navigation scope, they are:
tabindex
attribute has been omitted or whose value, when parsed,
returns an error,tabindex
attribute has a value less than or equal to zero,tabindex
attribute has a value greater than zero but less than
the value of the tabindex
attribute on candidate,tabindex
attribute has a value equal to the value of the tabindex
attribute on candidate but that is
located earlier than candidate in shadow-including tree order,tabindex
attribute has a value equal to the value of the tabindex
attribute on candidate but that is
located later than candidate in shadow-including tree order, andtabindex
attribute has a value greater than the value of the
tabindex
attribute on candidate.The tabIndex
IDL
attribute must reflect the value of the tabindex
content attribute. The default value is 0 if the element is an a
,
area
, button
, frame
, iframe
,
input
, object
, select
, textarea
, or SVG
a
element, or is a summary
element that is a summary for
its parent details. The default value is −1 otherwise.
The varying default value based on element type is a historical artifact.
To get the focusable area for a focus target that is either an element
that is not a focusable area, or is a navigable, given an
optional string focus trigger (default "other
"), run the first
matching set of steps from the following list:
area
element with one or more shapes that are
focusable areasReturn the shape corresponding to the first img
element in tree
order that uses the image map to which the area
element belongs.
Return the element's first scrollable region, according to a pre-order, depth-first traversal of the flat tree. CSSSCOPING
Document
Return the Document
's viewport.
Return the navigable's active document.
Return the navigable container's content navigable's active document.
Let focusedElement be the currently focused area of a top-level traversable's DOM anchor.
If focus target is a shadow-including inclusive ancestor of focusedElement, then return focusedElement.
Return the focus delegate for focus target given focus trigger.
For sequential focusability, the handling of shadow hosts and delegates focus is done when constructing the sequential focus navigation order. That is, the focusing steps will never be called on such shadow hosts as part of sequential focus navigation.
Return null.
The focus delegate for a focusTarget, given an optional string
focusTrigger (default "other
"), is given by the following steps:
If focusTarget is a shadow host and its shadow root's delegates focus is false, then return null.
Let whereToLook be focusTarget.
If whereToLook is a shadow host, then set whereToLook to whereToLook's shadow root.
Let autofocusDelegate be the autofocus delegate for whereToLook given focusTrigger.
If autofocusDelegate is not null, then return autofocusDelegate.
For each descendant of whereToLook's descendants, in tree order:
Let focusableArea be null.
If focusTarget is a dialog
element and descendant is
sequentially focusable, then set focusableArea to
descendant.
Otherwise, if focusTarget is not a dialog
and
descendant is a focusable area, set focusableArea to
descendant.
Otherwise, set focusableArea to the result of getting the focusable area for descendant given focusTrigger.
This step can end up recursing, i.e., the get the focusable area steps might return the focus delegate of descendant.
If focusableArea is not null, then return focusableArea.
It's important that we are not looking at the shadow-including descendants here, but instead only at the descendants. Shadow hosts are instead handled by the recursive case mentioned above.
Return null.
The above algorithm essentially returns the first suitable focusable area where the path between its DOM anchor and focusTarget delegates focus at any shadow tree boundaries.
The autofocus delegate for a focus target given a focus trigger is given by the following steps:
For each descendant descendant of focus target, in tree order:
If descendant does not have an autofocus
content attribute, then
continue.
Let focusable area be descendant, if descendant is a focusable area; otherwise let focusable area be the result of getting the focusable area for descendant given focus trigger.
If focusable area is null, then continue.
If focusable area is not click focusable and focus
trigger is "click
", then continue.
Return focusable area.
Return null.
The focusing steps for an object new focus target that is either a focusable area, or an element that is not a focusable area, or a navigable, are as follows. They can optionally be run with a fallback target and a string focus trigger.
If new focus target is not a focusable area, then set new focus target to the result of getting the focusable area for new focus target, given focus trigger if it was passed.
If new focus target is null, then:
If no fallback target was specified, then return.
Otherwise, set new focus target to the fallback target.
If new focus target is a navigable container with non-null content navigable, then set new focus target to the content navigable's active document.
If new focus target is a focusable area and its DOM anchor is inert, then return.
If new focus target is the currently focused area of a top-level traversable, then return.
Let old chain be the current focus chain of the top-level traversable in which new focus target finds itself.
Let new chain be the focus chain of new focus target.
Run the focus update steps with old chain, new chain, and new focus target respectively.
User agents must immediately run the focusing steps for a focusable area or navigable candidate whenever the user attempts to move the focus to candidate.
The unfocusing steps for an object old focus target that is either a focusable area or an element that is not a focusable area are as follows:
If old focus target is a shadow host whose shadow root's delegates focus is true, and old focus target's shadow root is a shadow-including inclusive ancestor of the currently focused area of a top-level traversable's DOM anchor, then set old focus target to that currently focused area of a top-level traversable.
If old focus target is inert, then return.
If old focus target is an area
element and one of its shapes is
the currently focused area of a top-level traversable, or, if old focus
target is an element with one or more scrollable regions, and one of them is the
currently focused area of a top-level traversable, then let old focus
target be that currently focused area of a top-level traversable.
Let old chain be the current focus chain of the top-level traversable in which old focus target finds itself.
If old focus target is not one of the entries in old chain, then return.
If old focus target is not a focusable area, then return.
Let topDocument be old chain's last entry.
If topDocument's node navigable has system focus, then run the focusing steps for topDocument's viewport.
Otherwise, apply any relevant platform-specific conventions for removing system focus from topDocument's node navigable, and run the focus update steps given old chain, an empty list, and null.
The unfocusing steps do not always result in the focus changing, even when applied to the currently focused area of a top-level traversable. For example, if the currently focused area of a top-level traversable is a viewport, then it will usually keep its focus regardless until another focusable area is explicitly focused with the focusing steps.
The focus update steps, given an old chain, a new chain, and a new focus target respectively, are as follows:
If the last entry in old chain and the last entry in new chain are the same, pop the last entry from old chain and the last entry from new chain and redo this step.
For each entry entry in old chain, in order, run these substeps:
If entry is an input
element, and the change
event applies
to the element, and the element does not have a defined activation behavior, and
the user has changed the element's value or its list
of selected files while the control
was focused without committing that change (such that it is different to what it was when the
control was first focused), then:
Set entry's user validity to true.
Fire an
event named change
at the element, with the bubbles
attribute initialized to true.
If entry is an element, let blur event target be entry.
If entry is a Document
object, let blur event target be
that Document
object's relevant global object.
Otherwise, let blur event target be null.
If entry is the last entry in old chain, and
entry is an Element
, and the last entry in new
chain is also an Element
, then let related blur target
be the last entry in new chain. Otherwise, let related blur
target be null.
If blur event target is not null, fire a focus event
named blur
at blur event target, with
related blur target as the related target.
In some cases, e.g., if entry is
an area
element's shape, a scrollable region, or a viewport, no
event is fired.
Apply any relevant platform-specific conventions for focusing new focus target. (For example, some platforms select the contents of a text control when that control is focused.)
For each entry entry in new chain, in reverse order, run these substeps:
If entry is a focusable area, and the focused area of the document is not entry:
Set document's relevant global object's navigation API's focus changed during ongoing navigation to true.
Designate entry as the focused area of the document.
If entry is an element, let focus event target be entry.
If entry is a Document
object, let focus event target be
that Document
object's relevant global object.
Otherwise, let focus event target be null.
If entry is the last entry in new chain, and
entry is an Element
, and the last entry in old
chain is also an Element
, then let related focus target
be the last entry in old chain. Otherwise, let related
focus target be null.
If focus event target is not null, fire a focus event
named focus
at focus event target, with
related focus target as the related target.
In some cases, e.g. if entry is an area
element's shape, a scrollable region, or a viewport, no event is fired.
To fire a focus event named e at an element t with a given
related target r, fire an event named
e at t, using FocusEvent
, with the relatedTarget
attribute initialized to r,
the view
attribute initialized to t's
node document's relevant global object, and the composed
flag set.
When a key event is to be routed in a top-level traversable, the user agent must run the following steps:
Let target area be the currently focused area of the top-level traversable.
Assert: target area is not null, since key events are only routed to top-level traversables that have system focus. Therefore, target area is a focusable area.
Let target node be target area's DOM anchor.
If target node is a Document
that has a body element, then let target node be the body
element of that Document
.
Otherwise, if target node is a Document
object that has a non-null
document element, then let target node be that document
element.
If target node is not inert, then:
Let canHandle be the result of dispatching the key event at target node.
If canHandle is true, then let target area handle the key event.
This might include firing a click
event at target node.
The has focus steps, given a Document
object target,
are as follows:
If target's node navigable's top-level traversable does not have system focus, then return false.
Let candidate be target's node navigable's top-level traversable's active document.
While true:
If candidate is target, then return true.
If the focused area of candidate is a navigable container with a non-null content navigable, then set candidate to the active document of that navigable container's content navigable.
Otherwise, return false.
Each Document
has a sequential focus navigation order, which orders
some or all of the focusable areas in the
Document
relative to each other. Its contents and ordering are given by the
flattened tabindex-ordered focus navigation scope of the Document
.
Per the rules defining the flattened tabindex-ordered focus navigation
scope, the ordering is not necessarily related to the tree order of the
Document
.
If a focusable area is omitted from the sequential focus navigation
order of its Document
, then it is unreachable via sequential focus
navigation.
There can also be a sequential focus navigation starting point. It is initially unset. The user agent may set it when the user indicates that it should be moved.
For example, the user agent could set it to the position of the user's click if the user clicks on the document contents.
User agents are required to set the sequential focus navigation starting point to the target element when navigating to a fragment.
A sequential focus direction is one of two possible values: "forward
", or "backward
". They are used in the below algorithms
to describe the direction in which sequential focus travels at the user's request.
A selection mechanism is one of two possible values: "DOM
", or
"sequential
". They are used to
describe how the sequential navigation search algorithm finds the focusable
area it returns.
When the user requests that focus move from the currently focused area of a top-level traversable to the next or previous focusable area (e.g., as the default action of pressing the tab key), or when the user requests that focus sequentially move to a top-level traversable in the first place (e.g., from the browser's location bar), the user agent must use the following algorithm:
Let starting point be the currently focused area of a top-level traversable, if the user requested to move focus sequentially from there, or else the top-level traversable itself, if the user instead requested to move focus from outside the top-level traversable.
If there is a sequential focus navigation starting point defined and it is inside starting point, then let starting point be the sequential focus navigation starting point instead.
Let direction be "forward
" if the
user requested the next control, and "backward
" if the user requested the previous
control.
Typically, pressing tab requests the next control, and pressing shift + tab requests the previous control.
Loop: Let selection mechanism be "sequential
" if starting point is a
navigable or if starting point is in its Document
's
sequential focus navigation order.
Otherwise, starting point is not in its Document
's sequential
focus navigation order; let selection mechanism be "DOM
".
Let candidate be the result of running the sequential navigation search algorithm with starting point, direction, and selection mechanism.
If candidate is not null, then run the focusing steps for candidate and return.
Otherwise, unset the sequential focus navigation starting point.
If starting point is a top-level traversable, or a focusable area in the top-level traversable, the user agent should transfer focus to its own controls appropriately (if any), honouring direction, and then return.
For example, if direction is backward, then the last sequentially focusable control before the browser's rendering area would be the control to focus.
If the user agent has no sequentially focusable controls — a kiosk-mode browser, for instance — then the user agent may instead restart these steps with the starting point being the top-level traversable itself.
Otherwise, starting point is a focusable area in a child navigable. Set starting point to that child navigable's parent and return to the step labeled loop.
The sequential navigation search algorithm, given a focusable area starting point, sequential focus direction direction, and selection mechanism selection mechanism, consists of the following steps. They return a focusable area-or-null.
Pick the appropriate cell from the following table, and follow the instructions in that cell.
The appropriate cell is the one that is from the column whose header describes direction and from the first row whose header describes starting point and selection mechanism.
direction is "forward "
| direction is "backward "
| |
---|---|---|
starting point is a navigable | Let candidate be the first suitable sequentially focusable area in starting point's active document, if any; or else null | Let candidate be the last suitable sequentially focusable area in starting point's active document, if any; or else null |
selection mechanism is "DOM "
|
Let candidate be the suitable sequentially focusable area, that
appears nearest after starting point in starting point's
In this case, starting point does not necessarily belong to its
|
Let candidate be the suitable sequentially focusable area, that
appears nearest before starting point in starting point's
Document , in shadow-including tree order, if any; or else null
|
selection mechanism is "sequential "
| Let candidate be the first suitable sequentially focusable area
after starting point, in starting point's Document 's
sequential focus navigation order, if any; or else null
| Let candidate be the last suitable sequentially focusable area
before starting point, in starting point's Document 's
sequential focus navigation order, if any; or else null
|
A suitable sequentially focusable area is a focusable area whose DOM anchor is not inert and is sequentially focusable.
If candidate is a navigable container with a non-null content navigable, then:
Let recursive candidate be the result of running the sequential
navigation search algorithm with candidate's content navigable,
direction, and "sequential
".
If recursive candidate is null, then return the result of running the sequential navigation search algorithm with candidate, direction, and selection mechanism.
Otherwise, set candidate to recursive candidate.
Return candidate.
dictionary FocusOptions {
boolean preventScroll = false;
boolean focusVisible;
};
documentOrShadowRoot.activeElement
Returns the deepest element in the document through which or to which key events are being routed. This is, roughly speaking, the focused element in the document.
For the purposes of this API, when a child navigable is focused, its container is focused
within its parent's active
document. For example, if the user moves the focus to a text control in an
iframe
, the iframe
is the element returned by the activeElement
API in the
iframe
's node document.
Similarly, when the focused element is in a different node tree than documentOrShadowRoot, the element returned will be the host that's located in the same node tree as documentOrShadowRoot if documentOrShadowRoot is a shadow-including inclusive ancestor of the focused element, and null if not.
document.hasFocus()
Returns true if key events are being routed through or to the document; otherwise, returns false. Roughly speaking, this corresponds to the document, or a document nested inside this one, being focused.
window.focus()
Moves the focus to the window's navigable, if any.
element.focus([ { preventScroll: true } ])
Moves the focus to the element.
If the element is a navigable container, moves the focus to its content navigable instead.
By default, this method also scrolls the element into view. Providing the preventScroll
option and setting it to true
prevents this behavior.
element.blur()
Moves the focus to the viewport. Use of this method is discouraged; if you want
to focus the viewport, call the focus()
method on
the Document
's document element.
Do not use this method to hide the focus ring if you find the focus ring unsightly. Instead,
use the :focus-visible
pseudo-class to override the 'outline'
property, and provide a different way to show what element is focused. Be aware that if an
alternative focusing style isn't made available, the page will be significantly less usable for
people who primarily navigate pages using a keyboard, or those with reduced vision who use focus
outlines to help them navigate the page.
For example, to hide the outline from textarea
elements and instead use a
yellow background to indicate focus, you could use:
textarea:focus-visible { outline: none; background: yellow; color: black; }
The activeElement
attribute's getter must
run these steps:
Let candidate be the DOM anchor of the focused area of this DocumentOrShadowRoot
's node
document.
Set candidate to the result of retargeting
candidate against this DocumentOrShadowRoot
.
If candidate's root is not this DocumentOrShadowRoot
,
then return null.
If candidate is not a Document
object, then return
candidate.
If candidate has a body element, then return that body element.
If candidate's document element is non-null, then return that document element.
Return null.
The hasFocus()
method on the Document
object, when invoked, must return the result of running the
has focus steps with the Document
object as the argument.
The focus()
method, when
invoked, must run these steps:
Let current be this Window
object's navigable.
If current is null, then return.
Run the focusing steps with current.
If current is a top-level traversable, user agents are encouraged to trigger some sort of notification to indicate to the user that the page is attempting to gain focus.
The blur()
method steps
are to do nothing.
Historically, the focus()
and blur()
methods actually affected the system-level focus of the
system widget (e.g., tab or window) that contained the navigable, but hostile sites
widely abuse this behavior to the user's detriment.
The focus(options)
method on elements, when invoked, must run the following steps:
If the element is marked as locked for focus, then return.
Mark the element as locked for focus.
Run the focusing steps for the element.
If the value of the focusVisible
dictionary member of
options is true, or is not present but in an implementation-defined way
the user agent determines it would be best to do so, then indicate focus.
If the value of the preventScroll
dictionary member of
options is false, then scroll the element
into view given "auto", "center", and "center".
Unmark the element as locked for focus.
The blur()
method, when
invoked, should run the unfocusing steps for the element on which the method was
called. User agents may selectively or uniformly ignore calls to this method for usability
reasons.
For example, if the blur()
method is unwisely
being used to remove the focus ring for aesthetics reasons, the page would become unusable by
keyboard users. Ignoring calls to this method would thus allow keyboard users to interact with the
page.
autofocus
attributeThe autofocus
content attribute allows the author to indicate that an element is to be focused as soon as the
page is loaded, allowing the user to just start typing without having to manually focus the main
element.
When the autofocus
attribute is specified on an element
inside dialog
elements or HTML elements whose popover
attribute is set, then it will be focused when the dialog or
popover becomes shown.
The autofocus
attribute is a boolean
attribute.
To find the nearest ancestor autofocus scoping root element given an
Element
element:
If element is a dialog
element, then return
element.
If element's popover
attribute is not in the
no popover state, then return
element.
Let ancestor be element.
While ancestor has a parent element:
Set ancestor to ancestor's parent element.
If ancestor is a dialog
element, then return
ancestor.
If ancestor's popover
attribute is not in
the no popover state, then return
ancestor.
Return ancestor.
There must not be two elements with the same nearest ancestor autofocus scoping root
element that both have the autofocus
attribute
specified.
Each Document
has an autofocus candidates list,
initially empty.
Each Document
has an autofocus processed flag boolean, initially
false.
When an element with the autofocus
attribute specified
is inserted into a document, run the
following steps:
If the user has indicated (for example, by starting to type in a form control) that they do not wish focus to be changed, then optionally return.
Let target be the element's node document.
If target is not fully active, then return.
If target's active sandboxing flag set has the sandboxed automatic features browsing context flag, then return.
For each ancestorNavigable of target's ancestor navigables: if ancestorNavigable's active document's origin is not same origin with target's origin, then return.
Let topDocument be target's node navigable's top-level traversable's active document.
If topDocument's autofocus processed flag is false, then remove the element from topDocument's autofocus candidates, and append the element to topDocument's autofocus candidates.
We do not check if an element is a focusable area before storing it in the autofocus candidates list, because even if it is not a focusable area when it is inserted, it could become one by the time flush autofocus candidates sees it.
To flush autofocus candidates for a document topDocument, run these steps:
If topDocument's autofocus processed flag is true, then return.
Let candidates be topDocument's autofocus candidates.
If candidates is empty, then return.
If topDocument's focused area is not topDocument itself, or topDocument has non-null target element, then:
Empty candidates.
Set topDocument's autofocus processed flag to true.
Return.
While candidates is not empty:
Let element be candidates[0].
Let doc be element's node document.
If doc is not fully active, then remove element from candidates, and continue.
If doc's node navigable's top-level traversable is not the same as topDocument's node navigable, then remove element from candidates, and continue.
If doc's script-blocking style sheet set is not empty, then return.
In this case, element is the currently-best candidate, but doc is not ready for autofocusing. We'll try again next time flush autofocus candidates is called.
Remove element from candidates.
Let inclusiveAncestorDocuments be a list consisting of the active document of doc's inclusive ancestor navigables.
If any Document
in inclusiveAncestorDocuments has non-null
target element, then continue.
Let target be element.
If target is not a focusable area, then set target to the result of getting the focusable area for target.
Autofocus candidates can contain elements which are not focusable
areas. In addition to the special cases handled in the get the focusable
area algorithm, this can happen because a non-focusable area element with
an autofocus
attribute was inserted into a document and it never became focusable, or
because the element was focusable but its status changed while it was stored in
autofocus candidates.
If target is not null, then:
Empty candidates.
Set topDocument's autofocus processed flag to true.
Run the focusing steps for target.
This handles the automatic focusing during document load. The show()
and showModal()
methods of dialog
elements also processes the autofocus
attribute.
Focusing the element does not imply that the user agent has to focus the browser window if it has lost focus.
The autofocus
IDL attribute must reflect the
content attribute of the same name.
In the following snippet, the text control would be focused when the document was loaded.
<input maxlength="256" name="q" value="" autofocus>
<input type="submit" value="Search">
The autofocus
attribute applies to all elements, not
just to form controls. This allows examples such as the following:
<div contenteditable autofocus>Edit <strong>me!</strong><div>
Each element that can be activated or focused can be assigned a single key combination to
activate it, using the accesskey
attribute.
The exact shortcut is determined by the user agent, based on information about the user's
keyboard, what keyboard shortcuts already exist on the platform, and what other shortcuts have
been specified on the page, using the information provided in the accesskey
attribute as a guide.
In order to ensure that a relevant keyboard shortcut is available on a wide variety of input
devices, the author can provide a number of alternatives in the accesskey
attribute.
Each alternative consists of a single character, such as a letter or digit.
User agents can provide users with a list of the keyboard shortcuts, but authors are encouraged
to do so also. The accessKeyLabel
IDL attribute returns a
string representing the actual key combination assigned by the user agent.
In this example, an author has provided a button that can be invoked using a shortcut key. To support full keyboards, the author has provided "C" as a possible key. To support devices equipped only with numeric keypads, the author has provided "1" as another possible key.
<input type=button value=Collect onclick="collect()"
accesskey="C 1" id=c>
To tell the user what the shortcut key is, the author has this script here opted to explicitly add the key combination to the button's label:
function addShortcutKeyLabel(button) {
if (button.accessKeyLabel != '')
button.value += ' (' + button.accessKeyLabel + ')';
}
addShortcutKeyLabel(document.getElementById('c'));
Browsers on different platforms will show different labels, even for the same key combination, based on the convention prevalent on that platform. For example, if the key combination is the Control key, the Shift key, and the letter C, a Windows browser might display "Ctrl+Shift+C", whereas a Mac browser might display "^⇧C", while an Emacs browser might just display "C-C". Similarly, if the key combination is the Alt key and the Escape key, Windows might use "Alt+Esc", Mac might use "⌥⎋", and an Emacs browser might use "M-ESC" or "ESC ESC".
In general, therefore, it is unwise to attempt to parse the value returned from the accessKeyLabel
IDL attribute.
accesskey
attributeAll HTML elements may have the accesskey
content attribute set. The accesskey
attribute's value is used
by the user agent as a guide for creating a keyboard shortcut that activates or focuses the
element.
If specified, the value must be an ordered set of unique space-separated tokens none of which are identical to another token and each of which must be exactly one code point in length.
In the following example, a variety of links are given with access keys so that keyboard users familiar with the site can more quickly navigate to the relevant pages:
<nav>
<p>
<a title="Consortium Activities" accesskey="A" href="/Consortium/activities">Activities</a> |
<a title="Technical Reports and Recommendations" accesskey="T" href="/TR/">Technical Reports</a> |
<a title="Alphabetical Site Index" accesskey="S" href="/Consortium/siteindex">Site Index</a> |
<a title="About This Site" accesskey="B" href="/Consortium/">About Consortium</a> |
<a title="Contact Consortium" accesskey="C" href="/Consortium/contact">Contact</a>
</p>
</nav>
In the following example, the search field is given two possible access keys, "s" and "0" (in that order). A user agent on a device with a full keyboard might pick Ctrl + Alt + S as the shortcut key, while a user agent on a small device with just a numeric keypad might pick just the plain unadorned key 0:
<form action="/search">
<label>Search: <input type="search" name="q" accesskey="s 0"></label>
<input type="submit">
</form>
In the following example, a button has possible access keys described. A script then tries to update the button's label to advertise the key combination the user agent selected.
<input type=submit accesskey="N @ 1" value="Compose">
...
<script>
function labelButton(button) {
if (button.accessKeyLabel)
button.value += ' (' + button.accessKeyLabel + ')';
}
var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i += 1) {
if (inputs[i].type == "submit")
labelButton(inputs[i]);
}
</script>
On one user agent, the button's label might become "Compose (⌘N)". On another, it might become "Compose (Alt+⇧+1)". If the user agent doesn't assign a key, it will be just "Compose". The exact string depends on what the assigned access key is, and on how the user agent represents that key combination.
An element's assigned access key is a key combination derived from the element's
accesskey
content attribute. Initially, an element must not
have an assigned access key.
Whenever an element's accesskey
attribute is set, changed,
or removed, the user agent must update the element's assigned access key by running
the following steps:
If the element has no accesskey
attribute, then skip
to the fallback step below.
Otherwise, split the attribute's value on ASCII whitespace, and let keys be the resulting tokens.
For each value in keys in turn, in the order the tokens appeared in the attribute's value, run the following substeps:
If the value is not a string exactly one code point in length, then skip the remainder of these steps for this value.
If the value does not correspond to a key on the system's keyboard, then skip the remainder of these steps for this value.
If the user agent can find a mix of zero or more modifier keys that, combined with the key that corresponds to the value given in the attribute, can be used as the access key, then the user agent may assign that combination of keys as the element's assigned access key and return.
Fallback: Optionally, the user agent may assign a key combination of its choosing as the element's assigned access key and then return.
If this step is reached, the element has no assigned access key.
Once a user agent has selected and assigned an access key for an element, the user agent should
not change the element's assigned access key unless the accesskey
content attribute is changed or the element is moved to
another Document
.
When the user presses the key combination corresponding to the assigned access key
for an element, if the element defines a command, the
command's Hidden State facet is false (visible),
the command's Disabled State facet is also false
(enabled), the element is in a document that has a non-null browsing context, and neither the element nor any of its
ancestors has a hidden
attribute specified, then the user agent
must trigger the Action of the command.
User agents might expose elements that have
an accesskey
attribute in other ways as well, e.g. in a menu
displayed in response to a specific key combination.
The accessKey
IDL
attribute must reflect the accesskey
content
attribute.
The accessKeyLabel
IDL attribute must return a string that
represents the element's assigned access key, if any. If the element does not have
one, then the IDL attribute must return the empty string.
contenteditable
content attributeinterface mixin ElementContentEditable {
[CEReactions] attribute DOMString contentEditable;
[CEReactions] attribute DOMString enterKeyHint;
readonly attribute boolean isContentEditable;
[CEReactions] attribute DOMString inputMode;
};
The contenteditable
content attribute is an
enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
true
| true | The element is editable. |
(the empty string) | ||
false
| false | The element is not editable. |
plaintext-only
| plaintext-only | Only the element's raw text content is editable; rich formatting is disabled. |
The attribute's missing value default and invalid value default are both the inherit state. The inherit state indicates that the element is editable (or not) based on the parent element's state.
For example, consider a page that has a form
and a textarea
to
publish a new article, where the user is expected to write the article using HTML:
<form method=POST>
<fieldset>
<legend>New article</legend>
<textarea name=article><p>Hello world.</p></textarea>
</fieldset>
<p><button>Publish</button></p>
</form>
When scripting is enabled, the textarea
element could be replaced with a rich
text control instead, using the contenteditable
attribute:
<form method=POST>
<fieldset>
<legend>New article</legend>
<textarea id=textarea name=article><p>Hello world.</p></textarea>
<div id=div style="white-space: pre-wrap" hidden><p>Hello world.</p></div>
<script>
let textarea = document.getElementById("textarea");
let div = document.getElementById("div");
textarea.hidden = true;
div.hidden = false;
div.contentEditable = "true";
div.oninput = (e) => {
textarea.value = div.innerHTML;
};
</script>
</fieldset>
<p><button>Publish</button></p>
</form>
Features to enable, e.g., inserting links, can be implemented using the document.execCommand()
API, or using
Selection
APIs and other DOM APIs. EXECCOMMAND SELECTION
DOM
The contenteditable
attribute can also be used to
great effect:
<!doctype html>
<html lang=en>
<title>Live CSS editing!</title>
<style style=white-space:pre contenteditable>
html { margin:.2em; font-size:2em; color:lime; background:purple }
head, title, style { display:block }
body { display:none }
</style>
element.contentEditable [ = value ]
Returns "true
", "plaintext-only
", "false
", or "inherit
",
based on the state of the contenteditable
attribute.
Can be set, to change that state.
Throws a "SyntaxError
" DOMException
if the new value
isn't one of those strings.
element.isContentEditable
Returns true if the element is editable; otherwise, returns false.
The contentEditable
IDL attribute, on getting, must return
the string "true
" if the content attribute is set to the true state, "plaintext-only
" if the content attribute is set to the plaintext-only state, "false
" if the content attribute is set to the false state, and "inherit
" otherwise. On setting, if the new
value is an ASCII case-insensitive match for the string "inherit
" then the content attribute must be removed, if the new value is an
ASCII case-insensitive match for the string "true
" then the
content attribute must be set to the string "true
", if the new value is an
ASCII case-insensitive match for the string "plaintext-only
"
then the content attribute must be set to the string "plaintext-only
", if
the new value is an ASCII case-insensitive match for the string "false
" then the content attribute must be set to the string "false
", and otherwise the attribute setter must throw a
"SyntaxError
" DOMException
.
The isContentEditable
IDL attribute, on getting, must
return true if the element is either an editing host or editable, and
false otherwise.
designMode
getter and setterdocument.designMode [ = value ]
Returns "on
" if the document is editable, and "off
" if it isn't.
Can be set, to change the document's current state. This focuses the document and resets the selection in that document.
Document
objects have an associated design mode enabled, which is a
boolean. It is initially false.
The designMode
getter steps are to return "on
" if this's design mode enabled is true; otherwise
"off
".
The designMode
setter steps are:
Let value be the given value, converted to ASCII lowercase.
If value is "on
" and this's design mode
enabled is false, then:
Set this's design mode enabled to true.
Reset this's active range's start and end boundary points to be at the start of this.
Run the focusing steps for this's document element, if non-null.
If value is "off
", then set this's
design mode enabled to false.
Authors are encouraged to set the 'white-space' property on editing hosts and on markup that was originally created through these editing mechanisms to the value 'pre-wrap'. Default HTML whitespace handling is not well suited to WYSIWYG editing, and line wrapping will not work correctly in some corner cases if 'white-space' is left at its default value.
As an example of problems that occur if the default 'normal' value is used instead, consider the case of the user typing "yellow␣␣ball", with two spaces (here represented by "␣") between the words. With the editing rules in place for the default value of 'white-space' ('normal'), the resulting markup will either consist of "yellow ball" or "yellow ball"; i.e., there will be a non-breaking space between the two words in addition to the regular space. This is necessary because the 'normal' value for 'white-space' requires adjacent regular spaces to be collapsed together.
In the former case, "yellow⍽" might wrap to the next line ("⍽" being used here to represent a non-breaking space) even though "yellow" alone might fit at the end of the line; in the latter case, "⍽ball", if wrapped to the start of the line, would have visible indentation from the non-breaking space.
When 'white-space' is set to 'pre-wrap', however, the editing rules will instead simply put two regular spaces between the words, and should the two words be split at the end of a line, the spaces would be neatly removed from the rendering.
An editing host is either an HTML element
with its contenteditable
attribute in the true
state or plaintext-only state, or a child HTML element of a Document
whose design mode
enabled is true.
The definition of the terms active range, editing host
of, and editable, the user
interface requirements of elements that are editing hosts or
editable, the
execCommand()
,
queryCommandEnabled()
,
queryCommandIndeterm()
,
queryCommandState()
,
queryCommandSupported()
, and
queryCommandValue()
methods, text selections, and the delete the
selection algorithm are defined in execCommand. EXECCOMMAND
User agents can support the checking of spelling and grammar of editable text, either in form
controls (such as the value of textarea
elements), or in elements in an editing
host (e.g. using contenteditable
).
For each element, user agents must establish a default behavior, either through defaults or through preferences expressed by the user. There are three possible default behaviors for each element:
spellcheck
attribute.
spellcheck
attribute.
The spellcheck
attribute is an enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
true
| true | Spelling and grammar will be checked. |
(the empty string) | ||
false
| false | Spelling and grammar will not be checked. |
The attribute's missing value default and invalid value default are both the default state. The default state indicates that the
element is to act according to a default behavior, possibly based on the parent element's own
spellcheck
state, as defined below.
element.spellcheck [ = value ]
Returns true if the element is to have its spelling and grammar checked; otherwise, returns false.
Can be set, to override the default and set the spellcheck
content attribute.
The spellcheck
IDL
attribute, on getting, must return true if the element's spellcheck
content attribute is in the true state, or if the element's spellcheck
content attribute is in the default state and the element's default behavior is true-by-default, or if the element's spellcheck
content attribute is in the default state and the element's default behavior is inherit-by-default and the element's parent
element's spellcheck
IDL attribute would return true;
otherwise, if none of those conditions applies, then the attribute must instead return false.
The spellcheck
IDL attribute is not affected
by user preferences that override the spellcheck
content
attribute, and therefore might not reflect the actual spellchecking state.
On setting, if the new value is true, then the element's spellcheck
content attribute must be set to
"true
", otherwise it must be set to "false
".
User agents should only consider the following pieces of text as checkable for the purposes of this feature:
input
elements whose type
attributes are in the Text, Search,
URL, or Email states and that are mutable (i.e. that do not have the readonly
attribute specified and that are not disabled).textarea
elements that do not
have a readonly
attribute and that are not disabled.Text
nodes that are children of editing
hosts or editable elements.For text that is part of a Text
node, the element with which the text is
associated is the element that is the immediate parent of the first character of the word,
sentence, or other piece of text. For text in attributes, it is the attribute's element. For the
values of input
and textarea
elements, it is the element itself.
To determine if a word, sentence, or other piece of text in an applicable element (as defined above) is to have spelling- and grammar-checking enabled, the UA must use the following algorithm:
spellcheck
content attribute, then: if that attribute is in the
true state, then checking is enabled; otherwise, if that attribute is in the false
state, then checking is disabled.spellcheck
content attribute that is not in the default
state, then: if the nearest such ancestor's spellcheck
content attribute is in the true state, then
checking is enabled; otherwise, checking is disabled.If the checking is enabled for a word/sentence/text, the user agent should indicate spelling
and grammar errors in that text. User agents should take into account the other semantics given in
the document when suggesting spelling and grammar corrections. User agents may use the language of
the element to determine what spelling and grammar rules to use, or may use the user's preferred
language settings. UAs should use input
element attributes such as pattern
to ensure that the resulting value is valid, where
possible.
If checking is disabled, the user agent should not indicate spelling or grammar errors for that text.
The element with ID "a" in the following example would be the one used to determine if the word "Hello" is checked for spelling errors. In this example, it would not be.
<div contenteditable="true">
<span spellcheck="false" id="a">Hell</span><em>o!</em>
</div>
The element with ID "b" in the following example would have checking enabled (the leading
space character in the attribute's value on the input
element causes the attribute
to be ignored, so the ancestor's value is used instead, regardless of the default).
<p spellcheck="true">
<label>Name: <input spellcheck=" false" id="b"></label>
</p>
This specification does not define the user interface for spelling and grammar checkers. A user agent could offer on-demand checking, could perform continuous checking while the checking is enabled, or could use other interfaces.
User agents offer writing suggestions as users type into editable regions, either in form
controls (e.g., the textarea
element) or in elements in an editing host.
The writingsuggestions
content attribute is an
enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
true
| true | Writing suggestions should be offered on this element. |
(the empty string) | ||
false
| false | Writing suggestions should not be offered on this element. |
The attribute's missing value default is the default state. The default state indicates
that the element is to act according to a default behavior, possibly based on the parent
element's own writingsuggestions
state, as defined
below.
The attribute's invalid value default is the true state.
element.writingSuggestions [ = value ]
Returns "true
" if the user agent is to offer writing suggestions under
the scope of the element; otherwise, returns "false
".
Can be set, to override the default and set the
writingsuggestions
content attribute.
The computed writing suggestions value of a given element is determined by running the following steps:
If element's writingsuggestions
content attribute is in the false
state, return "false
".
If element's writingsuggestions
content attribute is in the default state, element has a
parent element, and the computed writing suggestions value of
element's parent element is "false
", then return
"false
".
Return "true
".
The writingSuggestions
getter steps are:
Return this's computed writing suggestions value.
The writingSuggestions
IDL
attribute is not affected by user preferences that override the writingsuggestions
content attribute, and therefore
might not reflect the actual writing suggestions state.
The writingSuggestions
setter steps are:
Set this's writingsuggestions
content attribute to the given value.
User agents should only offer suggestions within an element's scope if the result of running the following algorithm given element returns true:
If the user has disabled writing suggestions, then return false.
If none of the following conditions are true:
element is an input
element whose type
attribute is in either the Text, Search, Telephone, URL,
or Email state and is mutable;
element is a textarea
element that is mutable; or
element is an editing host or is editable,
then return false.
If element has an inclusive ancestor with a writingsuggestions
content attribute that's not in the
default and the nearest such
ancestor's writingsuggestions
content attribute is
in the false state, then return
false.
Otherwise, return true.
This specification does not define the user interface for writing suggestions. A user agent could offer on-demand suggestions, continuous suggestions as the user types, inline suggestions, autofill-like suggestions in a popup, or could use other interfaces.
Some methods of entering text, for example virtual keyboards on mobile devices, and also voice
input, often assist users by automatically capitalizing the first letter of sentences (when
composing text in a language with this convention). A virtual keyboard that implements
autocapitalization might automatically switch to showing uppercase letters (but allow the user to
toggle it back to lowercase) when a letter that should be autocapitalized is about to be typed.
Other types of input, for example voice input, may perform autocapitalization in a way that does
not give users an option to intervene first. The autocapitalize
attribute allows authors to control such
behavior.
The autocapitalize
attribute, as typically
implemented, does not affect behavior when typing on a physical keyboard. (For this reason, as
well as the ability for users to override the autocapitalization behavior in some cases or edit
the text after initial input, the attribute must not be relied on for any sort of input
validation.)
The autocapitalize
attribute can be used on an editing host to control autocapitalization behavior for the hosted
editable region, on an input
or textarea
element to control the behavior
for inputting text into that element, or on a form
element to control the default
behavior for all autocapitalize-and-autocorrect inheriting
elements associated with the form
element.
The autocapitalize
attribute never causes
autocapitalization to be enabled for input
elements whose type
attribute is in one of the URL, Email, or Password states. (This behavior is included
in the used autocapitalization hint algorithm
below.)
The autocapitalization processing model is based on selecting among five autocapitalization hints, defined as follows:
The user agent and input method should make their own determination of whether or not to enable autocapitalization.
No autocapitalization should be applied (all letters should default to lowercase).
The first letter of each sentence should default to a capital letter; all other letters should default to lowercase.
The first letter of each word should default to a capital letter; all other letters should default to lowercase.
All letters should default to uppercase.
The autocapitalize
attribute is an enumerated
attribute whose states are the possible autocapitalization hints. The autocapitalization hint specified by the
attribute's state combines with other considerations to form the used autocapitalization
hint, which informs the behavior of the user agent. The keywords for this attribute and
their state mappings are as follows:
Keyword | State |
---|---|
off
| none |
none
| |
on
| sentences |
sentences
| |
words
| words |
characters
| characters |
The attribute's missing value default is the default state, and its invalid value default is the sentences state.
element.autocapitalize [ = value ]
Returns the current autocapitalization state for the element, or an empty string if it hasn't
been set. Note that for input
and textarea
elements that inherit their
state from a form
element, this will return the autocapitalization state of the
form
element, but for an element in an editable region, this will not return the
autocapitalization state of the editing host (unless this element is, in fact, the editing
host).
Can be set, to set the autocapitalize
content
attribute (and thereby change the autocapitalization behavior for the element).
To compute the own autocapitalization hint of an element element, run the following steps:
If the autocapitalize
content attribute is
present on element, and its value is not the empty string, return the state of the
attribute.
If element is an autocapitalize-and-autocorrect inheriting element and has a non-null form owner, return the own autocapitalization hint of element's form owner.
Return default.
The autocapitalize
getter steps are to:
Let state be the own autocapitalization hint of this.
If state is default, then return the empty string.
If state is none, then return "none
".
If state is sentences, then return
"sentences
".
Return the keyword value corresponding to state.
The autocapitalize
setter steps are to set the autocapitalize
content attribute to the given value.
User agents that support customizable autocapitalization behavior for a text input method and wish to allow web developers to control this functionality should, during text input into an element, compute the used autocapitalization hint for the element. This will be an autocapitalization hint that describes the recommended autocapitalization behavior for text input into the element.
User agents or input methods may choose to ignore or override the used autocapitalization hint in certain circumstances.
The used autocapitalization hint for an element element is computed using the following algorithm:
If element is an input
element whose type
attribute is in one of the URL, Email, or
Password states, then return default.
If element is an input
element or a textarea
element,
then return element's own autocapitalization hint.
If element is an editing host or an editable element, then return the own autocapitalization hint of the editing host of element.
Assert: this step is never reached, since text input only occurs in elements that meet one of the above criteria.
Some methods of entering text assist users by automatically correcting misspelled words while
typing, a process also known as autocorrection. User agents can support autocorrection of editable
text, either in form controls (such as the value of textarea
elements), or in
elements in an editing host (e.g., using contenteditable
). Autocorrection may be accompanied by user
interfaces indicating that text is about to be autocorrected or has been autocorrected, and is
commonly performed when inserting punctuation characters, spaces, or new paragraphs after
misspelled words. The autocorrect
attribute allows authors
to control such behavior.
The autocorrect
attribute can be used on an editing host
to control autocorrection behavior for the hosted editable region, on an input
or
textarea
element to control the behavior when inserting text into that element, or on
a form
element to control the default behavior for all autocapitalize-and-autocorrect inheriting
elements associated with the form
element.
The autocorrect
attribute never causes autocorrection to
be enabled for input
elements whose type
attribute is in one of the URL, E-mail, or Password states. (This behavior is included
in the used autocorrection state algorithm below.)
The autocorrect
attribute is an enumerated attribute with the
following keywords and states:
Keyword | State | Brief description |
---|---|---|
on
| on | The user agent is permitted to automatically correct spelling errors while the user types. Whether spelling is automatically corrected while typing left is for the user agent to decide, and may depend on the element as well as the user's preferences. |
(the empty string) | ||
off
| off | The user agent is not allowed to automatically correct spelling while the user types. |
The attribute's invalid value default and missing value default are both the on state.
The autocorrect
getter steps are: return true if the element's used autocorrection state is on and false if the element's used autocorrection
state is off. The setter steps are: if the
given value is true, then the element's autocorrect
attribute must be set to "on
"; otherwise it must be set to "off
".
To compute the used autocorrection state of an element element, run these steps:
If element is an input
element whose type
attribute is in one of the URL, E-mail, or
Password states, then return off.
If the autocorrect
content attribute is present on
element, then return the state of the attribute.
If element is an autocapitalize-and-autocorrect inheriting
element and has a non-null form owner, then return the state of
element's form owner's autocorrect
attribute.
Return on.
autocorrect
Returns the autocorrection behavior of the element. Note that for autocapitalize-and-autocorrect inheriting
elements that inherit their state from a form
element, this will return the
autocorrection behavior of the form
element, but for an element in an editable
region, this will not return the autocorrection behavior of the editing host (unless
this element is, in fact, the editing host).
autocorrect
=
valueUpdates the autocorrect
content attribute (and
thereby changes the autocorrection behavior of the element).
The input
element in the following example would not allow autocorrection, since
it does not have an autocorrect
content attribute and
therefore inherits from the form
element, which has an attribute of "off
". However, the textarea
element would allow
autocorrection, since it has an autocorrect
content
attribute with a value of "on
".
<form autocorrect="off">
<input type="search">
<textarea autocorrect="on"></textarea>
</form>
inputmode
attributeUser agents can support the inputmode
attribute on form
controls (such as the value of textarea
elements), or in elements in an editing
host (e.g., using contenteditable
).
The inputmode
content attribute is an enumerated attribute that specifies what kind of input
mechanism would be most helpful for users entering content.
Keyword | Description |
---|---|
none
| The user agent should not display a virtual keyboard. This keyword is useful for content that renders its own keyboard control. |
text
| The user agent should display a virtual keyboard capable of text input in the user's locale. |
tel
| The user agent should display a virtual keyboard capable of telephone number input. This should including keys for the digits 0 to 9, the "#" character, and the "*" character. In some locales, this can also include alphabetic mnemonic labels (e.g., in the US, the key labeled "2" is historically also labeled with the letters A, B, and C). |
url
| The user agent should display a virtual keyboard capable of text input in the user's locale, with keys for aiding in the input of URLs, such as that for the "/" and "." characters and for quick input of strings commonly found in domain names such as "www." or ".com". |
email
| The user agent should display a virtual keyboard capable of text input in the user's locale, with keys for aiding in the input of email addresses, such as that for the "@" character and the "." character. |
numeric
| The user agent should display a virtual keyboard capable of numeric input. This keyword is useful for PIN entry. |
decimal
| The user agent should display a virtual keyboard capable of fractional numeric input. Numeric keys and the format separator for the locale should be shown. |
search
| The user agent should display a virtual keyboard optimized for search. |
The inputMode
IDL attribute must reflect the inputmode
content attribute, limited to only known
values.
When inputmode
is unspecified (or is in a state not
supported by the user agent), the user agent should determine the default virtual keyboard to be
shown. Contextual information such as the input type
or
pattern
attributes should be used to determine which type
of virtual keyboard should be presented to the user.
enterkeyhint
attributeUser agents can support the enterkeyhint
attribute on form controls (such as the value of textarea
elements), or in elements
in an editing host (e.g., using contenteditable
).
The enterkeyhint
content attribute is an enumerated
attribute that specifies what action label (or icon) to present for the enter key on
virtual keyboards. This allows authors to customize the presentation of the enter key in order to
make it more helpful for users.
Keyword | Description |
---|---|
enter
| The user agent should present a cue for the operation 'enter', typically inserting a new line. |
done
| The user agent should present a cue for the operation 'done', typically meaning there is nothing more to input and the input method editor (IME) will be closed. |
go
| The user agent should present a cue for the operation 'go', typically meaning to take the user to the target of the text they typed. |
next
| The user agent should present a cue for the operation 'next', typically taking the user to the next field that will accept text. |
previous
| The user agent should present a cue for the operation 'previous', typically taking the user to the previous field that will accept text. |
search
| The user agent should present a cue for the operation 'search', typically taking the user to the results of searching for the text they have typed. |
send
| The user agent should present a cue for the operation 'send', typically delivering the text to its target. |
The enterKeyHint
IDL attribute must reflect the
enterkeyhint
content attribute, limited to only
known values.
When enterkeyhint
is unspecified (or is in a state not
supported by the user agent), the user agent should determine the default action label (or icon)
to present. Contextual information such as the inputmode
,
type
, or pattern
attributes should be used to determine which action label (or icon) to present on the virtual
keyboard.
This section defines find-in-page — a common user-agent mechanism which allows users to search through the contents of the page for particular information.
Access to the find-in-page feature is provided via a find-in-page interface. This is a user-agent provided user interface, which allows the user to specify input and the parameters of the search. This interface can appear as a result of a shortcut or a menu selection.
A combination of text input and settings in the find-in-page interface represents the user query. This typically includes the text that the user wants to search for, as well as optional settings (e.g., the ability to restrict the search to whole words only).
The user-agent processes page contents for a given query, and identifies zero or more matches, which are content ranges that satisfy the user query.
One of the matches is identified to the user as the active match. It is highlighted and scrolled into view. The user can navigate through the matches by advancing the active match using the find-in-page interface.
Issue #3539 tracks
standardizing how find-in-page underlies the currently-unspecified window.find()
API.
details
and hidden=until-found
When find-in-page begins searching for matches, all details
elements in the page
which do not have their open
attribute set should have the
skipped contents of their second slot become accessible,
without modifying the open
attribute, in order to make
find-in-page able to search through it. Similarly, all HTML elements with the hidden
attribute in the hidden until found state should have their skipped contents become accessible without modifying the hidden
attribute in order to make find-in-page able to search through
them. After find-in-page finishes searching for matches, the details
elements and the
elements with the hidden
attribute in the hidden until found state should have their contents
become skipped again. This entire process must happen synchronously (and so is not observable to
users or to author code). CSSCONTAIN
When find-in-page chooses a new active match, perform the following steps:
Let node be the first node in the active match.
Queue a global task on the user interaction task source given node's relevant global object to run the following steps:
Run the ancestor details revealing algorithm on node.
Run the ancestor hidden-until-found revealing algorithm on node.
When find-in-page auto-expands a details
element like this, it will fire a toggle
event. As with the separate scroll
event that find-in-page fires, this event could be used by the
page to discover what the user is typing into the find-in-page dialog. If the page creates a tiny
scrollable area with the current search term and every possible next character the user could type
separated by a gap, and observes which one the browser scrolls to, it can add that character to
the search term and update the scrollable area to incrementally build the search term. By wrapping
each possible next match in a closed details
element, the page could listen to toggle
events instead of scroll
events. This attack could be addressed for both events by not acting on every character the user
types into the find-in-page dialog.
The find-in-page process is invoked in the context of a document, and may have an effect on the selection of that document. Specifically, the range that defines the active match can dictate the current selection. These selection updates, however, can happen at different times during the find-in-page process (e.g. upon the find-in-page interface dismissal or upon a change in the active match range).
In an implementation-defined (and likely device-specific) manner, a user can send a close request to the user agent. This indicates that the user wishes to close something that is currently being shown on the screen, such as a popover, menu, dialog, picker, or display mode.
Some example close requests are:
The Esc key on desktop platforms.
The back button or gesture on certain mobile platforms such as Android.
Any assistive technology's dismiss gesture, such as iOS VoiceOver's two-finger scrub "z" gesture.
A game controller's canonical "back" button, such as the circle button on a DualShock gamepad.
Whenever the user agent receives a potential close request targeted at a Document
document, it must queue a global task on the user interaction task
source given document's relevant global object to perform the
following close request steps:
If document's fullscreen element is not null, then:
Fully exit fullscreen given document's node navigable's top-level traversable's active document.
Return.
This does not fire any relevant event, such as keydown
; it only causes fullscreenchange
to be eventually fired.
Optionally, skip to the step labeled alternative processing.
For example, if the user agent detects user frustration at repeated close request interception by the current web page, it might take this path.
Fire any relevant events, per UI Events or other relevant specifications. UIEVENTS
An example of a relevant event in the UI Events model would be
the keydown
event that UI Events suggests firing when the
user presses the Esc key on their keyboard. On most platforms with keyboards, this
is treated as a close request, and so would trigger these close request
steps.
An example of relevant events that are outside of the model given in
UI Events would be assistive technology synthesizing an Esc keydown
event when the user sends a close request by
using a dismiss gesture.
Let event be null if no such events are fired, or the Event
object representing one of the fired events otherwise. If multiple events are fired, which one
is chosen is implementation-defined.
If event is not null, and its canceled flag is set, then return.
If document is not fully active, then return.
This step is necessary because, if event is not null, then an event listener might have caused document to no longer be fully active.
Let closedSomething be the result of processing close watchers on document's relevant global object.
If closedSomething is true, then return.
Alternative processing: Otherwise, there was nothing watching for a close request. The user agent may instead interpret this interaction as some other action, instead of interpreting it as a close request.
On platforms where pressing the Esc key is interpreted as a close
request, the user agent must interpret the key being pressed down as the close
request, instead of the key being released. Thus, in the above algorithm, the "relevant events"
that are fired must be the single keydown
event.
On platforms where Esc is the close request, the user
agent will first fire an appropriately-initialized keydown
event. If the web developer cancels the event by calling preventDefault()
, then nothing further happens. But if
the event fires without being canceled, then the user agent proceeds to process close
watchers.
On platforms where a back button is a potential close request, no event is involved, so when the back button is pressed, the user agent proceeds directly to process close watchers. If there is an active close watcher, then that will get triggered. If there is not, then the user agent can interpret the back button press in another way, for example as a request to traverse the history by a delta of −1.
Each Window
has a close watcher manager, which is a
struct with the following items:
Groups, a list of lists of close watchers, initially empty.
Allowed number of groups, a number, initially 1.
Next user interaction allows a new group, a boolean, initially true.
Most of the complexity of the close watcher manager comes from anti-abuse protections designed to prevent developers from disabling users' history traversal abilities, for platforms where a close request's fallback action is the main mechanism of history traversal. In particular:
The grouping of close watchers is designed so that if multiple close watchers are created without history-action activation, they are grouped together, so that a user-triggered close request will close all of the close watchers in a group. This ensures that web developers can't intercept an unlimited number of close requests by creating close watchers; instead they can create a number equal to at most 1 + the number of times the user activates the page.
The next user interaction allows a new group boolean encourages web developers to create close watchers in a way that is tied to individual user activations. Without it, each user activation would increase the allowed number of groups, even if the web developer isn't "using" those user activations to create close watchers. In short:
Allowed: user interaction; create a close watcher in its own group; user interaction; create a close watcher in a second independent group.
Disallowed: user interaction; user interaction; create a close watcher in its own group; create a close watcher in a second independent group.
Allowed: user interaction; user interaction; create a close watcher in its own group; create a close watcher grouped with the previous one.
This protection is not important for upholding our desired invariant of creating at most (1 + the number of times the user activates the page) groups. A determined abuser will just create one close watcher per user interaction, "banking" them for future abuse. But this system causes more predictable behavior for the normal case, and encourages non-abusive developers to create close watchers directly in response to user interactions.
To notify the close watcher manager about user activation given a
Window
window:
Let manager be window's close watcher manager.
If manager's next user interaction allows a new group is true, then increment manager's allowed number of groups.
Set manager's next user interaction allows a new group to false.
A close watcher is a struct with the following items:
A window, a Window
.
A cancel action, an algorithm accepting a boolean argument and returning a boolean. The argument indicates whether or not the cancel action algorithm can prevent the close request from proceeding via the algorithm's return value. If the boolean argument is true, then the algorithm can return either true to indicate that the caller will proceed to the close action, or false to indicate that the caller will bail out. If the argument is false, then the return value is always false. This algorithm can never throw an exception.
A close action, an algorithm accepting no arguments and returning nothing. This algorithm can never throw an exception.
An is running cancel action boolean.
A close watcher closeWatcher is active if closeWatcher's window's close watcher manager contains any list which contains closeWatcher.
To establish a close watcher given a Window
window, a list
of steps cancelAction, and a
list of steps closeAction:
Assert: window's associated Document
is fully
active.
Let closeWatcher be a new close watcher, with
Let manager be window's close watcher manager.
If manager's groups's size is less than manager's allowed number of groups, then append « closeWatcher » to manager's groups.
Otherwise:
Assert: manager's groups's size is at least 1 in this branch, since manager's allowed number of groups is always at least 1.
Append closeWatcher to manager's groups's last item.
Set manager's next user interaction allows a new group to true.
Return closeWatcher.
To request to close a close watcher closeWatcher:
If closeWatcher is not active, then return true.
If closeWatcher's is running cancel action is true, then return true.
Let window be closeWatcher's window.
If window's associated
Document
is not fully active, then return true.
Let canPreventClose be true if window's close watcher manager's groups's size is less than window's close watcher manager's allowed number of groups, and window has history-action activation; otherwise false.
Set closeWatcher's is running cancel action to true.
Let shouldContinue be the result of running closeWatcher's cancel action given canPreventClose.
Set closeWatcher's is running cancel action to false.
If shouldContinue is false, then:
Assert: canPreventClose is true.
Consume history-action user activation given window.
Return false.
Note that since these substeps consume history-action user activation, requesting to close a close watcher twice without any intervening user activation will result in canPreventClose being false the second time.
Close closeWatcher.
Return true.
To close a close watcher closeWatcher:
If closeWatcher is not active, then return.
If closeWatcher's window's associated Document
is not fully
active, then return.
Destroy closeWatcher.
Run closeWatcher's close action.
To destroy a close watcher closeWatcher:
Let manager be closeWatcher's window's close watcher manager.
For each group of manager's groups: remove closeWatcher from group.
Remove any item from manager's groups that is empty.
To process close watchers given a Window
window:
Let processedACloseWatcher be false.
If window's close watcher manager's groups is not empty:
Let group be the last item in window's close watcher manager's groups.
For each closeWatcher of group, in reverse order:
Set processedACloseWatcher to true.
Let shouldProceed be the result of requesting to close closeWatcher.
If shouldProceed is false, then break.
If window's close watcher manager's allowed number of groups is greater than 1, decrement it by 1.
Return processedACloseWatcher.
CloseWatcher
interface[Exposed=Window]
interface CloseWatcher : EventTarget {
constructor(optional CloseWatcherOptions options = {});
undefined requestClose();
undefined close();
undefined destroy();
attribute EventHandler oncancel;
attribute EventHandler onclose;
};
dictionary CloseWatcherOptions {
AbortSignal signal;
};
watcher = new CloseWatcher()
watcher = new CloseWatcher({ signal })
Creates a new CloseWatcher
instance.
If the signal
option is provided, then
watcher can be destroyed (as if by watcher.destroy()
) by aborting the given
AbortSignal
.
If any close watcher is already active, and the Window
does not
have history-action activation, then the resulting CloseWatcher
will
be closed together with that already-active close watcher in response to any
close request. (This already-active close watcher does not
necessarily have to be a CloseWatcher
object; it could be a modal
dialog
element, or a popover generated by an element with the popover
attribute.)
watcher.requestClose()
Acts as if a close request was sent targeting watcher, by first
firing a cancel
event, and if that event is not canceled
with preventDefault()
, proceeding to fire a
close
event before deactivating the close watcher as if watcher.destroy()
was called.
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.
watcher.close()
Immediately fires the close
event, and then deactivates
the close watcher as if watcher.destroy()
was
called.
This is a helper utility that can be used trigger the closing logic into the close
event handler, skipping any logic in the cancel
event handler.
watcher.destroy()
Deactivates watcher, so that it will no longer receive close
events and so that new independent CloseWatcher
instances can be constructed.
This is intended to be called if the relevant UI element is torn down in some other way than being closed.
Each CloseWatcher
instance has an internal close watcher, which is a
close watcher.
The new CloseWatcher(options)
constructor steps are:
If this's relevant global object's associated Document
is not fully
active, then throw an "InvalidStateError
"
DOMException
.
Let closeWatcher be the result of establishing a close watcher given this's relevant global object, with:
cancelAction given
canPreventClose being to return the result of firing an event named cancel
at this, with the cancelable
attribute initialized to
canPreventClose.
closeAction being to fire an event named close
at this.
If options["signal
"] exists, then:
If options["signal
"] is
aborted, then destroy closeWatcher.
Add the following steps to options["signal
"]:
Destroy closeWatcher.
Set this's internal close watcher to closeWatcher.
The requestClose()
method steps are to request to close this's internal
close watcher.
The close()
method steps are to close this's
internal close watcher.
The destroy()
method steps are to destroy this's internal close
watcher.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by all objects implementing the
CloseWatcher
interface:
Event handler | Event handler event type |
---|---|
oncancel | cancel
|
onclose | close
|
If one wanted to implement a custom picker control, which closed itself on a user-provided
close request as well as when a close button is pressed, the following code shows how
one would use the CloseWatcher
API to process close requests:
const watcher = new CloseWatcher();
const picker = setUpAndShowPickerDOMElement();
let chosenValue = null;
watcher.onclose = () => {
chosenValue = picker.querySelector('input').value;
picker.remove();
};
picker.querySelector('.close-button').onclick = () => watcher.requestClose();
Note how the logic to gather the chosen value is centralized in the CloseWatcher
object's close
event handler, with the click
event handler for the close button delegating to that logic by
calling requestClose()
.
The cancel
event on CloseWatcher
objects can
be used to prevent the close
event from firing, and the
CloseWatcher
from being destroying. A typical use case is as follows:
watcher.oncancel = async (e) => {
if (hasUnsavedData && e.cancelable) {
e.preventDefault();
const userReallyWantsToClose = await askForConfirmation("Are you sure you want to close?");
if (userReallyWantsToClose) {
hasUnsavedData = false;
watcher.close();
}
}
};
For abuse prevention purposes, this event is only cancelable
if the page has history-action
activation, which will be lost after any given close request. This ensures
that if the user sends a close request twice in a row without any intervening user activation,
the request definitely succeeds; the second request ignores any cancel
event handler's attempt to call preventDefault()
and proceeds to close the
CloseWatcher
.
Combined, the above two examples show how requestClose()
and close()
differ. Because we used requestClose()
in the click
event handler for the close button, clicking that button will
trigger the CloseWatcher
's cancel
event, and thus
potentially ask the user for confirmation if there is unsaved data. If we had used close()
, then this check would be skipped. Sometimes that
is appropriate, but usually requestClose()
is
the better option for user-triggered close requests.
In addition to the user activation restrictions for cancel
events, there is a more subtle form of user activation gating
for CloseWatcher
construction. If one creates more than one
CloseWatcher
without user activation, then the newly-created one will get grouped
together with the most-recently-created close watcher, so that a single close
request will close them both:
window.onload = () => {
// This will work as normal: it is the first close watcher created without user activation.
(new CloseWatcher()).onclose = () => { /* ... */ };
};
button1.onclick = () => {
// This will work as normal: the button click counts as user activation.
(new CloseWatcher()).onclose = () => { /* ... */ };
};
button2.onclick = () => {
// These will be grouped together, and both will close in response to a single close request.
(new CloseWatcher()).onclose = () => { /* ... */ };
(new CloseWatcher()).onclose = () => { /* ... */ };
};
This means that calling destroy()
, close()
, or requestClose()
properly is important. Doing so is
the only way to get back the "free" ungrouped close watcher slot. Such close watchers created
without user activation are useful for cases like session inactivity timeout dialogs or urgent
notifications of server-triggered events, which are not generated in response to user
activation.
This section defines an event-based drag-and-drop mechanism.
This specification does not define exactly what a drag-and-drop operation actually is.
On a visual medium with a pointing device, a drag operation could be the default action of a
mousedown
event that is followed by a series of mousemove
events, and the drop could be triggered by the mouse
being released.
When using an input modality other than a pointing device, users would probably have to explicitly indicate their intention to perform a drag-and-drop operation, stating what they wish to drag and where they wish to drop it, respectively.
However it is implemented, drag-and-drop operations must have a starting point (e.g. where the mouse was clicked, or the start of the selection or element that was selected for the drag), may have any number of intermediate steps (elements that the mouse moves over during a drag, or elements that the user picks as possible drop points as they cycle through possibilities), and must either have an end point (the element above which the mouse button was released, or the element that was finally selected), or be canceled. The end point must be the last element selected as a possible drop point before the drop occurs (so if the operation is not canceled, there must be at least one element in the middle step).
To make an element draggable, give the element a draggable
attribute, and set an event listener for dragstart
that
stores the data being dragged.
The event handler typically needs to check that it's not a text selection that is being
dragged, and then needs to store data into the DataTransfer
object and set the
allowed effects (copy, move, link, or some combination).
For example:
<p>What fruits do you like?</p>
<ol ondragstart="dragStartHandler(event)">
<li draggable="true" data-value="fruit-apple">Apples</li>
<li draggable="true" data-value="fruit-orange">Oranges</li>
<li draggable="true" data-value="fruit-pear">Pears</li>
</ol>
<script>
var internalDNDType = 'text/x-example'; // set this to something specific to your site
function dragStartHandler(event) {
if (event.target instanceof HTMLLIElement) {
// use the element's data-value="" attribute as the value to be moving:
event.dataTransfer.setData(internalDNDType, event.target.dataset.value);
event.dataTransfer.effectAllowed = 'move'; // only allow moves
} else {
event.preventDefault(); // don't allow selection to be dragged
}
}
</script>
To accept a drop, the drop target has to listen to the following events:
dragenter
event handler reports
whether or not the drop target is potentially willing to accept the drop, by canceling the
event.dragover
event handler specifies what feedback
will be shown to the user, by setting the dropEffect
attribute of the
DataTransfer
associated with the event. This event also needs to be canceled.drop
event handler has a final chance to accept or
reject the drop. If the drop is accepted, the event handler must perform the drop operation on
the target. This event needs to be canceled, so that the dropEffect
attribute's value can be used by the
source. Otherwise, the drop operation is rejected.For example:
<p>Drop your favorite fruits below:</p>
<ol ondragenter="dragEnterHandler(event)" ondragover="dragOverHandler(event)"
ondrop="dropHandler(event)">
</ol>
<script>
var internalDNDType = 'text/x-example'; // set this to something specific to your site
function dragEnterHandler(event) {
var items = event.dataTransfer.items;
for (var i = 0; i < items.length; ++i) {
var item = items[i];
if (item.kind == 'string' && item.type == internalDNDType) {
event.preventDefault();
return;
}
}
}
function dragOverHandler(event) {
event.dataTransfer.dropEffect = 'move';
event.preventDefault();
}
function dropHandler(event) {
var li = document.createElement('li');
var data = event.dataTransfer.getData(internalDNDType);
if (data == 'fruit-apple') {
li.textContent = 'Apples';
} else if (data == 'fruit-orange') {
li.textContent = 'Oranges';
} else if (data == 'fruit-pear') {
li.textContent = 'Pears';
} else {
li.textContent = 'Unknown Fruit';
}
event.target.appendChild(li);
}
</script>
To remove the original element (the one that was dragged) from the display, the dragend
event can be used.
For our example here, that means updating the original markup to handle that event:
<p>What fruits do you like?</p>
<ol ondragstart="dragStartHandler(event)" ondragend="dragEndHandler(event)">
...as before...
</ol>
<script>
function dragStartHandler(event) {
// ...as before...
}
function dragEndHandler(event) {
if (event.dataTransfer.dropEffect == 'move') {
// remove the dragged element
event.target.parentNode.removeChild(event.target);
}
}
</script>
The data that underlies a drag-and-drop operation, known as the drag data store, consists of the following information:
A drag data store item list, which is a list of items representing the dragged data, each consisting of the following information:
The kind of data:
Text.
Binary data with a filename.
A Unicode string giving the type or format of the data, generally given by a MIME type. Some values that are not MIME types are special-cased for legacy reasons. The API does not enforce the use of MIME types; other values can be used as well. In all cases, however, the values are all converted to ASCII lowercase by the API.
There is a limit of one text item per item type string.
A Unicode or binary string, in some cases with a filename (itself a Unicode string), as per the drag data item kind.
The drag data store item list is ordered in the order that the items were added to the list; most recently added last.
The following information, used to generate the UI feedback during the drag:
A drag data store mode, which is one of the following:
For the dragstart
event. New data can be added to the
drag data store.
For the drop
event. The list of items representing dragged
data can be read, including the data. No new data can be added.
For all other events. The formats and kinds in the drag data store list of items representing dragged data can be enumerated, but the data itself is unavailable and no new data can be added.
A drag data store allowed effects state, which is a string.
When a drag data store is created, it
must be initialized such that its drag data store item list is empty, it has no
drag data store default feedback, it has no drag data store bitmap and
drag data store hot spot coordinate, its drag data store mode is protected mode, and its drag data store allowed effects
state is the string "uninitialized
".
DataTransfer
interfaceDataTransfer
objects are used to expose the drag data store that
underlies a drag-and-drop operation.
[Exposed=Window]
interface DataTransfer {
constructor();
attribute DOMString dropEffect;
attribute DOMString effectAllowed;
[SameObject] readonly attribute DataTransferItemList items;
undefined setDragImage(Element image, long x, long y);
/* old interface */
readonly attribute FrozenArray<DOMString> types;
DOMString getData(DOMString format);
undefined setData(DOMString format, DOMString data);
undefined clearData(optional DOMString format);
[SameObject] readonly attribute FileList files;
};
dataTransfer = new DataTransfer()
Creates a new DataTransfer
object with an empty drag data
store.
dataTransfer.dropEffect [ = value ]
Returns the kind of operation that is currently selected. If the kind of operation isn't one
of those that is allowed by the effectAllowed
attribute, then the operation will
fail.
Can be set, to change the selected operation.
The possible values are "none
", "copy
", "link
", and "move
".
dataTransfer.effectAllowed [ = value ]
Returns the kinds of operations that are to be allowed.
Can be set (during the dragstart
event), to change
the allowed operations.
The possible values are "none
",
"copy
", "copyLink
", "copyMove
", "link
", "linkMove
", "move
", "all
", and "uninitialized
",
dataTransfer.items
Returns a DataTransferItemList
object, with the drag data.
dataTransfer.setDragImage(element, x, y)
Uses the given element to update the drag feedback, replacing any previously specified feedback.
dataTransfer.types
Returns a frozen array listing the formats that were set in the dragstart
event. In addition, if any files are being
dragged, then one of the types will be the string "Files
".
data = dataTransfer.getData(format)
Returns the specified data. If there is no such data, returns the empty string.
dataTransfer.setData(format, data)
Adds the specified data.
dataTransfer.clearData([ format ])
Removes the data of the specified formats. Removes all data if the argument is omitted.
dataTransfer.files
Returns a FileList
of the files being dragged, if any.
DataTransfer
objects that are created as part of drag-and-drop events are only valid while those events are being fired.
A DataTransfer
object is associated with a drag data store while it
is valid.
A DataTransfer
object has an associated types array, which is a
FrozenArray<DOMString>
, initially empty. When the contents
of the DataTransfer
object's drag data store item list change, or when
the DataTransfer
object becomes no longer associated with a drag data
store, run the following steps:
Let L be an empty sequence.
If the DataTransfer
object is still associated with a drag data
store, then:
For each item in the DataTransfer
object's drag data store item
list whose kind
is text, add an entry to L consisting of the item's type string.
If there are any items in the DataTransfer
object's drag data store
item list whose kind is File, then
add an entry to L consisting of the string "Files
". (This
value can be distinguished from the other values because it is not lowercase.)
Set the DataTransfer
object's types
array to the result of creating a frozen array from L.
The DataTransfer()
constructor, when invoked, must return a
newly created DataTransfer
object initialized as follows:
Set the drag data store's item list to be an empty list.
Set the drag data store's mode to read/write mode.
Set the dropEffect
and
effectAllowed
to "none".
The dropEffect
attribute controls the drag-and-drop
feedback that the user is given during a drag-and-drop operation. When the
DataTransfer
object is created, the dropEffect
attribute is set to a string value. On
getting, it must return its current value. On setting, if the new value is one of "none
", "copy
", "link
", or "move
", then the attribute's current value
must be set to the new value. Other values must be ignored.
The effectAllowed
attribute is used in the
drag-and-drop processing model to initialize the dropEffect
attribute during the dragenter
and dragover
events. When the DataTransfer
object is
created, the effectAllowed
attribute is set
to a string value. On getting, it must return its current value. On setting, if drag data
store's mode is the read/write mode and the new value is one of "none
", "copy
", "copyLink
", "copyMove
", "link
", "linkMove
", "move
", "all
", or "uninitialized
", then the attribute's
current value must be set to the new value. Otherwise, it must be left unchanged.
The items
attribute must return a DataTransferItemList
object associated with the
DataTransfer
object.
The setDragImage(image, x,
y)
method must run the following steps:
If the DataTransfer
object is no longer associated with a drag data
store, return. Nothing happens.
If the drag data store's mode is not the read/write mode, return. Nothing happens.
If image is an img
element, then set the drag data store
bitmap to the element's image (at its natural
size); otherwise, set the drag data store bitmap to an image generated from
the given element (the exact mechanism for doing so is not currently specified).
Set the drag data store hot spot coordinate to the given x, y coordinate.
The types
attribute must return this DataTransfer
object's types array.
The getData(format)
method must run the
following steps:
If the DataTransfer
object is no longer associated with a drag data
store, then return the empty string.
If the drag data store's mode is the protected mode, then return the empty string.
Let format be the first argument, converted to ASCII lowercase.
Let convert-to-URL be false.
If format equals "text
", change it to "text/plain
".
If format equals "url
", change it to "text/uri-list
" and set convert-to-URL to true.
If there is no item in the drag data store item list whose kind is text and whose type string is equal to format, return the empty string.
Let result be the data of the item in the drag data store item list whose kind is Plain Unicode string and whose type string is equal to format.
If convert-to-URL is true, then parse result as appropriate for
text/uri-list
data, and then set result to the first URL from
the list, if any, or the empty string otherwise. RFC2483
Return result.
The setData(format, data)
method
must run the following steps:
If the DataTransfer
object is no longer associated with a drag data
store, return. Nothing happens.
If the drag data store's mode is not the read/write mode, return. Nothing happens.
Let format be the first argument, converted to ASCII lowercase.
If format equals "text
", change it to "text/plain
".
If format equals "url
", change it to "text/uri-list
".
Remove the item in the drag data store item list whose kind is text and whose type string is equal to format, if there is one.
Add an item to the drag data store item list whose kind is text, whose type string is equal to format, and whose data is the string given by the method's second argument.
The clearData(format)
method must run the
following steps:
If the DataTransfer
object is no longer associated with a drag data
store, return. Nothing happens.
If the drag data store's mode is not the read/write mode, return. Nothing happens.
If the method was called with no arguments, remove each item in the drag data store item list whose kind is Plain Unicode string, and return.
Set format to format, converted to ASCII lowercase.
If format equals "text
", change it to "text/plain
".
If format equals "url
", change it to "text/uri-list
".
Remove the item in the drag data store item list whose kind is text and whose type string is equal to format, if there is one.
The clearData()
method does not
affect whether any files were included in the drag, so the types
attribute's list might still not be empty after
calling clearData()
(it would still contain the
"Files
" string if any files were included in the drag).
The files
attribute must return a live FileList
sequence consisting of
File
objects representing the files found by the following steps. Furthermore, for a
given FileList
object and a given underlying file, the same File
object
must be used each time.
Start with an empty list L.
If the DataTransfer
object is no longer associated with a drag data
store, the FileList
is empty. Return the empty list L.
If the drag data store's mode is the protected mode, return the empty list L.
For each item in the drag data store item list whose kind is File, add the item's data (the file, in particular its name and contents, as well as its type) to the list L.
The files found by these steps are those in the list L.
This version of the API does not expose the types of the files during the drag.
DataTransferItemList
interfaceEach DataTransfer
object is associated with a DataTransferItemList
object.
[Exposed=Window]
interface DataTransferItemList {
readonly attribute unsigned long length;
getter DataTransferItem (unsigned long index);
DataTransferItem? add(DOMString data, DOMString type);
DataTransferItem? add(File data);
undefined remove(unsigned long index);
undefined clear();
};
items.length
Returns the number of items in the drag data store.
items[index]
Returns the DataTransferItem
object representing the indexth entry in
the drag data store.
items.remove(index)
Removes the indexth entry in the drag data store.
items.clear()
Removes all the entries in the drag data store.
items.add(data)
items.add(data, type)
Adds a new entry for the given data to the drag data store. If the data is plain text then a type string has to be provided also.
While the DataTransferItemList
object's DataTransfer
object is
associated with a drag data store, the DataTransferItemList
object's
mode is the same as the drag data store mode. When the
DataTransferItemList
object's DataTransfer
object is not
associated with a drag data store, the DataTransferItemList
object's
mode is the disabled mode. The drag data store referenced in this
section (which is used only when the DataTransferItemList
object is not in the
disabled mode) is the drag data store with which the
DataTransferItemList
object's DataTransfer
object is associated.
The length
attribute must return zero if the
object is in the disabled mode; otherwise it must return the number of items in the
drag data store item list.
When a DataTransferItemList
object is not in the disabled mode, its
supported property indices are the indices of the drag data store
item list.
To determine the value of an indexed property
i of a DataTransferItemList
object, the user agent must return a
DataTransferItem
object representing the ith item in the
drag data store. The same object must be returned each time a particular item is
obtained from this DataTransferItemList
object. The DataTransferItem
object must be associated with the same DataTransfer
object as the
DataTransferItemList
object when it is first created.
The add()
method must run the following steps:
If the DataTransferItemList
object is not in the read/write mode, return null.
Jump to the appropriate set of steps from the following list:
If there is already an item in the drag data store item list whose kind is text and whose type string is equal to the value of the
method's second argument, converted to ASCII lowercase, then throw a
"NotSupportedError
" DOMException
.
Otherwise, add an item to the drag data store item list whose kind is text, whose type string is equal to the value of the method's second argument, converted to ASCII lowercase, and whose data is the string given by the method's first argument.
File
Add an item to the drag data store item list whose kind is File, whose type
string is the type
of the File
,
converted to ASCII lowercase, and whose data is the same as the
File
's data.
Determine the value of the indexed property
corresponding to the newly added item, and return that value (a newly created
DataTransferItem
object).
The remove(index)
method must run
these steps:
If the DataTransferItemList
object is not in the read/write mode, throw an
"InvalidStateError
" DOMException
.
If the drag data store does not contain an indexth item, then return.
Remove the indexth item from the drag data store.
The clear()
method, if the
DataTransferItemList
object is in the read/write mode,
must remove all the items from the drag data store. Otherwise, it must do
nothing.
DataTransferItem
interfaceEach DataTransferItem
object is associated with a DataTransfer
object.
[Exposed=Window]
interface DataTransferItem {
readonly attribute DOMString kind;
readonly attribute DOMString type;
undefined getAsString(FunctionStringCallback? _callback);
File? getAsFile();
};
callback FunctionStringCallback = undefined (DOMString data);
item.kind
Returns the drag data item kind, one of: "string", "file".
item.type
Returns the drag data item type string.
item.getAsString(callback)
Invokes the callback with the string data as the argument, if the drag data item kind is text.
file = item.getAsFile()
Returns a File
object, if the drag data item kind is
File.
While the DataTransferItem
object's DataTransfer
object is associated
with a drag data store and that drag data store's drag data store
item list still contains the item that the DataTransferItem
object represents,
the DataTransferItem
object's mode is the same as the drag data store
mode. When the DataTransferItem
object's DataTransfer
object is
not associated with a drag data store, or if the item that the
DataTransferItem
object represents has been removed from the relevant drag data
store item list, the DataTransferItem
object's mode is the disabled
mode. The drag data store referenced in this section (which is used only when the
DataTransferItem
object is not in the disabled mode) is the drag data
store with which the DataTransferItem
object's DataTransfer
object is associated.
The kind
attribute must return the empty string if the
DataTransferItem
object is in the disabled mode; otherwise it must return the
string given in the cell from the second column of the following table from the row whose cell in
the first column contains the drag data item kind of the item represented by the
DataTransferItem
object:
Kind | String |
---|---|
Text | "string "
|
File | "file "
|
The type
attribute must return the empty string if the
DataTransferItem
object is in the disabled mode; otherwise it must return
the drag data item type string of the item represented by the
DataTransferItem
object.
The getAsString(callback)
method
must run the following steps:
If the callback is null, return.
If the DataTransferItem
object is not in the read/write mode or the read-only mode,
return. The callback is never invoked.
If the drag data item kind is not text, then return. The callback is never invoked.
Otherwise, queue a task to invoke callback, passing the
actual data of the item represented by the DataTransferItem
object as the
argument.
The getAsFile()
method must run the following
steps:
If the DataTransferItem
object is not in the read/write mode or the read-only mode,
then return null.
If the drag data item kind is not File, then return null.
Return a new File
object representing the actual data of the item represented
by the DataTransferItem
object.
DragEvent
interfaceThe drag-and-drop processing model involves several events. They all use the
DragEvent
interface.
[Exposed=Window]
interface DragEvent : MouseEvent {
constructor(DOMString type, optional DragEventInit eventInitDict = {});
readonly attribute DataTransfer? dataTransfer;
};
dictionary DragEventInit : MouseEventInit {
DataTransfer? dataTransfer = null;
};
event.dataTransfer
Returns the DataTransfer
object for the event.
Although, for consistency with other event interfaces, the DragEvent
interface has a constructor, it is not particularly useful. In particular, there's no way to
create a useful DataTransfer
object from script, as DataTransfer
objects
have a processing and security model that is coordinated by the browser during drag-and-drops.
The dataTransfer
attribute of the
DragEvent
interface must return the value it was initialized to. It represents the
context information for the event.
When a user agent is required to fire a DND event named e at an element, using a particular drag data store, and optionally with a specific related target, the user agent must run the following steps:
If no specific related target was provided, set related target to null.
Let window be the relevant global object of the
Document
object of the specified target element.
If e is dragstart
, then set the
drag data store mode to the read/write mode
and set dataDragStoreWasChanged to true.
If e is drop
, set the drag data store
mode to the read-only mode.
Let dataTransfer be a newly created DataTransfer
object
associated with the given drag data store.
Set the effectAllowed
attribute to the drag data
store's drag data store allowed effects state.
Set the dropEffect
attribute to "none
" if e is dragstart
, drag
, or
dragleave
; to the value corresponding to the
current drag operation if e is drop
or dragend
; and to a value based on the effectAllowed
attribute's value and the
drag-and-drop source, as given by the following table, otherwise (i.e. if e is dragenter
or dragover
):
effectAllowed |
dropEffect |
---|---|
"none " |
"none " |
"copy " |
"copy " |
"copyLink " |
"copy ", or, if appropriate, "link " |
"copyMove " |
"copy ", or, if appropriate, "move " |
"all " |
"copy ", or, if appropriate, either "link " or "move " |
"link " |
"link " |
"linkMove " |
"link ", or, if appropriate, "move " |
"move " |
"move " |
"uninitialized " when what is being dragged is a selection from a text control |
"move ", or, if appropriate, either "copy " or "link " |
"uninitialized " when what is being dragged is a selection |
"copy ", or, if appropriate, either "link " or "move " |
"uninitialized " when what is being dragged is an a element with an href attribute |
"link ", or, if appropriate, either "copy " or "move " |
Any other case | "copy ", or, if appropriate, either "link " or "move " |
Where the table above provides possibly appropriate alternatives, user agents may instead use the listed alternative values if platform conventions dictate that the user has requested those alternate effects.
For example, Windows platform conventions are such that dragging while
holding the "alt" key indicates a preference for linking the data, rather than moving or copying
it. Therefore, on a Windows system, if "link
" is an option according to
the table above while the "alt" key is depressed, the user agent could select that instead of
"copy
" or "move
".
Let event be the result of creating an event using
DragEvent
.
Initialize event's type
attribute to
e, its bubbles
attribute to true, its view
attribute to window, its relatedTarget
attribute to related
target, and its dataTransfer
attribute to
dataTransfer.
If e is not dragleave
or dragend
, then initialize event's cancelable
attribute to true.
Initialize event's mouse and key attributes initialized according to the state of the input devices as they would be for user interaction events.
If there is no relevant pointing device, then initialize event's screenX
, screenY
, clientX
, clientY
, and button
attributes to 0.
Dispatch event at the specified target element.
Set the drag data store allowed effects state to the current value of
dataTransfer's effectAllowed
attribute. (It can only have changed value if e is dragstart
.)
If dataDragStoreWasChanged is true, then set the drag data store mode back to the protected mode.
Break the association between dataTransfer and the drag data store.
When the user attempts to begin a drag operation, the user agent must run the following steps. User agents must act as if these steps were run even if the drag actually started in another document or application and the user agent was not aware that the drag was occurring until it intersected with a document under the user agent's purview.
Determine what is being dragged, as follows:
If the drag operation was invoked on a selection, then it is the selection that is being dragged.
Otherwise, if the drag operation was invoked on a Document
, it is the first
element, going up the ancestor chain, starting at the node that the user tried to drag, that has
the IDL attribute draggable
set to true. If there is no such
element, then nothing is being dragged; return, the drag-and-drop operation is never
started.
Otherwise, the drag operation was invoked outside the user agent's purview. What is being dragged is defined by the document or application where the drag was started.
img
elements and a
elements with an href
attribute have their draggable
attribute set to true by default.
Create a drag data store. All the DND events fired subsequently by the steps in this section must use this drag data store.
Establish which DOM node is the source node, as follows:
If it is a selection that is being dragged, then the source node is the
Text
node that the user started the drag on (typically the Text
node
that the user originally clicked). If the user did not specify a particular node, for example if
the user just told the user agent to begin a drag of "the selection", then the source
node is the first Text
node containing a part of the selection.
Otherwise, if it is an element that is being dragged, then the source node is the element that is being dragged.
Otherwise, the source node is part of another document or application. When this specification requires that an event be dispatched at the source node in this case, the user agent must instead follow the platform-specific conventions relevant to that situation.
Multiple events are fired on the source node during the course of the drag-and-drop operation.
Determine the list of dragged nodes, as follows:
If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors).
Otherwise, the list of dragged nodes contains only the source node, if any.
If it is a selection that is being dragged, then add an item to the drag data store item list, with its properties set as follows:
text/plain
"Otherwise, if any files are being dragged, then add one item per file to the drag data store item list, with their properties set as follows:
application/octet-stream
" otherwise.Dragging files can currently only happen from outside a navigable, for example from a file system manager application.
If the drag initiated outside of the application, the user agent must add items to the drag data store item list as appropriate for the data being dragged, honoring platform conventions where appropriate; however, if the platform conventions do not use MIME types to label dragged data, the user agent must make a best-effort attempt to map the types to MIME types, and, in any case, all the drag data item type strings must be converted to ASCII lowercase.
User agents may also add one or more items representing the selection or dragged element(s) in other forms, e.g. as HTML.
If the list of dragged nodes is not empty, then extract the microdata from those nodes into a JSON form, and add one item to the drag data store item list, with its properties set as follows:
application/microdata+json
Run the following substeps:
Let urls be « ».
For each node in the list of dragged nodes:
a
element with an href
attributehref
content attribute's value,
relative to the element's node document.img
element with a src
attributesrc
content attribute's value, relative to
the element's node document.If urls is still empty, then return.
Let url string be the result of concatenating the strings in urls, in the order they were added, separated by a U+000D CARRIAGE RETURN U+000A LINE FEED character pair (CRLF).
Add one item to the drag data store item list, with its properties set as follows:
text/uri-list
Update the drag data store default feedback as appropriate for the user agent (if the user is dragging the selection, then the selection would likely be the basis for this feedback; if the user is dragging an element, then that element's rendering would be used; if the drag began outside the user agent, then the platform conventions for determining the drag feedback should be used).
Fire a DND event named dragstart
at the
source node.
If the event is canceled, then the drag-and-drop operation should not occur; return.
Since events with no event listeners registered are, almost by definition, never canceled, drag-and-drop is always available to the user if the author does not specifically prevent it.
Fire a pointer event at the source node named pointercancel
, and fire any other follow-up events as
required by Pointer Events. POINTEREVENTS
Initiate the drag-and-drop operation in a manner consistent with platform conventions, and as described below.
The drag-and-drop feedback must be generated from the first of the following sources that is available:
From the moment that the user agent is to initiate the drag-and-drop operation, until the end of the drag-and-drop operation, device input events (e.g. mouse and keyboard events) must be suppressed.
During the drag operation, the element directly indicated by the user as the drop target is called the immediate user selection. (Only elements can be selected by the user; other nodes must not be made available as drop targets.) However, the immediate user selection is not necessarily the current target element, which is the element currently selected for the drop part of the drag-and-drop operation.
The immediate user selection changes as the user selects different elements (either by pointing at them with a pointing device, or by selecting them in some other way). The current target element changes when the immediate user selection changes, based on the results of event listeners in the document, as described below.
Both the current target element and the immediate user selection can be null, which means no target element is selected. They can also both be elements in other (DOM-based) documents, or other (non-web) programs altogether. (For example, a user could drag text to a word-processor.) The current target element is initially null.
In addition, there is also a current drag operation, which can take on the values
"none
", "copy
", "link
", and "move
". Initially, it has the value
"none
". It is updated by the user agent
as described in the steps below.
User agents must, as soon as the drag operation is initiated and every 350ms (±200ms) thereafter for as long as the drag operation is ongoing, queue a task to perform the following steps in sequence:
If the user agent is still performing the previous iteration of the sequence (if any) when the next iteration becomes due, return for this iteration (effectively "skipping missed frames" of the drag-and-drop operation).
Fire a DND event named drag
at the
source node. If this event is canceled, the user agent must set the current
drag operation to "none
" (no
drag operation).
If the drag
event was not canceled and the user has not
ended the drag-and-drop operation, check the state of the drag-and-drop operation, as
follows:
If the user is indicating a different immediate user selection than during the last iteration (or if this is the first iteration), and if this immediate user selection is not the same as the current target element, then update the current target element as follows:
Set the current target element to null also.
Set the current target element to the immediate user selection.
Fire a DND event named dragenter
at the immediate user selection.
If the event is canceled, then set the current target element to the immediate user selection.
Otherwise, run the appropriate step from the following list:
textarea
, or an input
element whose type
attribute is in the Text state) or an editing host or
editable element, and the drag data store item list has an item
with the drag data item type string "text/plain
" and the
drag data item kind textSet the current target element to the immediate user selection anyway.
Leave the current target element unchanged.
Fire a DND event named dragenter
at the body element, if there is one, or at the Document
object,
if not. Then, set the current target element to the body
element, regardless of whether that event was canceled or not.
If the previous step caused the current target element to change, and if the
previous target element was not null or a part of a non-DOM document, then fire a DND
event named dragleave
at the previous target
element, with the new current target element as the specific related
target.
If the current target element is a DOM element, then fire a DND
event named dragover
at this current
target element.
If the dragover
event is not canceled, run the
appropriate step from the following list:
textarea
, or an input
element whose type
attribute is in the Text state) or an editing host or
editable element, and the drag data store item list has an item
with the drag data item type string "text/plain
" and the drag
data item kind textSet the current drag operation to either "copy
" or "move
", as appropriate given the platform
conventions.
Reset the current drag operation to "none
".
Otherwise (if the dragover
event is
canceled), set the current drag operation based on the values of the effectAllowed
and dropEffect
attributes of the
DragEvent
object's dataTransfer
object as they stood after the event dispatch
finished, as per the following table:
effectAllowed |
dropEffect |
Drag operation |
---|---|---|
"uninitialized ", "copy ", "copyLink ", "copyMove ", or "all " |
"copy " |
"copy " |
"uninitialized ", "link ", "copyLink ", "linkMove ", or "all " |
"link " |
"link " |
"uninitialized ", "move ", "copyMove ", "linkMove ", or "all " |
"move " |
"move " |
Any other case | "none " |
Otherwise, if the current target element is not a DOM element, use platform-specific mechanisms to determine what drag operation is being performed (none, copy, link, or move), and set the current drag operation accordingly.
Update the drag feedback (e.g. the mouse cursor) to match the current drag operation, as follows:
Drag operation | Feedback |
---|---|
"copy " |
Data will be copied if dropped here. |
"link " |
Data will be linked if dropped here. |
"move " |
Data will be moved if dropped here. |
"none " |
No operation allowed, dropping here will cancel the drag-and-drop operation. |
Otherwise, if the user ended the drag-and-drop operation (e.g. by releasing the mouse button
in a mouse-driven drag-and-drop interface), or if the drag
event was canceled, then this will be the last iteration. Run the following steps, then stop the
drag-and-drop operation:
If the current drag operation is "none
" (no drag operation), or, if the user
ended the drag-and-drop operation by canceling it (e.g. by hitting the Escape key),
or if the current target element is null, then the drag operation failed. Run
these substeps:
Let dropped be false.
If the current target element is a DOM element, fire a DND
event named dragleave
at it; otherwise, if
it is not null, use platform-specific conventions for drag cancelation.
Set the current drag operation to "none
".
Otherwise, the drag operation might be a success; run these substeps:
Let dropped be true.
If the current target element is a DOM element, fire a DND
event named drop
at it; otherwise, use
platform-specific conventions for indicating a drop.
If the event is canceled, set the current drag operation to the value of the
dropEffect
attribute of the
DragEvent
object's dataTransfer
object as it stood after the event dispatch
finished.
Otherwise, the event is not canceled; perform the event's default action, which depends on the exact target as follows:
textarea
, or an input
element whose type
attribute is in the Text state) or an editing host or
editable element, and the drag data store item list has an item
with the drag data item type string "text/plain
" and the
drag data item kind textInsert the actual data of the first item in the drag data store item
list to have a drag data item type
string of "text/plain
" and a drag
data item kind that is text into the text control or
editing host or editable element in a manner consistent with
platform-specific conventions (e.g. inserting it at the current mouse cursor position, or
inserting it at the end of the field).
Reset the current drag operation to "none
".
Fire a DND event named dragend
at the
source node.
Run the appropriate steps from the following list as the default action of the dragend
event:
move
", and the source of the
drag-and-drop operation is a selection in the DOM that is entirely contained within an
editing hostDelete the selection.
move
", and the source of the
drag-and-drop operation is a selection in a text controlThe user agent should delete the dragged selection from the relevant text control.
none
"The drag was canceled. If the platform conventions dictate that this be represented to the user (e.g. by animating the dragged selection going back to the source of the drag-and-drop operation), then do so.
The event has no default action.
For the purposes of this step, a text control is a textarea
element or
an input
element whose type
attribute is in
one of the
Text,
Search,
Tel,
URL,
Email,
Password, or
Number
states.
User agents are encouraged to consider how to react to drags near the edge of scrollable regions. For example, if a user drags a link to the bottom of the viewport on a long page, it might make sense to scroll the page so that the user can drop the link lower on the page.
This model is independent of which Document
object the nodes involved
are from; the events are fired as described above and the rest of the processing model runs as
described above, irrespective of how many documents are involved in the operation.
The following events are involved in the drag-and-drop model.
Event name | Target | Cancelable? | Drag data store mode | dropEffect |
Default Action |
---|---|---|---|---|---|
dragstart |
Source node | ✓ Cancelable | Read/write mode | "none " |
Initiate the drag-and-drop operation |
drag |
Source node | ✓ Cancelable | Protected mode | "none " |
Continue the drag-and-drop operation |
dragenter |
Immediate user selection or the body element | ✓ Cancelable | Protected mode | Based on effectAllowed value |
Reject immediate user selection as potential target element |
dragleave |
Previous target element | — | Protected mode | "none " |
None |
dragover |
Current target element | ✓ Cancelable | Protected mode | Based on effectAllowed value |
Reset the current drag operation to "none" |
drop |
Current target element | ✓ Cancelable | Read-only mode | Current drag operation | Varies |
dragend |
Source node | — | Protected mode | Current drag operation | Varies |
All of these events bubble, are composed, and the effectAllowed
attribute always has the value it had
after the dragstart
event, defaulting to "uninitialized
" in the dragstart
event.
draggable
attributeAll HTML elements may have the draggable
content attribute set. The draggable
attribute is an enumerated attribute with
the following keywords and states:
Keyword | State | Brief description |
---|---|---|
true
| true | The element will be draggable. |
false
| false | The element will not be draggable. |
The attribute's missing value default and invalid value default are both the auto state. The auto state uses the default behavior of the user agent.
An element with a draggable
attribute should also have a
title
attribute that names the element for the purpose of
non-visual interactions.
element.draggable [ = value ]
Returns true if the element is draggable; otherwise, returns false.
Can be set, to override the default and set the draggable
content attribute.
The draggable
IDL
attribute, whose value depends on the content attribute's in the way described below, controls
whether or not the element is draggable. Generally, only text selections are draggable, but
elements whose draggable
IDL attribute is true become
draggable as well.
If an element's draggable
content attribute has the state
true, the draggable
IDL attribute must return true.
Otherwise, if the element's draggable
content attribute
has the state false, the draggable
IDL attribute must return false.
Otherwise, the element's draggable
content attribute has
the state auto. If the element is an
img
element, an object
element that represents an image, or
an a
element with an href
content
attribute, the draggable
IDL attribute must return true;
otherwise, the draggable
IDL attribute must return false.
If the draggable
IDL attribute is set to the value false,
the draggable
content attribute must be set to the literal
value "false
". If the draggable
IDL
attribute is set to the value true, the draggable
content
attribute must be set to the literal value "true
".
User agents must not make the data added to the DataTransfer
object during the
dragstart
event available to scripts until the drop
event, because otherwise, if a user were to drag sensitive
information from one document to a second document, crossing a hostile third document in the
process, the hostile document could intercept the data.
For the same reason, user agents must consider a drop to be successful only if the user
specifically ended the drag operation — if any scripts end the drag operation, it must be
considered unsuccessful (canceled) and the drop
event must not be
fired.
User agents should take care to not start drag-and-drop operations in response to script actions. For example, in a mouse-and-window environment, if a script moves a window while the user has their mouse button depressed, the UA would not consider that to start a drag. This is important because otherwise UAs could cause data to be dragged from sensitive sources and dropped into hostile documents without the user's consent.
User agents should filter potentially active (scripted) content (e.g. HTML) when it is dragged and when it is dropped, using a safelist of known-safe features. Similarly, relative URLs should be turned into absolute URLs to avoid references changing in unexpected ways. This specification does not specify how this is performed.
Consider a hostile page providing some content and getting the user to select and drag and
drop (or indeed, copy and paste) that content to a victim page's contenteditable
region. If the browser does not ensure that
only safe content is dragged, potentially unsafe content such as scripts and event handlers in
the selection, once dropped (or pasted) into the victim site, get the privileges of the victim
site. This would thus enable a cross-site scripting attack.
popover
attributeAll HTML elements may have the popover
content attribute set. When specified, the element
won't be rendered until it becomes shown, at which point it will be rendered on top of other page
content.
The popover
attribute is a global attribute that allows
authors flexibility to ensure popover functionality can be applied to elements with the most
relevant semantics.
The following demonstrates how one might create a popover sub-navigation list of links, within the global navigation for a website.
<ul>
<li>
<a href=...>All Products</a>
<button popovertarget=sub-nav>
<img src=down-arrow.png alt="Product pages">
</button>
<ul popover id=sub-nav>
<li><a href=...>Shirts</a>
<li><a href=...>Shoes</a>
<li><a href=...>Hats etc.</a>
</ul>
</li>
<!-- other list items and links here -->
</ul>
When using popover
on elements without accessibility
semantics, for instance the div
element, authors should use the appropriate ARIA
attributes to ensure the popover is accessible.
The following shows the baseline markup to create a custom menu popover, where the first
menuitem will receive keyboard focus when the popover is invoked due to the use of the
autofocus
attribute. Navigating the menuitems with arrow keys and
activation behaviors would still need author scripting. Additional requirements for building
custom menus widgets are defined in the WAI-ARIA
specification.
<button popovertarget=m>Actions</button>
<div role=menu id=m popover>
<button role=menuitem tabindex=-1 autofocus>Edit</button>
<button role=menuitem tabindex=-1>Hide</button>
<button role=menuitem tabindex=-1>Delete</button>
</div>
A popover can be useful for rendering a status message, confirming the action performed by
the user. The following demonstrates how one could reveal a popover in an output
element.
<button id=submit>Submit</button>
<p><output><span popover=manual></span></output></p>
<script>
const sBtn = document.getElementById("submit");
const outSpan = document.querySelector("output [popover=manual]");
let successMessage;
let errorMessage;
/* define logic for determining success of action
and determining the appropriate success or error
messages to use */
sBtn.addEventListener("click", ()=> {
if ( success ) {
outSpan.textContent = successMessage;
}
else {
outSpan.textContent = errorMessage;
}
outSpan.showPopover();
setTimeout(function () {
outSpan.hidePopover();
}, 10000);
});
</script>
Inserting a popover element into an output
element will generally
cause screen readers to announce the content when it becomes visible. Depending on the complexity
or frequency of the content, this could be either useful or annoying to users of these
assistive technologies. Keep this in mind when using the output
element or other
ARIA live regions to ensure the best user experience.
The popover
attribute is an enumerated
attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
auto
| auto | Closes other popovers when opened; has light dismiss and responds to close requests. |
(the empty string) | ||
manual
| manual | Does not close other popovers; does not light dismiss or respond to close requests. |
The attribute's missing value default is the no popover state, and its invalid value default is the manual state.
The popover
IDL
attribute must reflect the popover attribute,
limited to only known values.
Every HTML element has a popover visibility state, initially hidden, with these potential values:
hidden
showing
The Document
has a popover pointerdown target, which is an HTML element or null, initially null.
Every HTML element has a popover invoker, which is an HTML element or null, initially set to null.
Every HTML element has a popover showing or hiding, which is a boolean, initially set to false.
Every HTML element popover toggle task tracker, which is a toggle task tracker or null, initially null.
Every HTML element has a popover close watcher, which is a close watcher or null, initially null.
The following attribute change steps, given element, localName, oldValue, value, and namespace, are used for all HTML elements:
If namespace is not null, then return.
If localName is not popover
, then
return.
If element's popover visibility state is in the showing state and oldValue and value are in different states, then run the hide popover algorithm given element, true, true, and false.
element.showPopover()
popover
attribute is in the auto state, then this will also close all other auto popovers unless they are an ancestor of
element according to the topmost popover ancestor algorithm.element.hidePopover()
display: none
to it.element.togglePopover()
The showPopover(options)
method steps are:
Let invoker be options["source
"] if it exists; otherwise, null.
Run show popover given this, true, and invoker.
To show popover, given an HTML element element, a boolean throwExceptions, and an HTML element or null invoker:
If the result of running check popover validity given element, false, throwExceptions, and null is false, then return.
Let document be element's node document.
Assert: element's popover invoker is null.
Assert: element is not in document's top layer.
Let nestedShow be element's popover showing or hiding.
Set element's popover showing or hiding to true.
Let cleanupShowingFlag be the following steps:
If nestedShow is false, then set element's popover showing or hiding to false.
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 element is false, then
run cleanupShowingFlag and return.
If the result of running check popover validity given element, false, throwExceptions, and document is false, then run cleanupShowingFlag and return.
Check popover validity is called again because firing the beforetoggle
event could have disconnected this element or
changed its popover
attribute.
Let shouldRestoreFocus be false.
If element's popover
attribute is in the auto state, then:
Let originalType be the value of element's popover
attribute.
Let ancestor be the result of running the topmost popover ancestor algorithm given element, invoker, and true.
If ancestor is null, then set ancestor to document.
Run hide all popovers until given ancestor, false, and not nestedShow.
If originalType is not equal to the value of element's popover
attribute, then:
If throwExceptions is true, then throw a
"InvalidStateError
" DOMException
.
Return.
If the result of running check popover validity given element, false, throwExceptions, and document is false, then run cleanupShowingFlag and return.
Check popover validity is called again because running hide all popovers until above could have fired the
beforetoggle
event, and an event handler could have
disconnected this element or changed its popover
attribute.
If the result of running topmost auto popover on document is null, then set shouldRestoreFocus to true.
This ensures that focus is returned to the previously-focused element only for the first popover in a stack.
Set element's popover close watcher to the result of establishing a close watcher given element's relevant global object, with:
cancelAction being to return true.
closeAction being to hide a popover given element, true, true, and false.
Set element's previously focused element to null.
Let originallyFocusedElement be document's focused area of the document's DOM anchor.
Add an element to the top layer given element.
Set element's popover visibility state to showing.
Set element's popover invoker to invoker.
Set element's implicit anchor element to invoker.
Run the popover focusing steps given element.
If shouldRestoreFocus is true and element's popover
attribute is not in the no popover state, then set element's
previously focused element to originallyFocusedElement.
Queue a popover toggle event task given element, "closed
", and "open
".
Run cleanupShowingFlag.
To queue a popover toggle event task given an element element, a string oldState, and a string newState:
If element's popover toggle task tracker is not null, then:
Set oldState to element's popover toggle task tracker's old state.
Remove element's popover toggle task tracker's task from its task queue.
Set element's popover 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 popover toggle task tracker to null.
Set element's popover toggle task tracker to a struct with task set to the just-queued task and old state set to oldState.
The hidePopover()
method steps are:
Run the hide popover algorithm given this, true, true, and true.
To hide a popover given an HTML element element, a boolean focusPreviousElement, a boolean fireEvents, and a boolean throwExceptions:
If the result of running check popover validity given element, true, throwExceptions, and null is false, then return.
Let document be element's node document.
Let nestedHide be element's popover showing or hiding.
Set element's popover showing or hiding to true.
If nestedHide is true, then set fireEvents to false.
Let cleanupSteps be the following steps:
If nestedHide is false, then set element's popover showing or hiding to false.
If element's popover close watcher is not null, then:
Destroy element's popover close watcher.
Set element's popover close watcher to null.
If element's popover
attribute is in the auto state, then:
Run hide all popovers until given element, focusPreviousElement, and fireEvents.
If the result of running check popover validity given element, true, and throwExceptions is false, then run cleanupSteps and return.
Check popover validity is called again because running hide all popovers until could have disconnected
element or changed its popover
attribute.
Let autoPopoverListContainsElement be true if document's showing auto popover list's last item is element, otherwise false.
Set element's popover invoker to null.
If fireEvents is true:
Fire an event named beforetoggle
, using ToggleEvent
, with the oldState
attribute initialized to "open
" and the newState
attribute initialized to "closed
" at element.
If autoPopoverListContainsElement is true and document's showing auto popover list's last item is not element, then run hide all popovers until given element, focusPreviousElement, and false.
If the result of running check popover validity given element, true, throwExceptions, and null is false, then run cleanupSteps and return.
Check popover validity is called again because firing the beforetoggle
event could have disconnected
element or changed its popover
attribute.
Request an element to be removed from the top layer given element.
Set element's implicit anchor element to null.
Otherwise, remove an element from the top layer immediately given element.
Set element's popover visibility state to hidden.
If fireEvents is true, then queue a popover toggle event task
given element, "open
", and "closed
".
Let previouslyFocusedElement be element's previously focused element.
If previouslyFocusedElement is not null, then:
Set element's previously focused element to null.
If focusPreviousElement is true and document's focused area of the document's DOM anchor is a shadow-including inclusive descendant of element, then run the focusing steps for previouslyFocusedElement; the viewport should not be scrolled by doing this step.
Run cleanupSteps.
The togglePopover(options)
method steps are:
Let force be null.
If options is a boolean, set force to options.
Otherwise, if options["force
"] exists,
set force to options["force
"].
Let invoker be options["source
"] if it exists; otherwise, null.
If this's popover visibility state is showing, and force is null or false, then run the hide popover algorithm given this, true, true, and true.
Otherwise, if force is null or true, then run show popover given this, true, and invoker.
Otherwise:
Let expectedToBeShowing be true if this's popover visibility state is showing; otherwise false.
Run check popover validity given expectedToBeShowing, true, and null.
Return true if this's popover visibility state is showing; otherwise false.
To hide all popovers until, given an HTML element or Document
endpoint, a boolean
focusPreviousElement, and a boolean fireEvents:
If endpoint is an HTML element and endpoint is not in the popover showing state, then return.
Let document be endpoint's node document.
Let closeAllOpenPopovers be an algorithm which performs the following steps:
Let popover be document's topmost auto popover.
While popover is not null:
Run the hide popover algorithm given popover, focusPreviousElement, fireEvents, and false.
Set popover to document's topmost auto popover.
If endpoint is a Document
, then run
closeAllOpenPopovers and return.
Assert: endpoint's popover
attribute is in the auto state.
Let repeatingHide be false.
Perform the following steps at least once:
Let lastToHide be null.
Let foundEndpoint be false.
For each popover of document's showing auto popover list:
If popover is endpoint, then set foundEndpoint to true.
Otherwise, if foundEndpoint is true, then set lastToHide to popover and break.
If foundEndpoint is false, then run closeAllOpenPopovers and return.
While lastToHide is not null and lastToHide's popover visibility state is showing and document's showing auto popover list is not empty:
Run the hide popover algorithm given document's showing auto popover list's last element, focusPreviousElement, fireEvents, and false.
Set repeatingHide to true if document's showing auto popover list contains endpoint and document's showing auto popover list's last element is not endpoint, otherwise false.
If repeatingHide is true, then set fireEvents to false.
and keep performing them while repeatingHide is true.
The hide all popovers until algorithm is used in several cases to hide all popovers that don't stay open when something happens. For example, during light-dismiss of a popover, this algorithm ensures that we close only the popovers that aren't related to the node clicked by the user.
To find the topmost popover ancestor, given a Node
newPopoverOrTopLayerElement, an HTML element or
null invoker, and a boolean isPopover, perform the following steps. They
return an HTML element or null.
The topmost popover ancestor algorithm will return the topmost (latest in the showing auto popover list) ancestor popover for the provided popover or top layer element. Popovers can be related to each other in several ways, creating a tree of popovers. There are two paths through which one popover (call it the "child" popover) can have a topmost ancestor popover (call it the "parent" popover):
The popovers are nested within each other in the node tree. In this case, the descendant popover is the "child" and its topmost ancestor popover is the "parent".
An invoking element (e.g., a button
) has a popovertarget
attribute pointing to a popover. In this case,
the popover is the "child", and the popover subtree the invoking element is in is the
"parent". The invoker has to be in a popover and reference an open popover.
In each of the relationships formed above, the parent popover has to be strictly earlier in the showing auto popover list than the child popover, or it does not form a valid ancestral relationship. This eliminates non-showing popovers and self-pointers (e.g., a popover containing an invoking element that points back to the containing popover), and it allows for the construction of a well-formed tree from the (possibly cyclic) graph of connections. Only auto popovers are considered.
If the provided element is a top layer element such as a dialog
which is not
showing as a popover, then topmost popover ancestor will only look in the node tree
to find the first popover.
If isPopover is true:
Assert: newPopoverOrTopLayerElement is an HTML element.
Assert: newPopoverOrTopLayerElement's popover
attribute is not in the no popover state or the manual state.
Assert: newPopoverOrTopLayerElement's popover visibility state is not in the popover showing state.
Otherwise:
Assert: invoker is null.
Let popoverPositions be an empty ordered map.
Let index be 0.
Let document be newPopoverOrTopLayerElement's node document.
For each popover of document's showing auto popover list:
Set popoverPositions[popover] to index.
Increment index by 1.
If isPopover is true, then set popoverPositions[newPopoverOrTopLayerElement] to index.
Increment index by 1.
Let topmostPopoverAncestor be null.
Let checkAncestor be an algorithm which performs the following steps given candidate:
If candidate is null, then return.
Let candidateAncestor be the result of running nearest inclusive open popover given candidate.
If candidateAncestor is null, then return.
Let candidatePosition be popoverPositions[candidateAncestor].
If topmostPopoverAncestor is null or popoverPositions[topmostPopoverAncestor] is less than candidatePosition, then set topmostPopoverAncestor to candidateAncestor.
Run checkAncestor given newPopoverOrTopLayerElement's parent node within the flat tree.
Run checkAncestor given invoker.
Return topmostPopoverAncestor.
To find the nearest inclusive open popover given a Node
node, perform the following steps. They return an HTML
element or null.
Let currentNode be node.
While currentNode is not null:
If currentNode's popover
attribute is in
the auto state and currentNode's
popover visibility state is showing,
then return currentNode.
Set currentNode to currentNode's parent in the flat tree.
Return null.
To find the topmost auto popover given a
Document
document, perform the following steps. They return an HTML element or null.
If document's showing auto popover list is not empty, then return document's showing auto popover list's last element.
Return null.
To perform the popover focusing steps for an HTML element subject:
If subject is a dialog
element, then run the dialog focusing
steps given subject and return.
If subject has the autofocus
attribute, then let control be subject.
Otherwise, let control be the autofocus delegate for
subject given "other
".
If control is null, then return.
Run the focusing steps given control.
Let topDocument be the active document of control's node document's browsing context's top-level browsing context.
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.
To check popover validity for an HTML element
element given a boolean expectedToBeShowing, a boolean
throwExceptions, and a Document
or null expectedDocument
perform the following steps. They throw an exception or return a boolean.
If element's popover
attribute is in the
no popover state, then:
If throwExceptions is true, then throw a
"NotSupportedError
" DOMException
.
Return false.
If any of the following are true:
expectedToBeShowing is true and element's popover visibility state is not showing; or
expectedToBeShowing is false and element's popover visibility state is not hidden,
then return false.
If any of the following are true:
element is not connected;
element's node document is not fully active;
expectedDocument is not null and element's node document is not expectedDocument;
element is a dialog
element and its is modal flag
is set to true; or
element's fullscreen flag is set,
then:
If throwExceptions is true, then throw a
"InvalidStateError
" DOMException
.
Return false.
Return true.
To get the showing auto popover list for a
Document
document:
Let popovers be « ».
For each Element
element in
document's top layer: if element's popover
attribute is in the auto state and element's popover
visibility state is showing, then append element to popovers.
Return popovers.
Buttons may have the following content attributes:
popovertarget
popovertargetaction
If specified, the popovertarget
attribute value must
be the ID of an element with a popover
attribute in the same tree as the button with the popovertarget
attribute.
The popovertargetaction
attribute is an
enumerated attribute with the following keywords and states:
Keyword | State | Brief description |
---|---|---|
toggle
| toggle | Shows or hides the targeted popover element. |
show
| show | Shows the targeted popover element. |
hide
| hide | Hides the targeted popover element. |
The attribute's missing value default and invalid value default are both the toggle state.
Whenever possible ensure the popover element is placed immediately after its triggering element in the DOM. Doing so will help ensure that the popover is exposed in a logical programmatic reading order for users of assistive technology, such as screen readers.
The following shows how the popovertarget
attribute
in combination with the popovertargetaction
attribute can be used to show and close a popover:
<button popovertarget="foo" popovertargetaction="show">
Show a popover
</button>
<article popover="auto" id="foo">
This is a popover article!
<button popovertarget="foo" popovertargetaction="hide">Close</button>
</article>
If a popovertargetaction
attribute is not
specified, the default action will be to toggle the associated popover. The following shows
how only specifying the popovertarget
attribute on its
invoking button can toggle a manual popover between its opened and closed states. A manual
popover will not respond to light dismiss or close requests:
<input type="button" popovertarget="foo" value="Toggle the popover">
<div popover=manual id="foo">
This is a popover!
</div>
interface mixin PopoverInvokerElement {
[CEReactions] attribute Element? popoverTargetElement;
[CEReactions] attribute DOMString popoverTargetAction;
};
The popoverTargetElement
IDL attribute must
reflect the popovertarget
attribute.
The popoverTargetAction
IDL attribute must
reflect the popovertargetaction
attribute, limited to only known values.
To run the popover target attribute activation behavior given a Node
node and a Node
eventTarget:
Let popover be node's popover target element.
If popover is null, then return.
If eventTarget is a shadow-including inclusive descendant of popover and popover is a shadow-including descendant of node, then return.
If node's popovertargetaction
attribute is in the show state and
popover's popover visibility state is showing, then return.
If node's popovertargetaction
attribute is in the hide state and
popover's popover visibility state is hidden, then return.
If popover's popover visibility state is showing, then run the hide popover algorithm given popover, true, true, and false.
Otherwise, if popover's popover visibility state is hidden and the result of running check popover validity given popover, false, false, and null is true, then run show popover given popover, false, and node.
To get the popover target element given a Node
node, perform
the following steps. They return an HTML element or null.
If node is not a button, then return null.
If node is disabled, then return null.
If node has a form owner and node is a submit button, then return null.
Let popoverElement be the result of running node's get the popovertarget
-associated
element.
If popoverElement is null, then return null.
If popoverElement's popover
attribute is in
the no popover state, then return null.
Return popoverElement.
"Light dismiss" means that clicking outside of a popover whose popover
attribute is in the auto state will close the popover. This is in addition to
how such popovers respond to close requests.
To light dismiss open popovers, given an Event
event:
Assert: event's isTrusted
attribute is true.
Let target be event's target.
Let document be target's node document.
Let topmostPopover be the result of running topmost auto popover given document.
If topmostPopover is null, then return.
If event is a PointerEvent
and event's type
is "pointerdown
",
then: set document's popover pointerdown target to the result of running
topmost clicked popover given target.
If event is a PointerEvent
and event's type
is "pointerup
",
then:
Let ancestor be the result of running topmost clicked popover given target.
Let sameTarget be true if ancestor is document's popover pointerdown target.
Set document's popover pointerdown target to null.
If ancestor is null, then set ancestor to document.
If sameTarget is true, then run hide all popovers until given ancestor, false, and true.
Light dismiss open popovers will be called by the Pointer Events spec when the user clicks or touches anywhere on the page.
To find the topmost clicked popover, given a Node
node:
Let clickedPopover be the result of running nearest inclusive open popover given node.
Let invokerPopover be the result of running nearest inclusive target popover for invoker given node.
Let getStackPosition be an algorithm which performs the following steps given an HTML element popover:
Let popoverList be popover's node document's showing auto popover list.
If popover is in popoverList, then return the index of popover in popoverList + 1.
Return 0.
If the result of running getStackPosition given clickedPopover is greater than the result of running getStackPosition given invokerPopover, then return clickedPopover.
Return invokerPopover.
To find the nearest inclusive target popover for invoker given a Node
node:
Let currentNode be node.
While currentNode is not null:
Let targetPopover be currentNode's popover target element.
If targetPopover is not null and targetPopover's popover
attribute is in the auto state and targetPopover's popover
visibility state is showing, then return
targetPopover.
Set currentNode to currentNode's ancestor in the flat tree.
This section describes features that apply most directly to web browsers. Having said that, except where specified otherwise, the requirements defined in this section do apply to all user agents, whether they are web browsers or not.
Origins are the fundamental currency of the web's security model. Two actors in the web platform that share an origin are assumed to trust each other and to have the same authority. Actors with differing origins are considered potentially hostile versus each other, and are isolated from each other to varying degrees.
For example, if Example Bank's web site, hosted at bank.example.com
, tries to examine the DOM of Example Charity's web site, hosted
at charity.example.org
, a "SecurityError
"
DOMException
will be raised.
An origin is one of the following:
An internal value, with no serialization it can be recreated from (it is serialized as
"null
" per serialization of an origin), for which the only
meaningful operation is testing for equality.
A tuple consists of:
Origins can be shared, e.g., among multiple
Document
objects. Furthermore, origins are generally
immutable. Only the domain of a tuple origin can be changed, and only through the document.domain
API.
The effective domain of an origin origin is computed as follows:
If origin is an opaque origin, then return null.
If origin's domain is non-null, then return origin's domain.
Return origin's host.
The serialization of an origin is the string obtained by applying the following algorithm to the given origin origin:
If origin is an opaque origin,
then return "null
".
Otherwise, let result be origin's scheme.
Append "://
" to result.
Append origin's host, serialized, to result.
If origin's port is non-null, append a U+003A COLON character (:), and origin's port, serialized, to result.
Return result.
The serialization of ("https
", "xn--maraa-rta.example
", null, null) is "https://xn--maraa-rta.example
".
There used to also be a Unicode serialization of an origin. However, it was never widely adopted.
Two origins, A and B, are said to be same origin if the following algorithm returns true:
If A and B are the same opaque origin, then return true.
If A and B are both tuple origins and their schemes, hosts, and port are identical, then return true.
Return false.
Two origins, A and B, are said to be same origin-domain if the following algorithm returns true:
If A and B are the same opaque origin, then return true.
If A and B are both tuple origins:
If A and B's schemes are identical, and their domains are identical and non-null, then return true.
Otherwise, if A and B are same origin and their domains are both null, return true.
Return false.
The following table shows examples of when two tuple origins are same origin and same origin-domain.
A | B | same origin | same origin-domain |
---|---|---|---|
("https ", "example.org ", null, null)
| ("https ", "example.org ", null, null)
| ✅ | ✅ |
("https ", "example.org ", 314, null)
| ("https ", "example.org ", 420, null)
| ❌ | ❌ |
("https ", "example.org ", 314, "example.org ")
| ("https ", "example.org ", 420, "example.org ")
| ❌ | ✅ |
("https ", "example.org ", null, null)
| ("https ", "example.org ", null, "example.org ")
| ✅ | ❌ |
("https ", "example.org ", null, "example.org ")
| ("http ", "example.org ", null, "example.org ")
| ❌ | ❌ |
A scheme-and-host is a tuple of a scheme (an ASCII string) and a host (a host).
A site is an opaque origin or a scheme-and-host.
To obtain a site, given an origin origin, run these steps:
If origin is an opaque origin, then return origin.
If origin's host's registrable domain is null, then return (origin's scheme, origin's host).
Return (origin's scheme, origin's host's registrable domain).
Two sites, A and B, are said to be same site if the following algorithm returns true:
If A and B are the same opaque origin, then return true.
If A or B is an opaque origin, then return false.
If A's and B's scheme values are different, then return false.
If A's and B's host values are not equal, then return false.
Return true.
The serialization of a site is the string obtained by applying the following algorithm to the given site site:
If site is an opaque origin, then
return "null
".
Let result be site[0].
Append "://
" to result.
Append site[1], serialized, to result.
Return result.
It needs to be clear from context that the serialized value is a site, not an
origin, as there is not necessarily a syntactic difference between the two. For example, the
origin ("https
", "shop.example
", null, null) and
the site ("https
", "shop.example
") have the same
serialization: "https://shop.example
".
Two origins, A and B, are said to be schemelessly same site if the following algorithm returns true:
If A and B are the same opaque origin, then return true.
If A and B are both tuple origins, then:
Let hostA be A's host, and let hostB be B's host.
If hostA equals hostB and hostA's registrable domain is null, then return true.
If hostA's registrable domain equals hostB's registrable domain and is non-null, then return true.
Return false.
Two origins, A and B, are said to be same site if the following algorithm returns true:
Let siteA be the result of obtaining a site given A.
Let siteB be the result of obtaining a site given B.
If siteA is same site with siteB, then return true.
Return false.
Unlike the same origin and same origin-domain concepts, for schemelessly same site and same site, the port and domain components are ignored.
For the reasons explained in URL, the same site and schemelessly same site concepts should be avoided when possible, in favor of same origin checks.
The following table shows examples of when two tuple origins are schemelessly same site and same site.
Given that wildlife.museum
, museum
, and com
are public suffixes and that example.com
is not:
A | B | schemelessly same site | same site |
---|---|---|---|
("https ", "example.com ")
| ("https ", "sub.example.com ")
| ✅ | ✅ |
("https ", "example.com ")
| ("https ", "sub.other.example.com ")
| ✅ | ✅ |
("https ", "example.com ")
| ("http ", "non-secure.example.com ")
| ✅ | ❌ |
("https ", "r.wildlife.museum ")
| ("https ", "sub.r.wildlife.museum ")
| ✅ | ✅ |
("https ", "r.wildlife.museum ")
| ("https ", "sub.other.r.wildlife.museum ")
| ✅ | ✅ |
("https ", "r.wildlife.museum ")
| ("https ", "other.wildlife.museum ")
| ❌ | ❌ |
("https ", "r.wildlife.museum ")
| ("https ", "wildlife.museum ")
| ❌ | ❌ |
("https ", "wildlife.museum ")
| ("https ", "wildlife.museum ")
| ✅ | ✅ |
("https ", "example.com ")
| ("https ", "example.com. ")
| ❌ | ❌ |
(Here we have omitted the port and domain components since they are not considered.)
document.domain [ = domain ]
Returns the current domain used for security checks.
Can be set to a value that removes subdomains, to change the origin's domain to allow pages on other subdomains of the same domain (if they do the same thing) to access each other. This enables pages on different hosts of a domain to synchronously access each other's DOMs.
In sandboxed iframe
s, Document
s with opaque origins, and Document
s without a browsing context, the setter will
throw a "SecurityError
" exception. In cases where crossOriginIsolated
or originAgentCluster
return true, the setter will do
nothing.
Avoid using the document.domain
setter. It
undermines the security protections provided by the same-origin policy. This is especially acute
when using shared hosting; for example, if an untrusted third party is able to host an HTTP
server at the same IP address but on a different port, then the same-origin protection that
normally protects two different sites on the same host will fail, as the ports are ignored when
comparing origins after the document.domain
setter has
been used.
Because of these security pitfalls, this feature is in the process of being removed from the web platform. (This is a long process that takes many years.)
Instead, use postMessage()
or
MessageChannel
objects to communicate across origins in a safe manner.
The domain
getter steps are:
Let effectiveDomain be this's origin's effective domain.
If effectiveDomain is null, then return the empty string.
Return effectiveDomain, serialized.
The domain
setter steps are:
If this's browsing context is
null, then throw a "SecurityError
" DOMException
.
If this's active sandboxing flag set has its sandboxed
document.domain
browsing context flag set, then
throw a "SecurityError
" DOMException
.
Let effectiveDomain be this's origin's effective domain.
If effectiveDomain is null, then throw a
"SecurityError
" DOMException
.
If the given value is not
a registrable domain suffix of and is not equal to effectiveDomain, then throw
a "SecurityError
" DOMException
.
If the surrounding agent's agent cluster's is origin-keyed is true, then return.
Set this's origin's domain to the result of parsing the given value.
To determine if a scalar value string hostSuffixString is a registrable domain suffix of or is equal to a host originalHost:
If hostSuffixString is the empty string, then return false.
Let hostSuffix be the result of parsing hostSuffixString.
If hostSuffix is failure, then return false.
If hostSuffix does not equal originalHost, then:
If hostSuffix or originalHost is not a domain, then return false.
This excludes hosts that are IP addresses.
If hostSuffix, prefixed by U+002E (.), does not match the end of originalHost, then return false.
If any of the following are true:
hostSuffix equals hostSuffix's public suffix; or
hostSuffix, prefixed by U+002E (.), matches the end of originalHost's public suffix,
then return false. URL
Assert: originalHost's public suffix, prefixed by U+002E (.), matches the end of hostSuffix.
Return true.
hostSuffixString | originalHost | Outcome of is a registrable domain suffix of or is equal to | Notes |
---|---|---|---|
"0.0.0.0 " |
0.0.0.0 |
✅ | |
"0x10203 " |
0.1.2.3 |
✅ | |
"[0::1] " |
::1 |
✅ | |
"example.com " |
example.com |
✅ | |
"example.com " |
example.com. |
❌ | Trailing dot is significant. |
"example.com. " |
example.com |
❌ | |
"example.com " |
www.example.com |
✅ | |
"com " |
example.com |
❌ | At the time of writing, com is a public suffix. |
"example " |
example |
✅ | |
"compute.amazonaws.com " |
example.compute.amazonaws.com |
❌ | At the time of writing, *.compute.amazonaws.com is a public suffix. |
"example.compute.amazonaws.com " |
www.example.compute.amazonaws.com |
❌ | |
"amazonaws.com " |
www.example.compute.amazonaws.com |
❌ | |
"amazonaws.com " |
test.amazonaws.com |
✅ | At the time of writing, amazonaws.com is a registrable domain. |
window.originAgentCluster
Returns true if this Window
belongs to an agent cluster which is
origin-keyed, in the manner described in
this section.
A Document
delivered over a secure context can request that it be
placed in an origin-keyed agent
cluster, by using the `Origin-Agent-Cluster
` HTTP
response header. This header is a structured header
whose value must be a boolean.
STRUCTURED-FIELDS
Per the processing model in the create
and initialize a new Document
object, valuesValues
that are not the structured header boolean
true value (i.e., `?1
`) will be ignored.
The consequences of using this header are that the resulting
Document
's agent cluster key is its origin, instead of the corresponding site. In terms of observable effects, this means that
attempting to relax the same-origin
restriction using document.domain
will instead do
nothing, and it will not be possible to send WebAssembly.Module
objects to
cross-origin Document
s (even if they are same site). Behind the scenes,
this isolation can allow user agents to allocate implementation-specific resources corresponding
to agent clusters, such as processes or threads, more
efficiently.
Note that within a browsing context group, the
`Origin-Agent-Cluster
` header can never cause same-origin Document
objects to end up in different agent clusters, even if one
sends the header and the other doesn't. This is prevented by means of the
historical agent cluster key map.
This means that the originAgentCluster
getter can return false, even if the
header is set, if the header was omitted on a previously-loaded same-origin page in the same
browsing context group. Similarly, it can return true even when the header is not
set.
The originAgentCluster
getter steps are to return the
surrounding agent's agent cluster's is origin-keyed.
Document
s with an opaque
origin can be considered unconditionally origin-keyed; for them the header has no effect,
and the originAgentCluster
getter will always return
true.
Similarly, Document
s whose agent cluster's cross-origin isolation mode is not "none
" are automatically origin-keyed. The
`Origin-Agent-Cluster
` header might be useful as an additional hint to
implementations about resource allocation, since the `Cross-Origin-Opener-Policy
`
and `Cross-Origin-Embedder-Policy
` headers used to achieve cross-origin isolation
are more about ensuring that everything in the same address space opts in to being there. But
adding it would have no additional observable effects on author code.
An opener policy value allows a document which is navigated to in a top-level browsing context to force the creation of a new top-level browsing context, and a corresponding group. The possible values are:
unsafe-none
"This is the (current) default and means that the document will occupy the same top-level browsing context as its predecessor, unless that document specified a different opener policy.
same-origin-allow-popups
"This forces the creation of a new top-level browsing context for the document, unless its predecessor specified the same opener policy and they are same origin.
same-origin
"This behaves the same as "same-origin-allow-popups
", with the addition that
any auxiliary browsing context created needs to contain same origin
documents that also have the same opener policy or it will appear closed to the
opener.
same-origin-plus-COEP
"This behaves the same as "same-origin
", with the
addition that it sets the (new) top-level browsing context's group's cross-origin isolation
mode to one of "logical
" or "concrete
".
"same-origin-plus-COEP
" cannot
be directly set via the `Cross-Origin-Opener-Policy
` header, but results from a
combination of setting both `Cross-Origin-Opener-Policy: same-origin
` and a
`Cross-Origin-Embedder-Policy
` header whose value is compatible with
cross-origin isolation together.
noopener-allow-popups
"This forces the creation of a new top-level browsing context for the document, regardless of its predecessor.
While including a noopener-allow-popups
value severs the opener
relationship between the document on which it is applied and its opener, it does not create a
robust security boundary between those same-origin documents.
Other risks from same-origin applications include:
Same-origin requests fetching the document's content — could be mitigated through Fetch Metadata filtering. FETCHMETADATA
Same-origin framing - could be mitigated through X-Frame-Options
or CSP
frame-ancestors
.
JavaScript accessible cookies - can be mitigated by ensuring all cookies are httponly
.
localStorage
access to sensitive data.
Service worker installation.
postMessage
or BroadcastChannel
messaging that
exposes sensitive information.
Autofill which may not require user interaction for same-origin documents.
Developers using noopener-allow-popups
need to make sure that their sensitive applications don't rely on client-side features
accessible to other same-origin documents, e.g., localStorage
and other client-side storage APIs,
BroadcastChannel
and related same-origin communication mechanisms. They also need
to make sure that their server-side endpoints don't return sensitive data to non-navigation
requests, whose response content is accessible to same-origin
documents.
An opener policy consists of:
A value, which is an opener policy value, initially "unsafe-none
".
A reporting endpoint, which is string or null, initially null.
A report-only value, which is an opener policy value, initially "unsafe-none
".
A report-only reporting endpoint, which is a string or null, initially null.
To match opener policy values, given an opener policy value documentCOOP, an origin documentOrigin, an opener policy value responseCOOP, and an origin responseOrigin:
If documentCOOP is "unsafe-none
" and
responseCOOP is "unsafe-none
", then return
true.
If documentCOOP is "unsafe-none
" or
responseCOOP is "unsafe-none
", then return
false.
If documentCOOP is responseCOOP and documentOrigin is same origin with responseOrigin, then return true.
Return false.
A Document
's cross-origin opener
policy is derived from the `Cross-Origin-Opener-Policy
` and `Cross-Origin-Opener-Policy-Report-Only
` HTTP response headers.
These headers are structured headers whose value must
be a token. STRUCTURED-FIELDS
The valid token values are the opener policy values. The token may also have
attached parameters; of these, the "report-to
" parameter can have a valid URL
string identifying an appropriate reporting endpoint. REPORTING
Per the processing model described below, userUser agents will ignore this header if it contains an invalid value. Likewise, user agents will ignore this header if the value cannot be parsed as a token.
To obtain an opener policy given a response response and an environment reservedEnvironment:
Let policy be a new opener policy.
If reservedEnvironment is a non-secure context, then return policy.
Let parsedItem be the result of getting a structured field value
given `Cross-Origin-Opener-Policy
` and "item
" from
response's header list.
If parsedItem is not null, then:
If parsedItem[0] is "same-origin
",
then:
Let coep be the result of obtaining a cross-origin embedder policy from response and reservedEnvironment.
If coep's value is
compatible with cross-origin isolation, then set policy's value to "same-origin-plus-COEP
".
Otherwise, set policy's value to
"same-origin
".
If parsedItem[0] is "same-origin-allow-popups
", then set
policy's value to "same-origin-allow-popups
".
If parsedItem[0] is "noopener-allow-popups
", then set
policy's value to "noopener-allow-popups
".
If parsedItem[1]["report-to
"] exists and it is a string, then set policy's reporting endpoint to
parsedItem[1]["report-to
"].
Set parsedItem to the result of getting a structured field value
given `Cross-Origin-Opener-Policy-Report-Only
` and "item
"
from response's header
list.
If parsedItem is not null, then:
If parsedItem[0] is "same-origin
",
then:
Let coep be the result of obtaining a cross-origin embedder policy from response and reservedEnvironment.
If coep's value is
compatible with cross-origin isolation or coep's report-only value is compatible
with cross-origin isolation, then set policy's report-only value to "same-origin-plus-COEP
".
Report only COOP also considers report-only COEP to assign the special
"same-origin-plus-COEP
" value. This allows
developers more freedom in the order of deployment of COOP and COEP.
Otherwise, set policy's report-only value to "same-origin
".
If parsedItem[0] is "same-origin-allow-popups
", then set
policy's report-only value to
"same-origin-allow-popups
".
If parsedItem[1]["report-to
"] exists and it is a string, then set policy's report-only reporting endpoint to
parsedItem[1]["report-to
"].
Return policy.
To check if popup COOP values require a browsing context group switch, given two origins responseOrigin and activeDocumentNavigationOrigin, and two opener policy values responseCOOPValue and activeDocumentCOOPValue:
responseCOOPValue is "noopener-allow-popups
", then return true.
If all of the following are true:
activeDocumentCOOPValue's value is
"same-origin-allow-popups
" or
"noopener-allow-popups
"; and
responseCOOPValue is "unsafe-none
",
then return false.
If the result of matching activeDocumentCOOPValue, activeDocumentNavigationOrigin, responseCOOPValue, and responseOrigin is true, then return false.
Return true.
To check if COOP values require a browsing context group switch, given a boolean isInitialAboutBlank, two origins responseOrigin and activeDocumentNavigationOrigin, and two opener policy values responseCOOPValue and activeDocumentCOOPValue:
If isInitialAboutBlank is true, then return the result of checking if popup COOP values requires a browsing context group switch with responseOrigin, activeDocumentNavigationOrigin, responseCOOPValue, and activeDocumentCOOPValue.
Here we are dealing with a non-popup navigation.
If the result of matching activeDocumentCOOPValue, activeDocumentNavigationOrigin, responseCOOPValue, and responseOrigin is true, then return false.
Return true.
To check if enforcing report-only COOP would require a browsing context group switch, given a boolean isInitialAboutBlank, two origins responseOrigin, activeDocumentNavigationOrigin, and two opener policies responseCOOP and activeDocumentCOOP:
If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, responseOrigin, activeDocumentNavigationOrigin, responseCOOP's report-only value and activeDocumentCOOPReportOnly's report-only value is false, then return false.
Matching report-only policies allows a website to specify the same report-only opener policy on all its pages and not receive violation reports for navigations between these pages.
If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, responseOrigin, activeDocumentNavigationOrigin, responseCOOP's value and activeDocumentCOOPReportOnly's report-only value is true, then return true.
If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, responseOrigin, activeDocumentNavigationOrigin, responseCOOP's report-only value and activeDocumentCOOPReportOnly's value is true, then return true.
Return false.
An opener policy enforcement result is a struct with the following items:
A boolean needs a browsing context group switch, initially false.
A boolean would need a browsing context group switch due to report-only, initially false.
A URL url.
An origin origin.
An opener policy opener policy.
A boolean current context is navigation source, initially false.
To enforce a response's opener policy, given a browsing context browsingContext, a URL responseURL, an origin responseOrigin, an opener policy responseCOOP, an opener policy enforcement result currentCOOPEnforcementResult, and a referrer referrer:
Let newCOOPEnforcementResult be a new opener policy enforcement result with
Let isInitialAboutBlank be browsingContext's active
document's is initial about:blank
.
If isInitialAboutBlank is true and browsingContext's initial URL is null, set browsingContext's initial URL to responseURL.
If the result of checking if COOP values require a browsing context group switch given isInitialAboutBlank, currentCOOPEnforcementResult's opener policy's value, currentCOOPEnforcementResult's origin, responseCOOP's value, and responseOrigin is true, then:
Set newCOOPEnforcementResult's needs a browsing context group switch to true.
If browsingContext's group's browsing context set's size is greater than 1, then:
Queue a violation report for browsing
context group switch when navigating to a COOP response with responseCOOP,
"enforce
", responseURL,
currentCOOPEnforcementResult's url,
currentCOOPEnforcementResult's origin, responseOrigin, and
referrer.
Queue a violation report for browsing
context group switch when navigating away from a COOP response with
currentCOOPEnforcementResult's opener
policy, "enforce
", currentCOOPEnforcementResult's
url, responseURL,
currentCOOPEnforcementResult's origin, responseOrigin, and
currentCOOPEnforcementResult's current
context is navigation source.
If the result of checking if enforcing report-only COOP would require a browsing context group switch given isInitialAboutBlank, responseOrigin, currentCOOPEnforcementResult's origin, responseCOOP, and currentCOOPEnforcementResult's opener policy, is true, then:
Set result's would need a browsing context group switch due to report-only to true.
If browsingContext's group's browsing context set's size is greater than 1, then:
Queue a violation report for browsing
context group switch when navigating to a COOP response with responseCOOP,
"reporting
", responseURL,
currentCOOPEnforcementResult's url,
currentCOOPEnforcementResult's origin, responseOrigin, and
referrer.
Queue a violation report for browsing
context group switch when navigating away from a COOP response with
currentCOOPEnforcementResult's opener
policy, "reporting
",
currentCOOPEnforcementResult's url,
responseURL, currentCOOPEnforcementResult's origin, responseOrigin, and
currentCOOPEnforcementResult's current
context is navigation source.
Return newCOOPEnforcementResult.
To obtain a browsing context to use for a navigation response, given a browsing context browsingContext, a sandboxing flag set sandboxFlags, an opener policy navigationCOOP, and an opener policy enforcement result coopEnforcementResult:
If browsingContext is not a top-level browsing context, then return browsingContext.
If coopEnforcementResult's needs a browsing context group switch is false, then:
If coopEnforcementResult's would need a browsing context group switch due to report-only is true, set browsing context's virtual browsing context group ID to a new unique identifier.
Return browsingContext.
Let newBrowsingContext be the first return value of creating a new top-level browsing context and document.
In this case we are going to perform a browsing context group swap.
browsingContext will not be used by the new Document
that we are about
to create. If it is not used by other
Document
s either (such as ones in the back/forward cache), then the user agent
might destroy it at this point.
If navigationCOOP's value is "same-origin-plus-COEP
", then set
newBrowsingContext's group's cross-origin isolation mode to either "logical
" or "concrete
". The choice of which is
implementation-defined.
It is difficult on some platforms to provide the security properties required
by the cross-origin
isolated capability. "concrete
"
grants access to it and "logical
" does
not.
If sandboxFlags is not empty, then:
Assert: navigationCOOP's value is
"unsafe-none
".
Assert: newBrowsingContext's popup sandboxing flag set is empty.
Set newBrowsingContext's popup sandboxing flag set to a clone of sandboxFlags.
Return newBrowsingContext.
An accessor-accessed relationship is an enum that describes the relationship between two browsing contexts between which an access happened. It can take the following values:
The accessor browsing context or one of its ancestors is the opener browsing context of the accessed browsing context's top-level browsing context.
The accessed browsing context or one of its ancestors is the opener browsing context of the accessor browsing context's top-level browsing context.
There is no opener relationship between the accessor browsing context, the accessor browsing context, or any of their ancestors.
To check if an access between two browsing contexts should be reported, given two browsing contexts accessor and accessed, a JavaScript property name P, and an environment settings object environment:
If P is not a cross-origin accessible window property name, then return.
Assert: accessor's active document and accessed's active document are both fully active.
Let accessorTopDocument be accessor's top-level browsing context's active document.
Let accessorInclusiveAncestorOrigins be the list obtained by taking the origin of the active document of each of accessor's active document's inclusive ancestor navigables.
Let accessedTopDocument be accessed's top-level browsing context's active document.
Let accessedInclusiveAncestorOrigins be the list obtained by taking the origin of the active document of each of accessed's active document's inclusive ancestor navigables.
If any of accessorInclusiveAncestorOrigins are not same origin with accessorTopDocument's origin, or if any of accessedInclusiveAncestorOrigins are not same origin with accessedTopDocument's origin, then return.
This avoids leaking information about cross-origin iframes to a top level frame with opener policy reporting.
If accessor's top-level browsing context's virtual browsing context group ID is accessed's top-level browsing context's virtual browsing context group ID, then return.
Let accessorAccessedRelationship be a new accessor-accessed relationship with value none.
If accessed's top-level browsing context's opener browsing context is accessor or is an ancestor of accessor, then set accessorAccessedRelationship to accessor is opener.
If accessor's top-level browsing context's opener browsing context is accessed or is an ancestor of accessed, then set accessorAccessedRelationship to accessor is openee.
Queue violation reports for accesses, given accessorAccessedRelationship, accessorTopDocument's opener policy, accessedTopDocument's opener policy, accessor's active document's URL, accessed's active document's URL, accessor's top-level browsing context's initial URL, accessed's top-level browsing context's initial URL, accessor's active document's origin, accessed's active document's origin, accessor's top-level browsing context's opener origin at creation, accessed's top-level browsing context's opener origin at creation, accessorTopDocument's referrer, accessedTopDocument's referrer, P, and environment.
To sanitize a URL to send in a report given a URL url:
Let sanitizedURL be a copy of url.
Set the username given sanitizedURL and the empty string.
Set the password given sanitizedURL and the empty string.
Return the serialization of sanitizedURL with exclude fragment set to true.
To queue a violation report for browsing context group switch when navigating to a COOP response given an opener policy coop, a string disposition, a URL coopURL, a URL previousResponseURL, two origins coopOrigin and previousResponseOrigin, and a referrer referrer:
If coop's reporting endpoint is null, return.
Let coopValue be coop's value.
If disposition is "reporting
", then set
coopValue to coop's report-only value.
Let serializedReferrer be an empty string.
If referrer is a URL, set serializedReferrer to the serialization of referrer.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | disposition |
effectivePolicy | coopValue |
previousResponseURL | If coopOrigin and previousResponseOrigin are same origin this is the sanitization of previousResponseURL, null otherwise. |
referrer | serializedReferrer |
type | "navigation-to-response " |
Queue body as "coop
" for coop's reporting endpoint with coopURL.
To queue a violation report for browsing context group switch when navigating away from a COOP response given an opener policy coop, a string disposition, a URL coopURL, a URL nextResponseURL, two origins coopOrigin and nextResponseOrigin, and a boolean isCOOPResponseNavigationSource:
If coop's reporting endpoint is null, return.
Let coopValue be coop's value.
If disposition is "reporting
", then set
coopValue to coop's report-only value.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | disposition |
effectivePolicy | coopValue |
nextResponseURL | If coopOrigin and nextResponseOrigin are same origin or isCOOPResponseNavigationSource is true, this is the sanitization of previousResponseURL, null otherwise. |
type | "navigation-from-response " |
Queue body as "coop
" for coop's reporting endpoint with coopURL.
To queue violation reports for accesses, given an accessor-accessed relationship accessorAccessedRelationship, two opener policies accessorCOOP and accessedCOOP, four URLs accessorURL, accessedURL, accessorInitialURL, accessedInitialURL, four origins accessorOrigin, accessedOrigin, accessorCreatorOrigin and accessedCreatorOrigin, two referrers accessorReferrer and accessedReferrer, a string propertyName, and an environment settings object environment:
If coop's reporting endpoint is null, return.
Let coopValue be coop's value.
If disposition is "reporting
", then set
coopValue to coop's report-only value.
If accessorAccessedRelationship is accessor is opener:
Queue a violation report for access to an opened window, given accessorCOOP, accessorURL, accessedURL, accessedInitialURL, accessorOrigin, accessedOrigin, accessedCreatorOrigin, propertyName, and environment.
Queue a violation report for access from the opener, given accessedCOOP, accessedURL, accessorURL, accessedOrigin, accessorOrigin, propertyName, and accessedReferrer.
Otherwise, if accessorAccessedRelationship is accessor is openee:
Queue a violation report for access to the opener, given accessorCOOP, accessorURL, accessedURL, accessorOrigin, accessedOrigin, propertyName, accessorReferrer, and environment.
Queue a violation report for access from an opened window, given accessedCOOP, accessedURL, accessorURL, accessorInitialURL, accessedOrigin, accessorOrigin, accessorCreatorOrigin, and propertyName.
Otherwise:
Queue a violation report for access to another window, given accessorCOOP, accessorURL, accessedURL, accessorOrigin, accessedOrigin, propertyName, and environment
Queue a violation report for access from another window, given accessedCOOP, accessedURL, accessorURL, accessedOrigin, accessorOrigin, and propertyName.
To queue a violation report for access to the opener, given an opener policy coop, two URLs coopURL and openerURL, two origins coopOrigin and openerOrigin, a string propertyName, a referrer referrer, and an environment settings object environment:
Let sourceFile, lineNumber and columnNumber be the relevant script URL and problematic position which triggered this report.
Let serializedReferrer be an empty string.
If referrer is a URL, set serializedReferrer to the serialization of referrer.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop's report-only value |
property | propertyName |
openerURL | If coopOrigin and openerOrigin are same origin, this is the sanitization of openerURL, null otherwise. |
referrer | serializedReferrer |
sourceFile | sourceFile |
lineNumber | lineNumber |
columnNumber | columnNumber |
type | "access-to-opener " |
Queue body as "coop
" for coop's reporting endpoint with coopURL and
environment.
To queue a violation report for access to an opened window, given an opener policy coop, three URLs coopURL, openedWindowURL and initialWindowURL, three origins coopOrigin, openedWindowOrigin, and openerInitialOrigin, a string propertyName, and an environment settings object environment:
Let sourceFile, lineNumber and columnNumber be the relevant script URL and problematic position which triggered this report.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop's report-only value |
property | propertyName |
openedWindowURL | If coopOrigin and openedWindowOrigin are same origin, this is the sanitization of openedWindowURL, null otherwise. |
openedWindowInitialURL | If coopOrigin and openerInitialOrigin are same origin, this is the sanitization of initialWindowURL, null otherwise. |
sourceFile | sourceFile |
lineNumber | lineNumber |
columnNumber | columnNumber |
type | "access-to-opener " |
Queue body as "coop
"
for coop's reporting endpoint with
coopURL and environment.
To queue a violation report for access to another window, given an opener policy coop, two URLs coopURL and otherURL, two origins coopOrigin and otherOrigin, a string propertyName, and an environment settings object environment:
Let sourceFile, lineNumber and columnNumber be the relevant script URL and problematic position which triggered this report.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop's report-only value |
property | propertyName |
otherURL | If coopOrigin and otherOrigin are same origin, this is the sanitization of otherURL, null otherwise. |
sourceFile | sourceFile |
lineNumber | lineNumber |
columnNumber | columnNumber |
type | "access-to-opener " |
Queue body as "coop
"
for coop's reporting endpoint with
coopURL and environment.
To queue a violation report for access from the opener, given an opener policy coop, two URLs coopURL and openerURL, two origins coopOrigin and openerOrigin, a string propertyName, and a referrer referrer:
If coop's reporting endpoint is null, return.
Let serializedReferrer be an empty string.
If referrer is a URL, set serializedReferrer to the serialization of referrer.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop's report-only value |
property | propertyName |
openerURL | If coopOrigin and openerOrigin are same origin, this is the sanitization of openerURL, null otherwise. |
referrer | serializedReferrer |
type | "access-to-opener " |
Queue body as "coop
"
for coop's reporting endpoint with
coopURL.
To queue a violation report for access from an opened window, given an opener policy coop, three URLs coopURL, openedWindowURL and initialWindowURL, three origins coopOrigin, openedWindowOrigin, and openerInitialOrigin, and a string propertyName:
If coop's reporting endpoint is null, return.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coopValue |
property | coop's report-only value |
openedWindowURL | If coopOrigin and openedWindowOrigin are same origin, this is the sanitization of openedWindowURL, null otherwise. |
openedWindowInitialURL | If coopOrigin and openerInitialOrigin are same origin, this is the sanitization of initialWindowURL, null otherwise. |
type | "access-to-opener " |
Queue body as "coop
"
for coop's reporting endpoint with
coopURL.
To queue a violation report for access from another window, given an opener policy coop, two URLs coopURL and otherURL, two origins coopOrigin and otherOrigin, and a string propertyName:
If coop's reporting endpoint is null, return.
Let body be a new object containing the following properties:
key | value |
---|---|
disposition | "reporting " |
effectivePolicy | coop's report-only value |
property | propertyName |
otherURL | If coopOrigin and otherOrigin are same origin, this is the sanitization of otherURL, null otherwise. |
type | access-to-opener |
Queue body as "coop
"
for coop's reporting endpoint with
coopURL.
An embedder policy value is one of three strings that controls the fetching of cross-origin resources without explicit permission from resource owners.
unsafe-none
"This is the default value. When this value is used, cross-origin resources can be fetched
without giving explicit permission through the CORS protocol or the
`Cross-Origin-Resource-Policy
` header.
require-corp
"When this value is used, fetching cross-origin resources requires the server's
explicit permission through the CORS protocol or the
`Cross-Origin-Resource-Policy
` header.
credentialless
"When this value is used, fetching cross-origin no-CORS resources omits credentials. In
exchange, an explicit `Cross-Origin-Resource-Policy
` header is not required. Other
requests sent with credentials require the server's explicit permission through the CORS
protocol or the `Cross-Origin-Resource-Policy
` header.
Before supporting "credentialless
", implementers are
strongly encouraged to support both:
Otherwise, it would allow attackers to leverage the client's network position to read non public resources, using the cross-origin isolated capability.
An embedder policy value is compatible with cross-origin isolation if
it is "credentialless
" or "require-corp
".
An embedder policy consists of:
A value, which is an embedder policy value, initially "unsafe-none
".
A reporting endpoint string, initially the empty string.
A report only value, which is an embedder policy value, initially
"unsafe-none
".
A report only reporting endpoint string, initially the empty string.
The "coep
" report type is a report type whose value
is "coep
". It is visible to
ReportingObserver
s.
The `Cross-Origin-Embedder-Policy
` and
`Cross-Origin-Embedder-Policy-Report-Only
` HTTP response
headers allow a server to declare an embedder policy for an environment
settings object. These headers are structured
headers whose values must be token.
STRUCTURED-FIELDS
The valid token values are the embedder policy values. The token may also have attached parameters; of these, the "report-to
" parameter can have a valid URL
string identifying an appropriate reporting endpoint. REPORTING
The processing model fails open (by defaulting
to "unsafe-none
") in the presence of a header that cannot
be parsed as a token. This includes inadvertent lists created by combining multiple instances of
the `Cross-Origin-Embedder-Policy
` header present in a given response:
`Cross-Origin-Embedder-Policy ` |
Final embedder policy value |
---|---|
No header delivered | "unsafe-none " |
`require-corp ` |
"require-corp " |
`unknown-value ` |
"unsafe-none " |
`require-corp, unknown-value ` |
"unsafe-none " |
`unknown-value, unknown-value ` |
"unsafe-none " |
`unknown-value, require-corp ` |
"unsafe-none " |
`require-corp, require-corp ` |
"unsafe-none " |
(The same applies to `Cross-Origin-Embedder-Policy-Report-Only
`.)
To obtain an embedder policy from a response response and an environment environment:
Let policy be a new embedder policy.
If environment is a non-secure context, then return policy.
Let parsedItem be the result of getting a structured field value
with `Cross-Origin-Embedder-Policy
` and "item
" from
response's header list.
If parsedItem is non-null and parsedItem[0] is compatible with cross-origin isolation:
Set policy's value to parsedItem[0].
If parsedItem[1]["report-to
"] exists, then set policy's endpoint to
parsedItem[1]["report-to
"].
Set parsedItem to the result of getting a structured field value
with `Cross-Origin-Embedder-Policy-Report-Only
` and "item
"
from response's header
list.
If parsedItem is non-null and parsedItem[0] is compatible with cross-origin isolation:
Set policy's report only value to parsedItem[0].
If parsedItem[1]["report-to
"] exists, then set policy's endpoint to
parsedItem[1]["report-to
"].
Return policy.
To check a navigation response's adherence to its embedder policy given a response response, a navigable navigable, and an embedder policy responsePolicy:
If navigable is not a child navigable, then return true.
Let parentPolicy be navigable's container document's policy container's embedder policy.
If parentPolicy's report-only
value is compatible with cross-origin isolation and
responsePolicy's value is not, then
queue a cross-origin embedder policy inheritance violation with response,
"navigation
", parentPolicy's report only reporting endpoint,
"reporting
", and navigable's container document's relevant settings
object.
If parentPolicy's value is not compatible with cross-origin isolation or responsePolicy's value is compatible with cross-origin isolation, then return true.
Queue a cross-origin embedder policy inheritance violation with
response, "navigation
", parentPolicy's reporting endpoint,
"enforce
", and navigable's
container document's relevant settings
object.
Return false.
To check a global object's embedder policy given a WorkerGlobalScope
workerGlobalScope, an environment settings object owner, and
a response response:
If workerGlobalScope is not a DedicatedWorkerGlobalScope
object,
then return true.
Let policy be workerGlobalScope's embedder policy.
Let ownerPolicy be owner's policy container's embedder policy.
If ownerPolicy's report-only
value is compatible with cross-origin isolation and policy's
value is not, then queue a cross-origin
embedder policy inheritance violation with response, "worker
initialization
", ownerPolicy's report only reporting endpoint,
"reporting
", and owner.
If ownerPolicy's value is not compatible with cross-origin isolation or policy's value is compatible with cross-origin isolation, then return true.
Queue a cross-origin embedder policy inheritance violation with
response, "worker initialization
", ownerPolicy's
reporting endpoint,
"enforce
", and owner.
Return false.
To queue a cross-origin embedder policy inheritance violation given a response response, a string type, a string endpoint, a string disposition, and an environment settings object settings:
Let serialized be the result of serializing a response URL for reporting with response.
Let body be a new object containing the following properties:
key | value |
---|---|
type | type |
blockedURL | serialized |
disposition | disposition |
Queue body as the
"coep
" report type for endpoint on settings.
A sandboxing flag set is a set of zero or more of the following flags, which are used to restrict the abilities that potentially untrusted resources have:
This flag prevents content from navigating browsing contexts other than the sandboxed browsing context itself (or browsing contexts further nested inside it), auxiliary browsing contexts (which are protected by the sandboxed auxiliary navigation browsing context flag defined next), and the top-level browsing context (which is protected by the sandboxed top-level navigation without user activation browsing context flag and sandboxed top-level navigation with user activation browsing context flag defined below).
If the sandboxed auxiliary navigation browsing context flag is not set, then in certain cases the restrictions nonetheless allow popups (new top-level browsing contexts) to be opened. These browsing contexts always have one permitted sandboxed navigator, set when the browsing context is created, which allows the browsing context that created them to actually navigate them. (Otherwise, the sandboxed navigation browsing context flag would prevent them from being navigated even if they were opened.)
This flag prevents content from creating new auxiliary browsing
contexts, e.g. using the target
attribute or
the window.open()
method.
This flag prevents content from navigating their top-level browsing context and prevents content from closing their top-level browsing context. It is consulted only when the sandboxed browsing context's active window does not have transient activation.
When the sandboxed top-level navigation without user activation browsing context flag is not set, content can navigate its top-level browsing context, but other browsing contexts are still protected by the sandboxed navigation browsing context flag and possibly the sandboxed auxiliary navigation browsing context flag.
This flag prevents content from navigating their top-level browsing context and prevents content from closing their top-level browsing context. It is consulted only when the sandboxed browsing context's active window has transient activation.
As with the sandboxed top-level navigation without user activation browsing context flag, this flag only affects the top-level browsing context; if it is not set, other browsing contexts might still be protected by other flags.
This flag forces content into an opaque origin, thus preventing it from accessing other content from the same origin.
This flag also prevents script from reading from or writing to the
document.cookie
IDL attribute, and blocks access
to localStorage
.
This flag blocks form submission.
This flag disables the Pointer Lock API. POINTERLOCK
This flag blocks script execution.
This flag blocks features that trigger automatically, such as automatically playing a video or automatically focusing a form control.
document.domain
browsing context flagThis flag prevents content from using the
document.domain
setter.
This flag prevents content from escaping the sandbox by ensuring that any auxiliary browsing context it creates inherits the content's active sandboxing flag set.
This flag prevents content from using any of the following features to produce modal dialogs:
window.alert()
window.confirm()
window.print()
window.prompt()
beforeunload
eventThis flag disables the ability to lock the screen orientation. SCREENORIENTATION
This flag disables the Presentation API. PRESENTATION
This flag prevents content from initiating or instantiating downloads, whether through downloading hyperlinks or through navigation that gets handled as a download.
This flag prevents navigations toward non fetch schemes from being handed off to external software.
When the user agent is to parse a sandboxing directive, given a string input, a sandboxing flag set output, it must run the following steps:
Split input on ASCII whitespace, to obtain tokens.
Let output be empty.
Add the following flags to output:
The sandboxed navigation browsing context flag.
The sandboxed auxiliary navigation browsing context flag, unless
tokens contains the allow-popups
keyword.
The sandboxed top-level navigation without user activation browsing context
flag, unless tokens contains the allow-top-navigation
keyword.
The sandboxed top-level navigation with user activation browsing context flag,
unless tokens contains either the allow-top-navigation-by-user-activation
keyword or the allow-top-navigation
keyword.
This means that if the allow-top-navigation
is present, the allow-top-navigation-by-user-activation
keyword will have no effect. For this reason, specifying both is a document conformance error.
The sandboxed origin browsing context flag, unless the tokens
contains the allow-same-origin
keyword.
The allow-same-origin
keyword
is intended for two cases.
First, it can be used to allow content from the same site to be sandboxed to disable scripting, while still allowing access to the DOM of the sandboxed content.
Second, it can be used to embed content from a third-party site, sandboxed to prevent that site from opening popups, etc, without preventing the embedded page from communicating back to its originating site, using the database APIs to store data, etc.
The sandboxed forms browsing context flag, unless tokens
contains the allow-forms
keyword.
The sandboxed pointer lock browsing context flag, unless tokens
contains the allow-pointer-lock
keyword.
The sandboxed scripts browsing context flag, unless tokens
contains the allow-scripts
keyword.
The sandboxed automatic features browsing context flag, unless
tokens contains the allow-scripts
keyword (defined above).
This flag is relaxed by the same keyword as scripts, because when scripts are enabled these features are trivially possible anyway, and it would be unfortunate to force authors to use script to do them when sandboxed rather than allowing them to use the declarative features.
The sandboxed document.domain
browsing
context flag.
The sandbox propagates to auxiliary browsing contexts flag, unless
tokens contains the allow-popups-to-escape-sandbox
keyword.
The sandboxed modals flag, unless tokens contains the allow-modals
keyword.
The sandboxed orientation lock browsing context flag, unless
tokens contains the allow-orientation-lock
keyword.
The sandboxed presentation browsing context flag, unless tokens
contains the allow-presentation
keyword.
The sandboxed downloads browsing context flag, unless tokens
contains the allow-downloads
keyword.
The sandboxed custom protocols navigation browsing context flag, unless
tokens contains either the allow-top-navigation-to-custom-protocols
keyword, the allow-popups
keyword, or
the allow-top-navigation
keyword.
Every top-level browsing context has a popup sandboxing flag set, which is a sandboxing flag set. When a browsing context is created, its popup sandboxing flag set must be empty. It is populated by the rules for choosing a navigable and the obtain a browsing context to use for a navigation response algorithm.
Every iframe
element has an iframe
sandboxing flag set,
which is a sandboxing flag set. Which flags in an iframe
sandboxing flag set are set at any particular time is determined by the iframe
element's sandbox
attribute.
Every Document
has an active sandboxing flag set,
which is a sandboxing flag set. When the Document
is created, its
active sandboxing flag set must be empty. It is populated by the navigation algorithm.
Every CSP list cspList has CSP-derived sandboxing flags, which is a sandboxing flag set. It is the return value of the following algorithm:
Let directives be an empty ordered set.
For each policy in cspList:
If policy's disposition is not "enforce
", then continue.
If policy's directive set contains a directive whose name is "sandbox
",
then append that directive to
directives.
If directives is empty, then return an empty sandboxing flag set.
Let directive be directives[directives's size − 1].
Return the result of parsing the sandboxing directive directive.
To determine the creation sandboxing flags for a browsing context browsing context, given null or an element embedder, return the union of the flags that are present in the following sandboxing flag sets:
If embedder is null, then: the flags set on browsing context's popup sandboxing flag set.
If embedder is an element, then: the flags set on embedder's
iframe
sandboxing flag set.
If embedder is an element, then: the flags set on embedder's node document's active sandboxing flag set.
A policy container is a struct containing policies that apply to
a Document
, a WorkerGlobalScope
, or a WorkletGlobalScope
.
It has the following items:
A CSP list, which is a CSP list. It is initially empty.
An embedder policy, which is an embedder policy. It is initially a new embedder policy.
A referrer policy, which is a referrer policy. It is initially the default referrer policy.
Move other policies into the policy container.
To clone a policy container given a policy container policyContainer:
Let clone be a new policy container.
For each policy in policyContainer's CSP list, append a copy of policy into clone's CSP list.
Set clone's embedder policy to a copy of policyContainer's embedder policy.
Set clone's referrer policy to policyContainer's referrer policy.
Return clone.
To determine whether a URL url requires storing the policy container in history:
If url's scheme is "blob
", then return false.
If url is local, then return true.
Return false.
To create a policy container from a fetch response given a response response and an environment-or-null environment:
If response's URL's scheme is "blob
", then return a clone of response's URL's blob URL
entry's environment's policy
container.
Let result be a new policy container.
Set result's CSP list to the result of parsing a response's Content Security Policies given response.
If environment is non-null, then set result's embedder policy to the result of obtaining an embedder policy given response
and environment. Otherwise, set it to "unsafe-none
".
Set result's referrer
policy to the result of parsing the
`Referrer-Policy
` header given response.
REFERRERPOLICY
Return result.
To determine navigation params policy container given a URL responseURL and four policy container-or-nulls historyPolicyContainer, initiatorPolicyContainer, parentPolicyContainer, and responsePolicyContainer:
If historyPolicyContainer is not null, then:
Assert: responseURL requires storing the policy container in history.
Return a clone of historyPolicyContainer.
If responseURL is about:srcdoc
, then:
Assert: parentPolicyContainer is not null.
Return a clone of parentPolicyContainer.
If responseURL is local and initiatorPolicyContainer is not null, then return a clone of initiatorPolicyContainer.
If responsePolicyContainer is not null, then return responsePolicyContainer.
Return a new policy container.
To initialize a worker global scope's policy
container given a WorkerGlobalScope
workerGlobalScope, a response response, and an environment
environment:
If workerGlobalScope's url
is local but its scheme
is not "blob
":
Assert: workerGlobalScope's owner set's size is 1.
Set workerGlobalScope's policy container to a clone of workerGlobalScope's owner set[0]'s relevant settings object's policy container.
Otherwise, set workerGlobalScope's policy container to the result of creating a policy container from a fetch response given response and environment.
Window
,
WindowProxy
, and Location
objectsAlthough typically objects cannot be accessed across origins, the web platform would not be true to itself if it did not have some legacy exceptions to that rule that the web depends upon.
This section uses the terminology and typographic conventions from the JavaScript specification. JAVASCRIPT
When perform a security check is invoked, with a platformObject, identifier, and type, run these steps:
If platformObject is not a Window
or Location
object,
then return.
For each e of CrossOriginProperties(platformObject):
If SameValue(e.[[Property]], identifier) is true, then:
If type is "method
" and e has neither
[[NeedsGet]] nor [[NeedsSet]], then return.
Otherwise, if type is "getter
" and
e.[[NeedsGet]] is true, then return.
Otherwise, if type is "setter
" and
e.[[NeedsSet]] is true, then return.
If IsPlatformObjectSameOrigin(platformObject) is false, then
throw a "SecurityError
" DOMException
.
Window
and Location
objects both have a
[[CrossOriginPropertyDescriptorMap]] internal slot, whose value is initially an empty
map.
The [[CrossOriginPropertyDescriptorMap]] internal slot contains a map
with entries whose keys are (currentGlobal, objectGlobal,
propertyKey)-tuples and values are property descriptors, as a memoization of what is
visible to scripts when currentGlobal inspects a Window
or
Location
object from objectGlobal. It is filled lazily by
CrossOriginGetOwnPropertyHelper, which consults it on future lookups.
User agents should allow a value held in the map to be garbage collected along with its corresponding key when nothing holds a reference to any part of the value. That is, as long as garbage collection is not observable.
For example, with const href =
Object.getOwnPropertyDescriptor(crossOriginLocation, "href").set
the value and its
corresponding key in the map cannot be garbage collected as that would be observable.
User agents may have an optimization whereby they remove key-value pairs from the map when
document.domain
is set. This is not observable as document.domain
cannot revisit an earlier value.
For example, setting document.domain
to "example.com
" on www.example.com means user agents can remove all
key-value pairs from the map where part of the key is www.example.com, as that can never be part
of the origin again and therefore the corresponding value could never be retrieved
from the map.
Assert: O is a Location
or Window
object.
If O is a Location
object, then return «
{ [[Property]]: "href
", [[NeedsGet]]: false, [[NeedsSet]]: true },
{ [[Property]]: "replace
" } ».
Return «
{ [[Property]]: "window
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "self
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "location
", [[NeedsGet]]: true, [[NeedsSet]]: true },
{ [[Property]]: "close
" },
{ [[Property]]: "closed
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "focus
" },
{ [[Property]]: "blur
" },
{ [[Property]]: "frames
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "length
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "top
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "opener
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "parent
", [[NeedsGet]]: true, [[NeedsSet]]: false },
{ [[Property]]: "postMessage
" } ».
This abstract operation does not return a Completion Record.
Indexed properties do not need to be safelisted in this algorithm, as they are
handled directly by the WindowProxy
object.
A JavaScript property name P is a cross-origin accessible window property
name if it is "window
", "self
", "location
", "close
", "closed
",
"focus
", "blur
", "frames
",
"length
", "top
", "opener
",
"parent
", "postMessage
", or an array index
property name.
If P is "then
", %Symbol.toStringTag%,
%Symbol.hasInstance%, or %Symbol.isConcatSpreadable%, then return
PropertyDescriptor{
[[Value]]: undefined,
[[Writable]]: false,
[[Enumerable]]: false,
[[Configurable]]: true }.
Throw a "SecurityError
" DOMException
.
Return true if the current settings object's origin is same origin-domain with O's relevant settings object's origin, and false otherwise.
This abstract operation does not return a Completion Record.
Here the current settings object roughly corresponds to the "caller",
because this check occurs before the execution
context for the getter/setter/method in question makes its way onto the JavaScript
execution context stack. For example, in the code w.document
, this
step is invoked before the document
getter is reached as part
of the [[Get]] algorithm for the WindowProxy
w.
If this abstract operation returns undefined and there is no custom behavior, the
caller needs to throw a "SecurityError
" DOMException
. In
practice this is handled by the caller calling CrossOriginPropertyFallback.
Let crossOriginKey be a tuple consisting of the current settings object, O's relevant settings object, and P.
For each e of CrossOriginProperties(O):
If SameValue(e.[[Property]], P) is true, then:
If the value of the [[CrossOriginPropertyDescriptorMap]] internal slot of O contains an entry whose key is crossOriginKey, then return that entry's value.
Let originalDesc be OrdinaryGetOwnProperty(O, P).
Let crossOriginDesc be undefined.
If e.[[NeedsGet]] and e.[[NeedsSet]] are absent, then:
Let value be originalDesc.[[Value]].
If IsCallable(value) is true, then set value to an anonymous built-in function, created in the current realm, that performs the same steps as the IDL operation P on object O.
Set crossOriginDesc to PropertyDescriptor{ [[Value]]: value, [[Enumerable]]: false, [[Writable]]: false, [[Configurable]]: true }.
Otherwise:
Let crossOriginGet be undefined.
If e.[[NeedsGet]] is true, then set crossOriginGet to an anonymous built-in function, created in the current realm, that performs the same steps as the getter of the IDL attribute P on object O.
Let crossOriginSet be undefined.
If e.[[NeedsSet]] is true, then set crossOriginSet to an anonymous built-in function, created in the current realm, that performs the same steps as the setter of the IDL attribute P on object O.
Set crossOriginDesc to PropertyDescriptor{ [[Get]]: crossOriginGet, [[Set]]: crossOriginSet, [[Enumerable]]: false, [[Configurable]]: true }.
Create an entry in the value of the [[CrossOriginPropertyDescriptorMap]] internal slot of O with key crossOriginKey and value crossOriginDesc.
Return crossOriginDesc.
Return undefined.
This abstract operation does not return a Completion Record.
The reason that the property descriptors produced here are configurable is to preserve the invariants of the essential internal methods required by the JavaScript specification. In particular, since the value of the property can change as a consequence of navigation, it is required that the property be configurable. (However, see tc39/ecma262 issue #672 and references to it elsewhere in this specification for cases where we are not able to preserve these invariants, for compatibility with existing web content.) JAVASCRIPT
The reason the property descriptors are non-enumerable, despite this mismatching the same-origin behavior, is for compatibility with existing web content. See issue #3183 for details.
Let desc be ? O.[[GetOwnProperty]](P).
Assert: desc is not undefined.
If IsDataDescriptor(desc) is true, then return desc.[[Value]].
Assert: IsAccessorDescriptor(desc) is true.
Let getter be desc.[[Get]].
If getter is undefined, then throw a "SecurityError
"
DOMException
.
Return ? Call(getter, Receiver).
Let desc be ? O.[[GetOwnProperty]](P).
Assert: desc is not undefined.
If desc.[[Set]] is present and its value is not undefined, then:
Perform ? Call(setter, Receiver, « V »).
Return true.
Throw a "SecurityError
" DOMException
.
Let keys be a new empty List.
For each e of CrossOriginProperties(O), append e.[[Property]] to keys.
Return the concatenation of keys and « "then
",
%Symbol.toStringTag%, %Symbol.hasInstance%, %Symbol.isConcatSpreadable%
».
This abstract operation does not return a Completion Record.
Window
object[Global=Window,
Exposed=Window,
LegacyUnenumerableNamedProperties]
interface Window : EventTarget {
// the current browsing context
[LegacyUnforgeable] readonly attribute WindowProxy window;
[Replaceable] readonly attribute WindowProxy self;
[LegacyUnforgeable] readonly attribute Document document;
attribute DOMString name;
[PutForwards=href, LegacyUnforgeable] readonly attribute Location location;
readonly attribute History history;
readonly attribute Navigation navigation;
readonly attribute CustomElementRegistry customElements;
[Replaceable] readonly attribute BarProp locationbar;
[Replaceable] readonly attribute BarProp menubar;
[Replaceable] readonly attribute BarProp personalbar;
[Replaceable] readonly attribute BarProp scrollbars;
[Replaceable] readonly attribute BarProp statusbar;
[Replaceable] readonly attribute BarProp toolbar;
attribute DOMString status;
undefined close();
readonly attribute boolean closed;
undefined stop();
undefined focus();
undefined blur();
// other browsing contexts
[Replaceable] readonly attribute WindowProxy frames;
[Replaceable] readonly attribute unsigned long length;
[LegacyUnforgeable] readonly attribute WindowProxy? top;
attribute any opener;
[Replaceable] readonly attribute WindowProxy? parent;
readonly attribute Element? frameElement;
WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [LegacyNullToEmptyString] DOMString features = "");
// Since this is the global object, the IDL named getter adds a NamedPropertiesObject exotic
// object on the prototype chain. Indeed, this does not make the global object an exotic object.
// Indexed access is taken care of by the WindowProxy exotic object.
getter object (DOMString name);
// the user agent
readonly attribute Navigator navigator;
[Replaceable] readonly attribute Navigator clientInformation; // legacy alias of .navigator
readonly attribute boolean originAgentCluster;
// user prompts
undefined alert();
undefined alert(DOMString message);
boolean confirm(optional DOMString message = "");
DOMString? prompt(optional DOMString message = "", optional DOMString default = "");
undefined print();
undefined postMessage(any message, USVString targetOrigin, optional sequence<object> transfer = []);
undefined postMessage(any message, optional WindowPostMessageOptions options = {});
// also has obsolete members
};
Window includes GlobalEventHandlers;
Window includes WindowEventHandlers;
dictionary WindowPostMessageOptions : StructuredSerializeOptions {
USVString targetOrigin = "/";
};
window.window
window.frames
window.self
These attributes all return window.
window.document
Returns the Document
associated with window.
document.defaultView
Returns the Window
associated with document, if there is one, or null otherwise.
The Window
object has an associated
Document
, which is a Document
object. It is set when the
Window
object is created, and only ever changed during navigation from the initial
about:blank
Document
.
A Window
's browsing context is
its associated Document
's browsing context. It is either null or a
browsing context.
A Window
's navigable is
the navigable whose active document is the
Window
's associated
Document
's, or null if there is no such navigable.
The window
, frames
, and self
getter steps are to return this's relevant realm.[[GlobalEnv]].[[GlobalThisValue]].
The document
getter steps
are to return this's associated
Document
.
The Document
object associated with a Window
object can
change in exactly one case: when the navigate algorithm creates a new Document
object for the
first page loaded in a browsing context. In that specific case, the
Window
object of the initial
about:blank
page is reused and gets a new Document
object.
The defaultView
getter steps are:
If this's browsing context is null, then return null.
Return this's browsing context's
WindowProxy
object.
For historical reasons, Window
objects must also have a writable, configurable,
non-enumerable property named HTMLDocument
whose value is the
Document
interface object.
window = window.open([ url [, target [, features ] ] ])
Opens a window to show url (defaults to "about:blank
"), and returns
it. target (defaults to "_blank
") gives the name of the new
window. If a window already exists with that name, it is reused. The features
argument can contain a set of comma-separated tokens:
noopener
"noreferrer
"These behave equivalently to the noopener
and noreferrer
link types on hyperlinks.
popup
"Encourages user agents to provide a minimal web browser user interface for the new
window. (Impacts the visible
getter on all
BarProp
objects as well.)
globalThis.open("https://email.example/message/CAOOOkFcWW97r8yg=SsWg7GgCmp4suVX9o85y8BvNRqMjuc5PXg", undefined, "noopener,popup");
window.name [ = value ]
Returns the name of the window.
Can be set, to change the name.
window.close()
Closes the window.
window.closed
Returns true if the window has been closed, false otherwise.
window.stop()
Cancels the document load.
To get noopener for window open, given a Document
sourceDocument, an ordered map tokenizedFeatures, and a
URL record url, perform the following steps. They return a boolean.
If url's scheme is "blob
":
Let blobOrigin be url's blob URL entry's environment's origin.
Let topLevelOrigin be sourceDocument's relevant settings object's top-level origin.
If blobOriginis not same site with topLevelOrigin, then return true.
Let noopener be false.
If tokenizedFeatures["noopener
"] exists, then set noopener to the result of parsing tokenizedFeatures["noopener
"] as a boolean feature.
Return noopener.
The window open steps, given a string url, a string target, and a string features, are as follows:
If the event loop's termination nesting level is nonzero, then return null.
Let sourceDocument be the entry global object's associated Document
.
Let urlRecord be null.
If url is not the empty string, then:
Set urlRecord to the result of encoding-parsing a URL given url, relative to sourceDocument.
If urlRecord is failure, then throw a "SyntaxError
"
DOMException
.
If target is the empty string, then set target to "_blank
".
Let tokenizedFeatures be the result of tokenizing features.
Let noreferrer be false.
If tokenizedFeatures["noreferrer
"] exists, then set noreferrer to the result of parsing tokenizedFeatures["noreferrer
"] as a boolean feature.
Let noopener be the result of getting noopener for window open with sourceDocument, tokenizedFeatures, and urlRecord.
Remove tokenizedFeatures["noopener
"] and tokenizedFeatures["noreferrer
"].
Let referrerPolicy be the empty string.
If noreferrer is true, then set noopener to true and set
referrerPolicy to "no-referrer
".
Let targetNavigable and windowType be the result of applying the rules for choosing a navigable given target, sourceDocument's node navigable, and noopener.
If there is a user agent that supports control-clicking a link to open it in
a new tab, and the user control-clicks on an element whose onclick
handler uses the window.open()
API to open a page in an iframe
element,
the user agent could override the selection of the target browsing context to instead target a
new tab.
If targetNavigable is null, then return null.
If windowType is either "new and unrestricted
" or "new with no opener
", then:
Set targetNavigable's active browsing context's is popup to the result of checking if a popup window is requested, given tokenizedFeatures.
Set up browsing context features for targetNavigable's active browsing context given tokenizedFeatures. CSSOMVIEW
If urlRecord is null, then set urlRecord to a URL
record representing about:blank
.
If urlRecord matches about:blank
, then perform the
URL and history update steps given targetNavigable's active document and urlRecord.
This is necessary in case url is something like about:blank?foo
. If url is just plain about:blank
, this will do nothing.
Otherwise, navigate targetNavigable to urlRecord using sourceDocument, with referrerPolicy set to referrerPolicy and exceptionsEnabled set to true.
Otherwise:
If urlRecord is not null, then navigate targetNavigable to urlRecord using sourceDocument, with referrerPolicy set to referrerPolicy and exceptionsEnabled set to true.
If noopener is false, then set targetNavigable's active browsing context's opener browsing context to sourceDocument's browsing context.
If noopener is true or windowType is "new with no
opener
", then return null.
Return targetNavigable's active
WindowProxy
.
The open(url, target,
features)
method steps are to run the window open steps with
url, target, and features.
The method provides a mechanism for navigating an existing browsing context or opening and navigating an auxiliary browsing context.
To tokenize the features argument:
Let tokenizedFeatures be a new ordered map.
Let position point at the first code point of features.
While position is not past the end of features:
Let name be the empty string.
Let value be the empty string.
Collect a sequence of code points that are feature separators from features given position. This skips past leading separators before the name.
Collect a sequence of code points that are not feature separators from features given position. Set name to the collected characters, converted to ASCII lowercase.
Set name to the result of normalizing the feature name name.
While position is not past the end of features and the code point at position in features is not U+003D (=):
If the code point at position in features is U+002C (,), or if it is not a feature separator, then break.
Advance position by 1.
This skips to the first U+003D (=) but does not skip past a U+002C (,) or a non-separator.
If the code point at position in features is a feature separator:
While position is not past the end of features and the code point at position in features is a feature separator:
If the code point at position in features is U+002C (,), then break.
Advance position by 1.
This skips to the first non-separator but does not skip past a U+002C (,).
Collect a sequence of code points that are not feature separators code points from features given position. Set value to the collected code points, converted to ASCII lowercase.
If name is not the empty string, then set tokenizedFeatures[name] to value.
Return tokenizedFeatures.
To check if a window feature is set, given tokenizedFeatures, featureName, and defaultValue:
If tokenizedFeatures[featureName] exists, then return the result of parsing tokenizedFeatures[featureName] as a boolean feature.
Return defaultValue.
To check if a popup window is requested, given tokenizedFeatures:
If tokenizedFeatures is empty, then return false.
If tokenizedFeatures["popup
"] exists, then return the result of parsing
tokenizedFeatures["popup
"] as a boolean
feature.
Let location be the result of checking if
a window feature is set, given tokenizedFeatures, "location
", and false.
Let toolbar be the result of checking if
a window feature is set, given tokenizedFeatures, "toolbar
", and false.
If location and toolbar are both false, then return true.
Let menubar be the result of checking if
a window feature is set, given tokenizedFeatures, "menubar
", and false.
If menubar is false, then return true.
Let resizable be the result of checking if
a window feature is set, given tokenizedFeatures, "resizable
", and true.
If resizable is false, then return true.
Let scrollbars be the result of checking
if a window feature is set, given tokenizedFeatures, "scrollbars
", and false.
If scrollbars is false, then return true.
Let status be the result of checking if
a window feature is set, given tokenizedFeatures, "status
", and false.
If status is false, then return true.
Return false.
A code point is a feature separator if it is ASCII whitespace, U+003D (=), or U+002C (,).
For legacy reasons, there are some aliases of some feature names. To normalize a feature name name, switch on name:
screenx
"
left
".
screeny
"
top
".
innerwidth
"
width
".
innerheight
"
height
".
To parse a boolean feature given a string value:
If value is the empty string, then return true.
If value is "yes
", then return
true.
If value is "true
", then return
true.
Let parsed be the result of parsing value as an integer.
If parsed is an error, then set it to 0.
Return false if parsed is 0, and true otherwise.
The name
getter steps are:
If this's navigable is null, then return the empty string.
Return this's navigable's target name.
The name
setter steps are:
If this's navigable is null, then return.
Set this's navigable's active session history entry's document state's navigable target name to the given value.
The name gets reset when the navigable is navigated to another origin.
The close()
method steps
are:
Let thisTraversable be this's navigable.
If thisTraversable is not a top-level traversable, then return.
If thisTraversable's is closing is true, then return.
Let browsingContext be thisTraversable's active browsing context.
Let sourceSnapshotParams be the result of snapshotting source snapshot params given thisTraversable's active document.
If all the following are true:
thisTraversable is script-closable;
the incumbent global object's browsing context is familiar with browsingContext; and
the incumbent global object's navigable is allowed by sandboxing to navigate thisTraversable, given sourceSnapshotParams,
then:
Set thisTraversable's is closing to true.
Queue a task on the DOM manipulation task source to definitely close thisTraversable.
A navigable is script-closable if its active browsing context is an auxiliary browsing context that was created by a script (as opposed to by an action of the user), or if it is a top-level traversable whose session history entries's size is 1.
The closed
getter
steps are to return true if this's browsing context
is null or its is closing is true; otherwise false.
The stop()
method steps
are:
If this's navigable is null, then return.
Stop loading this's navigable.
Window
objectwindow.length
Returns the number of document-tree child navigables.
window[index]
Returns the WindowProxy
corresponding to the indicated document-tree child navigables.
The length
getter steps are
to return this's associated
Document
's document-tree child navigables's size.
Indexed access to document-tree child navigables is defined through
the [[GetOwnProperty]] internal method of the
WindowProxy
object.
Window
objectwindow[name]
Returns the indicated element or collection of elements.
As a general rule, relying on this will lead to brittle code. Which IDs end up mapping to
this API can vary over time, as new features are added to the web platform, for example. Instead
of this, use document.getElementById()
or document.querySelector()
.
The document-tree child
navigable target name property set of a Window
object window is the
return value of running these steps:
Let children be the document-tree child navigables of
window's associated
Document
.
Let firstNamedChildren be an empty ordered set.
For each navigable of children:
Let name be navigable's target name.
If name is the empty string, then continue.
If firstNamedChildren contains a navigable whose target name is name, then continue.
Append navigable to firstNamedChildren.
Let names be an empty ordered set.
For each navigable of firstNamedChildren:
Let name be navigable's target name.
If navigable's active document's origin is same origin with window's relevant settings object's origin, then append name to names.
Return names.
The two seperate iterations mean that in the following example, hosted on https://example.org/
, assuming https://elsewhere.example/
sets window.name
to "spices
", evaluating
window.spices
after everything has loaded will yield undefined:
<iframe src=https://elsewhere.example.com/></iframe>
<iframe name=spices></iframe>
The Window
object supports named
properties. The supported property names of a Window
object
window at any moment consist of the following, in tree order according to
the element that contributed them, ignoring later duplicates:
window's document-tree child navigable target name property set;
the value of the name
content attribute for all embed
,
form
, img
, and object
elements that
have a non-empty name
content attribute and are in a document
tree with window's associated
Document
as their root; and
the value of the id
content attribute for all HTML
elements that have a non-empty id
content attribute and are
in a document tree with window's associated Document
as their
root.
To determine the value of a named property
name in a Window
object window, the user agent must return the
value obtained using the following steps:
Let objects be the list of named objects of window with the name name.
There will be at least one such object, since the algorithm would otherwise not have been invoked by Web IDL.
If objects contains a navigable, then:
Let container be the first navigable container in
window's associated
Document
's descendants whose
content navigable is in objects.
Return container's content navigable's active WindowProxy
.
Otherwise, if objects has only one element, return that element.
Otherwise, return an HTMLCollection
rooted at window's associated Document
, whose filter matches
only named objects of window with
the name name. (By definition, these will all be elements.)
Named objects of Window
object
window with the name name, for the purposes of the above algorithm, consist
of the following:
document-tree child navigables of window's associated Document
whose target name is name;
embed
, form
, img
, or
object
elements that have a name
content attribute whose
value is name and are in a document tree with window's associated Document
as their
root; and
HTML elements that have an id
content attribute
whose value is name and are in a document tree with window's
associated Document
as their
root.
Since the Window
interface has the [Global]
extended attribute, its named properties follow the rules for
named properties objects rather than legacy platform objects.
window.top
Returns the WindowProxy
for the top-level traversable.
window.opener [ = value ]
Returns the WindowProxy
for the opener browsing context.
Returns null if there isn't one or if it has been set to null.
Can be set to null.
window.parent
Returns the WindowProxy
for the parent
navigable.
window.frameElement
Returns the navigable container element.
Returns null if there isn't one, and in cross-origin situations.
The top
getter steps are:
If this's navigable is null, then return null.
Return this's navigable's top-level traversable's active
WindowProxy
.
The opener
getter steps
are:
Let current be this's browsing context.
If current is null, then return null.
If current's opener browsing context is null, then return null.
Return current's opener browsing context's
WindowProxy
object.
The opener
setter steps are:
If the given value is null and this's browsing context is non-null, then set this's browsing context's opener browsing context to null.
If the given value is non-null, then perform ?
DefinePropertyOrThrow(this, "opener
", {
[[Value]]: the given value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true
}).
Setting window.opener
to null clears the opener
browsing context reference. In practice, this prevents future scripts from accessing their
opener browsing context's Window
object.
By default, scripts can access their opener browsing context's
Window
object through the window.opener
getter.
E.g., a script can set window.opener.location
, causing the opener
browsing context to navigate.
The parent
getter steps
are:
Let navigable be this's navigable.
If navigable is null, then return null.
If navigable's parent is not null, then set navigable to navigable's parent.
Return navigable's active
WindowProxy
.
The frameElement
getter steps are:
Let current be this's node navigable.
If current is null, then return null.
Let container be current's container.
If container is null, then return null.
If container's node document's origin is not same origin-domain with the current settings object's origin, then return null.
Return container.
An example of when these properties can return null is as follows:
<!DOCTYPE html>
<iframe></iframe>
<script>
"use strict";
const element = document.querySelector("iframe");
const iframeWindow = element.contentWindow;
element.remove();
console.assert(iframeWindow.top === null);
console.assert(iframeWindow.parent === null);
console.assert(iframeWindow.frameElement === null);
</script>
Here the browsing context corresponding to iframeWindow
was nulled out when element
was
removed from the document.
For historical reasons, the Window
interface had some properties that represented
the visibility of certain web browser interface elements.
For privacy and interoperability reasons, those properties now return values that
represent whether the Window
's browsing context's
is popup property is true or false.
For privacy and interoperability reasons, those properties now return all return the same value: whether or not the window represents a popup window.
Each interface element is represented by a BarProp
object:
[Exposed=Window]
interface BarProp {
readonly attribute boolean visible;
};
window.locationbar.visible
window.menubar.visible
window.personalbar.visible
window.scrollbars.visible
window.statusbar.visible
window.toolbar.visible
Returns true if the Window
is not a popup; otherwise, returns false.
The visible
getter
steps are:
Let browsingContext be this's relevant global object's browsing context.
If browsingContext is null, then return true.
Return the negation of browsingContext's top-level browsing context's is popup.
The following BarProp
objects must exist for each Window
object:
BarProp
objectBarProp
objectBarProp
objectBarProp
objectBarProp
objectBarProp
objectThe locationbar
attribute must return the location bar BarProp
object.
The menubar
attribute must return the menu bar BarProp
object.
The personalbar
attribute must return the personal bar BarProp
object.
The scrollbars
attribute must return the scrollbar BarProp
object.
The statusbar
attribute must return the status bar BarProp
object.
The toolbar
attribute must return the toolbar BarProp
object.
For historical reasons, the status
attribute on the Window
object must,
on getting, return the last string it was set to, and on setting, must set itself to the new
value. When the Window
object is created, the attribute must be set to the empty
string. It does not do anything else.
Window
objectsTo set up a window environment settings object, given a URL creationURL, a JavaScript execution context execution context, null or an environment reservedEnvironment, a URL topLevelCreationURL, and an origin topLevelOrigin, run these steps:
Let realm be the value of execution context's Realm component.
Let window be realm's global object.
Let settings object be a new environment settings object whose algorithms are defined as follows:
Return execution context.
Return the module map of
window's associated
Document
.
Return the current base URL of window's
associated Document
.
Return the origin of window's
associated Document
.
Return the policy container of
window's associated
Document
.
Return true if both of the following hold, and false otherwise:
realm's agent cluster's cross-origin-isolation mode is "concrete
", and
window's associated
Document
is allowed to use the "cross-origin-isolated
" feature.
Return window's associated
Document
's load timing info's navigation start
time.
If reservedEnvironment is non-null, then:
Set settings object's id to reservedEnvironment's id, target browsing context to reservedEnvironment's target browsing context, and active service worker to reservedEnvironment's active service worker.
Set reservedEnvironment's id to the empty string.
The identity of the reserved environment is considered to be fully transferred to the created environment settings object. The reserved environment is not searchable by the environment’s id from this point on.
Otherwise, set settings object's id to a new unique opaque string, settings object's target browsing context to null, and settings object's active service worker to null.
Set settings object's creation URL to creationURL, settings object's top-level creation URL to topLevelCreationURL, and settings object's top-level origin to topLevelOrigin.
Set realm's [[HostDefined]] field to settings object.
WindowProxy
exotic objectA WindowProxy
is an exotic object that wraps a
Window
ordinary object, indirecting most operations through to the wrapped object.
Each browsing context has an associated WindowProxy
object. When the
browsing context is navigated, the Window
object wrapped by the browsing context's associated WindowProxy
object
is changed.
The WindowProxy
exotic object must use the ordinary internal methods except where
it is explicitly specified otherwise below.
There is no WindowProxy
interface object.
Every WindowProxy
object has a [[Window]] internal slot representing the wrapped Window
object.
Although WindowProxy
is named as a "proxy", it does not do
polymorphic dispatch on its target's internal methods as a real proxy would, due to a desire to
reuse machinery between WindowProxy
and Location
objects. As long as the
Window
object remains an ordinary object this is unobservable and can be implemented
either way.
Let W be the value of the [[Window]] internal slot of this.
If IsPlatformObjectSameOrigin(W) is true, then return ! OrdinaryGetPrototypeOf(W).
Return null.
Return ! SetImmutablePrototype(this, V).
Return true.
Return false.
Let W be the value of the [[Window]] internal slot of this.
If P is an array index property name, then:
Let index be ! ToUint32(P).
Let children be the document-tree child navigables of
W's associated
Document
.
Let value be undefined.
If index is less than children's size, then:
Sort children in ascending order, with
navigableA being less than navigableB if navigableA's container was inserted into W's associated Document
earlier than
navigableB's container was.
Set value to children[index]'s active WindowProxy
.
If value is undefined, then:
If IsPlatformObjectSameOrigin(W) is true, then return undefined.
Throw a "SecurityError
" DOMException
.
Return PropertyDescriptor{ [[Value]]: value, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: true }.
If IsPlatformObjectSameOrigin(W) is true, then return ! OrdinaryGetOwnProperty(W, P).
This is a willful violation of the JavaScript specification's invariants of the essential internal methods to maintain compatibility with existing web content. See tc39/ecma262 issue #672 for more information. JAVASCRIPT
Let property be CrossOriginGetOwnPropertyHelper(W, P).
If property is not undefined, then return property.
If property is undefined and P is in W's document-tree child navigable target name property set, then:
Let value be the active
WindowProxy
of the named
object of W with the name P.
Return PropertyDescriptor{ [[Value]]: value, [[Enumerable]]: false, [[Writable]]: false, [[Configurable]]: true }.
The reason the property descriptors are non-enumerable, despite this mismatching the same-origin behavior, is for compatibility with existing web content. See issue #3183 for details.
Return ? CrossOriginPropertyFallback(P).
Let W be the value of the [[Window]] internal slot of this.
If IsPlatformObjectSameOrigin(W) is true, then:
If P is an array index property name, return false.
Return ? OrdinaryDefineOwnProperty(W, P, Desc).
This is a willful violation of the JavaScript specification's invariants of the essential internal methods to maintain compatibility with existing web content. See tc39/ecma262 issue #672 for more information. JAVASCRIPT
Throw a "SecurityError
" DOMException
.
Let W be the value of the [[Window]] internal slot of this.
Check if an access between two browsing contexts should be reported, given the current global object's browsing context, W's browsing context, P, and the current settings object.
If IsPlatformObjectSameOrigin(W) is true, then return ? OrdinaryGet(this, P, Receiver).
Return ? CrossOriginGet(this, P, Receiver).
this is passed rather than W as OrdinaryGet and CrossOriginGet will invoke the [[GetOwnProperty]] internal method.
Let W be the value of the [[Window]] internal slot of this.
Check if an access between two browsing contexts should be reported, given the current global object's browsing context, W's browsing context, P, and the current settings object.
If IsPlatformObjectSameOrigin(W) is true, then:
If P is an array index property name, then return false.
Return ? OrdinarySet(W, P, V, Receiver).
Return ? CrossOriginSet(this, P, V, Receiver).
this is passed rather than W as CrossOriginSet will invoke the [[GetOwnProperty]] internal method.
Let W be the value of the [[Window]] internal slot of this.
If IsPlatformObjectSameOrigin(W) is true, then:
If P is an array index property name, then:
Let desc be ! this.[[GetOwnProperty]](P).
If desc is undefined, then return true.
Return false.
Return ? OrdinaryDelete(W, P).
Throw a "SecurityError
" DOMException
.
Let W be the value of the [[Window]] internal slot of this.
Let maxProperties be W's associated Document
's document-tree
child navigables's size.
Let keys be the range 0 to maxProperties, exclusive.
If IsPlatformObjectSameOrigin(W) is true, then return the concatenation of keys and OrdinaryOwnPropertyKeys(W).
Return the concatenation of keys and ! CrossOriginOwnPropertyKeys(W).
Location
interfaceEach Window
object is associated with a unique instance of a Location
object, allocated when the Window
object is created.
The Location
exotic object is defined through a mishmash of IDL,
invocation of JavaScript internal methods post-creation, and overridden JavaScript internal
methods. Coupled with its scary security policy, please take extra care while implementing
this excrescence.
To create a Location
object, run these steps:
Let location be a new Location
platform
object.
Let valueOf be location's relevant realm.[[Intrinsics]].[[%Object.prototype.valueOf%]].
Perform ! location.[[DefineOwnProperty]]("valueOf
", {
[[Value]]: valueOf,
[[Writable]]: false,
[[Enumerable]]: false,
[[Configurable]]: false }).
Perform ! location.[[DefineOwnProperty]](%Symbol.toPrimitive%, { [[Value]]: undefined, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }).
Set the value of the [[DefaultProperties]] internal slot of location to location.[[OwnPropertyKeys]]().
Return location.
The addition of valueOf
and %Symbol.toPrimitive% own
data properties, as well as the fact that all of Location
's IDL attributes are marked
[LegacyUnforgeable]
, is required by legacy code that consulted
the Location
interface, or stringified it, to determine the document URL, and then used it in a security-sensitive way.
In particular, the valueOf
, %Symbol.toPrimitive%, and [LegacyUnforgeable]
stringifier mitigations ensure that code such as
foo[location] = bar
or location + ""
cannot be
misdirected.
document.location [ = value ]
window.location [ = value ]
Returns a Location
object with the current page's location.
Can be set, to navigate to another page.
The Document
object's location
getter steps are to return
this's relevant global object's Location
object, if
this is fully active, and null otherwise.
The Window
object's location
getter steps are to return this's
Location
object.
Location
objects provide a representation of the URL of their associated Document
, as well as
methods for navigating and reloading
the associated navigable.
[Exposed=Window]
interface Location { // but see also additional creation steps and overridden internal methods
[LegacyUnforgeable] stringifier attribute USVString href;
[LegacyUnforgeable] readonly attribute USVString origin;
[LegacyUnforgeable] attribute USVString protocol;
[LegacyUnforgeable] attribute USVString host;
[LegacyUnforgeable] attribute USVString hostname;
[LegacyUnforgeable] attribute USVString port;
[LegacyUnforgeable] attribute USVString pathname;
[LegacyUnforgeable] attribute USVString search;
[LegacyUnforgeable] attribute USVString hash;
[LegacyUnforgeable] undefined assign(USVString url);
[LegacyUnforgeable] undefined replace(USVString url);
[LegacyUnforgeable] undefined reload();
[LegacyUnforgeable, SameObject] readonly attribute DOMStringList ancestorOrigins;
};
location.toString()
location.href
Returns the Location
object's URL.
Can be set, to navigate to the given URL.
location.origin
Returns the Location
object's URL's origin.
location.protocol
Returns the Location
object's URL's scheme.
Can be set, to navigate to the same URL with a changed scheme.
location.host
Returns the Location
object's URL's host and port (if different from the default
port for the scheme).
Can be set, to navigate to the same URL with a changed host and port.
location.hostname
Returns the Location
object's URL's host.
Can be set, to navigate to the same URL with a changed host.
location.port
Returns the Location
object's URL's port.
Can be set, to navigate to the same URL with a changed port.
location.pathname
Returns the Location
object's URL's path.
Can be set, to navigate to the same URL with a changed path.
location.search
Returns the Location
object's URL's query (includes leading "?
" if non-empty).
Can be set, to navigate to the same URL with a changed query (ignores leading "?
").
location.hash
Returns the Location
object's URL's fragment (includes leading "#
" if non-empty).
Can be set, to navigate to the same URL with a changed fragment (ignores leading "#
").
location.assign(url)
Navigates to the given URL.
location.replace(url)
Removes the current page from the session history and navigates to the given URL.
location.reload()
Reloads the current page.
location.ancestorOrigins
Returns a DOMStringList
object listing the origins of the ancestor navigables' active documents.
A Location
object has an associated relevant Document
,
which is its relevant global object's browsing context's active document, if this
Location
object's relevant global object's browsing context is non-null, and null otherwise.
A Location
object has an associated url,
which is this Location
object's relevant Document
's URL, if this Location
object's relevant
Document
is non-null, and about:blank
otherwise.
A Location
object has an associated ancestor origins list. When a
Location
object is created, its ancestor origins list must be set to a
DOMStringList
object whose associated list is the list of strings that
the following steps would produce:
Let output be a new list of strings.
Let current be the Location
object's relevant
Document
.
While current's container document is non-null:
Set current to current's container document.
Append the serialization of current's origin to output.
Return output.
To Location
-object navigate a Location
object
location to a URL url, optionally given a NavigationHistoryBehavior
historyHandling
(default "auto
"):
Let navigable be location's relevant global object's navigable.
Let sourceDocument be the incumbent
global object's associated
Document
.
If location's relevant Document
is not yet
completely loaded, and the incumbent global
object does not have transient activation, then set
historyHandling to "replace
".
Navigate navigable to url using sourceDocument, with exceptionsEnabled set to true and historyHandling set to historyHandling.
The href
getter
steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Return this's url, serialized.
The href
setter steps are:
If this's relevant Document
is null, then
return.
Let url be the result of encoding-parsing a URL given the given value, relative to the entry settings object.
If url is failure, then throw a "SyntaxError
"
DOMException
.
Location
-object navigate this to
url.
The href
setter intentionally has no
security check.
The origin
getter steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Return the serialization of this's url's origin.
The protocol
getter steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Return this's url's scheme, followed by ":
".
The protocol
setter steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let copyURL be a copy of this's url.
Let possibleFailure be the result of basic URL
parsing the given value, followed by ":
", with copyURL
as url and scheme start state as
state override.
Because the URL parser ignores multiple consecutive colons, providing a value
of "https:
" (or even "https::::
") is the same as
providing a value of "https
".
If possibleFailure is failure, then throw a
"SyntaxError
" DOMException
.
If copyURL's scheme is not an HTTP(S) scheme, then terminate these steps.
Location
-object navigate this to
copyURL.
The host
getter
steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let url be this's url.
If url's host is null, return the empty string.
If url's port is null, return url's host, serialized.
Return url's host, serialized, followed by ":
" and url's port, serialized.
The host
setter steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let copyURL be a copy of this's url.
If copyURL has an opaque path, then return.
Basic URL parse the given value, with copyURL as url and host state as state override.
Location
-object navigate this to
copyURL.
The hostname
getter steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
If this's url's host is null, return the empty string.
Return this's url's host, serialized.
The hostname
setter steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let copyURL be a copy of this's url.
If copyURL has an opaque path, then return.
Basic URL parse the given value, with copyURL as url and hostname state as state override.
Location
-object navigate this to
copyURL.
The port
getter
steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
If this's url's port is null, return the empty string.
Return this's url's port, serialized.
The port
setter steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let copyURL be a copy of this's url.
If copyURL cannot have a username/password/port, then return.
If the given value is the empty string, then set copyURL's port to null.
Otherwise, basic URL parse the given value, with copyURL as url and port state as state override.
Location
-object navigate this to
copyURL.
The pathname
getter steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Return the result of URL path serializing this
Location
object's url.
The pathname
setter steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let copyURL be a copy of this's url.
If copyURL has an opaque path, then return.
Set copyURL's path to the empty list.
Basic URL parse the given value, with copyURL as url and path start state as state override.
Location
-object navigate this to
copyURL.
The search
getter steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
If this's url's query is either null or the empty string, return the empty string.
Return "?
", followed by this's url's query.
The search
setter steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let copyURL be a copy of this's url.
If the given value is the empty string, set copyURL's query to null.
Otherwise, run these substeps:
Let input be the given value with a single leading "?
" removed, if any.
Set copyURL's query to the empty string.
Basic URL parse input, with null, the
relevant Document
's document's character encoding,
copyURL as url, and query
state as state
override.
Location
-object navigate this to
copyURL.
The hash
getter
steps are:
If this's relevant Document
is non-null and its
origin is not same origin-domain with
the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
If this's url's fragment is either null or the empty string, return the empty string.
Return "#
", followed by this's url's fragment.
The hash
setter steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let copyURL be a copy of this's url.
Let input be the given value with a single leading "#
"
removed, if any.
Set copyURL's fragment to the empty string.
Basic URL parse input, with copyURL as url and fragment state as state override.
If copyURL's fragment is this's url's fragment, then return.
This bailout is necessary for compatibility with deployed content, which redundantly sets location.hash
on scroll. It does not apply to other
mechanisms of fragment navigation, such as the location.href
setter or location.assign()
.
Location
-object navigate this to
copyURL.
Unlike the equivalent API for the a
and area
elements,
the hash
setter does not special case the empty string, to
remain compatible with deployed scripts.
The assign(url)
method steps are:
If this's relevant Document
is null, then
return.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Let urlRecord be the result of encoding-parsing a URL given url, relative to the entry settings object.
If urlRecord is failure, then throw a "SyntaxError
"
DOMException
.
Location
-object navigate this to
urlRecord.
The replace(url)
method steps are:
If this's relevant Document
is null, then
return.
Let urlRecord be the result of encoding-parsing a URL given url, relative to the entry settings object.
If urlRecord is failure, then throw a "SyntaxError
"
DOMException
.
Location
-object navigate this to
urlRecord given "replace
".
The replace()
method intentionally has
no security check.
The reload()
method
steps are:
Let document be this's relevant
Document
.
If document is null, then return.
If document's origin is not
same origin-domain with the entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Reload document's node navigable.
The ancestorOrigins
getter steps are:
If this's relevant Document
is null, then return
an empty list.
If this's relevant Document
's origin is not same origin-domain with the
entry settings object's origin, then throw a
"SecurityError
" DOMException
.
Otherwise, return this's ancestor origins list.
The details of how the ancestorOrigins
attribute works are still
controversial and might change. See issue
#1918 for more information.
As explained earlier, the Location
exotic object
requires additional logic beyond IDL for security purposes. The Location
object must
use the ordinary internal methods except where it is explicitly specified otherwise below.
Also, every Location
object has a [[DefaultProperties]] internal slot
representing its own properties at time of its creation.
If IsPlatformObjectSameOrigin(this) is true, then return ! OrdinaryGetPrototypeOf(this).
Return null.
Return ! SetImmutablePrototype(this, V).
Return true.
Return false.
If IsPlatformObjectSameOrigin(this) is true, then:
Let desc be OrdinaryGetOwnProperty(this, P).
If the value of the [[DefaultProperties]] internal slot of this contains P, then set desc.[[Configurable]] to true.
Return desc.
Let property be CrossOriginGetOwnPropertyHelper(this, P).
If property is not undefined, then return property.
Return ? CrossOriginPropertyFallback(P).
If IsPlatformObjectSameOrigin(this) is true, then:
If the value of the [[DefaultProperties]] internal slot of this contains P, then return false.
Return ? OrdinaryDefineOwnProperty(this, P, Desc).
Throw a "SecurityError
" DOMException
.
If IsPlatformObjectSameOrigin(this) is true, then return ? OrdinaryGet(this, P, Receiver).
Return ? CrossOriginGet(this, P, Receiver).
If IsPlatformObjectSameOrigin(this) is true, then return ? OrdinarySet(this, P, V, Receiver).
Return ? CrossOriginSet(this, P, V, Receiver).
If IsPlatformObjectSameOrigin(this) is true, then return ? OrdinaryDelete(this, P).
Throw a "SecurityError
" DOMException
.
If IsPlatformObjectSameOrigin(this) is true, then return OrdinaryOwnPropertyKeys(this).
Return CrossOriginOwnPropertyKeys(this).
History
interfaceenum ScrollRestoration { "auto", "manual" };
[Exposed=Window]
interface History {
readonly attribute unsigned long length;
attribute ScrollRestoration scrollRestoration;
readonly attribute any state;
undefined go(optional long delta = 0);
undefined back();
undefined forward();
undefined pushState(any data, DOMString unused, optional USVString? url = null);
undefined replaceState(any data, DOMString unused, optional USVString? url = null);
};
history.length
Returns the number of overall session history entries for the current traversable navigable.
history.scrollRestoration
Returns the scroll restoration mode of the active session history entry.
history.scrollRestoration = value
Set the scroll restoration mode of the active session history entry to value.
history.state
Returns the classic history API state of the active session history entry, deserialized into a JavaScript value.
history.go()
Reloads the current page.
history.go(delta)
Goes back or forward the specified number of steps in the overall session history entries list for the current traversable navigable.
A zero delta will reload the current page.
If the delta is out of range, does nothing.
history.back()
Goes back one step in the overall session history entries list for the current traversable navigable.
If there is no previous page, does nothing.
history.forward()
Goes forward one step in the overall session history entries list for the current traversable navigable.
If there is no next page, does nothing.
history.pushState(data, "")
Adds a new entry into session history with its classic history API state set to a serialization of data. The active history entry's URL will be copied over and used for the new entry's URL.
(The second parameter exists for historical reasons, and cannot be omitted; passing the empty string is traditional.)
history.pushState(data, "", url)
Adds a new entry into session history with its classic history API state set to a serialization of data, and with its URL set to url.
If the current Document
cannot have
its URL rewritten to url, a "SecurityError
"
DOMException
will be thrown.
(The second parameter exists for historical reasons, and cannot be omitted; passing the empty string is traditional.)
history.replaceState(data, "")
Updates the classic history API state of the active session history entry to a structured clone of data.
(The second parameter exists for historical reasons, and cannot be omitted; passing the empty string is traditional.)
history.replaceState(data, "", url)
Updates the classic history API state of the active session history entry to a structured clone of data, and its URL to url.
If the current Document
cannot have
its URL rewritten to url, a "SecurityError
"
DOMException
will be thrown.
(The second parameter exists for historical reasons, and cannot be omitted; passing the empty string is traditional.)
A Document
has a history object, a
History
object.
The history
getter steps
are to return this's associated
Document
's history object.
Each History
object has state,
initially null.
Each History
object has a length, a
non-negative integer, initially 0.
Each History
object has an index, a
non-negative integer, initially 0.
Although the index is not directly exposed, it can be inferred from changes to the length during synchronous navigations. In fact, that is what it's used for.
The length
getter
steps are:
If this's relevant global object's associated Document
is not fully
active, then throw a "SecurityError
"
DOMException
.
Return this's length.
The scrollRestoration
getter steps are:
If this's relevant global object's associated Document
is not fully
active, then throw a "SecurityError
"
DOMException
.
Return this's node navigable's active session history entry's scroll restoration mode.
The scrollRestoration
setter steps
are:
If this's relevant global object's associated Document
is not fully
active, then throw a "SecurityError
"
DOMException
.
Set this's node navigable's active session history entry's scroll restoration mode to the given value.
The state
getter
steps are:
If this's relevant global object's associated Document
is not fully
active, then throw a "SecurityError
"
DOMException
.
Return this's state.
The go(delta)
method steps are to delta traverse this given delta.
The back()
method steps
are to delta traverse this given −1.
The forward()
method
steps are to delta traverse this given +1.
To delta traverse a History
object history given an integer
delta:
Let document be history's relevant global object's
associated Document
.
If document is not fully active, then throw a
"SecurityError
" DOMException
.
If delta is 0, then reload document's node navigable, and return.
Traverse the history by a delta given document's node navigable's traversable navigable, delta, and with sourceDocument set to document.
The pushState(data,
unused, url)
method steps are to run the shared history
push/replace state steps given this, data, url, and
"push
".
The replaceState(data, unused,
url)
method steps are to run the shared history push/replace state
steps given this, data, url, and "replace
".
The shared history push/replace state steps, given a History
history, a value data, a scalar value string-or-null
url, and a history handling behavior historyHandling, are:
Let document be history's associated Document
.
If document is not fully active, then throw a
"SecurityError
" DOMException
.
Optionally, return. (For example, the user agent might disallow calls to these methods that are invoked on a timer, or from event listeners that are not triggered in response to a clear user action, or that are invoked in rapid succession.)
Let serializedData be StructuredSerializeForStorage(data). Rethrow any exceptions.
Let newURL be document's URL.
If url is not null or the empty string, then:
Set newURL to the result of encoding-parsing a URL given url, relative to the relevant settings object of history.
If newURL is failure, then throw a "SecurityError
"
DOMException
.
If document cannot have its URL
rewritten to newURL, then throw a "SecurityError
"
DOMException
.
The special case for the empty string here is historical, and leads to
different resulting URLs when comparing code such as location.href = ""
(which performs URL parsing on the empty string) versus history.pushState(null, "", "")
(which bypasses it).
Let navigation be history's relevant global object's navigation API.
Let continue be the result of firing a push/replace/reload navigate
event at
navigation with navigationType set to
historyHandling, isSameDocument set
to true, destinationURL set to
newURL, and classicHistoryAPIState set to
serializedData.
If continue is false, then return.
Run the URL and history update steps given document and newURL, with serializedData set to serializedData and historyHandling set to historyHandling.
User agents may limit the number of state objects added to the session history per page. If a
page hits the implementation-defined limit, user agents must remove the entry
immediately after the first entry for that Document
object in the session history
after having added the new entry. (Thus the state history acts as a FIFO buffer for eviction, but
as a LIFO buffer for navigation.)
A Document
document can have its URL rewritten to a
URL targetURL if the following algorithm returns true:
Let documentURL be document's URL.
If targetURL and documentURL differ in their scheme, username, password, host, or port components, then return false.
If targetURL's scheme is an HTTP(S) scheme, then return true.
Differences in path, query, and fragment are allowed for http:
and https:
URLs.
If targetURL's scheme is "file
", then:
If targetURL and documentURL differ in their path component, then return false.
Return true.
Differences in query and fragment are allowed for file:
URLs.
If targetURL and documentURL differ in their path component or query components, then return false.
Only differences in fragment are allowed for other types of URLs.
Return true.
document's URL | targetURL | can have its URL rewritten |
---|---|---|
https://example.com/home
| https://example.com/home#about
| ✅ |
https://example.com/home
| https://example.com/home?page=shop
| ✅ |
https://example.com/home
| https://example.com/shop
| ✅ |
https://example.com/home
| https://user:pass@example.com/home
| ❌ |
https://example.com/home
| http://example.com/home
| ❌ |
file:///path/to/x
| file:///path/to/x#hash
| ✅ |
file:///path/to/x
| file:///path/to/x?search
| ✅ |
file:///path/to/x
| file:///path/to/y
| ❌ |
about:blank
| about:blank#hash
| ✅ |
about:blank
| about:blank?search
| ❌ |
about:blank
| about:srcdoc
| ❌ |
data:text/html,foo
| data:text/html,foo#hash
| ✅ |
data:text/html,foo
| data:text/html,foo?search
| ❌ |
data:text/html,foo
| data:text/html,bar
| ❌ |
data:text/html,foo
| data:bar
| ❌ |
blob:https://example.com/77becafe-657b-4fdc-8bd3-e83aaa5e8f43
| blob:https://example.com/77becafe-657b-4fdc-8bd3-e83aaa5e8f43#hash
| ✅ |
blob:https://example.com/77becafe-657b-4fdc-8bd3-e83aaa5e8f43
| blob:https://example.com/77becafe-657b-4fdc-8bd3-e83aaa5e8f43?search
| ❌ |
blob:https://example.com/77becafe-657b-4fdc-8bd3-e83aaa5e8f43
| blob:https://example.com/anything
| ❌ |
blob:https://example.com/77becafe-657b-4fdc-8bd3-e83aaa5e8f43
| blob:path
| ❌ |
Note how only the URL of the Document
matters, and not its origin. They can mismatch in
cases like about:blank
Document
s with inherited origins, in sandboxed
iframe
s, or when the document.domain
setter has been used.
Consider a game where the user can navigate along a line, such that the user is always at some coordinate, and such that the user can bookmark the page corresponding to a particular coordinate, to return to it later.
A static page implementing the x=5 position in such a game could look like the following:
<!DOCTYPE HTML>
<!-- this is https://example.com/line?x=5 -->
<html lang="en">
<title>Line Game - 5</title>
<p>You are at coordinate 5 on the line.</p>
<p>
<a href="?x=6">Advance to 6</a> or
<a href="?x=4">retreat to 4</a>?
</p>
The problem with such a system is that each time the user clicks, the whole page has to be reloaded. Here instead is another way of doing it, using script:
<!DOCTYPE HTML>
<!-- this starts off as https://example.com/line?x=5 -->
<html lang="en">
<title>Line Game - 5</title>
<p>You are at coordinate <span id="coord">5</span> on the line.</p>
<p>
<a href="?x=6" onclick="go(1); return false;">Advance to 6</a> or
<a href="?x=4" onclick="go(-1); return false;">retreat to 4</a>?
</p>
<script>
var currentPage = 5; // prefilled by server
function go(d) {
setupPage(currentPage + d);
history.pushState(currentPage, "", '?x=' + currentPage);
}
onpopstate = function(event) {
setupPage(event.state);
}
function setupPage(page) {
currentPage = page;
document.title = 'Line Game - ' + currentPage;
document.getElementById('coord').textContent = currentPage;
document.links[0].href = '?x=' + (currentPage+1);
document.links[0].textContent = 'Advance to ' + (currentPage+1);
document.links[1].href = '?x=' + (currentPage-1);
document.links[1].textContent = 'retreat to ' + (currentPage-1);
}
</script>
In systems without script, this still works like the previous example. However, users that do have script support can now navigate much faster, since there is no network access for the same experience. Furthermore, contrary to the experience the user would have with just a naïve script-based approach, bookmarking and navigating the session history still work.
In the example above, the data argument to the pushState()
method is the same information as would be sent
to the server, but in a more convenient form, so that the script doesn't have to parse the URL
each time the user navigates.
Most applications want to use the same scroll restoration mode value for all of
their history entries. To achieve this they can set the scrollRestoration
attribute as soon as possible
(e.g., in the first script
element in the document's head
element) to
ensure that any entry added to the history session gets the desired scroll restoration mode.
<head>
<script>
if ('scrollRestoration' in history)
history.scrollRestoration = 'manual';
</script>
</head>
The navigation API, provided by the global navigation
property, provides a modern and web application-focused way of managing navigations and history entries. It is a successor to the classic location
and history
APIs.
One ability the API provides is inspecting session history entries. For example, the following will display the entries' URLs in an ordered list:
const ol = document.createElement("ol");
ol.start = 0; // so that the list items' ordinal values match up with the entry indices
for (const entry of navigation.entries()) {
const li = document.createElement("li");
if (entry.index < navigation.currentEntry.index) {
li.className = "backward";
} else if (entry.index > navigation.currentEntry.index) {
li.className = "forward";
} else {
li.className = "current";
}
li.textContent = entry.url;
ol.append(li);
}
The navigation.entries()
array contains NavigationHistoryEntry
instances, which have other useful properties in addition to the url
and index
properties shown here. Note that the array only contains NavigationHistoryEntry
objects that represent the current navigable, and thus its contents are not impacted by navigations inside navigable containers such as iframe
s, or by navigations of the parent navigable in cases where the navigation API is itself being used inside an iframe
. Additionally, it only contains NavigationHistoryEntry
objects representing same-origin session history entries, meaning that if the user has visited other origins before or after the current one, there will not be corresponding NavigationHistoryEntry
s.
The navigation API can also be used to navigate, reload, or traverse through the history:
<button onclick="navigation.reload()">Reload</button>
<input type="url" id="navigationURL">
<button onclick="navigation.navigate(navigationURL.value)">Navigate</button>
<button id="backButton" onclick="navigation.back()">Back</button>
<button id="forwardButton" onclick="navigation.forward()">Forward</button>
<select id="traversalDestinations"></select>
<button id="goButton" onclick="navigation.traverseTo(traversalDestinations.value)">Traverse To</button>
<script>
backButton.disabled = !navigation.canGoBack;
forwardButton.disabled = !navigation.canGoForward;
for (const entry of navigation.entries()) {
traversalDestinations.append(new Option(entry.url, entry.key));
}
</script>
Note that traversals are again limited to same-origin destinations, meaning that, for example, navigation.canGoBack
will be false if the previous session history entry is for a page from another origin.
The most powerful part of the navigation API is the navigate
event, which fires whenever almost any navigation or traversal occurs in the current navigable:
navigation.onnavigate = event => {
console.log(event.navigationType); // "push", "replace", "reload", or "traverse"
console.log(event.destination.url);
console.log(event.userInitiated);
// ... and other useful properties
};
(The event will not fire for location bar-initiated navigations, or navigations initiated from other windows, when the destination of the navigation is a new document.)
Much of the time, the event's cancelable
property will be true, meaning this event can be canceled using preventDefault()
:
navigation.onnavigate = event => {
if (event.cancelable && isDisallowedURL(event.destination.url)) {
alert(`Please don't go to ${event.destination.url}!`);
event.preventDefault();
}
};
The cancelable
property will be false for some "traverse
" navigations, such as those taking place inside child navigables, those crossing to new origins, or when the user attempts to traverse again shortly after a previous call to preventDefault()
prevented them from doing so.
The NavigateEvent
's intercept()
method allows intercepting a navigation and converting it into a same-document navigation:
navigation.addEventListener("navigate", e => {
// Some navigations, e.g. cross-origin navigations, we cannot intercept.
// Let the browser handle those normally.
if (!e.canIntercept) {
return;
}
// Similarly, don't intercept fragment navigations or downloads.
if (e.hashChange || e.downloadRequest !== null) {
return;
}
const url = new URL(event.destination.url);
if (url.pathname.startsWith("/articles/")) {
e.intercept({
async handler() {
// The URL has already changed, so show a placeholder while
// fetching the new content, such as a spinner or loading page.
renderArticlePagePlaceholder();
// Fetch the new content and display when ready.
const articleContent = await getArticleContent(url.pathname, { signal: e.signal });
renderArticlePage(articleContent);
}
});
}
});
Note that the handler
function can return a promise to represent the asynchronous progress, and success or failure, of the navigation. While the promise is still pending, browser UI can treat the navigation as ongoing (e.g., by presenting a loading spinner). Other parts of the navigation API are also sensitive to these promises, such as the return value of navigation.navigate()
:
const { committed, finished } = await navigation.navigate("/articles/the-navigation-api-is-cool");
// The committed promise will fulfill once the URL has changed, which happens
// immediately (as long as the NavigateEvent wasn't canceled).
await committed;
// The finished promise will fulfill once the Promise returned by handler() has
// fulfilled, which happens once the article is downloaded and rendered. (Or,
// it will reject, if handler() fails along the way).
await finished;
Navigation
interface[Exposed=Window]
interface Navigation : EventTarget {
sequence<NavigationHistoryEntry> entries();
readonly attribute NavigationHistoryEntry? currentEntry;
undefined updateCurrentEntry(NavigationUpdateCurrentEntryOptions options);
readonly attribute NavigationTransition? transition;
readonly attribute NavigationActivation? activation;
readonly attribute boolean canGoBack;
readonly attribute boolean canGoForward;
NavigationResult navigate(USVString url, optional NavigationNavigateOptions options = {});
NavigationResult reload(optional NavigationReloadOptions options = {});
NavigationResult traverseTo(DOMString key, optional NavigationOptions options = {});
NavigationResult back(optional NavigationOptions options = {});
NavigationResult forward(optional NavigationOptions options = {});
attribute EventHandler onnavigate;
attribute EventHandler onnavigatesuccess;
attribute EventHandler onnavigateerror;
attribute EventHandler oncurrententrychange;
};
dictionary NavigationUpdateCurrentEntryOptions {
required any state;
};
dictionary NavigationOptions {
any info;
};
dictionary NavigationNavigateOptions : NavigationOptions {
any state;
NavigationHistoryBehavior history = "auto";
};
dictionary NavigationReloadOptions : NavigationOptions {
any state;
};
dictionary NavigationResult {
Promise<NavigationHistoryEntry> committed;
Promise<NavigationHistoryEntry> finished;
};
enum NavigationHistoryBehavior {
"auto",
"push",
"replace"
};
Each Window
has an associated navigation
API, which is a Navigation
object. Upon creation of the Window
object, its navigation API must be set to a
new Navigation
object created in the Window
object's relevant realm.
The navigation
getter
steps are to return this's navigation
API.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by all objects implementing the
Navigation
interface:
Event handler | Event handler event type |
---|---|
onnavigate
| navigate
|
onnavigatesuccess
| navigatesuccess
|
onnavigateerror
| navigateerror
|
oncurrententrychange
| currententrychange
|
Each Navigation
has an associated entry
list, a list of NavigationHistoryEntry
objects, initially
empty.
Each Navigation
has an associated current entry index, an integer, initially
−1.
The current entry of a Navigation
navigation is the result of running the following steps:
If navigation has entries and events disabled, then return null.
Assert: navigation's current entry index is not −1.
Return navigation's entry list[navigation's current entry index].
A Navigation
navigation has entries and events disabled if
the following steps return true:
Let document be navigation's relevant global object's
associated Document
.
If document is not fully active, then return true.
If document's is initial about:blank
is true, then
return true.
If document's origin is opaque, then return true.
Return false.
To get the navigation API entry
index of a session history entry she within a
Navigation
navigation:
Let index be 0.
For each nhe of navigation's entry list:
If nhe's session history entry is equal to she, then return index.
Increment index by 1.
Return −1.
A key type used throughout the navigation API is the NavigationType
enumeration:
enum NavigationType {
"push",
"replace",
"reload",
"traverse"
};
This captures the main web developer-visible types of "navigations", which (as noted elsewhere) do not exactly correspond to this standard's singular navigate algorithm. The meaning of each value is the following:
push
"push
", or to
history.pushState()
.replace
"replace
", or
to history.replaceState()
.reload
"traverse
"The value space of the NavigationType
enumeration is a superset of
the value space of the specification-internal history handling behavior type. Several
parts of this standard make use of this overlap, by passing in a history handling
behavior to an algorithm that expects a NavigationType
.
To initialize the navigation API entries for a new document given a
Navigation
navigation, a list of session history entries newSHEs, and a session history
entry initialSHE:
Assert: navigation's entry list is empty.
Assert: navigation's current entry index is −1.
If navigation has entries and events disabled, then return.
For each newSHE of newSHEs:
Let newNHE be a new NavigationHistoryEntry
created
in the relevant realm of
navigation.
Set newNHE's session history entry to newSHE.
Append newNHE to navigation's entry list.
newSHEs will have originally come from getting session history entries for the navigation API, and thus each newSHE will be contiguous same origin with initialSHE.
Set navigation's current entry index to the result of getting the navigation API entry index of initialSHE within navigation.
To update the navigation API entries for reactivation given a
Navigation
navigation, a list of session history entries newSHEs, and a session history
entry reactivatedSHE:
If navigation has entries and events disabled, then return.
Let newNHEs be a new empty list.
Let oldNHEs be a clone of navigation's entry list.
For each newSHE of newSHEs:
Let newNHE be null.
If oldNHEs contains a
NavigationHistoryEntry
matchingOldNHE whose session history entry is newSHE, then:
Set newNHE to matchingOldNHE.
Remove matchingOldNHE from oldNHEs.
Otherwise:
Set newNHE to a new NavigationHistoryEntry
created in the relevant realm of
navigation.
Set newNHE's session history entry to newSHE.
Append newNHE to newNHEs.
newSHEs will have originally come from getting session history entries for the navigation API, and thus each newSHE will be contiguous same origin with reactivatedSHE.
By the end of this loop, all NavigationHistoryEntry
s that remain in
oldNHEs represent session history entries
which have been disposed while the Document
was in bfcache.
Set navigation's entry list to newNHEs.
Set navigation's current entry index to the result of getting the navigation API entry index of reactivatedSHE within navigation.
Queue a global task on the navigation and traversal task source given navigation's relevant global object to run the following steps:
For each disposedNHE of oldNHEs:
Fire an event named dispose
at disposedNHE.
We delay these steps by a task to ensure that dispose
events will fire after the pageshow
event. This ensures
that pageshow
is the first event a page receives upon
reactivation.
(However, the rest of this algorithm runs before the pageshow
event fires. This ensures that navigation.entries()
and navigation.currentEntry
will have correctly-updated
values during any pageshow
event handlers.)
To update the navigation API entries for a same-document navigation given a
Navigation
navigation, a session history entry
destinationSHE, and a NavigationType
navigationType:
If navigation has entries and events disabled, then return.
Let oldCurrentNHE be the current entry of navigation.
Let disposedNHEs be a new empty list.
If navigationType is "traverse
",
then:
Set navigation's current entry index to the result of getting the navigation API entry index of destinationSHE within navigation.
Assert: navigation's current entry index is not −1.
This algorithm is only called for same-document traversals. Cross-document traversals will instead call either initialize the navigation API entries for a new document or update the navigation API entries for reactivation.
Otherwise, if navigationType is "push
", then:
Set navigation's current entry index to navigation's current entry index + 1.
Let i be navigation's current entry index.
While i < navigation's entry list's size:
Append navigation's entry list[i] to disposedNHEs.
Set i to i + 1.
Remove all items in disposedNHEs from navigation's entry list.
Otherwise, if navigationType is "replace
", then:
Append oldCurrentNHE to disposedNHEs.
If navigationType is "push
" or
"replace
", then:
Let newNHE be a new NavigationHistoryEntry
created
in the relevant realm of
navigation.
Set newNHE's session history entry to destinationSHE.
Set navigation's entry list[navigation's current entry index] to newNHE.
If navigation's ongoing API method tracker is non-null, then notify about the committed-to entry given navigation's ongoing API method tracker and the current entry of navigation.
It is important to do this before firing the dispose
or currententrychange
events, since event handlers could
start another navigation, or otherwise change the value of navigation's ongoing
API method tracker.
Prepare to run script given navigation's relevant settings object.
See the discussion for other navigation API events to understand why we do this.
Fire an event named currententrychange
at navigation using
NavigationCurrentEntryChangeEvent
, with its navigationType
attribute
initialized to navigationType and its from
initialized to
oldCurrentNHE.
For each disposedNHE of disposedNHEs:
Fire an event named dispose
at disposedNHE.
Clean up after running script given navigation's relevant settings object.
In implementations, same-document navigations can cause session history entries to be disposed by falling off the back of the session history entry list. This is not yet handled by the above algorithm (or by any other part of this standard). See issue #8620 to track progress on defining the correct behavior in such cases.
NavigationHistoryEntry
interface[Exposed=Window]
interface NavigationHistoryEntry : EventTarget {
readonly attribute USVString? url;
readonly attribute DOMString key;
readonly attribute DOMString id;
readonly attribute long long index;
readonly attribute boolean sameDocument;
any getState();
attribute EventHandler ondispose;
};
entry.url
The URL of this navigation history entry.
This can return null if the entry corresponds to a different Document
than the
current one (i.e., if sameDocument
is false), and that Document
was fetched with a referrer policy of
"no-referrer
" or "origin
", since that indicates
the Document
in question is hiding its URL even from other same-origin pages.
entry.key
A user agent-generated random UUID string representing this navigation history entry's place
in the navigation history list. This value will be reused by other
NavigationHistoryEntry
instances that replace this one due to "replace
" navigations, and will survive reloads and
session restores.
This is useful for navigating back to this entry in the navigation history list, using navigation.traverseTo(key)
.
entry.id
A user agent-generated random UUID string representing this specific navigation history
entry. This value will not be reused by other NavigationHistoryEntry
instances. This value will survive reloads and session restores.
This is useful for associating data with this navigation history entry using other storage APIs.
entry.index
The index of this NavigationHistoryEntry
within navigation.entries()
, or −1 if the entry is not in
the navigation history entry list.
entry.sameDocument
Indicates whether or not this navigation history entry is for the same
Document
as the current one, or not. This will be true, for example, when the entry
represents a fragment navigation or single-page app navigation.
entry.getState()
Returns the deserialization of the state stored
in this entry, which was added to the entry using navigation.navigate()
or navigation.updateCurrentEntry()
. This state
survives reloads and session restores.
Note that in general, unless the state value is a primitive, entry.getState() !== entry.getState()
, since a fresh deserialization is
returned each time.
This state is unrelated to the classic history API's history.state
.
Each NavigationHistoryEntry
has an associated session
history entry, which is a session history entry.
The key of a
NavigationHistoryEntry
nhe is given by the return value of the following
algorithm:
If nhe's relevant global object's associated Document
is not fully
active, then return the empty string.
Return nhe's session history entry's navigation API key.
The ID of a
NavigationHistoryEntry
nhe is given by the return value of the following
algorithm:
If nhe's relevant global object's associated Document
is not fully
active, then return the empty string.
Return nhe's session history entry's navigation API ID.
The index of a
NavigationHistoryEntry
nhe is given by the return value of the following
algorithm:
If nhe's relevant global object's associated Document
is not fully
active, then return −1.
Return the result of getting the navigation API entry index of this's session history entry within this's relevant global object's navigation API.
The url
getter steps are:
Let document be this's relevant global object's associated Document
.
If document is not fully active, then return the empty string.
Let she be this's session history entry.
If she's document does not equal
document, and she's document
state's request referrer
policy is "no-referrer
" or "origin
", then
return null.
Return she's URL, serialized.
The key
getter steps are to return
this's key.
The id
getter steps are to return
this's ID.
The index
getter steps are to return
this's index.
The sameDocument
getter steps are:
Let document be this's relevant global object's associated Document
.
If document is not fully active, then return false.
Return true if this's session history entry's document equals document, and false otherwise.
The getState()
method steps are:
If this's relevant global object's associated Document
is not fully
active, then return undefined.
Return StructuredDeserialize(this's session history entry's navigation API state). Rethrow any exceptions.
This can in theory throw an exception, if attempting to deserialize a large
ArrayBuffer
when not enough memory is available.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by all objects implementing the
NavigationHistoryEntry
interface:
Event handler | Event handler event type |
---|---|
ondispose
| dispose
|
entries = navigation.entries()
Returns an array of NavigationHistoryEntry
instances represent the current
navigation history entry list, i.e., all session history
entries for this navigable that are same origin and contiguous
to the current session history entry.
navigation.currentEntry
Returns the NavigationHistoryEntry
corresponding to the current session history entry.
navigation.updateCurrentEntry({ state })
Updates the navigation API state of the current session history entry, without performing a
navigation like navigation.reload()
would do.
This method is best used to capture updates to the page that have already happened, and need
to be reflected into the navigation API state. For cases where the state update is meant to
drive a page update, instead use navigation.navigate()
or navigation.reload()
, which will trigger a navigate
event.
navigation.canGoBack
Returns true if the current current session
history entry (i.e., currentEntry
) is
not the first one in the navigation history entry list (i.e., in entries()
). This means that there is a previous
session history entry for this navigable, and its document state's origin is same origin with the current
Document
's origin.
navigation.canGoForward
Returns true if the current current session
history entry (i.e., currentEntry
) is
not the last one in the navigation history entry list (i.e., in entries()
). This means that there is a next session
history entry for this navigable, and its document state's origin is same origin with the current
Document
's origin.
The entries()
method steps are:
If this has entries and events disabled, then return the empty list.
Return this's entry list.
Recall that because of Web IDL's sequence type conversion rules, this will
create a new JavaScript array object on each call. That is, navigation.entries() !== navigation.entries()
.
The currentEntry
getter steps are to return the
current entry of this.
The updateCurrentEntry(options)
method steps are:
Let current be the current entry of this.
If current is null, then throw an "InvalidStateError
"
DOMException
.
Let serializedState be
StructuredSerializeForStorage(options["state
"]), rethrowing any
exceptions.
Set current's session history entry's navigation API state to serializedState.
Fire an event named currententrychange
at this using
NavigationCurrentEntryChangeEvent
, with its navigationType
attribute
initialized to null and its from
initialized to current.
The canGoBack
getter steps are:
If this has entries and events disabled, then return false.
Assert: this's current entry index is not −1.
If this's current entry index is 0, then return false.
Return true.
The canGoForward
getter steps are:
If this has entries and events disabled, then return false.
Assert: this's current entry index is not −1.
If this's current entry index is equal to this's entry list's size − 1, then return false.
Return true.
{ committed, finished } = navigation.navigate(url)
{ committed, finished } = navigation.navigate(url, options)
Navigates the current page to the given url. options can contain the following values:
history
can be set to
"replace
" to replace the current
session history entry, instead of pushing a new one.
info
can be set to any value; it
will populate the info
property of the
corresponding NavigateEvent
.
state
can be set to any
serializable value; it will populate the state
retrieved by navigation.currentEntry.getState()
once the
navigation completes, for same-document navigations. (It will be ignored for navigations that
end up cross-document.)
By default this will perform a full navigation (i.e., a cross-document navigation, unless the
given URL differs only in a fragment from the current
one). The navigateEvent.intercept()
method can
be used to convert it into a same-document navigation.
The returned promises will behave as follows:
For navigations that get aborted, both promises will reject with an
"AbortError
" DOMException
.
For same-document navigations created by using the navigateEvent.intercept()
method, committed
will fulfill immediately, and finished
will fulfill or reject according to any
promsies returned by handlers passed to intercept()
.
For other same-document navigations (e.g., non-intercepted fragment navigations), both promises will fulfill immediately.
For cross-document navigations, or navigations that result in 204 or 205 statuses or `Content-Disposition: attachment
` header fields from
the server (and thus do not actually navigate), both promises will never settle.
In all cases, when the returned promises fulfill, it will be with the
NavigationHistoryEntry
that was navigated to.
{ committed, finished } = navigation.reload(options)
Reloads the current page. options can contain info
and state
, which behave as described above.
The default behavior of performing a from-network-or-cache reload of the current page can be
overriden by the using the navigateEvent.intercept()
method. Doing so will mean
this call only updates state or passes along the appropriate info
, plus performing whater actions the navigate
event handlers see fit to carry out.
The returned promises will behave as follows:
If the reload is intercepted by using the navigateEvent.intercept()
method, committed
will fulfill immediately, and finished
will fulfill or reject according to any
promsies returned by handlers passed to intercept()
.
Otherwise, both promises will never settle.
{ committed, finished } = navigation.traverseTo(key)
{ committed, finished } = navigation.traverseTo(key, { info })
Traverses to the closest session
history entry that matches the NavigationHistoryEntry
with the given
key. info
can be set to any value;
it will populate the info
property of the
corresponding NavigateEvent
.
If a traversal to that session history entry is already in progress, then this
will return the promises for that original traversal, and info
will be ignored.
The returned promises will behave as follows:
If there is no NavigationHistoryEntry
in navigation.entries()
whose key
matches key, both promises will
reject with an "InvalidStateError
"
DOMException
.
For same-document traversals intercepted by the navigateEvent.intercept()
method, committed
will fulfill as soon as the traversal
is processed and navigation.currentEntry
is
updated, and finished
will fulfill or
reject according to any promsies returned by the handlers passed to intercept()
.
For non-intercepted same-document travesals, both promises will fulfill as soon as the
traversal is processed and navigation.currentEntry
is updated.
For cross-document traversals, including attempted cross-document traversals that end up
resulting in a 204 or 205 statuses or `Content-Disposition: attachment
` header fields from
the server (and thus do not actually traverse), both promises will never settle.
{ committed, finished } = navigation.back(key)
{ committed, finished } = navigation.back(key, { info })
Traverses to the closest previous session history entry which results in this
navigable traversing, i.e., which corresponds to a different
NavigationHistoryEntry
and thus will cause navigation.currentEntry
to change. info
can be set to any value; it will populate the
info
property of the corresponding
NavigateEvent
.
If a traversal to that session history entry is already in progress, then this
will return the promises for that original traversal, and info
will be ignored.
The returned promises behave equivalently to those returned by traverseTo()
.
{ committed, finished } = navigation.forward(key)
{ committed, finished } = navigation.forward(key, { info })
Traverses to the closest forward session history entry which results in this
navigable traversing, i.e., which corresponds to a different
NavigationHistoryEntry
and thus will cause navigation.currentEntry
to change. info
can be set to any value; it will populate the
info
property of the corresponding
NavigateEvent
.
If a traversal to that session history entry is already in progress, then this
will return the promises for that original traversal, and info
will be ignored.
The returned promises behave equivalently to those returned by traverseTo()
.
The navigate(url, options)
method
steps are:
Let urlRecord be the result of parsing a URL given url, relative to this's relevant settings object.
If urlRecord is failure, then return an early error result for a
"SyntaxError
" DOMException
.
Let document be this's relevant global object's associated Document
.
If options["history
"] is "push
", and the navigation must be a
replace given urlRecord and document, then return an early error result for a
"NotSupportedError
" DOMException
.
Let state be options["state
"], if it exists; otherwise, undefined.
Let serializedState be StructuredSerializeForStorage(state). If this throws an exception, then return an early error result for that exception.
It is importantly to perform this step early, since serialization can invoke web developer code, which in turn might change various things we check in later steps.
If document is not fully active, then return an early error result for an
"InvalidStateError
" DOMException
.
If document's unload counter is greater than 0, then return an
early error result for an
"InvalidStateError
" DOMException
.
Let info be options["info
"], if it exists;
otherwise, undefined.
Let apiMethodTracker be the result of maybe setting the upcoming non-traverse API method tracker for this given info and serializedState.
Navigate document's node
navigable to urlRecord using document, with historyHandling set to options["history
"] and navigationAPIState set to
serializedState.
Unlike location.assign()
and friends,
which are exposed across origin-domain boundaries,
navigation.navigate()
can only be accessed by code
with direct synchronous access to the window.navigation
property. Thus, we avoid the complications about attributing the source document of the
navigation, and we don't need to deal with the allowed by sandboxing to navigate
check and its acccompanying exceptionsEnabled flag. We just
treat all navigations as if they come from the Document
corresponding to this
Navigation
object itself (i.e., document).
If this's upcoming non-traverse API method tracker is apiMethodTracker, then:
If the upcoming non-traverse API method tracker is still
apiMethodTracker, this means that the navigate algorithm bailed out
before ever getting to the inner navigate
event
firing algorithm which would promote that upcoming API method tracker to ongoing.
Set this's upcoming non-traverse API method tracker to null.
Return an early error result for
an "AbortError
" DOMException
.
Return a navigation API method tracker-derived result for apiMethodTracker.
The reload(options)
method steps are:
Let document be this's relevant global object's associated Document
.
Let serializedState be StructuredSerializeForStorage(undefined).
If options["state
"] exists, then set serializedState to
StructuredSerializeForStorage(options["state
"]). If this throws an exception, then
return an early error result for that
exception.
It is importantly to perform this step early, since serialization can invoke web developer code, which in turn might change various things we check in later steps.
Otherwise:
Let current be the current entry of this.
If current is not null, then set serializedState to current's session history entry's navigation API state.
If document is not fully active, then return an early error result for an
"InvalidStateError
" DOMException
.
If document's unload counter is greater than 0, then return an
early error result for an
"InvalidStateError
" DOMException
.
Let info be options["info
"], if it exists;
otherwise, undefined.
Let apiMethodTracker be the result of maybe setting the upcoming non-traverse API method tracker for this given info and serializedState.
Reload document's node navigable with navigationAPIState set to serializedState.
Return a navigation API method tracker-derived result for apiMethodTracker.
The traverseTo(key, options)
method steps are:
If this's current entry
index is −1, then return an early
error result for an "InvalidStateError
"
DOMException
.
If this's entry list does not
contain a NavigationHistoryEntry
whose session history entry's navigation
API key equals key, then return an early error result for an
"InvalidStateError
" DOMException
.
Return the result of performing a navigation API traversal given this, key, and options.
The back(options)
method steps are:
If this's current entry
index is −1 or 0, then return an early error result for an
"InvalidStateError
" DOMException
.
Let key be this's entry list[this's current entry index − 1]'s session history entry's navigation API key.
Return the result of performing a navigation API traversal given this, key, and options.
The forward(options)
method steps are:
If this's current entry
index is −1 or is equal to this's entry list's size −
1, then return an early error result for
an "InvalidStateError
" DOMException
.
Let key be this's entry list[this's current entry index + 1]'s session history entry's navigation API key.
Return the result of performing a navigation API traversal given this, key, and options.
To perform a navigation API traversal
given a Navigation
navigation, a string key, and a
NavigationOptions
options:
Let document be navigation's relevant global object's
associated Document
.
If document is not fully active, then return an early error result for an
"InvalidStateError
" DOMException
.
If document's unload counter is greater than 0, then return an
early error result for an
"InvalidStateError
" DOMException
.
Let current be the current entry of navigation.
If key equals current's session history
entry's navigation API key, then return «[
"committed
" → a promise resolved
with current, "finished
"
→ a promise resolved with current ]».
If navigation's upcoming traverse API method trackers[key] exists, then return a navigation API method tracker-derived result for navigation's upcoming traverse API method trackers[key].
Let info be options["info
"], if it exists;
otherwise, undefined.
Let apiMethodTracker be the result of adding an upcoming traverse API method tracker for navigation given key and info.
Let navigable be document's node navigable.
Let traversable be navigable's traversable navigable.
Let sourceSnapshotParams be the result of snapshotting source snapshot params given document.
Append the following session history traversal steps to traversable:
Let navigableSHEs be the result of getting session history entries given navigable.
Let targetSHE be the session history entry in navigableSHEs whose navigation API key is key. If no such entry exists, then:
Queue a global task on the navigation and traversal task
source given navigation's relevant global object to
reject the finished promise for apiMethodTracker with an
"InvalidStateError
" DOMException
.
Abort these steps.
This path is taken if navigation's entry list was outdated compared to navigableSHEs, which can occur for brief periods while all the relevant threads and processes are being synchronized in reaction to a history change.
If targetSHE is navigable's active session history entry, then abort these steps.
This can occur if a previously queued traversal already took us to this session history entry. In that case the previous traversal will have dealt with apiMethodTracker already.
Let result be the result of applying the traverse history step given by targetSHE's step to traversable, given sourceSnapshotParams,
navigable, and "none
".
If result is "canceled-by-beforeunload
", then
queue a global task on the navigation and traversal task source given
navigation's relevant global object to reject the finished
promise for apiMethodTracker with a new
"AbortError
" DOMException
created in
navigation's relevant realm.
If result is "initiator-disallowed
", then queue a
global task on the navigation and traversal task source given
navigation's relevant global object to reject the finished
promise for apiMethodTracker with a new
"SecurityError
" DOMException
created in
navigation's relevant realm.
When result is "canceled-by-beforeunload
" or "initiator-disallowed
", the navigate
event was never fired, aborting the ongoing
navigation would not be correct; it would result in a navigateerror
event without a preceding navigate
event.
In the "canceled-by-navigate
" case, navigate
is fired, but the inner navigate
event firing algorithm will take care of
aborting the ongoing navigation.
Return a navigation API method tracker-derived result for apiMethodTracker.
An early error result for an exception
e is a NavigationResult
dictionary instance given by «[ "committed
" → a promise rejected with
e, "finished
" → a promise
rejected with e ]».
A navigation API method tracker-derived result for a navigation API method
tracker is a NavigationResult
dictionary instance given by «[ "committed
" → apiMethodTracker's committed promise, "finished
" → apiMethodTracker's finished promise ]».
During any given navigation (in the broad sense of the
word), the Navigation
object needs to keep track of the following:
State | Duration | Explanation |
---|---|---|
The NavigateEvent
| For the duration of event firing | So that if the navigation is canceled while the event is firing, we can cancel the event |
The event's abort controller | Until all promises returned from handlers passed to intercept() have settled
| So that if the navigation is canceled, we can signal abort |
Whether a new element was focused | Until all promises returned from handlers passed to intercept() have settled
| So that if one was, focus is not reset |
The NavigationHistoryEntry being navigated to
| From when it is determined, until all promises returned from handlers passed to intercept() have settled
| So that we know what to resolve any committed and finished promises with
|
Any finished promise that was returned
| Until all promises returned from handlers passed to intercept() have settled
| So that we can resolve or reject it appropriately |
State | Duration | Explanation |
---|---|---|
Any state
| For the duration of event firing | So that we can update the current entry's navigation API state if the event finishes firing without being canceled |
State | Duration | Explanation |
---|---|---|
Any info
| Until the task is queued to fire the navigate event
| So that we can use it to fire the navigate after the trip through the session history traversal queue.
|
Any committed promise that was returned
| Until the session history is updated (inside that same task) | So that we can resolve or reject it appropriately |
Whether intercept() was called
| Until the session history is updated (inside that same task) | So that we can suppress the normal scroll restoration logic in favor of the behavior given by the scroll option
|
We also cannot assume there is only a single navigation requested at any given time, due to web developer code such as:
const p1 = navigation.navigate(url1).finished;
const p2 = navigation.navigate(url2).finished;
That is, in this scenario, we need to ensure that while navigating to url2
, we still have the promise p1
around so that we can
reject it. We can't just get rid of any ongoing navigation promises the moment the second call to
navigate()
happens.
We end up accomplishing all this by associating the following with each
Navigation
:
Ongoing navigate
event, a
NavigateEvent
or null, initially null.
Focus changed during ongoing navigation, a boolean, initially false.
Suppress normal scroll restoration during ongoing navigation, a boolean, initially false.
Ongoing API method tracker, a navigation API method tracker or null, initially null.
Upcoming non-traverse API method tracker, a navigation API method tracker or null, initially null.
Upcoming traverse API method trackers, an ordered map from strings to navigation API method trackers, initially empty.
The state here that is not stored in navigation API method trackers is state which needs to be tracked even for navigations that are not initiated via navigation API methods.
A navigation API method tracker is a struct with the following items:
A navigation object, a
Navigation
A key, a string or null
An info, a JavaScript value
A serialized state, a serialized state or null
A committed-to entry,
a NavigationHistoryEntry
or null
A committed promise, a promise
A finished promise, a promise
All this state is then managed via the following algorithms.
To maybe set the upcoming non-traverse API method tracker given a
Navigation
navigation, a JavaScript value info, and a
serialized state-or-null serializedState:
Let committedPromise and finishedPromise be new promises created in navigation's relevant realm.
Mark as handled finishedPromise.
Let apiMethodTracker be a new navigation API method tracker with:
Assert: navigation's upcoming non-traverse API method tracker is null.
If navigation does not have entries and events disabled, then set navigation's upcoming non-traverse API method tracker to apiMethodTracker.
If navigation has entries and events disabled, then
committedPromise and finishedPromise will never fulfill (since we never
create a NavigationHistoryEntry
object for such Document
s, and so we
have nothing to resolve them with); there is no NavigationHistoryEntry
to apply
serializedState to; and there is no navigate
event to include info with. So, we don't need to track this API method call after
all.
Return apiMethodTracker.
To add an upcoming traverse API method tracker given a Navigation
navigation, a string destinationKey, and a JavaScript value
info:
Let committedPromise and finishedPromise be new promises created in navigation's relevant realm.
Mark as handled finishedPromise.
See the previous discussion about why this is done.
Let apiMethodTracker be a new navigation API method tracker with:
Set navigation's upcoming traverse API method trackers[key] to apiMethodTracker.
Return apiMethodTracker.
To promote an upcoming API method tracker to ongoing given a Navigation
navigation and a string-or-null destinationKey:
Assert: navigation's ongoing API method tracker is null.
If destinationKey is not null, then:
Assert: navigation's upcoming non-traverse API method tracker is null.
If navigation's upcoming traverse API method trackers[destinationKey] exists, then:
Set navigation's ongoing API method tracker to navigation's upcoming traverse API method trackers[destinationKey].
Remove navigation's upcoming traverse API method trackers[destinationKey].
Otherwise:
Set navigation's ongoing API method tracker to navigation's upcoming non-traverse API method tracker.
Set navigation's upcoming non-traverse API method tracker to null.
To clean up a navigation API method tracker apiMethodTracker:
Let navigation be apiMethodTracker's navigation object.
If navigation's ongoing API method tracker is apiMethodTracker, then set navigation's ongoing API method tracker to null.
Otherwise:
Let key be apiMethodTracker's key.
Assert: key is not null.
Assert: navigation's upcoming traverse API method trackers[key] exists.
Remove navigation's upcoming traverse API method trackers[key].
To notify about the committed-to entry given a navigation API method
tracker apiMethodTracker and a NavigationHistoryEntry
nhe:
Set apiMethodTracker's committed-to entry to nhe.
If apiMethodTracker's serialized state is not null, then set nhe's session history entry's navigation API state to apiMethodTracker's serialized state.
If it's null, then we're traversing to nhe via navigation.traverseTo()
, which does not allow changing
the state.
At this point, apiMethodTracker's serialized state is no longer needed. Implementations might want to clear it out to avoid keeping it alive for the lifetime of the navigation API method tracker.
Resolve apiMethodTracker's committed promise with nhe.
At this point, apiMethodTracker's committed promise is only needed in cases where it has not yet been returned to author code. Implementations might want to clear it out to avoid keeping it alive for the lifetime of the navigation API method tracker.
To resolve the finished promise for a navigation API method tracker apiMethodTracker:
Resolve apiMethodTracker's committed promise with its committed-to entry.
Usually, notify about the committed-to entry has previously been called on apiMethodTracker, and so this will do nothing. However, in some cases resolve the finished promise is called directly, in which case this step is necessary.
Resolve apiMethodTracker's finished promise with its committed-to entry.
Clean up apiMethodTracker.
To reject the finished promise for a navigation API method tracker apiMethodTracker with a JavaScript value exception:
Reject apiMethodTracker's committed promise with exception.
This will do nothing if apiMethodTracker's committed promise was previously resolved via notify about the committed-to entry.
Reject apiMethodTracker's finished promise with exception.
Clean up apiMethodTracker.
To abort the ongoing navigation given a Navigation
navigation and an optional DOMException
error:
Let event be navigation's ongoing navigate
event.
Assert: event is not null.
Set navigation's focus changed during ongoing navigation to false.
Set navigation's suppress normal scroll restoration during ongoing navigation to false.
If error was not given, then let error be a new
"AbortError
" DOMException
created in
navigation's relevant realm.
If event's dispatch flag is set, then set event's canceled flag to true.
Signal abort on event's abort controller given error.
Set navigation's ongoing navigate
event to null.
Let errorInfo be the result of extracting error information from error.
For example, if this algorithm is reached because of a call to window.stop()
, these properties would probably end up
initialized based on the line of script that called window.stop()
. But if it's because the user clicked the stop
button, these properties would probably end up with default values like the empty string or
0.
Fire an event named navigateerror
at navigation using
ErrorEvent
, with additional attributes initialized according to
errorInfo.
If navigation's ongoing API method tracker is non-null, then reject the finished promise for apiMethodTracker with error.
If navigation's transition is not null, then:
Reject navigation's transition's finished promise with error.
Set navigation's transition to null.
To inform the navigation API about aborting navigation in a navigable navigable:
If this algorithm is running on navigable's active window's relevant agent's event loop, then continue on to the following steps. Otherwise, queue a global task on the navigation and traversal task source given navigable's active window to run the following steps.
Let navigation be navigable's active window's navigation API.
If navigation's ongoing navigate
event is null, then return.
Abort the ongoing navigation given navigation.
To inform the navigation API about child navigable destruction given a navigable navigable:
Inform the navigation API about aborting navigation in navigable.
Let navigation be navigable's active window's navigation API.
Let traversalAPIMethodTrackers be a clone of navigation's upcoming traverse API method trackers.
For each apiMethodTracker of
traversalAPIMethodTrackers: reject the finished promise for
apiMethodTracker with a new "AbortError
"
DOMException
created in navigation's relevant realm.
The ongoing navigation concept is most-directly exposed to web developers through the navigation.transition
property, which is an instance of
the NavigationTransition
interface:
[Exposed=Window]
interface NavigationTransition {
readonly attribute NavigationType navigationType;
readonly attribute NavigationHistoryEntry from;
readonly attribute Promise<undefined> finished;
};
navigation.transition
A NavigationTransition
representing any ongoing navigation that hasn't yet
reached the navigatesuccess
or navigateerror
stage, if one exists; or null, if there is no
such transition ongoing.
Since navigation.currentEntry
(and other
properties like location.href
) are updated immediately
upon navigation, this navigation.transition
property is useful for determining when such navigations are not yet fully settled, according to
any handlers passed to navigateEvent.intercept()
.
navigation.transition.navigationType
One of "push
", "replace
", "reload
", or "traverse
", indicating what type of navigation this
transition is for.
navigation.transition.from
The NavigationHistoryEntry
from which the transition is coming. This can be
useful to compare against navigation.currentEntry
.
navigation.transition.finished
A promise which fulfills at the same time as the navigatesuccess
fires, or rejects at the same time the
navigateerror
event fires.
Each Navigation
has a transition, which is a
NavigationTransition
or null, initially null.
The transition
getter steps are to return
this's transition.
Each NavigationTransition
has an associated navigation type, which is a
NavigationType
.
Each NavigationTransition
has an associated from entry, which is a
NavigationHistoryEntry
.
Each NavigationTransition
has an associated finished promise, which is a promise.
The navigationType
getter steps are to
return this's navigation
type.
The from
getter steps are to return
this's from entry.
The finished
getter steps are to return
this's finished
promise.
NavigationActivation
interface[Exposed=Window]
interface NavigationActivation {
readonly attribute NavigationHistoryEntry? from;
readonly attribute NavigationHistoryEntry entry;
readonly attribute NavigationType navigationType;
};
navigation.activation
A NavigationActivation
containing information about the most recent
cross-document navigation, the navigation that "activated" this Document
.
While navigation.currentEntry
and the
Document
's URL can be updated regularly
due to same-document navigations, navigation.activation
stays constant, and its properties
are only updated if the Document
is reactivated from history.
navigation.activation.entry
A NavigationHistoryEntry
, equivalent to the value of the navigation.currentEntry
property at the moment the
Document
was activated.
navigation.activation.from
A NavigationHistoryEntry
, representing the Document
that was active
right before the current Document
. This will have a value null in case the
previous Document
was not same origin with this one or if it was the
initial about:blank
Document
.
There are some cases in which either the from
or entry
NavigationHistoryEntry
objects
would not be viable targets for the traverseTo()
method, as they might not be retained in history. For example, the Document
can be
activated using location.replace()
or its initial
entry could be replaced by history.replaceState()
. However, those entries' url
property and getState()
method are still accessible.
navigation.activation.navigationType
One of "push
", "replace
", "reload
", or "traverse
", indicating what type of navigation
activated this Document
.
Each Navigation
has an associated activation, which is null or a
NavigationActivation
object, initially null.
Each NavigationActivation
has:
old entry, null or a
NavigationHistoryEntry
.
new entry, null or a
NavigationHistoryEntry
.
navigation type, a
NavigationType
.
The activation
getter steps are to return
this's activation.
The from
getter steps are to return
this's old entry.
The entry
getter steps are to return
this's new entry.
The navigationType
getter steps are to
return this's navigation type.
navigate
eventA major feature of the navigation API is the navigate
event. This event is fired on any navigation (in the broad sense of
the word), allowing web developers to monitor such outgoing navigations. In many cases, the
event is cancelable
, which allows preventing the
navigation from happening. And in others, the navigation can be intercepted and replaced with a
same-document navigation by using the intercept()
method of the NavigateEvent
class.
NavigateEvent
interface[Exposed=Window]
interface NavigateEvent : Event {
constructor(DOMString type, NavigateEventInit eventInitDict);
readonly attribute NavigationType navigationType;
readonly attribute NavigationDestination destination;
readonly attribute boolean canIntercept;
readonly attribute boolean userInitiated;
readonly attribute boolean hashChange;
readonly attribute AbortSignal signal;
readonly attribute FormData
? formData;
readonly attribute DOMString? downloadRequest;
readonly attribute any info;
readonly attribute boolean hasUAVisualTransition;
undefined intercept(optional NavigationInterceptOptions options = {});
undefined scroll();
};
dictionary NavigateEventInit : EventInit {
NavigationType navigationType = "push";
required NavigationDestination destination;
boolean canIntercept = false;
boolean userInitiated = false;
boolean hashChange = false;
required AbortSignal signal;
FormData? formData = null;
DOMString? downloadRequest = null;
any info;
boolean hasUAVisualTransition = false;
};
dictionary NavigationInterceptOptions {
NavigationInterceptHandler handler;
NavigationFocusReset focusReset;
NavigationScrollBehavior scroll;
};
enum NavigationFocusReset {
"after-transition",
"manual"
};
enum NavigationScrollBehavior {
"after-transition",
"manual"
};
callback NavigationInterceptHandler = Promise<undefined> ();
event.navigationType
One of "push
", "replace
", "reload
", or "traverse
", indicating what type of navigation this
is.
event.destination
A NavigationDestination
representing the destination of the
navigation.
event.canIntercept
True if intercept()
can be called to
intercept this navigation and convert it into a same-document navigation, replacing its usual
behavior; false otherwise.
Generally speaking, this will be true whenever the current Document
can
have its URL rewritten to the destination URL, except for in the case of cross-document
"traverse
" navigations, where it will always
be false.
event.userInitiated
True if this navigation was due to a user clicking on an a
element,
submitting a form
element, or using the browser UI
to navigate; false otherwise.
event.hashChange
True for a fragment navigation; false otherwise.
event.signal
An AbortSignal
which will become aborted if the navigation gets canceled, e.g.,
by the user pressing their browser's "Stop" button, or by another navigation interrupting this
one.
The expected pattern is for developers to pass this along to any async operations, such as
fetch()
, which they perform as part of handling this navigation.
event.formData
The FormData
representing the submitted form entries for this navigation, if
this navigation is a "push
" or "replace
" navigation representing a POST form submission; null otherwise.
(Notably, this will be null even for "reload
"
or "traverse
" navigations that are revisiting
a session history entry that was originally created from a form submission.)
event.downloadRequest
Represents whether or not this navigation was requested to be a download, by using an
a
or area
element's download
attribute:
If a download was not requested, then this property is null.
If a download was requested, returns the filename that was supplied as the download
attribute's value. (This could be the empty
string.)
Note that a download being requested does not always mean that a download will happen: for
example, a download might be blocked by browser security policies, or end up being treated as a
"push
" navigation for unspecified reasons.
Similarly, a navigation might end up being a download even if it was not requested to be one,
due to the destination server responding with a `Content-Disposition: attachment
` header.
Finally, note that the navigate
event will not fire at
all for downloads initiated using browser UI affordances, e.g., those created by right-clicking
and choosing to save the target of a link.
event.info
An arbitrary JavaScript value passed via one of the navigation API methods which initiated this navigation, or undefined if the navigation was initiated by the user or by a different API.
event.hasUAVisualTransition
Returns true if the user agent performed a visual transition for this navigation before dispatching this event. If true, the best user experience will be given if the author synchronously updates the DOM to the post-navigation state.
event.intercept({ handler, focusReset, scroll })
Intercepts this navigation, preventing its normal handling and instead converting it into a same-document navigation of the same type to the destination URL.
The handler
option can be a
function that returns a promise. The handler function will run after the navigate
event has finished firing, and the navigation.currentEntry
property has been
synchronously updated. This returned promise is used to signal the duration, and success or
failure, of the navigation. After it settles, the browser signals to the user (e.g., via a
loading spinner UI, or assistive technology) that the navigation is finished. Additionally, it
fires navigatesuccess
or navigateerror
events as appropriate, which other parts of
the web application can respond to.
By default, using this method will cause focus to reset when any handlers' returned promises
settle. Focus will be reset to the first element with the autofocus
attribute set, or the body element if
the attribute isn't present. The focusReset
option can be set to "manual
" to avoid this behavior.
By default, using this method will delay the browser's scroll restoration logic for "traverse
" or "reload
" navigations, or its
scroll-reset/scroll-to-a-fragment logic for "push
"
or "replace
" navigations, until any handlers'
returned promises settle. The scroll
option can be set to "manual
" to turn
off any browser-driven scroll behavior entirely for this navigation, or scroll()
can be called before the promise settles to
trigger this behavior early.
This method will throw a "SecurityError
" DOMException
if canIntercept
is false, or if isTrusted
is false. It will throw an
"InvalidStateError
" DOMException
if not called
synchronously, during event dispatch.
event.scroll()
For "traverse
" or "reload
" navigations, restores the scroll position
using the browser's usual scroll restoration logic.
For "push
" or "replace
" navigations, either resets the scroll
position to the top of the document or scrolls to the fragment specified by destination.url
if there is one.
If called more than once, or called after automatic post-transition scroll processing has
happened due to the scroll
option
being left as "after-transition
", or called
before the navigation has committed, this method will throw an
"InvalidStateError
" DOMException
.
Each NavigateEvent
has an interception state, which is either "none
", "intercepted
", "committed
",
"scrolled
", or "finished
", initially "none
".
Each NavigateEvent
has a navigation handler list, a
list of NavigationInterceptHandler
callbacks, initially empty.
Each NavigateEvent
has a focus
reset behavior, a NavigationFocusReset
-or-null, initially null.
Each NavigateEvent
has a scroll
behavior, a NavigationScrollBehavior
-or-null, initially null.
Each NavigateEvent
has an abort controller, an
AbortController
-or-null, initially null.
Each NavigateEvent
has a classic history API state, a
serialized state or null. It is only used in some cases where the event's navigationType
is "push
" or "replace
", and is set appropriately when the event is
fired.
The navigationType
, destination
, canIntercept
, userInitiated
,
hashChange
, signal
, formData
, downloadRequest
, info
, and hasUAVisualTransition
attributes
must return the values they are initialized to.
The intercept(options)
method steps
are:
Perform shared checks given this.
If this's canIntercept
attribute was initialized to false, then throw a "SecurityError
"
DOMException
.
If this's dispatch flag is unset, then throw an
"InvalidStateError
" DOMException
.
Assert: this's interception state is either "none
" or "intercepted
".
Set this's interception state to "intercepted
".
If options["handler
"] exists, then append it to this's
navigation handler
list.
If options["focusReset
"] exists, then:
If this's focus reset
behavior is not null, and it is not equal to options["focusReset
"], then the user agent may
report a warning to the console indicating that the focusReset
option for a previous call
to intercept()
was overridden by this new
value, and the previous value will be ignored.
Set this's focus reset
behavior to options["focusReset
"].
If options["scroll
"]
exists, then:
If this's scroll
behavior is not null, and it is not equal to options["scroll
"], then the user agent may
report a warning to the console indicating that the scroll
option for a previous call to
intercept()
was overridden by this new value,
and the previous value will be ignored.
Set this's scroll
behavior to options["scroll
"].
The scroll()
method steps are:
Perform shared checks given this.
If this's interception state is not "committed
", then throw an "InvalidStateError
"
DOMException
.
Process scroll behavior given this.
To perform shared checks for a
NavigateEvent
event:
If event's relevant global object's associated Document
is not fully
active, then throw an "InvalidStateError
"
DOMException
.
If event's isTrusted
attribute was
initialized to false, then throw a "SecurityError
"
DOMException
.
If event's canceled flag is set, then throw an
"InvalidStateError
" DOMException
.
NavigationDestination
interface[Exposed=Window]
interface NavigationDestination {
readonly attribute USVString url;
readonly attribute DOMString key;
readonly attribute DOMString id;
readonly attribute long long index;
readonly attribute boolean sameDocument;
any getState();
};
event.destination.url
The URL being navigated to.
event.destination.key
The value of the key
property of the
destination NavigationHistoryEntry
, if this is a "traverse
" navigation, or the empty string otherwise.
event.destination.id
The value of the id
property of the
destination NavigationHistoryEntry
, if this is a "traverse
" navigation, or the empty string otherwise.
event.destination.index
The value of the index
property of
the destination NavigationHistoryEntry
, if this is a "traverse
" navigation, or −1 otherwise.
event.destination.sameDocument
Indicates whether or not this navigation is to the same Document
as the current
one, or not. This will be true, for example, in the case of fragment navigations or history.pushState()
navigations.
Note that this property indicates the original nature of the navigation. If a cross-document
navigation is converted into a same-document navigation using navigateEvent.intercept()
, that will not change the
value of this property.
event.destination.getState()
For "traverse
" navigations, returns the
deserialization of the state stored in the
destination session history entry.
For "push
" or "replace
" navigations, returns the deserialization of the state passed to navigation.navigate()
, if the navigation was initiated
by that method, or undefined it if it wasn't.
For "reload
" navigations, returns the deserialization of the state passed to navigation.reload()
, if the reload was initiated by that
method, or undefined it if it wasn't.
Each NavigationDestination
has a URL, which is a URL.
Each NavigationDestination
has an entry, which is a
NavigationHistoryEntry
or null.
It will be non-null if and only if the NavigationDestination
corresponds to a "traverse
" navigation.
Each NavigationDestination
has a state, which is a serialized
state.
Each NavigationDestination
has an is same document, which is a
boolean.
The url
getter steps are to return
this's URL, serialized.
The key
getter steps are:
If this's entry is null, then return the empty string.
Return this's entry's key.
The id
getter steps are:
If this's entry is null, then return the empty string.
Return this's entry's ID.
The index
getter steps are:
If this's entry is null, then return −1.
Return this's entry's index.
The sameDocument
getter steps are to
return this's is same
document.
The getState()
method steps are to return
StructuredDeserialize(this's state).
Other parts of the standard fire the navigate
event,
through a series of wrapper algorithms given in this section.
To fire a traverse navigate
event at a
Navigation
navigation given a session history entry destinationSHE and an optional
user navigation involvement userInvolvement (default "none
"):
Let event be the result of creating an event given
NavigateEvent
, in navigation's relevant realm.
Set event's classic history API state to null.
Let destination be a new NavigationDestination
created in navigation's relevant
realm.
Set destination's URL to destinationSHE's URL.
Let destinationNHE be the NavigationHistoryEntry
in
navigation's entry list whose session history entry is destinationSHE, or null if no such
NavigationHistoryEntry
exists.
If destinationNHE is non-null, then:
Set destination's entry to destinationNHE.
Set destination's state to destinationSHE's navigation API state.
Otherwise,
Set destination's entry to null.
Set destination's state to StructuredSerializeForStorage(null).
Set destination's is
same document to true if destinationSHE's document is equal to navigation's relevant global
object's associated Document
;
otherwise false.
Return the result of performing the inner navigate
event firing algorithm given
navigation, "traverse
",
event, destination, userInvolvement, null, and null.
To fire a push/replace/reload navigate
event at
a Navigation
navigation given a NavigationType
navigationType, a URL destinationURL, a boolean isSameDocument, an optional user
navigation involvement userInvolvement (default "none
"), an optional entry list-or-null formDataEntryList (default null), an
optional serialized state navigationAPIState (default
StructuredSerializeForStorage(null)), and an optional serialized
state-or-null classicHistoryAPIState (default
null):
Let event be the result of creating an event given
NavigateEvent
, in navigation's relevant realm.
Set event's classic history API state to classicHistoryAPIState.
Let destination be a new NavigationDestination
created in navigation's relevant
realm.
Set destination's URL to destinationURL.
Set destination's entry to null.
Set destination's state to navigationAPIState.
Set destination's is same document to isSameDocument.
Return the result of performing the inner navigate
event firing algorithm given
navigation, navigationType, event, destination,
userInvolvement, formDataEntryList, and null.
To fire a download request navigate
event at a
Navigation
navigation given a URL destinationURL, a user
navigation involvement userInvolvement, and a string
filename:
Let event be the result of creating an event given
NavigateEvent
, in navigation's relevant realm.
Set event's classic history API state to null.
Let destination be a new NavigationDestination
created in navigation's relevant
realm.
Set destination's URL to destinationURL.
Set destination's entry to null.
Set destination's state to StructuredSerializeForStorage(null).
Set destination's is same document to false.
Return the result of performing the inner navigate
event firing algorithm given
navigation, "push
", event,
destination, userInvolvement, null, and filename.
The inner navigate
event firing algorithm
consists of the following steps, given a Navigation
navigation, a
NavigationType
navigationType, a NavigateEvent
event, a NavigationDestination
destination, a user
navigation involvement userInvolvement, an entry list-or-null
formDataEntryList, and a string-or-null downloadRequestFilename:
If navigation has entries and events disabled, then:
Assert: navigation's ongoing API method tracker is null.
Assert: navigation's upcoming non-traverse API method tracker is null.
Assert: navigation's upcoming traverse API method trackers is empty.
Return true.
These assertions holds because traverseTo()
, back()
, and forward()
will immediately fail when entries and events
are disabled (since there are no entries to traverse to), and if our starting point is instead
navigate()
or reload()
, then we avoided setting the
upcoming non-traverse API method tracker in the first place.
Let destinationKey be null.
If destination's entry is non-null, then set destinationKey to destination's entry's key.
Assert: destinationKey is not the empty string.
Promote an upcoming API method tracker to ongoing given navigation and destinationKey.
Let apiMethodTracker be navigation's ongoing API method tracker.
Let navigable be navigation's relevant global object's navigable.
Let document be navigation's relevant global object's
associated Document
.
If document can have its URL rewritten to destination's
URL, and either destination's
is same document is true or
navigationType is not "traverse
",
then initialize event's canIntercept
to true. Otherwise, initialize it to
false.
If either:
navigationType is not "traverse
"; or
traverseCanBeCanceled is true,
then initialize event's cancelable
to
true. Otherwise, initialize it to false.
Initialize event's type
to "navigate
".
Initialize event's navigationType
to
navigationType.
Initialize event's destination
to destination.
Initialize event's downloadRequest
to
downloadRequestFilename.
If apiMethodTracker is not null, then initialize event's info
to apiMethodTracker's info. Otherwise, initialize it to
undefined.
At this point apiMethodTracker's info is no longer needed and can be nulled out instead of keeping it alive for the lifetime of the navigation API method tracker.
Initialize event's hasUAVisualTransition
to true if a visual
transition, to display a cached rendered state of the document's latest
entry, was done by the user agent. Otherwise, initialize it to false.
Set event's abort
controller to a new AbortController
created in
navigation's relevant realm.
Initialize event's signal
to
event's abort
controller's signal.
Let currentURL be document's URL.
If all of the following are true:
event's classic history API state is null;
destination's is same document is true;
destination's URL equals currentURL with exclude fragments set to true; and
destination's URL's fragment is not identical to currentURL's fragment,
then initialize event's hashChange
to true. Otherwise, initialize it to
false.
The first condition here means that hashChange
will be true for fragment navigations, but false for cases like history.pushState(undefined, "", "#fragment")
.
If userInvolvement is not "none
", then
initialize event's userInitiated
to true. Otherwise, initialize it to false.
If formDataEntryList is not null, then initialize event's formData
to a new FormData
created in navigation's relevant realm,
associated to formDataEntryList. Otherwise, initialize it to null.
Assert: navigation's ongoing navigate
event is null.
Set navigation's ongoing navigate
event to event.
Set navigation's focus changed during ongoing navigation to false.
Set navigation's suppress normal scroll restoration during ongoing navigation to false.
Let dispatchResult be the result of dispatching event at navigation.
If dispatchResult is false:
If navigationType is "traverse
", then consume history-action user
activation given navigation's relevant global object.
If event's abort controller's signal is not aborted, then abort the ongoing navigation given navigation.
Return false.
Let endResultIsSameDocument be true if event's interception state is not "none
" or event's destination
's is same document is true.
Prepare to run script given navigation's relevant settings object.
If event's interception
state is not "none
":
Set event's interception state to "committed
".
Let fromNHE be the current entry of navigation.
Assert: fromNHE is not null.
Set navigation's transition to a new
NavigationTransition
created in navigation's relevant realm, whose navigation type is
navigationType, whose from entry
is fromNHE, and whose finished
promise is a new promise created in navigation's relevant realm.
Mark as handled navigation's transition's finished promise.
See the discussion about other finished promises to understand why this is done.
If navigationType is "traverse
", then set navigation's
suppress normal scroll restoration during ongoing navigation to true.
If event's scroll
behavior was set to "after-transition
", then scroll
restoration will happen as part of finishing the
relevant NavigateEvent
. Otherwise, there will be no scroll restoration. That is,
no navigation which is intercepted by intercept()
goes through the normal scroll
restoration process; scroll restoration for such navigations is either done manually, by the
web developer, or is done after the transition.
If navigationType is "push
" or
"replace
", then run the URL and history
update steps given document and event's destination
's URL, with serialiedData set to event's classic history API state and
historyHandling set to navigationType.
If navigationType is "reload
",
then we are converting a reload into a "same-document reload", for which the
URL and history update steps are not appropriate. Navigation API-related stuff
still happens, such as updating the active session
history entry's navigation API state if
this was caused by a call to navigation.reload()
,
and all the ongoing navigation tracking.
If navigationType is "traverse
", then this event firing is happening as
part of the traversal process, and that
process will take care of performing the appropriate session history entry updates.
If endResultIsSameDocument is true:
Let promisesList be an empty list.
For each handler of event's navigation handler list:
Append the result of invoking handler with an empty arguments list to promisesList.
If promisesList's size is 0, then set promisesList to « a promise resolved with undefined ».
There is a subtle timing difference between how waiting for all schedules its success and failure steps when given zero promises
versus ≥1 promises. For most uses of waiting for all,
this does not matter. However, with this API, there are so many events and promise handlers
which could fire around the same time that the difference is pretty easily observable: it can
cause the event/promise handler sequence to vary. (Some of the events and promises involved
include: navigatesuccess
/ navigateerror
, currententrychange
, dispose
, apiMethodTracker's promises, and the navigation.transition.finished
promise.)
Wait for all of promisesList, with the following success steps:
If event's relevant global object is not fully active, then abort these steps.
If event's abort controller's signal is aborted, then abort these steps.
Assert: event equals navigation's ongoing
navigate
event.
Set navigation's ongoing navigate
event to null.
Finish event given true.
Fire an event named navigatesuccess
at navigation.
If apiMethodTracker is non-null, then resolve the finished promise for apiMethodTracker.
If navigation's transition is not null, then resolve navigation's transition's finished promise with undefined.
Set navigation's transition to null.
and the following failure steps given reason rejectionReason:
If event's relevant global object is not fully active, then abort these steps.
If event's abort controller's signal is aborted, then abort these steps.
Assert: event equals navigation's ongoing
navigate
event.
Set navigation's ongoing navigate
event to null.
Finish event given false.
Let errorInfo be the result of extracting error information from rejectionReason.
Fire an event named navigateerror
at navigation using
ErrorEvent
, with additional attributes initialized according to
errorInfo.
If apiMethodTracker is non-null, then reject the finished promise for apiMethodTracker with rejectionReason.
If navigation's transition is not null, then reject navigation's transition's finished promise with rejectionReason.
Set navigation's transition to null.
Otherwise, if apiMethodTracker is non-null, then clean up apiMethodTracker.
Clean up after running script given navigation's relevant settings object.
Per the previous note, this stops suppressing any potential promise handler microtasks, causing them to run at this point or later.
If event's interception
state is "none
", then return true.
Return false.
By calling navigateEvent.intercept()
, web
developers can suppress the normal scroll and focus behavior for same-document navigations,
instead invoking cross-document navigation-like behavior at a later time. The algorithms in this
section are called at those appropriate later points.
To finish a NavigateEvent
event, given a boolean didFulfill:
Assert: event's interception state is not "intercepted
" or "finished
".
If event's interception
state is "none
", then return.
Potentially reset the focus given event.
If didFulfill is true, then potentially process scroll behavior given event.
Set event's interception state to "finished
".
To potentially reset the focus given a NavigateEvent
event:
Assert: event's interception state is "committed
" or "scrolled
".
Let navigation be event's relevant global object's navigation API.
Let focusChanged be navigation's focus changed during ongoing navigation.
Set navigation's focus changed during ongoing navigation to false.
If focusChanged is true, then return.
If event's focus reset
behavior is "manual
", then
return.
If it was left as null, then we treat that as "after-transition
", and continue
onward.
Let document be event's relevant global object's associated Document
.
Let focusTarget be the autofocus delegate for document.
If focusTarget is null, then set focusTarget to document's body element.
If focusTarget is null, then set focusTarget to document's document element.
Run the focusing steps for focusTarget, with document's viewport as the fallback target.
Move the sequential focus navigation starting point to focusTarget.
To potentially process scroll behavior given a NavigateEvent
event:
Assert: event's interception state is "committed
" or "scrolled
".
If event's interception
state is "scrolled
", then return.
If event's scroll behavior is
"manual
", then return.
If it was left as null, then we treat that as "after-transition
", and continue
onward.
Process scroll behavior given event.
To process scroll behavior given a NavigateEvent
event:
Assert: event's interception state is "committed
".
Set event's interception state to "scrolled
".
If event's navigationType
was initialized to "traverse
" or "reload
", then restore scroll position data
given event's relevant global object's navigable's active session history
entry.
Otherwise:
Let document be event's relevant global object's
associated Document
.
If document's indicated part is null, then scroll to the beginning of the document given document. CSSOMVIEW
Otherwise, scroll to the fragment given document.
The NavigateEvent
interface has its own
dedicated section, due to its complexity.
NavigationCurrentEntryChangeEvent
interface[Exposed=Window]
interface NavigationCurrentEntryChangeEvent : Event {
constructor(DOMString type, NavigationCurrentEntryChangeEventInit eventInitDict);
readonly attribute NavigationType? navigationType;
readonly attribute NavigationHistoryEntry from;
};
dictionary NavigationCurrentEntryChangeEventInit : EventInit {
NavigationType? navigationType = null;
required NavigationHistoryEntry from;
};
event.navigationType
Returns the type of navigation which caused the current entry to change, or null if the
change is due to navigation.updateCurrentEntry()
.
event.from
Returns the previous value of navigation.currentEntry
, before the current entry
changed.
If navigationType
is null or "reload
", then this value will be the
same as navigation.currentEntry
. In that case,
the event signifies that the contents of the entry changed, even if we did not move to a new
entry or replace the current one.
The navigationType
and from
attributes must return the
values they were initialized to.
PopStateEvent
interface[Exposed=Window]
interface PopStateEvent : Event {
constructor(DOMString type, optional PopStateEventInit eventInitDict = {});
readonly attribute any state;
readonly attribute boolean hasUAVisualTransition;
};
dictionary PopStateEventInit : EventInit {
any state = null;
boolean hasUAVisualTransition = false;
};
event.state
Returns a copy of the information that was provided to pushState()
or replaceState()
.
event.hasUAVisualTransition
Returns true if the user agent performed a visual transition for this navigation before dispatching this event. If true, the best user experience will be given if the author synchronously updates the DOM to the post-navigation state.
The state
attribute must return the value it was
initialized to. It represents the context information for the event, or null, if the state
represented is the initial state of the Document
.
The
hasUAVisualTransition
attribute must return the value it was initialized to.
HashChangeEvent
interface[Exposed=Window]
interface HashChangeEvent : Event {
constructor(DOMString type, optional HashChangeEventInit eventInitDict = {});
readonly attribute USVString oldURL;
readonly attribute USVString newURL;
};
dictionary HashChangeEventInit : EventInit {
USVString oldURL = "";
USVString newURL = "";
};
event.oldURL
Returns the URL of the session history entry that was previously current.
event.newURL
Returns the URL of the session history entry that is now current.
The oldURL
attribute must return the value it was
initialized to. It represents context information for the event, specifically the URL of the
session history entry that was traversed from.
The newURL
attribute must return the value it was
initialized to. It represents context information for the event, specifically the URL of the
session history entry that was traversed to.
PageSwapEvent
interface[Exposed=Window]
interface PageSwapEvent : Event {
constructor(DOMString type, optional PageSwapEventInit eventInitDict = {});
readonly attribute NavigationActivation
? activation;
readonly attribute ViewTransition
? viewTransition;
};
dictionary PageSwapEventInit : EventInit {
NavigationActivation? activation = null;
ViewTransition
? viewTransition = null;
};
event.activation
A NavigationActivation
object representing the destination and type of the
cross-document navigation. This would be null for cross-origin navigations.
event.activation.entry
A NavigationHistoryEntry
, representing the Document
that is
about to become active.
event.activation.from
A NavigationHistoryEntry
, equivalent to the value of the navigation.currentEntry
property at the moment the
event is fired.
event.activation.navigationType
One of "push
", "replace
", "reload
", or "traverse
", indicating what type of navigation
that is about to result in a page swap.
event.viewTransition
Returns the ViewTransition
object that represents an outbound cross-document view
transition, if such transition is active when the event is fired. Otherwise, returns null.
The activation
and viewTransition
attributes must return
the values they were initialized to.
PageRevealEvent
interface[Exposed=Window]
interface PageRevealEvent : Event {
constructor(DOMString type, optional PageRevealEventInit eventInitDict = {});
readonly attribute ViewTransition
? viewTransition;
};
dictionary PageRevealEventInit : EventInit {
ViewTransition
? viewTransition = null;
};
event.viewTransition
Returns the ViewTransition
object that represents an inbound cross-document view
transition, if such transition is active when the event is fired. Otherwise, returns null.
The viewTransition
attribute must return the
value it was initialized to.
PageTransitionEvent
interface[Exposed=Window]
interface PageTransitionEvent : Event {
constructor(DOMString type, optional PageTransitionEventInit eventInitDict = {});
readonly attribute boolean persisted;
};
dictionary PageTransitionEventInit : EventInit {
boolean persisted = false;
};
event.persisted
For the pageshow
event, returns false if the page is
newly being loaded (and the load
event will fire). Otherwise,
returns true.
For the pagehide
event, returns false if the page is
going away for the last time. Otherwise, returns true, meaning that the page might be reused if
the user navigates back to this page (if the Document
's salvageable state stays true).
Things that can cause the page to be unsalvageable include:
The user agent decided to not keep the Document
alive in a session
history entry after unload
Having iframe
s that are not salvageable
Active WebSocket
objects
Aborting a Document
The persisted
attribute must return the value
it was initialized to. It represents the context information for the event.
To fire a page transition event named eventName at a Window
window with a boolean persisted, fire
an event named eventName at window, using
PageTransitionEvent
, with the persisted
attribute initialized to
persisted, the cancelable
attribute
initialized to true, the bubbles
attribute initialized to
true, and legacy target override flag set.
The values for cancelable
and bubbles
don't make any sense, since canceling the event does
nothing and it's not possible to bubble past the Window
object. They are set to true
for historical reasons.
BeforeUnloadEvent
interface[Exposed=Window]
interface BeforeUnloadEvent : Event {
attribute DOMString returnValue;
};
There are no BeforeUnloadEvent
-specific initialization methods.
The BeforeUnloadEvent
interface is a legacy interface which allows checking
if unloading is canceled to be controlled not only by canceling the event, but by setting
the returnValue
attribute to a value
besides the empty string. Authors should use the preventDefault()
method, or other means of canceling
events, instead of using returnValue
.
The returnValue
attribute controls the process
of checking if unloading is canceled. When the event is created, the
attribute must be set to the empty string. On getting, it must return the last value it was set
to. On setting, the attribute must be set to the new value.
This attribute is a DOMString
only for historical reasons.
Any value besides the empty string will be treated as a request to ask the user for
confirmation.
NotRestoredReasons
interface[Exposed=Window]
interface NotRestoredReasonDetails {
readonly attribute DOMString reason;
[Default] object toJSON();
};
[Exposed=Window]
interface NotRestoredReasons {
readonly attribute DOMString? src;
readonly attribute DOMString? id;
readonly attribute DOMString? name;
readonly attribute DOMString? url;
readonly attribute FrozenArray<NotRestoredReasonDetails>? reasons;
readonly attribute FrozenArray<NotRestoredReasons>? children;
[Default] object toJSON();
};
notRestoredReasonDetails.reason
Returns a string that explains the reason that prevented the document from being served from back/forward cache. See the definition of bfcache blocking details for the possible string values.
notRestoredReasons.src
Returns the src
attribute of the document's node
navigable's container if it is an iframe
element. This can be null if not set or if it is not an iframe
element.
notRestoredReasons.id
Returns the id
attribute of the document's node
navigable's container if it is an iframe
element. This can be null if not set or if it is not an iframe
element.
notRestoredReasons.name
Returns the name
attribute of the document's
node navigable's container if it is an
iframe
element. This can be null if not set or if it is not an iframe
element.
notRestoredReasons.url
Returns the document's URL, or null if the
document is in a cross-origin iframe
. This is reported in addition to src
because it is possible iframe
navigated since the original src
was set.
notRestoredReasons.reasons
Returns an array of NotRestoredReasonDetails
for the document. This is null
if the document is in a cross-origin iframe
.
notRestoredReasons.children
Returns an array of NotRestoredReasons
that are for the document’s
children. This is null if the document is in a cross-origin iframe
.
A NotRestoredReasonDetails
object has a backing struct, a not restored reason details or null, initially null.
The reason
getter steps are to return
this's backing struct's reason.
To create a NotRestoredReasonDetails
object given a not restored reason details backingStruct and a
realm realm:
Let notRestoredReasonDetails be a new NotRestoredReasonDetails
object created in realm.
Set notRestoredReasonDetails's backing struct to backingStruct.
Return notRestoredReasonDetails.
A not restored reason details is a struct with the following items:
reason, a string, initially empty.
The reason is a string that represents the reason that prevented the page from being restored from back/forward cache. The string is one of the following:
fetch
"Document
was still ongoing and was canceled, so the page was not in a state that
could be stored in the back/forward cache.navigation-failure
"Document
errored, so storing the
resulting error document in the back/forward cache was
prevented.parser-aborted
"Document
never finished its initial HTML parsing, so storing the unfinished
document in the back/forward cache was prevented.websocket
"WebSocket
connection was shut down, so the page was not in a state that could be stored in the back/forward cache. WEBSOCKETSlock
"masked
"Document
has children that are in a cross-origin iframe
, and
they prevented back/forward cache; or this Document
could not be back/forward cached for user agent-specific reasons, and
the user agent has chosen not to use one of the more specific reasons from the list of user-agent specific blocking reasons.
In addition to the list above, a user agent might choose to expose a reason that prevented the page from being restored from back/forward cache for user-agent specific blocking reasons. These are one of the following strings:
audio-capture
"Document
requested audio capture permission by using Media Capture and
Streams's getUserMedia()
with audio. MEDIASTREAMbackground-work
"Document
requested background work by calling SyncManager
's
register()
method,
PeriodicSyncManager
's register()
method, or
BackgroundFetchManager
's fetch()
method.broadcastchannel-message
"BroadcastChannel
connection on the page received a message and message
event was fired.idbversionchangeevent
"Document
had a pending IDBVersionChangeEvent
while unloading. INDEXEDDBidledetector
"Document
had an active IdleDetector
while unloading.keyboardlock
"Keyboard
's lock()
method was
called.mediastream
"MediaStreamTrack
was in the live state upon unloading. MEDIASTREAMmidi
"Document
requested a MIDI permission by calling navigator.requestMIDIAccess()
.modals
"navigating
"Document
was not in a state that could be stored in back/forward cache.navigation-canceled
"window.stop()
and the page was not in a state to be stored in back/forward cache.non-trivial-browsing-context-group
"Document
had more than one
top-level browsing context.otpcredential
"Document
created an OTPCredential
.outstanding-network-request
"Document
had
outstanding network requests and was not in a state that could be stored in back/forward cache.paymentrequest
"Document
had an active PaymentRequest
while unloading. PAYMENTREQUESTpictureinpicturewindow
"Document
had an active PictureInPictureWindow
while unloading. PICTUREINPICTUREplugins
"Document
contained plugins.request-method-not-get
"Document
was created from an HTTP request whose method was not `GET
`.
FETCHresponse-auth-required
"Document
was created from an HTTP response that required HTTP
authentication.response-cache-control-no-store
"Document
was created from an HTTP response whose `Cache-Control
` header included the "no-store
" token. HTTPresponse-cache-control-no-cache
"Document
was created from an HTTP response whose `Cache-Control
` header included the "no-cache
" token. HTTPresponse-keep-alive
"Document
was created from an HTTP response that contained a `Keep-Alive
` header.response-scheme-not-http-or-https
"Document
was created from a response whose URL's scheme was
not an HTTP(S) scheme. FETCHresponse-status-not-ok
"Document
was created from an HTTP response whose status was not an ok status.
FETCHrtc
"RTCPeerConnection
or
RTCDataChannel
was shut down, so the page was not in a state that could be stored in
the back/forward cache. WEBRTCsensors
"Document
requested sensor
access.serviceworker-added
"Document
's service worker client started to be
controlled by a ServiceWorker
while the page was
in back/forward cache. SWserviceworker-claimed
"Document
's service worker client's active service worker was claimed while
the page was in back/forward cache. SWserviceworker-postmessage
"Document
's service worker client's active service worker received a
message while the page was in back/forward cache. SWserviceworker-version-activated
"Document
's service worker client's active service worker's version was
activated while the page was in back/forward cache.
SWserviceworker-unregistered
"Document
's service worker client's active service worker's service
worker registration was unregistered while
the page was in back/forward cache. SWsharedworker
"Document
was in the owner set of a
SharedWorkerGlobalScope
.smartcardconnection
"Document
had an active SmartCardConnection
while unloading.speechrecognition
"Document
had an active SpeechRecognition
while unloading.storageaccess
"Document
requested storage access permission by using the Storage Access
API.unload-listener
"Document
registered an event listener for the unload
event.video-capture
"Document
requested video capture permission by using Media Capture and
Streams's getUserMedia()
with video. MEDIASTREAMwebhid
"Document
called the WebHID API's requestDevice()
method.webshare
"Document
used the Web Share API's navigator.share()
method.webtransport
"WebTransport
connection was shut down, so the page was not in a state that could be stored in the back/forward cache. WEBTRANSPORTwebxrdevice
"Document
created a XRSystem
.A NotRestoredReasons
object has a backing struct,
a not restored reasons or null, initially null.
A NotRestoredReasons
object has a reasons array, a
FrozenArray<
or null,
initially null.NotRestoredReasonDetails
>
A NotRestoredReasons
object has a children array, a
FrozenArray<NotRestoredReasons>
or null, initially
null.
The src
getter steps are to return
this's backing struct's src.
The id
getter steps are to return
this's backing struct's id.
The name
getter steps are to return
this's backing struct's name.
The url
getter steps are:
If this's backing struct's URL is null, then return null.
Return this's backing struct's URL, serialized.
The reasons
getter steps are to return
this's reasons array.
The children
getter steps are to return
this's children array.
To create a NotRestoredReasons
object given a not restored reasons backingStruct and a
realm realm:
Let notRestoredReasons be a new NotRestoredReasons
object created
in realm.
Set notRestoredReasons's backing struct to backingStruct.
If backingStruct's reasons is null, set notRestoredReasons's reasons array to null.
Otherwise:
Let reasonsArray be an empty list.
For each reason of backingStruct's reasons:
Create a NotRestoredReasonDetails
object given
reason and realm, and append
it to reasonsArray.
Set notRestoredReasons's reasons array to the result of creating a frozen array given reasonsArray.
If backingStruct's children is null, set notRestoredReasons's children array to null.
Otherwise:
Let childrenArray be an empty list.
For each child of backingStruct's children:
Create a NotRestoredReasons
object given child
and realm and append it to
childrenArray.
Set notRestoredReasons's children array to the result of creating a frozen array given childrenArray.
Return notRestoredReasons.
A not restored reasons is a struct with the following items:
src, a string or null, initially null.
id, a string or null, initially null.
name, a string or null, initially null.
url, a URL or null, initially null.
reasons, null or a list of not restored reason details, initially null.
children, null or a list of not restored reasons, initially null.
A Document
's not restored reasons is its node navigable's
active session history entry's document state's not restored reasons, if
Document
's node navigable is a top-level traversable;
otherwise null.
This standard contains several related concepts for grouping sequences of documents. As a brief, non-normative summary:
Navigables are a user-facing representation of a sequence
of documents, i.e., they represent something that can be navigated between documents. Typical
examples are tabs or windows in a web browser, or iframe
s, or
frame
s in a frameset
.
Traversable navigables are a special type of navigable which control the session history of themselves and of their descendant navigables. That is, in addition to their own series of documents, they represent a tree of further series of documents, plus the ability to linearly traverse back and forward through a flattened view of this tree.
Browsing contexts are a developer-facing
representation of a series of documents. They correspond 1:1 with WindowProxy
objects. Each navigable can present a series of browsing contexts, with switches between
those browsing contexts occuring under certain well-defined circumstances.
Most of this standard works in the language of navigables, but certain APIs expose the existence of browsing context switches, and so some parts of the standard need to work in terms of browsing contexts.
A navigable presents a Document
to the user via its active session history entry. Each navigable has:
An id, a new unique internal value.
A parent, a navigable or null.
A current session history entry, a session history entry.
This can only be modified within the session history traversal queue of the parent traversable navigable.
An active session history entry, a session history entry.
This can only be modified from the event loop of the active session history entry's document.
An is closing boolean, initially false.
This is only ever set to true for top-level traversable navigables.
An is delaying load
events boolean, initially false.
This is only ever set to true in cases where the navigable's parent is non-null.
The current session history entry and the active session history entry are usually the same, but they get out of sync when:
Synchronous navigations are performed. This causes the active session history entry to temporarily step ahead of the current session history entry.
A non-displayable, non-error response is received when applying the history step. This updates the current session history entry but leaves the active session history entry as-is.
A navigable's active document is its active session history entry's document.
This can be safely read from within the session history traversal queue of the
navigable's top-level traversable. Although a
navigable's active history entry can
change synchronously, the new entry will always have the same Document
.
A navigable's active browsing context is its active document's browsing context. If this navigable is a traversable navigable, then its active browsing context will be a top-level browsing context.
A navigable's active WindowProxy
is its
active browsing context's associated WindowProxy
.
A navigable's active window
is its active WindowProxy
's [[Window]].
This will always equal the navigable's active document's relevant global object; this is kept in sync by the make active algorithm.
A navigable's target name is its active session history entry's document state's navigable target name.
To get the node navigable of a node node, return the navigable whose active document is node's node document, or null if there is no such navigable.
To initialize the navigable navigable navigable, given a document state documentState and an optional navigable-or-null parent (default null):
Assert: documentState's document is non-null.
Let entry be a new session history entry, with
The caller of this algorithm is responsible for initializing entry's
step; it will be left as "pending
" until
that is complete.
Set navigable's current session history entry to entry.
Set navigable's active session history entry to entry.
Set navigable's parent to parent.
A traversable navigable is a navigable that also controls which session history entry should be the current session history entry and active session history entry for itself and its descendant navigables.
In addition to the properties of a navigable, a traversable navigable has:
A current session history step, a number, initially 0.
Session history entries, a list of session history entries, initially a new list.
A session history traversal queue, a session history traversal parallel queue, the result of starting a new session history traversal parallel queue.
A running nested apply history step boolean, initially false.
A system visibility state, which is either "hidden
" or
"visible
".
See the page visibility section for the requirements on this item.
To get the traversable navigable of a navigable inputNavigable:
Let navigable be inputNavigable.
While navigable is not a traversable navigable, set navigable to navigable's parent.
Return navigable.
A top-level traversable is a traversable navigable with a null parent.
Currently, all traversable navigables are top-level traversables. Future proposals envision introducing non-top-level traversables.
A user agent holds a top-level traversable set (a set of top-level traversables). These are typically presented to the user in the form of browser windows or browser tabs.
To get the top-level traversable of a navigable inputNavigable:
Let navigable be inputNavigable.
While navigable's parent is not null, set navigable to navigable's parent.
Return navigable.
To create a new top-level traversable given a browsing context-or-null opener, a string targetName, and an optional navigable openerNavigableForWebDriver:
Let document be null.
If opener is null, then set document to the second return value of creating a new top-level browsing context and document.
Otherwise, set document to the second return value of creating a new auxiliary browsing context and document given opener.
Let documentState be a new document state, with
Let traversable be a new traversable navigable.
Initialize the navigable traversable given documentState.
Let initialHistoryEntry be traversable's active session history entry.
Set initialHistoryEntry's step to 0.
Append initialHistoryEntry to traversable's session history entries.
If opener is non-null, then legacy-clone a traversable storage shed given opener's top-level traversable and traversable. STORAGE
Append traversable to the user agent's top-level traversable set.
Invoke WebDriver BiDi navigable created with traversable and openerNavigableForWebDriver.
Return traversable.
To create a fresh top-level traversable given a URL initialNavigationURL and an optional POST resource-or-null initialNavigationPostResource (default null):
Let traversable be the result of creating a new top-level traversable given null and the empty string.
Navigate traversable to initialNavigationURL using traversable's active document, with documentResource set to initialNavigationPostResource.
We treat these initial navigations as traversable navigating itself, which will ensure all relevant security checks pass.
Return traversable.
Certain elements (for example, iframe
elements)
can present a navigable to the user. These elements are called navigable containers.
Each navigable container has a content navigable, which is either a navigable or null. It is initially null.
The container of a navigable navigable is the navigable container whose content navigable is navigable, or null if there is no such element.
The container document of a navigable navigable is the result of running these steps:
If navigable's container is null, then return null.
Return navigable's container's node document.
This is equal to navigable's container's shadow-including root as navigable's container has to be connected.
The container document of a Document
document is the result of running these steps:
If document's node navigable is null, then return null.
Return document's node navigable's container document.
A navigable navigable is a child navigable of another navigable potentialParent when navigable's parent is potentialParent. We can also just say that a navigable "is a child navigable", which means that its parent is non-null.
All child navigables are the content navigable of their container.
The content document of a navigable container container is the result of running these steps:
If container's content navigable is null, then return null.
Let document be container's content navigable's active document.
If document's origin and container's node document's origin are not same origin-domain, then return null.
Return document.
The content window of a navigable container container is the result of running these steps:
If container's content navigable is null, then return null.
Return container's content navigable's active WindowProxy
's object.
To create a new child navigable, given an element element:
Let parentNavigable be element's node navigable.
Let group be element's node document's browsing context's top-level browsing context's group.
Let browsingContext and document be the result of creating a new browsing context and document given element's node document, element, and group.
Let targetName be null.
If element has a name
content attribute, then set
targetName to the value of that attribute.
Let documentState be a new document state, with
Let navigable be a new navigable.
Initialize the navigable navigable given documentState and parentNavigable.
Set element's content navigable to navigable.
Let historyEntry be navigable's active session history entry.
Let traversable be parentNavigable's traversable navigable.
Append the following session history traversal steps to traversable:
Let parentDocState be parentNavigable's active session history entry's document state.
Let parentNavigableEntries be the result of getting session history entries for parentNavigable.
Let targetStepSHE be the first session history entry in parentNavigableEntries whose document state equals parentDocState.
Set historyEntry's step to targetStepSHE's step.
Let nestedHistory be a new nested history whose id is navigable's id and entries list is « historyEntry ».
Append nestedHistory to parentDocState's nested histories.
Update for navigable creation/destruction given traversable.
Invoke WebDriver BiDi navigable created with traversable.
A useful method for visualizing sequences of documents, and in particular navigables and their session history entries, is the Jake diagram. A typical Jake diagram is the following:
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
top | /t-a | /t-a#foo | /t-b | ||
frames[0] | /i-0-a | /i-0-b | |||
frames[1] | /i-1-a | /i-1-b |
Here, each numbered column denotes a possible value for the traversable's session history step. Each labeled row depicts a
navigable, as it transitions between different URLs and documents. The first,
labeled top
, being the top-level traversable, and the others
being child navigables. The documents are given by the
background color of each cell, with a new background color indicating a new document in that
navigable. The URLs are given by the text content of the cells; usually they are
given as relative URLs for brevity, unless a cross-origin case
is specifically under investigation. A given navigable might not exist at a given step, in which
case the corresponding cells are empty. The bold-italic step number depicts the current session history step of the traversable,
and all cells with bold-italic URLs represent the current session history entry for that row's
navigable.
Thus, the above Jake diagram depicts the following sequence of events:
A top-level traversable is created, starting a the URL /t-a
, with two child navigables
starting at /i-0-a
and /i-1-a
respectively.
The first child navigable is navigated to another
document, with URL /i-0-b
.
The second child navigable is navigated to another
document, with URL /i-1-b
.
The top-level traversable is navigated to the
same document, updating its URL to /t-a#foo
.
The top-level traversable is navigated to another
document, with URL /t-b
. (Notice how this document, of course, does not
carry over the old document's child navigables.)
The traversable was traversed by a delta of −3, back to step 1.
Jake diagrams are a powerful tool for visualizing the interactions of multiple navigables, navigations, and traversals. They cannot capture every possible interaction — for example, they only work with a single level of nesting — but we will have ocassion to use them to illustrate several complex situations throughout this standard.
Jake diagrams are named after their creator, the inimitable Jake Archibald.
It is often helpful in this standard's algorithms to look at collections of navigables starting at a given Document
. This section
contains a curated set of algorithms for collecting those navigables.
The return values of these algorithms are ordered so that parents appears before their children. Callers rely on this ordering.
Starting with a Document
, rather than a navigable, is
generally better because it makes the caller cognizant of whether they are starting with a
fully active Document
or not. Although non-fully active
Document
s do have ancestor and descendant navigables, they often behave as if they
don't (e.g., in the window.parent
getter).
The ancestor navigables of a Document
document are given by these steps:
Let navigable be document's node navigable's parent.
Let ancestors be an empty list.
While navigable is not null:
Prepend navigable to ancestors.
Set navigable to navigable's parent.
Return ancestors.
The inclusive ancestor navigables of a Document
document are given by these steps:
Let navigables be document's ancestor navigables.
Append document's node navigable to navigables.
Return navigables.
The descendant
navigables of a Document
document are given by these steps:
Let navigables be new list.
Let navigableContainers be a list of all shadow-including descendants of document that are navigable containers, in shadow-including tree order.
For each navigableContainer of navigableContainers:
If navigableContainer's content navigable is null, then continue.
Extend navigables with navigableContainer's content navigable's active document's inclusive descendant navigables.
Return navigables.
The inclusive descendant navigables of a
Document
document are given by these steps:
Let navigables be « document's node navigable ».
Extend navigables with document's descendant navigables.
Return navigables.
These descendant-collecting algorithms are described as looking at the DOM tree
of descendant Document
objects. In reality, this is often not feasible since the DOM
tree can be in another process from the caller of the algorithm. Instead, implementations
generally replicate the appropriate trees across processes.
The document-tree child navigables of a
Document
document are given by these steps:
If document's node navigable is null, then return the empty list.
Let navigables be new list.
Let navigableContainers be a list of all descendants of document that are navigable containers, in tree order.
For each navigableContainer of navigableContainers:
If navigableContainer's content navigable is null, then continue.
Append navigableContainer's content navigable to navigables.
Return navigables.
To destroy a child navigable given a navigable container container:
Let navigable be container's content navigable.
If navigable is null, then return.
Set container's content navigable to null.
Inform the navigation API about child navigable destruction given navigable.
Destroy a document and its descendants given navigable's active document.
Let parentDocState be container's node navigable's active session history entry's document state.
Remove the nested history from parentDocState's nested histories whose id equals navigable's id.
Let traversable be container's node navigable's traversable navigable.
Append the following session history traversal steps to traversable:
Update for navigable creation/destruction given traversable.
Invoke WebDriver BiDi navigable destroyed with navigable.
To destroy a top-level traversable traversable:
Let browsingContext be traversable's active browsing context.
For each historyEntry in traversable's session history entries in what order?:
Let document be historyEntry's document.
If document is not null, then destroy a document and its descendants given document.
Remove browsingContext.
Remove traversable from the user interface (e.g., close or hide its tab in a tabbed browser).
Remove traversable from the user agent's top-level traversable set.
Invoke WebDriver BiDi navigable destroyed with traversable.
User agents may destroy a top-level traversable at any time (typically, in response to user requests).
To close a top-level traversable traversable:
If traversable's is closing is true, then return.
Definitely close traversable.
To definitely close a top-level traversable traversable:
Let toUnload be traversable's active document's inclusive descendant navigables.
If the result of checking if unloading is canceled for toUnload is true, then return.
Append the following session history traversal steps to traversable:
Let afterAllUnloads be an algorithm step which destroys traversable.
Unload a document and its descendants given traversable's active document, null, and afterAllUnloads.
The close vs. definitely close separation allows other
specifications to call close and have it be a
no-op if the top-level traversable is already closing due to JavaScript code calling window.close()
.
Navigables can be given target
names, which are strings allowing certain APIs (such as window.open()
or the a
element's target
attribute) to target navigations at that navigable.
A valid navigable target name is any string with at least one character that does not contain both an ASCII tab or newline and a U+003C (<), and it does not start with a U+005F (_). (Names starting with a U+005F (_) are reserved for special keywords.)
A valid navigable target name or
keyword is any string that is either a valid navigable target name or that is
an ASCII case-insensitive match for one of: _blank
, _self
, _parent
, or _top
.
These values have different meanings based on whether the page is sandboxed or not, as
summarized in the following (non-normative) table. In this table, "current" means the
navigable that the link or script is in, "parent" means the parent of the navigable that the link or script is in,
"top" means the top-level traversable of the navigable
that the link or script is in, "new" means a new traversable navigable with a null
parent (which may use an auxiliary browsing
context, subject to various user preferences and user agent policies), "none" means that
nothing will happen, and "maybe new" means the same as "new" if the "allow-popups
" keyword is also specified on the
sandbox
attribute (or if the user overrode the
sandboxing), and the same as "none" otherwise.
Keyword | Ordinary effect | Effect in an iframe with...
| |
---|---|---|---|
sandbox=""
| sandbox="allow-top-navigation"
| ||
none specified, for links and form submissions | current | current | current |
empty string | current | current | current |
_blank
| new | maybe new | maybe new |
_self
| current | current | current |
_parent if there isn't a parent
| current | current | current |
_parent if parent is also top
| parent/top | none | parent/top |
_parent if there is one and it's not top
| parent | none | none |
_top if top is current
| current | current | current |
_top if top is not current
| top | none | top |
name that doesn't exist | new | maybe new | maybe new |
name that exists and is a descendant | specified descendant | specified descendant | specified descendant |
name that exists and is current | current | current | current |
name that exists and is an ancestor that is top | specified ancestor | none | specified ancestor/top |
name that exists and is an ancestor that is not top | specified ancestor | none | none |
other name that exists with common top | specified | none | none |
name that exists with different top, if familiar and one permitted sandboxed navigator | specified | specified | specified |
name that exists with different top, if familiar but not one permitted sandboxed navigator | specified | none | none |
name that exists with different top, not familiar | new | maybe new | maybe new |
Most of the restrictions on sandboxed browsing contexts are applied by other algorithms, e.g. the navigation algorithm, not the rules for choosing a navigable given below.
The rules for choosing a navigable, given a string name, a navigable currentNavigable, and a boolean noopener are as follows:
Let chosen be null.
Let windowType be "existing or none
".
Let sandboxingFlagSet be currentNavigable's active document's active sandboxing flag set.
If name is the empty string or an ASCII case-insensitive match
for "_self
", then set chosen to
currentNavigable.
Otherwise, if name is an ASCII case-insensitive match for "_parent
", set chosen to currentNavigable's parent, if any, and currentNavigable otherwise.
Otherwise, if name is an ASCII case-insensitive match for "_top
", set chosen to currentNavigable's traversable navigable.
Otherwise, if name is not an ASCII case-insensitive match for "_blank
", there exists a navigable whose target name is the same as name,
currentNavigable's active browsing context is
familiar with that navigable's active browsing
context, and the user agent determines that the two browsing contexts are related enough
that it is ok if they reach each other, set chosen to that navigable. If there are
multiple matching navigables, the user agent should pick one in
some arbitrary consistent manner, such as the most recently opened, most recently focused, or
more closely related, and set chosen to it.
This will be made more precise in issue #313.
Otherwise, a new top-level traversable is being requested, and what happens depends on the user agent's configuration and abilities — it is determined by the rules given for the first applicable option from the following list:
The user agent may inform the user that a popup has been blocked.
The user agent may report to a developer console that a popup has been blocked.
Consume user activation of currentNavigable's active window.
Set windowType to "new and unrestricted
".
Let currentDocument be currentNavigable's active document.
If currentDocument's opener
policy's value is "same-origin
" or "same-origin-plus-COEP
", and
currentDocument's origin is not
same origin with currentDocument's relevant settings
object's top-level origin, then:
Set noopener to true.
Set name to "_blank
".
Set windowType to "new with no opener
".
In the presence of an opener policy, nested documents that are cross-origin with their top-level browsing context's active document always set noopener to true.
Let chosen be null.
Let targetName be the empty string.
If name is not an ASCII case-insensitive match for "_blank
", then set targetName to name.
If noopener is true, then set chosen to the result of creating a new top-level traversable given null, targetName, and currentNavigable.
Otherwise:
Set chosen to the result of creating a new top-level traversable given currentNavigable's active browsing context, targetName, and currentNavigable.
If sandboxingFlagSet's sandboxed navigation browsing context flag is set, then set chosen's active browsing context's one permitted sandboxed navigator to currentNavigable's active browsing context.
If sandboxingFlagSet's sandbox propagates to auxiliary browsing contexts flag is set, then all the flags that are set in sandboxingFlagSet must be set in chosen's active browsing context's popup sandboxing flag set.
If the newly created navigable chosen is immediately
navigated, then the navigation will be done as a "replace
" navigation.
Set chosen to currentNavigable.
Do nothing.
User agents are encouraged to provide a way for users to configure the user agent to always choose currentNavigable.
Return chosen and windowType.
A browsing context is a programmatic representation of a series of documents,
multiple of which can live within a single navigable. Each browsing
context has a corresponding WindowProxy
object, as well as the following:
An opener browsing context, a browsing context or null, initially null.
An opener origin at creation, an origin or null, initially null.
An is popup boolean, initially false.
The only mandatory impact in this specification of is popup is on
the visible
getter of the relevant
BarProp
objects. However, user agents might also use it for user interface considerations.
An is auxiliary boolean, initially false.
An initial URL, a URL or null, initially null.
A virtual browsing context group ID integer, initially 0. This is used by opener policy reporting, to keep track of the browsing context group switches that would have happened if the report-only policy had been enforced.
A browsing context's active window is its WindowProxy
object's [[Window]] internal slot value. A
browsing context's active document is its active window's
associated Document
.
A browsing context's top-level traversable is its active document's node navigable's top-level traversable.
A browsing context whose is auxiliary is true is known as an auxiliary browsing context. Auxiliary browsing contexts are always top-level browsing contexts.
It's unclear whether a separate is auxiliary concept is necessary. In issue #5680, it is indicated that we may be able to simplify this by using whether or not the opener browsing context is null.
Modern specifications should avoid using the
browsing context concept in most cases, unless they are dealing with the subtleties
of browsing context
group switches and agent cluster allocation. Instead,
the Document
and navigable concepts are usually more appropriate.
A Document
's browsing context is a browsing context or null,
initially null.
A Document
does not necessarily have a non-null browsing context. In particular, data mining tools are likely
to never instantiate browsing contexts. A Document
created using an API such as createDocument()
never has a non-null browsing context. And the Document
originally
created for an iframe
element, which has since been removed from the document, has no associated browsing context, since that
browsing context was nulled out.
In general, there is a 1-to-1 mapping from the Window
object to the
Document
object, as long as the Document
object has a non-null browsing context. There is one exception. A
Window
can be reused for the presentation of a second Document
in the
same browsing context, such that the mapping is then 1-to-2. This occurs when a
browsing context is navigated from the initial about:blank
Document
to
another, which will be done with replacement.
To create a new browsing context and document, given null or a Document
object creator, null or an element embedder, and a browsing context
group group:
Let browsingContext be a new browsing context.
Let unsafeContextCreationTime be the unsafe shared current time.
Let creatorOrigin be null.
Let creatorBaseURL be null.
If creator is non-null, then:
Set creatorOrigin to creator's origin.
Set creatorBaseURL to creator's document base URL.
Set browsingContext's virtual browsing context group ID to creator's browsing context's top-level browsing context's virtual browsing context group ID.
Let sandboxFlags be the result of determining the creation sandboxing flags given browsingContext and embedder.
Let origin be the result of determining the
origin given about:blank
, sandboxFlags, and
creatorOrigin.
Let permissionsPolicy be the result of creating a permissions policy given embedder and origin. PERMISSIONSPOLICY
Let agent be the result of obtaining a similar-origin window agent given origin, group, and false.
Let realm execution context be the result of creating a new realm given agent and the following customizations:
For the global object, create a new Window
object.
For the global this binding, use browsingContext's
WindowProxy
object.
Let topLevelCreationURL be about:blank
if embedder is
null; otherwise embedder's relevant settings object's top-level
creation URL.
Let topLevelOrigin be origin if embedder is null; otherwise embedder's relevant settings object's top-level origin.
Set up a window environment settings object with about:blank
,
realm execution context, null, topLevelCreationURL, and
topLevelOrigin.
Let loadTimingInfo be a new document load timing info with its navigation start time set to the result of calling coarsen time with unsafeContextCreationTime and the new environment settings object's cross-origin isolated capability.
Let document be a new Document
, with:
html
"text/html
"quirks
"about:blank
If creator is non-null, then:
Set document's referrer to the serialization of creator's URL.
Set document's policy container to a clone of creator's policy container.
If creator's origin is same origin with creator's relevant settings object's top-level origin, then set document's opener policy to creator's browsing context's top-level browsing context's active document's opener policy.
Assert: document's URL
and document's relevant settings object's creation URL are
about:blank
.
Mark document as ready for post-load tasks.
Populate with html
/head
/body
given
document.
Make active document.
Completely finish loading document.
Return browsingContext and document.
To create a new top-level browsing context and document:
Let group and document be the result of creating a new browsing context group and document.
Return group's browsing context set[0] and document.
To create a new auxiliary browsing context and document, given a browsing context opener:
Let openerTopLevelBrowsingContext be opener's top-level traversable's active browsing context.
Let group be openerTopLevelBrowsingContext's group.
Assert: group is non-null, as navigating invokes this directly.
Let browsingContext and document be the result of creating a new browsing context and document with opener's active document, null, and group.
Set browsingContext's is auxiliary to true.
Append browsingContext to group.
Set browsingContext's opener browsing context to opener.
Set browsingContext's virtual browsing context group ID to openerTopLevelBrowsingContext's virtual browsing context group ID.
Set browsingContext's opener origin at creation to opener's active document's origin.
Return browsingContext and document.
To determine the origin, given a URL url, a sandboxing flag set sandboxFlags, and an origin-or-null sourceOrigin:
If sandboxFlags has its sandboxed origin browsing context flag set, then return a new opaque origin.
If url is null, then return a new opaque origin.
If url is about:srcdoc
, then:
Assert: sourceOrigin is non-null.
Return sourceOrigin.
If url matches about:blank
and
sourceOrigin is non-null, then return sourceOrigin.
Return url's origin.
The cases that return sourceOrigin result in two
Document
s that end up with the same underlying origin, meaning that document.domain
affects both.
A browsing context potentialDescendant is said to be an ancestor of a browsing context potentialAncestor if the following algorithm returns true:
Let potentialDescendantDocument be potentialDescendant's active document.
If potentialDescendantDocument is not fully active, then return false.
Let ancestorBCs be the list obtained by taking the browsing context of the active document of each member of potentialDescendantDocument's ancestor navigables.
If ancestorBCs contains potentialAncestor, then return true.
Return false.
A top-level browsing context is a browsing context whose active document's node navigable is a traversable navigable.
It is not required to be a top-level traversable.
The top-level browsing context of a browsing context start is the result of the following algorithm:
If start's active document is not fully active, then return null.
Let navigable be start's active document's node navigable.
While navigable's parent is not null, set navigable to navigable's parent.
Return navigable's active browsing context.
A browsing context A is familiar with a second browsing context B if the following algorithm returns true:
If A's active document's origin is same origin with B's active document's origin, then return true.
If A's top-level browsing context is B, then return true.
If B is an auxiliary browsing context and A is familiar with B's opener browsing context, then return true.
If there exists an ancestor browsing context of B whose active document has the same origin as the active document of A, then return true.
This includes the case where A is an ancestor browsing context of B.
Return false.
A top-level browsing context has an associated group (null or a browsing context group). It is initially null.
A user agent holds a browsing context group set (a set of browsing context groups).
A browsing context group holds a browsing context set (a set of top-level browsing contexts).
A top-level browsing context is added to the group when the group is created. All subsequent top-level browsing contexts added to the group will be auxiliary browsing contexts.
A browsing context group has an associated agent cluster map (a weak map of agent cluster keys to agent clusters). User agents are responsible for collecting agent clusters when it is deemed that nothing can access them anymore.
A browsing context group has an associated historical agent cluster key map, which is a map of origins to agent cluster keys. This map is used to ensure the consistency of the origin-keyed agent clusters feature by recording what agent cluster keys were previously used for a given origin.
The historical agent cluster key map only ever gains entries over the lifetime of the browsing context group.
A browsing context group has a cross-origin isolation mode, which is a
cross-origin isolation mode. It is initially "none
".
A cross-origin isolation mode is one of three possible values: "none
", "logical
", or "concrete
".
"logical
" and "concrete
" are similar. They are both used for
browsing context groups where:
every top-level Document
has `Cross-Origin-Opener-Policy: same-origin
`, and
every Document
has a `Cross-Origin-Embedder-Policy
` header
whose value is compatible with cross-origin isolation.
On some platforms, it is difficult to provide the security properties required to grant safe
access to the APIs gated by the cross-origin isolated
capability. As a result, only "concrete
" can grant access that capability.
"logical
" is used on platform not supporting
this capability, where various restrictions imposed by cross-origin isolation will still apply,
but the capability is not granted.
To create a new browsing context group and document:
Let group be a new browsing context group.
Append group to the user agent's browsing context group set.
Let browsingContext and document be the result of creating a new browsing context and document with null, null, and group.
Append browsingContext to group.
Return group and document.
To append a top-level browsing context browsingContext to a browsing context group group:
Append browsingContext to group's browsing context set.
Set browsingContext's group to group.
To remove a top-level browsing context browsingContext:
Assert: browsingContext's group is non-null.
Let group be browsingContext's group.
Set browsingContext's group to null.
Remove browsingContext from group's browsing context set.
If group's browsing context set is empty, then remove group from the user agent's browsing context group set.
Append and remove are primitive operations that help define the lifetime of a browsing
context group. They are called by higher-level creation and destruction operations for
Document
s and browsing contexts.
When there are no Document
objects whose
browsing context equals a given browsing
context (i.e., all such Document
s have been destroyed), and that browsing context's WindowProxy
is
eligible for garbage collection, then the browsing context will never be accessed
again. If it is a top-level browsing context, then at this point the user agent must
remove it.
A Document
d is said to be fully
active when d is the active document of a
navigable navigable, and either navigable is a top-level
traversable or navigable's container
document is fully active.
Because they are associated with an element, child
navigables are always tied to a specific Document
, their container document, in their parent navigable. User agents must not allow the user to interact with
child navigables whose container documents are not themselves fully
active.
The following example illustrates how a Document
can be the active document of its node navigable, while not being
fully active. Here a.html
is loaded into a browser window,
b-1.html
starts out loaded into an iframe
as shown, and
b-2.html
and c.html
are omitted (they can simply
be an empty document).
<!-- a.html -->
<!DOCTYPE html>
<html lang="en">
<title>Navigable A</title>
<iframe src="b-1.html"></iframe>
<button onclick="frames[0].location.href = 'b-2.html'">Click me</button>
<!-- b-1.html -->
<!DOCTYPE html>
<html lang="en">
<title>Navigable B</title>
<iframe src="c.html"></iframe>
At this point, the documents given by a.html
, b-1.html
, and c.html
are all the active documents of their respective node navigables. They are also all fully active.
After clicking on the button
, and thus loading a new Document
from
b-2.html
into navigable B, we have the following results:
The a.html
Document
remains both the active document of navigable A, and fully
active.
The b-1.html
Document
is now not the active document of navigable B. As such it is also not fully
active.
The new b-2.html
Document
is now the active document of navigable B, and is also fully
active.
The c.html
Document
is still the active document of navigable C. However, since C's container document is the b-1.html
Document
, which is itself not fully active,
this means the c.html
Document
is now not fully
active.
Welcome to the dragon's maw. Navigation, session history, and the traversal through that session history are some of the most complex parts of this standard.
The basic concept may not seem so difficult:
The user is looking at a navigable that is presenting its active document. They navigate it to another URL.
The browser fetches the given URL from the network, using it to populate a new session history entry
with a newly-created
Document
.
The browser updates the navigable's active session history entry to the newly-populated one, and thus updates the active document that it is showing to the user.
At some point later, the user presses the browser back button to go back to the previous session history entry.
The browser looks at the URL stored in that session history entry, and uses it to re-fetch and populate that entry's document.
The browser again updates the navigable's active session history entry.
You can see some of the intertwined complexity peeking through here, in how traversal can cause a navigation (i.e., a network fetch to a stored URL), and how a navigation necessarily needs to interface with the session history list to ensure that when it finishes the user is looking at the right thing. But the real problems come in with the various edge cases and interacting web platform features:
Child navigables (e.g., those contained in
iframe
s) can also navigate and traverse, but those navigations need to be
linearized into a single session history list
since the user only has a single back/forward interface for the entire traversable
navigable (e.g., browser tab).
Since the user can traverse back more than a single step in the session history (e.g., by holding down their back button), they can end up traversing multiple navigables at the same time when child navigables are involved. This needs to be synchronized across all of the involved navigables, which might involve multiple event loops or even agent clusters.
During navigation, servers can respond with 204 or 205 status codes or with `Content-Disposition: attachment
` headers, which cause
navigation to abort and the navigable to stay on its original active document. (This is much worse if it happens during a traversal-initiated
navigation!)
Various other HTTP headers, such as `Location
`,
`Refresh
`, `X-Frame-Options
`, and those for Content Security Policy,
contribute to either the fetching
process, or the Document
-creation
process, or both. The `Cross-Origin-Opener-Policy
` header even contributes
to the browsing
context selection and creation process!
Some navigations (namely fragment navigations and single-page app navigations) are synchronous, meaning that JavaScript code expects to observe the navigation's results instantly. This then needs to be synchronized with the view of the session history that all other navigables in the tree see, which can be subject to race conditions and necessitate resolving conflicting views of the session history.
The platform has accumulated various exciting navigation-related features that need
special-casing, such as javascript:
URLs, srcdoc
iframe
s, and the beforeunload
event.
In what follows, we have attempted to guide the reader through these complexities by appropriately cordoning them off into labeled sections and algorithms, and giving appropriate words of introduction where possible. Nevertheless, if you wish to truly understand navigation and session history, the usual advice will be invaluable.
A session history entry is a struct with the following items:
step, a non-negative integer or "pending
", initially "pending
".
URL, a URL
document state, a document state.
classic history API state, which is serialized state, initially StructuredSerializeForStorage(null).
navigation API state, which is a serialized state, initially StructuredSerializeForStorage(undefined).
navigation API key, which is a string, initially set to the result of generating a random UUID.
navigation API ID, which is a string, initially set to the result of generating a random UUID.
scroll restoration mode, a scroll
restoration mode, initially "auto
".
scroll position data, which is scroll position data for the document's restorable scrollable regions.
persisted user state, which is implementation-defined, initially null
For example, some user agents might want to persist the values of form controls.
User agents that persist the value of form controls are encouraged to also
persist their directionality (the value of the element's dir
attribute). This prevents values from being displayed incorrectly after a history traversal
when the user had originally entered the values with an explicit, non-default
directionality.
To get a session history entry's document, return its document state's document.
Serialized state is a serialization (via StructuredSerializeForStorage) of an object representing a user interface state. We sometimes informally refer to "state objects", which are the objects representing user interface state supplied by the author, or alternately the objects created by deserializing (via StructuredDeserialize) serialized state.
Pages can add serialized state to the session history. These are then deserialized and returned to the script when the user (or script) goes back in the history, thus enabling authors to use the "navigation" metaphor even in one-page applications.
Serialized state is intended to be used for two main purposes: first, storing a
preparsed description of the state in the URL so that in the simple case an author
doesn't have to do the parsing (though one would still need the parsing for handling URLs passed around by users, so it's only a minor optimization). Second, so
that the author can store state that one wouldn't store in the URL because it only applies to the
current Document
instance and it would have to be reconstructed if a new
Document
were opened.
An example of the latter would be something like keeping track of the precise coordinate from
which a popup div
was made to animate, so that if the user goes back, it can be made
to animate to the same location. Or alternatively, it could be used to keep a pointer into a
cache of data that would be fetched from the server based on the information in the
URL, so that when going back and forward, the information doesn't have to be fetched
again.
A scroll restoration mode indicates whether the user agent should restore the persisted scroll position (if any) when traversing to an entry. A scroll restoration mode is one of the following:
auto
"manual
"Document state holds state inside a session history entry regarding
how to present and, if necessary, recreate, a Document
. It has:
A document, a Document
or null,
initially null.
When a history entry is active, it has a
Document
in its document state. However,
when a Document
is not fully active, it's possible for it to be
destroyed to free resources. In such cases, this
document item will be nulled out. The URL and other data in the session history entry and document state is then used to bring a new
Document
into being to take the place of the original, in the case where the user
agent finds itself having to traverse to the entry.
If the Document
is not destroyed, then during history
traversal, it can be reactivated. The cache
in which browsers store such Document
s is often called a back-forward
cache, or bfcache (or perhaps "blazingly fast" cache).
A history policy container, a policy container or null, initially null.
A request referrer, which is "no-referrer
", "client
", or a URL, initially
"client
".
A request referrer policy, which is a referrer policy, initially the default referrer policy.
The request referrer policy is distinct from the history policy container's referrer policy. The former is used for fetches of this document, whereas the latter controls fetches by this document.
An initiator origin, which is an origin or null, initially null.
An origin, which is an origin or null, initially null.
This is the origin that we set "about:
"-schemed
Document
s' origin to. We store it
here because it is also used when restoring these Document
s during traversal,
since they are reconstructed locally without visiting the network. It is also used to compare
the origin before and after the session history entry is repopulated. If the origins change, the navigable target name is cleared.
An about base URL, which is a URL or null, initially null.
This will be populated only for "about:
"-schemed
Document
s and will be the fallback base URL for those
Document
s. It is a snapshot of the initiator Document
's document
base URL.
Nested histories, a list of nested histories, initially an empty list.
A resource, a string, POST resource or null, initially null.
A string is treated as HTML. It's used to store the source of an iframe
srcdoc
document.
A reload pending boolean, initially false.
An ever populated boolean, initially false.
A navigable target name string, initially the empty string.
A not restored reasons, a not restored reasons or null, initially null.
User agents may destroy a document and its descendants given the documents of document
states with non-null documents, as long as
the Document
is not fully active.
Apart from that restriction, this standard does not specify when user agents should destroy the document stored in a document state, versus keeping it cached.
A POST resource has:
A request body, a byte sequence or failure.
This is only ever accessed in parallel, so it doesn't need to be stored in memory. However, it must return the same byte sequence each time. If this isn't possible due to resources changing on disk, or if resources can no longer be accessed, then this must be set to failure.
A request
content-type, which is `application/x-www-form-urlencoded
`,
`multipart/form-data
`, or `text/plain
`.
A nested history has:
An id, a unique internal value.
This is used to associate the nested history with a navigable.
Entries, a list of session history entries.
This will later contain ways to identify a child navigable across reloads.
Several contiguous entries in a session history can share the same document state. This can occur when the initial entry is
reached via normal navigation, and the following entry is added
via history.pushState()
. Or it can occur via navigation to a fragment.
All entries that share the same document state (and that are therefore merely different states of one particular document) are contiguous by construction.
A Document
has a latest entry, a session history entry or
null.
This is the entry that was most recently represented by a given
Document
. A single Document
can represent many session history entries over time, as many contiguous session history entries can share the same document state as explained above.
To maintain a single source of truth, all modifications to a traversable navigable's session history entries need to be synchronized. This is especially important due to how session history is influenced by all of the descendant navigables, and thus by multiple event loops. To accomplish this, we use the session history traversal parallel queue structure.
A session history traversal parallel queue is very similar to a parallel queue. It has an algorithm set, an ordered set.
The items in a session history traversal parallel queue's algorithm set are either algorithm steps, or synchronous navigation steps, which are a particular brand of algorithm steps involving a target navigable (a navigable).
To append session history traversal steps to a traversable navigable traversable given algorithm steps steps, append steps to traversable's session history traversal queue's algorithm set.
To append session history synchronous navigation steps involving a navigable targetNavigable to a traversable navigable traversable given algorithm steps steps, append steps as synchronous navigation steps targeting target navigable targetNavigable to traversable's session history traversal queue's algorithm set.
To start a new session history traversal parallel queue:
Let sessionHistoryTraversalQueue be a new session history traversal parallel queue.
Run the following steps in parallel:
While true:
If sessionHistoryTraversalQueue's algorithm set is empty, then continue.
Let steps be the result of dequeuing from sessionHistoryTraversalQueue's algorithm set.
Run steps.
Return sessionHistoryTraversalQueue.
This section contains a miscellaneous grab-bag of operations that we perform throughout the standard when manipulating session history. The best way to get a sense of what they do is to look at their call sites.
To get session history entries of a navigable navigable:
Let traversable be navigable's traversable navigable.
Assert: this is running within traversable's session history traversal queue.
If navigable is traversable, return traversable's session history entries.
Let docStates be an empty ordered set of document states.
For each entry of traversable's session history entries, append entry's document state to docStates.
For each docState of docStates:
For each nestedHistory of docState's nested histories:
If nestedHistory's id equals navigable's id, return nestedHistory's entries.
For each entry of nestedHistory's entries, append entry's document state to docStates.
Assert: this step is not reached.
To get session history entries for the navigation API of a navigable navigable given an integer targetStep:
Let rawEntries be the result of getting session history entries for navigable.
Let entriesForNavigationAPI be a new empty list.
Let startingIndex be the index of the session history entry in rawEntries who has the greatest step less than or equal to targetStep.
See this example to understand why it's the greatest step less than or equal to targetStep.
Append rawEntries[startingIndex] to entriesForNavigationAPI.
Let startingOrigin be rawEntries[startingIndex]'s document state's origin.
Let i be startingIndex − 1.
While i > 0:
If rawEntries[i]'s document state's origin is not same origin with startingOrigin, then break.
Prepend rawEntries[i] to entriesForNavigationAPI.
Set i to i − 1.
Set i to startingIndex + 1.
While i < rawEntries's size:
If rawEntries[i]'s document state's origin is not same origin with startingOrigin, then break.
Append rawEntries[i] to entriesForNavigationAPI.
Set i to i + 1.
Return entriesForNavigationAPI.
To clear the forward session history of a traversable navigable navigable:
Assert: this is running within navigable's session history traversal queue.
Let step be the navigable's current session history step.
Let entryLists be the ordered set « navigable's session history entries ».
For each entryList of entryLists:
Remove every session history entry from entryList that has a step greater than step.
For each entry of entryList:
For each nestedHistory of entry's document state's nested histories, append nestedHistory's entries list to entryLists.
To get all used history steps that are part of traversable navigable traversable:
Assert: this is running within traversable's session history traversal queue.
Let steps be an empty ordered set of non-negative integers.
Let entryLists be the ordered set « traversable's session history entries ».
For each entryList of entryLists:
For each entry of entryList:
Append entry's step to steps.
For each nestedHistory of entry's document state's nested histories, append nestedHistory's entries list to entryLists.
Return steps, sorted.
Certain actions cause a navigable to navigate to a new resource.
For example, following a hyperlink,
form submission, and the window.open()
and location.assign()
methods can all cause navigation.
Before we can jump into the navigation algorithm itself, we need to establish several important structures that it uses.
The source snapshot params struct is used to capture data from a
Document
initiating a navigation. It is snapshotted at the beginning of a navigation
and used throughout the navigation's lifetime. It has the following items:
To snapshot source snapshot params
given a Document
sourceDocument, return a new source snapshot
params with
The target snapshot params struct is used to capture data from a navigable being navigated. Like source snapshot params, it is snapshotted at the beginning of a navigation and used throughout the navigation's lifetime. It has the following items:
To snapshot target snapshot params given a navigable targetNavigable, return a new target snapshot params with sandboxing flags set to the result of determining the creation sandboxing flags given targetNavigable's active browsing context and targetNavigable's container.
Much of the navigation process is concerned with determining how to create a new
Document
, which ultimately happens in the create and initialize a Document
object
algorithm. The parameters to that algorithm are tracked via a navigation params
struct, which has the following items:
Document
, once it has been createdDocument
Document
Document
Document
Document
NavigationTimingType
used for creating the navigation timing entry for the new Document
Document
's about base URLOnce a navigation params struct is created, this standard does not mutate any of its items. They are only passed onward to other algorithms.
A navigation ID is a UUID string generated during navigation. It is used to interface with the WebDriver BiDi specification as well as to track the ongoing navigation. WEBDRIVERBIDI
After Document
creation, the relevant traversable navigable's session history gets updated. The
NavigationHistoryBehavior
enumeration is used to indicate the desired type of session
history update to the navigate algorithm. It is one of the following:
push
"replace
"auto
"push
" or "replace
". Usually it becomes "push
", but under certain circumstances it becomes "replace
" instead.A history handling behavior is a NavigationHistoryBehavior
that is
either "push
" or "replace
", i.e., that has been resolved away from
any initial "auto
" value.
The navigation must be a replace, given a URL url and a
Document
document, if any of the following are true:
url's scheme is "javascript
"; or
document's is initial about:blank
is true.
Other cases that often, but not always, force a "replace
" navigation are:
if the Document
is not completely loaded; or
if the target URL equals the Document
's URL.
Various parts of the platform track whether a user is involved in a navigation. A user navigation involvement is one of the following:
browser UI
"activation
"none
"For convenience at certain call sites, the user navigation
involvement for an Event
event is defined as follows:
Assert: this algorithm is being called as part of an activation behavior definition.
Assert: event's type
is
"click
".
If event's isTrusted
is initialized
to true, then return "activation
".
Return "none
".
To navigate a navigable navigable to a
URL url using a Document
sourceDocument, with an optional POST resource,
string, or null documentResource (default null), an optional response-or-null response (default null), an optional boolean
exceptionsEnabled (default
false), an optional NavigationHistoryBehavior
historyHandling (default "auto
"), an optional serialized
state-or-null navigationAPIState (default null), an optional entry list or
null formDataEntryList (default null), an optional referrer
policy referrerPolicy (default
the empty string), and an optional user navigation involvement userInvolvement (default "none
"):
Let cspNavigationType be "form-submission
" if
formDataEntryList is non-null; otherwise "other
".
Let sourceSnapshotParams be the result of snapshotting source snapshot params given sourceDocument.
Let initiatorOriginSnapshot be sourceDocument's origin.
Let initiatorBaseURLSnapshot be sourceDocument's document base URL.
If sourceDocument's node navigable is not allowed by sandboxing to navigate navigable given sourceSnapshotParams, then:
If exceptionsEnabled is true, then throw a
"SecurityError
" DOMException
.
Return.
Let navigationId be the result of generating a random UUID. WEBCRYPTO
If the surrounding agent is equal to navigable's active document's relevant agent, then continue these steps. Otherwise, queue a global task on the navigation and traversal task source given navigable's active window to continue these steps.
We do this because we are about to look at a lot of properties of navigable's active document, which are in theory only accessible over in the appropriate event loop. (But, we do not want to unconditionally queue a task, since — for example — same-event-loop fragment navigations need to take effect synchronously.)
Another implementation strategy would be to replicate the relevant information across event loops, or into a canonical "browser process", so that it can be consulted without queueing a task. This could give different results than what we specify here in edge cases, where the relevant properties have changed over in the target event loop but not yet been replicated. Further testing is needed to determine which of these strategies best matches browser behavior, in such racy edge cases.
If navigable's active document's
unload counter is greater than 0, then invoke WebDriver BiDi navigation
failed with a WebDriver BiDi navigation status whose id is navigationId, status is "canceled
", and url is url, and return.
Let container be navigable's container.
If container is an iframe
element and will lazy load
element steps given container returns true, then stop
intersection-observing a lazy loading element container and set
container's lazy load resumption steps to null.
If the navigation must be a replace given url and
navigable's active document, then set
historyHandling to "replace
".
If navigable's parent is non-null, then set
navigable's is delaying load
events to
true.
Let targetBrowsingContext be navigable's active browsing context.
Let targetSnapshotParams be the result of snapshotting target snapshot params given navigable.
Invoke WebDriver BiDi navigation started with
targetBrowsingContext, and a new WebDriver BiDi navigation status whose
id is navigationId, status is "pending
", and url is url.
If navigable's ongoing navigation is "traversal
", then:
Invoke WebDriver BiDi navigation failed with
targetBrowsingContext and a new WebDriver BiDi navigation status whose
id is navigationId, status is "canceled
", and url is url.
Return.
Any attempts to navigate a navigable that is currently traversing are ignored.
Set the ongoing navigation for navigable to navigationId.
This will have the effect of aborting other ongoing navigations of navigable, since at certain points during navigation changes to the ongoing navigation will cause further work to be abandoned.
If url's scheme is "javascript
", then:
Queue a global task on the navigation and traversal task
source given navigable's active window to
navigate to a javascript:
URL given navigable,
url, historyHandling, initiatorOriginSnapshot, and
cspNavigationType.
Return.
If all of the following are true:
userInvolvement is not "browser
UI
";
navigable's active document's origin is same origin-domain with sourceDocument's origin;
navigable's active document's is
initial about:blank
is false; and
url's scheme is a fetch scheme,
then:
Let navigation be navigable's active window's navigation API.
Let entryListForFiring be formDataEntryList if documentResource is a POST resource; otherwise, null.
Let navigationAPIStateForFiring be navigationAPIState if navigationAPIState is not null; otherwise, StructuredSerializeForStorage(undefined).
Let continue be the result of firing a push/replace/reload navigate
event at navigation with navigationType set to historyHandling,
isSameDocument set to false, userInvolvement set to
userInvolvement, formDataEntryList set to
entryListForFiring, destinationURL
set to url, and navigationAPIState set to
navigationAPIStateForFiring.
If continue is false, then return.
It is possible for navigations with userInvolvement of "browser UI
" or initiated by a cross origin-domain sourceDocument to fire navigate
events, if they go through the earlier navigate to a fragment path.
In parallel, run these steps:
Let unloadPromptCanceled be the result of checking if unloading is canceled for navigable's active document's inclusive descendant navigables.
If unloadPromptCanceled is true, or navigable's ongoing navigation is no longer navigationId, then:
Invoke WebDriver BiDi navigation failed with
targetBrowsingContext and a new WebDriver BiDi navigation status
whose id is navigationId, status is "canceled
", and url is url.
Abort these steps.
Queue a global task on the navigation and traversal task source given navigable's active window to abort a document and its descendants given navigable's active document.
If url matches about:blank
or
is about:srcdoc
, then:
Set documentState's origin to initiatorOriginSnapshot.
Set documentState's about base URL to initiatorBaseURLSnapshot.
Let historyEntry be a new session history entry, with its URL set to url and its document state set to documentState.
Let navigationParams be null.
If response is non-null:
Let policyContainer be the result of determining navigation params policy container given response's URL, null, a clone of the sourceDocument's policy container, navigable's container document's policy container, and null.
Let finalSandboxFlags be the union of targetSnapshotParams's sandboxing flags and policyContainer's CSP list's CSP-derived sandboxing flags.
Let responseOrigin be the result of determining the origin given response's URL, finalSandboxFlags, and documentState's initiator origin.
Let coop be a new opener policy.
Let coopEnforcementResult be a new opener policy enforcement result with
Set navigationParams to a new navigation params, with
navigate
"Attempt to populate the history entry's document for historyEntry,
given navigable, "navigate
", sourceSnapshotParams,
targetSnapshotParams, navigationId, navigationParams,
cspNavigationType, with allowPOST
set to true and completionSteps set to the following
step:
Append session history traversal steps to navigable's traversable to finalize a cross-document navigation given navigable, historyHandling, and historyEntry.
Although the usual cross-document navigation case will first foray into populating a session history entry with a
Document
, all navigations that don't get aborted will ultimately end up calling into
one of the below algorithms.
To finalize a cross-document navigation given a navigable navigable, history handling behavior historyHandling, and session history entry historyEntry:
Assert: this is running on navigable's traversable navigable's session history traversal queue.
Set navigable's is delaying load
events to false.
If historyEntry's document is null, then return.
This means that attempting to populate the history entry's document ended up not creating a document, as a result of e.g., the navigation being canceled by a subsequent navigation, a 204 No Content response, etc.
If all of the following are true:
navigable's parent is null;
historyEntry's document's browsing context is not an auxiliary browsing context whose opener browsing context is non-null; and
historyEntry's document's origin is not navigable's active document's origin,
then set historyEntry's document state's navigable target name to the empty string.
Let entryToReplace be navigable's active session history entry if
historyHandling is "replace
",
otherwise null.
Let traversable be navigable's traversable navigable.
Let targetStep be null.
Let targetEntries be the result of getting session history entries for navigable.
If entryToReplace is null, then:
Clear the forward session history of traversable.
Set targetStep to traversable's current session history step + 1.
Set historyEntry's step to targetStep.
Append historyEntry to targetEntries.
Otherwise:
Replace entryToReplace with historyEntry in targetEntries.
Set historyEntry's step to entryToReplace's step.
If historyEntry's document state's origin is same origin with entryToReplace's document state's origin, then set historyEntry's navigation API key to entryToReplace's navigation API key.
Set targetStep to traversable's current session history step.
Apply the push/replace history step targetStep to traversable given historyHandling.
javascript:
URL special casejavascript:
URLs have a dedicated label
on the issue tracker documenting various problems with their specification.
To navigate to a javascript:
URL, given a navigable
targetNavigable, a URL url, a history handling
behavior historyHandling, an origin initiatorOrigin,
and a string cspNavigationType:
Assert: historyHandling is "replace
".
Set the ongoing navigation for targetNavigable to null.
If initiatorOrigin is not same origin-domain with targetNavigable's active document's origin, then return.
Let request be a new request whose URL is url.
This is a synthetic request solely for plumbing into the next step. It will never hit the network.
If the result of should navigation request of type be blocked by Content Security
Policy? given request and cspNavigationType is "Blocked
", then return. CSP
Let newDocument be the result of evaluating a javascript:
URL given targetNavigable,
url, and initiatorOrigin.
If newDocument is null, then return.
In this case, some JavaScript code was executed, but no new
Document
was created, so we will not perform a navigation.
Assert: initiatorOrigin is newDocument's origin.
Let entryToReplace be targetNavigable's active session history entry.
Let oldDocState be entryToReplace's document state.
Let documentState be a new document state with
Let historyEntry be a new session history entry, with
For the URL, we do not use
url, i.e. the actual javascript:
URL that
the navigate algorithm was called with. This means javascript:
URLs are never stored in session history, and so can never be
traversed to.
Append session history traversal steps to targetNavigable's traversable to finalize a cross-document navigation with targetNavigable, historyHandling, and historyEntry.
To evaluate a javascript:
URL given a navigable
targetNavigable, a URL url, and an origin
newDocumentOrigin:
Let urlString be the result of running the URL serializer on url.
Let encodedScriptSource be the result of removing the leading "javascript:
" from urlString.
Let scriptSource be the UTF-8 decoding of the percent-decoding of encodedScriptSource.
Let settings be targetNavigable's active document's relevant settings object.
Let baseURL be settings's API base URL.
Let script be the result of creating a classic script given scriptSource, settings, baseURL, and the default script fetch options.
Let evaluationStatus be the result of running the classic script script.
Let result be null.
If evaluationStatus is a normal completion, and evaluationStatus.[[Value]] is a String, then set result to evaluationStatus.[[Value]].
Otherwise, return null.
Let response be a new response with
Content-Type
`, `text/html;charset=utf-8
`) »The encoding to UTF-8 means that unpaired surrogates will not roundtrip, once the HTML parser decodes the response body.
Let policyContainer be targetNavigable's active document's policy container.
Let finalSandboxFlags be policyContainer's CSP list's CSP-derived sandboxing flags.
Let coop be targetNavigable's active document's opener policy.
Let coopEnforcementResult be a new opener policy enforcement result with
Let navigationParams be a new navigation params, with
Document
to be null; is that correct?navigate
"Return the result of loading an HTML document given navigationParams.
To navigate to a fragment given a navigable navigable, a URL url, a history handling behavior historyHandling, a user navigation involvement userInvolvement, a serialized state-or-null navigationAPIState, and a navigation ID navigationId:
Let navigation be navigable's active window's navigation API.
Let destinationNavigationAPIState be navigable's active session history entry's navigation API state.
If navigationAPIState is not null, then set destinationNavigationAPIState to navigationAPIState.
Let continue be the result of firing a push/replace/reload navigate
event at
navigation with navigationType set to
historyHandling, isSameDocument set
to true, userInvolvement set to
userInvolvement, destinationURL
set to url, and navigationAPIState set to
destinationNavigationAPIState.
If continue is false, then return.
Let historyEntry be a new session history entry, with
For navigations peformed with navigation.navigate()
, the value provided by the state
option is used for the new navigation API state. (This will set it to the
serialization of undefined, if no value is provided for that option.) For other fragment
navigations, including user-initiated ones, the navigation API state is carried over from the previous
entry.
The classic history API state is never carried over.
Let entryToReplace be navigable's active session history entry if
historyHandling is "replace
",
otherwise null.
Let history be navigable's active document's history object.
Let scriptHistoryIndex be history's index.
Let scriptHistoryLength be history's length.
If historyHandling is "push
",
then:
Set history's state to null.
Increment scriptHistoryIndex.
Set scriptHistoryLength to scriptHistoryIndex + 1.
Set navigable's active document's URL to url.
Set navigable's active session history entry to historyEntry.
Update document for history step application given navigable's active document, historyEntry, true, scriptHistoryIndex, scriptHistoryLength, and historyHandling.
This algorithm will be called twice as a result of a single fragment
navigation: once synchronously, where best-guess values scriptHistoryIndex and
scriptHistoryLength are set, history.state
is nulled out, and various events are fired; and once asynchronously, where the final values for
index and length are set, history.state
remains
untouched, and no events are fired.
Scroll to the fragment given navigable's active document.
If the scrolling fails because the Document
is new and the
relevant ID has not yet been parsed, then the second
asynchronous call to update document for history step application will take
care of scrolling.
Let traversable be navigable's traversable navigable.
Append the following session history synchronous navigation steps involving navigable to traversable:
Finalize a same-document navigation given traversable, navigable, historyEntry, entryToReplace, and historyHandling.
Invoke WebDriver BiDi fragment navigated with navigable's active browsing context and a new WebDriver BiDi navigation
status whose id is navigationId,
url is url, and status is "complete
".
To finalize a same-document navigation given a traversable navigable traversable, a navigable targetNavigable, a session history entry targetEntry, a session history entry-or-null entryToReplace, and a history handling behavior historyHandling:
This is used by both fragment navigations and by the URL and history update steps, which are the only synchronous updates to session history. By virtue of being synchronous, those algorithms are performed outside of the top-level traversable's session history traversal queue. This puts them out of sync with the top-level traversable's current session history step, so this algorithm is used to resolve conflicts due to race conditions.
Assert: this is running on traversable's session history traversal queue.
If targetNavigable's active session history entry is not targetEntry, then return.
Let targetStep be null.
Let targetEntries be the result of getting session history entries for targetNavigable.
If entryToReplace is null, then:
Clear the forward session history of traversable.
Set targetStep to traversable's current session history step + 1.
Set targetEntry's step to targetStep.
Append targetEntry to targetEntries.
Otherwise:
Replace entryToReplace with targetEntry in targetEntries.
Set targetEntry's step to entryToReplace's step.
Set targetStep to traversable's current session history step.
Apply the push/replace history step targetStep to traversable given historyHandling.
This is done even for "replace
" navigations, as it resolves race
conditions across multiple synchronous navigations.
The input to attempt to create a non-fetch scheme document is the non-fetch scheme navigation params struct. It is a lightweight version of navigation params which only carries parameters relevant to the non-fetch scheme navigation case. It has the following items:
an origin possibly for use in a user-facing prompt to confirm the invocation of an external software package
This differs slightly from a document state's initiator origin in that a non-fetch scheme navigation params's initiator origin follows redirects up to the last fetch scheme URL in a redirect chain that ends in a non-fetch scheme URL.
NavigationTimingType
used for creating the navigation timing entry for the new Document
If url is to be handled using a mechanism that does not affect navigable, e.g., because url's scheme is handled externally, then:
Hand-off to external software given url, navigable, navigationParams's target snapshot sandboxing flags, navigationParams's source snapshot has transient activation, and navigationParams's initiator origin.
Return null.
Handle url by displaying some sort of inline content, e.g., an error message because the specified scheme is not one of the supported protocols, or an inline prompt to allow the user to select a registered handler for the given scheme. Return the result of displaying the inline content given navigable, navigationParams's id, and navigationParams's navigation timing type.
In the case of a registered handler being used, navigate will be invoked with a new URL.
To hand-off to external software given a URL or response resource, a navigable navigable, a sandboxing flag set sandboxFlags, a boolean hasTransientActivation, and an origin initiatorOrigin user agents should:
If all of the following are true:
navigable is not a top-level traversable;
sandboxFlags has its sandboxed custom protocols navigation browsing context flag set; and
sandboxFlags has its sandboxed top-level navigation with user activation browsing context flag set, or hasTransientActivation is false,
then return without invoking the external software package.
Navigation inside an iframe toward external software can be seen by users as a
new popup or a new top-level navigation. That's why its is allowed in sandboxed
iframe
only when one of allow-popups
, allow-top-navigation
, allow-top-navigation-by-user-activation
,
or allow-top-navigation-to-custom-protocols
is specified.
Perform the appropriate handoff of resource while attempting to mitigate the risk that this is an attempt to exploit the target software. For example, user agents could prompt the user to confirm that initiatorOrigin is to be allowed to invoke the external software in question. In particular, if hasTransientActivation is false, then the user agent should not invoke the external software package without prior user confirmation.
For example, there could be a vulnerability in the target software's URL handler which a hostile page would attempt to exploit by tricking a user into clicking a link.
A couple of scenarios can intervene early in the navigation process and put the whole thing to a halt. This can be especially exciting when multiple navigables are navigating at the same time, due to a session history traversal.
A navigable source is allowed by sandboxing to navigate a second navigable target, given a source snapshot params sourceSnapshotParams, if the following steps return true:
If source is target, then return true.
If source is an ancestor of target, then return true.
If target is an ancestor of source, then:
If target is not a top-level traversable, then return true.
If sourceSnapshotParams's has transient activation is true, and sourceSnapshotParams's sandboxing flags's sandboxed top-level navigation with user activation browsing context flag is set, then return false.
If sourceSnapshotParams's has transient activation is false, and sourceSnapshotParams's sandboxing flags's sandboxed top-level navigation without user activation browsing context flag is set, then return false.
Return true.
If target is a top-level traversable:
If source is the one permitted sandboxed navigator of target, then return true.
If sourceSnapshotParams's sandboxing flags's sandboxed navigation browsing context flag is set, then return false.
Return true.
If sourceSnapshotParams's sandboxing flags's sandboxed navigation browsing context flag is set, then return false.
Return true.
To check if unloading is canceled for a list of navigables navigablesThatNeedBeforeUnload, given an optional
traversable navigable traversable, an optional integer
targetStep, and an optional user navigation involvement-or-null
userInvolvementForNavigateEvent, run these steps. They return "canceled-by-beforeunload
", "canceled-by-navigate
", or
"continue
".
Let documentsToFireBeforeunload be the active document of each item in navigablesThatNeedBeforeUnload.
Let unloadPromptShown be false.
Let finalStatus be "continue
".
If traversable was given, then:
Assert: targetStep and userInvolvementForNavigateEvent were given.
Let targetEntry be the result of getting the target history entry given traversable and targetStep.
If targetEntry is not traversable's current session history entry, and targetEntry's document state's origin is the same as traversable's current session history entry's document state's origin, then:
In this case, we're going to fire the navigate
event
for traversable here. Because under some circumstances it might be
canceled, we need to do this separately from other traversal navigate
events, which happen later.
Additionally, because we want beforeunload
events
to fire before navigate
events, this means we need to
fire beforeunload
for traversable here
(if applicable), instead of doing it as part of the below loop over
documentsToFireBeforeunload.
Assert: userInvolvementForNavigateEvent is not null.
Let eventsFired be false.
Let needsBeforeunload be true if navigablesThatNeedBeforeUnload contains traversable; otherwise false.
If needsBeforeunload is true, then remove traversable's active document from documentsToFireBeforeunload.
Queue a global task on the navigation and traversal task source given traversable's active window to perform the following steps:
If needsBeforeunload is true, then:
Let (unloadPromptShownForThisDocument,
unloadPromptCanceledByThisDocument) be the result of running the steps
to fire beforeunload
given
traversable's active document and
false.
If unloadPromptShownForThisDocument is true, then set unloadPromptShown to true.
If unloadPromptCanceledByThisDocument is true, then set
finalStatus to "canceled-by-beforeunload
".
If finalStatus is "canceled-by-beforeunload
", then
abort these steps.
Let navigation be traversable's active window's navigation API.
Let navigateEventResult be the result of firing a traverse navigate
event at navigation given targetEntry and
userInvolvementForNavigateEvent.
If navigateEventResult is false, then set finalStatus to
"canceled-by-navigate
".
Set eventsFired to true.
Wait until eventsFired is true.
If finalStatus is not "continue
", then return
finalStatus.
Let totalTasks be the size of documentsThatNeedBeforeunload.
Let completedTasks be 0.
For each document of documents, queue a global task on the navigation and traversal task source given document's relevant global object to run the steps:
Let (unloadPromptShownForThisDocument,
unloadPromptCanceledByThisDocument) be the result of running the steps to fire
beforeunload
given document and
unloadPromptShown.
If unloadPromptShownForThisDocument is true, then set unloadPromptShown to true.
If unloadPromptCanceledByThisDocument is true, then set
finalStatus to "canceled-by-beforeunload
".
Increment completedTasks.
Wait for completedTasks to be totalTasks.
Return finalStatus.
The steps to fire beforeunload
given a
Document
document and a boolean unloadPromptShown are:
Let unloadPromptCanceled be false.
Increase the document's unload counter by 1.
Increase document's relevant agent's event loop's termination nesting level by 1.
Let eventFiringResult be the result of firing
an event named beforeunload
at
document's relevant global object, using BeforeUnloadEvent
,
with the cancelable
attribute initialized to
true.
Decrease document's relevant agent's event loop's termination nesting level by 1.
If all of the following are true:
unloadPromptShown is false;
document's active sandboxing flag set does not have its sandboxed modals flag set;
document's relevant global object has sticky activation;
eventFiringResult is false, or the returnValue
attribute of event is
not the empty string; and
showing an unload prompt is unlikely to be annoying, deceptive, or pointless,
then:
Set unloadPromptShown to true.
Let userPromptHandler be the result of WebDriver BiDi user prompt
opened with document's relevant global object,
"beforeunload
", and "".
If userPromptHandler is "dismiss
", then set
unloadPromptCanceled to true.
If userPromptHandler is "none
", then:
Ask the user to confirm that they wish to unload the document, and pause while waiting for the user's response.
The message shown to the user is not customizable, but instead determined by
the user agent. In particular, the actual value of the returnValue
attribute is ignored.
If the user did not confirm the page navigation, then set unloadPromptCanceled to true.
Invoke WebDriver BiDi user prompt closed with document's
relevant global object, "beforeunload
", and true
if unloadPromptCanceled is false or false otherwise.
Decrease document's unload counter by 1.
Return (unloadPromptShown, unloadPromptCanceled).
To set the ongoing navigation for a navigable navigable to newValue:
If navigable's ongoing navigation is equal to newValue, then return.
Inform the navigation API about aborting navigation given navigable.
Set navigable's ongoing navigation to newValue.
To reload a navigable navigable given an optional
serialized state-or-null navigationAPIState (default null) and an
optional user navigation involvement userInvolvement (default "none
"):
If userInvolvement is not "browser UI
",
then:
Let navigation be navigable's active window's navigation API.
Let destinationNavigationAPIState be navigable's active session history entry's navigation API state.
If navigationAPIState is not null, then set destinationNavigationAPIState to navigationAPIState.
Let continue be the result of firing a push/replace/reload navigate
event at navigation with navigationType set to "reload
", isSameDocument set to false, userInvolvement set to
userInvolvement, destinationURL
set to navigable's active session history
entry's URL, and navigationAPIState set to
destinationNavigationAPIState.
If continue is false, then return.
Set navigable's active session history entry's document state's reload pending to true.
Let traversable be navigable's traversable navigable.
Append the following session history traversal steps to traversable:
Apply the reload history step to traversable.
To traverse the history by a delta given a traversable navigable
traversable, an integer delta, and an optional Document
sourceDocument:
Let sourceSnapshotParams and initiatorToCheck be null.
Let userInvolvement be "browser
UI
".
If sourceDocument is given, then:
Set sourceSnapshotParams to the result of snapshotting source snapshot params given sourceDocument.
Set initiatorToCheck to sourceDocument's node navigable.
Set userInvolvement to "none
".
Append the following session history traversal steps to traversable:
Let allSteps be the result of getting all used history steps for traversable.
Let currentStepIndex be the index of traversable's current session history step within allSteps.
Let targetStepIndex be currentStepIndex plus delta.
If allSteps[targetStepIndex] does not exist, then abort these steps.
Apply the traverse history step allSteps[targetStepIndex] to traversable, given sourceSnapshotParams, initiatorToCheck, and userInvolvement.
Apart from the navigate algorithm, session
history entries can be pushed or replaced via one more mechanism, the URL and
history update steps. The most well-known callers of these steps are the history.replaceState()
and history.pushState()
APIs, but various other parts of the
standard also need to perform updates to the active
history entry, and they use these steps to do so.
The URL and history update steps, given a Document
document, a URL newURL, an optional serialized
state-or-null serializedData (default
null), and an optional history handling behavior historyHandling (default "replace
"), are:
Let navigable be document's node navigable.
Let activeEntry be navigable's active session history entry.
Let newEntry be a new session history entry, with
If document's is initial about:blank
is true, then set
historyHandling to "replace
".
This means that pushState()
on an
initial about:blank
Document
behaves as a replaceState()
call.
Let entryToReplace be activeEntry if historyHandling is
"replace
", otherwise null.
If historyHandling is "push
",
then:
Increment document's history object's index.
Set document's history object's length to its index + 1.
These are temporary best-guess values for immediate synchronous access.
If serializedData is not null, then restore the history object state given document and newEntry.
Set document's URL to newURL.
Since this is neither a navigation nor a history traversal, it does not cause a hashchange
event to be fired.
Set document's latest entry to newEntry.
Set navigable's active session history entry to newEntry.
Update the navigation API entries for a same-document navigation given document's relevant global object's navigation API, newEntry, and historyHandling.
Let traversable be navigable's traversable navigable.
Append the following session history synchronous navigation steps involving navigable to traversable:
Finalize a same-document navigation given traversable, navigable, newEntry, entryToReplace, and historyHandling.
Invoke WebDriver BiDi history updated with navigable.
Although both fragment navigation and the
URL and history update steps perform synchronous history updates, only fragment
navigation contains a synchronous call to update document for history step
application. The URL and history update steps instead perform a few select
updates inside the above algorithm, omitting others. This is somewhat of an unfortunate
historical accident, and generally leads to web-developer sadness about the
inconsistency. For example, this means that popstate
events
fire for fragment navigations, but not for history.pushState()
calls.
As explained in the overview, both navigation and traversal involve creating a session history entry and then attempting to populate its document member, so that it can be presented inside the navigable.
This involves either: using an already-given
response; using the srcdoc resource stored in
the session history entry; or fetching. The process has several failure modes, which can either result in
doing nothing (leaving the navigable on its currently-active Document
) or can result in populating the
session history entry with an error
document.
To attempt to populate the history entry's document for a session history
entry entry, given a navigable navigable, a
NavigationTimingType
navTimingType, a source snapshot params
sourceSnapshotParams, a target snapshot params
targetSnapshotParams, an optional navigation ID-or-null
navigationId (default null), an optional navigation params-or-null
navigationParams (default null), an optional string cspNavigationType
(default "other
"), an optional boolean allowPOST (default false), and optional
algorithm steps completionSteps (default an empty
algorithm):
Assert: this is running in parallel.
Assert: if navigationParams is non-null, then navigationParams's response is non-null.
Let currentBrowsingContext be navigable's active browsing context.
Let documentResource be entry's document state's resource.
If navigationParams is null, then:
If documentResource is a string, then set navigationParams to the result of creating navigation params from a srcdoc resource given entry, navigable, targetSnapshotParams, navigationId, and navTimingType.
Otherwise, if all of the following are true:
entry's URL's scheme is a fetch scheme; and
documentResource is null, or allowPOST is true and documentResource's request body is not failure,
then set navigationParams to the result of creating navigation params by fetching given entry, navigable, sourceSnapshotParams, targetSnapshotParams, cspNavigationType, navigationId, and navTimingType.
Otherwise, if entry's URL's scheme is not a fetch scheme, then set navigationParams to a new non-fetch scheme navigation params, with
To create navigation params from a srcdoc resource given a session history
entry entry, a navigable navigable, a target
snapshot params targetSnapshotParams, a navigation ID-or-null
navigationId, and a NavigationTimingType
navTimingType:
Let documentResource be entry's document state's resource.
Let response be a new response with
about:srcdoc
Content-Type
`, `text/html
`) »Let responseOrigin be the result of determining the origin given response's URL, targetSnapshotParams's sandboxing flags, and entry's document state's origin.
Let coop be a new opener policy.
Let coopEnforcementResult be a new opener policy enforcement result with
Let policyContainer be the result of determining navigation params policy container given response's URL, entry's document state's history policy container, null, navigable's container document's policy container, and null.
Return a new navigation params, with
This algorithm mutates entry.
Assert: this is running in parallel.
Let documentResource be entry's document state's resource.
Let request be a new request, with
document
"include
"manual
"navigate
"If documentResource is a POST resource, then:
Set request's method to `POST
`.
Set request's body to documentResource's request body.
Set `Content-Type
`
to documentResource's request
content-type in request's header
list.
If entry's document state's reload pending is true, then set request's reload-navigation flag.
Otherwise, if entry's document state's ever populated is true, then set request's history-navigation flag.
If sourceSnapshotParams's has transient activation is true, then set request's user-activation to true.
If navigable's container is non-null:
If the navigable's container has a browsing context scope origin, then set request's origin to that browsing context scope origin.
Set request's destination to navigable's container's local name.
If sourceSnapshotParams's fetch client is navigable's container document's relevant settings object, then set request's initiator type to navigable's container's local name.
This ensure that only container-initiated navigations are reported to resource timing.
Let response be null.
Let responseOrigin be null.
Let fetchController be null.
Let coopEnforcementResult be a new opener policy enforcement result, with
Let finalSandboxFlags be an empty sandboxing flag set.
Let responsePolicyContainer be null.
Let responseCOOP be a new opener policy.
Let locationURL be null.
Let currentURL be request's current URL.
Let commitEarlyHints be null.
While true:
If request's reserved client is not null and currentURL's origin is not the same as request's reserved client's creation URL's origin, then:
Run the environment discarding steps for request's reserved client.
Set request's reserved client to null.
Set commitEarlyHints to null.
Preloaded links from early hint headers remain in the preload cache after a same origin redirect, but get discarded when the redirect is cross-origin.
If request's reserved client is null, then:
Let topLevelCreationURL be currentURL.
Let topLevelOrigin be null.
If navigable is not a top-level traversable, then:
Let parentEnvironment be navigable's parent's active document's relevant settings object.
Set topLevelCreationURL to parentEnvironment's top-level creation URL.
Set topLevelOrigin to parentEnvironment's top-level origin.
Set request's reserved client to a new environment whose id is a unique opaque string, target browsing context is navigable's active browsing context, creation URL is currentURL, top-level creation URL is topLevelCreationURL, and top-level origin is topLevelOrigin.
The created environment's active service worker is set in the Handle Fetch algorithm during the fetch if the request URL matches a service worker registration. SW
If the result of should navigation request of type be blocked by Content Security
Policy? given request and cspNavigationType is "Blocked
", then set response to a network error and
break. CSP
Set response to null.
If fetchController is null, then set fetchController to the result of fetching request, with processEarlyHintsResponse set to processEarlyHintsResponse as defined below, processResponse set to processResponse as defined below, and useParallelQueue set to true.
Let processEarlyHintsResponse be the following algorithm given a response earlyResponse:
If commitEarlyHints is null, then set commitEarlyHints to the result of processing early hint headers given earlyResponse and request's reserved client.
Let processResponse be the following algorithm given a response fetchedResponse:
Set response to fetchedResponse.
Otherwise, process the next manual redirect for fetchController.
This will result in calling the processResponse we supplied above, during our first iteration through the loop, and thus setting response.
Navigation handles redirects manually as navigation is the only place in the
web platform that cares for redirects to mailto:
URLs
and such.
Wait until either response is non-null, or navigable's ongoing navigation changes to no longer equal navigationId.
If the latter condition occurs, then abort fetchController, and return.
Otherwise, proceed onward.
If request's body is null, then set entry's document state's resource to null.
Fetch unsets the body for particular redirects.
Set responsePolicyContainer to the result of creating a policy container from a fetch response given response and request's reserved client.
Set finalSandboxFlags to the union of targetSnapshotParams's sandboxing flags and responsePolicyContainer's CSP list's CSP-derived sandboxing flags.
Set responseOrigin to the result of determining the origin given response's URL, finalSandboxFlags, and entry's document state's initiator origin.
If response is a redirect, then response's URL will be the URL that led to the redirect to response's location URL; it will not be the location URL itself.
If navigable is a top-level traversable, then:
Set responseCOOP to the result of obtaining an opener policy given response and request's reserved client.
Set coopEnforcementResult to the result of enforcing the response's opener policy given navigable's active browsing context, response's URL, responseOrigin, responseCOOP, coopEnforcementResult and request's referrer.
If finalSandboxFlags is not empty and responseCOOP's value is not "unsafe-none
", then set response to an
appropriate network error and break.
This results in a network error as one cannot simultaneously provide a clean slate to a response using opener policy and sandbox the result of navigating to that response.
If response is not a network error, navigable is a child navigable, and the result of performing a cross-origin resource policy check with navigable's container document's origin, navigable's container document's relevant settings object, request's destination, response, and true is blocked, then set response to a network error and break.
Here we're running the cross-origin resource policy check against the parent navigable rather than navigable itself. This is because we care about the same-originness of the embedded content against the parent context, not the navigation source.
Set locationURL to response's location URL given currentURL's fragment.
If locationURL is failure or null, then break.
Assert: locationURL is a URL.
Set entry's classic history API state to StructuredSerializeForStorage(null).
Let oldDocState be entry's document state.
Set entry's document state to a new document state, with
For the navigation case, only entry referenced oldDocState, which was created early in the navigate algorithm. So for navigations, this is functionally just an update to entry's document state. For the traversal case, it's possible adjacent session history entries also reference oldDocState, in which case they will continue doing so even after we've updated entry's document state.
oldDocState's history policy container is only ever non-null here in the traversal case, after we've populated it during a navigation to a URL that requires storing the policy container in history.
The setup is given by the following Jake diagram:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
top | /a | /a#foo | /a#bar | /b |
Also assume that the document state shared by the entries in steps 0, 1, and 2 has a null document, i.e., bfcache is not in play.
Now consider the scenario where we traverse back to step 2, but this time when fetching
/a
, the server responds with a `Location
`
header pointing to /c
. That is, locationURL points to
/c
and so we have reached this step instead of breaking out of the loop.
In this case, we replace the document state of the session history entry occupying step 2, but we do not replace the document state of the entries occupying steps 0 and 1. The resulting Jake diagram looks like this:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
top | /a | /a#foo | /c#bar | /b |
Note that we perform this replacement even if we end up in a redirect chain back to the
original URL, for example if /c
itself had a `Location
` header pointing to /a
. Such a case would
end up like so:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
top | /a | /a#foo | /a#bar | /b |
If locationURL's scheme is not an HTTP(S) scheme, then:
Set entry's document state's resource to null.
Break.
Set currentURL to locationURL.
Set entry's URL to currentURL.
By the end of this loop we will be in one of these scenarios:
locationURL is failure, because of an unparseable `Location
` header.
locationURL is null, either because response is a network
error or because we successfully fetched a non-network error HTTP(S)
response with no `Location
` header.
locationURL is a URL with a non-HTTP(S) scheme.
If locationURL is a URL whose scheme is not a fetch scheme, then return a new non-fetch scheme navigation params, with
At this point, request's current URL is the last URL in the redirect chain with a fetch scheme before redirecting to a non-fetch scheme URL. It is this URL's origin that will be used as the initiator origin for navigations to non-fetch scheme URLs.
If any of the following are true:
response is a network error;
locationURL is failure; or
locationURL is a URL whose scheme is a fetch scheme,
then return null.
We allow redirects to non-fetch scheme URLs, but redirects to fetch scheme URLs that aren't HTTP(S) are treated like network errors.
Assert: locationURL is null and response is not a network error.
Let resultPolicyContainer be the result of determining navigation params policy container given response's URL, entry's document state's history policy container, sourceSnapshotParams's source policy container, null, and responsePolicyContainer.
If navigable's container is an
iframe
, and response's timing allow passed flag is set, then
set container's pending resource-timing start time to
null.
If the iframe
is allowed to report to resource timing,
we don't need to run its fallback steps as the normal reporting would happen.
Return a new navigation params, with
An element has a browsing context scope origin if its Document
's
node navigable is a top-level traversable or if all of its
Document
's ancestor navigables all have active documents whose origins are the same origin as the element's
node document's origin. If an element
has a browsing context scope origin, then its value is the origin of the element's node document.
This definition is broken and needs investigation to see what it was intended to express: see issue #4703.
To load a document given navigation params
navigationParams, source snapshot params sourceSnapshotParams,
and origin initiatorOrigin, perform the following steps. They return a
Document
or null.
Let type be the computed type of navigationParams's response.
If the user agent has been configured to process resources of the given type using some mechanism other than rendering the content in a navigable, then skip this step. Otherwise, if the type is one of the following types:
text/css
"text/plain
"text/vtt
"multipart/x-mixed-replace
"multipart/x-mixed-replace
document, given navigationParams,
sourceSnapshotParams, and initiatorOrigin.application/pdf
"text/pdf
"Otherwise, proceed onward.
An explicitly supported XML MIME type is an XML MIME type for which
the user agent is configured to use an external application to render the content, or for which
the user agent has dedicated processing rules. For example, a web browser with a built-in Atom
feed viewer would be said to explicitly support the application/atom+xml
MIME
type.
An explicitly supported JSON MIME type is a JSON MIME type for which the user agent is configured to use an external application to render the content, or for which the user agent has dedicated processing rules.
In both cases, the external application or user agent will either display the content inline directly in navigationParams's navigable, or hand it off to external software. Both happen in the steps below.
Otherwise, the document's type is such that the resource will not affect navigationParams's navigable, e.g., because the resource is to be handed to an external application or because it is an unknown type that will be processed as a download. Hand-off to external software given navigationParams's response, navigationParams's navigable, navigationParams's final sandboxing flag set, sourceSnapshotParams's has transient activation, and initiatorOrigin.
Return null.
For both navigation and traversal, once we have an idea of where we want to head to in the
session history, much of the work comes about in applying that notion to the traversable
navigable and the relevant Document
. For navigations, this work generally
occurs toward the end of the process; for traversals, it is the beginning.
Ensuring a traversable ends up at the right session history step is particularly complex, as it can involve coordinating across multiple navigable descendants of the traversable, populating them in parallel, and then synchronizing back up to ensure everyone has the same view of the result. This is further complicated by the existence of synchronous same-document navigations being mixed together with cross-document navigations, and how web pages have come to have certain relative timing expectations.
A changing navigable continuation state is used to store information during the apply the history step algorithm, allowing parts of the algorithm to continue only after other parts have finished. It is a struct with:
Document
Although all updates to the traversable navigable end up in the same apply the history step algorithm, each possible entry point comes along with some minor customizations:
To update for navigable creation/destruction given a traversable navigable traversable:
Let step be traversable's current session history step.
Return the result of applying the history step step to traversable given false, null, null, null, and null.
To apply the push/replace history step given a non-negative integer step and a history handling behavior historyHandling to a traversable navigable traversable:
Return the result of applying the history step step to traversable given false, null, null, null, and historyHandling.
Apply the push/replace history step never passes source snapshot params or an initiator navigable to apply the history step. This is because those checks are done earlier in the navigation algorithm.
To apply the reload history step to a traversable navigable traversable:
Let step be traversable's current session history step.
Return the result of applying the history
step step to traversable given true, null, null, null,
and "reload
".
Apply the reload history step never passes source snapshot
params or an initiator navigable to apply the history step. This
is because reloading is always treated as if it were done by the navigable itself,
even in cases like parent.location.reload()
.
To apply the traverse history step given a non-negative integer step to a traversable navigable traversable, with source snapshot params sourceSnapshotParams, navigable initiatorToCheck, and user navigation involvement userInvolvement:
Return the result of applying the history
step step to traversable given true,
sourceSnapshotParams, initiatorToCheck,
userInvolvement, and "traverse
".
Now for the algorithm itself.
To apply the history step given a
non-negative integer step to a traversable navigable
traversable, with boolean checkForCancelation, source snapshot
params-or-null sourceSnapshotParams, navigable-or-null
initiatorToCheck, user navigation involvement-or-null
userInvolvementForNavigateEvents, and NavigationType
-or-null
navigationType, perform the following steps. They return "initiator-disallowed
", "canceled-by-beforeunload
", "canceled-by-navigate
", or "applied
".
Assert: This is running within traversable's session history traversal queue.
Let targetStep be the result of getting the used step given traversable and step.
If initiatorToCheck is not null, then:
Assert: sourceSnapshotParams is not null.
For each navigable of get all
navigables whose current session history entry will change or reload: if
initiatorToCheck is not allowed by sandboxing to navigate
navigable given sourceSnapshotParams, then return "initiator-disallowed
".
Let navigablesCrossingDocuments be the result of getting all navigables that might experience a cross-document traversal given traversable and targetStep.
If checkForCancelation is true, and the result of checking if unloading
is canceled given navigablesCrossingDocuments, traversable,
targetStep, and userInvolvementForNavigateEvents is not "continue
", then return that result.
Let changingNavigables be the result of get all navigables whose current session history entry will change or reload given traversable and targetStep.
Let nonchangingNavigablesThatStillNeedUpdates be the result of getting all navigables that only need history object length/index update given traversable and targetStep.
For each navigable of changingNavigables:
Let targetEntry be the result of getting the target history entry given navigable and targetStep.
Set navigable's current session history entry to targetEntry.
Set the ongoing navigation for navigable to "traversal
".
Let totalChangeJobs be the size of changingNavigables.
Let completedChangeJobs be 0.
Let changingNavigableContinuations be an empty queue of changing navigable continuation states.
This queue is used to split the operations on changingNavigables into two parts. Specifically, changingNavigableContinuations holds data for the second part.
For each navigable of changingNavigables, queue a global task on the navigation and traversal task source of navigable's active window to run the steps:
This set of steps are split into two parts to allow synchronous navigations to be processed before documents unload. State is stored in changingNavigableContinuations for the second part.
Let displayedEntry be navigable's active session history entry.
Let targetEntry be navigable's current session history entry.
Let changingNavigableContinuation be a changing navigable continuation state with:
If displayedEntry is targetEntry and targetEntry's document state's reload pending is false, then:
Set changingNavigableContinuation's update-only to true.
Enqueue changingNavigableContinuation on changingNavigableContinuations.
Abort these steps.
This case occurs due to a synchronous navigation which already updated the active session history entry.
Switch on navigationType:
reload
"Assert: targetEntry's document state's reload pending is true.
traverse
"Assert: targetEntry's document state's ever populated is true.
replace
"Assert: targetEntry's step is displayedEntry's step and targetEntry's document state's ever populated is false.
push
"Assert: targetEntry's step is displayedEntry's step + 1 and targetEntry's document state's ever populated is false.
Let oldOrigin be targetEntry's document state's origin.
If targetEntry's document is null, or targetEntry's document state's reload pending is true, then:
Let navTimingType be "back_forward
" if
targetEntry's document is null; otherwise
"reload
".
Let targetSnapshotParams be the result of snapshotting target snapshot params given navigable.
Let potentiallyTargetSpecificSourceSnapshotParams be sourceSnapshotParams.
If potentiallyTargetSpecificSourceSnapshotParams is null, then set it to the result of snapshotting source snapshot params given navigable's active document.
In this case there is no clear source of the traversal/reload. We treat this situation as if navigable navigated itself, but note that some properties of targetEntry's original initiator are preserved in targetEntry's document state, such as the initiator origin and referrer, which will appropriately influence the navigation.
Set targetEntry's document state's reload pending to false.
Let allowPOST be targetEntry's document state's reload pending.
In parallel, attempt to populate the history entry's document for targetEntry, given navigable, potentiallyTargetSpecificSourceSnapshotParams, targetSnapshotParams, with allowPOST set to allowPOST and completionSteps set to queue a global task on the navigation and traversal task source given navigable's active window to run afterDocumentPopulated.
Otherwise, run afterDocumentPopulated immediately.
In both cases, let afterDocumentPopulated be the following steps:
If targetEntry's document is null, then set changingNavigableContinuation's update-only to true.
This means we tried to populate the document, but were unable to do so, e.g. because of the server returning a 204.
These kinds of failed navigations or traversals will not be signaled to the navigation API (e.g., through the promises of any
navigation API method tracker, or the navigateerror
event). Doing so would leak information
about the timing of responses from other origins, in the cross-origin case, and providing
different results in the cross-origin vs. same-origin cases was deemed too confusing.
However, implementations could use this opportunity to clear any promise handlers for
the navigation.transition.finished
promise, as they are guaranteed at this point to never run. And, they might wish to
report a warning to the console if any part of the navigation API initiated
these navigations, to make it clear to the web developer why their promises will never
settle and events will never fire.
If targetEntry's document's origin is not oldOrigin, then set targetEntry's classic history API state to StructuredSerializeForStorage(null).
This clears history state when the origin changed vs a previous load of targetEntry without a redirect occuring. This can happen due to a change in CSP sandbox headers.
If all of the following are true:
navigable's parent is null;
targetEntry's document's browsing context is not an auxiliary browsing context whose opener browsing context is non-null; and
targetEntry's document's origin is not oldOrigin,
then set targetEntry's document state's navigable target name to the empty string.
Enqueue changingNavigableContinuation on changingNavigableContinuations.
The rest of this job runs later in this algorithm.
Let navigablesThatMustWaitBeforeHandlingSyncNavigation be an empty set.
While completedChangeJobs does not equal totalChangeJobs:
If traversable's running nested apply history step is false, then:
Let changingNavigableContinuation be the result of dequeuing from changingNavigableContinuations.
If changingNavigableContinuation is nothing, then continue.
Let displayedDocument be changingNavigableContinuation's displayed document.
Let targetEntry be changingNavigableContinuation's target entry.
Let navigable be changingNavigableContinuation's navigable.
Let (scriptHistoryLength, scriptHistoryIndex) be the result of getting the history object length and index given traversable and targetStep.
These values might have changed since they were last calculated.
Append navigable to navigablesThatMustWaitBeforeHandlingSyncNavigation.
Once a navigable has reached this point in traversal, additionally queued synchronous navigation steps are likely to be intended to occur after this traversal rather than before it, so they no longer jump the queue. More details can be found here.
Let entriesForNavigationAPI be the result of getting session history entries for the navigation API given navigable and targetStep.
If changingNavigableContinuation's update-only is true, or targetEntry's document is displayedDocument, then:
This is a same-document navigation: we proceed without unloading.
Set the ongoing navigation for navigable to null.
This allows new navigations of navigable to start, whereas during the traversal they were blocked.
Queue a global task on the navigation and traversal task source given navigable's active window to perform afterPotentialUnloads.
Otherwise:
Assert: navigationType is not null.
Deactivate displayedDocument, given userNavigationInvolvement, targetEntry, navigationType, and afterPotentialUnloads.
In both cases, let afterPotentialUnloads be the following steps:
Let previousEntry be navigable's active session history entry.
If changingNavigableContinuation's update-only is false, then activate history entry targetEntry for navigable.
Let updateDocument be an algorithm step which performs update document for history step application given targetEntry's document, targetEntry, changingNavigableContinuation's update-only, scriptHistoryLength, scriptHistoryIndex, navigationType, entriesForNavigationAPI, and previousEntry.
If targetEntry's document is equal to displayedDocument, then perform updateDocument.
Otherwise, queue a global task on the navigation and traversal task source given targetEntry's document's relevant global object to perform updateDocument.
Increment completedChangeJobs.
Let totalNonchangingJobs be the size of nonchangingNavigablesThatStillNeedUpdates.
This step onwards deliberately waits for all the previous operations to complete, as they include processing synchronous navigations which will also post tasks to update history length and index.
Let completedNonchangingJobs be 0.
Let (scriptHistoryLength, scriptHistoryIndex) be the result of getting the history object length and index given traversable and targetStep.
For each navigable of nonchangingNavigablesThatStillNeedUpdates, queue a global task on the navigation and traversal task source given navigable's active window to run the steps:
Let document be navigable's active document.
Set document's history object's index to scriptHistoryIndex.
Set document's history object's length to scriptHistoryLength.
Increment completedNonchangingJobs.
Wait for completedNonchangingJobs to equal totalNonchangingJobs.
Set traversable's current session history step to targetStep.
Return "applied
".
To deactivate a document for a cross-document navigation given a
Document
displayedDocument, a user navigation involvement
userNavigationInvolvement, a session history entry targetEntry,
a NavigationType
navigationType, and afterPotentialUnloads,
which is an algorithm that receives no arguments:
Let navigable be displayedDocument's node navigable.
Let potentiallyTriggerViewTransition be false.
Let isBrowserUINavigation be true if
userNavigationInvolvement is "browser UI
"; otherwise false.
Set potentiallyTriggerViewTransition to the result of calling can navigation trigger a cross-document view-transition? given displayedDocument, targetEntry's document, navigationType, and isBrowserUINavigation.
If potentiallyTriggerViewTransition is false, then:
Let firePageSwapBeforeUnload be the following step:
Fire the pageswap
event given
displayedDocument, targetEntry, navigationType, and
null.
Set the ongoing navigation for navigable to null.
This allows new navigations of navigable to start, whereas during the traversal they were blocked.
Unload a document and its descendants given displayedDocument, targetEntry's document, afterPotentialUnloads, and firePageSwapBeforeUnload.
Otherwise, queue a global task on the navigation and traversal task source given navigable's active window to run the steps:
Let proceedWithNavigationAfterViewTransitionCapture be the following step:
Append the following session history traversal steps to navigable's traversable navigable:
Set the ongoing navigation for navigable to null.
This allows new navigations of navigable to start, whereas during the traversal they were blocked.
Unload a document and its descendants given displayedDocument, targetEntry's document, and afterPotentialUnloads.
Let viewTransition be the result of setting up a cross-document view-transition given displayedDocument, targetEntry's document, navigationType, and proceedWithNavigationAfterViewTransitionCapture.
Fire the pageswap
event given
displayedDocument, targetEntry, navigationType, and
viewTransition.
If viewTransition is null, then run proceedWithNavigationAfterViewTransitionCapture.
In the case where a view transition started, the view transitions algorithms are responsible for calling proceedWithNavigationAfterViewTransitionCapture.
To fire the pageswap
event given a
Document
displayedDocument, a session history entry
targetEntry, a NavigationType
navigationType, and a
ViewTransition
-or-null viewTransition:
Assert: this is running as part of a task queued on displayedDocument's relevant agent's event loop.
Let navigation be displayedDocument's relevant global object's navigation API.
Let activation be null.
If all of the following are true:
targetEntry's document's origin is same origin with displayedDocument's origin; and
targetEntry's document's was created via cross-origin redirects is false, or targetEntry's document's latest entry is not null,
then:
Let destinationEntry be determined by switching on navigationType:
reload
"The current entry of navigation
traverse
"The NavigationHistoryEntry
in navigation's entry list whose session history entry is targetEntry
push
"replace
"A new NavigationHistoryEntry
in displayedDocument's relevant realm with its session history entry set to targetEntry.
Set activation to a new NavigationActivation
created in displayedDocument's relevant
realm, with
This means that a cross-origin redirect during a navigation would result in a
null activation
in the old document's
PageSwapEvent
, unless the new document is being restored from bfcache.
Fire an event named
pageswap
at displayedDocument's
relevant global object, using PageSwapEvent
with its activation
set to activation,
and its viewTransition
set to
viewTransition.
To activate history entry session history entry entry for navigable navigable:
Save persisted state to the navigable's active session history entry.
Let newDocument be entry's document.
Assert: newDocument's is initial
about:blank
is false, i.e., we never traverse back to the initial about:blank
Document
because it
always gets replaced when we navigate away from
it.
Set navigable's active session history entry to entry.
Make active newDocument.
To get the used step given a traversable navigable traversable, and a non-negative integer step, perform the following steps. They return a non-negative integer.
Let steps be the result of getting all used history steps within traversable.
Return the greatest item in steps that is less than or equal to step.
This caters for situations where there's no session history entry with step step, due to the removal of a navigable.
To get the history object length and index given a traversable navigable traversable, and a non-negative integer step, perform the following steps. They return a tuple of two non-negative integers.
Let steps be the result of getting all used history steps within traversable.
Let scriptHistoryLength be the size of steps.
Assert: steps contains step.
It is assumed that step has been adjusted by getting the used step.
Let scriptHistoryIndex be the index of step in steps.
Return (scriptHistoryLength, scriptHistoryIndex).
To get all navigables whose current session history entry will change or reload given a traversable navigable traversable, and a non-negative integer targetStep, perform the following steps. They return a list of navigables.
Let results be an empty list.
Let navigablesToCheck be « traversable ».
This list is extended in the loop below.
For each navigable of navigablesToCheck:
Let targetEntry be the result of getting the target history entry given navigable and targetStep.
If targetEntry is not navigable's current session history entry or targetEntry's document state's reload pending is true, then append navigable to results.
If targetEntry's document is navigable's document, and targetEntry's document state's reload pending is false, then extend navigablesToCheck with the child navigables of navigable.
Adding child navigables to navigablesToCheck means those navigables will also be checked by this loop. Child navigables are only checked if the navigable's active document will not change as part of this traversal.
Return results.
To get all navigables that only need history object length/index update given a traversable navigable traversable, and a non-negative integer targetStep, perform the following steps. They return a list of navigables.
Other navigables might not be impacted by the traversal. For example, if the response is a 204, the currently active document will remain. Additionally, going 'back' after a 204 will change the current session history entry, but the active session history entry will already be correct.
Let results be an empty list.
Let navigablesToCheck be « traversable ».
This list is extended in the loop below.
For each navigable of navigablesToCheck:
Let targetEntry be the result of getting the target history entry given navigable and targetStep.
If targetEntry is navigable's current session history entry and targetEntry's document state's reload pending is false, then:
Append navigable to results.
Extend navigablesToCheck with navigable's child navigables.
Adding child navigables to navigablesToCheck means those navigables will also be checked by this loop. child navigables are only checked if the navigable's active document will not change as part of this traversal.
Return results.
To get the target history entry given a navigable navigable, and a non-negative integer step, perform the following steps. They return a session history entry.
Let entries be the result of getting session history entries for navigable.
Return the item in entries that has the greatest step less than or equal to step.
To see why getting the target history entry returns the entry with the greatest step less than or equal to the input step, consider the following Jake diagram:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
top | /t | /t#foo | ||
frames[0] | /i-0-a | /i-0-b |
For the input step 1, the target history entry for the top
navigable
is the /t
entry, whose step is 0, while the target history entry for the frames[0]
navigable is the /i-0-b
entry, whose step is 1:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
top | /t | /t#foo | ||
frames[0] | /i-0-a | /i-0-b |
Similarly, given the input step 3 we get the top
entry whose step is 3, and the frames[0]
entry whose step is 1:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
top | /t | /t#foo | ||
frames[0] | /i-0-a | /i-0-b |
To get all navigables that might experience a cross-document traversal given a traversable navigable traversable, and a non-negative integer targetStep, perform the following steps. They return a list of navigables.
From traversable's session history traversal queue's perspective, these documents are candidates for going cross-document during the traversal described by targetStep. They will not experience a cross-document traversal if the status code for their target document is HTTP 204 No Content.
Note that if a given navigable might experience a cross-document traversal, this algorithm will return navigable but not its child navigables. Those would end up unloaded, not traversed.
Let results be an empty list.
Let navigablesToCheck be « traversable ».
This list is extended in the loop below.
For each navigable of navigablesToCheck:
Let targetEntry be the result of getting the target history entry given navigable and targetStep.
If targetEntry's document is not navigable's document or targetEntry's document state's reload pending is true, then append navigable to results.
Although navigable's active history entry can change synchronously, the
new entry will always have the same Document
, so accessing
navigable's document is reliable.
Otherwise, extend navigablesToCheck with navigable's child navigables.
Adding child navigables to navigablesToCheck means those navigables will also be checked by this loop. Child navigables are only checked if the navigable's active document will not change as part of this traversal.
Return results.
To update document for history step application given a Document
document, a session history entry entry, a boolean
doNotReactivate, integers scriptHistoryLength and
scriptHistoryIndex, NavigationType
-or-null navigationType, an
optional list of session history entries
entriesForNavigationAPI, and an optional session history entry
previousEntryForActivation:
Let documentIsNew be true if document's latest entry is null; otherwise false.
Let documentsEntryChanged be true if document's latest entry is not entry; otherwise false.
Set document's history object's index to scriptHistoryIndex.
Set document's history object's length to scriptHistoryLength.
Let navigation be history's relevant global object's navigation API.
If documentsEntryChanged is true, then:
Let oldURL be document's latest entry's URL.
Set document's latest entry to entry.
Restore the history object state given document and entry.
If documentIsNew is false, then:
Assert: navigationType is not null.
Update the navigation API entries for a same-document navigation given navigation, entry, and navigationType.
Fire an event named popstate
at document's relevant global
object, using PopStateEvent
, with the state
attribute initialized to document's
history object's state and hasUAVisualTransition
initialized to
true if a visual transition, to display a cached rendered state of the latest
entry, was done by the user agent.
Restore persisted state given entry.
If oldURL's fragment is not
equal to entry's URL's fragment, then queue a global task on the
DOM manipulation task source given document's relevant global
object to fire an event named hashchange
at document's relevant global
object, using HashChangeEvent
, with the oldURL
attribute initialized to the serialization of oldURL and the newURL
attribute initialized to the serialization of entry's URL.
Otherwise:
Assert: entriesForNavigationAPI is given.
Restore persisted state given entry.
Initialize the navigation API entries for a new document given navigation, entriesForNavigationAPI, and entry.
If all the following are true:
previousEntryForActivation is given;
navigationType is non-null; and
navigationType is "reload
" or
previousEntryForActivation's document is not
document,
then:
If navigation's activation is null, then set navigation's
activation to a new
NavigationActivation
object in navigation's
relevant realm.
Let previousEntryIndex be the result of getting the navigation API entry index of previousEntryForActivation within navigation.
If previousEntryIndex is non-negative, then set activation's old entry to navigation's entry list[previousEntryIndex].
Otherwise, if all the following are true:
navigationType is "replace
";
previousEntryForActivation's document state's origin is same origin with document's origin; and
previousEntryForActivation's document's
initial about:blank
is
false,
then set activation's old entry
to a new NavigationHistoryEntry
in navigation's relevant realm, whose session history entry is
previousEntryForActivation.
Set activation's new entry to navigation's current entry.
Set activation's navigation type to navigationType.
If documentIsNew is true, then:
Try to scroll to the fragment for document.
At this point scripts may run for the newly-created document document.
Otherwise, if documentsEntryChanged is false and doNotReactivate is false, then:
Assert: entriesForNavigationAPI is given.
Reactivate document given entry and entriesForNavigationAPI.
documentsEntryChanged can be false for one of two reasons: either we are restoring from bfcache, or we are asynchronously finishing up a synchronous navigation which already synchronously set document's latest entry. The doNotReactivate argument distinguishes between these two cases.
To restore the history object state given Document
document and session history entry entry:
Let targetRealm be document's relevant realm.
Let state be StructuredDeserialize(entry's classic history API state, targetRealm). If this throws an exception, catch it and let state be null.
Set document's history object's state to state.
To make active a Document
document:
Let window be document's relevant global object.
Set document's browsing context's
WindowProxy
's [[Window]] internal
slot value to window.
Set document's visibility state to document's node navigable's traversable navigable's system visibility state.
Queue a new
VisibilityStateEntry
whose visibility
state is document's visibility state and whose timestamp is zero.
Set window's relevant settings object's execution ready flag.
To reactivate a
Document
document given a session history entry
reactivatedEntry and a list of session history entries entriesForNavigationAPI:
This algorithm updates document after it has come out of bfcache, i.e., after it has been made fully active again. Other specifications that want to watch for this change to the fully active state are encouraged to add steps into this algorithm, so that the ordering of events that happen in effect of the change is clear.
For each
formControl of form controls in document with an autofill field
name of "off
", invoke the reset algorithm for formControl.
If document's suspended timer handles is not empty:
Assert: document's suspension time is not zero.
Let suspendDuration be the current high resolution time minus document's suspension time.
Let activeTimers be document's relevant global object's map of active timers.
For each handle in document's suspended timer handles, if activeTimers[handle] exists, then increase activeTimers[handle] by suspendDuration.
Update the navigation API entries for reactivation given document's relevant global object's navigation API, entriesForNavigationAPI, and reactivatedEntry.
If document's current document readiness is "complete
", and document's page showing flag is false,
then:
Set document's page showing flag to true.
Set document's has been revealed to false.
Update the visibility state of document to "visible
".
Fire a page transition event named pageshow
at document's relevant global
object with true.
To try to scroll to the fragment for a Document
document,
perform the following steps in parallel:
Wait for an implementation-defined amount of time. (This is intended to allow the user agent to optimize the user experience in the face of performance concerns.)
Queue a global task on the navigation and traversal task source given document's relevant global object to run these steps:
If document has no parser, or its parser has stopped parsing, or the user agent has reason to believe the user is no longer interested in scrolling to the fragment, then abort these steps.
Scroll to the fragment given document.
If document's indicated part is still null, then try to scroll to the fragment for document.
To make document unsalvageable, given a Document
document and a string reason:
Let details be a new not restored reason details whose reason is reason.
Append details to document's bfcache blocking details.
Set document's salvageable state to false.
To build not restored reasons for document state given Document
document:
Let notRestoredReasonsForDocument be a new not restored reasons.
Set notRestoredReasonsForDocument's URL to document's URL.
If document's node navigable's container is an iframe
element, then:
Set notRestoredReasonsForDocument's src to
the value of document's node navigable's container's src
attribute.
Set notRestoredReasonsForDocument's id to
the value of document's node navigable's container's id
attribute.
Set notRestoredReasonsForDocument's name
to the value of document's node navigable's container's name
attribute.
Set notRestoredReasonsForDocument's reasons to a clone of document's bfcache blocking details.
For each navigable of document's document-tree child navigables:
Let childDocument be navigable's active document.
Build not restored reasons for document state given childDocument.
Append childDocument's not restored reasons to notRestoredReasonsForDocument's children.
Set document's node navigable's active session history entry's document state's not restored reasons to notRestoredReasonsForDocument.
To build not restored reasons for a top-level traversable and its descendants given top-level traversable topLevelTraversable:
Build not restored reasons for document state given topLevelTraversable's active document.
Let crossOriginDescendants be an empty list.
For each childNavigable of topLevelTraversable's active document's descendant navigables:
If childNavigable's active document's origin is not same origin with topLevelTraversable's active document's origin, then append childNavigable to crossOriginDescendants.
Let crossOriginDescendantsPreventsBfcache be false.
For each crossOriginNavigable of crossOriginDescendants:
Let reasonsForCrossOriginChild be crossOriginNavigable's active document's document state's not restored reasons.
If reasonsForCrossOriginChild's reasons is not empty, set crossOriginDescendantsPreventsBfcache to true.
Set reasonsForCrossOriginChild's URL to null.
Set reasonsForCrossOriginChild's reasons to null.
Set reasonsForCrossOriginChild's children to null.
If crossOriginDescendantsPreventsBfcache is true, make document
unsalvageable given topLevelTraversable's active document and "masked
".
A Document
has a boolean has been revealed, initially false. It is used
to ensure that the pagereveal
event is fired once for each
activation of the Document
(once when it's rendered initially, and once for each
reactivation).
To reveal a Document
document:
If document's has been revealed is true, then return.
Set document's has been revealed to true.
Let transition be the result of resolving inbound cross-document view-transition for document.
Fire an event named
pagereveal
at document's
relevant global object, using PageRevealEvent
with its viewTransition
set to
transition.
If transition is not null, then:
Prepare to run script given document's relevant settings object.
Activate transition.
Clean up after running script given document's relevant settings object.
Activating a view transition might resolve/reject promises, so by wrapping the activation with prepare/cleanup we ensure those promises are handled before the next rendering step.
Though pagereveal
is guaranteed to be fired
during the first update the rendering step that displays an up-to-date version of the
page, user agents are free to display a cached frame of the page before firing it. This prevents
the presence of a pagereveal
handler from delaying the
presentation of such cached frame.
To scroll to the fragment given a
Document
document:
If document's indicated part is null, then set document's target element to null.
Otherwise, if document's indicated part is top of the document, then:
Set document's target element to null.
Scroll to the beginning of the document for document. CSSOMVIEW
Return.
Otherwise:
Assert: document's indicated part is an element.
Let target be document's indicated part.
Set document's target element to target.
Run the ancestor details revealing algorithm on target.
Run the ancestor hidden-until-found revealing algorithm on target.
Scroll target into view, with behavior set to "auto", block set to "start", and inline set to "nearest". CSSOMVIEW
Run the focusing steps for target, with the
Document
's viewport as the fallback target.
Move the sequential focus navigation starting point to target.
A Document
's indicated part is
the one that its URL's fragment identifies, or null if the fragment does not
identify anything. The semantics of the fragment in
terms of mapping it to a node is defined by the specification that defines the MIME
type used by the Document
(for example, the processing of fragments for XML MIME
types is the responsibility of RFC7303). RFC7303
There is also a target element for each Document
, which is used in
defining the :target
pseudo-class and is updated by the
above algorithm. It is initially null.
For an HTML document document, its indicated part is the result of selecting the indicated part given document and document's URL.
To select the indicated part given a Document
document and a
URL url:
If document's URL does not equal url with exclude fragments set to true, then return null.
Let fragment be url's fragment.
If fragment is the empty string, then return the special value top of the document.
Let potentialIndicatedElement be the result of finding a potential indicated element given document and fragment.
If potentialIndicatedElement is not null, then return potentialIndicatedElement.
Let fragmentBytes be the result of percent-decoding fragment.
Let decodedFragment be the result of running UTF-8 decode without BOM on fragmentBytes.
Set potentialIndicatedElement to the result of finding a potential indicated element given document and decodedFragment.
If potentialIndicatedElement is not null, then return potentialIndicatedElement.
If decodedFragment is an ASCII case-insensitive match for the
string top
, then return the top of the document.
Return null.
To find a potential indicated element given a Document
document and a string fragment, run these steps:
If there is an element in the document tree whose root is document and that has an ID equal to fragment, then return the first such element in tree order.
If there is an a
element in the document
tree whose root is document that has a name
attribute whose value is equal to fragment, then
return the first such element in tree order.
Return null.
To save persisted state to a session history entry entry:
Set the scroll position data of entry to contain the scroll positions for all of entry's document's restorable scrollable regions.
Optionally, update entry's persisted user state to reflect any state that the user agent wishes to persist, such as the values of form fields.
To restore persisted state from a session history entry entry:
If entry's scroll restoration
mode is "auto
", and entry's
document's relevant global object's navigation API's suppress normal scroll restoration
during ongoing navigation is false, then restore scroll position data given
entry.
The user agent not restoring scroll positions does not imply that scroll positions will be left at any particular value (e.g., (0,0)). The actual scroll position depends on the navigation type and the user agent's particular caching strategy. So web applications cannot assume any particular scroll position but rather are urged to set it to what they want it to be.
If suppress normal scroll restoration during ongoing navigation is
true, then restoring scroll position data
might still happen at a later point, as part of finishing the relevant NavigateEvent
, or via a
navigateEvent.scroll()
method call.
Optionally, update other aspects of entry's document and its rendering, for instance values of form fields, that the user agent had previously recorded in entry's persisted user state.
This can even include updating the dir
attribute
of textarea
elements or input
elements whose type
attribute is in the Text, Search,
Telephone, URL, or Email
state, if the persisted state includes the directionality of user input in such controls.
Restoring the value of form controls as part of this process does not fire any
input
or change
events, but
can trigger the formStateRestoreCallback
of form-associated custom elements.
Each Document
has a boolean has been scrolled by the user, initially
false. If the user scrolls the document, the user agent must set that document's has been
scrolled by the user to true.
The restorable scrollable regions of a Document
document
are document's viewport, and all of document's scrollable
regions excepting any navigable containers.
Child navigable scroll restoration is handled as part of state
restoration for the session history entry for those navigables' Document
s.
To restore scroll position data given a session history entry entry:
Let document be entry's document.
If document's has been scrolled by the user is true, then the user agent should return.
The user agent should attempt to use entry's scroll position data to restore the scroll positions of entry's document's restorable scrollable regions. The user agent may continue to attempt to do so periodically, until document's has been scrolled by the user becomes true.
This is formulated as an attempt, which is potentially repeated until success or until the user scrolls, due to the fact that relevant content indicated by the scroll position data might take some time to load from the network.
Scroll restoration might be affected by scroll anchoring. CSSSCROLLANCHORING
When loading a document using one of the below algorithms, we use the
following steps to create and initialize a Document
object,
given a type type, content type contentType, and
navigation params navigationParams:
Document
objects are also created when creating a new browsing
context and document; such initial
about:blank
Document
are never created by this algorithm. Also,
browsing context-less Document
objects can
be created via various APIs, such as document.implementation.createHTMLDocument()
.
Let browsingContext be navigationParams's navigable's active browsing context.
Set browsingContext to the result of the obtaining a browsing context to use for a navigation response given browsingContext, navigationParams's final sandboxing flag set, navigationParams's cross-origin opener policy, and navigationParams's COOP enforcement result.
This can result in a browsing context
group switch, in which case browsingContext will be a newly-created browsing context instead
of being navigationParams's navigable's active browsing
context. In such a case, the created Window
, Document
, and
agent will not end up being used; because the created Document
's
origin is opaque, we will end up creating a new agent
and Window
later in this algorithm to
go along with the new Document
.
Let permissionsPolicy be the result of creating a permissions policy from a response given navigationParams's navigable's container, navigationParams's origin, and navigationParams's response. PERMISSIONSPOLICY
The creating a permissions policy from a response algorithm makes use of the
passed origin. If document.domain
has
been used for navigationParams's navigable's container document, then its origin cannot be same origin-domain with
the passed origin, because these steps run before the document is created, so it
cannot itself yet have used document.domain
. Note
that this means that Permissions Policy checks are less permissive compared to doing a
same origin check instead.
See below for some examples of this in action.
Let creationURL be navigationParams's response's URL.
If navigationParams's request is non-null, then set creationURL to navigationParams's request's current URL.
Let window be null.
If browsingContext's active document's is initial
about:blank
is true, and browsingContext's active
document's origin is same
origin-domain with navigationParams's origin, then set window to
browsingContext's active window.
This means that both the initial
about:blank
Document
, and the new Document
that
is about to be created, will share the same Window
object.
Otherwise:
Let oacHeader be the result of getting a structured field value
given `Origin-Agent-Cluster
` and "item
" from
navigationParams's response's
header list.
Let requestsOAC be true if oacHeader is not null and oacHeader[0] is the boolean true; otherwise false.
If navigationParams's reserved environment is a non-secure context, then set requestsOAC to false.
Let agent be the result of obtaining a similar-origin window agent given navigationParams's origin, browsingContext's group, and requestsOAC.
Let realmExecutionContext be the result of creating a new realm given agent and the following customizations:
For the global object, create a new Window
object.
For the global this binding, use browsingContext's
WindowProxy
object.
Set window to the global object of realmExecutionContext's Realm component.
Let topLevelCreationURL be creationURL.
Let topLevelOrigin be navigationParams's origin.
If navigable's container is not null, then:
Let parentEnvironment be navigable's container's relevant settings object.
Set topLevelCreationURL to parentEnvironment's top-level creation URL.
Set topLevelOrigin to parentEnvironment's top-level origin.
Set up a window environment settings object with creationURL, realmExecutionContext, navigationParams's reserved environment, topLevelCreationURL, and topLevelOrigin.
This is the usual case, where the new Document
we're about to
create gets a new Window
to go along with it.
Let loadTimingInfo be a new document load timing info with its navigation start time set to navigationParams's response's timing info's start time.
Let document be a new Document
, with
loading
"Set window's associated
Document
to document.
Run CSP initialization for a Document
given
document. CSP
If navigationParams's request is non-null, then:
Set document's referrer to the empty string.
Let referrer be navigationParams's request's referrer.
If referrer is a URL record, then set document's referrer to the serialization of referrer.
Per Fetch, referrer will be either a URL
record or "no-referrer
" at this point.
If navigationParams's fetch controller is not null, then:
Let fullTimingInfo be the result of extracting the full timing info from navigationParams's fetch controller.
Let redirectCount be 0 if navigationParams's response's has cross-origin redirects is true; otherwise navigationParams's request's redirect count.
Create the navigation timing entry for document, given fullTimingInfo, redirectCount, navigationTimingType, navigationParams's response's service worker timing info, and navigationParams's response's body info.
Create the navigation timing entry for document, with navigationParams's response's timing info, redirectCount, navigationParams's navigation timing type, and navigationParams's response's service worker timing info.
If navigationParams's response
has a `Refresh
` header, then:
Let value be the isomorphic decoding of the value of the header.
Run the shared declarative refresh steps with document and value.
We do not currently have a spec for how to handle multiple `Refresh
`
headers. This is tracked as issue #2900.
If navigationParams's commit early hints is not null, then call navigationParams's commit early hints with document.
Process link headers given document,
navigationParams's response, and
"pre-media
".
Return document.
In this example, the child document is not allowed to use PaymentRequest
,
despite being same origin-domain at the time the child document tries to use
it. At the time the child document is initialized, only the parent document has set document.domain
, and the child document has not.
<!-- https://foo.example.com/a.html -->
<!doctype html>
<script>
document.domain = 'example.com';
</script>
<iframe src=b.html></iframe>
<!-- https://bar.example.com/b.html -->
<!doctype html>
<script>
document.domain = 'example.com'; // This happens after the document is initialized
new PaymentRequest(…); // Not allowed to use
</script>
In this example, the child document is allowed to use
PaymentRequest
, despite not being same origin-domain at the time
the child document tries to use it. At the time the child document is initialized, none of
the documents have set document.domain
yet so
same origin-domain falls back to a normal same origin check.
<!-- https://example.com/a.html -->
<!doctype html>
<iframe src=b.html></iframe>
<!-- The child document is now initialized, before the script below is run. -->
<script>
document.domain = 'example.com';
</script>
<!-- https://example.com/b.html -->
<!doctype html>
<script>
new PaymentRequest(…); // Allowed to use
</script>
To populate with html
/head
/body
given a
Document
document:
Let html be the result of creating an
element given document, html
, and the HTML
namespace.
Let head be the result of creating an
element given document, head
, and the HTML
namespace.
Let body be the result of creating an
element given document, body
, and the HTML
namespace.
Append html to document.
Append head to html.
Append body to html.
To load an HTML document, given navigation params navigationParams:
Let document be the result of creating and initializing a Document
object given "html
", "text/html
", and
navigationParams.
If document's URL is
about:blank
, then populate with
html
/head
/body
given document.
This special case, where even non-initial
about:blank
Document
s are synchronously given their element
nodes, is necessary for compatible with deployed content. In other words, it is not compatible
to instead go down the "otherwise" branch and feed the empty byte sequence into
an HTML parser to asynchronously populate document.
Otherwise, create an HTML parser and associate it with the document. Each task that the networking task source places on the task queue while fetching runs must then fill the parser's input byte stream with the fetched bytes and cause the HTML parser to perform the appropriate processing of the input stream.
The first task that the networking task
source places on the task queue while fetching runs must process link
headers given document, navigationParams's response, and "media
", after
the task has been processed by the HTML parser.
Before any script execution occurs, the user agent must wait for scripts may run for the newly-created document to be true for document.
The input byte stream converts bytes into characters for use in the tokenizer. This process relies, in part, on character encoding information found in the real Content-Type metadata of the resource; the computed type is not used for this purpose.
When no more bytes are available, the user agent must queue a global task on
the networking task source given document's relevant global
object to have the parser process the implied EOF character, which eventually causes
a load
event to be fired.
Return document.
When faced with displaying an XML file inline, provided navigation params
navigationParams and a string type, user agents must follow the
requirements defined in XML and Namespaces in XML, XML Media
Types, DOM, and other relevant specifications to create and initialize a Document
object
document, given "xml
", type, and
navigationParams, and return that Document
. They must also create a
corresponding XML parser. XML XMLNS RFC7303
DOM
At the time of writing, the XML specification community had not actually yet specified how XML and the DOM interact.
The first task that the networking task source
places on the task queue while fetching runs must process link headers
given document, navigationParams's response, and "media
", after
the task has been processed by the XML parser.
The actual HTTP headers and other metadata, not the headers as mutated or implied by the algorithms given in this specification, are the ones that must be used when determining the character encoding according to the rules given in the above specifications. Once the character encoding is established, the document's character encoding must be set to that character encoding.
Before any script execution occurs, the user agent must wait for scripts may run for the
newly-created document to be true for the newly-created Document
.
Once parsing is complete, the user agent must set document's during-loading navigation ID for WebDriver BiDi to null.
For HTML documents this is reset when parsing is complete, after firing the load event.
Error messages from the parse process (e.g., XML namespace well-formedness errors) may be
reported inline by mutating the Document
.
To load a text document, given a navigation params navigationParams and a string type:
Let document be the result of creating and initializing a Document
object given "html
", type, and
navigationParams.
Set document's parser cannot change the mode flag to true.
Set document's mode
to "no-quirks
".
Create an HTML parser and associate it with the document. Act as if the tokenizer had emitted a start tag token with the tag name "pre" followed by a single U+000A LINE FEED (LF) character, and switch the HTML parser's tokenizer to the PLAINTEXT state. Each task that the networking task source places on the task queue while fetching runs must then fill the parser's input byte stream with the fetched bytes and cause the HTML parser to perform the appropriate processing of the input stream.
document's encoding must be set to the character encoding used to decode the document during parsing.
The first task that the networking task
source places on the task queue while fetching runs must process link
headers given document, navigationParams's response, and "media
", after
the task has been processed by the HTML parser.
Before any script execution occurs, the user agent must wait for scripts may run for the newly-created document to be true for document.
When no more bytes are available, the user agent must queue a global task on
the networking task source given document's relevant global
object to have the parser process the implied EOF character, which eventually causes
a load
event to be fired.
User agents may add content to the head
element of document, e.g.,
linking to a style sheet, providing script, or giving the document a title
.
In particular, if the user agent supports the Format=Flowed
feature of RFC 3676 then the user agent would need to apply
extra styling to cause the text to wrap correctly and to handle the quoting feature. This could
be performed using, e.g., a CSS extension.
Return document.
The rules for how to convert the bytes of the plain text document into actual characters, and the rules for actually rendering the text to the user, are defined by the specifications for the computed MIME type of the resource (i.e., type).
multipart/x-mixed-replace
documentsTo load a
multipart/x-mixed-replace
document, given navigation params
navigationParams, source snapshot params sourceSnapshotParams,
and origin initiatorOrigin:
Parse navigationParams's response's body using the rules for multipart types. RFC2046
Let firstPartNavigationParams be a copy of navigationParams.
Set firstPartNavigationParams's response to a new response representing the first part of navigationParams's response's body's multipart stream.
Let document be the result of loading a document given firstPartNavigationParams, sourceSnapshotParams, and initiatorOrigin.
For each additional body part obtained from navigationParams's response, the user agent must navigate
document's node navigable to navigationParams's request's URL, using document, with response set to navigationParams's response and historyHandling set to "replace
".
Return document.
For the purposes of algorithms processing these body parts as if they were complete stand-alone resources, the user agent must act as if there were no more bytes for those resources whenever the boundary following the body part is reached.
Thus, load
events (and for that matter unload
events) do fire for each body part loaded.
To load a media document, given navigationParams and a string type:
Let document be the result of creating and initializing a Document
object given "html
", type, and
navigationParams.
Set document's mode
to "no-quirks
".
Populate with html
/head
/body
given
document.
Append an element host element for the media, as described below, to the
body
element.
Set the appropriate attribute of the element host element, as described below, to the address of the image, video, or audio resource.
User agents may add content to the head
element of document, or
attributes to host element, e.g., to link to a style sheet, to provide a script, to
give the document a title
, or to make the media autoplay.
Process link headers given document,
navigationParams's response, and
"media
".
Act as if the user agent had stopped parsing document.
Return document.
The element host element to create for the media is the element given in the table below in the second cell of the row whose first cell describes the media. The appropriate attribute to set is the one given by the third cell in that same row.
Type of media | Element for the media | Appropriate attribute |
---|---|---|
Image | img
| src
|
Video | video
| src
|
Audio | audio
| src
|
Before any script execution occurs, the user agent must wait for scripts may run for the
newly-created document to be true for the Document
.
When the user agent is to create a document to display a user agent page or PDF viewer inline,
provided a navigable navigable, a navigation ID
navigationId, a NavigationTimingType
navTimingType, the
user agent should:
Let origin be a new opaque origin.
Let coop be a new opener policy.
Let coopEnforcementResult be a new opener policy enforcement result with
Let navigationParams be a new navigation params with
Let document be the result of creating and initializing a Document
object given "html
", "text/html
", and
navigationParams.
Either associate document with a custom rendering that is not rendered using
the normal Document
rendering rules, or mutate document until it
represents the content the user agent wants to render.
Return document.
Because we ensure the resulting Document
's origin is opaque, and the resulting Document
cannot run
script with access to the DOM, the existence and properties of this Document
are not
observable to web developer code. This means that most of the above values, e.g., the
text/html
type, do not matter.
Similarly, most of the items in navigationParams don't have any observable effect,
besides preventing the Document
-creation
algorithm from getting confused, and so are set to default values.
Once the page has been set up, the user agent must act as if it had stopped parsing.
A Document
has a completely loaded time (a time or null), which is
initially null.
A Document
is considered completely loaded if its completely
loaded time is non-null.
To completely finish loading a Document
document:
Assert: document's browsing context is non-null.
Set document's completely loaded time to the current time.
Let container be document's node navigable's container.
This will be null in the case where document is the initial about:blank
Document
in a
frame
or iframe
, since at the point of browsing context creation which calls this algorithm,
the container relationship has not yet been established. (That happens in a subsequent step of
create a new child navigable.)
The consequence of this is that the following steps do nothing, i.e., we do not fire an
asynchronous load
event on the container element for such
cases. Instead, a synchronous load
event is fired in a special
initial-insertion case when processing the
iframe
attributes.
If container is an iframe
element, then queue an element
task on the DOM manipulation task source given container to run
the iframe load event steps given container.
Otherwise, if container is non-null, then queue an element task on
the DOM manipulation task source given container to fire an event named load
at
container.
A Document
has a salvageable state, which must initially be
true, and a page showing flag, which must initially be false. The page
showing flag is used to ensure that scripts receive pageshow
and pagehide
events
in a consistent manner (e.g. that they never receive two pagehide
events in a row without an intervening pageshow
, or vice versa).
A Document
has a DOMHighResTimeStamp
suspension time,
initially 0.
A Document
has a list of suspended timer handles,
initially empty.
Event loops have a termination nesting level counter, which must initially be 0.
Document
objects have an unload
counter, which is used to ignore certain operations while the below algorithms run.
Initially, the counter must be set to zero.
To unload a Document
oldDocument, given an optional Document
newDocument:
Assert: this is running as part of a task queued on oldDocument's relevant agent's event loop.
Let unloadTimingInfo be a new document unload timing info.
If newDocument is not given, then set unloadTimingInfo to null.
In this case there is no new document that needs to know about how long it took oldDocument to unload.
Otherwise, if newDocument's event loop is not oldDocument's event loop, then the user agent may be unloading oldDocument in parallel. In that case, the user agent should set unloadTimingInfo to null.
In this case newDocument's loading is not impacted by how long it takes to unload oldDocument, so it would be meaningless to communicate that timing info.
Let intendToKeepInBfcache be true if the user agent intends to keep oldDocument alive in a session history entry, such that it can later be used for history traversal.
This must be false if oldDocument is not salvageable, or if there are any descendants of oldDocument which the user agent does not intend to keep alive in the same way (including due to their lack of salvageability).
Let eventLoop be oldDocument's relevant agent's event loop.
Increase eventLoop's termination nesting level by 1.
Increase oldDocument's unload counter by 1.
If intendToKeepInBfcache is false, then set oldDocument's salvageable state to false.
If oldDocument's page showing is true:
Set oldDocument's page showing to false.
Fire a page transition event named pagehide
at oldDocument's relevant global
object with oldDocument's salvageable state.
Update the visibility state of oldDocument to
"hidden
".
If unloadTimingInfo is not null, then set unloadTimingInfo's unload event start time to the current high resolution time given newDocument's relevant global object, coarsened given oldDocument's relevant settings object's cross-origin isolated capability.
If oldDocument's salvageable
state is false, then fire an event named unload
at oldDocument's relevant global
object, with legacy target override flag set.
If unloadTimingInfo is not null, then set unloadTimingInfo's unload event end time to the current high resolution time given newDocument's relevant global object, coarsened given oldDocument's relevant settings object's cross-origin isolated capability.
Decrease eventLoop's termination nesting level by 1.
Set oldDocument's suspension time to the current high resolution time given document's relevant global object.
Set oldDocument's suspended timer handles to the result of getting the keys for the map of active timers.
Set oldDocument's has been scrolled by the user to false.
Run any unloading document cleanup steps for oldDocument that are defined by this specification and other applicable specifications.
If oldDocument's node navigable is a top-level traversable, build not restored reasons for a top-level traversable and its descendants given oldDocument's node navigable.
If oldDocument's salvageable state is false, then destroy oldDocument.
Decrease oldDocument's unload counter by 1.
If newDocument is given, newDocument's was created via cross-origin redirects is false, and newDocument's origin is the same as oldDocument's origin, then set newDocument's previous document unload timing to unloadTimingInfo.
To unload a document and its descendants, given a Document
document, an optional Document
-or-null newDocument (default
null), an optional set of steps afterAllUnloads, and an optional set of steps
firePageSwapSteps:
Assert: this is running within document's node navigable's traversable navigable's session history traversal queue.
Let childNavigables be document's child navigables.
Let numberUnloaded be 0.
For each childNavigable of childNavigable's in what order?, queue a global task on the navigation and traversal task source given childNavigable's active window to perform the following steps:
Let incrementUnloaded be an algorithm step which increments numberUnloaded.
Unload a document and its descendants given childNavigable's active document, null, and incrementUnloaded.
Wait until numberUnloaded equals childNavigable's size.
Queue a global task on the navigation and traversal task source given document's relevant global object to perform the following steps:
If firePageSwapSteps is given, then run firePageSwapSteps.
Unload document, passing along newDocument if it is not null.
If afterAllUnloads was given, then run it.
This specification defines the following unloading document cleanup steps.
Other specifications can define more. Given a Document
document:
Let window be document's relevant global object.
For each WebSocket
object webSocket whose relevant global
object is window, make disappear webSocket.
If this affected any WebSocket
objects, then make document
unsalvageable given document and "websocket
".
For each WebTransport
object transport whose relevant global
object is window, run the context cleanup steps given
transport.
If document's salvageable state is false, then:
For each EventSource
object eventSource whose relevant
global object is equal to window, forcibly close
eventSource.
Clear window's map of active timers.
It would be better if specification authors sent a pull request to add calls from here into their specifications directly, instead of using the unloading document cleanup steps hook, to ensure well-defined cross-specification call order. As of the time of this writing the following specifications are known to have unloading document cleanup steps, which will be run in an unspecified order: Fullscreen API, Web NFC, WebDriver BiDi, Compute Pressure, File API, Media Capture and Streams, Picture-in-Picture, Screen Orientation, Service Workers, WebLocks API, WebAudio API, WebRTC. FULLSCREEN WEBNFC WEBDRIVERBIDI COMPUTEPRESSURE FILEAPI MEDIASTREAM PICTUREINPICTURE SCREENORIENTATION SW WEBLOCKS WEBAUDIO WEBRTC
Issue #8906 tracks the work to make the order of these steps clear.
To destroy a
Document
document:
Assert: this is running as part of a task queued on document's relevant agent's event loop.
Abort document.
Set document's salvageable state to false.
Let ports be the list of MessagePort
s whose relevant global
object's associated Document
is
document.
For each port in ports, disentangle port.
Run any unloading document cleanup steps for document that are defined by this specification and other applicable specifications.
Remove any tasks whose document is document from any task queue (without running those tasks).
Set document's browsing context to null.
Set document's node navigable's active session history entry's document state's document to null.
Remove document from the
owner set of each WorkerGlobalScope
object whose set contains document.
For each workletGlobalScope in document's worklet global scopes, terminate workletGlobalScope.
Even after destruction, the Document
object itself might still be
accessible to script, in the case where we are destroying a child navigable.
To destroy a document and its descendants given a Document
document and an optional set of steps afterAllDestruction, perform the
following steps in parallel:
If document is not fully active, then:
Let reason be a string from user-agent specific blocking reasons. If none
apply, then let reason be "masked
".
Make document unsalvageable given document and reason.
If document's node navigable is a top-level traversable, build not restored reasons for a top-level traversable and its descendants given document's node navigable.
Let childNavigables be document's child navigables.
Let numberDestroyed be 0.
For each childNavigable of childNavigable's in what order?, queue a global task on the navigation and traversal task source given childNavigable's active window to perform the following steps:
Let incrementDestroyed be an algorithm step which increments numberDestroyed.
Destroy a document and its descendants given childNavigable's active document and incrementDestroyed.
Wait until numberDestroyed equals childNavigable's size.
Queue a global task on the navigation and traversal task source given document's relevant global object to perform the following steps:
Destroy document.
If afterAllDestruction was given, then run it.
To abort a Document
document:
Assert: this is running as part of a task queued on document's relevant agent's event loop.
Cancel any instances of the fetch algorithm in the
context of document, discarding any tasks queued for them, and discarding any further data received from the
network for them. If this resulted in any instances of the fetch algorithm being canceled or any queued tasks or any network data getting
discarded, then make document unsalvageable given document and
"fetch
".
If document's during-loading navigation ID for WebDriver BiDi is non-null, then:
Invoke WebDriver BiDi navigation aborted with document's browsing context, and a new WebDriver BiDi navigation
status whose id is
document's during-loading navigation
ID for WebDriver BiDi, status is "canceled
", and url is document's URL.
Set document's during-loading navigation ID for WebDriver BiDi to null.
If document has an active parser, then:
Set document's active parser was aborted to true.
Abort that parser.
Set document's salvageable to false.
Make document unsalvageable given document and
"parser-aborted
".
To abort a document and its descendants given a Document
document:
Assert: this is running as part of a task queued on document's relevant agent's event loop.
Let descendantNavigables be document's descendant navigables.
For each descendantNavigable of descendantNavigables in what order?, queue a global task on the navigation and traversal task source given descendantNavigable's active window to perform the following steps:
Abort descendantNavigable's active document.
If descendantNavigable's active document's salvageable is false, then set document's salvageable to false.
Abort document.
To stop loading a navigable navigable:
Let document be navigable's active document.
If document's unload counter is 0, and navigable's ongoing navigation is a navigation ID, then set the ongoing navigation for navigable to null.
This will have the effect of aborting any ongoing navigations of navigable, since at certain points during navigation, changes to the ongoing navigation will cause further work to be abandoned.
Abort a document and its descendants given document.
Through their user interface, user agents also
allow stopping traversals, i.e. cases where the ongoing navigation is "traversal
". The above algorithm does not account for this. (On the other hand,
user agents do not allow window.stop()
to stop traversals,
so the above algorithm is correct for that caller.) See issue #6905.
X-Frame-Options
` headerThe `X-Frame-Options
` HTTP response header is a legacy way
of controlling whether and how a Document
may be loaded inside of a child
navigable. It is obsoleted by the frame-ancestors
CSP directive, which provides more granular control over the
same situations. It was originally defined in HTTP Header Field X-Frame-Options, but
the definition and processing model here supersedes that document.
CSP RFC7034
In particular, HTTP Header Field X-Frame-Options specified an `ALLOW-FROM
` variant of the header, but that is not to be implemented.
Per the below processing model, ifIf both
a CSP frame-ancestors
directive and an
`X-Frame-Options
` header are used in the same response, then `X-Frame-Options
` is ignored.
For web developers and conformance checkers, its value ABNF is:
X-Frame-Options = "DENY" / "SAMEORIGIN"
To check a navigation response's adherence to `X-Frame-Options
`, given
a response response, a navigable
navigable, a CSP list cspList, and
an origin destinationOrigin:
If navigable is not a child navigable, then return true.
For each policy of cspList:
If policy's disposition is not "enforce
", then continue.
If policy's directive set contains a frame-ancestors
directive, then return true.
Let rawXFrameOptions be the result of getting, decoding, and splitting
`X-Frame-Options
` from response's header list.
Let xFrameOptions be a new set.
For each value of rawXFrameOptions, append value, converted to ASCII lowercase, to xFrameOptions.
If xFrameOptions's size is greater than 1, and
xFrameOptions contains any of "deny
", "allowall
", or "sameorigin
", then return false.
The intention here is to block any attempts at applying
`X-Frame-Options
` which were trying to do something valid, but appear confused.
This is the only impact of the legacy `ALLOWALL
` value
on the processing model.
If xFrameOptions's size is greater than 1, then return true.
This means it contains multiple invalid values, which we treat the same way as if the header was omitted entirely.
If xFrameOptions[0] is "deny
", then return
false.
If xFrameOptions[0] is "sameorigin
", then:
Let containerDocument be navigable's container document.
While containerDocument is not null:
If containerDocument's origin is not same origin with destinationOrigin, then return false.
Set containerDocument to containerDocument's container document.
Return true.
If we've reached this point then we have a lone invalid value (which could
potentially be one the legacy `ALLOWALL
` or `ALLOW-FROM
` forms). These are treated as if the header were omitted
entirely.
The following table illustrates the processing of various values for the header, including non-conformant ones:
`X-Frame-Options ` |
Valid | Result |
---|---|---|
`DENY ` |
✅ | embedding disallowed |
`SAMEORIGIN ` |
✅ | same-origin embedding allowed |
`INVALID ` |
❌ | embedding allowed |
`ALLOWALL ` |
❌ | embedding allowed |
`ALLOW-FROM=https://example.com/ ` |
❌ | embedding allowed (from anywhere) |
The following table illustrates how various non-conformant cases involving multiple values are processed:
`X-Frame-Options ` |
Result |
---|---|
`SAMEORIGIN, SAMEORIGIN ` |
same-origin embedding allowed |
`SAMEORIGIN, DENY ` |
embedding disallowed |
`SAMEORIGIN, ` |
embedding disallowed |
`SAMEORIGIN, ALLOWALL ` |
embedding disallowed |
`SAMEORIGIN, INVALID ` |
embedding disallowed |
`ALLOWALL, INVALID ` |
embedding disallowed |
`ALLOWALL, ` |
embedding disallowed |
`INVALID, INVALID ` |
embedding allowed |
The same results are obtained whether the values are delivered in a single header whose value is comma-delimited, or in multiple headers.
Refresh
` headerThe `Refresh
` HTTP response header is the HTTP-equivalent
to a meta
element with an http-equiv
attribute in the Refresh state. It takes the same value and works largely the
same. Its processing model is detailed in create and initialize a Document
object.
Browser user agents should provide the ability to navigate, reload, and stop loading any top-level traversable in their top-level traversable set.
For example, via a location bar and reload/stop button UI.
Browser user agents should provide the ability to traverse by a delta any top-level traversable in their top-level traversable set.
For example, via back and forward buttons, possibly including long-press abilities to change the delta.
It is suggested that such user agents allow traversal by deltas greater than one, to avoid
letting a page "trap" the user by stuffing the session history with spurious entries. (For
example, via repeated calls to history.pushState()
or
fragment navigations.)
Some user agents have heuristics for translating a single "back" or "forward" button press into a larger delta, specifically to overcome such abuses. We are contemplating specifying these heuristics in issue #7832.
Browser user agents should offer users the ability to create a fresh top-level traversable, given a user-provided or user agent-determined initial URL.
For example, via a "new tab" or "new window" button.
Browser user agents should offer users the ability to arbitrarily close any top-level traversable in their top-level traversable set.
For example, by clicking a "close tab" button.
Browser user agents may provide ways for the user to explicitly cause any navigable (not just a top-level traversable) to navigate, reload, or stop loading.
For example, via a context menu.
Browser user agents may provide the ability for users to destroy a top-level traversable.
For example, by force-closing a window containing one or more such top-level traversables.
When a user requests a reload of a navigable whose active session history entry's document state's resource is a POST resource, the user agent should prompt the user to confirm the operation first, since otherwise transactions (e.g., purchases or database modifications) could be repeated.
When a user requests a reload of a navigable, user agents may provide a mechanism for ignoring any caches when reloading.
All calls to navigate initiated by the mechanisms mentioned above must have the userInvolvement argument set to "browser UI
".
All calls to reload initiated by the mechanisms mentioned above must have the userInvolvement argument set to "browser UI
".
All calls to traverse the history by a delta initiated by the mechanisms mentioned above must not pass a value for the sourceDocument argument.
The above recommendations, and the data structures in this specification, are not meant to place restrictions on how user agents represent the session history to the user.
For example, although a top-level traversable's session history entries are stored and maintained as a list, and the user agent is recommended to give an interface for traversing that list by a delta, a novel user agent could instead or in addition present a tree-like view, with each page having multiple "forward" pages that the user can choose between.
Similarly, although session history for all descendant navigables is stored in their traversable navigable, user agents could present the user with a more nuanced per-navigable view of the session history.
Browser user agents may use a top-level browsing context's is popup boolean for the following purposes:
Deciding whether or not to provide a minimal web browser user interface for the corresponding top-level traversable.
Performing the optional steps in set up browsing context features.
In both cases user agents might additionally incorporate user preferences, or present a choice as to whether to go down the popup route.
User agents that provides a minimal user interface for such popups are encouraged to not hide the browser's location bar.
Various mechanisms can cause author-provided executable code to run in the context of a document. These mechanisms include, but are probably not limited to:
script
elements.javascript:
URLs.addEventListener()
, by explicit event handler content attributes, by
event handler IDL attributes, or otherwise.JavaScript defines the concept of an agent. This section gives the mapping of that language-level concept on to the web platform.
Conceptually, the agent concept is an architecture-independent, idealized "thread" in which JavaScript code runs. Such code can involve multiple globals/realms that can synchronously access each other, and thus needs to run in a single execution thread.
Two Window
objects having the same agent does not indicate
they can directly access all objects created in each other's realms. They would have to be
same origin-domain; see IsPlatformObjectSameOrigin.
The following types of agents exist on the web platform:
Contains various Window
objects which can potentially reach each other, either
directly or by using document.domain
.
If the encompassing agent cluster's is origin-keyed is true, then
all the Window
objects will be same origin, can reach each other
directly, and document.domain
will no-op.
Two Window
objects that are same origin can be in
different similar-origin window agents, for
instance if they are each in their own browsing context group.
Contains a single DedicatedWorkerGlobalScope
.
Contains a single SharedWorkerGlobalScope
.
Contains a single ServiceWorkerGlobalScope
.
Contains a single WorkletGlobalScope
object.
Although a given worklet can have multiple realms, each such realm needs its own agent, as each realm can be executing code independently and at the same time as the others.
Only shared and dedicated worker agents allow the use of JavaScript Atomics
APIs to
potentially block.
To create an agent, given a boolean canBlock:
Let signifier be a new unique internal value.
Let candidateExecution be a new candidate execution.
Let agent be a new agent whose [[CanBlock]] is canBlock, [[Signifier]] is signifier, [[CandidateExecution]] is candidateExecution, and [[IsLockFree1]], [[IsLockFree2]], and [[LittleEndian]] are set at the implementation's discretion.
Set agent's event loop to a new event loop.
Return agent.
For a realm realm, the agent whose [[Signifier]] is realm.[[AgentSignifier]] is the realm's agent.
The relevant agent for a platform object platformObject is platformObject's relevant realm's agent.
The agent equivalent of the current realm is the surrounding agent.
JavaScript also defines the concept of an agent cluster, which this standard maps to the web platform by placing agents appropriately when they are created using the obtain a similar-origin window agent or obtain a worker/worklet agent algorithms.
The agent cluster concept is crucial for defining the JavaScript memory model, and
in particular among which agents the backing data of
SharedArrayBuffer
objects can be shared.
Conceptually, the agent cluster concept is an architecture-independent, idealized "process boundary" that groups together multiple "threads" (agents). The agent clusters defined by the specification are generally more restrictive than the actual process boundaries implemented in user agents. By enforcing these idealized divisions at the specification level, we ensure that web developers see interoperable behavior with regard to shared memory, even in the face of varying and changing user agent process models.
An agent cluster has an associated cross-origin isolation mode, which is a
cross-origin isolation mode. It is initially "none
".
An agent cluster has an associated is origin-keyed (a boolean), which is initially false.
The following defines the allocation of the agent clusters of similar-origin window agents.
An agent cluster key is a site or tuple origin. Without web developer action to achieve origin-keyed agent clusters, it will be a site.
An equivalent formulation is that an agent cluster key can be a scheme-and-host or an origin.
To obtain a similar-origin window agent, given an origin origin, a browsing context group group, and a boolean requestsOAC, run these steps:
Let site be the result of obtaining a site with origin.
Let key be site.
If group's cross-origin isolation
mode is not "none
", then set
key to origin.
Otherwise, if group's historical agent cluster key map[origin] exists, then set key to group's historical agent cluster key map[origin].
Otherwise:
If requestsOAC is true, then set key to origin.
Set group's historical agent cluster key map[origin] to key.
If group's agent cluster map[key] does not exist, then:
Let agentCluster be a new agent cluster.
Set agentCluster's cross-origin isolation mode to group's cross-origin isolation mode.
Set agentCluster's is origin-keyed to true if key equals origin; otherwise false.
Add the result of creating an agent, given false, to agentCluster.
Set group's agent cluster map[key] to agentCluster.
Return the single similar-origin window agent contained in group's agent cluster map[key].
This means that there is only one similar-origin window agent per browsing context agent cluster. (However, dedicated worker and worklet agents might be in the same cluster.)
The following defines the allocation of the agent clusters of all other types of agents.
To obtain a worker/worklet agent, given an environment settings object or null outside settings, a boolean isTopLevel, and a boolean canBlock, run these steps:
Let agentCluster be null.
If isTopLevel is true, then:
Set agentCluster to a new agent cluster.
Set agentCluster's is origin-keyed to true.
These workers can be considered to be origin-keyed. However, this is not
exposed through any APIs (in the way that originAgentCluster
exposes the origin-keyedness for
windows).
Otherwise:
Assert: outside settings is not null.
Let ownerAgent be outside settings's realm's agent.
Set agentCluster to the agent cluster which contains ownerAgent.
Let agent be the result of creating an agent given canBlock.
Add agent to agentCluster.
Return agent.
To obtain a dedicated/shared worker agent, given an environment settings object outside settings and a boolean isShared, return the result of obtaining a worker/worklet agent given outside settings, isShared, and true.
To obtain a worklet agent, given an environment settings object outside settings, return the result of obtaining a worker/worklet agent given outside settings, false, and false.
To obtain a service worker agent, return the result of obtaining a worker/worklet agent given null, true, and false.
The JavaScript specification introduces the realm concept, representing a global environment in which script is run. Each realm comes with an implementation-defined global object; much of this specification is devoted to defining that global object and its properties.
For web specifications, it is often useful to associate values or algorithms with a
realm/global object pair. When the values are specific to a particular type of realm, they are
associated directly with the global object in question, e.g., in the definition of the
Window
or WorkerGlobalScope
interfaces. When the values have utility
across multiple realms, we use the environment settings object concept.
Finally, in some cases it is necessary to track associated values before a realm/global object/environment settings object even comes into existence (for example, during navigation). These values are tracked in the environment concept.
An environment is an object that identifies the settings of a current or potential execution environment (i.e., a navigation params's reserved environment or a request's reserved client). An environment has the following fields:
An opaque string that uniquely identifies this environment.
A URL that represents the location of the resource with which this environment is associated.
In the case of a Window
environment settings object,
this URL might be distinct from its global
object's associated
Document
's URL, due to
mechanisms such as history.pushState()
which modify
the latter.
Null or a URL that represents the creation URL of the "top-level" environment. It is null for workers and worklets.
A for now implementation-defined value, null, or an origin. For a "top-level" potential execution environment it is null (i.e., when there is no response yet); otherwise it is the "top-level" environment's origin. For a dedicated worker or worklet it is the top-level origin of its creator. For a shared or service worker it is an implementation-defined value.
This is distinct from the top-level creation URL's origin when sandboxing, workers, and worklets are involved.
Null or a target browsing context for a navigation request.
Null or a service worker that controls the environment.
A flag that indicates whether the environment setup is done. It is initially unset.
Specifications may define environment discarding steps for environments. The steps take an environment as input.
The environment discarding steps are run for only a select few environments: the ones that will never become execution ready because, for example, they failed to load.
An environment settings object is an environment that additionally specifies algorithms for:
A JavaScript execution context shared by all scripts that use this settings object, i.e., all scripts in a given realm. When we run a classic script or run a module script, this execution context becomes the top of the JavaScript execution context stack, on top of which another execution context specific to the script in question is pushed. (This setup ensures Source Text Module Record's Evaluate knows which realm to use.)
A module map that is used when importing JavaScript modules.
A URL used by APIs called by scripts that use this environment settings object to parse URLs.
An origin used in security checks.
A policy container containing policies used for security checks.
A boolean representing whether scripts that use this environment settings object are allowed to use APIs that require cross-origin isolation.
An environment settings object's responsible event loop is its global object's relevant agent's event loop.
A global object is a JavaScript object that is the [[GlobalObject]] field of a realm.
In this specification, all realms are created with global
objects that are either Window
, WorkerGlobalScope
, or
WorkletGlobalScope
objects.
A global object has an in error reporting mode boolean, which is initially false.
A global object has an outstanding rejected promises weak set, a
set of Promise
objects, initially empty. This set
must not create strong references to any of its members, and implementations are free to limit
its size in an implementation-defined manner, e.g., by removing old entries from it
when new ones are added.
A global object has an about-to-be-notified rejected promises list, a
list of Promise
objects, initially empty.
A global object has an import map, initially an empty import map.
For now, only Window
global
objects have their import map modified
from the initial empty one. The import map is
only accessed for the resolution of a root module script.
A global object has a resolved module set, a set of specifier resolution records, initially empty.
The resolved module set ensures that module specifier resolution
returns the same result when called multiple times with the same (referrer, specifier) pair. It
does that by ensuring that import map rules that impact the specifier in its
referrer's scope cannot be defined after its initial resolution. For now, only Window
global objects have their module set data structures modified
from the initial empty one.
There is always a 1-to-1-to-1 mapping between realms, global objects, and environment settings objects:
A realm has a [[HostDefined]] field, which contains the realm's settings object.
A realm has a [[GlobalObject]] field, which contains the realm's global object.
Each global object in this specification is created during the creation of a corresponding realm, known as the global object's realm.
Each global object in this specification is created alongside a corresponding environment settings object, known as its relevant settings object.
An environment settings object's realm execution context's Realm component is the environment settings object's realm.
An environment settings object's realm then has a [[GlobalObject]] field, which contains the environment settings object's global object.
To create a new realm in an agent agent, optionally with instructions to create a global object or a global this binding (or both), the following steps are taken:
Perform InitializeHostDefinedRealm() with the provided customizations for creating the global object and the global this binding.
Let realm execution context be the running JavaScript execution context.
This is the JavaScript execution context created in the previous step.
Remove realm execution context from the JavaScript execution context stack.
Let realm be realm execution context's Realm component.
If agent's agent cluster's cross-origin isolation mode is "none
", then:
Let global be realm's global object.
Let status be ! global.[[Delete]]("SharedArrayBuffer
").
Assert: status is true.
This is done for compatibility with web content and there is some hope that this
can be removed in the future. Web developers can still get at the constructor through
new WebAssembly.Memory({ shared:true, initial:0, maximum:0
}).buffer.constructor
.
Return realm execution context.
When defining algorithm steps throughout this specification, it is often important to indicate what realm is to be used—or, equivalently, what global object or environment settings object is to be used. In general, there are at least four possibilities:
Note how the entry, incumbent, and current concepts are usable without qualification, whereas the relevant concept must be applied to a particular platform object.
The incumbent and entry concepts should not be used by new specifications, as they are excessively complicated and unintuitive to work with. We are working to remove almost all existing uses from the platform: see issue #1430 for incumbent, and issue #1431 for entry.
In general, web platform specifications should use the relevant concept, applied to the object being operated
on (usually the this value of the current method). This mismatches the JavaScript
specification, where current is generally used as
the default (e.g., in determining the realm whose Array
constructor should be used to construct the result in Array.prototype.map
).
But this inconsistency is so embedded in the platform that we have to accept it going forward.
Consider the following pages, with a.html
being loaded in a browser
window, b.html
being loaded in an iframe
as shown, and c.html
and d.html
omitted (they can simply be empty
documents):
<!-- a.html -->
<!DOCTYPE html>
<html lang="en">
<title>Entry page</title>
<iframe src="b.html"></iframe>
<button onclick="frames[0].hello()">Hello</button>
<!--b.html -->
<!DOCTYPE html>
<html lang="en">
<title>Incumbent page</title>
<iframe src="c.html" id="c"></iframe>
<iframe src="d.html" id="d"></iframe>
<script>
const c = document.querySelector("#c").contentWindow;
const d = document.querySelector("#d").contentWindow;
window.hello = () => {
c.print.call(d);
};
</script>
Each page has its own browsing context, and thus its own realm, global object, and environment settings object.
When the print()
method is called in response to pressing the
button in a.html
, then:
The entry realm is that of a.html
.
The incumbent realm is that of b.html
.
The current realm is that of c.html
(since it is the
print()
method from c.html
whose code is
running).
The relevant realm of the object on which
the print()
method is being called is that of d.html
.
One reason why the relevant concept is
generally a better default choice than the current concept is that it is more suitable for
creating an object that is to be persisted and returned multiple times. For example, the navigator.getBattery()
method creates promises in the
relevant realm for the Navigator
object
on which it is invoked. This has the following impact: BATTERY
<!-- outer.html -->
<!DOCTYPE html>
<html lang="en">
<title>Relevant realm demo: outer page</title>
<script>
function doTest() {
const promise = navigator.getBattery.call(frames[0].navigator);
console.log(promise instanceof Promise); // logs false
console.log(promise instanceof frames[0].Promise); // logs true
frames[0].hello();
}
</script>
<iframe src="inner.html" onload="doTest()"></iframe>
<!-- inner.html -->
<!DOCTYPE html>
<html lang="en">
<title>Relevant realm demo: inner page</title>
<script>
function hello() {
const promise = navigator.getBattery();
console.log(promise instanceof Promise); // logs true
console.log(promise instanceof parent.Promise); // logs false
}
</script>
If the algorithm for the getBattery()
method
had instead used the current realm, all the results would be reversed. That is,
after the first call to getBattery()
in outer.html
, the Navigator
object in inner.html
would be permanently storing a Promise
object
created in outer.html
's realm, and calls like that inside the
hello()
function would thus return a promise from the "wrong" realm. Since
this is undesirable, the algorithm instead uses the relevant realm, giving the sensible results indicated in
the comments above.
The rest of this section deals with formally defining the entry, incumbent, current, and relevant concepts.
The process of calling scripts will push or pop realm execution contexts onto the JavaScript execution context stack, interspersed with other execution contexts.
With this in hand, we define the entry execution context to be the most recently pushed item in the JavaScript execution context stack that is a realm execution context. The entry realm is the entry execution context's Realm component.
Then, the entry settings object is the environment settings object of the entry realm.
Similarly, the entry global object is the global object of the entry realm.
All JavaScript execution contexts must contain, as part of their code evaluation state, a skip-when-determining-incumbent counter value, which is initially zero. In the process of preparing to run a callback and cleaning up after running a callback, this value will be incremented and decremented.
Every event loop has an associated backup incumbent settings object stack, initially empty. Roughly speaking, it is used to determine the incumbent settings object when no author code is on the stack, but author code is responsible for the current algorithm having been run in some way. The process of preparing to run a callback and cleaning up after running a callback manipulate this stack. WEBIDL
When Web IDL is used to invoke author code, or when HostEnqueuePromiseJob invokes a promise job, they use the following algorithms to track relevant data for determining the incumbent settings object:
To prepare to run a callback with an environment settings object settings:
Push settings onto the backup incumbent settings object stack.
Let context be the topmost script-having execution context.
If context is not null, increment context's skip-when-determining-incumbent counter.
To clean up after running a callback with an environment settings object settings:
Let context be the topmost script-having execution context.
This will be the same as the topmost script-having execution context inside the corresponding invocation of prepare to run a callback.
If context is not null, decrement context's skip-when-determining-incumbent counter.
Assert: the topmost entry of the backup incumbent settings object stack is settings.
Remove settings from the backup incumbent settings object stack.
Here, the topmost script-having execution context is the topmost entry of the JavaScript execution context stack that has a non-null ScriptOrModule component, or null if there is no such entry in the JavaScript execution context stack.
With all this in place, the incumbent settings object is determined as follows:
Let context be the topmost script-having execution context.
If context is null, or if context's skip-when-determining-incumbent counter is greater than zero, then:
Assert: the backup incumbent settings object stack is not empty.
This assert would fail if you try to obtain the incumbent settings object from inside an algorithm that was triggered neither by calling scripts nor by Web IDL invoking a callback. For example, it would trigger if you tried to obtain the incumbent settings object inside an algorithm that ran periodically as part of the event loop, with no involvement of author code. In such cases the incumbent concept cannot be used.
Return the topmost entry of the backup incumbent settings object stack.
Return context's Realm component's settings object.
Then, the incumbent realm is the realm of the incumbent settings object.
Similarly, the incumbent global object is the global object of the incumbent settings object.
The following series of examples is intended to make it clear how all of the different mechanisms contribute to the definition of the incumbent concept:
Consider the following starter example:
<!DOCTYPE html>
<iframe></iframe>
<script>
frames[0].postMessage("some data", "*");
</script>
There are two interesting environment settings
objects here: that of window
, and that of frames[0]
. Our concern is: what is the incumbent settings object at
the time that the algorithm for postMessage()
executes?
It should be that of window
, to capture the intuitive notion that the
author script responsible for causing the algorithm to happen is executing in window
, not frames[0]
. This makes sense: the window
post message steps use the incumbent settings object to determine the source
property of the resulting
MessageEvent
, and in this case window
is definitely the
source of the message.
Let us now explain how the steps given above give us our intuitively-desired result of window
's relevant settings object.
When the window post message steps look up the incumbent settings
object, the topmost script-having execution context will be that
corresponding to the script
element: it was pushed onto the JavaScript
execution context stack as part of ScriptEvaluation during the run a classic script
algorithm. Since there are no Web IDL callback invocations involved, the context's
skip-when-determining-incumbent counter is zero, so it is used to determine the
incumbent settings object; the result is the environment settings
object of window
.
(Note how the environment settings object of frames[0]
is
the relevant settings object of this at the time the postMessage()
method is called, and thus is involved in
determining the target of the message. Whereas the incumbent is used to determine the
source.)
Consider the following more complicated example:
<!DOCTYPE html>
<iframe></iframe>
<script>
const bound = frames[0].postMessage.bind(frames[0], "some data", "*");
window.setTimeout(bound);
</script>
This example is very similar to the previous one, but with an extra indirection through Function.prototype.bind
as well as setTimeout()
. But, the answer should be the same: invoking
algorithms asynchronously should not change the incumbent concept.
This time, the result involves more complicated mechanisms:
When bound
is converted to a
Web IDL callback type, the incumbent settings object is that corresponding to window
(in the same manner as in our starter example above). Web IDL stores this
as the resulting callback value's callback context.
When the task posted by setTimeout()
executes, the algorithm for that task uses Web IDL to
invoke the stored callback value. Web IDL in
turn calls the above prepare to run a callback algorithm. This pushes the stored
callback context onto the backup incumbent settings object stack. At
this time (inside the timer task) there is no author code on the stack, so the topmost
script-having execution context is null, and nothing gets its
skip-when-determining-incumbent counter incremented.
Invoking the callback then calls bound
, which in turn calls
the postMessage()
method of frames[0]
. When the postMessage()
algorithm looks up the incumbent settings object, there is still no author code on
the stack, since the bound function just directly calls the built-in method. So the
topmost script-having execution context will be null: the JavaScript execution
context stack only contains an execution context corresponding to postMessage()
, with no ScriptEvaluation context or similar below it.
This is where we fall back to the backup incumbent settings object stack. As
noted above, it will contain as its topmost entry the relevant settings object of
window
. So that is what is used as the incumbent settings
object while executing the postMessage()
algorithm.
Consider this final, even more convoluted example:
<!-- a.html -->
<!DOCTYPE html>
<button>click me</button>
<iframe></iframe>
<script>
const bound = frames[0].location.assign.bind(frames[0].location, "https://example.com/");
document.querySelector("button").addEventListener("click", bound);
</script>
<!-- b.html -->
<!DOCTYPE html>
<iframe src="a.html"></iframe>
<script>
const iframe = document.querySelector("iframe");
iframe.onload = function onLoad() {
iframe.contentWindow.document.querySelector("button").click();
};
</script>
Again there are two interesting environment
settings objects in play: that of a.html
, and that of b.html
. When the location.assign()
method triggers the Location
-object navigate algorithm, what will be
the incumbent settings object? As before, it should intuitively be that of a.html
: the click
listener was originally
scheduled by a.html
, so even if something involving b.html
causes the listener to fire, the incumbent responsible is that of a.html
.
The callback setup is similar to the previous example: when bound
is
converted to a Web IDL callback type, the
incumbent settings object is that corresponding to a.html
,
which is stored as the callback's callback context.
When the click()
method is called inside b.html
, it dispatches a click
event on the button that is inside a.html
. This time, when the prepare to run a callback algorithm
executes as part of event dispatch, there is author code on the stack; the topmost
script-having execution context is that of the onLoad
function,
whose skip-when-determining-incumbent counter gets incremented. Additionally, a.html
's environment settings object (stored as the
EventHandler
's callback context) is pushed onto the
backup incumbent settings object stack.
Now, when the Location
-object navigate algorithm looks up the
incumbent settings object, the topmost script-having execution
context is still that of the onLoad
function (due to the fact we
are using a bound function as the callback). Its skip-when-determining-incumbent
counter value is one, however, so we fall back to the backup incumbent settings
object stack. This gives us the environment settings object of a.html
, as expected.
Note that this means that even though it is the iframe
inside a.html
that navigates, it is a.html
itself that is used
as the source Document
, which determines among other things the request client. This is perhaps the only justifiable use
of the incumbent concept on the web platform; in all other cases the consequences of using it
are simply confusing and we hope to one day switch them to use current or relevant as appropriate.
The JavaScript specification defines the current realm, also known as the "current Realm Record". JAVASCRIPT
Then, the current settings object is the environment settings object of the current realm.
Similarly, the current global object is the global object of the current realm.
The relevant realm for a platform object is the value of its [[Realm]] field.
Then, the relevant settings object for a platform object o is the environment settings object of the relevant realm for o.
Similarly, the relevant global object for a platform object o is the global object of the relevant realm for o.
Scripting is enabled for an environment settings object settings when all of the following conditions are true:
Window
object,
or settings's global object's
associated Document
's active
sandboxing flag set does not have its sandboxed scripts browsing context flag
set.Scripting is disabled for an environment settings object when scripting is not enabled for it, i.e., when any of the above conditions are false.
Scripting is enabled for a node node if node's node document's browsing context is non-null, and scripting is enabled for node's relevant settings object.
Scripting is disabled for a node when scripting is not enabled, i.e., when its node document's browsing context is null or when scripting is disabled for its relevant settings object.
An environment environment is a secure context if the following algorithm returns true:
If environment is an environment settings object, then:
Let global be environment's global object.
If global is a WorkerGlobalScope
, then:
If global's owner set[0]'s relevant settings object is a secure context, then return true.
We only need to check the 0th item since they will necessarily all be consistent.
Return false.
If global is a WorkletGlobalScope
, then return true.
Worklets can only be created in secure contexts.
If the result of Is url potentially trustworthy? given
environment's top-level creation URL is "Potentially
Trustworthy
", then return true.
Return false.
An environment is a non-secure context if it is not a secure context.
A script is one of two possible structs (namely, a classic script or a module script). All scripts have:
An environment settings object, containing various settings that are shared with other scripts in the same context.
One of the following:
a script record, for classic scripts;
a Source Text Module Record, for JavaScript module scripts;
a Synthetic Module Record, for CSS module scripts and JSON module scripts;
a WebAssembly Module Record, for WebAssembly module scripts; or
null, representing a parsing failure.
A JavaScript value, which has meaning only if the record is null, indicating that the corresponding script source text could not be parsed.
This value is used for internal tracking of immediate parse errors when creating scripts, and is not to be used directly. Instead, consult the error to rethrow when determining "what went wrong" for this script.
A JavaScript value representing an error that will prevent evaluation from succeeding. It will be re-thrown by any attempts to run the script.
This could be the script's parse error, but in the case of a module script it could instead be the parse error from one of its dependencies, or an error from resolve a module specifier.
Since this exception value is provided by the JavaScript specification, we know that it is never null, so we use null to signal that no error has occurred.
Null or a base URL used for resolving module specifiers. When non-null, this will either be the URL from which the script was obtained, for external scripts, or the document base URL of the containing document, for inline scripts.
A classic script is a type of script that has the following additional item:
A boolean which, if true, means that error information will not be provided for errors in this script. This is used to mute errors for cross-origin scripts, since that can leak private information.
A module script is another type of script. It has no additional items.
Module scripts can be classified into four types:
A module script is a JavaScript module script if its record is a Source Text Module Record.
A module script is a CSS module script if its record is a Synthetic Module Record, and it was created via the create a CSS module script algorithm. CSS module scripts represent a parsed CSS stylesheet.
A module script is a JSON module script if its record is a Synthetic Module Record, and it was created via the create a JSON module script algorithm. JSON module scripts represent a parsed JSON document.
A module script is a WebAssembly module script if its record is a WebAssembly Module Record.
As CSS stylesheets and JSON documents do not import dependent modules, and do not throw exceptions on evaluation, the fetch options and base URL of CSS module scripts and JSON module scripts and are always null.
The active script is determined by the following algorithm:
Let record be GetActiveScriptOrModule().
If record is null, return null.
Return record.[[HostDefined]].
The active script concept is so far only used by the
import()
feature, to determine the base
URL to use for resolving relative module specifiers.
This section introduces a number of algorithms for fetching scripts, taking various necessary inputs and resulting in classic or module scripts.
Script fetch options is a struct with the following items:
The cryptographic nonce metadata used for the initial fetch and for fetching any imported modules
The integrity metadata used for the initial fetch
The parser metadata used for the initial fetch and for fetching any imported modules
The credentials mode used for the initial fetch (for module scripts) and for fetching any imported modules (for both module scripts and classic scripts)
The referrer policy used for the initial fetch and for fetching any imported modules
This policy can mutate after a module script's response is received, to be the referrer policy parsed from the response, and used when fetching any module dependencies.
The boolean value of render-blocking used for the initial fetch and for fetching any imported modules. Unless otherwise stated, its value is false.
The priority used for the initial fetch
Recall that via the import()
feature, classic scripts can import module scripts.
The default script fetch options are a script fetch options whose cryptographic nonce is the empty string, integrity metadata is the empty string,
parser metadata is "not-parser-inserted
", credentials mode is "same-origin
", referrer policy is the empty
string, and fetch priority
is "auto
".
Given a request request and a script fetch options options, we define:
Set request's cryptographic nonce metadata to options's cryptographic nonce, its integrity metadata to options's integrity metadata, its parser metadata to options's parser metadata, its referrer policy to options's referrer policy, its render-blocking to options's render-blocking, and its priority to options's fetch priority.
Set request's cryptographic nonce metadata to options's cryptographic nonce, its integrity metadata to options's integrity metadata, its parser metadata to options's parser metadata, its credentials mode to options's credentials mode, its referrer policy to options's referrer policy, its render-blocking to options's render-blocking, and its priority to options's fetch priority.
To get the descendant script fetch options given a script fetch options originalOptions, a URL url, and an environment settings object settingsObject:
Let newOptions be a copy of originalOptions.
Let integrity be the result of resolving a module integrity metadata with url and settingsObject.
Set newOptions's integrity metadata to integrity.
Set newOptions's fetch priority to "auto
".
Return newOptions.
To resolve a module integrity metadata, given a URL url and an environment settings object settingsObject:
Let map be settingsObject's global object's import map.
If map's integrity[url] does not exist, then return the empty string.
Return map's integrity[url].
Several of the below algorithms can be customized with a perform the fetch
hook algorithm, which takes a request, a boolean isTopLevel, and a processCustomFetchResponse
algorithm. It runs processCustomFetchResponse with a response and either null (on failure) or a byte
sequence containing the response body. isTopLevel will be true for all classic
script fetches, and for the initial fetch when fetching an external module script graph or fetching a module worker script graph, but false for the fetches
resulting from import
statements encountered throughout the graph or from
import()
expressions.
By default, not supplying a perform the fetch hook will cause the below algorithms to simply fetch the given request, with algorithm-specific customizations to the request and validations of the resulting response.
To layer your own customizations on top of these algorithm-specific ones, supply a perform the fetch hook that modifies the given request, fetches it, and then performs specific validations of the resulting response (completing with a network error if the validations fail).
The hook can also be used to perform more subtle customizations, such as keeping a cache of responses and avoiding performing a fetch at all.
Service Workers is an example of a specification that runs these algorithms with its own options for the hook. SW
Now for the algorithms themselves.
To fetch a classic script given a URL url, an environment settings object settingsObject, a script fetch options options, a CORS settings attribute state corsSetting, an encoding encoding, and an algorithm onComplete, run these steps. onComplete must be an algorithm accepting null (on failure) or a classic script (on success).
Let request be the result of creating a potential-CORS request given url, "script
", and corsSetting.
Set request's client to settingsObject.
Set request's initiator
type to "script
".
Set up the classic script request given request and options.
Fetch request with the following processResponseConsumeBody steps given response response and null, failure, or a byte sequence bodyBytes:
response can be either CORS-same-origin or CORS-cross-origin. This only affects how error reporting happens.
Set response to response's unsafe response.
If any of the following are true:
bodyBytes is null or failure; or
response's status is not an ok status,
then run onComplete given null, and abort these steps.
For historical reasons, this algorithm does not include MIME type checking, unlike the other script-fetching algorithms in this section.
Let potentialMIMETypeForEncoding be the result of extracting a MIME type given response's header list.
Set encoding to the result of legacy extracting an encoding given potentialMIMETypeForEncoding and encoding.
This intentionally ignores the MIME type essence.
Let sourceText be the result of decoding bodyBytes to Unicode, using encoding as the fallback encoding.
The decode algorithm overrides encoding if the file contains a BOM.
Let mutedErrors be true if response was CORS-cross-origin, and false otherwise.
Let script be the result of creating a classic script given sourceText, settingsObject, response's URL, options, mutedErrors, and url.
To fetch a classic worker script given a URL url, an environment settings object fetchClient, a destination destination, an environment settings object settingsObject, an algorithm onComplete, and an optional perform the fetch hook performFetch, run these steps. onComplete must be an algorithm accepting null (on failure) or a classic script (on success).
Let request be a new request whose URL is url, client is fetchClient, destination is destination, initiator type is "other
",
mode is "same-origin
", credentials mode is "same-origin
", parser
metadata is "not parser-inserted
", and whose
use-URL-credentials flag is set.
If performFetch was given, run performFetch with request, true, and with processResponseConsumeBody as defined below.
Otherwise, fetch request with processResponseConsumeBody set to processResponseConsumeBody as defined below.
In both cases, let processResponseConsumeBody given response response and null, failure, or a byte sequence bodyBytes be the following algorithm:
Set response to response's unsafe response.
If any of the following are true:
bodyBytes is null or failure; or
response's status is not an ok status,
then run onComplete given null, and abort these steps.
If all of the following are true:
response's URL's scheme is an HTTP(S) scheme; and
the result of extracting a MIME type from response's header list is not a JavaScript MIME type,
then run onComplete given null, and abort these steps.
Other fetch schemes are exempted from MIME type checking for historical web-compatibility reasons. We might be able to tighten this in the future; see issue #3255.
Let sourceText be the result of UTF-8 decoding bodyBytes.
Let script be the result of creating a classic script using sourceText, settingsObject, response's URL, and the default script fetch options.
Run onComplete given script.
To fetch a classic worker-imported script given a URL url, an environment settings object settingsObject, and an optional perform the fetch hook performFetch, run these steps. The algorithm will return a classic script on success, or throw an exception on failure.
Let response be null.
Let bodyBytes be null.
Let request be a new request whose URL is url, client is settingsObject, destination is "script
",
initiator type is "other
", parser metadata
is "not parser-inserted
", and whose use-URL-credentials flag
is set.
If performFetch was given, run performFetch with request, isTopLevel, and with processResponseConsumeBody as defined below.
Otherwise, fetch request with processResponseConsumeBody set to processResponseConsumeBody as defined below.
In both cases, let processResponseConsumeBody given response res and null, failure, or a byte sequence bb be the following algorithm:
Set bodyBytes to bb.
Set response to res.
Pause until response is not null.
Unlike other algorithms in this section, the fetching process is synchronous here.
Set response to response's unsafe response.
If any of the following are true:
bodyBytes is null or failure;
response's status is not an ok status; or
the result of extracting a MIME type from response's header list is not a JavaScript MIME type,
then throw a "NetworkError
" DOMException
.
Let sourceText be the result of UTF-8 decoding bodyBytes.
Let mutedErrors be true if response was CORS-cross-origin, and false otherwise.
Let script be the result of creating a classic script given sourceText, settingsObject, response's URL, the default script fetch options, and mutedErrors.
Return script.
To fetch an external module script graph given a URL url, an environment settings object settingsObject, a script fetch options options, and an algorithm onComplete, run these steps. onComplete must be an algorithm accepting null (on failure) or a module script (on success).
Fetch a single module script given url, settingsObject,
"script
", options, settingsObject, "client
", true, and with the following steps given result:
If result is null, run onComplete given null, and abort these steps.
Fetch the descendants of
and link result given settingsObject, "script
", and onComplete.
To fetch a modulepreload module script graph given a URL url, a destination destination, an environment settings object settingsObject, a script fetch options options, and an algorithm onComplete, run these steps. onComplete must be an algorithm accepting null (on failure) or a module script (on success).
Fetch a single module script given url, settingsObject,
destination, options, settingsObject, "client
", true, and with the following steps given result:
Run onComplete given result.
Assert: settingsObject's global object implements
Window
.
If result is not null, optionally fetch the descendants of and link result given settingsObject, destination, and an empty algorithm.
Generally, performing this step will be beneficial for performance, as it allows pre-loading the modules that will invariably be requested later, via algorithms such as fetch an external module script graph that fetch the entire graph. However, user agents might wish to skip them in bandwidth-constrained situations, or situations where the relevant fetches are already in flight.
To fetch an inline module script graph given a string sourceText, a URL baseURL, an environment settings object settingsObject, a script fetch options options, and an algorithm onComplete, run these steps. onComplete must be an algorithm accepting null (on failure) or a module script (on success).
Let script be the result of creating a JavaScript module script using sourceText, settingsObject, baseURL, and options.
Fetch the descendants of
and link script, given settingsObject, "script
", and onComplete.
To fetch a module worker script graph given a URL url, an environment settings object fetchClient, a destination destination, a credentials mode credentialsMode, an environment settings object settingsObject, and an algorithm onComplete, fetch a worklet/module worker script graph given url, fetchClient, destination, credentialsMode, settingsObject, and onComplete.
To fetch a worklet script graph given a URL url, an environment settings object fetchClient, a destination destination, a credentials mode credentialsMode, an environment settings object settingsObject, a module responses map moduleResponsesMap, and an algorithm onComplete, fetch a worklet/module worker script graph given url, fetchClient, destination, credentialsMode, settingsObject, onComplete, and the following perform the fetch hook given request and processCustomFetchResponse:
Let requestURL be request's URL.
If moduleResponsesMap[requestURL] is "fetching
", wait in parallel until that entry's value changes, then
queue a task on the networking task source to proceed with running the
following steps.
If moduleResponsesMap[requestURL] exists, then:
Let cached be moduleResponsesMap[requestURL].
Run processCustomFetchResponse with cached[0] and cached[1].
Return.
Set moduleResponsesMap[requestURL] to
"fetching
".
Fetch request, with processResponseConsumeBody set to the following steps given response response and null, failure, or a byte sequence bodyBytes:
Set moduleResponsesMap[requestURL] to (response, bodyBytes).
Run processCustomFetchResponse with response and bodyBytes.
The following algorithms are meant for internal use by this specification only as part of fetching an external module script graph or other similar concepts above, and should not be used directly by other specifications.
This diagram illustrates how these algorithms relate to the ones above, as well as to each other:
To fetch a worklet/module worker script graph given a URL url, an environment settings object fetchClient, a destination destination, a credentials mode credentialsMode, an environment settings object settingsObject, an algorithm onComplete, and an optional perform the fetch hook performFetch, run these steps. onComplete must be an algorithm accepting null (on failure) or a module script (on success).
Let options be a script fetch options whose cryptographic nonce is the empty string, integrity metadata is the empty string,
parser metadata is "not-parser-inserted
", credentials mode is
credentialsMode, referrer
policy is the empty string, and fetch priority is "auto
".
Fetch a single module script given url,
fetchClient, destination, options, settingsObject,
"client
", true, and onSingleFetchComplete as defined below. If
performFetch was given, pass it along as well.
onSingleFetchComplete given result is the following algorithm:
If result is null, run onComplete given null, and abort these steps.
Fetch the descendants of and link result given fetchClient, destination, and onComplete. If performFetch was given, pass it along as well.
To fetch the descendants of and link a module script moduleScript, given an environment settings object fetchClient, a destination destination, an algorithm onComplete, and an optional perform the fetch hook performFetch, run these steps. onComplete must be an algorithm accepting null (on failure) or a module script (on success).
Let record be moduleScript's record.
If record is null, then:
Set moduleScript's error to rethrow to moduleScript's parse error.
Run onComplete given moduleScript.
Return.
Let state be Record { [[ParseError]]: null, [[Destination]]: destination, [[PerformFetch]]: null, [[FetchClient]]: fetchClient }.
If performFetch was given, set state.[[PerformFetch]] to performFetch.
Let loadingPromise be record.LoadRequestedModules(state).
This step will recursively load all the module transitive dependencies.
Upon fulfillment of loadingPromise, run the following steps:
Perform record.Link().
This step will recursively call Link on all of the module's unlinked dependencies.
If this throws an exception, catch it, and set moduleScript's error to rethrow to that exception.
Run onComplete given moduleScript.
Upon rejection of loadingPromise, run the following steps:
If state.[[ParseError]] is not null, set moduleScript's error to rethrow to state.[[ParseError]] and run onComplete given moduleScript.
Otherwise, run onComplete given null.
state.[[ParseError]] is null when loadingPromise is rejected due to a loading error.
To fetch a single module script, given a URL url, an environment settings object fetchClient, a destination destination, a script fetch options options, an environment settings object settingsObject, a referrer referrer, an optional ModuleRequest Record moduleRequest, a boolean isTopLevel, an algorithm onComplete, and an optional perform the fetch hook performFetch, run these steps. onComplete must be an algorithm accepting null (on failure) or a module script (on success).
Let moduleType be "javascript-or-wasm
".
If moduleRequest was given, then set moduleType to the result of running the module type from module request steps given moduleRequest.
Assert: the result of running the module type allowed steps given moduleType and settingsObject is true. Otherwise, we would not have reached this point because a failure would have been raised when inspecting moduleRequest.[[Attributes]] in HostLoadImportedModule or fetch a single imported module script.
Let moduleMap be settingsObject's module map.
If moduleMap[(url, moduleType)] is
"fetching
", wait in parallel until that entry's value
changes, then queue a task on the networking task source to proceed
with running the following steps.
If moduleMap[(url, moduleType)] exists, run onComplete given moduleMap[(url, moduleType)], and return.
Set moduleMap[(url,
moduleType)] to "fetching
".
Let request be a new request whose
URL is url, mode is "cors
", referrer is referrer, and client is fetchClient.
Set request's destination to the result of running the fetch destination from module type steps given destination and moduleType.
If destination is "worker
", "sharedworker
", or "serviceworker
", and
isTopLevel is true, then set request's mode to "same-origin
".
Set request's initiator
type to "script
".
Set up the module script request given request and options.
If performFetch was given, run performFetch with request, isTopLevel, and with processResponseConsumeBody as defined below.
Otherwise, fetch request with processResponseConsumeBody set to processResponseConsumeBody as defined below.
In both cases, let processResponseConsumeBody given response response and null, failure, or a byte sequence bodyBytes be the following algorithm:
response is always CORS-same-origin.
If any of the following are true:
bodyBytes is null or failure; or
response's status is not an ok status,
then set moduleMap[(url, moduleType)] to null, run onComplete given null, and abort these steps.
Let mimeType be the result of extracting a MIME type from response's header list.
Let moduleScript be null.
Let referrerPolicy be the result of parsing the `Referrer-Policy
` header
given response. REFERRERPOLICY
If referrerPolicy is not the empty string, set options's referrer policy to referrerPolicy.
If mimeType's essence is
"application/wasm
" and moduleType is "javascript-or-wasm
", then set moduleScript to the result of
creating a WebAssembly module script given bodyBytes,
settingsObject, response's URL, and options.
Otherwise:
Let sourceText be the result of UTF-8 decoding bodyBytes.
If mimeType is a JavaScript MIME type and moduleType
is "javascript-or-wasm
", then set moduleScript to the result of
creating a JavaScript module script given sourceText,
settingsObject, response's URL, and options.
If the MIME type essence of mimeType is "text/css
"
and moduleType is "css
", then set moduleScript to
the result of creating a CSS module script given sourceText and
settingsObject.
If mimeType is a JSON MIME type and
moduleType is "json
", then set moduleScript to
the result of creating a JSON module script given sourceText and
settingsObject.
Set moduleMap[(url, moduleType)] to moduleScript, and run onComplete given moduleScript.
It is intentional that the module map is keyed by the request URL, whereas the base URL for the module script is set to the response URL. The former is used to deduplicate fetches, while the latter is used for URL resolution.
To fetch a single imported module script, given a URL url, an environment settings object fetchClient, a destination destination, a script fetch options options, environment settings object settingsObject, a referrer referrer, a ModuleRequest Record moduleRequest, an algorithm onComplete, and an optional perform the fetch hook performFetch, run these steps. onComplete must be an algorithm accepting null (on failure) or a module script (on success).
Assert: moduleRequest.[[Attributes]] does not contain any
Record entry such that entry.[[Key]] is not "type
", because we only asked for "type
" attributes in
HostGetSupportedImportAttributes.
Let moduleType be the result of running the module type from module request steps given moduleRequest.
If the result of running the module type allowed steps given moduleType and settingsObject is false, then run onComplete given null, and return.
Fetch a single module script given url, fetchClient, destination, options, settingsObject, referrer, moduleRequest, false, and onComplete. If performFetch was given, pass it along as well.
To create a classic script, given a string source, an environment settings object settings, a URL baseURL, a script fetch options options, an optional boolean mutedErrors (default false), and an optional URL-or-null sourceURLForWindowScripts (default null):
If mutedErrors is true, then set baseURL to
about:blank
.
When mutedErrors is true, baseURL is the script's CORS-cross-origin response's url, which shouldn't be exposed to JavaScript. Therefore, baseURL is sanitized here.
If scripting is disabled for settings, then set source to the empty string.
Let script be a new classic script that this algorithm will subsequently initialize.
Set script's settings object to settings.
Set script's base URL to baseURL.
Set script's fetch options to options.
Set script's muted errors to mutedErrors.
Set script's parse error and error to rethrow to null.
Record classic script creation time given script and sourceURLForWindowScripts.
Let result be ParseScript(source, settings's realm, script).
Passing script as the last parameter here ensures result.[[HostDefined]] will be script.
If result is a list of errors, then:
Set script's parse error and its error to rethrow to result[0].
Return script.
Set script's record to result.
Return script.
To create a JavaScript module script, given a string source, an environment settings object settings, a URL baseURL, and a script fetch options options:
If scripting is disabled for settings, then set source to the empty string.
Let script be a new module script that this algorithm will subsequently initialize.
Set script's settings object to settings.
Set script's base URL to baseURL.
Set script's fetch options to options.
Set script's parse error and error to rethrow to null.
Let result be ParseModule(source, settings's realm, script).
Passing script as the last parameter here ensures result.[[HostDefined]] will be script.
If result is a list of errors, then:
Set script's parse error to result[0].
Return script.
Set script's record to result.
Return script.
To create a WebAssembly module script, given a byte sequence bodyBytes, an environment settings object settings, a URL baseURL, and a script fetch options options:
If scripting is disabled for settings, then set bodyBytes to the byte sequence 0x00 0x61 0x73 0x6d 0x01 0x00 0x00 0x00.
This byte sequence corresponds to an empty WebAssembly module with only the magic bytes and version number provided.
Let script be a new module script that this algorithm will subsequently initialize.
Set script's settings object to settings.
Set script's base URL to baseURL.
Set script's fetch options to options.
Set script's parse error and error to rethrow to null.
Let result be the result of parsing a WebAssembly module given bodyBytes, settings's realm, and script.
Passing script as the last parameter here ensures result.[[HostDefined]] will be script.
If the previous step threw an error error, then:
Set script's parse error to error.
Return script.
Set script's record to result.
Return script.
WebAssembly JavaScript Interface: ESM Integration specifies the hooks for the WebAssembly integration with ECMA-262 module loading. This includes support both for direct dependency imports, as well as for source phase imports, which support virtualization and multi-instantiation. WASMESM
To create a CSS module script, given a string source and an environment settings object settings:
Let script be a new module script that this algorithm will subsequently initialize.
Set script's settings object to settings.
Set script's base URL and fetch options to null.
Set script's parse error and error to rethrow to null.
Let sheet be the result of running the steps to create a constructed
CSSStyleSheet
with an empty dictionary as the argument.
Run the steps to synchronously replace the rules of a CSSStyleSheet
on sheet given source.
If this throws an exception, catch it, and set script's parse error to that exception, and return script.
The steps to synchronously replace the rules of a
CSSStyleSheet
will throw if source contains any @import
rules. This is by-design for now because there is not yet an
agreement on how to handle these for CSS module scripts; therefore they are blocked altogether
until a consensus is reached.
Set script's record to the result of CreateDefaultExportSyntheticModule(sheet).
Return script.
To create a JSON module script, given a string source and an environment settings object settings:
Let script be a new module script that this algorithm will subsequently initialize.
Set script's settings object to settings.
Set script's base URL and fetch options to null.
Set script's parse error and error to rethrow to null.
Let result be ParseJSONModule(source).
If this throws an exception, catch it, and set script's parse error to that exception, and return script.
Set script's record to result.
Return script.
The module type from module request steps, given a ModuleRequest Record moduleRequest, are as follows:
Let moduleType be "javascript-or-wasm
".
If moduleRequest.[[Attributes]] has a Record entry such
that entry.[[Key]] is "type
", then:
If entry.[[Value]] is "javascript-or-wasm
", then set
moduleType to null.
This specification uses the "javascript-or-wasm
" module
type internally for JavaScript module scripts or
WebAssembly module scripts, so this step is
needed to prevent modules from being imported using a
"javascript-or-wasm
" type attribute (a null moduleType will
cause the module type allowed check to fail).
Otherwise, set moduleType to entry.[[Value]].
Return moduleType.
The module type allowed steps, given a string moduleType and an environment settings object settings, are as follows:
If moduleType is not "javascript-or-wasm
", "css
", or "json
", then return false.
If moduleType is "css
" and the
CSSStyleSheet
interface is not exposed in
settings's realm, then
return false.
Return true.
The fetch destination from module type steps, given a destination defaultDestination and a string moduleType, are as follows:
json
", then return "json
".css
", then return "style
".To run a classic script given a classic script script and an optional boolean rethrow errors (default false):
Let settings be the settings object of script.
Check if we can run script with settings. If this returns "do not run" then return NormalCompletion(empty).
Record classic script execution start time given script.
Prepare to run script given settings.
Let evaluationStatus be null.
If script's error to rethrow is not null, then set evaluationStatus to Completion { [[Type]]: throw, [[Value]]: script's error to rethrow, [[Target]]: empty }.
Otherwise, set evaluationStatus to ScriptEvaluation(script's record).
If ScriptEvaluation does not complete because the user agent has aborted the running script, leave evaluationStatus as null.
If evaluationStatus is an abrupt completion, then:
If rethrow errors is true and script's muted errors is false, then:
Clean up after running script with settings.
Rethrow evaluationStatus.[[Value]].
If rethrow errors is true and script's muted errors is true, then:
Clean up after running script with settings.
Throw a "NetworkError
" DOMException
.
Otherwise, rethrow errors is false. Perform the following steps:
Report an exception given by evaluationStatus.[[Value]] for script's settings object's global object.
Clean up after running script with settings.
Return evaluationStatus.
Clean up after running script with settings.
If evaluationStatus is a normal completion, then return evaluationStatus.
If we've reached this point, evaluationStatus was left as null because the
script was aborted prematurely during evaluation.
Return Completion { [[Type]]: throw, [[Value]]: a new
"QuotaExceededError
" DOMException
, [[Target]]: empty }.
To run a module script given a module script script and an optional boolean preventErrorReporting (default false):
Let settings be the settings object of script.
Check if we can run script with settings. If this returns "do not run", then return a promise resolved with undefined.
Record module script execution start time given script.
Prepare to run script given settings.
Let evaluationPromise be null.
If script's error to rethrow is not null, then set evaluationPromise to a promise rejected with script's error to rethrow.
Otherwise:
Let record be script's record.
Set evaluationPromise to record.Evaluate().
This step will recursively evaluate all of the module's dependencies.
If Evaluate fails to complete as a result of the user agent
aborting the running script, then set
evaluationPromise to a promise rejected with a new
"QuotaExceededError
" DOMException
.
If preventErrorReporting is false, then upon rejection of evaluationPromise with reason, report an exception given by reason for script's settings object's global object.
Clean up after running script with settings.
Return evaluationPromise.
The steps to check if we can run script with an environment settings object settings are as follows. They return either "run" or "do not run".
If the global object specified by
settings is a Window
object whose Document
object is not
fully active, then return "do not run".
If scripting is disabled for settings, then return "do not run".
Return "run".
The steps to prepare to run script with an environment settings object settings are as follows:
Push settings's realm execution context onto the JavaScript execution context stack; it is now the running JavaScript execution context.
Add settings to the surrounding agent's event loop's currently running task's script evaluation environment settings object set.
The steps to clean up after running script with an environment settings object settings are as follows:
Assert: settings's realm execution context is the running JavaScript execution context.
Remove settings's realm execution context from the JavaScript execution context stack.
If the JavaScript execution context stack is now empty, perform a microtask checkpoint. (If this runs scripts, these algorithms will be invoked reentrantly.)
These algorithms are not invoked by one script directly calling another, but they can be invoked reentrantly in an indirect manner, e.g. if a script dispatches an event which has event listeners registered.
The running script is the script in the [[HostDefined]] field in the ScriptOrModule component of the running JavaScript execution context.
Although the JavaScript specification does not account for this possibility, it's sometimes
necessary to abort a
running script. This causes any ScriptEvaluation
or Source Text Module Record Evaluate invocations
to cease immediately, emptying the JavaScript execution context stack without
triggering any of the normal mechanisms like finally
blocks.
JAVASCRIPT
User agents may impose resource limitations on scripts, for example CPU quotas, memory limits,
total execution time limits, or bandwidth limitations. When a script exceeds a limit, the user
agent may either throw a "QuotaExceededError
" DOMException
,
abort the script without an exception, prompt the
user, or throttle script execution.
For example, the following script never terminates. A user agent could, after waiting for a few seconds, prompt the user to either terminate the script or let it continue.
<script>
while (true) { /* loop */ }
</script>
User agents are encouraged to allow users to disable scripting whenever the user is prompted
either by a script (e.g. using the window.alert()
API) or because
of a script's actions (e.g. because it has exceeded a time limit).
If scripting is disabled while a script is executing, the script should be terminated immediately.
User agents may allow users to specifically disable scripts just for the purposes of closing a browsing context.
For example, the prompt mentioned in the example above could also offer the
user with a mechanism to just close the page entirely, without running any unload
event handlers.
self.reportError(e)
Dispatches an error
event at the global object for the
given value e, in the same fashion as an unhandled exception.
In various scenarios, the user agent can report an exception by firing an error
event at the Window
. If this event is not canceled,
then the error is considered not handled, and can be reported to the developer console.
To extract error information from a JavaScript value exception:
Let attributes be an empty map keyed by IDL attributes.
Set attributes[error
] to
exception.
Set attributes[message
],
attributes[filename
],
attributes[lineno
], and
attributes[colno
] to
implementation-defined values derived from exception.
Browsers implement behavior not specified here or in the JavaScript
specification to gather values which are helpful, including in unusual cases (e.g., eval
). In the future, this might be specified in greater detail.
Return attributes.
To report an exception exception which is a JavaScript value, for a particular global object global and optional boolean omitError (default false):
Let notHandled be true.
Let errorInfo be the result of extracting error information from exception.
Let script be a script found in an implementation-defined way, or null. This should usually be the running script (most notably during run a classic script).
Implementations have not yet settled on interoperable behavior for which script is used to determine whether errors are muted in less common cases.
If script is a classic script and script's muted
errors is true, then set errorInfo[error
] to null, errorInfo[message
] to "Script error.
",
errorInfo[filename
] to the empty
string, errorInfo[lineno
] to 0, and
errorInfo[colno
] to 0.
If omitError is true, then set errorInfo[error
] to null.
If global is not in error reporting mode, then:
If global implements EventTarget
, then set notHandled to
the result of firing an event named error
at global, using ErrorEvent
, with
the cancelable
attribute initialized to true,
and additional attributes initialized according to errorInfo.
Returning true in an event handler cancels the event per the event handler processing algorithm.
Set global's in error reporting mode to false.
If notHandled is true, then:
Set errorInfo[error
] to
null.
If global implements DedicatedWorkerGlobalScope
, queue a
global task on the DOM manipulation task source with the
global's associated Worker
's relevant global object to
run these steps:
Let workerObject be the Worker
object associated with
global.
Set notHandled be the result of firing
an event named error
at workerObject,
using ErrorEvent
, with the cancelable
attribute initialized to true,
and additional attributes initialized according to errorInfo.
If notHandled is true, then report exception for workerObject's relevant global object with omitError set to true.
The actual exception value will not be available in the owner realm, but the user agent still carries through enough information to set the message, filename, and other attributes, as well as potentially report to a developer console.
Otherwise, the user agent may report exception to a developer console.
If the implicit port connecting a worker to its Worker
object has been
disentangled (i.e. if the parent worker has been terminated), then the user agent must act as if
the Worker
object had no error
event handler and as
if that worker's onerror
attribute was
null, but must otherwise act as described above.
Thus, error reports propagate up to the chain of dedicated workers up to the
original Document
, even if some of the workers along this chain have been terminated
and garbage collected.
Previous revisions of this standard defined an algorithm to report the exception. As part of issue #958, this has been superseded by report an exception which behaves differently and takes different inputs. Issue #10516 tracks updating the specification ecosystem.
The reportError(e)
method steps are to
report an exception e for this.
It is unclear whether muting is applicable here. In Chrome and Safari it is muted, but in Firefox it is not. See also issue #958.
The ErrorEvent
interface is defined as follows:
[Exposed=*]
interface ErrorEvent : Event {
constructor(DOMString type, optional ErrorEventInit eventInitDict = {});
readonly attribute DOMString message;
readonly attribute USVString filename;
readonly attribute unsigned long lineno;
readonly attribute unsigned long colno;
readonly attribute any error;
};
dictionary ErrorEventInit : EventInit {
DOMString message = "";
USVString filename = "";
unsigned long lineno = 0;
unsigned long colno = 0;
any error;
};
The message
attribute must return the value it was initialized to. It represents the error message.
The filename
attribute must return the value it was
initialized to. It represents the URL of the script in which the error originally
occurred.
The lineno
attribute must return the value it was initialized to. It represents the line number where the
error occurred in the script.
The colno
attribute must return the value it was initialized to. It represents the column number where the
error occurred in the script.
The error
attribute must return the value it was initialized to. It must initially be initialized to
undefined. Where appropriate, it is set to the object representing the error (e.g., the exception
object in the case of an uncaught exception).
In addition to synchronous runtime script errors, scripts
may experience asynchronous promise rejections, tracked via the unhandledrejection
and rejectionhandled
events. Tracking these
rejections is done via the HostPromiseRejectionTracker abstract operation, but
reporting them is defined here.
To notify about rejected promises given a global object global:
Let list be a clone of global's about-to-be-notified rejected promises list.
If list is empty, then return.
Empty global's about-to-be-notified rejected promises list.
Queue a global task on the DOM manipulation task source given global to run the following step:
For each promise p of list:
If p.[[PromiseIsHandled]] is true, then continue.
Let notCanceled be the result of firing
an event named unhandledrejection
at
global, using PromiseRejectionEvent
, with the cancelable
attribute initialized to true, the promise
attribute initialized to
p, and the reason
attribute initialized to p.[[PromiseResult]].
If notCanceled is true, then the user agent may report p.[[PromiseResult]] to a developer console.
If p.[[PromiseIsHandled]] is false, then append p to global's outstanding rejected promises weak set.
The PromiseRejectionEvent
interface is
defined as follows:
[Exposed=*]
interface PromiseRejectionEvent : Event {
constructor(DOMString type, PromiseRejectionEventInit eventInitDict);
readonly attribute object promise;
readonly attribute any reason;
};
dictionary PromiseRejectionEventInit : EventInit {
required object promise;
any reason;
};
The promise
attribute must return the value it
was initialized to. It represents the promise which this notification is about.
Because of how Web IDL conversion rules for Promise<T>
types always wrap the input into a new promise, the
promise
attribute is of type object
instead, which is more appropriate for representing an opaque
handle to the original promise object.
The reason
attribute must return the value it
was initialized to. It represents the rejection reason for the promise.
An import map parse result is a struct that is similar to a script, and also can be stored in a script
element's
result, but is not counted as a script for other purposes. It has the following items:
To create an import map parse result given a string input and a URL baseURL:
Let result be an import map parse result whose import map is null and whose error to rethrow is null.
Parse an import map string given input and baseURL, catching any exceptions. If this threw an exception, then set result's error to rethrow to that exception. Otherwise, set result's import map to the return value.
Return result.
To register an import map given a Window
global and an
import map parse result result:
If result's error to rethrow is not null, then report an exception given by result's error to rethrow for global and return.
Merge existing and new import maps, given global and result's import map.
The resolve a module specifier algorithm is the primary entry point for converting module specifier strings into URLs. When no import maps are involved, it is relatively straightforward, and reduces to resolving a URL-like module specifier.
When there is a non-empty import map present, the behavior is more complex. It checks candidate entries from all applicable module specifier maps, from most-specific to least-specific scopes (falling back to the top-level unscoped imports), and from most-specific to least-specific prefixes. For each candidate, the resolve an imports match algorithm will give on the following results:
Successful resolution of the specifier to a URL. Then the resolve a module specifier algorithm will return that URL.
Throwing an exception. Then the resolve a module specifier algorithm will rethrow that exception, without any further fallbacks.
Failing to resolve, without an error. In this case the outer resolve a module specifier algorithm will move on to the next candidate.
In the end, if no successful resolution is found via any of the candidate module specifier maps, resolve a module specifier will throw an exception. Thus the result is always either a URL or a thrown exception.
To resolve a module specifier given a script-or-null referringScript and a string specifier:
Let settingsObject and baseURL be null.
If referringScript is not null, then:
Set settingsObject to referringScript's settings object.
Set baseURL to referringScript's base URL.
Otherwise:
Assert: there is a current settings object.
Set settingsObject to the current settings object.
Set baseURL to settingsObject's API base URL.
Let importMap be an empty import map.
If settingsObject's global
object implements Window
, then set importMap to
settingsObject's global object's
import map.
Let serializedBaseURL be baseURL, serialized.
Let asURL be the result of resolving a URL-like module specifier given specifier and baseURL.
Let normalizedSpecifier be the serialization of asURL, if asURL is non-null; otherwise, specifier.
Let result be a URL-or-null, initially null.
For each scopePrefix → scopeImports of importMap's scopes:
If scopePrefix is serializedBaseURL, or if scopePrefix ends with U+002F (/) and scopePrefix is a code unit prefix of serializedBaseURL, then:
Let scopeImportsMatch be the result of resolving an imports match given normalizedSpecifier, asURL, and scopeImports.
If scopeImportsMatch is not null, then set result to scopeImportsMatch, and break.
If result is null, set result be the result of resolving an imports match given normalizedSpecifier, asURL, and importMap's imports.
At this point, if result is null, specifier wasn't remapped to anything by importMap, but it might have been able to be turned into a URL.
If result is null, set it to asURL.
If result is not null, then:
Add module to resolved module set given settingsObject, serializedBaseURL, normalizedSpecifier, and asURL.
Return result.
Throw a TypeError
indicating that specifier was a bare specifier,
but was not remapped to anything by importMap.
To resolve an imports match, given a string normalizedSpecifier, a URL-or-null asURL, and a module specifier map specifierMap:
For each specifierKey → resolutionResult of specifierMap:
If specifierKey is normalizedSpecifier, then:
If resolutionResult is null, then throw a TypeError
indicating
that resolution of specifierKey was blocked by a null entry.
This will terminate the entire resolve a module specifier algorithm, without any further fallbacks.
Assert: resolutionResult is a URL.
Return resolutionResult.
If all of the following are true:
specifierKey ends with U+002F (/);
specifierKey is a code unit prefix of normalizedSpecifier; and
either asURL is null, or asURL is special,
then:
If resolutionResult is null, then throw a TypeError
indicating
that the resolution of specifierKey was blocked by a null entry.
This will terminate the entire resolve a module specifier algorithm, without any further fallbacks.
Assert: resolutionResult is a URL.
Let afterPrefix be the portion of normalizedSpecifier after the initial specifierKey prefix.
Assert: resolutionResult, serialized, ends with U+002F (/), as enforced during parsing.
Let url be the result of URL parsing afterPrefix with resolutionResult.
If url is failure, then throw a TypeError
indicating that
resolution of normalizedSpecifier was blocked since the afterPrefix
portion could not be URL-parsed relative to the resolutionResult mapped to by
the specifierKey prefix.
This will terminate the entire resolve a module specifier algorithm, without any further fallbacks.
Assert: url is a URL.
If the serialization of
resolutionResult is not a code unit prefix of the serialization of url, then throw a
TypeError
indicating that the resolution of normalizedSpecifier was
blocked due to it backtracking above its prefix specifierKey.
This will terminate the entire resolve a module specifier algorithm, without any further fallbacks.
Return url.
Return null.
The resolve a module specifier algorithm will fall back to a
less-specific scope, or to "imports
", if possible.
To resolve a URL-like module specifier, given a string specifier and a URL baseURL:
If specifier starts with "/
", "./
", or "../
", then:
Let url be the result of URL parsing specifier with baseURL.
If url is failure, then return null.
One way this could happen is if specifier is "../foo
" and baseURL is a data:
URL.
Return url.
This includes cases where specifier starts with "//
", i.e., scheme-relative URLs. Thus, url might end up with a
different host than baseURL.
Let url be the result of URL parsing specifier (with no base URL).
If url is failure, then return null.
Return url.
An import map allows control over module specifier resolution. Import maps
are delivered via inline script
elements with their type
attribute set to "importmap
", and
with their child text content containing a JSON representation of the import
map.
A Document
can have multiple import maps processed, which can happen either
before or after any modules have been imported, e.g., via import()
expressions or
script
elements with their type
attribute set
to "module
". The merge existing and new import maps algorithm
ensures that new import maps cannot define the module resolution for modules that were already
defined by past import maps, or for ones that were already resolved.
The simplest use of import maps is to globally remap a bare module specifier:
{
"imports": {
"moment": "/node_modules/moment/src/moment.js"
}
}
This enables statements like import moment from "moment";
to work, fetching and evaluating the JavaScript module at the /node_modules/moment/src/moment.js
URL.
An import map can remap a class of module specifiers into a class of URLs by using trailing slashes, like so:
{
"imports": {
"moment/": "/node_modules/moment/src/"
}
}
This enables statements like import localeData from
"moment/locale/zh-cn.js";
to work, fetching and evaluating the JavaScript module at the
/node_modules/moment/src/locale/zh-cn.js
URL. Such trailing-slash
mappings are often combined with bare-specifier mappings, e.g.
{
"imports": {
"moment": "/node_modules/moment/src/moment.js",
"moment/": "/node_modules/moment/src/"
}
}
so that both the "main module" specified by "moment
" and the
"submodules" specified by paths such as "moment/locale/zh-cn.js
" are
available.
Bare specifiers are not the only type of module specifiers which import maps can remap.
"URL-like" specifiers, i.e., those that are either parseable as absolute URLs or start with
"/
", "./
", or "../
", can be
remapped as well:
{
"imports": {
"https://cdn.example.com/vue/dist/vue.runtime.esm.js": "/node_modules/vue/dist/vue.runtime.esm.js",
"/js/app.mjs": "/js/app-8e0d62a03.mjs",
"../helpers/": "https://cdn.example/helpers/"
}
}
Note how the URL to be remapped, as well as the URL being mapped to, can be specified either
as absolute URLs, or as relative URLs starting with "/
", "./
", or "../
". (They cannot be specified as relative
URLs without those starting sigils, as those help distinguish from bare module specifiers.) Also
note how the trailing slash mapping works in
this context as well.
Such remappings operate on the post-canonicalization URL, and do not require a match between
the literal strings supplied in the import map key and the imported module specifier. So for
example, if this import map was included on https://example.com/app.html
,
then not only would import "/js/app.mjs"
be remapped, but so
would import "./js/app.mjs"
and import "./foo/../js/app.mjs"
.
All previous examples have globally remapped module specifiers, by using the top-level "imports
" key in the import map. The top-level "scopes
"
key can be used to provide localized remappings, which only apply when the referring module
matches a specific URL prefix. For example:
{
"scopes": {
"/a/" : {
"moment": "/node_modules/moment/src/moment.js"
},
"/b/" : {
"moment": "https://cdn.example.com/moment/src/moment.js"
}
}
}
With this import map, the statement import "moment"
will have
different meanings depending on which referrer script contains the statement:
Inside scripts located under /a/
, this will import /node_modules/moment/src/moment.js
.
Inside scripts located under /b/
, this will import https://cdn.example.com/moment/src/moment.js
.
Inside scripts located under /c/
, this will fail to resolve and
thus throw an exception.
A typical usage of scopes is to allow multiple versions of the "same" module to exist in a web application, with some parts of the module graph importing one version, and other parts importing another version.
Scopes can overlap each other, and overlap the global "imports
"
specifier map. At resolution time, scopes are consulted in order of most- to least-specific,
where specificity is measured by sorting the scopes using the code unit less than
operation. So, for example, "/scope2/scope3/
" is treated as more specific
than "/scope2/
", which is treated as more specific than the top-level
(unscoped) mappings.
The following import map illustrates this:
{
"imports": {
"a": "/a-1.mjs",
"b": "/b-1.mjs",
"c": "/c-1.mjs"
},
"scopes": {
"/scope2/": {
"a": "/a-2.mjs"
},
"/scope2/scope3/": {
"b": "/b-3.mjs"
}
}
}
This results in the following resolutions (using relative URLs for brevity):
Specifier | ||||
---|---|---|---|---|
"a "
| "b "
| "c "
| ||
Referrer | /scope1/r.mjs
| /a-1.mjs
| /b-1.mjs
| /c-1.mjs
|
/scope2/r.mjs
| /a-2.mjs
| /b-1.mjs
| /c-1.mjs
| |
/scope2/scope3/r.mjs
| /a-2.mjs
| /b-3.mjs
| /c-1.mjs
|
Import maps can also be used to provide modules with integrity metadata to be used in Subresource Integrity checks. SRI
The following import map illustrates this:
{
"imports": {
"a": "/a-1.mjs",
"b": "/b-1.mjs",
"c": "/c-1.mjs"
},
"integrity": {
"/a-1.mjs": "sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7",
"/d-1.mjs": "sha384-MBO5IDfYaE6c6Aao94oZrIOiC6CGiSN2n4QUbHNPhzk5Xhm0djZLQqTpL0HzTUxk"
}
}
The above example provides integrity metadata to be enforced on the modules /a-1.mjs
and /d-1.mjs
, even if the latter is not defined
as an import in the map.
The child text content of a script
element representing an
import map must match the following import map authoring
requirements:
It must be valid JSON. JSON
The JSON must represent a JSON object, with at most the three keys "imports
", "scopes
", and "integrity
".
The values corresponding to the "imports
", "scopes
", and "integrity
" keys, if present,
must themselves be JSON objects.
The value corresponding to the "imports
" key, if present, must be
a valid module specifier map.
The value corresponding to the "scopes
" key, if present, must be a
JSON object, whose keys are valid URL strings and whose
values are valid module specifier
maps.
The value corresponding to the "integrity
" key, if present, must
be a JSON object, whose keys are valid URL strings and
whose values fit the requirements of the integrity attribute.
A valid module specifier map is a JSON object that meets the following requirements:
All of its keys must be nonempty.
All of its values must be strings.
Each value must be either a valid absolute URL or a
valid URL string that starts with "/
", "./
", or "../
".
If a given key ends with "/
", then the corresponding
value must also.
Formally, an import map is a struct with three items:
imports, a module specifier map;
scopes, an ordered map of URLs to module specifier maps; and
integrity, a module integrity map.
A module specifier map is an ordered map whose keys are strings and whose values are either URLs or nulls.
A module integrity map is an ordered map whose keys are URLs and whose values are strings that will be used as integrity metadata.
An empty import map is an import map with its imports and scopes both being empty maps.
A specifier resolution record is a struct. It has the following items:
Implementations can replace specifier as a URL with a boolean that indicates that the specifier is either bare or URL-like that is special.
To add module to resolved module set given an environment settings object settingsObject, a string serializedBaseURL, a string normalizedSpecifier, and a URL-or-null asURL:
Let global be settingsObject's global object.
If global does not implement Window
, then return.
Let record be a new specifier resolution record, with serialized base URL set to serializedBaseURL, specifier set to normalizedSpecifier, and specifier as a URL set to asURL.
Append record to global's resolved module set.
To parse an import map string, given a string input and a URL baseURL:
Let parsed be the result of parsing a JSON string to an Infra value given input.
If parsed is not an ordered map, then throw a
TypeError
indicating that the top-level value needs to be a JSON object.
Let sortedAndNormalizedImports be an empty ordered map.
If parsed["imports
"] exists, then:
If parsed["imports
"] is not an ordered
map, then throw a TypeError
indicating that the value for the "imports
" top-level key needs to be a JSON object.
Set sortedAndNormalizedImports to the result of sorting and
normalizing a module specifier map given parsed["imports
"] and baseURL.
Let sortedAndNormalizedScopes be an empty ordered map.
If parsed["scopes
"] exists, then:
If parsed["scopes
"] is not an ordered
map, then throw a TypeError
indicating that the value for the "scopes
" top-level key needs to be a JSON object.
Set sortedAndNormalizedScopes to the result of sorting and normalizing
scopes given parsed["scopes
"] and
baseURL.
Let normalizedIntegrity be an empty ordered map.
If parsed["integrity
"] exists, then:
If parsed["integrity
"] is not an ordered
map, then throw a TypeError
indicating that the value for the "integrity
" top-level key needs to be a JSON object.
Set normalizedIntegrity to the result of normalizing a module
integrity map given parsed["integrity
"] and
baseURL.
If parsed's keys contains any items besides "imports
", "scopes
", or "integrity
", then the user agent should
report a warning to the console indicating that an invalid top-level key was
present in the import map.
This can help detect typos. It is not an error, because that would prevent any future extensions from being added backward-compatibly.
Return an import map whose imports are sortedAndNormalizedImports, whose scopes are sortedAndNormalizedScopes, and whose integrity are normalizedIntegrity.
The import map that results from this parsing algorithm is highly normalized.
For example, given a base URL of https://example.com/base/page.html
, the
input
{
"imports": {
"/app/helper": "node_modules/helper/index.mjs",
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
will generate an import map with imports of
«[
"https://example.com/app/helper" → https://example.com/base/node_modules/helper/index.mjs
"lodash" → https://example.com/node_modules/lodash-es/lodash.js
]»
and (despite nothing being present in the input string) an empty ordered map for its scopes.
To merge module specifier maps, given a module specifier map newMap and a module specifier map oldMap:
Let mergedMap be a deep copy of oldMap.
For each specifier → url of newMap:
If specifier exists in oldMap, then:
The user agent may report a warning to the console indicating the ignored rule. They may choose to avoid reporting if the rule is identical to an existing one.
Continue.
Set mergedMap[specifier] to url.
Return mergedMap.
To merge existing and new import maps, given a global object global and an import map newImportMap:
Let newImportMapScopes be a deep copy of newImportMap's scopes.
We're mutating these copies and removing items from them when they are used to ignore scope-specific rules. This is true for newImportMapScopes, as well as to newImportMapImports below.
Let newImportMapImports be a deep copy of newImportMap's imports.
For each scopePrefix → scopeImports of newImportMapScopes:
For each record of global's resolved module set:
If scopePrefix is record's serialized base URL, or if scopePrefix ends with U+002F (/) and scopePrefix is a code unit prefix of record's serialized base URL, then:
For each specifierKey → resolutionResult of scopeImports:
If specifierKey is record's specifier, or if all of the following conditions are true:
specifierKey ends with U+002F (/);
specifierKey is a code unit prefix of record's specifier;
either record's specifier as a URL is null or is special,
then:
The user agent may report a warning to the console indicating the ignored rule. They may choose to avoid reporting if the rule is identical to an existing one.
Remove scopeImports[specifier].
Implementers are encouraged to implement a more efficient matching algorithm when working with the resolved module set. As guidance, the number of resolved/mapped modules in a large application can be on the order of thousands.
If scopePrefix exists in oldImportMap's scopes, then set oldImportMap's scopes[scopePrefix] to the result of merging module specifier maps, given scopeImports and oldImportMap's scopes[scopePrefix].
Otherwise, set oldImportMap's scopes[scopePrefix] to scopeImports.
For each url → integrity of newImportMap's integrity:
If url exists in oldImportMap's integrity, then:
The user agent may report a warning to the console indicating the ignored rule. They may choose to avoid reporting if the rule is identical to an existing one.
Continue.
Set oldImportMap's integrity[url] to integrity.
For each record of global's resolved module set:
For each specifier → url of newImportMapImports:
If specifier starts with record's specifier, then:
The user agent may report a warning to the console indicating the ignored rule. They may choose to avoid reporting if the rule is identical to an existing one.
Remove newImportMapImports[specifier].
Set oldImportMap's imports to the result of merge module specifier maps, given newImportMapImports and oldImportMap's imports.
The above algorithm merges a new import map into the given environment settings object's global object's import map. Let's examine a few examples:
When the new import map impacts an already resolved module, that rule gets dropped from the import map.
So, if the resolved module set already contains the "/app/helper
", the following new import map:
{
"imports": {
"/app/helper": "./helper/index.mjs",
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
Would be equivalent to the following one:
{
"imports": {
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
The same is true for rules that impact already resolved modules defined in specific scopes.
If we already resolved "/app/helper
" from "/app/main.mjs
" the following new import map:
{
"scopes": {
"/app/": {
"/app/helper": "./helper/index.mjs"
}
},
"imports": {
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
Would similarly be equivalent to:
{
"imports": {
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
We could also have cases where a single already-resolved module specifier has multiple rules for its resolution, depending on the referring script. In such cases, only the relevant rules would not be added to the map.
For example, if we already resolved "/app/helper
" from "/app/vendor/main.mjs
", the following new import map:
{
"scopes": {
"/app/": {
"/app/helper": "./helper/index.mjs"
},
"/app/vendor/": {
"/app/": "./vendor_helper/"
},
"/vendor/": {
"/app/helper": "./helper/vendor_index.mjs"
}
},
"imports": {
"lodash": "/node_modules/lodash-es/lodash.js"
"/app/": "./general_app_path/"
"/app/helper": "./other_path/helper/index.mjs"
}
}
Would be equivalent to:
{
"scopes": {
"/vendor/": {
"/app/helper": "./helper/vendor_index.mjs"
}
},
"imports": {
"lodash": "/node_modules/lodash-es/lodash.js"
}
}
This is achieved by the fact that the merge algorithm tracks already resolved modules and removes rules affecting them from new import maps before they are merged into the existing one.
When the new import map has conflicting rules to the existing import map, with no impacted already resolved modules, the existing import map rules persist.
For example, the following existing and new import maps:
{ "imports": { "/app/helper": "./helper/index.mjs", "lodash": "/node_modules/lodash-es/lodash.js" } }
{ "imports": { "/app/helper": "./main/helper/index.mjs" } }
Would be equivalent to the following single import map:
{
"imports": {
"/app/helper": "./helper/index.mjs",
"lodash": "/node_modules/lodash-es/lodash.js",
}
}
To sort and normalize a module specifier map, given an ordered map originalMap and a URL baseURL:
Let normalized be an empty ordered map.
For each specifierKey → value of originalMap:
Let normalizedSpecifierKey be the result of normalizing a specifier key given specifierKey and baseURL.
If normalizedSpecifierKey is null, then continue.
If value is not a string, then:
The user agent may report a warning to the console indicating that addresses need to be strings.
Set normalized[normalizedSpecifierKey] to null.
Continue.
Let addressURL be the result of resolving a URL-like module specifier given value and baseURL.
If addressURL is null, then:
The user agent may report a warning to the console indicating that the address was invalid.
Set normalized[normalizedSpecifierKey] to null.
Continue.
If specifierKey ends with U+002F (/), and the serialization of addressURL does not end with U+002F (/), then:
The user agent may report a warning to the console indicating that an invalid address was given for the specifier key specifierKey; since specifierKey ends with a slash, the address needs to as well.
Set normalized[normalizedSpecifierKey] to null.
Continue.
Set normalized[normalizedSpecifierKey] to addressURL.
Return the result of sorting in descending order normalized, with an entry a being less than an entry b if a's key is code unit less than b's key.
To sort and normalize scopes, given an ordered map originalMap and a URL baseURL:
Let normalized be an empty ordered map.
For each scopePrefix → potentialSpecifierMap of originalMap:
If potentialSpecifierMap is not an ordered map, then throw a
TypeError
indicating that the value of the scope with prefix
scopePrefix needs to be a JSON object.
Let scopePrefixURL be the result of URL parsing scopePrefix with baseURL.
If scopePrefixURL is failure, then:
The user agent may report a warning to the console that the scope prefix URL was not parseable.
Continue.
Let normalizedScopePrefix be the serialization of scopePrefixURL.
Set normalized[normalizedScopePrefix] to the result of sorting and normalizing a module specifier map given potentialSpecifierMap and baseURL.
Return the result of sorting in descending order normalized, with an entry a being less than an entry b if a's key is code unit less than b's key.
In the above two algorithms, sorting keys and scopes in descending order has the
effect of putting "foo/bar/
" before "foo/
". This in
turn gives "foo/bar/
" a higher priority than "foo/
"
during module specifier resolution.
To normalize a module integrity map, given an ordered map originalMap:
Let normalized be an empty ordered map.
For each key → value of originalMap:
Let resolvedURL be the result of resolving a URL-like module specifier given key and baseURL.
Unlike "imports
", keys of the integrity map are treated
as URLs, not module specifiers. However, we use the resolve a URL-like module specifier algorithm to prohibit "bare" relative
URLs like foo
, which could be mistaken for module specifiers.
If resolvedURL is null, then:
The user agent may report a warning to the console indicating that the key failed to resolve.
Continue.
If value is not a string, then:
The user agent may report a warning to the console indicating that integrity metadata values need to be strings.
Continue.
Set normalized[resolvedURL] to value.
Return normalized.
To normalize a specifier key, given a string specifierKey and a URL baseURL:
If specifierKey is the empty string, then:
The user agent may report a warning to the console indicating that specifier keys may not be the empty string.
Return null.
Let url be the result of resolving a URL-like module specifier, given specifierKey and baseURL.
If url is not null, then return the serialization of url.
Return specifierKey.
The JavaScript specification contains a number of implementation-defined abstract operations, that vary depending on the host environment. This section defines them for user agent hosts.
JavaScript contains an implementation-defined HostEnsureCanAddPrivateElement(O) abstract operation. User agents must use the following implementation: JAVASCRIPT
If O is a WindowProxy
object, or implements
Location
, then return Completion { [[Type]]: throw, [[Value]]: a new
TypeError
}.
Return NormalCompletion(unused).
JavaScript private fields can be applied to arbitrary objects. Since this can
dramatically complicate implementation for particularly-exotic host objects, the JavaScript
language specification provides this hook to allow hosts to reject private fields on objects
meeting a host-defined criteria. In the case of HTML, WindowProxy
and
Location
have complicated semantics — particularly around navigation and
security — that make implementation of private field semantics challenging, so our
implementation simply rejects those objects.
JavaScript contains an implementation-defined HostEnsureCanCompileStrings abstract operation, redefined by the Dynamic Code Brand Checks proposal. User agents must use the following implementation: JAVASCRIPT JSDYNAMICCODEBRANDCHECKS
Perform ? EnsureCSPDoesNotBlockStringCompilation(realm, parameterStrings, bodyString, codeString, compilationType, parameterArgs, bodyArg). CSP
The Dynamic Code Brand Checks proposal contains an implementation-defined HostGetCodeForEval(argument) abstract operation. User agents must use the following implementation: JSDYNAMICCODEBRANDCHECKS
If argument is a TrustedScript
object,
then return argument's data.
Otherwise, return no-code.
JavaScript contains an implementation-defined HostPromiseRejectionTracker(promise, operation) abstract operation. User agents must use the following implementation: JAVASCRIPT
Let script be the running script.
If script is a classic script and script's muted errors is true, then return.
Let settingsObject be the current settings object.
If script is not null, then set settingsObject to script's settings object.
Let global be settingsObject's global object.
If operation is "reject
", then:
Append promise to global's about-to-be-notified rejected promises list.
If operation is "handle
", then:
If global's about-to-be-notified rejected promises list contains promise, then remove promise from that list and return.
If global's outstanding rejected promises weak set does not contain promise, then return.
Remove promise from global's outstanding rejected promises weak set.
Queue a global task on the DOM manipulation task source given
global to fire an event named rejectionhandled
at global, using
PromiseRejectionEvent
, with the promise
attribute initialized to
promise, and the reason
attribute initialized to promise.[[PromiseResult]].
The Temporal proposal contains an implementation-defined HostSystemUTCEpochNanoseconds abstract operation. User agents must use the following implementation: JSTEMPORAL
Let settingsObject be global's relevant settings object.
Let time be settingsObject's current wall time.
Let ns be the number of nanoseconds from the Unix epoch to time, rounded to the nearest integer.
Return the result of clamping ns between nsMinInstant and nsMaxInstant.
The JavaScript specification defines Jobs to be scheduled and run later by the host, as well as
JobCallback Records which encapsulate JavaScript
functions that are called as part of jobs. The JavaScript specification contains a number of
implementation-defined abstract operations that lets the host define how jobs are
scheduled and how JobCallbacks are handled. HTML uses these abstract operations to track the incumbent settings
object in promises and FinalizationRegistry
callbacks by saving and
restoring the incumbent settings object and a JavaScript execution
context for the active script in JobCallbacks. This section defines them for
user agent hosts.
JavaScript contains an implementation-defined HostCallJobCallback(callback, V, argumentsList) abstract operation to let hosts restore state when invoking JavaScript callbacks from inside tasks. User agents must use the following implementation: JAVASCRIPT
Let incumbent settings be callback.[[HostDefined]].[[IncumbentSettings]].
Let script execution context be callback.[[HostDefined]].[[ActiveScriptContext]].
Prepare to run a callback with incumbent settings.
This affects the incumbent concept while the callback runs.
If script execution context is not null, then push script execution context onto the JavaScript execution context stack.
This affects the active script while the callback runs.
Let result be Call(callback.[[Callback]], V, argumentsList).
If script execution context is not null, then pop script execution context from the JavaScript execution context stack.
Clean up after running a callback with incumbent settings.
Return result.
JavaScript has the ability to register objects with FinalizationRegistry
objects,
in order to schedule a cleanup action if they are found to be garbage collected. The JavaScript
specification contains an implementation-defined HostEnqueueFinalizationRegistryCleanupJob(finalizationRegistry)
abstract operation to schedule the cleanup action.
The timing and occurrence of cleanup work is implementation-defined
in the JavaScript specification. User agents might differ in when and whether an object is garbage
collected, affecting both whether the return value of the WeakRef.prototype.deref()
method is undefined, and whether FinalizationRegistry
cleanup callbacks occur. There
are well-known cases in popular web browsers where objects are not accessible to JavaScript, but
they remain retained by the garbage collector indefinitely. HTML clears kept-alive
WeakRef
objects in the perform a microtask checkpoint algorithm. Authors
would be best off not depending on the timing details of garbage collection implementations.
Cleanup actions do not take place interspersed with synchronous JavaScript execution, but rather happen in queued tasks. User agents must use the following implementation: JAVASCRIPT
Let global be finalizationRegistry.[[Realm]]'s global object.
Queue a global task on the JavaScript engine task source given global to perform the following steps:
Let entry be finalizationRegistry.[[CleanupCallback]].[[Callback]].[[Realm]]'s environment settings object.
Check if we can run script with entry. If this returns "do not run", then return.
Prepare to run script with entry.
This affects the entry concept while the cleanup callback runs.
Let result be the result of performing CleanupFinalizationRegistry(finalizationRegistry).
Clean up after running script with entry.
If result is an abrupt completion, then report an exception given by result.[[Value]] for global.
JavaScript contains an implementation-defined HostEnqueueGenericJob(job, realm)
abstract operation to perform generic jobs in a particular realm (e.g., resolve promises resulting
from Atomics.waitAsync
). User agents must use the following implementation:
JAVASCRIPT
Let global be realm's global object.
Queue a global task on the JavaScript engine task source given global to perform job().
JavaScript contains an implementation-defined HostEnqueuePromiseJob(job, realm) abstract operation to schedule Promise-related operations. HTML schedules these operations in the microtask queue. User agents must use the following implementation: JAVASCRIPT
If realm is not null, then let job settings be the settings object for realm. Otherwise, let job settings be null.
If realm is not null, it is the realm of the author code that will
run. When job is returned by NewPromiseReactionJob, it is the realm of
the promise's handler function. When job is returned by
NewPromiseResolveThenableJob, it is the realm of the then
function.
If realm is null, either no author code will run or author code is guaranteed to
throw. For the former, the author may not have passed in code to run, such as in promise.then(null, null)
. For the latter, it is because a revoked Proxy was
passed. In both cases, all the steps below that would otherwise use job settings
get skipped.
NewPromiseResolveThenableJob and NewPromiseReactionJob both seem to provide non-null realms (the current Realm Record) in the case of a revoked proxy. The previous text could be updated to reflect that.
Queue a microtask to perform the following steps:
If job settings is not null, then check if we can run script with job settings. If this returns "do not run" then return.
If job settings is not null, then prepare to run script with job settings.
This affects the entry concept while the job runs.
Let result be job().
job is an abstract closure returned by
NewPromiseReactionJob or NewPromiseResolveThenableJob. The promise's
handler function when job is returned by NewPromiseReactionJob, and
the then
function when job is returned by
NewPromiseResolveThenableJob, are wrapped in JobCallback Records. HTML saves the incumbent settings object and
a JavaScript execution context for to the active script in
HostMakeJobCallback and restores them in HostCallJobCallback.
If job settings is not null, then clean up after running script with job settings.
If result is an abrupt completion, then report an exception given by result.[[Value]] for realm's global object.
There is a very gnarly case where HostEnqueuePromiseJob is called with a null realm (e.g., because Promise.prototype.then was called with null handlers) but also the job returns abruptly (because the promise capability's resolve or reject handler threw, possibly because this is a subclass of Promise that takes the supplied functions and wraps them in throwing functions before passing them on to the function passed to the Promise superclass constructor. Which global is to be used then, considering that the current realm could be different at each of those steps, by using a Promise constructor or Promise.prototype.then from another realm? See issue #10526.
JavaScript contains an implementation-defined HostEnqueueTimeoutJob(job, milliseconds) abstract operation to schedule an operation to be performed after a timeout. HTML schedules these operations using run steps after a timeout. User agents must use the following implementation: JAVASCRIPT
Let global be realm's global object.
Let timeoutStep be an algorithm step which queues a global task on the JavaScript engine task source given global to perform job().
Run steps after a timeout given global, "JavaScript
", milliseconds, and timeoutStep.
JavaScript contains an implementation-defined HostMakeJobCallback(callable) abstract operation to let hosts attach state to JavaScript callbacks that are called from inside tasks. User agents must use the following implementation: JAVASCRIPT
Let incumbent settings be the incumbent settings object.
Let active script be the active script.
Let script execution context be null.
If active script is not null, set script execution context to a new JavaScript execution context, with its Function field set to null, its Realm field set to active script's settings object's realm, and its ScriptOrModule set to active script's record.
As seen below, this is used in order to propagate the current active script forward to the time when the job callback is invoked.
A case where active script is non-null, and saving it in this way is useful, is the following:
Promise.resolve('import(`./example.mjs`)').then(eval);
Without this step (and the steps that use it in HostCallJobCallback), there
would be no active script when the import()
expression is evaluated,
since eval()
is a built-in function that does not originate from any particular
script.
With this step in place, the active script is propagated from the above code into the job,
allowing import()
to use the original script's base URL appropriately.
active script can be null if the user clicks on the following button:
<button onclick="Promise.resolve('import(`./example.mjs`)').then(eval)">Click me</button>
In this case, the JavaScript function for the event handler will be created by the get the current value of the event handler algorithm, which creates a function with null [[ScriptOrModule]] value. Thus, when the promise machinery calls HostMakeJobCallback, there will be no active script to pass along.
As a consequence, this means that when the import()
expression is evaluated,
there will still be no active script. Fortunately that is handled by our
implementation of HostLoadImportedModule by falling back to using the
current settings object's API base URL.
Return the JobCallback Record { [[Callback]]: callable, [[HostDefined]]: { [[IncumbentSettings]]: incumbent settings, [[ActiveScriptContext]]: script execution context } }.
The JavaScript specification defines a syntax for modules, as well as some host-agnostic parts
of their processing model. This specification defines the rest of their processing model: how the
module system is bootstrapped, via the script
element with type
attribute set to "module
", and how
modules are fetched, resolved, and executed. JAVASCRIPT
Although the JavaScript specification speaks in terms of "scripts" versus
"modules", in general this specification speaks in terms of classic
scripts versus module scripts, since both of them use
the script
element.
modulePromise = import(specifier)
Returns a promise for the module namespace object for the module script
identified by specifier. This allows dynamic importing of module scripts at runtime,
instead of statically using the import
statement form. The specifier will
be resolved relative to the active
script.
The returned promise will be rejected if an invalid specifier is given, or if a failure is encountered while fetching or evaluating the resulting module graph.
This syntax can be used inside both classic and module scripts. It thus provides a bridge into the module-script world, from the classic-script world.
url = import.meta.url
Returns the active module script's base URL.
This syntax can only be used inside module scripts.
url = import.meta.resolve(specifier)
Returns specifier, resolved
relative to the active script. That is, this returns the URL that would be imported
by using import(specifier)
.
Throws a TypeError
exception if an invalid specifier is given.
This syntax can only be used inside module scripts.
A module map is a map keyed by tuples consisting of a URL record and a string.
The URL record is the request URL at which
the module was fetched, and the string indicates the type of the module (e.g. "javascript-or-wasm
"). The module map's values are either a
module script, null (used to represent failed fetches), or a placeholder value "fetching
". Module maps are used to ensure
that imported module scripts are only fetched, parsed, and evaluated once per
Document
or worker.
Since module maps are keyed by (URL, module type), the
following code will create three separate entries in the module map, since it
results in three different (URL, module type) tuples (all with "javascript-or-wasm
" type):
import "https://example.com/module.mjs";
import "https://example.com/module.mjs#map-buster";
import "https://example.com/module.mjs?debug=true";
That is, URL queries and fragments can be varied to create distinct entries in the module map; they are not ignored. Thus, three separate fetches and three separate module evaluations will be performed.
In contrast, the following code would only create a single entry in the module map, since after applying the URL parser to these inputs, the resulting URL records are equal:
import "https://example.com/module2.mjs";
import "https:example.com/module2.mjs";
import "https://///example.com\\module2.mjs";
import "https://example.com/foo/../module2.mjs";
So in this second example, only one fetch and one module evaluation will occur.
Note that this behavior is the same as how shared workers are keyed by their parsed constructor url.
Since module type is also part of the module map key, the following code will
create two separate entries in the module map (the type is "javascript-or-wasm
" for the first, and "css
" for the
second):
<script type=module>
import "https://example.com/module";
</script>
<script type=module>
import "https://example.com/module" with { type: "css" };
</script>
This can result in two separate fetches and two separate module evaluations being performed.
In practice, due to the as-yet-unspecified memory cache (see issue #6110) the resource may only be fetched once in WebKit and Blink-based browsers. Additionally, as long as all module types are mutually exclusive, the module type check in fetch a single module script will fail for at least one of the imports, so at most one module evaluation will occur.
The purpose of including the type in the module map key is so that an import with the wrong type attribute does not prevent a different import of the same specifier but with the correct type from succeeding.
JavaScript module scripts are the default import type when importing from another JavaScript
module; that is, when an import
statement lacks a type
import attribute the imported module script's type will be JavaScript.
Attempting to import a JavaScript resource using an import
statement with
a type
import attribute will fail:
<script type="module">
// All of the following will fail, assuming that the imported .mjs files are served with a
// JavaScript MIME type. JavaScript module scripts are the default and cannot be imported with
// any import type attribute.
import foo from "./foo.mjs" with { type: "javascript" };
import foo2 from "./foo2.mjs" with { type: "js" };
import foo3 from "./foo3.mjs" with { type: "" };
await import("./foo4.mjs", { with: { type: null } });
await import("./foo5.mjs", { with: { type: undefined } });
</script>
JavaScript contains an implementation-defined HostGetImportMetaProperties abstract operation. User agents must use the following implementation: JAVASCRIPT
Let moduleScript be moduleRecord.[[HostDefined]].
Assert: moduleScript's base URL is not null, as moduleScript is a JavaScript module script.
Let urlString be moduleScript's base URL, serialized.
Let steps be the following steps, given the argument specifier:
Set specifier to ? ToString(specifier).
Let url be the result of resolving a module specifier given moduleScript and specifier.
Return the serialization of url.
Let resolveFunction be ! CreateBuiltinFunction(steps,
1, "resolve
", « »).
Return « Record { [[Key]]: "url
", [[Value]]: urlString },
Record { [[Key]]: "resolve
",
[[Value]]: resolveFunction } ».
The Import Attributes proposal contains an implementation-defined HostGetSupportedImportAttributes abstract operation. User agents must use the following implementation: JSIMPORTATTRIBUTES
Return « "type
" ».
JavaScript contains an implementation-defined HostLoadImportedModule abstract operation. User agents must use the following implementation: JAVASCRIPT
Let settingsObject be the current settings object.
If settingsObject's global
object implements WorkletGlobalScope
or ServiceWorkerGlobalScope
and loadState is undefined, then:
loadState is undefined when the current fetching process has been
initiated by a dynamic import()
call, either directly or when loading the
transitive dependencies of the dynamically imported module.
Let completion be Completion Record { [[Type]]: throw,
[[Value]]: a new TypeError
, [[Target]]: empty }.
Perform FinishLoadingImportedModule(referrer, moduleRequest, payload, completion).
Return.
Let referencingScript be null.
Let originalFetchOptions be the default script fetch options.
Let fetchReferrer be "client
".
If referrer is a Script Record or a Cyclic Module Record, then:
Set referencingScript to referrer.[[HostDefined]].
Set settingsObject to referencingScript's settings object.
Set fetchReferrer to referencingScript's base URL.
Set originalFetchOptions to referencingScript's fetch options.
referrer is usually a Script Record or a Cyclic Module Record, but it will not be so for event handlers per the get the current value of the event handler algorithm. For example, given:
<button onclick="import('./foo.mjs')">Click me</button>
If a click
event occurs, then at the time the
import()
expression runs, GetActiveScriptOrModule will return null,
and this operation will receive the current realm as a fallback
referrer.
If referrer is a Cyclic Module Record and moduleRequest is equal to the first element of referrer.[[RequestedModules]], then:
For each ModuleRequest record requested of referrer.[[RequestedModules]]:
If moduleRequest.[[Attributes]] contains a Record entry
such that entry.[[Key]] is not "type
", then:
Let completion be Completion Record { [[Type]]: throw,
[[Value]]: a new SyntaxError
exception, [[Target]]: empty }.
Perform FinishLoadingImportedModule(referrer, moduleRequest, payload, completion).
Return.
The JavaScript specification re-performs this validation but it is duplicated here to avoid unnecessarily loading any of the dependencies on validation failure.
Resolve a module specifier given referencingScript and moduleRequest.[[Specifier]], catching any exceptions. If they throw an exception, let resolutionError be the thrown exception.
If the previous step threw an exception, then:
Let completion be Completion Record { [[Type]]: throw, [[Value]]: resolutionError, [[Target]]: empty }.
Perform FinishLoadingImportedModule(referrer, moduleRequest, payload, completion).
Return.
Let moduleType be the result of running the module type from module request steps given moduleRequest.
If the result of running the module type allowed steps given moduleType and settingsObject is false, then:
Let completion be Completion Record { [[Type]]: throw,
[[Value]]: a new TypeError
exception, [[Target]]: empty }.
Perform FinishLoadingImportedModule(referrer, moduleRequest, payload, completion).
Return.
This step is essentially validating all of the requested module specifiers and type attributes when the first call to HostLoadImportedModule for a static module dependency list is made, to avoid further loading operations in the case any one of the dependencies has a static error. We treat a module with unresolvable module specifiers or unsupported type attributes the same as one that cannot be parsed; in both cases, a syntactic issue makes it impossible to ever contemplate linking the module later.
Let url be the result of resolving a module specifier given referencingScript and moduleRequest.[[Specifier]], catching any exceptions. If they throw an exception, let resolutionError be the thrown exception.
If the previous step threw an exception, then:
Let completion be Completion Record { [[Type]]: throw, [[Value]]: resolutionError, [[Target]]: empty }.
Perform FinishLoadingImportedModule(referrer, moduleRequest, payload, completion).
Return.
Let fetchOptions be the result of getting the descendant script fetch options given originalFetchOptions, url, and settingsObject.
Let destination be "script"
.
Let fetchClient be settingsObject.
If loadState is not undefined, then:
Set destination to loadState.[[Destination]].
Set fetchClient to loadState.[[FetchClient]].
Fetch a single imported module script given url, fetchClient, destination, fetchOptions, settingsObject, fetchReferrer, moduleRequest, and onSingleFetchComplete as defined below. If loadState is not undefined and loadState.[[PerformFetch]] is not null, pass loadState.[[PerformFetch]] along as well.
onSingleFetchComplete given moduleScript is the following algorithm:
Let completion be null.
If moduleScript is null, then set completion to Completion
Record { [[Type]]: throw, [[Value]]: a new TypeError
, [[Target]]: empty
}.
Otherwise, if moduleScript's parse error is not null, then:
Let parseError be moduleScript's parse error.
Set completion to Completion Record { [[Type]]: throw, [[Value]]: parseError, [[Target]]: empty }.
If loadState is not undefined and loadState.[[ParseError]] is null, set loadState.[[ParseError]] to parseError.
Otherwise, set completion to Completion Record { [[Type]]: normal, [[Value]]: moduleScript's record, [[Target]]: empty }.
Perform FinishLoadingImportedModule(referrer, moduleRequest, payload, completion).
To coordinate events, user interaction, scripts, rendering, networking, and so forth, user agents must use event loops as described in this section. Each agent has an associated event loop, which is unique to that agent.
The event loop of a similar-origin window agent is known as a window event loop. The event loop of a dedicated worker agent, shared worker agent, or service worker agent is known as a worker event loop. And the event loop of a worklet agent is known as a worklet event loop.
Event loops do not necessarily correspond to implementation threads. For example, multiple window event loops could be cooperatively scheduled in a single thread.
However, for the various worker agents that are allocated with [[CanBlock]] set to true, the JavaScript specification does place requirements on them regarding forward progress, which effectively amount to requiring dedicated per-agent threads in those cases.
An event loop has one or more task queues. A task queue is a set of tasks.
Task queues are sets, not queues, because the event loop processing model grabs the first runnable task from the chosen queue, instead of dequeuing the first task.
The microtask queue is not a task queue.
Tasks encapsulate algorithms that are responsible for such work as:
Dispatching an Event
object at a particular
EventTarget
object is often done by a dedicated task.
Not all events are dispatched using the task queue; many are dispatched during other tasks.
The HTML parser tokenizing one or more bytes, and then processing any resulting tokens, is typically a task.
Calling a callback is often done by a dedicated task.
When an algorithm fetches a resource, if the fetching occurs in a non-blocking fashion then the processing of the resource once some or all of the resource is available is performed by a task.
Some elements have tasks that trigger in response to DOM manipulation, e.g. when that element is inserted into the document.
Formally, a task is a struct which has:
Document
associated with the task, or null for tasks that are not in a
window event loop.A task is runnable if its document is either null or fully active.
Per its source field, each task is defined as coming from a specific task source. For each event loop, every task source must be associated with a specific task queue.
Essentially, task sources are used within standards to separate logically-different types of tasks, which a user agent might wish to distinguish between. Task queues are used by user agents to coalesce task sources within a given event loop.
For example, a user agent could have one task queue for mouse and key events (to which the user interaction task source is associated), and another to which all other task sources are associated. Then, using the freedom granted in the initial step of the event loop processing model, it could give keyboard and mouse events preference over other tasks three-quarters of the time, keeping the interface responsive but not starving other task queues. Note that in this setup, the processing model still enforces that the user agent would never process events from any one task source out of order.
Each event loop has a currently running task, which is either a task or null. Initially, this is null. It is used to handle reentrancy.
Each event loop has a microtask queue, which is a queue of microtasks, initially empty. A microtask is a colloquial way of referring to a task that was created via the queue a microtask algorithm.
Each event loop has a performing a microtask checkpoint boolean, which is initially false. It is used to prevent reentrant invocation of the perform a microtask checkpoint algorithm.
Each window event loop has a DOMHighResTimeStamp
last render opportunity time, initially set to zero.
Each window event loop has a DOMHighResTimeStamp
last idle period start time, initially set to zero.
To get the same-loop windows for a window event loop loop,
return all Window
objects whose relevant agent's
event loop is loop.
To queue a task on a task source source, which performs a series of steps steps, optionally given an event loop event loop and a document document:
If event loop was not given, set event loop to the implied event loop.
If document was not given, set document to the implied document.
Let task be a new task.
Set task's steps to steps.
Set task's source to source.
Set task's document to the document.
Set task's script evaluation environment settings object set to an empty set.
Let queue be the task queue to which source is associated on event loop.
Append task to queue.
Failing to pass an event loop and document to queue a task means relying on the ambiguous and poorly-specified implied event loop and implied document concepts. Specification authors should either always pass these values, or use the wrapper algorithms queue a global task or queue an element task instead. Using the wrapper algorithms is recommended.
To queue a global task on a task source source, with a global object global and a series of steps steps:
Let event loop be global's relevant agent's event loop.
Let document be global's associated Document
, if global is
a Window
object; otherwise null.
Queue a task given source, event loop, document, and steps.
To queue an element task on a task source source, with an element element and a series of steps steps:
Let global be element's relevant global object.
Queue a global task given source, global, and steps.
To queue a microtask which performs a series of steps steps, optionally given a document document:
Assert: there is a surrounding agent. I.e., this algorithm is not called while in parallel.
Let eventLoop be the surrounding agent's event loop.
If document was not given, set document to the implied document.
Let microtask be a new task.
Set microtask's steps to steps.
Set microtask's source to the microtask task source.
Set microtask's document to document.
Set microtask's script evaluation environment settings object set to an empty set.
Enqueue microtask on eventLoop's microtask queue.
It is possible for a microtask to be moved to a regular task queue, if, during its initial execution, it spins the event loop. This is the only case in which the source, document, and script evaluation environment settings object set of the microtask are consulted; they are ignored by the perform a microtask checkpoint algorithm.
The implied event loop when queuing a task is the one that can deduced from the context of the calling algorithm. This is generally unambiguous, as most specification algorithms only ever involve a single agent (and thus a single event loop). The exception is algorithms involving or specifying cross-agent communication (e.g., between a window and a worker); for those cases, the implied event loop concept must not be relied upon and specifications must explicitly provide an event loop when queuing a task.
The implied document when queuing a task on an event loop event loop is determined as follows:
If event loop is not a window event loop, then return null.
If the task is being queued in the context of an element, then return the element's node document.
If the task is being queued in the context of a browsing context, then return the browsing context's active document.
If the task is being queued by or for a script, then
return the script's settings object's global object's associated Document
.
Assert: this step is never reached, because one of the previous conditions is true. Really?
Both implied event loop and implied document are vaguely-defined and have a lot of action-at-a-distance. The hope is to remove these, especially implied document. See issue #4980.
An event loop must continually run through the following steps for as long as it exists:
Let oldestTask and taskStartTime be null.
If the event loop has a task queue with at least one runnable task, then:
Let taskQueue be one such task queue, chosen in an implementation-defined manner.
Remember that the microtask queue is not a task queue, so it will not be chosen in this step. However, a task queue to which the microtask task source is associated might be chosen in this step. In that case, the task chosen in the next step was originally a microtask, but it got moved as part of spinning the event loop.
Set taskStartTime to the unsafe shared current time.
Set oldestTask to the first runnable task in taskQueue, and remove it from taskQueue.
If oldestTask's document is not null, then record task start time given taskStartTime and oldestTask's document.
Set the event loop's currently running task to oldestTask.
Perform oldestTask's steps.
Set the event loop's currently running task back to null.
Perform a microtask checkpoint.
Let taskEndTime be the unsafe shared current time. HRT
If oldestTask is not null, then:
Let top-level browsing contexts be an empty set.
For each environment settings object settings of oldestTask's script evaluation environment settings object set:
Let global be settings's global object.
If global is not a Window
object, then
continue.
If global's browsing context is null, then continue.
Let tlbc be global's browsing context's top-level browsing context.
If tlbc is not null, then append it to top-level browsing contexts.
Report long tasks, passing in taskStartTime, taskEndTime, top-level browsing contexts, and oldestTask.
If oldestTask's document is not null, then record task end time given taskEndTime and oldestTask's document.
If this is a window event loop that has no runnable task in this event loop's task queues, then:
Set this event loop's last idle period start time to the unsafe shared current time.
Let computeDeadline be the following steps:
Let deadline be this event loop's last idle period start time plus 50.
The cap of 50ms in the future is to ensure responsiveness to new user input within the threshold of human perception.
Let hasPendingRenders be false.
For each windowInSameLoop of the same-loop windows for this event loop:
If windowInSameLoop's map of animation frame callbacks is not empty, or if the user agent believes that the windowInSameLoop might have pending rendering updates, set hasPendingRenders to true.
Let timerCallbackEstimates be the result of getting the values of windowInSameLoop's map of active timers.
For each timeoutDeadline of timerCallbackEstimates, if timeoutDeadline is less than deadline, set deadline to timeoutDeadline.
If hasPendingRenders is true, then:
Let nextRenderDeadline be this event loop's last render opportunity time plus (1000 divided by the current refresh rate).
The refresh rate can be hardware- or implementation-specific. For a refresh rate of 60Hz, the nextRenderDeadline would be about 16.67ms after the last render opportunity time.
If nextRenderDeadline is less than deadline, then return nextRenderDeadline.
Return deadline.
For each win of the same-loop windows for this event loop, perform the start an idle period algorithm for win with the following step: return the result of calling computeDeadline, coarsened given win's relevant settings object's cross-origin isolated capability. REQUESTIDLECALLBACK
If this is a worker event loop, then:
If this event loop's agent's single realm's global object is a supported
DedicatedWorkerGlobalScope
and the user agent believes that it would benefit
from having its rendering updated at this time, then:
Let now be the current high resolution time given the
DedicatedWorkerGlobalScope
. HRT
Run the animation frame callbacks for that
DedicatedWorkerGlobalScope
, passing in now as the
timestamp.
Update the rendering of that dedicated worker to reflect the current state.
Similar to the notes for updating the rendering in a window event loop, a user agent can determine the rate of rendering in the dedicated worker.
If there are no tasks in the event
loop's task queues and the
WorkerGlobalScope
object's closing flag is true, then destroy the
event loop, aborting these steps, resuming the run a worker steps
described in the Web workers section below.
A window event loop eventLoop must also run the following in parallel, as long as it exists:
Wait until at least one navigable whose active document's relevant agent's event loop is eventLoop might have a rendering opportunity.
Set eventLoop's last render opportunity time to the unsafe shared current time.
For each navigable that has a rendering opportunity, queue a global task on the rendering task source given navigable's active window to update the rendering:
This might cause redundant calls to update the rendering. However, these calls would have no observable effect because there will be no rendering necessary, as per the Unnecessary rendering step. Implementations can introduce further optimizations such as only queuing this task when it is not already queued. However, note that the document associated with the task might become inactive before the task is processed.
Let frameTimestamp be eventLoop's last render opportunity time.
Let docs be all fully active Document
objects whose
relevant agent's event loop is
eventLoop, sorted arbitrarily except that the following conditions must be
met:
Any Document
B whose container document is A must be listed
after A in the list.
If there are two documents A and B that both have the same non-null container document C, then the order of A and B in the list must match the shadow-including tree order of their respective navigable containers in C's node tree.
In the steps below that iterate over docs, each Document
must be
processed in the order it is found in the list.
Filter non-renderable documents: Remove from docs any
Document
object doc for which any of the following are true:
doc is render-blocked;
doc's visibility state is "hidden
";
doc's rendering is suppressed for view transitions; or
doc's node navigable doesn't currently have a rendering opportunity.
We have to check for rendering opportunities here, in addition to checking that in the in parallel steps, as some documents that share the same event loop might not have a rendering opportunity at the same time.
Unnecessary rendering: Remove from docs any Document
object
doc for which all of the following are true:
the user agent believes that updating the rendering of doc's node navigable would have no visible effect; and
doc's map of animation frame callbacks is empty.
Remove from docs all Document
objects for which the user agent
believes that it's preferable to skip updating the rendering for other reasons.
The step labeled Filter non-renderable documents prevents the user agent from updating the rendering when it is unable to present new content to the user.
The step labeled Unnecessary rendering prevents the user agent from updating the rendering when there's no new content to draw.
This step enables the user agent to prevent the steps below from running for other reasons, for example, to ensure certain tasks are executed immediately after each other, with only microtask checkpoints interleaved (and without, e.g., animation frame callbacks interleaved). Concretely, a user agent might wish to coalesce timer callbacks together, with no intermediate rendering updates.
For each doc of docs, reveal doc.
For each doc of docs, flush autofocus candidates for doc if its node navigable is a top-level traversable.
For each doc of docs, run the resize steps for doc. CSSOMVIEW
For each doc of docs, run the scroll steps for doc. CSSOMVIEW
For each doc of docs, evaluate media queries and report changes for doc. CSSOMVIEW
For each doc of docs, update animations and send events for doc, passing in relative high resolution time given frameTimestamp and doc's relevant global object as the timestamp WEBANIMATIONS
For each doc of docs, run the fullscreen steps for doc. FULLSCREEN
For each doc of docs, if the user agent detects that the backing
storage associated with a CanvasRenderingContext2D
or an
OffscreenCanvasRenderingContext2D
, context, has been lost, then it
must run the context lost steps for each such context:
Let canvas be the value of context's canvas
attribute, if context is a
CanvasRenderingContext2D
, or the associated OffscreenCanvas
object for context otherwise.
Set context's context lost to true.
Reset the rendering context to its default state given context.
Let shouldRestore be the result of firing an event named contextlost
at canvas, with the cancelable
attribute initialized to true.
If shouldRestore is false, then abort these steps.
Attempt to restore context by creating a backing storage using context's attributes and associating them with context. If this fails, then abort these steps.
Set context's context lost to false.
Fire an event named contextrestored
at canvas.
For each doc of docs, run the animation frame callbacks for doc, passing in the relative high resolution time given frameTimestamp and doc's relevant global object as the timestamp.
Let unsafeStyleAndLayoutStartTime be the unsafe shared current time.
For each doc of docs:
Let resizeObserverDepth be 0.
While true:
Recalculate styles and update layout for doc.
Let hadInitialVisibleContentVisibilityDetermination be false.
For each element element with 'auto' used value of 'content-visibility':
Let checkForInitialDetermination be true if element's proximity to the viewport is not determined and it is not relevant to the user. Otherwise, let checkForInitialDetermination be false.
Determine proximity to the viewport for element.
If checkForInitialDetermination is true and element is now relevant to the user, then set hadInitialVisibleContentVisibilityDetermination to true.
If hadInitialVisibleContentVisibilityDetermination is true, then continue.
The intent of this step is for the initial viewport proximity determination, which takes effect immediately, to be reflected in the style and layout calculation which is carried out in a previous step of this loop. Proximity determinations other than the initial one take effect at the next rendering opportunity. CSSCONTAIN
Gather active resize observations at depth resizeObserverDepth for doc.
If doc has active resize observations:
Set resizeObserverDepth to the result of broadcasting active resize observations given doc.
If doc has skipped resize observations, then deliver resize loop error given doc.
For each doc of docs, if the focused area of doc is not a focusable area, then run the focusing steps for doc's viewport, and set doc's relevant global object's navigation API's focus changed during ongoing navigation to false.
For example, this might happen because an element has the hidden
attribute added, causing it to stop being
rendered. It might also happen to an input
element when the element gets
disabled.
This will usually fire blur
events, and possibly change
events.
In addition to this asynchronous fixup, if the focused area of the
document is removed, there is a synchronous
fixup. That one will not fire blur
or change
events.
For each doc of docs, perform pending transition operations for doc. CSSVIEWTRANSITIONS
For each doc of docs, run the update intersection observations steps for doc, passing in the relative high resolution time given now and doc's relevant global object as the timestamp. INTERSECTIONOBSERVER
For each doc of docs, record rendering time for doc given unsafeStyleAndLayoutStartTime.
For each doc of docs, mark paint timing for doc.
For each doc of docs, update the rendering or user interface of doc and its node navigable to reflect the current state.
For each doc of docs, process top layer removals given doc.
A navigable has a rendering opportunity if the user agent is currently able to present the contents of the navigable to the user, accounting for hardware refresh rate constraints and user agent throttling for performance reasons, but considering content presentable even if it's outside the viewport.
A navigable's rendering opportunities
are determined based on hardware constraints such as display refresh rates and other factors such
as page performance or whether its active document's
visibility state is "visible
". Rendering opportunities
typically occur at regular intervals.
This specification does not mandate any particular model for selecting rendering opportunities. But for example, if the browser is attempting to achieve a 60Hz refresh rate, then rendering opportunities occur at a maximum of every 60th of a second (about 16.7ms). If the browser finds that a navigable is not able to sustain this rate, it might drop to a more sustainable 30 rendering opportunities per second for that navigable, rather than occasionally dropping frames. Similarly, if a navigable is not visible, the user agent might decide to drop that page to a much slower 4 rendering opportunities per second, or even less.
When a user agent is to perform a microtask checkpoint:
If the event loop's performing a microtask checkpoint is true, then return.
Set the event loop's performing a microtask checkpoint to true.
While the event loop's microtask queue is not empty:
Let oldestMicrotask be the result of dequeuing from the event loop's microtask queue.
Set the event loop's currently running task to oldestMicrotask.
Run oldestMicrotask.
This might involve invoking scripted callbacks, which eventually calls the clean up after running script steps, which call this perform a microtask checkpoint algorithm again, which is why we use the performing a microtask checkpoint flag to avoid reentrancy.
Set the event loop's currently running task back to null.
For each environment settings object settingsObject whose responsible event loop is this event loop, notify about rejected promises given settingsObject's global object.
Cleanup Indexed Database transactions.
Perform ClearKeptObjects().
When WeakRef.prototype.deref()
returns an object, that object is
kept alive until the next invocation of ClearKeptObjects(), after which it is again
subject to garbage collection.
Set the event loop's performing a microtask checkpoint to false.
Record timing info for microtask checkpoint.
When an algorithm running in parallel is to await a stable state, the user agent must queue a microtask that runs the following steps, and must then stop executing (execution of the algorithm resumes when the microtask is run, as described in the following steps):
Run the algorithm's synchronous section.
Resumes execution of the algorithm in parallel, if appropriate, as described in the algorithm's steps.
Steps in synchronous sections are marked with ⌛.
Algorithm steps that say to spin the event loop until a condition goal is met are equivalent to substituting in the following algorithm steps:
Let task be the event loop's currently running task.
task could be a microtask.
Let task source be task's source.
Let old stack be a copy of the JavaScript execution context stack.
Empty the JavaScript execution context stack.
Perform a microtask checkpoint.
If task is a microtask this step will be a no-op due to performing a microtask checkpoint being true.
In parallel:
Wait until the condition goal is met.
Queue a task on task source to:
Replace the JavaScript execution context stack with old stack.
Perform any steps that appear after this spin the event loop instance in the original algorithm.
This resumes task.
Stop task, allowing whatever algorithm that invoked it to resume.
This causes the event loop's main set of steps or the perform a microtask checkpoint algorithm to continue.
Unlike other algorithms in this and other specifications, which behave similar to programming-language function calls, spin the event loop is more like a macro, which saves typing and indentation at the usage site by expanding into a series of steps and operations.
An algorithm whose steps are:
Do something.
Spin the event loop until awesomeness happens.
Do something else.
is a shorthand which, after "macro expansion", becomes
Do something.
Let old stack be a copy of the JavaScript execution context stack.
Empty the JavaScript execution context stack.
Perform a microtask checkpoint.
In parallel:
Wait until awesomeness happens.
Queue a task on the task source in which "do something" was done to:
Replace the JavaScript execution context stack with old stack.
Do something else.
Here is a more full example of the substitution, where the event loop is spun from inside a task that is queued from work in parallel. The version using spin the event loop:
In parallel:
Do parallel thing 1.
Queue a task on the DOM manipulation task source to:
Do task thing 1.
Spin the event loop until awesomeness happens.
Do task thing 2.
Do parallel thing 2.
The fully expanded version:
In parallel:
Do parallel thing 1.
Let old stack be null.
Queue a task on the DOM manipulation task source to:
Do task thing 1.
Set old stack to a copy of the JavaScript execution context stack.
Empty the JavaScript execution context stack.
Perform a microtask checkpoint.
Wait until awesomeness happens.
Queue a task on the DOM manipulation task source to:
Replace the JavaScript execution context stack with old stack.
Do task thing 2.
Do parallel thing 2.
Some of the algorithms in this specification, for historical reasons, require the user agent to pause while running a task until a condition goal is met. This means running the following steps:
Let global be the current global object.
Let timeBeforePause be the current high resolution time given global.
If necessary, update the rendering or user interface of any Document
or
navigable to reflect the current state.
Wait until the condition goal is met. While a user agent has a paused task, the corresponding event loop must not run further tasks, and any script in the currently running task must block. User agents should remain responsive to user input while paused, however, albeit in a reduced capacity since the event loop will not be doing anything.
Record pause duration given the duration from timeBeforePause to the current high resolution time given global.
Pausing is highly detrimental to the user experience, especially in scenarios where a single event loop is shared among multiple documents. User agents are encouraged to experiment with alternatives to pausing, such as spinning the event loop or even simply proceeding without any kind of suspended execution at all, insofar as it is possible to do so while preserving compatibility with existing content. This specification will happily change if a less-drastic alternative is discovered to be web-compatible.
In the interim, implementers should be aware that the variety of alternatives that user agents might experiment with can change subtle aspects of event loop behavior, including task and microtask timing. Implementations should continue experimenting even if doing so causes them to violate the exact semantics implied by the pause operation.
The following task sources are used by a number of mostly unrelated features in this and other specifications.
This task source is used for features that react to DOM manipulations, such as things that happen in a non-blocking fashion when an element is inserted into the document.
This task source is used for features that react to user interaction, for example keyboard or mouse input.
Events sent in response to user input (e.g. click
events) must be fired using tasks queued with the user
interaction task source. UIEVENTS
This task source is used for features that trigger in response to network activity.
This task source is used to queue tasks involved in navigation and history traversal.
This task source is used solely to update the rendering.
Writing specifications that correctly interact with the event loop can be tricky. This is compounded by how this specification uses concurrency-model-independent terminology, so we say things like "event loop" and "in parallel" instead of using more familiar model-specific terms like "main thread" or "on a background thread".
By default, specification text generally runs on the event loop. This falls out from the formal event loop processing model, in that you can eventually trace most algorithms back to a task queued there.
The algorithm steps for any JavaScript method will be invoked by author code
calling that method. And author code can only be run via queued tasks, usually originating
somewhere in the script
processing model.
From this starting point, the overriding guideline is that any work a specification needs to perform that would otherwise block the event loop must instead be performed in parallel with it. This includes (but is not limited to):
performing heavy computation;
displaying a user-facing prompt;
performing operations which could require involving outside systems (i.e. "going out of process").
The next complication is that, in algorithm sections that are in parallel, you must not create or manipulate objects associated to a specific realm, global, or environment settings object. (Stated in more familiar terms, you must not directly access main-thread artifacts from a background thread.) Doing so would create data races observable to JavaScript code, since after all, your algorithm steps are running in parallel to the JavaScript code.
You can, however, manipulate specification-level data structures and values from Infra, as those are realm-agnostic. They are never directly exposed to JavaScript without a specific conversion taking place (often via Web IDL). INFRA WEBIDL
To affect the world of observable JavaScript objects, then, you must queue a global task to perform any such manipulations. This ensures your steps are properly interleaved with respect to other things happening on the event loop. Furthermore, you must choose a task source when queuing a global task; this governs the relative order of your steps versus others. If you are unsure which task source to use, pick one of the generic task sources that sounds most applicable. Finally, you must indicate which global object your queued task is associated with; this ensures that if that global object is inactive, the task does not run.
The base primitive, on which queue a global task builds, is the queue a task algorithm. In general, queue a global task is better because it automatically picks the right event loop and, where appropriate, document. Older specifications often use queue a task combined with the implied event loop and implied document concepts, but this is discouraged.
Putting this all together, we can provide a template for a typical algorithm that needs to do work asynchronously:
Do any synchronous setup work, while still on the event loop. This may include converting realm-specific JavaScript values into realm-agnostic specification-level values.
Perform a set of potentially-expensive steps in parallel, operating entirely on realm-agnostic values, and producing a realm-agnostic result.
Queue a global task, on a specified task source and given an appropriate global object, to convert the realm-agnostic result back into observable effects on the observable world of JavaScript objects on the event loop.
The following is an algorithm that "encrypts" a passed-in list of scalar value strings input, after parsing them as URLs:
Let urls be an empty list.
For each string of input:
Let parsed be the result of encoding-parsing a URL given string, relative to the current settings object.
If parsed is failure, then return a promise rejected with a
"SyntaxError
" DOMException
.
Let serialized be the result of applying the URL serializer to parsed.
Append serialized to urls.
Let realm be the current realm.
Let p be a new promise.
Run the following steps in parallel:
Let encryptedURLs be an empty list.
For each url of urls:
Wait 100 milliseconds, so that people think we're doing heavy-duty encryption.
Let encrypted be a new string derived from url, whose nth code unit is equal to url's nth code unit plus 13.
Append encrypted to encryptedURLs.
Queue a global task on the networking task source, given realm's global object, to perform the following steps:
Let array be the result of converting encryptedURLs to a JavaScript array, in realm.
Resolve p with array.
Return p.
Here are several things to notice about this algorithm:
It does its URL parsing up front, on the event loop, before going to the in parallel steps. This is necessary, since parsing depends on the current settings object, which would no longer be current after going in parallel.
Alternately, it could have saved a reference to the current settings object's API base URL and used it during the in parallel steps; that would have been equivalent. However, we recommend instead doing as much work as possible up front, as this example does. Attempting to save the correct values can be error prone; for example, if we'd saved just the current settings object, instead of its API base URL, there would have been a potential race.
It implicitly passes a list of strings from the initial steps to the in parallel steps. This is OK, as both lists and strings are realm-agnostic.
It performs "expensive computation" (waiting for 100 milliseconds per input URL) during the in parallel steps, thus not blocking the main event loop.
Promises, as observable JavaScript objects, are never created and manipulated during the in parallel steps. p is created before entering those steps, and then is manipulated during a task that is queued specifically for that purpose.
The creation of a JavaScript array object also happens during the queued task, and is careful to specify which realm it creates the array in since that is no longer obvious from context.
(On these last two points, see also whatwg/webidl issue #135 and whatwg/webidl issue #371, where we are still mulling over the subtleties of the above promise-resolution pattern.)
Another thing to note is that, in the event this algorithm was called from a Web IDL-specified
operation taking a sequence
<USVString
>, there was an automatic conversion from
realm-specific JavaScript objects provided by the author as input, into the
realm-agnostic sequence
<USVString
>
Web IDL type, which we then treat as a list of scalar value strings. So depending on how your specification is structured, there
may be other implicit steps happening on the main event loop that play a part in
this whole process of getting you ready to go in parallel.
Many objects can have event handlers specified. These act as non-capture event listeners for the object on which they are specified. DOM
An event handler is a struct with two items:
a value, which is
either null, or a callback object, or an
internal raw uncompiled handler. The EventHandler
callback
function type describes how this is exposed to scripts. Initially, an event handler's value
must be set to null.
a listener, which is either null or an event listener responsible for running the event handler processing algorithm. Initially, an event handler's listener must be set to null.
Event handlers are exposed in two ways.
The first way, common to all event handlers, is as an event handler IDL attribute.
The second way is as an event handler content
attribute. Event handlers on HTML elements and some of the event handlers on
Window
objects are exposed in this way.
For both of these two ways, the event handler is exposed
through a name, which is a string that always starts with
"on
" and is followed by the name of the event for which the handler is
intended.
Most of the time, the object that exposes an event handler
is the same as the object on which the corresponding event listener is added.
However, the body
and frameset
elements expose several event
handlers that act upon the element's Window
object, if one exists. In either
case, we call the object an event handler acts upon the target of that event
handler.
To determine the target of an event
handler, given an EventTarget
object eventTarget on which the event handler is exposed, and an event handler name
name, the following steps are taken:
If eventTarget is not a body
element or a frameset
element, then return eventTarget.
If name is not the name of an attribute member of the
WindowEventHandlers
interface mixin and the Window
-reflecting
body element event handler set does not contain
name, then return eventTarget.
If eventTarget's node document is not an active document, then return null.
This could happen if this object is a body
element without
a corresponding Window
object, for example.
This check does not necessarily prevent body
and
frameset
elements that are not the body element of their node
document from reaching the next step. In particular, a body
element created
in an active document (perhaps with document.createElement()
) but not
connected will also have its corresponding Window
object as the target of several event handlers exposed
through it.
Return eventTarget's node document's relevant global object.
Each EventTarget
object that has one or more event handlers specified
has an associated event handler map, which is a map of strings representing names of event handlers to event handlers.
When an EventTarget
object that has one or more event handlers
specified is created, its event handler map must be initialized such that it contains
an entry for each event
handler that has that object as target, with
items in those event handlers set to their initial
values.
The order of the entries of event handler map could be arbitrary. It is not observable through any algorithms that operate on the map.
Entries are not created in the event handler map of an object for event handlers that are merely exposed on that object, but have some other object as their targets.
An event handler IDL attribute is an IDL attribute for a specific event handler. The name of the IDL attribute is the same as the name of the event handler.
The getter of an event handler IDL attribute with name name, when called, must run these steps:
Let eventTarget be the result of determining the target of an event handler given this object and name.
If eventTarget is null, then return null.
Return the result of getting the current value of the event handler given eventTarget and name.
The setter of an event handler IDL attribute with name name, when called, must run these steps:
Let eventTarget be the result of determining the target of an event handler given this object and name.
If eventTarget is null, then return.
If the given value is null, then deactivate an event handler given eventTarget and name.
Otherwise:
Let handlerMap be eventTarget's event handler map.
Let eventHandler be handlerMap[name].
Set eventHandler's value to the given value.
Activate an event handler given eventTarget and name.
Certain event handler IDL attributes have additional requirements, in
particular the onmessage
attribute of
MessagePort
objects.
An event handler content attribute is a content attribute for a specific event handler. The name of the content attribute is the same as the name of the event handler.
Event handler content attributes, when specified, must contain valid JavaScript code which, when parsed, would match the FunctionBody production after automatic semicolon insertion.
The following attribute change steps are used to synchronize between event handler content attributes and event handlers: DOM
If namespace is not null, or localName is not the name of an event handler content attribute on element, then return.
Let eventTarget be the result of determining the target of an event handler given element and localName.
If eventTarget is null, then return.
If value is null, then deactivate an event handler given eventTarget and localName.
Otherwise:
If the Should element's inline behavior be blocked by Content Security
Policy? algorithm returns "Blocked
" when executed upon
element, "script attribute
", and value, then
return. CSP
Let handlerMap be eventTarget's event handler map.
Let eventHandler be handlerMap[localName].
Let location be the script location that triggered the execution of these steps.
Set eventHandler's value to the internal raw uncompiled handler value/location.
Activate an event handler given eventTarget and localName.
Per the DOM Standard, these steps are run even if oldValue and value are identical (setting an attribute to its current value), but not if oldValue and value are both null (removing an attribute that doesn't currently exist). DOM
To deactivate an event handler given an EventTarget
object
eventTarget and a string name that is the name of an event handler, run these steps:
Let handlerMap be eventTarget's event handler map.
Let eventHandler be handlerMap[name].
Set eventHandler's value to null.
Let listener be eventHandler's listener.
If listener is not null, then remove an event listener with eventTarget and listener.
Set eventHandler's listener to null.
To erase all event listeners and handlers given an EventTarget
object
eventTarget, run these steps:
If eventTarget has an associated event handler map, then for each name → eventHandler of eventTarget's associated event handler map, deactivate an event handler given eventTarget and name.
Remove all event listeners given eventTarget.
This algorithm is used to define document.open()
.
To activate an event handler given an EventTarget
object
eventTarget and a string name that is the name of an event handler, run these steps:
Let handlerMap be eventTarget's event handler map.
Let eventHandler be handlerMap[name].
If eventHandler's listener is not null, then return.
Let callback be the result of creating a Web IDL EventListener
instance representing a reference to a function
of one argument that executes the steps of the event handler processing algorithm,
given eventTarget, name, and its argument.
The EventListener
's callback context can
be arbitrary; it does not impact the steps of the event handler processing
algorithm. DOM
The callback is emphatically not the event handler itself. Every event handler ends up registering the same callback, the algorithm defined below, which takes care of invoking the right code, and processing the code's return value.
Let listener be a new event listener whose type is the event handler event type corresponding to eventHandler and callback is callback.
To be clear, an event listener is different from an EventListener
.
Add an event listener with eventTarget and listener.
Set eventHandler's listener to listener.
The event listener registration happens only if the event handler's value is being set to non-null, and the event handler is not already activated. Since listeners are called in the order they were registered, assuming no deactivation occurred, the order of event listeners for a particular event type will always be:
the event listeners registered with addEventListener()
before the first time the
event handler's value was set to non-null
then the callback to which it is currently set, if any
and finally the event listeners registered with addEventListener()
after the first
time the event handler's value was set to non-null.
This example demonstrates the order in which event listeners are invoked. If the button in this example is clicked by the user, the page will show four alerts, with the text "ONE", "TWO", "THREE", and "FOUR" respectively.
<button id="test">Start Demo</button>
<script>
var button = document.getElementById('test');
button.addEventListener('click', function () { alert('ONE') }, false);
button.setAttribute('onclick', "alert('NOT CALLED')"); // event handler listener is registered here
button.addEventListener('click', function () { alert('THREE') }, false);
button.onclick = function () { alert('TWO'); };
button.addEventListener('click', function () { alert('FOUR') }, false);
</script>
However, in the following example, the event handler is deactivated after its initial activation (and its event listener is removed), before being reactivated at a later time. The page will show five alerts with "ONE", "TWO", "THREE", "FOUR", and "FIVE" respectively, in order.
<button id="test">Start Demo</button>
<script>
var button = document.getElementById('test');
button.addEventListener('click', function () { alert('ONE') }, false);
button.setAttribute('onclick', "alert('NOT CALLED')"); // event handler is activated here
button.addEventListener('click', function () { alert('TWO') }, false);
button.onclick = null; // but deactivated here
button.addEventListener('click', function () { alert('THREE') }, false);
button.onclick = function () { alert('FOUR'); }; // and re-activated here
button.addEventListener('click', function () { alert('FIVE') }, false);
</script>
The interfaces implemented by the event object do not influence whether an event handler is triggered or not.
The event handler processing algorithm for an EventTarget
object
eventTarget, a string name representing the name of an event handler, and an
Event
object event is as follows:
Let callback be the result of getting the current value of the event handler given eventTarget and name.
If callback is null, then return.
Let special error event handling be true if event is an
ErrorEvent
object, event's type
is
"error
", and event's currentTarget
implements the
WindowOrWorkerGlobalScope
mixin. Otherwise, let special error event
handling be false.
Process the Event
object event as follows:
Let return value be the result of invoking callback with «
event's message
, event's
filename
, event's lineno
, event's colno
, event's error
», "rethrow
", and with callback this value set to event's currentTarget
.
Let return value be the result of invoking callback with «
event », "rethrow
", and with callback this value set to event's currentTarget
.
If an exception gets thrown by the callback, it will be rethrown, ending these steps. The exception will propagate to the DOM event dispatch logic, which will then report it.
Process return value as follows:
BeforeUnloadEvent
object and event's type
is "beforeunload
"In this case, the event handler
IDL attribute's type will be OnBeforeUnloadEventHandler
, so return
value will have been coerced into either null or a DOMString
.
If return value is not null, then:
Set event's canceled flag.
If event's returnValue
attribute's value is the empty
string, then set event's returnValue
attribute's value to
return value.
If return value is true, then set event's canceled flag.
If return value is false, then set event's canceled flag.
If we've gotten to this "Otherwise" clause because event's type
is "beforeunload
" but event is not a
BeforeUnloadEvent
object, then return value will never be false, since
in such cases return value will have been coerced into either null or a DOMString
.
The EventHandler
callback function type represents a callback used for event
handlers. It is represented in Web IDL as follows:
[LegacyTreatNonObjectAsNull]
callback EventHandlerNonNull = any (Event event);
typedef EventHandlerNonNull? EventHandler;
In JavaScript, any Function
object implements
this interface.
For example, the following document fragment:
<body onload="alert(this)" onclick="alert(this)">
...leads to an alert saying "[object Window]
" when the document is
loaded, and an alert saying "[object HTMLBodyElement]
" whenever the
user clicks something in the page.
The return value of the function affects whether the event is canceled or not: as described above, if the return value is false, the event is canceled.
There are two exceptions in the platform, for historical reasons:
The onerror
handlers on global objects, where
returning true cancels the event.
The onbeforeunload
handler, where
returning any non-null and non-undefined value will cancel the event.
For historical reasons, the onerror
handler has different
arguments:
[LegacyTreatNonObjectAsNull]
callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long colno, optional any error);
typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
window.onerror = (message, source, lineno, colno, error) => { … };
Similarly, the onbeforeunload
handler has a
different return value: it will be cast to a string.
[LegacyTreatNonObjectAsNull]
callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event);
typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler;
An internal raw uncompiled handler is a tuple with the following information:
An uncompiled script body
A location where the script body originated, in case an error needs to be reported
When the user agent is to get the
current value of the event handler given an EventTarget
object
eventTarget and a string name that is the name of an event handler, it must run these
steps:
Let handlerMap be eventTarget's event handler map.
Let eventHandler be handlerMap[name].
If eventHandler's value is an internal raw uncompiled handler, then:
If eventTarget is an element, then let element be
eventTarget, and document be element's node
document. Otherwise, eventTarget is a Window
object, let
element be null, and document be eventTarget's associated Document
.
If scripting is disabled for document, then return null.
Let body be the uncompiled script body in eventHandler's value.
Let location be the location where the script body originated, as given by eventHandler's value.
If element is not null and element has a form owner, let form owner be that form owner. Otherwise, let form owner be null.
Let settings object be the relevant settings object of document.
If body is not parsable as FunctionBody or if parsing detects an early error, then follow these substeps:
Set eventHandler's value to null.
This does not deactivate the event handler, which additionally removes the event handler's listener (if present).
Let syntaxError be a new SyntaxError
exception associated
with settings object's realm which describes the error while parsing. It should be based on
location, where the script body originated.
Report an exception with syntaxError for settings object's global object.
Return null.
Push settings object's realm execution context onto the JavaScript execution context stack; it is now the running JavaScript execution context.
This is necessary so the subsequent invocation of OrdinaryFunctionCreate takes place in the correct realm.
Let function be the result of calling OrdinaryFunctionCreate, with arguments:
onerror
and
eventTarget is a Window
objectfunction
", name,
"(event, source, lineno, colno, error) {
", U+000A LF,
body, U+000A LF, and "}
".function
", name,
"(event) {
", U+000A LF, body, U+000A LF, and "}
".onerror
and
eventTarget is a Window
objectevent
, source
, lineno
, colno
, and
error
.event
.Let realm be settings object's realm.
Let scope be realm.[[GlobalEnv]].
If eventHandler is an element's event handler, then set scope to NewObjectEnvironment(document, true, scope).
(Otherwise, eventHandler is a Window
object's event handler.)
If form owner is not null, then set scope to NewObjectEnvironment(form owner, true, scope).
If element is not null, then set scope to NewObjectEnvironment(element, true, scope).
Return scope.
Remove settings object's realm execution context from the JavaScript execution context stack.
Set function.[[ScriptOrModule]] to null.
This is done because the default behavior, of associating the created function with the nearest script on the stack, can lead to path-dependent results. For example, an event handler which is first invoked by user interaction would end up with null [[ScriptOrModule]] (since then this algorithm would be first invoked when the active script is null), whereas one that is first invoked by dispatching an event from script would have its [[ScriptOrModule]] set to that script.
Instead, we just always set [[ScriptOrModule]] to null. This is more intuitive anyway; the idea that the first script which dispatches an event is somehow responsible for the event handler code is dubious.
In practice, this only affects the resolution of relative URLs via import()
,
which consult the base URL of the associated
script. Nulling out [[ScriptOrModule]] means that HostLoadImportedModule will
fall back to the current settings object's API base URL.
Set eventHandler's value to the
result of creating a Web IDL EventHandler
callback function object whose object
reference is function and whose callback context is settings
object.
Return eventHandler's value.
Document
objects, and Window
objectsThe following are the event handlers (and their corresponding event handler event types) that must be
supported by all HTML elements, as both event handler content attributes
and event handler IDL attributes; and that must be
supported by all Document
and Window
objects, as event handler IDL
attributes:
Event handler | Event handler event type |
---|---|
onabort | abort
|
onauxclick | auxclick
|
onbeforeinput | beforeinput
|
onbeforematch | beforematch
|
onbeforetoggle | beforetoggle
|
oncancel | cancel
|
oncanplay | canplay
|
oncanplaythrough | canplaythrough
|
onchange | change
|
onclick | click
|
onclose | close
|
oncontextlost | contextlost
|
oncontextmenu | contextmenu
|
oncontextrestored | contextrestored
|
oncopy | copy
|
oncuechange | cuechange
|
oncut | cut
|
ondblclick | dblclick
|
ondrag | drag
|
ondragend | dragend
|
ondragenter | dragenter
|
ondragleave | dragleave
|
ondragover | dragover
|
ondragstart | dragstart
|
ondrop | drop
|
ondurationchange | durationchange
|
onemptied | emptied
|
onended | ended
|
onformdata | formdata
|
oninput | input
|
oninvalid | invalid
|
onkeydown | keydown
|
onkeypress | keypress
|
onkeyup | keyup
|
onloadeddata | loadeddata
|
onloadedmetadata | loadedmetadata
|
onloadstart | loadstart
|
onmousedown | mousedown
|
onmouseenter | mouseenter
|
onmouseleave | mouseleave
|
onmousemove | mousemove
|
onmouseout | mouseout
|
onmouseover | mouseover
|
onmouseup | mouseup
|
onpaste | paste
|
onpause | pause
|
onplay | play
|
onplaying | playing
|
onprogress | progress
|
onratechange | ratechange
|
onreset | reset
|
onscrollend | scrollend
|
onsecuritypolicyviolation | securitypolicyviolation
|
onseeked | seeked
|
onseeking | seeking
|
onselect | select
|
onslotchange | slotchange
|
onstalled | stalled
|
onsubmit | submit
|
onsuspend | suspend
|
ontimeupdate | timeupdate
|
ontoggle | toggle
|
onvolumechange | volumechange
|
onwaiting | waiting
|
onwebkitanimationend | webkitAnimationEnd
|
onwebkitanimationiteration | webkitAnimationIteration
|
onwebkitanimationstart | webkitAnimationStart
|
onwebkittransitionend | webkitTransitionEnd
|
onwheel | wheel
|
The following are the event handlers (and their corresponding event handler event types) that must be
supported by all HTML elements other than body
and frameset
elements, as both event handler content attributes and event handler IDL
attributes; that must be supported by all Document
objects, as event handler IDL attributes; and that must be
supported by all Window
objects, as event handler IDL attributes on the
Window
objects themselves, and with corresponding event handler content
attributes and event handler IDL attributes exposed on all body
and frameset
elements that are owned by that Window
object's associated Document
:
Event handler | Event handler event type |
---|---|
onblur | blur
|
onerror | error
|
onfocus | focus
|
onload | load
|
onresize | resize
|
onscroll | scroll
|
We call the set of the names of the
event handlers listed in the first column of this table the
Window
-reflecting body element event handler set.
The following are the event handlers (and their corresponding event handler event types) that must be
supported by Window
objects, as event handler IDL attributes on the
Window
objects themselves, and with corresponding event handler content
attributes and event handler IDL attributes exposed on all body
and frameset
elements that are owned by that Window
object's associated Document
:
Event handler | Event handler event type |
---|---|
onafterprint | afterprint
|
onbeforeprint | beforeprint
|
onbeforeunload | beforeunload
|
onhashchange | hashchange
|
onlanguagechange | languagechange
|
onmessage | message
|
onmessageerror | messageerror
|
onoffline | offline
|
ononline | online
|
onpageswap | pageswap
|
onpagehide | pagehide
|
onpagereveal | pagereveal
|
onpageshow | pageshow
|
onpopstate | popstate
|
onrejectionhandled | rejectionhandled
|
onstorage | storage
|
onunhandledrejection | unhandledrejection
|
onunload | unload
|
This list of event handlers is reified as event handler IDL
attributes through the WindowEventHandlers
interface mixin.
The following are the event handlers (and their corresponding event handler event types) that must be
supported on Document
objects as event handler IDL attributes:
Event handler | Event handler event type |
---|---|
onreadystatechange | readystatechange
|
onvisibilitychange | visibilitychange
|
interface mixin GlobalEventHandlers {
attribute EventHandler onabort;
attribute EventHandler onauxclick;
attribute EventHandler onbeforeinput;
attribute EventHandler onbeforematch;
attribute EventHandler onbeforetoggle;
attribute EventHandler onblur;
attribute EventHandler oncancel;
attribute EventHandler oncanplay;
attribute EventHandler oncanplaythrough;
attribute EventHandler onchange;
attribute EventHandler onclick;
attribute EventHandler onclose;
attribute EventHandler oncontextlost;
attribute EventHandler oncontextmenu;
attribute EventHandler oncontextrestored;
attribute EventHandler oncopy;
attribute EventHandler oncuechange;
attribute EventHandler oncut;
attribute EventHandler ondblclick;
attribute EventHandler ondrag;
attribute EventHandler ondragend;
attribute EventHandler ondragenter;
attribute EventHandler ondragleave;
attribute EventHandler ondragover;
attribute EventHandler ondragstart;
attribute EventHandler ondrop;
attribute EventHandler ondurationchange;
attribute EventHandler onemptied;
attribute EventHandler onended;
attribute OnErrorEventHandler onerror;
attribute EventHandler onfocus;
attribute EventHandler onformdata;
attribute EventHandler oninput;
attribute EventHandler oninvalid;
attribute EventHandler onkeydown;
attribute EventHandler onkeypress;
attribute EventHandler onkeyup;
attribute EventHandler onload;
attribute EventHandler onloadeddata;
attribute EventHandler onloadedmetadata;
attribute EventHandler onloadstart;
attribute EventHandler onmousedown;
[LegacyLenientThis] attribute EventHandler onmouseenter;
[LegacyLenientThis] attribute EventHandler onmouseleave;
attribute EventHandler onmousemove;
attribute EventHandler onmouseout;
attribute EventHandler onmouseover;
attribute EventHandler onmouseup;
attribute EventHandler onpaste;
attribute EventHandler onpause;
attribute EventHandler onplay;
attribute EventHandler onplaying;
attribute EventHandler onprogress;
attribute EventHandler onratechange;
attribute EventHandler onreset;
attribute EventHandler onresize;
attribute EventHandler onscroll;
attribute EventHandler onscrollend;
attribute EventHandler onsecuritypolicyviolation;
attribute EventHandler onseeked;
attribute EventHandler onseeking;
attribute EventHandler onselect;
attribute EventHandler onslotchange;
attribute EventHandler onstalled;
attribute EventHandler onsubmit;
attribute EventHandler onsuspend;
attribute EventHandler ontimeupdate;
attribute EventHandler ontoggle;
attribute EventHandler onvolumechange;
attribute EventHandler onwaiting;
attribute EventHandler onwebkitanimationend;
attribute EventHandler onwebkitanimationiteration;
attribute EventHandler onwebkitanimationstart;
attribute EventHandler onwebkittransitionend;
attribute EventHandler onwheel;
};
interface mixin WindowEventHandlers {
attribute EventHandler onafterprint;
attribute EventHandler onbeforeprint;
attribute OnBeforeUnloadEventHandler onbeforeunload;
attribute EventHandler onhashchange;
attribute EventHandler onlanguagechange;
attribute EventHandler onmessage;
attribute EventHandler onmessageerror;
attribute EventHandler onoffline;
attribute EventHandler ononline;
attribute EventHandler onpagehide;
attribute EventHandler onpagereveal;
attribute EventHandler onpageshow;
attribute EventHandler onpageswap;
attribute EventHandler onpopstate;
attribute EventHandler onrejectionhandled;
attribute EventHandler onstorage;
attribute EventHandler onunhandledrejection;
attribute EventHandler onunload;
};
Certain operations and methods are defined as firing events on elements. For example, the click()
method on the HTMLElement
interface is defined as
firing a click
event on the element. UIEVENTS
Firing a synthetic pointer event named e at target, with an optional not trusted flag, means running these steps:
Let event be the result of creating an event using
PointerEvent
.
Initialize event's type
attribute to
e.
Initialize event's bubbles
and cancelable
attributes to true.
Set event's composed flag.
If the not trusted flag is set, initialize event's isTrusted
attribute to false.
Initialize event's ctrlKey
, shiftKey
, altKey
, and metaKey
attributes according to the current state of the key input device, if any (false for any keys
that are not available).
Initialize event's view
attribute to
target's node document's Window
object, if any, and null
otherwise.
event's getModifierState()
method is to return values
appropriately describing the current state of the key input device.
Return the result of dispatching event at target.
Firing a click
event
at target means firing a synthetic
pointer event named click
at target.
WindowOrWorkerGlobalScope
mixinThe WindowOrWorkerGlobalScope
mixin is for use of APIs that are to be exposed on
Window
and WorkerGlobalScope
objects.
Other standards are encouraged to further extend it using partial
interface mixin WindowOrWorkerGlobalScope { … };
along with an
appropriate reference.
typedef (DOMString or Function or TrustedScript) TimerHandler;
interface mixin WindowOrWorkerGlobalScope {
[Replaceable] readonly attribute USVString origin;
readonly attribute boolean isSecureContext;
readonly attribute boolean crossOriginIsolated;
undefined reportError(any e);
// base64 utility methods
DOMString btoa(DOMString data);
ByteString atob(DOMString data);
// timers
long setTimeout(TimerHandler handler, optional long timeout = 0, any... arguments);
undefined clearTimeout(optional long id = 0);
long setInterval(TimerHandler handler, optional long timeout = 0, any... arguments);
undefined clearInterval(optional long id = 0);
// microtask queuing
undefined queueMicrotask(VoidFunction callback);
// ImageBitmap
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options = {});
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options = {});
// structured cloning
any structuredClone(any value, optional StructuredSerializeOptions options = {});
};
Window includes WindowOrWorkerGlobalScope;
WorkerGlobalScope includes WindowOrWorkerGlobalScope;
self.isSecureContext
Returns whether or not this global object represents a secure context. SECURE-CONTEXTS
self.origin
Returns the global object's origin, serialized as string.
self.crossOriginIsolated
Returns whether scripts running in this global are allowed to use APIs that require
cross-origin isolation. This depends on the `Cross-Origin-Opener-Policy
` and
`Cross-Origin-Embedder-Policy
` HTTP response headers and the "cross-origin-isolated
" feature.
Developers are strongly encouraged to use self.origin
over location.origin
. The former returns the origin of the environment,
the latter of the URL of the environment. Imagine the following script executing in a document on
https://stargate.example/
:
var frame = document.createElement("iframe")
frame.onload = function() {
var frameWin = frame.contentWindow
console.log(frameWin.location.origin) // "null"
console.log(frameWin.origin) // "https://stargate.example"
}
document.body.appendChild(frame)
self.origin
is a more reliable security indicator.
The isSecureContext
getter steps are to return true if
this's relevant settings object is a secure context, or
false otherwise.
The origin
getter steps are to return this's
relevant settings object's origin, serialized.
The crossOriginIsolated
getter steps are to return
this's relevant settings object's cross-origin isolated
capability.
The atob()
and btoa()
methods
allow developers to transform content to and from the base64 encoding.
In these APIs, for mnemonic purposes, the "b" can be considered to stand for "binary", and the "a" for "ASCII". In practice, though, for primarily historical reasons, both the input and output of these functions are Unicode strings.
result = self.btoa(data)
Takes the input data, in the form of a Unicode string containing only characters in the range U+0000 to U+00FF, each representing a binary byte with values 0x00 to 0xFF respectively, and converts it to its base64 representation, which it returns.
Throws an "InvalidCharacterError
" DOMException
exception if the input string contains any out-of-range characters.
result = self.atob(data)
Takes the input data, in the form of a Unicode string containing base64-encoded binary data, decodes it, and returns a string consisting of characters in the range U+0000 to U+00FF, each representing a binary byte with values 0x00 to 0xFF respectively, corresponding to that binary data.
Throws an "InvalidCharacterError
" DOMException
if the
input string is not valid base64 data.
The btoa(data)
method must throw an
"InvalidCharacterError
" DOMException
if data
contains any character whose code point is greater than U+00FF. Otherwise, the user agent must
convert data to a byte sequence whose nth byte is the eight-bit
representation of the nth code point of data, and then must apply
forgiving-base64 encode to that byte sequence and return the result.
The atob(data)
method steps are:
Let decodedData be the result of running forgiving-base64 decode on data.
If decodedData is failure, then throw an
"InvalidCharacterError
" DOMException
.
Return decodedData.
APIs for dynamically inserting markup into the document interact with the parser, and thus their behavior varies depending on whether they are used with HTML documents (and the HTML parser) or XML documents (and the XML parser).
Document
objects have a throw-on-dynamic-markup-insertion counter,
which is used in conjunction with the create an element for the token algorithm to
prevent custom element constructors from being
able to use document.open()
, document.close()
, and document.write()
when they are invoked by the parser.
Initially, the counter must be set to zero.
document = document.open()
Causes the Document
to be replaced in-place, as if it was a new
Document
object, but reusing the previous object, which is then returned.
The resulting Document
has an HTML parser associated with it, which can be given
data to parse using document.write()
.
The method has no effect if the Document
is still being parsed.
Throws an "InvalidStateError
" DOMException
if the
Document
is an XML document.
Throws an "InvalidStateError
" DOMException
if the
parser is currently executing a custom element constructor.
window = document.open(url, name, features)
Works like the window.open()
method.
Document
objects have an active parser was aborted boolean, which is
used to prevent scripts from invoking the document.open()
and document.write()
methods (directly or indirectly)
after the document's active parser has been aborted. It is initially false.
The document open steps, given a document, are as follows:
If document is an XML document, then throw
an "InvalidStateError
" DOMException
exception.
If document's throw-on-dynamic-markup-insertion counter is greater
than 0, then throw an "InvalidStateError
"
DOMException
.
Let entryDocument be the entry global object's associated Document
.
If document's origin is not
same origin to entryDocument's origin, then throw a
"SecurityError
" DOMException
.
If document has an active parser whose script nesting level is greater than 0, then return document.
This basically causes document.open()
to
be ignored when it's called in an inline script found during parsing, while still letting it
have an effect when called from a non-parser task such as a timer callback or event handler.
Similarly, if document's unload counter is greater than 0, then return document.
This basically causes document.open()
to
be ignored when it's called from a beforeunload
, pagehide
, or unload
event
handler while the Document
is being unloaded.
If document's active parser was aborted is true, then return document.
This notably causes document.open()
to
be ignored if it is called after a navigation has started, but
only during the initial parse. See issue
#4723 for more background.
If document's node navigable is non-null and document's node navigable's ongoing navigation is a navigation ID, then stop loading document's node navigable.
For each shadow-including inclusive descendant node of document, erase all event listeners and handlers given node.
If document is the associated
Document
of document's relevant global object, then
erase all event listeners and handlers given document's relevant
global object.
Replace all with null within document.
If document is fully active, then:
Let newURL be a copy of entryDocument's URL.
If entryDocument is not document, then set newURL's fragment to null.
Run the URL and history update steps with document and newURL.
Set document's is initial about:blank
to
false.
If document's iframe load in progress flag is set, then set document's mute iframe load flag.
Set document to no-quirks mode.
Create a new HTML parser and associate it with document. This is a
script-created parser (meaning that it can be closed by the document.open()
and document.close()
methods, and that the tokenizer will wait for
an explicit call to document.close()
before emitting an
end-of-file token). The encoding confidence is
irrelevant.
Set the insertion point to point at just before the end of the input stream (which at this point will be empty).
Update the current document readiness of document to "loading
".
This causes a readystatechange
event to fire, but the event is actually unobservable to author code, because of the previous
step which erased all event listeners and
handlers that could observe it.
Return document.
The document open steps do not affect whether a Document
is ready for post-load tasks or completely loaded.
The open(unused1,
unused2)
method must return the result of running the document open
steps with this.
The unused1 and
unused2 arguments are ignored, but kept in the IDL to allow code that calls the
function with one or two arguments to continue working. They are necessary due to Web IDL
overload resolution algorithm rules, which would throw a TypeError
exception for such calls had the arguments not been there. whatwg/webidl issue #581 investigates
changing the algorithm to allow for their removal. WEBIDL
The open(url,
name, features)
method must run these steps:
If this is not fully active, then throw an
"InvalidAccessError
" DOMException
exception.
Return the result of running the window open steps with url, name, and features.
document.close()
Closes the input stream that was opened by the document.open()
method.
Throws an "InvalidStateError
" DOMException
if the
Document
is an XML document.
Throws an "InvalidStateError
" DOMException
if the
parser is currently executing a custom element constructor.
The close()
method must run the following
steps:
If this is an XML document, then throw
an "InvalidStateError
" DOMException
.
If this's throw-on-dynamic-markup-insertion counter is greater
than zero, then throw an "InvalidStateError
"
DOMException
.
If there is no script-created parser associated with this, then return.
Insert an explicit "EOF" character at the end of the parser's input stream.
If this's pending parsing-blocking script is not null, then return.
Run the tokenizer, processing resulting tokens as they are emitted, and stopping when the tokenizer reaches the explicit "EOF" character or spins the event loop.
document.write()
document.write(...text)
In general, adds the given string(s) to the Document
's input stream.
This method has very idiosyncratic behavior. In some cases, this method can
affect the state of the HTML parser while the parser is running, resulting in a DOM
that does not correspond to the source of the document (e.g. if the string written is the string
"<plaintext>
" or "<!--
"). In other cases,
the call can clear the current page first, as if document.open()
had been called. In yet more cases, the method
is simply ignored, or throws an exception. Users agents are explicitly allowed to avoid executing
script
elements inserted via this method. And to make matters even worse, the
exact behavior of this method can in some cases be dependent on network latency, which can lead to failures that are very hard to debug. For all these reasons, use
of this method is strongly discouraged.
Throws an "InvalidStateError
" DOMException
when
invoked on XML documents.
Throws an "InvalidStateError
" DOMException
if the
parser is currently executing a custom element constructor.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
Document
objects have an ignore-destructive-writes counter, which is
used in conjunction with the processing of script
elements to prevent external
scripts from being able to use document.write()
to blow
away the document by implicitly calling document.open()
.
Initially, the counter must be set to zero.
The document write steps, given a Document
object document,
a list text, a boolean lineFeed and a string sink, are as
follows:
Let string be the empty string.
Let isTrusted be false if text contains a string; otherwise true.
For each value of text:
If value is a TrustedHTML
object, then
append value's associated data to
string.
Otherwise, append value to string.
If isTrusted is false, set string to the result of invoking the
Get Trusted Type compliant string algorithm with
TrustedHTML
, this's relevant global
object, string, sink, and "script
".
If lineFeed is true, append U+000A LINE FEED to string.
If document is an XML document, then throw
an "InvalidStateError
" DOMException
.
If document's throw-on-dynamic-markup-insertion counter is greater
than 0, then throw an "InvalidStateError
"
DOMException
.
If document's active parser was aborted is true, then return.
If the insertion point is undefined, then:
If document's unload counter is greater than 0 or document's ignore-destructive-writes counter is greater than 0, then return.
Run the document open steps with document.
Insert string into the input stream just before the insertion point.
If document's pending parsing-blocking script is null, then have the
HTML parser process string, one code point at a time, processing
resulting tokens as they are emitted, and stopping when the tokenizer reaches the insertion
point or when the processing of the tokenizer is aborted by the tree construction stage (this
can happen if a script
end tag token is emitted by the tokenizer).
If the document.write()
method was
called from script executing inline (i.e. executing because the parser parsed a set of
script
tags), then this is a reentrant invocation of the
parser. If the parser pause flag is set, the tokenizer will abort immediately
and no HTML will be parsed, per the tokenizer's parser pause
flag check.
The document.write(...text)
method steps are
to run the document write steps with this, text, false, and
"Document write
".
document.writeln()
document.writeln(...text)
Adds the given string(s) to the Document
's input stream, followed by a newline
character. If necessary, calls the open()
method
implicitly first.
Throws an "InvalidStateError
" DOMException
when
invoked on XML documents.
Throws an "InvalidStateError
" DOMException
if the
parser is currently executing a custom element constructor.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
The document.writeln(...text)
method steps are
to run the document write steps with this, text, true, and
"Document writeln
".
partial interface Element {
[CEReactions] undefined setHTMLUnsafe((TrustedHTML
or DOMString) html);
DOMString getHTML(optional GetHTMLOptions options = {});
[CEReactions] attribute (TrustedHTML
or [LegacyNullToEmptyString] DOMString) innerHTML;
[CEReactions] attribute (TrustedHTML
or [LegacyNullToEmptyString] DOMString) outerHTML;
[CEReactions] undefined insertAdjacentHTML(DOMString position, (TrustedHTML
or DOMString) string);
};
partial interface ShadowRoot {
[CEReactions] undefined setHTMLUnsafe((TrustedHTML
or DOMString) html);
DOMString getHTML(optional GetHTMLOptions options = {});
[CEReactions] attribute (TrustedHTML
or [LegacyNullToEmptyString] DOMString) innerHTML;
};
dictionary GetHTMLOptions {
boolean serializableShadowRoots = false;
sequence<ShadowRoot> shadowRoots = [];
};
DOMParser
interfaceThe DOMParser
interface allows authors to create new Document
objects
by parsing strings, as either HTML or XML.
parser = new DOMParser()
Constructs a new DOMParser
object.
document = parser.parseFromString(string, type)
Parses string using either the HTML or XML parser, according to type,
and returns the resulting Document
. type can be "text/html
"
(which will invoke the HTML parser), or any of "text/xml
",
"application/xml
", "application/xhtml+xml
", or
"image/svg+xml
" (which will invoke the XML parser).
For the XML parser, if string cannot be parsed, then the returned
Document
will contain elements describing the resulting error.
Note that script
elements are not evaluated during parsing, and the resulting
document's encoding will always be
UTF-8. The document's URL will be
inherited from parser's relevant global object.
Values other than the above for type will cause a TypeError
exception
to be thrown.
The design of DOMParser
, as a class that needs to be constructed and
then have its parseFromString()
method
called, is an unfortunate historical artifact. If we were designing this functionality today it
would be a standalone function. For parsing HTML, the modern alternative is Document.parseHTMLUnsafe()
.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
[Exposed=Window]
interface DOMParser {
constructor();
[NewObject] Document
parseFromString((TrustedHTML
or DOMString) string, DOMParserSupportedType type);
};
enum DOMParserSupportedType {
"text/html",
"text/xml",
"application/xml",
"application/xhtml+xml",
"image/svg+xml"
};
The new DOMParser()
constructor
steps are to do nothing.
The parseFromString(string,
type)
method steps are:
Let compliantString be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, string, "DOMParser parseFromString
", and "script
".
Let document be a new Document
, whose content type is type and URL is this's relevant global object's associated Document
's URL.
The document's encoding will
be left as its default, of UTF-8. In particular, any XML declarations or
meta
elements found while parsing compliantString will have no effect.
Switch on type:
text/html
"Parse HTML from a string given document and compliantString.
Since document does not have a browsing context, scripting is disabled.
Create an XML parser parser, associated with document, and with XML scripting support disabled.
Parse compliantString using parser.
If the previous step resulted in an XML well-formedness or XML namespace well-formedness error, then:
Assert: document has no child nodes.
Let root be the result of creating an
element given document, "parsererror
", and "http://www.mozilla.org/newlayout/xml/parsererror.xml
".
Optionally, add attributes or children to root to describe the nature of the parsing error.
Append root to document.
Return document.
To parse HTML from a string, given a Document
document and a
string html:
Set document's type to "html
".
Create an HTML parser parser, associated with document.
Place html into the input stream for parser. The encoding confidence is irrelevant.
Start parser and let it run until it has consumed all the characters just inserted into the input stream.
This might mutate the document's mode.
element.setHTMLUnsafe(html)
Parses html using the HTML parser, and replaces the children of element with the result. element provides context for the HTML parser.
shadowRoot.setHTMLUnsafe(html)
Parses html using the HTML parser, and replaces the children of shadowRoot with the result. shadowRoot's host provides context for the HTML parser.
doc = Document.parseHTMLUnsafe(html)
Parses html using the HTML parser, and returns the resulting
Document
.
Note that script
elements are not evaluated during parsing, and the resulting
document's encoding will always be
UTF-8. The document's URL will be
about:blank
.
These methods perform no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
Element
's setHTMLUnsafe(html)
method steps
are:
Let compliantHTML be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, html, "Element setHTMLUnsafe
", and "script
".
Let target be this's template contents if
this is a template
element; otherwise this.
Unsafely set HTML given target, this, and compliantHTML.
ShadowRoot
's setHTMLUnsafe(html)
method steps
are:
Let compliantHTML be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, html, "ShadowRoot setHTMLUnsafe
", and "script
".
Unsafely set HTML given this, this's shadow host, and compliantHTML.
To unsafely set HTML, given an Element
or DocumentFragment
target, an Element
contextElement, and a string
html:
Let newChildren be the result of the HTML fragment parsing algorithm given contextElement, html, and true.
Let fragment be a new DocumentFragment
whose node
document is contextElement's node document.
For each node in newChildren, append node to fragment.
Replace all with fragment within target.
The static parseHTMLUnsafe(html)
method steps are:
Let compliantHTML be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, html, "Document parseHTMLUnsafe
", and "script
".
Let document be a new Document
, whose content type is "text/html
".
Since document does not have a browsing context, scripting is disabled.
Set document's allow declarative shadow roots to true.
Parse HTML from a string given document and compliantHTML.
Return document.
html = element.getHTML({ serializableShadowRoots, shadowRoots })
Returns the result of serializing element to HTML. Shadow roots within element are serialized according to the provided options:
If serializableShadowRoots
is true, then all shadow roots marked as serializable are serialized.
If the shadowRoots
array is provided, then all shadow roots specified in the array are serialized, regardless of whether or not they are marked as serializable.
If neither option is provided, then no shadow roots are serialized.
html = shadowRoot.getHTML({ serializableShadowRoots, shadowRoots })
Returns the result of serializing shadowRoot to HTML, using its shadow host as the context element. Shadow roots within shadowRoot are serialized according to the provided options, as above.
Element
's getHTML(options)
method steps
are to return the result of HTML fragment serialization algorithm with
this, options["serializableShadowRoots
"],
and options["shadowRoots
"].
ShadowRoot
's getHTML(options)
method steps
are to return the result of HTML fragment serialization algorithm with
this, options["serializableShadowRoots
"],
and options["shadowRoots
"].
innerHTML
propertyThe innerHTML
property has a number of outstanding issues
in the DOM Parsing and Serialization issue
tracker, documenting various problems with its specification.
element.innerHTML
Returns a fragment of HTML or XML that represents the element's contents.
In the case of an XML document, throws a "InvalidStateError
"
DOMException
if the element cannot be serialized to XML.
element.innerHTML = value
Replaces the contents of the element with nodes parsed from the given string.
In the case of an XML document, throws a "SyntaxError
"
DOMException
if the given string is not well-formed.
shadowRoot.innerHTML
Returns a fragment of HTML that represents the shadow roots's contents.
shadowRoot.innerHTML = value
Replaces the contents of the shadow root with nodes parsed from the given string.
These properties' setters perform no sanitization to remove
potentially-dangerous elements and attributes like script
or event handler
content attributes.
The fragment serializing algorithm steps, given an Element
,
Document
or DocumentFragment
node and a boolean require
well-formed, are:
Let context document be node's node document.
If context document is an HTML document, return the result of HTML fragment serialization algorithm with node, false, and « ».
Return the XML serialization of node given require well-formed.
The fragment parsing algorithm steps, given an Element
context and a string markup, are:
Let algorithm be the HTML fragment parsing algorithm.
If context's node document is an XML document, then set algorithm to the XML fragment parsing algorithm.
Let new children be the result of invoking algorithm given markup, with context set to context.
Let fragment be a new DocumentFragment
whose node
document is context's node document.
Append each Node
in new
children to fragment (in tree order).
This ensures the node document for the new nodes is correct.
Return fragment.
Element
's innerHTML
getter steps are to return the result of
running fragment serializing algorithm steps with this and true.
ShadowRoot
's innerHTML
getter steps are to return the result of
running fragment serializing algorithm steps with this and true.
Element
's innerHTML
setter steps
are:
Let compliantString be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, the given value, "Element innerHTML
", and "script
".
Let context be this.
Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString.
If context is a template
element, then set context to
the template
element's template contents (a
DocumentFragment
).
Setting innerHTML
on a
template
element will replace all the nodes in its template contents
rather than its children.
Replace all with fragment within context.
ShadowRoot
's innerHTML
setter
steps are:
Let compliantString be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, the given value, "ShadowRoot innerHTML
", and "script
".
Let context be this's host.
Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString.
Replace all with fragment within this.
outerHTML
propertyThe outerHTML
property has a number of outstanding issues
in the DOM Parsing and Serialization issue
tracker, documenting various problems with its specification.
element.outerHTML
Returns a fragment of HTML or XML that represents the element and its contents.
In the case of an XML document, throws a "InvalidStateError
"
DOMException
if the element cannot be serialized to XML.
element.outerHTML = value
Replaces the element with nodes parsed from the given string.
In the case of an XML document, throws a "SyntaxError
"
DOMException
if the given string is not well-formed.
Throws a "NoModificationAllowedError
" DOMException
if
the parent of the element is a Document
.
This property's setter performs no sanitization to remove potentially-dangerous
elements and attributes like script
or event handler content
attributes.
Element
's outerHTML
getter steps are:
Let element be a fictional node whose only child is this.
Return the result of running fragment serializing algorithm steps with element and true.
Element
's outerHTML
setter steps
are:
Let compliantString be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, the given value, "Element outerHTML
", and "script
".
Let parent be this's parent.
If parent is null, return. There would be no way to obtain a reference to the nodes created even if the remaining steps were run.
If parent is a Document
, throw a
"NoModificationAllowedError
" DOMException
.
If parent is a DocumentFragment
, set parent to the
result of creating an element given this's
node document, body
, and the HTML namespace.
Let fragment be the result of invoking the fragment parsing algorithm steps given parent and compliantString.
Replace this with fragment within this's parent.
insertAdjacentHTML()
methodThe insertAdjacentHTML()
method has a number of outstanding issues in the DOM Parsing and Serialization issue tracker, documenting various problems
with its specification.
element.insertAdjacentHTML(position, string)
Parses string as HTML or XML and inserts the resulting nodes into the tree in the position given by the position argument, as follows:
beforebegin
"afterbegin
"beforeend
"afterend
"Throws a "SyntaxError
" DOMException
if the arguments
have invalid values (e.g., in the case of an XML document,
if the given string is not well-formed).
Throws a "NoModificationAllowedError
" DOMException
if the given position isn't possible (e.g. inserting elements after the root element of a
Document
).
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
Element
's insertAdjacentHTML(position,
string)
method steps are:
Let compliantString be the result of invoking the Get Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, string, "Element insertAdjacentHTML
", and "script
".
Let context be null.
Use the first matching item from this list:
beforebegin
"afterend
"Set context to this's parent.
If context is null or a Document
, throw a
"NoModificationAllowedError
" DOMException
.
afterbegin
"beforeend
"Throw a "SyntaxError
" DOMException
.
If context is not an Element
or all of the following are true:
context's node document is an HTML document;
context's local name is
"html
"; and
context's namespace is the HTML namespace,
set context to the result of creating an
element given this's node document, body
, and
the HTML namespace.
Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString.
beforebegin
"Insert fragment into this's parent before this.
afterbegin
"Insert fragment into this before its first child.
beforeend
"Append fragment to this.
afterend
"Insert fragment into this's parent before this's next sibling.
As with other direct Node
-manipulation APIs (and unlike innerHTML
), insertAdjacentHTML()
does not include any special
handling for template
elements. In most cases you will want to use templateEl.content.insertAdjacentHTML()
instead of directly
manipulating the child nodes of a template
element.
createContextualFragment()
methodThe createContextualFragment()
method has a number
of outstanding issues in the DOM Parsing and Serialization issue tracker, documenting various problems
with its specification.
docFragment = range.createContextualFragment(string)
Returns a DocumentFragment
created from the markup string string using
range's start node as the context in
which fragment is parsed.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
partial interface Range {
[CEReactions, NewObject] DocumentFragment
createContextualFragment((TrustedHTML
or DOMString) string);
};
Range
's createContextualFragment(string)
method steps are:
Let compliantString be the result of invoking the Get
Trusted Type compliant string algorithm with TrustedHTML
, this's relevant global
object, string, "Range createContextualFragment
", and
"script
".
Let node be this's start node.
Let element be null.
If node implements Element
, set element
to node.
Otherwise, if node implements Text
or
Comment
, set element to node's parent
element.
If element is null or all of the following are true:
element's node document is an HTML document;
element's local name is
"html
"; and
element's namespace is the HTML namespace,
then set element to the result of creating an
element given this's node document, body
, and the
HTML namespace.
Let fragment node be the result of invoking the fragment parsing algorithm steps with element and compliantString.
For each script of fragment node's
script
element descendants:
Set script's already started to false.
Set script's parser document to null.
Return fragment node.
The setTimeout()
and setInterval()
methods allow authors to schedule timer-based
callbacks.
id = self.setTimeout(handler [, timeout [, ...arguments ] ])
Schedules a timeout to run handler after timeout milliseconds. Any arguments are passed straight through to the handler.
id = self.setTimeout(code [, timeout ])
Schedules a timeout to compile and run code after timeout milliseconds.
self.clearTimeout(id)
Cancels the timeout set with setTimeout()
or setInterval()
identified by id.
id = self.setInterval(handler [, timeout [, ...arguments ] ])
Schedules a timeout to run handler every timeout milliseconds. Any arguments are passed straight through to the handler.
id = self.setInterval(code [, timeout ])
Schedules a timeout to compile and run code every timeout milliseconds.
self.clearInterval(id)
Cancels the timeout set with setInterval()
or setTimeout()
identified by id.
Timers can be nested; after five such nested timers, however, the interval is forced to be at least four milliseconds.
This API does not guarantee that timers will run exactly on schedule. Delays due to CPU load, other tasks, etc, are to be expected.
Objects that implement the WindowOrWorkerGlobalScope
mixin have a
map of setTimeout and setInterval IDs, which is
an ordered map, initially empty. Each key in this map
is a positive integer, corresponding to the return value of a setTimeout()
or setInterval()
call.
Each value is a unique internal value, corresponding
to a key in the object's map of active timers.
The setTimeout(handler, timeout,
...arguments)
method steps are to return the result of running the
timer initialization steps given this, handler,
timeout, arguments, and false.
The setInterval(handler, timeout,
...arguments)
method steps are to return the result of running the
timer initialization steps given this, handler,
timeout, arguments, and true.
The clearTimeout(id)
and clearInterval(id)
method steps
are to remove this's map of setTimeout and
setInterval IDs[id].
Because clearTimeout()
and clearInterval()
clear entries from the same map, either method
can be used to clear timers created by setTimeout()
or setInterval()
.
To perform the timer initialization
steps, given a WindowOrWorkerGlobalScope
global, a string or Function
or TrustedScript
handler, a number timeout, a list arguments, a boolean
repeat, and optionally (and only if repeat is true) a number
previousId, perform the following steps. They return a number.
Let thisArg be global if that is a WorkerGlobalScope
object; otherwise let thisArg be the WindowProxy
that corresponds to
global.
If previousId was given, let id be previousId; otherwise, let id be an implementation-defined integer that is greater than zero and does not already exist in global's map of setTimeout and setInterval IDs.
If the surrounding agent's event loop's currently running task is a task that was created by this algorithm, then let nesting level be the task's timer nesting level. Otherwise, let nesting level be zero.
The task's timer nesting level is used both for nested calls to
setTimeout()
, and for the repeating timers created by
setInterval()
. (Or, indeed, for any combination of the
two.) In other words, it represents nested invocations of this algorithm, not of a particular
method.
If timeout is less than 0, then set timeout to 0.
If nesting level is greater than 5, and timeout is less than 4, then set timeout to 4.
Let realm be global's relevant realm.
Let initiating script be the active script.
Let uniqueHandle be null.
Let task be a task that runs the following substeps:
Assert: uniqueHandle is a unique internal value, not null.
If id does not exist in global's map of setTimeout and setInterval IDs, then abort these steps.
If global's map of setTimeout and setInterval IDs[id] does not equal uniqueHandle, then abort these steps.
This accommodates for the ID having been cleared by a clearTimeout()
or clearInterval()
call, and being reused by a subsequent
setTimeout()
or setInterval()
call.
Record timing info for timer handler given handler, global's relevant settings object, and repeat.
If handler is a Function
, then invoke handler given
arguments and "report
", and with callback this value set to thisArg.
Otherwise:
If previousId was not given:
Let globalName be "Window
" if global
is a Window
object; "Worker
" otherwise.
Let methodName be "setInterval
" if
repeat is true; "setTimeout
" otherwise.
Let sink be a concatenation of globalName, U+0020 SPACE, and methodName.
Set handler to the result of invoking the Get Trusted Type compliant string algorithm with
TrustedScript
, global,
handler, sink, and "script
".
Assert: handler is a string.
Perform EnsureCSPDoesNotBlockStringCompilation(realm, « », handler, handler, timer, « », handler). If this throws an exception, catch it, report it for global, and abort these steps.
Let settings object be global's relevant settings object.
Let fetch options be the default script fetch options.
Let base URL be settings object's API base URL.
If initiating script is not null, then:
Set fetch options to a script fetch options whose cryptographic nonce is initiating
script's fetch options's
cryptographic nonce, integrity metadata is the empty
string, parser metadata is
"not-parser-inserted
", credentials mode is
initiating script's fetch
options's credentials
mode, referrer
policy is initiating script's fetch options's referrer policy, and fetch priority is "auto
".
Set base URL to initiating script's base URL.
The effect of these steps ensures that the string compilation done by setTimeout()
and setInterval()
behaves equivalently to that done by
eval()
. That is, module script fetches via import()
will behave the same in both contexts.
Let script be the result of creating a classic script given handler, settings object, base URL, and fetch options.
Run the classic script script.
If id does not exist in global's map of setTimeout and setInterval IDs, then abort these steps.
If global's map of setTimeout and setInterval IDs[id] does not equal uniqueHandle, then abort these steps.
The ID might have been removed via the author code in handler
calling clearTimeout()
or clearInterval()
. Checking that uniqueHandle isn't different
accounts for the possibility of the ID, after having been cleared, being reused by a
subsequent setTimeout()
or setInterval()
call.
If repeat is true, then perform the timer initialization steps again, given global, handler, timeout, arguments, true, and id.
Otherwise, remove global's map of setTimeout and setInterval IDs[id].
Increment nesting level by one.
Set task's timer nesting level to nesting level.
Let completionStep be an algorithm step which queues a global task on the timer task source given global to run task.
Set uniqueHandle to the result of running steps after a timeout given global, "setTimeout/setInterval
", timeout,
completionStep.
Set global's map of setTimeout and setInterval IDs[id] to uniqueHandle.
Return id.
Argument conversion as defined by Web IDL (for example, invoking toString()
methods on objects passed as the first argument) happens in the
algorithms defined in Web IDL, before this algorithm is invoked.
So for example, the following rather silly code will result in the log containing "ONE TWO
":
var log = '';
function logger(s) { log += s + ' '; }
setTimeout({ toString: function () {
setTimeout("logger('ONE')", 100);
return "logger('TWO')";
} }, 100);
To run tasks of several milliseconds back to back without any delay, while still yielding back to the browser to avoid starving the user interface (and to avoid the browser killing the script for hogging the CPU), simply queue the next timer before performing work:
function doExpensiveWork() {
var done = false;
// ...
// this part of the function takes up to five milliseconds
// set done to true if we're done
// ...
return done;
}
function rescheduleWork() {
var id = setTimeout(rescheduleWork, 0); // preschedule next iteration
if (doExpensiveWork())
clearTimeout(id); // clear the timeout if we don't need it
}
function scheduleWork() {
setTimeout(rescheduleWork, 0);
}
scheduleWork(); // queues a task to do lots of work
Objects that implement the WindowOrWorkerGlobalScope
mixin have a map of active timers, which is an ordered map,
initially empty. Each key in this map is a unique internal
value that represents a timer, and each value is a
DOMHighResTimeStamp
, representing the expiry time for that timer.
To run steps after a timeout, given a WindowOrWorkerGlobalScope
global, a string orderingIdentifier, a number milliseconds, and a
set of steps completionSteps, perform the following steps. They return a unique
internal value.
Let timerKey be a new unique internal value.
Let startTime be the current high resolution time given global.
Set global's map of active timers[timerKey] to startTime plus milliseconds.
Run the following steps in parallel:
If global is a Window
object, wait until global's associated Document
has been fully
active for a further milliseconds milliseconds (not necessarily
consecutively).
Otherwise, global is a WorkerGlobalScope
object; wait until
milliseconds milliseconds have passed with the worker not suspended (not
necessarily consecutively).
Wait until any invocations of this algorithm that had the same global and orderingIdentifier, that started before this one, and whose milliseconds is less than or equal to this one's, have completed.
Optionally, wait a further implementation-defined length of time.
This is intended to allow user agents to pad timeouts as needed to optimize the power usage of the device. For example, some processors have a low-power mode where the granularity of timers is reduced; on such platforms, user agents can slow timers down to fit this schedule instead of requiring the processor to use the more accurate mode with its associated higher power usage.
Perform completionSteps.
Remove global's map of active timers[timerKey].
Return timerKey.
Run steps after a timeout is meant to be used by other
specifications that want to execute developer-supplied code after a developer-supplied timeout,
in a similar manner to setTimeout()
. (Note, however, it does
not have the nesting and clamping behavior of setTimeout()
.)
Such specifications can choose an orderingIdentifier to ensure ordering within their
specification's timeouts, while not constraining ordering with respect to other specification's
timeouts.
self.queueMicrotask(callback)
Queues a microtask to run the given callback.
The queueMicrotask(callback)
method must
queue a microtask to invoke
callback with « » and "report
".
The queueMicrotask()
method allows authors to schedule
a callback on the microtask queue. This allows their code to run once the
JavaScript execution context stack is next empty, which happens once all currently
executing synchronous JavaScript has run to completion. This doesn't yield control back to the
event loop, as would be the case when using, for example, setTimeout(f, 0)
.
Authors ought to be aware that scheduling a lot of microtasks has the same performance
downsides as running a lot of synchronous code. Both will prevent the browser from doing its own
work, such as rendering. In many cases, requestAnimationFrame()
or
requestIdleCallback()
is a better choice. In particular, if the goal is to run code
before the next rendering cycle, that is the purpose of requestAnimationFrame()
.
As can be seen from the following examples, the best way of thinking about queueMicrotask()
is as a mechanism for rearranging synchronous
code, effectively placing the queued code immediately after the currently executing synchronous
JavaScript has run to completion.
The most common reason for using queueMicrotask()
is
to create consistent ordering, even in the cases where information is available synchronously,
without introducing undue delay.
For example, consider a custom element firing a load
event, that also
maintains an internal cache of previously-loaded data. A naïve implementation might look
like:
MyElement.prototype.loadData = function (url) {
if (this._cache[url]) {
this._setData(this._cache[url]);
this.dispatchEvent(new Event("load"));
} else {
fetch(url).then(res => res.arrayBuffer()).then(data => {
this._cache[url] = data;
this._setData(data);
this.dispatchEvent(new Event("load"));
});
}
};
This naïve implementation is problematic, however, in that it causes its users to experience inconsistent behavior. For example, code such as
element.addEventListener("load", () => console.log("loaded"));
console.log("1");
element.loadData();
console.log("2");
will sometimes log "1, 2, loaded" (if the data needs to be fetched), and sometimes log "1,
loaded, 2" (if the data is already cached). Similarly, after the call to loadData()
, it will be inconsistent whether or not the data is set on the
element.
To get a consistent ordering, queueMicrotask()
can be
used:
MyElement.prototype.loadData = function (url) {
if (this._cache[url]) {
queueMicrotask(() => {
this._setData(this._cache[url]);
this.dispatchEvent(new Event("load"));
});
} else {
fetch(url).then(res => res.arrayBuffer()).then(data => {
this._cache[url] = data;
this._setData(data);
this.dispatchEvent(new Event("load"));
});
}
};
By essentially rearranging the queued code to be after the JavaScript execution context stack empties, this ensures a consistent ordering and update of the element's state.
Another interesting use of queueMicrotask()
is to
allow uncoordinated "batching" of work by multiple callers. For example, consider a library
function that wants to send data somewhere as soon as possible, but doesn't want to make multiple
network requests if doing so is easily avoidable. One way to balance this would be like so:
const queuedToSend = [];
function sendData(data) {
queuedToSend.push(data);
if (queuedToSend.length === 1) {
queueMicrotask(() => {
const stringToSend = JSON.stringify(queuedToSend);
queuedToSend.length = 0;
fetch("/endpoint", stringToSend);
});
}
}
With this architecture, multiple subsequent calls to sendData()
within
the currently executing synchronous JavaScript will be batched together into one
fetch()
call, but with no intervening event loop tasks preempting the fetch (as
would have happened with similar code that instead used setTimeout()
).
window.alert(message)
Displays a modal alert with the given message, and waits for the user to dismiss it.
result = window.confirm(message)
Displays a modal OK/Cancel prompt with the given message, waits for the user to dismiss it, and returns true if the user clicks OK and false if the user clicks Cancel.
result = window.prompt(message [, default])
Displays a modal text control prompt with the given message, waits for the user to dismiss it, and returns the value that the user entered. If the user cancels the prompt, then returns null instead. If the second argument is present, then the given value is used as a default.
Logic that depends on tasks or microtasks, such as media elements loading their media data, are stalled when these methods are invoked.
The alert()
and alert(message)
method steps
are:
If we cannot show simple dialogs for this, then return.
If the method was invoked with no arguments, then let message be the empty string; otherwise, let message be the method's first argument.
Set message to the result of normalizing newlines given message.
Set message to the result of optionally truncating message.
Let userPromptHandler be WebDriver BiDi user prompt opened with
this, "alert
", and message.
If userPromptHandler is "none
", then:
Show message to the user, treating U+000A LF as a line break.
Optionally, pause while waiting for the user to acknowledge the message.
Invoke WebDriver BiDi user prompt closed with this,
"alert
", and true.
This method is defined using two overloads, instead of using an
optional argument, for historical reasons. The practical impact of this is
that alert(undefined)
is treated as alert("undefined")
, but alert()
is treated as
alert("")
.
The confirm(message)
method steps are:
If we cannot show simple dialogs for this, then return false.
Set message to the result of normalizing newlines given message.
Set message to the result of optionally truncating message.
Show message to the user, treating U+000A LF as a line break, and ask the user to respond with a positive or negative response.
Let userPromptHandler be WebDriver BiDi user prompt opened with
this, "confirm
", and message.
Let accepted be false.
If userPromptHandler is "none
", then:
Pause until the user responds either positively or negatively.
If the user responded positively, then set accepted to true.
If userPromptHandler is "accept
", then set
accepted to true.
Invoke WebDriver BiDi user prompt closed with this,
"confirm
", and accepted.
Return accepted.
The prompt(message,
default)
method steps are:
If we cannot show simple dialogs for this, then return null.
Set message to the result of normalizing newlines given message.
Set message to the result of optionally truncating message.
Set default to the result of optionally truncating default.
Show message to the user, treating U+000A LF as a line break, and ask the user to either respond with a string value or abort. The response must be defaulted to the value given by default.
Let userPromptHandler be WebDriver BiDi user prompt opened with
this, "prompt
", and message.
Let result be null.
If userPromptHandler is "none
", then:
Pause while waiting for the user's response.
If the user did not abort, then set result to the string that the user responded with.
Otherwise, if userPromptHandler is "accept
", then set
result to the empty string.
Invoke WebDriver BiDi user prompt closed with this,
"prompt
", false if result is null or true otherwise,
and result.
Return result.
To optionally truncate a simple dialog string s, return either s itself or some string derived from s that is shorter. User agents should not provide UI for displaying the elided portion of s, as this makes it too easy for abusers to create dialogs of the form "Important security alert! Click 'Show More' for full details!".
For example, a user agent might want to only display the first 100 characters of a message. Or, a user agent might replace the middle of the string with "…". These types of modifications can be useful in limiting the abuse potential of unnaturally large, trustworthy-looking system dialogs.
We cannot show simple dialogs for a Window
window when the
following algorithm returns true:
If the active sandboxing flag set of window's associated Document
has the sandboxed
modals flag set, then return true.
If window's relevant settings object's origin and window's relevant settings object's top-level origin are not same origin-domain, then return true.
Optionally, return true. (For example, the user agent might give the user the option to ignore all modal dialogs, and would thus abort at this step whenever the method was invoked.)
Return false.
window.print()
Prompts the user to print the page.
The print()
method steps
are:
Let document be this's associated Document
.
If document is not fully active, then return.
If document's unload counter is greater than 0, then return.
If document is ready for post-load tasks, then run the printing steps for document.
Otherwise, set document's print when loaded flag.
User agents should also run the printing steps whenever the user asks for the opportunity to obtain a physical form (e.g. printed copy), or the representation of a physical form (e.g. PDF copy), of a document.
The printing steps for a Document
document are:
The user agent may display a message to the user or return (or both).
For instance, a kiosk browser could silently ignore any invocations of the
print()
method.
For instance, a browser on a mobile device could detect that there are no printers in the vicinity and display a message saying so before continuing to offer a "save to PDF" option.
If the active sandboxing flag set of document has the sandboxed modals flag set, then return.
If the printing dialog is blocked by a Document
's sandbox,
then neither the beforeprint
nor afterprint
events will be fired.
The user agent must fire an event named beforeprint
at the relevant global object of
document, as well as any child navigable in
it.
Firing in children only doesn't seem right here, and some tasks likely need to be queued. See issue #5096.
The beforeprint
event can be used to
annotate the printed copy, for instance adding the time at which the document was printed.
The user agent should offer the user the opportunity to obtain a physical form (or the representation of a physical form) of document. The user agent may wait for the user to either accept or decline before returning; if so, the user agent must pause while the method is waiting. Even if the user agent doesn't wait at this point, the user agent must use the state of the relevant documents as they are at this point in the algorithm if and when it eventually creates the alternate form.
The user agent must fire an event named afterprint
at the relevant global object of
document, as well as any child navigables in
it.
Firing in children only doesn't seem right here, and some tasks likely need to be queued. See issue #5096.
The afterprint
event can be used to
revert annotations added in the earlier event, as well as showing post-printing UI. For
instance, if a page is walking the user through the steps of applying for a home loan, the
script could automatically advance to the next step after having printed a form or other.
Navigator
objectInstances of Navigator
represent the identity and state of the user agent (the
client). It has also been used as a generic global under which various APIs are located, but this
is not precedent to build upon. Instead use the WindowOrWorkerGlobalScope
mixin or
equivalent.
[Exposed=Window]
interface Navigator {
// objects implementing this interface also implement the interfaces given below
};
Navigator includes NavigatorID;
Navigator includes NavigatorLanguage;
Navigator includes NavigatorOnLine;
Navigator includes NavigatorContentUtils;
Navigator includes NavigatorCookies;
Navigator includes NavigatorPlugins;
Navigator includes NavigatorConcurrentHardware;
These interface mixins are defined separately so that WorkerNavigator
can reuse parts of
the Navigator
interface.
Each Window
has an associated Navigator
, which is a Navigator
object. Upon creation of the Window
object, its associated Navigator
must be
set to a new Navigator
object created in the Window
object's relevant realm.
The navigator
and clientInformation
getter steps are to return
this's associated Navigator
.
interface mixin NavigatorID {
readonly attribute DOMString appCodeName; // constant "Mozilla"
readonly attribute DOMString appName; // constant "Netscape"
readonly attribute DOMString appVersion;
readonly attribute DOMString platform;
readonly attribute DOMString product; // constant "Gecko"
[Exposed=Window] readonly attribute DOMString productSub;
readonly attribute DOMString userAgent;
[Exposed=Window] readonly attribute DOMString vendor;
[Exposed=Window] readonly attribute DOMString vendorSub; // constant ""
};
In certain cases, despite the best efforts of the entire industry, web browsers have bugs and limitations that web authors are forced to work around.
This section defines a collection of attributes that can be used to determine, from script, the kind of user agent in use, in order to work around these issues.
The user agent has a navigator compatibility mode, which is either Chrome, Gecko, or WebKit.
The navigator compatibility
mode constrains the NavigatorID
mixin to the combinations of attribute
values and presence of taintEnabled()
and oscpu
that are known to be compatible with existing web
content.
Client detection should always be limited to detecting known current versions; future versions and unknown versions should always be assumed to be fully compliant.
self.navigator.appCodeName
Returns the string "Mozilla
".
self.navigator.appName
Returns the string "Netscape
".
self.navigator.appVersion
Returns the version of the browser.
self.navigator.platform
Returns the name of the platform.
self.navigator.product
Returns the string "Gecko
".
window.navigator.productSub
Returns either the string "20030107
", or the string "20100101
".
self.navigator.userAgent
Returns the complete `User-Agent
` header.
window.navigator.vendor
Returns either the empty string, the string "Apple Computer, Inc.
",
or the string "Google Inc.
".
window.navigator.vendorSub
Returns the empty string.
appCodeName
Must return the string "Mozilla
".
appName
Must return the string "Netscape
".
appVersion
Must return the appropriate string that starts with "5.0 (
", as
follows:
Let trail be the substring of default
`User-Agent
` value that follows the "Mozilla/
"
prefix.
Return trail.
If trail starts with "5.0 (Windows
", then return "5.0 (Windows)
".
Otherwise, return the prefix of trail up to but not including the first U+003B
(;), concatenated with the character U+0029 RIGHT PARENTHESIS. For example, "5.0 (Macintosh)
", "5.0 (Android 10)
", or "5.0 (X11)
".
platform
Must return a string representing the platform on which the
browser is executing (e.g. "MacIntel
", "Win32
",
"Linux x86_64
", "Linux armv81
") or, for privacy and
compatibility, a string that is commonly returned on another platform.
product
Must return the string "Gecko
".
productSub
Must return the appropriate string from the following list:
The string "20030107
".
The string "20100101
".
userAgent
Must return the default `User-Agent
`
value.
vendor
Must return the appropriate string from the following list:
The string "Google Inc.
".
The empty string.
The string "Apple Computer, Inc.
".
vendorSub
Must return the empty string.
If the navigator compatibility mode is Gecko, then the user agent must also support the following partial interface:
partial interface mixin taintEnabled(); // constant false
[Exposed=Window] readonly attribute DOMString oscpu;
};
{
[Exposed=Window] boolean
The taintEnabled()
method must return false.
The oscpu
attribute's getter must return
either the empty string or a string representing the platform on which the browser is executing,
e.g. "Windows NT 10.0; Win64; x64
", "Linux
x86_64
".
Any information in this API that varies from user to user can be used to profile the user. In fact, if enough such information is available, a user can actually be uniquely identified. For this reason, user agent implementers are strongly urged to include as little information in this API as possible.
interface mixin NavigatorLanguage {
readonly attribute DOMString language;
readonly attribute FrozenArray<DOMString> languages;
};
self.navigator.language
Returns a language tag representing the user's preferred language.
self.navigator.languages
Returns an array of language tags representing the user's preferred languages, with the most preferred language first.
The most preferred language is the one returned by navigator.language
.
A languagechange
event is fired at the
Window
or WorkerGlobalScope
object when the user agent's understanding
of what the user's preferred languages are changes.
language
Must return a valid BCP 47 language tag representing either a plausible language or the user's most preferred language. BCP47
languages
Must return a frozen array of valid BCP 47 language tags representing either one or more plausible languages, or the user's preferred languages, ordered by preference with the most preferred language first. The same object must be returned until the user agent needs to return different values, or values in a different order. BCP47
Whenever the user agent needs to make the navigator.languages
attribute of a Window
or WorkerGlobalScope
object global return a new set of language tags,
the user agent must queue a global task on the DOM manipulation task
source given global to fire an event
named languagechange
at global, and wait
until that task begins to be executed before actually returning a new value.
To determine a plausible language, the user agent should bear in mind the following:
en-US
" is
suggested; if all users of the service use that same value, that reduces the possibility of
distinguishing the users from each other.
To avoid introducing any more fingerprinting vectors, user agents should use the same list for the
APIs defined in this function as for the HTTP `Accept-Language
` header.
interface mixin NavigatorOnLine {
readonly attribute boolean onLine;
};
self.navigator.onLine
Returns false if the user agent is definitely offline (disconnected from the network). Returns true if the user agent might be online.
The events online
and offline
are fired when the value of this attribute changes.
The onLine
attribute must return false if the user agent
will not contact the network when the user follows links or when a script requests a remote page
(or knows that such an attempt would fail), and must return true otherwise.
When the value that would be returned by the navigator.onLine
attribute of a Window
or
WorkerGlobalScope
global changes from true to false, the user agent must
queue a global task on the networking task source given
global to fire an event named offline
at global.
On the other hand, when the value that would be returned by the navigator.onLine
attribute of a Window
or
WorkerGlobalScope
global changes from false to true, the user agent must
queue a global task on the networking task source given
global to fire an event named online
at the Window
or WorkerGlobalScope
object.
This attribute is inherently unreliable. A computer can be connected to a network without having Internet access.
In this example, an indicator is updated as the browser goes online and offline.
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Online status</title>
<script>
function updateIndicator() {
document.getElementById('indicator').textContent = navigator.onLine ? 'online' : 'offline';
}
</script>
</head>
<body onload="updateIndicator()" ononline="updateIndicator()" onoffline="updateIndicator()">
<p>The network is: <span id="indicator">(state unknown)</span>
</body>
</html>
registerProtocolHandler()
methodinterface mixin NavigatorContentUtils {
[SecureContext] undefined registerProtocolHandler(DOMString scheme, USVString url);
[SecureContext] undefined unregisterProtocolHandler(DOMString scheme, USVString url);
};
window.navigator.registerProtocolHandler(scheme, url)
Registers a handler for scheme at url. For example, an online telephone
messaging service could register itself as a handler of the sms:
scheme, so that if the user clicks on such a link, they are given the
opportunity to use that web site. SMS
The string "%s
" in url is used as a placeholder for where
to put the URL of the content to be handled.
Throws a "SecurityError
" DOMException
if the user
agent blocks the registration (this might happen if trying to register as a handler for "http
", for instance).
Throws a "SyntaxError
" DOMException
if the "%s
" string is missing in url.
window.navigator.unregisterProtocolHandler(scheme, url)
Unregisters the handler given by the arguments.
Throws a "SecurityError
" DOMException
if the user
agent blocks the deregistration (this might happen if with invalid schemes, for instance).
Throws a "SyntaxError
" DOMException
if the "%s
" string is missing in url.
The registerProtocolHandler(scheme,
url)
method steps are:
Let (normalizedScheme, normalizedURLString) be the result of running normalize protocol handler parameters with scheme, url, and this's relevant settings object.
In parallel: register a protocol handler for normalizedScheme and normalizedURLString. User agents may, within the constraints described, do whatever they like. A user agent could, for instance, prompt the user and offer the user the opportunity to add the site to a shortlist of handlers, or make the handlers their default, or cancel the request. User agents could also silently collect the information, providing it only when relevant to the user.
User agents should keep track of which sites have registered handlers (even if the user has declined such registrations) so that the user is not repeatedly prompted with the same request.
If the registerProtocolHandler()
automation
mode of this's relevant global object's associated Document
is not "none
", the user agent should first verify that it
is in an automation context (see WebDriver's security considerations). The user
agent should then bypass the above communication of information and gathering of user consent,
and instead do the following based on the value of the registerProtocolHandler()
automation
mode:
autoAccept
"Act as if the user has seen the registration details and accepted the request.
autoReject
"Act as if the user has seen the registration details and rejected the request.
When the user agent uses this handler for a URL inputURL:
Assert: inputURL's scheme is normalizedScheme.
Set the username given inputURL and the empty string.
Set the password given inputURL and the empty string.
Let inputURLString be the serialization of inputURL.
Let encodedURL be the result of running UTF-8 percent-encode on inputURLString using the component percent-encode set.
Let handlerURLString be normalizedURLString.
Replace the first instance of "%s
" in handlerURLString
with encodedURL.
Let resultURL be the result of parsing handlerURLString.
Navigate an appropriate navigable to resultURL.
If the user had visited a site at https://example.com/
that made the
following call:
navigator.registerProtocolHandler('web+soup', 'soup?url=%s')
...and then, much later, while visiting https://www.example.net/
,
clicked on a link such as:
<a href="web+soup:chicken-kïwi">Download our Chicken Kïwi soup!</a>
...then the UA might navigate to the following URL:
https://example.com/soup?url=web+soup:chicken-k%C3%AFwi
This site could then do whatever it is that it does with soup (synthesize it and ship it to the user, or whatever).
This does not define when the handler is used. To some extent, the processing model for navigating across documents defines some cases where it is relevant, but in general user agents may use this information wherever they would otherwise consider handing schemes to native plugins or helper applications.
The unregisterProtocolHandler(scheme,
url)
method steps are:
Let (normalizedScheme, normalizedURLString) be the result of running normalize protocol handler parameters with scheme, url, and this's relevant settings object.
In parallel: unregister the handler described by normalizedScheme and normalizedURLString.
To normalize protocol handler parameters, given a string scheme, a string url, and an environment settings object environment, run these steps:
Set scheme to scheme, converted to ASCII lowercase.
If scheme is neither a safelisted scheme nor a string starting with
"web+
" followed by one or more ASCII
lower alphas, then throw a "SecurityError
"
DOMException
.
This means that including a colon in scheme (as in "mailto:
") will throw.
The following schemes are the safelisted schemes:
bitcoin
ftp
ftps
geo
im
irc
ircs
magnet
mailto
matrix
mms
news
nntp
openpgp4fpr
sftp
sip
sms
smsto
ssh
tel
urn
webcal
wtai
xmpp
This list can be changed. If there are schemes that ought to be added, please send feedback.
If url does not contain "%s
", then throw a
"SyntaxError
" DOMException
.
Let urlRecord be the result of encoding-parsing a URL given url, relative to environment.
If urlRecord is failure, then throw a "SyntaxError
"
DOMException
.
This is forcibly the case if the %s
placeholder is in the
host or port of the URL.
If urlRecord's scheme is not an
HTTP(S) scheme or urlRecord's origin is not same origin with
environment's origin, then throw
a "SecurityError
" DOMException
.
Assert: the result of Is url potentially trustworthy? given
urlRecord is "Potentially Trustworthy
".
Because normalize protocol handler parameters is run within a secure context, this is implied by the same origin condition.
Return (scheme, urlRecord).
The serialization of
urlRecord will by definition not be a valid URL string as it includes
the string "%s
" which is not a valid component in a URL.
Custom scheme handlers can introduce a number of concerns, in particular privacy concerns.
Hijacking all web usage. User agents should not allow schemes that are key to its normal operation, such as an HTTP(S) scheme, to be rerouted through third-party sites. This would allow a user's activities to be trivially tracked, and would allow user information, even in secure connections, to be collected.
Hijacking defaults. User agents are strongly urged to not automatically change any defaults, as this could lead the user to send data to remote hosts that the user is not expecting. New handlers registering themselves should never automatically cause those sites to be used.
Registration spamming. User agents should consider the possibility that a site
will attempt to register a large number of handlers, possibly from multiple domains (e.g., by
redirecting through a series of pages each on a different domain, and each registering a handler
for web+spam:
— analogous practices abusing other web browser
features have been used by pornography web sites for many years). User agents should gracefully
handle such hostile attempts, protecting the user.
Hostile handler metadata. User agents should protect against typical attacks against strings embedded in their interface, for example ensuring that markup or escape characters in such strings are not executed, that null bytes are properly handled, that over-long strings do not cause crashes or buffer overruns, and so forth.
Leaking private data. Web page authors may reference a custom scheme handler using URL data considered private. They might do so with the expectation that the user's choice of handler points to a page inside the organization, ensuring that sensitive data will not be exposed to third parties. However, a user may have registered a handler pointing to an external site, resulting in a data leak to that third party. Implementers might wish to consider allowing administrators to disable custom handlers on certain subdomains, content types, or schemes.
Interface interference. User agents should be prepared to handle intentionally long arguments to the methods. For example, if the user interface exposed consists of an "accept" button and a "deny" button, with the "accept" binding containing the name of the handler, it's important that a long name not cause the "deny" button to be pushed off the screen.
Each Document
has a registerProtocolHandler()
automation
mode. It defaults to "none
", but it also can
be either "autoAccept
" or "autoReject
".
For the purposes of user agent automation and website testing, this standard defines Set RPH Registration Mode WebDriver extension
command. It instructs the user agent to place a Document
into a mode where it
will automatically simulate a user either accepting or rejecting and registration confirmation
prompt dialog.
HTTP Method | URI Template |
---|---|
`POST `
| /session/{session id}/custom-handlers/set-mode
|
The remote end steps are:
If parameters is not a JSON Object, return a WebDriver error with WebDriver error code invalid argument.
Let mode be the result of getting a property named "mode
" from parameters.
If mode is not "autoAccept
", "autoReject
", or "none
", return a WebDriver error with
WebDriver error code invalid argument.
Let document be the current browsing context's active document.
Set document's registerProtocolHandler()
automation
mode to mode.
Return success with data null.
interface mixin NavigatorCookies {
readonly attribute boolean cookieEnabled;
};
window.navigator.cookieEnabled
Returns false if setting a cookie will be ignored, and true otherwise.
The cookieEnabled
attribute must return true if the
user agent attempts to handle cookies according to HTTP State Management Mechanism,
and false if it ignores cookie change requests. COOKIES
window.navigator.pdfViewerEnabled
Returns true if the user agent supports inline viewing of PDF files when navigating to them, or false otherwise. In the latter case, PDF files will be handled by external software.
interface mixin NavigatorPlugins {
[SameObject] readonly attribute PluginArray plugins;
[SameObject] readonly attribute MimeTypeArray mimeTypes;
boolean javaEnabled();
readonly attribute boolean pdfViewerEnabled;
};
[Exposed=Window,
LegacyUnenumerableNamedProperties]
interface PluginArray {
undefined refresh();
readonly attribute unsigned long length;
getter Plugin? item(unsigned long index);
getter Plugin? namedItem(DOMString name);
};
[Exposed=Window,
LegacyUnenumerableNamedProperties]
interface MimeTypeArray {
readonly attribute unsigned long length;
getter MimeType? item(unsigned long index);
getter MimeType? namedItem(DOMString name);
};
[Exposed=Window,
LegacyUnenumerableNamedProperties]
interface Plugin {
readonly attribute DOMString name;
readonly attribute DOMString description;
readonly attribute DOMString filename;
readonly attribute unsigned long length;
getter MimeType? item(unsigned long index);
getter MimeType? namedItem(DOMString name);
};
[Exposed=Window]
interface MimeType {
readonly attribute DOMString type;
readonly attribute DOMString description;
readonly attribute DOMString suffixes;
readonly attribute Plugin enabledPlugin;
};
Although these days detecting PDF viewer support can be done via navigator.pdfViewerEnabled
, for historical reasons,
there are a number of complex and intertwined interfaces that provide the same capability, which
legacy code relies on. This section specifies both the simple modern variant and the complicated
historical one.
Each user agent has a PDF viewer supported boolean, whose value is implementation-defined (and might vary according to user preferences).
This value also impacts the navigation processing model.
Each Window
object has a PDF viewer plugin objects list. If the user
agent's PDF viewer supported is false, then it is the empty list. Otherwise, it is a
list containing five Plugin
objects, whose names are, respectively:
PDF Viewer
"Chrome PDF Viewer
"Chromium PDF Viewer
"Microsoft Edge PDF Viewer
"WebKit built-in PDF
"The values of the above list form the PDF viewer plugin names list.
These names were chosen based on evidence of what websites historically search
for, and thus what is necessary for user agents to expose in order to maintain compatibility with
existing content. They are ordered alphabetically. The "PDF Viewer
" name
was then inserted in the 0th position so that the enabledPlugin
getter could point to a generic plugin
name.
Each Window
object has a PDF viewer mime type objects list. If the user
agent's PDF viewer supported is false, then it is the empty list. Otherwise, it is a
list containing two MimeType
objects, whose types are, respectively:
application/pdf
"text/pdf
"The values of the above list form the PDF viewer mime types list.
Each NavigatorPlugins
object has a plugins array, which is a new
PluginArray
, and a mime types array, which is a new
MimeTypeArray
.
The NavigatorPlugins
mixin's plugins
getter steps are to return this's
plugins array.
The NavigatorPlugins
mixin's mimeTypes
getter steps are to return
this's mime types array.
The NavigatorPlugins
mixin's javaEnabled()
method steps are to return false.
The NavigatorPlugins
mixin's pdfViewerEnabled
getter steps are to return
the user agent's PDF viewer supported.
The PluginArray
interface supports named
properties. If the user agent's PDF viewer supported is true, then they are
the PDF viewer plugin names. Otherwise, they are the empty list.
The PluginArray
interface's namedItem(name)
method steps are:
For each Plugin
plugin of this's relevant global object's PDF viewer
plugin objects: if plugin's name is
name, then return plugin.
Return null.
The PluginArray
interface supports indexed properties. The
supported property indices are the indices of this's
relevant global object's PDF viewer plugin objects.
The PluginArray
interface's item(index)
method steps are:
Let plugins be this's relevant global object's PDF viewer plugin objects.
If index < plugins's size, then return plugins[index].
Return null.
The PluginArray
interface's length
getter steps are to return this's
relevant global object's PDF viewer plugin objects's size.
The PluginArray
interface's refresh()
method steps are to do nothing.
The MimeTypeArray
interface supports named
properties. If the user agent's PDF viewer supported is true, then they are
the PDF viewer mime types. Otherwise, they are the empty list.
The MimeTypeArray
interface's namedItem(name)
method steps are:
For each MimeType
mimeType of
this's relevant global object's PDF viewer mime type
objects: if mimeType's type is
name, then return mimeType.
Return null.
The MimeTypeArray
interface supports indexed properties. The
supported property indices are the indices of this's
relevant global object's PDF viewer mime type objects.
The MimeTypeArray
interface's item(index)
method steps are:
Let mimeTypes be this's relevant global object's PDF viewer mime type objects.
If index < mimeTypes's size, then return mimeTypes[index].
Return null.
The MimeTypeArray
interface's length
getter steps are to return
this's relevant global object's PDF viewer mime type
objects's size.
Each Plugin
object has a name, which is set when the object is created.
The Plugin
interface's name
getter steps are to return this's name.
The Plugin
interface's description
getter steps are to return "Portable Document Format
".
The Plugin
interface's filename
getter steps are to return "internal-pdf-viewer
".
The Plugin
interface supports named properties. If the user agent's PDF viewer
supported is true, then they are the PDF viewer mime types. Otherwise, they
are the empty list.
The Plugin
interface's namedItem(name)
method steps are:
For each MimeType
mimeType of
this's relevant global object's PDF viewer mime type
objects: if mimeType's type is
name, then return mimeType.
Return null.
The Plugin
interface supports indexed properties.
The supported property indices are the indices of this's
relevant global object's PDF viewer mime type objects.
The Plugin
interface's item(index)
method steps are:
Let mimeTypes be this's relevant global object's PDF viewer mime type objects.
If index < mimeType's size, then return mimeTypes[index].
Return null.
The Plugin
interface's length
getter steps are to return
this's relevant global object's PDF viewer mime type
objects's size.
Each MimeType
object has a type, which
is set when the object is created.
The MimeType
interface's type
getter steps are to return this's type.
The MimeType
interface's description
getter steps are to return "Portable Document Format
".
The MimeType
interface's suffixes
getter steps are to return "pdf
".
The MimeType
interface's enabledPlugin
getter steps are to return
this's relevant global object's PDF viewer plugin
objects[0] (i.e., the generic "PDF Viewer
" one).
[Exposed=(Window,Worker), Serializable, Transferable]
interface ImageBitmap {
readonly attribute unsigned long width;
readonly attribute unsigned long height;
undefined close();
};
typedef (CanvasImageSource or
Blob or
ImageData) ImageBitmapSource;
enum ImageOrientation { "from-image", "flipY" };
enum PremultiplyAlpha { "none", "premultiply", "default" };
enum ColorSpaceConversion { "none", "default" };
enum ResizeQuality { "pixelated", "low", "medium", "high" };
dictionary ImageBitmapOptions {
ImageOrientation imageOrientation = "from-image";
PremultiplyAlpha premultiplyAlpha = "default";
ColorSpaceConversion colorSpaceConversion = "default";
[EnforceRange] unsigned long resizeWidth;
[EnforceRange] unsigned long resizeHeight;
ResizeQuality resizeQuality = "low";
};
An ImageBitmap
object represents a bitmap image that can be painted to a canvas
without undue latency.
The exact judgement of what is undue latency of this is left up to the implementer, but in general if making use of the bitmap requires network I/O, or even local disk I/O, then the latency is probably undue; whereas if it only requires a blocking read from a GPU or system RAM, the latency is probably acceptable.
promise = self.createImageBitmap(image [, options ])
promise = self.createImageBitmap(image, sx, sy, sw, sh [, options ])
Takes image, which can be an img
element, an SVG
image
element, a video
element, a canvas
element,
a Blob
object, an ImageData
object, or another
ImageBitmap
object, and returns a promise that is resolved when a new
ImageBitmap
is created.
If no ImageBitmap
object can be constructed, for example because the provided
image data is not actually an image, then the promise is rejected instead.
If sx, sy, sw, and sh arguments are provided, the source image is cropped to the given pixels, with any pixels missing in the original replaced by transparent black. These coordinates are in the source image's pixel coordinate space, not in CSS pixels.
If options is provided, the ImageBitmap
object's bitmap data is
modified according to options. For example, if the premultiplyAlpha
option is set to "premultiply
", the bitmap data's color channels are premultiplied by its alpha channel.
Rejects the promise with an "InvalidStateError
"
DOMException
if the source image is not in a valid state (e.g., an img
element that hasn't loaded successfully, an ImageBitmap
object whose
[[Detached]] internal slot value is true, an ImageData
object whose
data
attribute value's [[ViewedArrayBuffer]] internal
slot is detached, or a Blob
whose data cannot be interpreted as a bitmap
image).
Rejects the promise with a "SecurityError
"
DOMException
if the script is not allowed to access the image data of the source
image (e.g. a video
that is CORS-cross-origin, or a
canvas
being drawn on by a script in a worker from another
origin).
imageBitmap.close()
Releases imageBitmap's underlying bitmap data.
imageBitmap.width
Returns the natural width of the image, in CSS pixels.
imageBitmap.height
Returns the natural height of the image, in CSS pixels.
An ImageBitmap
object whose [[Detached]] internal slot value
is false always has associated bitmap data,
with a width and a height. However, it is possible for this data to be corrupted. If an
ImageBitmap
object's media data can be decoded without errors, it is said to be fully decodable.
An ImageBitmap
object's bitmap has an origin-clean flag, which indicates whether the
bitmap is tainted by content from a different origin. The flag is initially set to
true and may be changed to false by the steps of createImageBitmap()
.
ImageBitmap
objects are serializable objects and transferable
objects.
Their serialization steps, given value and serialized, are:
If value's origin-clean
flag is not set, then throw a "DataCloneError
"
DOMException
.
Set serialized.[[BitmapData]] to a copy of value's bitmap data.
Their deserialization steps, given serialized, value, and targetRealm, are:
Set value's bitmap data to serialized.[[BitmapData]].
Their transfer steps, given value and dataHolder, are:
If value's origin-clean
flag is not set, then throw a "DataCloneError
"
DOMException
.
Set dataHolder.[[BitmapData]] to value's bitmap data.
Unset value's bitmap data.
Their transfer-receiving steps, given dataHolder and value, are:
Set value's bitmap data to dataHolder.[[BitmapData]].
The createImageBitmap(image,
options)
and createImageBitmap(image
sx, sy, sw, sh, options)
methods,
when invoked, must run these steps:
If either sw or sh is given and is 0, then return a promise
rejected with a RangeError
.
If either options's resizeWidth
or options's
resizeHeight
is present and is 0, then
return a promise rejected with an "InvalidStateError
"
DOMException
.
Check the usability of the image argument. If this throws an
exception or returns bad, then return a promise rejected with an
"InvalidStateError
" DOMException
.
Let p be a new promise.
Let imageBitmap be a new ImageBitmap
object.
Switch on image:
img
image
If image's media data has no natural dimensions (e.g., it's
a vector graphic with no specified content size) and either options's resizeWidth
or options's resizeHeight
is not present, then return
a promise rejected with an "InvalidStateError
"
DOMException
.
If image's media data has no natural dimensions (e.g., it's
a vector graphic with no specified content size), it should be rendered to a bitmap of the
size specified by the resizeWidth
and the resizeHeight
options.
Set imageBitmap's bitmap data to a copy of image's media data, cropped to the source rectangle with formatting. If this is an animated image, imageBitmap's bitmap data must only be taken from the default image of the animation (the one that the format defines is to be used when animation is not supported or is disabled), or, if there is no such image, the first frame of the animation.
If image is not origin-clean, then set the origin-clean flag of imageBitmap's bitmap to false.
Run this step in parallel:
Resolve p with imageBitmap.
video
If image's networkState
attribute is NETWORK_EMPTY
, then return
a promise rejected with an "InvalidStateError
"
DOMException
.
Set imageBitmap's bitmap data to a copy of the frame at the current playback position, at the media resource's natural width and natural height (i.e., after any aspect-ratio correction has been applied), cropped to the source rectangle with formatting.
If image is not origin-clean, then set the origin-clean flag of imageBitmap's bitmap to false.
Run this step in parallel:
Resolve p with imageBitmap.
canvas
Set imageBitmap's bitmap data to a copy of image's bitmap data, cropped to the source rectangle with formatting.
Set the origin-clean flag of the imageBitmap's bitmap to the same value as the origin-clean flag of image's bitmap.
Run this step in parallel:
Resolve p with imageBitmap.
Blob
Run these steps in parallel:
Let imageData be the result of reading image's data. If an error occurs during reading of the object, then reject
p with an "InvalidStateError
" DOMException
and abort these steps.
Apply the image sniffing rules to
determine the file format of imageData, with MIME type of image (as
given by image's type
attribute) giving the
official type.
If imageData is not in a supported image file format (e.g., it's not an
image at all), or if imageData is corrupted in some fatal way such that the image
dimensions cannot be obtained (e.g., a vector graphic with no natural size), then reject
p with an "InvalidStateError
" DOMException
and abort these steps.
Set imageBitmap's bitmap data to imageData, cropped to the source rectangle with formatting. If this is an animated image, imageBitmap's bitmap data must only be taken from the default image of the animation (the one that the format defines is to be used when animation is not supported or is disabled), or, if there is no such image, the first frame of the animation.
Resolve p with imageBitmap.
ImageData
Let buffer be image's data
attribute value's [[ViewedArrayBuffer]] internal
slot.
If IsDetachedBuffer(buffer) is true, then return a
promise rejected with an "InvalidStateError
"
DOMException
.
Set imageBitmap's bitmap data to image's image data, cropped to the source rectangle with formatting.
Run this step in parallel:
Resolve p with imageBitmap.
ImageBitmap
Set imageBitmap's bitmap data to a copy of image's bitmap data, cropped to the source rectangle with formatting.
Set the origin-clean flag of imageBitmap's bitmap to the same value as the origin-clean flag of image's bitmap.
Run this step in parallel:
Resolve p with imageBitmap.
VideoFrame
Set imageBitmap's bitmap data to a copy of image's visible pixel data, cropped to the source rectangle with formatting.
Run this step in parallel:
Resolve p with imageBitmap.
Return p.
When the steps above require that the user agent crop bitmap data to the source rectangle with formatting, the user agent must run the following steps:
Let input be the bitmap data being transformed.
If sx, sy, sw and sh are specified, let sourceRectangle be a rectangle whose corners are the four points (sx, sy), (sx+sw, sy), (sx+sw, sy+sh), (sx, sy+sh). Otherwise, let sourceRectangle be a rectangle whose corners are the four points (0, 0), (width of input, 0), (width of input, height of input), (0, height of input).
If either sw or sh are negative, then the top-left corner of this rectangle will be to the left or above the (sx, sy) point.
Let outputWidth be determined as follows:
resizeWidth
member of
options is specifiedresizeWidth
member of optionsresizeWidth
member of
options is not specified, but the resizeHeight
member is specifiedresizeHeight
member of options,
divided by the height of sourceRectangle, rounded up to the nearest integerresizeWidth
nor resizeHeight
are specifiedLet outputHeight be determined as follows:
resizeHeight
member of
options is specifiedresizeHeight
member of optionsresizeHeight
member of
options is not specified, but the resizeWidth
member is specifiedresizeWidth
member of options,
divided by the width of sourceRectangle, rounded up to the nearest integerresizeWidth
nor resizeHeight
are specifiedPlace input on an infinite transparent black grid plane, positioned so that its top left corner is at the origin of the plane, with the x-coordinate increasing to the right, and the y-coordinate increasing down, and with each pixel in the input image data occupying a cell on the plane's grid.
Let output be the rectangle on the plane denoted by sourceRectangle.
Scale output to the size specified by outputWidth and
outputHeight. The user agent should use the value of the resizeQuality
option to guide the
choice of scaling algorithm.
If the value of the imageOrientation
member of
options is "flipY
", output must be flipped
vertically, disregarding any image orientation metadata of the source (such as EXIF metadata),
if any. EXIF
If the value is "from-image
", no extra step is needed.
There used to be a "none
" enum value. It was
renamed to "from-image
". In the future,
"none
" will be added back
with a different meaning.
If image is an img
element or a Blob
object, let
val be the value of the colorSpaceConversion
member
of options, and then run these substeps:
If val is "default
",
the color space conversion behavior is implementation-specific, and should be chosen according
to the default color space that the implementation uses for drawing images onto the canvas.
If val is "none
", output must be decoded
without performing any color space conversions. This means that the image decoding algorithm
must ignore color profile metadata embedded in the source data as well as the display device
color profile.
Let val be the value of premultiplyAlpha
member of
options, and then run these substeps:
If val is "default
", the alpha premultiplication
behavior is implementation-specific, and should be chosen according to implementation deems
optimal for drawing images onto the canvas.
If val is "premultiply
", the output that
is not premultiplied by alpha must have its color components multiplied by alpha and that is premultiplied by alpha
must be left untouched.
If val is "none
", the output that is not
premultiplied by alpha must be left untouched and that is premultiplied by alpha must have its
color components divided by alpha.
Return output.
The close()
method steps are:
Set this's [[Detached]] internal slot value to true.
Unset this's bitmap data.
The width
getter steps are:
If this's [[Detached]] internal slot's value is true, then return 0.
Return this's width, in CSS pixels.
The height
getter steps are:
If this's [[Detached]] internal slot's value is true, then return 0.
Return this's height, in CSS pixels.
The ResizeQuality
enumeration is used to express a preference for the
interpolation quality to use when scaling images.
The "pixelated
" value indicates a preference for
scaling the image to preserve the pixelation of the original as much as possible, with minor
smoothing as necessary to avoid distorting the image when the target size is not a clean multiple
of the original.
To implement "pixelated
", for each axis
independently, first determine the integer multiple of its natural size that puts it closest to
the target size and is greater than zero. Scale it to this integer-multiple-size using nearest
neighbor, then scale it the rest of the way to the target size using bilinear interpolation.
The "low
"
value indicates a preference for a low level of image interpolation quality. Low-quality image
interpolation may be more computationally efficient than higher settings.
The "medium
" value indicates a preference for a medium
level of image interpolation quality.
The "high
" value indicates a preference for a high level
of image interpolation quality. High-quality image interpolation may be more computationally
expensive than lower settings.
Bilinear scaling is an example of a relatively fast, lower-quality image-smoothing
algorithm. Bicubic or Lanczos scaling are examples of image-scaling algorithms that produce
higher-quality output. This specification does not mandate that specific interpolation algorithms
be used, except for "pixelated
" as described
above.
Using this API, a sprite sheet can be precut and prepared:
var sprites = {};
function loadMySprites() {
var image = new Image();
image.src = 'mysprites.png';
var resolver;
var promise = new Promise(function (arg) { resolver = arg });
image.onload = function () {
resolver(Promise.all([
createImageBitmap(image, 0, 0, 40, 40).then(function (image) { sprites.person = image }),
createImageBitmap(image, 40, 0, 40, 40).then(function (image) { sprites.grass = image }),
createImageBitmap(image, 80, 0, 40, 40).then(function (image) { sprites.tree = image }),
createImageBitmap(image, 0, 40, 40, 40).then(function (image) { sprites.hut = image }),
createImageBitmap(image, 40, 40, 40, 40).then(function (image) { sprites.apple = image }),
createImageBitmap(image, 80, 40, 40, 40).then(function (image) { sprites.snake = image })
]));
};
return promise;
}
function runDemo() {
var canvas = document.querySelector('canvas#demo');
var context = canvas.getContext('2d');
context.drawImage(sprites.tree, 30, 10);
context.drawImage(sprites.snake, 70, 10);
}
loadMySprites().then(runDemo);
Some objects include the AnimationFrameProvider
interface mixin.
callback FrameRequestCallback = undefined (DOMHighResTimeStamp time);
interface mixin AnimationFrameProvider {
unsigned long requestAnimationFrame(FrameRequestCallback callback);
undefined cancelAnimationFrame(unsigned long handle);
};
Window includes AnimationFrameProvider;
DedicatedWorkerGlobalScope includes AnimationFrameProvider;
Each AnimationFrameProvider
object also has a target object that stores the
provider's internal state. It is defined as follows:
AnimationFrameProvider
is a Window
Window
's associated
Document
AnimationFrameProvider
is a DedicatedWorkerGlobalScope
DedicatedWorkerGlobalScope
Each target object has a map of animation frame callbacks, which is an ordered map that must be initially empty, and an animation frame callback identifier, which is a number that must initially be zero.
An AnimationFrameProvider
provider is considered supported if any of the following are
true:
provider is a Window
.
provider's owner set contains
a Document
object.
Any of the DedicatedWorkerGlobalScope
objects in provider's
owner set are supported.
The requestAnimationFrame(callback)
method steps are:
If this is not supported, then throw a
"NotSupportedError
" DOMException
.
Let target be this's target object.
Increment target's animation frame callback identifier by one, and let handle be the result.
Let callbacks be target's map of animation frame callbacks.
Set callbacks[handle] to callback.
Return handle.
The cancelAnimationFrame(handle)
method steps are:
If this is not supported, then throw a
"NotSupportedError
" DOMException
.
Let callbacks be this's target object's map of animation frame callbacks.
Remove callbacks[handle].
To run the animation frame callbacks for a target object target with a timestamp now:
Let callbacks be target's map of animation frame callbacks.
Let callbackHandles be the result of getting the keys of callbacks.
For each handle in callbackHandles, if handle exists in callbacks:
Let callback be callbacks[handle].
Remove callbacks[handle].
Invoke callback with «
now » and "report
".
Inside workers, requestAnimationFrame()
can be
used together with an OffscreenCanvas
transferred from a canvas
element. First, in the document, transfer control to the worker:
const offscreenCanvas = document.getElementById("c").transferControlToOffscreen();
worker.postMessage(offscreenCanvas, [offscreenCanvas]);
Then, in the worker, the following code will draw a rectangle moving from left to right:
let ctx, pos = 0;
function draw(dt) {
ctx.clearRect(0, 0, 100, 100);
ctx.fillRect(pos, 0, 10, 10);
pos += 10 * dt;
requestAnimationFrame(draw);
}
self.onmessage = function(ev) {
const transferredCanvas = ev.data;
ctx = transferredCanvas.getContext("2d");
draw();
};
The WebSocket
interface used
to be defined here. It is now defined in WebSockets. WEBSOCKETS
MessageEvent
interfaceMessages in server-sent events, cross-document messaging,
channel messaging, broadcast channels, and WebSockets use
the MessageEvent
interface for their message
events: WEBSOCKETS
[Exposed=(Window,Worker,AudioWorklet)]
interface MessageEvent : Event {
constructor(DOMString type, optional MessageEventInit eventInitDict = {});
readonly attribute any data;
readonly attribute USVString origin;
readonly attribute DOMString lastEventId;
readonly attribute MessageEventSource? source;
readonly attribute FrozenArray<MessagePort> ports;
undefined initMessageEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any data = null, optional USVString origin = "", optional DOMString lastEventId = "", optional MessageEventSource? source = null, optional sequence<MessagePort> ports = []);
};
dictionary MessageEventInit : EventInit {
any data = null;
USVString origin = "";
DOMString lastEventId = "";
MessageEventSource? source = null;
sequence<MessagePort> ports = [];
};
typedef (WindowProxy or MessagePort or ServiceWorker) MessageEventSource;
event.data
Returns the data of the message.
event.origin
Returns the origin of the message, for server-sent events and cross-document messaging.
event.lastEventId
Returns the last event ID string, for server-sent events.
event.source
Returns the WindowProxy
of the source window, for cross-document
messaging, and the MessagePort
being attached, in the connect
event fired at
SharedWorkerGlobalScope
objects.
event.ports
Returns the MessagePort
array sent with the message, for cross-document
messaging and channel messaging.
The data
attribute must return the value it was initialized to. It represents the message being sent.
The origin
attribute must return the value it was
initialized to. It represents, in server-sent events and cross-document
messaging, the origin of the document that
sent the message (typically the scheme, hostname, and port of the document, but not its path or
fragment).
The lastEventId
attribute must return the value it
was initialized to. It represents, in server-sent events, the last event ID string of the event source.
The source
attribute must return the value it was
initialized to. It represents, in cross-document messaging, the
WindowProxy
of the browsing context of the Window
object
from which the message came; and in the connect
events used by shared workers, the newly connecting
MessagePort
.
The ports
attribute must return the value it was initialized to. It represents, in cross-document
messaging and channel messaging, the MessagePort
array being
sent.
The initMessageEvent(type, bubbles,
cancelable, data, origin, lastEventId,
source, ports)
method must initialize the event in a manner
analogous to the similarly-named initEvent()
method.
DOM
Various APIs (e.g., WebSocket
, EventSource
) use the
MessageEvent
interface for their message
event
without using the MessagePort
API.
To enable servers to push data to web pages over HTTP or using dedicated server-push protocols,
this specification introduces the EventSource
interface.
Using this API consists of creating an EventSource
object and registering an event
listener.
var source = new EventSource('updates.cgi');
source.onmessage = function (event) {
alert(event.data);
};
On the server-side, the script ("updates.cgi
" in this case) sends
messages in the following form, with the text/event-stream
MIME type:
data: This is the first message. data: This is the second message, it data: has two lines. data: This is the third message.
Authors can separate events by using different event types. Here is a stream that has two event types, "add" and "remove":
event: add data: 73857293 event: remove data: 2153 event: add data: 113411
The script to handle such a stream would look like this (where addHandler
and removeHandler
are functions that take one argument, the event):
var source = new EventSource('updates.cgi');
source.addEventListener('add', addHandler, false);
source.addEventListener('remove', removeHandler, false);
The default event type is "message".
Event streams are always decoded as UTF-8. There is no way to specify another character encoding.
Event stream requests can be redirected using HTTP 301 and 307 redirects as with normal HTTP requests. Clients will reconnect if the connection is closed; a client can be told to stop reconnecting using the HTTP 204 No Content response code.
Using this API rather than emulating it using XMLHttpRequest
or an
iframe
allows the user agent to make better use of network resources in cases where
the user agent implementer and the network operator are able to coordinate in advance. Amongst
other benefits, this can result in significant savings in battery life on portable devices. This
is discussed further in the section below on connectionless
push.
EventSource
interface[Exposed=(Window,Worker)]
interface EventSource : EventTarget {
constructor(USVString url, optional EventSourceInit eventSourceInitDict = {});
readonly attribute USVString url;
readonly attribute boolean withCredentials;
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2;
readonly attribute unsigned short readyState;
// networking
attribute EventHandler onopen;
attribute EventHandler onmessage;
attribute EventHandler onerror;
undefined close();
};
dictionary EventSourceInit {
boolean withCredentials = false;
};
Each EventSource
object has the following associated with it:
A url (a URL record). Set during construction.
A request. This must initially be null.
A reconnection time, in milliseconds. This must initially be an implementation-defined value, probably in the region of a few seconds.
A last event ID string. This must initially be the empty string.
Apart from url these are not currently exposed on
the EventSource
object.
source = new EventSource(
url [, { withCredentials:
true } ])
Creates a new EventSource
object.
url is a string giving the URL that will provide the event stream.
Setting withCredentials
to true
will set the credentials mode for
connection requests to url to "include
".
source.close()
Aborts any instances of the fetch algorithm started for
this EventSource
object, and sets the readyState
attribute to CLOSED
.
source.url
Returns the URL providing the event stream.
source.withCredentials
Returns true if the credentials mode
for connection requests to the URL providing the event
stream is set to "include
", and false otherwise.
source.readyState
Returns the state of this EventSource
object's connection. It can have the
values described below.
The EventSource(url, eventSourceInitDict)
constructor, when invoked, must run these steps:
Let ev be a new EventSource
object.
Let settings be ev's relevant settings object.
Let urlRecord be the result of encoding-parsing a URL given url, relative to settings.
If urlRecord is failure, then throw a "SyntaxError
"
DOMException
.
Set ev's url to urlRecord.
Let corsAttributeState be Anonymous.
If the value of eventSourceInitDict's withCredentials
member is true, then set
corsAttributeState to Use
Credentials and set ev's withCredentials
attribute to true.
Let request be the result of creating a potential-CORS request given urlRecord, the empty string, and corsAttributeState.
Set request's client to settings.
User agents may set (`Accept
`, `text/event-stream
`) in request's
header list.
Set request's cache mode to
"no-store
".
Set request's initiator
type to "other
".
Set ev's request to request.
Let processEventSourceEndOfBody given response res be the following step: if res is not a network error, then reestablish the connection.
Fetch request, with processResponseEndOfBody set to processEventSourceEndOfBody and processResponse set to the following steps given response res:
If res is an aborted network error, then fail the connection.
Otherwise, if res is a network error, then reestablish the connection, unless the user agent knows that to be futile, in which case the user agent may fail the connection.
Otherwise, if res's status is
not 200, or if res's `Content-Type
` is not
`text/event-stream
`, then fail the connection.
Otherwise, announce the connection and interpret res's body line by line.
Return ev.
The url
attribute's getter must return the serialization of
this EventSource
object's url.
The withCredentials
attribute must return the
value to which it was last initialized. When the object is created, it must be initialized to
false.
The readyState
attribute represents the state of the
connection. It can have the following values:
CONNECTING
(numeric value 0)OPEN
(numeric value 1)CLOSED
(numeric value 2)close()
method was invoked.When the object is created its readyState
must
be set to CONNECTING
(0). The rules given below
for handling the connection define when the value changes.
The close()
method must abort any instances of the fetch algorithm started
for this EventSource
object, and must set the readyState
attribute to CLOSED
.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by all objects implementing the
EventSource
interface:
Event handler | Event handler event type |
---|---|
onopen | open
|
onmessage | message
|
onerror | error
|
When a user agent is to announce the connection, the user agent must queue a
task which, if the readyState
attribute is
set to a value other than CLOSED
, sets the readyState
attribute to OPEN
and fires an
event named open
at the EventSource
object.
When a user agent is to reestablish the connection, the user agent must run the following steps. These steps are run in parallel, not as part of a task. (The tasks that it queues, of course, are run like normal tasks and not themselves in parallel.)
Queue a task to run the following steps:
If the readyState
attribute is set to
CLOSED
, abort the task.
Set the readyState
attribute to CONNECTING
.
Fire an event named error
at the EventSource
object.
Wait a delay equal to the reconnection time of the event source.
Optionally, wait some more. In particular, if the previous attempt failed, then user agents might introduce an exponential backoff delay to avoid overloading a potentially already overloaded server. Alternatively, if the operating system has reported that there is no network connectivity, user agents might wait for the operating system to announce that the network connection has returned before retrying.
Wait until the aforementioned task has run, if it has not yet run.
Queue a task to run the following steps:
If the EventSource
object's readyState
attribute is not set to CONNECTING
, then return.
Let request be the EventSource
object's request.
If the EventSource
object's last event ID string is not the empty
string, then:
Let lastEventIDValue be the EventSource
object's last event ID string, encoded as UTF-8.
Set (`Last-Event-ID
`,
lastEventIDValue) in request's header list.
Fetch request and process the response obtained in this fashion, if any, as described earlier in this section.
When a user agent is to fail the connection, the user agent must queue a
task which, if the readyState
attribute is
set to a value other than CLOSED
, sets the readyState
attribute to CLOSED
and fires an
event named error
at the EventSource
object.
Once the user agent has failed the connection,
it does not attempt to reconnect.
The task source for any tasks that are queued by EventSource
objects is the remote event
task source.
Last-Event-ID
` headerThe Last-Event-ID
` HTTP request header reports an
EventSource
object's last event ID
string to the server when the user agent is to reestablish the connection.
See whatwg/html issue #7363 to define the value space better. It is essentially any UTF-8 encoded string, that does not contain U+0000 NULL, U+000A LF, or U+000D CR.
This event stream format's MIME type is text/event-stream
.
The event stream format is as described by the stream
production of the
following ABNF, the character set for which is Unicode. ABNF
stream = [ bom ] *event
event = *( comment / field ) end-of-line
comment = colon *any-char end-of-line
field = 1*name-char [ colon [ space ] *any-char ] end-of-line
end-of-line = ( cr lf / cr / lf )
; characters
lf = %x000A ; U+000A LINE FEED (LF)
cr = %x000D ; U+000D CARRIAGE RETURN (CR)
space = %x0020 ; U+0020 SPACE
colon = %x003A ; U+003A COLON (:)
bom = %xFEFF ; U+FEFF BYTE ORDER MARK
name-char = %x0000-0009 / %x000B-000C / %x000E-0039 / %x003B-10FFFF
; a scalar value other than U+000A LINE FEED (LF), U+000D CARRIAGE RETURN (CR), or U+003A COLON (:)
any-char = %x0000-0009 / %x000B-000C / %x000E-10FFFF
; a scalar value other than U+000A LINE FEED (LF) or U+000D CARRIAGE RETURN (CR)
Event streams in this format must always be encoded as UTF-8. ENCODING
Lines must be separated by either a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair, a single U+000A LINE FEED (LF) character, or a single U+000D CARRIAGE RETURN (CR) character.
Since connections established to remote servers for such resources are expected to be long-lived, UAs should ensure that appropriate buffering is used. In particular, while line buffering with lines are defined to end with a single U+000A LINE FEED (LF) character is safe, block buffering or line buffering with different expected line endings can cause delays in event dispatch.
Streams must be decoded using the UTF-8 decode algorithm.
The UTF-8 decode algorithm strips one leading UTF-8 Byte Order Mark (BOM), if any.
The stream must then be parsed by reading everything line by line, with a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair, a single U+000A LINE FEED (LF) character not preceded by a U+000D CARRIAGE RETURN (CR) character, and a single U+000D CARRIAGE RETURN (CR) character not followed by a U+000A LINE FEED (LF) character being the ways in which a line can end.
When a stream is parsed, a data buffer, an event type buffer, and a last event ID buffer must be associated with it. They must be initialized to the empty string.
Lines must be processed, in the order they are received, as follows:
Dispatch the event, as defined below.
Ignore the line.
Collect the characters on the line before the first U+003A COLON character (:), and let field be that string.
Collect the characters on the line after the first U+003A COLON character (:), and let value be that string. If value starts with a U+0020 SPACE character, remove it from value.
Process the field using the steps described below, using field as the field name and value as the field value.
Process the field using the steps described below, using the whole line as the field name, and the empty string as the field value.
Once the end of the file is reached, any pending data must be discarded. (If the file ends in the middle of an event, before the final empty line, the incomplete event is not dispatched.)
The steps to process the field given a field name and a field value depend on the field name, as given in the following list. Field names must be compared literally, with no case folding performed.
Set the event type buffer to field value.
Append the field value to the data buffer, then append a single U+000A LINE FEED (LF) character to the data buffer.
If the field value does not contain U+0000 NULL, then set the last event ID buffer to the field value. Otherwise, ignore the field.
If the field value consists of only ASCII digits, then interpret the field value as an integer in base ten, and set the event stream's reconnection time to that integer. Otherwise, ignore the field.
The field is ignored.
When the user agent is required to dispatch the event, the user agent must process the data buffer, the event type buffer, and the last event ID buffer using steps appropriate for the user agent.
For web browsers, the appropriate steps to dispatch the event are as follows:
Set the last event ID string of the event source to the value of the last event ID buffer. The buffer does not get reset, so the last event ID string of the event source remains set to this value until the next time it is set by the server.
If the data buffer is an empty string, set the data buffer and the event type buffer to the empty string and return.
If the data buffer's last character is a U+000A LINE FEED (LF) character, then remove the last character from the data buffer.
Let event be the result of creating an event using
MessageEvent
, in the relevant realm of
the EventSource
object.
Initialize event's type
attribute to
"message
", its data
attribute to data, its origin
attribute to the serialization of the origin of the
event stream's final URL (i.e., the URL after redirects), and its lastEventId
attribute to the last event ID string of the event
source.
If the event type buffer has a value other than the empty string, change the type of the newly created event to equal the value of the event type buffer.
Set the data buffer and the event type buffer to the empty string.
Queue a task which, if the readyState
attribute is set to a value other than CLOSED
, dispatches the newly created event at the
EventSource
object.
If an event doesn't have an "id" field, but an earlier event did set the event
source's last event ID string, then the
event's lastEventId
field will be set to the
value of whatever the last seen "id" field was.
For other user agents, the appropriate steps to dispatch the event are implementation dependent, but at a minimum they must set the data and event type buffers to the empty string before returning.
The following event stream, once followed by a blank line:
data: YHOO data: +2 data: 10
...would cause an event message
with the interface
MessageEvent
to be dispatched on the EventSource
object. The event's
data
attribute would contain the string "YHOO\n+2\n10
" (where "\n
" represents a newline).
This could be used as follows:
var stocks = new EventSource("https://stocks.example.com/ticker.php");
stocks.onmessage = function (event) {
var data = event.data.split('\n');
updateStocks(data[0], data[1], data[2]);
};
...where updateStocks()
is a function defined as:
function updateStocks(symbol, delta, value) { ... }
...or some such.
The following stream contains four blocks. The first block has just a comment, and will fire
nothing. The second block has two fields with names "data" and "id" respectively; an event will
be fired for this block, with the data "first event", and will then set the last event ID to "1"
so that if the connection died between this block and the next, the server would be sent a
`Last-Event-ID
` header with the value `1
`. The third block
fires an event with data "second event", and also has an "id" field, this time with no value,
which resets the last event ID to the empty string (meaning no `Last-Event-ID
`
header will now be sent in the event of a reconnection being attempted). Finally, the last block
just fires an event with the data " third event" (with a single leading space
character). Note that the last still has to end with a blank line, the end of the stream is not
enough to trigger the dispatch of the last event.
: test stream data: first event id: 1 data:second event id data: third event
The following stream fires two events:
data data data data:
The first block fires events with the data set to the empty string, as would the last block if it was followed by a blank line. The middle block fires an event with the data set to a single newline character. The last block is discarded because it is not followed by a blank line.
The following stream fires two identical events:
data:test data: test
This is because the space after the colon is ignored if present.
Legacy proxy servers are known to, in certain cases, drop HTTP connections after a short timeout. To protect against such proxy servers, authors can include a comment line (one starting with a ':' character) every 15 seconds or so.
Authors wishing to relate event source connections to each other or to specific documents previously served might find that relying on IP addresses doesn't work, as individual clients can have multiple IP addresses (due to having multiple proxy servers) and individual IP addresses can have multiple clients (due to sharing a proxy server). It is better to include a unique identifier in the document when it is served and then pass that identifier as part of the URL when the connection is established.
Authors are also cautioned that HTTP chunking can have unexpected negative effects on the reliability of this protocol, in particular if the chunking is done by a different layer unaware of the timing requirements. If this is a problem, chunking can be disabled for serving event streams.
Clients that support HTTP's per-server connection limitation might run into trouble when
opening multiple pages from a site if each page has an EventSource
to the same
domain. Authors can avoid this using the relatively complex mechanism of using unique domain names
per connection, or by allowing the user to enable or disable the EventSource
functionality on a per-page basis, or by sharing a single EventSource
object using a
shared worker.
User agents running in controlled environments, e.g. browsers on mobile handsets tied to specific carriers, may offload the management of the connection to a proxy on the network. In such a situation, the user agent for the purposes of conformance is considered to include both the handset software and the network proxy.
For example, a browser on a mobile device, after having established a connection, might detect that it is on a supporting network and request that a proxy server on the network take over the management of the connection. The timeline for such a situation might be as follows:
EventSource
constructor.EventSource
constructor (possibly
including a `Last-Event-ID
` HTTP header, etc.).This can reduce the total data usage, and can therefore result in considerable power savings.
As well as implementing the existing API and text/event-stream
wire format as
defined by this specification and in more distributed ways as described above, formats of event
framing defined by other applicable specifications may be supported. This
specification does not define how they are to be parsed or processed.
While an EventSource
object's readyState
is CONNECTING
, and the object has one or more event
listeners registered for open
, message
or error
events, there must
be a strong reference from the Window
or WorkerGlobalScope
object that
the EventSource
object's constructor was invoked from to the EventSource
object itself.
While an EventSource
object's readyState
is OPEN
, and the object has one or more event listeners
registered for message
or error
events, there must be a strong reference from the
Window
or WorkerGlobalScope
object that the EventSource
object's constructor was invoked from to the EventSource
object itself.
While there is a task queued by an EventSource
object on the remote event
task source, there must be a strong reference from the Window
or
WorkerGlobalScope
object that the EventSource
object's constructor was
invoked from to that EventSource
object.
If a user agent is to forcibly close an
EventSource
object (this happens when a Document
object goes away
permanently), the user agent must abort any instances of the fetch algorithm started for this EventSource
object,
and must set the readyState
attribute to CLOSED
.
If an EventSource
object is garbage collected while its connection is still open,
the user agent must abort any instance of the fetch algorithm
opened by this EventSource
.
User agents are strongly urged to provide detailed diagnostic information about
EventSource
objects and their related network connections in their development
consoles, to aid authors in debugging code using this API.
For example, a user agent could have a panel displaying all the EventSource
objects a page has created, each listing the constructor's arguments, whether there was a network
error, what the CORS status of the connection is and what headers were sent by the client and
received from the server to lead to that status, the messages that were received and how they were
parsed, and so forth.
Implementations are especially encouraged to report detailed information to their development
consoles whenever an error
event is fired, since little to no
information can be made available in the events themselves.
Web browsers, for security and privacy reasons, prevent documents in different domains from affecting each other; that is, cross-site scripting is disallowed.
While this is an important security feature, it prevents pages from different domains from communicating even when those pages are not hostile. This section introduces a messaging system that allows documents to communicate with each other regardless of their source domain, in a way designed to not enable cross-site scripting attacks.
The postMessage()
API can be used as a tracking
vector.
For example, if document A contains an iframe
element that contains document B,
and script in document A calls postMessage()
on the
Window
object of document B, then a message event will be fired on that object,
marked as originating from the Window
of document A. The script in document A might
look like:
var o = document.getElementsByTagName('iframe')[0];
o.contentWindow.postMessage('Hello world', 'https://b.example.org/');
To register an event handler for incoming events, the script would use addEventListener()
(or similar mechanisms). For example, the script in document B
might look like:
window.addEventListener('message', receiver, false);
function receiver(e) {
if (e.origin == 'https://example.com') {
if (e.data == 'Hello world') {
e.source.postMessage('Hello', e.origin);
} else {
alert(e.data);
}
}
}
This script first checks the domain is the expected domain, and then looks at the message, which it either displays to the user, or responds to by sending a message back to the document which sent the message in the first place.
Use of this API requires extra care to protect users from hostile entities abusing a site for their own purposes.
Authors should check the origin
attribute to
ensure that messages are only accepted from domains that they expect to receive messages from.
Otherwise, bugs in the author's message handling code could be exploited by hostile sites.
Furthermore, even after checking the origin
attribute, authors should also check that the data in question is of the expected format.
Otherwise, if the source of the event has been attacked using a cross-site scripting flaw, further
unchecked processing of information sent using the postMessage()
method could result in the attack being
propagated into the receiver.
Authors should not use the wildcard keyword (*) in the targetOrigin argument in messages that contain any confidential information, as otherwise there is no way to guarantee that the message is only delivered to the recipient to which it was intended.
Authors who accept messages from any origin are encouraged to consider the risks of a denial-of-service attack. An attacker could send a high volume of messages; if the receiving page performs expensive computation or causes network traffic to be sent for each such message, the attacker's message could be multiplied into a denial-of-service attack. Authors are encouraged to employ rate limiting (only accepting a certain number of messages per minute) to make such attacks impractical.
The integrity of this API is based on the inability for scripts of one origin to
post arbitrary events (using dispatchEvent()
or otherwise) to objects in
other origins (those that are not the same).
Implementers are urged to take extra care in the implementation of this feature. It allows authors to transmit information from one domain to another domain, which is normally disallowed for security reasons. It also requires that UAs be careful to allow access to certain properties but not others.
User agents are also encouraged to consider rate-limiting message traffic between different origins, to protect naïve sites from denial-of-service attacks.
window.postMessage(message [, options ])
Posts a message to the given window. Messages can be structured objects, e.g. nested objects
and arrays, can contain JavaScript values (strings, numbers, Date
objects, etc.),
and can contain certain data objects such as File
Blob
,
FileList
, and ArrayBuffer
objects.
Objects listed in the transfer
member
of options are transferred, not just cloned, meaning that they are no longer usable
on the sending side.
A target origin can be specified using the targetOrigin
member of
options. If not provided, it defaults to "/
". This default
restricts the message to same-origin targets only.
If the origin of the target window doesn't match the given target origin, the message is
discarded, to avoid information leakage. To send the message to the target regardless of origin,
set the target origin to "*
".
Throws a "DataCloneError
" DOMException
if
transfer array contains duplicate objects or if message could not be
cloned.
window.postMessage(message, targetOrigin [, transfer ])
This is an alternate version of postMessage()
where the target origin is specified
as a parameter. Calling window.postMessage(message, target, transfer)
is
equivalent to window.postMessage(message, {targetOrigin,
transfer})
.
When posting a message to a Window
of a browsing context
that has just been navigated to a new Document
is likely to result in the message not
receiving its intended recipient: the scripts in the target browsing context have to
have had time to set up listeners for the messages. Thus, for instance, in situations where a
message is to be sent to the Window
of newly created child iframe
,
authors are advised to have the child Document
post a message to their parent
announcing their readiness to receive messages, and for the parent to wait for this message before
beginning posting messages.
The window post message steps, given a targetWindow, message, and options, are as follows:
Let targetRealm be targetWindow's realm.
Let incumbentSettings be the incumbent settings object.
Let targetOrigin be options["targetOrigin
"].
If targetOrigin is a single U+002F SOLIDUS character (/), then set targetOrigin to incumbentSettings's origin.
Otherwise, if targetOrigin is not a single U+002A ASTERISK character (*), then:
Let parsedURL be the result of running the URL parser on targetOrigin.
If parsedURL is failure, then throw a "SyntaxError
"
DOMException
.
Set targetOrigin to parsedURL's origin.
Let transfer be options["transfer
"].
Let serializeWithTransferResult be StructuredSerializeWithTransfer(message, transfer). Rethrow any exceptions.
Queue a global task on the posted message task source given targetWindow to run the following steps:
If the targetOrigin argument is not a single literal U+002A ASTERISK character
(*) and targetWindow's associated
Document
's origin is not
same origin with targetOrigin, then return.
Let origin be the serialization of incumbentSettings's origin.
Let source be the WindowProxy
object corresponding to
incumbentSettings's global
object (a Window
object).
Let deserializeRecord be StructuredDeserializeWithTransfer(serializeWithTransferResult, targetRealm).
If this throws an exception, catch it, fire an
event named messageerror
at
targetWindow, using MessageEvent
, with the origin
attribute initialized to origin and
the source
attribute initialized to
source, and then return.
Let messageClone be deserializeRecord.[[Deserialized]].
Let newPorts be a new frozen array consisting of all
MessagePort
objects in deserializeRecord.[[TransferredValues]], if any,
maintaining their relative order.
Fire an event named message
at targetWindow, using
MessageEvent
, with the origin
attribute initialized to origin, the source
attribute initialized to source, the
data
attribute initialized to
messageClone, and the ports
attribute
initialized to newPorts.
The Window
interface's postMessage(message,
options)
method steps are to run the window post message
steps given this, message, and options.
The Window
interface's postMessage(message, targetOrigin,
transfer)
method steps are to run the window post message
steps given this, message, and «[ "targetOrigin
" →
targetOrigin, "transfer
"
→ transfer ]».
To enable independent pieces of code (e.g. running in different browsing contexts) to communicate directly, authors can use channel messaging.
Communication channels in this mechanism are implemented as two-ways pipes, with a port at each end. Messages sent in one port are delivered at the other port, and vice-versa. Messages are delivered as DOM events, without interrupting or blocking running tasks.
To create a connection (two "entangled" ports), the MessageChannel()
constructor is called:
var channel = new MessageChannel();
One of the ports is kept as the local port, and the other port is sent to the remote code, e.g.
using postMessage()
:
otherWindow.postMessage('hello', 'https://example.com', [channel.port2]);
To send messages, the postMessage()
method on
the port is used:
channel.port1.postMessage('hello');
To receive messages, one listens to message
events:
channel.port1.onmessage = handleMessage;
function handleMessage(event) {
// message is in event.data
// ...
}
Data sent on a port can be structured data; for example here an array of strings is passed on a
MessagePort
:
port1.postMessage(['hello', 'world']);
In this example, two JavaScript libraries are connected to each other using
MessagePort
s. This allows the libraries to later be hosted in different frames, or
in Worker
objects, without any change to the APIs.
<script src="contacts.js"></script> <!-- exposes a contacts object -->
<script src="compose-mail.js"></script> <!-- exposes a composer object -->
<script>
var channel = new MessageChannel();
composer.addContactsProvider(channel.port1);
contacts.registerConsumer(channel.port2);
</script>
Here's what the "addContactsProvider()" function's implementation could look like:
function addContactsProvider(port) {
port.onmessage = function (event) {
switch (event.data.messageType) {
case 'search-result': handleSearchResult(event.data.results); break;
case 'search-done': handleSearchDone(); break;
case 'search-error': handleSearchError(event.data.message); break;
// ...
}
};
};
Alternatively, it could be implemented as follows:
function addContactsProvider(port) {
port.addEventListener('message', function (event) {
if (event.data.messageType == 'search-result')
handleSearchResult(event.data.results);
});
port.addEventListener('message', function (event) {
if (event.data.messageType == 'search-done')
handleSearchDone();
});
port.addEventListener('message', function (event) {
if (event.data.messageType == 'search-error')
handleSearchError(event.data.message);
});
// ...
port.start();
};
The key difference is that when using addEventListener()
, the start()
method must also be invoked. When using onmessage
, the call to start()
is implied.
The start()
method, whether called explicitly or
implicitly (by setting onmessage
),
starts the flow of messages: messages posted on message ports are initially paused, so that they
don't get dropped on the floor before the script has had a chance to set up its handlers.
Ports can be viewed as a way to expose limited capabilities (in the object-capability model sense) to other actors in the system. This can either be a weak capability system, where the ports are merely used as a convenient model within a particular origin, or as a strong capability model, where they are provided by one origin provider as the only mechanism by which another origin consumer can effect change in or obtain information from provider.
For example, consider a situation in which a social web site embeds in one iframe
the user's email contacts provider (an address book site, from a second origin), and in a second
iframe
a game (from a third origin). The outer social site and the game in the second
iframe
cannot access anything inside the first iframe
; together they can
only:
Navigate the iframe
to a new URL, such as the same
URL but with a different fragment,
causing the Window
in the iframe
to receive a hashchange
event.
Resize the iframe
, causing the Window
in the iframe
to receive a resize
event.
Send a message
event to the Window
in the
iframe
using the window.postMessage()
API.
The contacts provider can use these methods, most particularly the third one, to provide an API
that can be accessed by other origins to manipulate the user's address book. For example, it could
respond to a message "add-contact Guillaume Tell
<tell@pomme.example.net>
" by adding the given person and email address to the user's
address book.
To avoid any site on the web being able to manipulate the user's contacts, the contacts provider might only allow certain trusted sites, such as the social site, to do this.
Now suppose the game wanted to add a contact to the user's address book, and that the social site was willing to allow it to do so on its behalf, essentially "sharing" the trust that the contacts provider had with the social site. There are several ways it could do this; most simply, it could just proxy messages between the game site and the contacts site. However, this solution has a number of difficulties: it requires the social site to either completely trust the game site not to abuse the privilege, or it requires that the social site verify each request to make sure it's not a request that it doesn't want to allow (such as adding multiple contacts, reading the contacts, or deleting them); it also requires some additional complexity if there's ever the possibility of multiple games simultaneously trying to interact with the contacts provider.
Using message channels and MessagePort
objects, however, all of these problems can
go away. When the game tells the social site that it wants to add a contact, the social site can
ask the contacts provider not for it to add a contact, but for the capability to add a
single contact. The contacts provider then creates a pair of MessagePort
objects, and
sends one of them back to the social site, who forwards it on to the game. The game and the
contacts provider then have a direct connection, and the contacts provider knows to only honor a
single "add contact" request, nothing else. In other words, the game has been granted the
capability to add a single contact.
Continuing the example from the previous section, consider the contacts provider in particular.
While an initial implementation might have simply used XMLHttpRequest
objects in the
service's iframe
, an evolution of the service might instead want to use a shared worker with a single WebSocket
connection.
If the initial design used MessagePort
objects to grant capabilities, or even just
to allow multiple simultaneous independent sessions, the service implementation can switch from
the XMLHttpRequest
s-in-each-iframe
model to the
shared-WebSocket
model without changing the API at all: the ports on the service
provider side can all be forwarded to the shared worker without it affecting the users of the API
in the slightest.
[Exposed=(Window,Worker)]
interface MessageChannel {
constructor();
readonly attribute MessagePort port1;
readonly attribute MessagePort port2;
};
channel = new MessageChannel()
Returns a new MessageChannel
object with two new MessagePort
objects.
channel.port1
Returns the first MessagePort
object.
channel.port2
Returns the second MessagePort
object.
A MessageChannel
object has an associated port 1 and an associated
port 2, both MessagePort
objects.
The new MessageChannel()
constructor steps
are:
Set this's port 1 to a new
MessagePort
in this's relevant
realm.
Set this's port 2 to a new
MessagePort
in this's relevant
realm.
Entangle this's port 1 and this's port 2.
The port1
getter steps are to return
this's port 1.
The port2
getter steps are to return
this's port 2.
MessageEventTarget
mixinMessagePort
, Worker
, and
DedicatedWorkerGlobalScope
interface mixin MessageEventTarget {
attribute EventHandler onmessage;
attribute EventHandler onmessageerror;
};
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by objects implementing the
MessageEventTarget
interfaceMessagePort
,
Worker
, and DedicatedWorkerGlobalScope
objects:
Event handler | Event handler event type |
---|---|
onmessage | message
|
onmessageerror | messageerror
|
Each channel has two message ports. Data sent through one port is received by the other port, and vice versa.
[Exposed=(Window,Worker,AudioWorklet), Transferable]
interface MessagePort : EventTarget {
undefined postMessage(any message, sequence<object> transfer);
undefined postMessage(any message, optional StructuredSerializeOptions options = {});
undefined start();
undefined close();
// event handlers
attribute EventHandler onclose;
};
MessagePort includes MessageEventTarget;
dictionary StructuredSerializeOptions {
sequence<object> transfer = [];
};
port.postMessage(message [, transfer])
port.postMessage(message [, { transfer }])
Posts a message through the channel. Objects listed in transfer are transferred, not just cloned, meaning that they are no longer usable on the sending side.
Throws a "DataCloneError
" DOMException
if
transfer contains duplicate objects or port, or if message
could not be cloned.
port.start()
Begins dispatching messages received on the port.
port.close()
Disconnects the port, so that it is no longer active.
Each MessagePort
object has a message event target (a
MessageEventTarget
), to which the message
and messageerror
events are dispatched. Unless otherwise
specified, it defaults to the MessagePort
object itself.
Each MessagePort
object can be entangled with another (a symmetric relationship).
Each MessagePort
object also has a task source called the port
message queue, initially empty. A port message queue can be enabled or
disabled, and is initially disabled. Once enabled, a port can never be disabled again (though
messages in the queue can get moved to another queue or removed altogether, which has much the
same effect). A MessagePort
also has a has been shipped flag, which must
initially be false.
When a port's port message queue is enabled, the event loop must use
it as one of its task sources. When a port's relevant
global object is a Window
, all tasks queued on its port message queue must be associated with
the port's relevant global object's associated
Document
.
If the document is fully active, but the event listeners were all created in the context of documents that are not fully active, then the messages will not be received unless and until the documents become fully active again.
Each event loop has a task source called the unshipped port
message queue. This is a virtual task source: it must act as if it contained
the tasks of each port message queue of each
MessagePort
whose has been shipped flag is false, whose port
message queue is enabled, and whose relevant agent's event loop is that event loop, in the order
in which they were added to their respective task source. When a task would be removed from the unshipped port message
queue, it must instead be removed from its port message queue.
When a MessagePort
's has been shipped flag is false, its port
message queue must be ignored for the purposes of the event loop. (The
unshipped port message queue is used instead.)
The has been shipped flag is set to true when a port, its twin, or
the object it was cloned from, is or has been transferred. When a MessagePort
's
has been shipped flag is true, its port message queue acts as a
first-class task source, unaffected to any unshipped port message
queue.
When the user agent is to entangle two MessagePort
objects, it must run
the following steps:
If one of the ports is already entangled, then disentangle it and the port that it was entangled with.
If those two previously entangled ports were the two ports of a
MessageChannel
object, then that MessageChannel
object no longer
represents an actual channel: the two ports in that object are no longer entangled.
Associate the two ports to be entangled, so that they form the two parts of a new channel.
(There is no MessageChannel
object that represents this channel.)
Two ports A and B that have gone through this step are now said to be entangled; one is entangled to the other, and vice versa.
While this specification describes this process as instantaneous, implementations are more likely to implement it via message passing. As with all algorithms, the key is "merely" that the end result be indistinguishable, in a black-box sense, from the specification.
The disentangle steps, given a MessagePort
initiatorPort
which initiates disentangling, are as follows:
Let otherPort be the MessagePort
which initiatorPort
was entangled with.
Assert: otherPort exists.
Disentangle initiatorPort and otherPort, so that they are no longer entangled or associated with each other.
Fire an event named close
at otherPort.
The close
event will be fired even if the port is not
explicitly closed. The cases where this event is dispatched are:
close()
method was called;Document
was destroyed; orMessagePort
was garbage
collected.We only dispatch the event on otherPort because initiatorPort explicitly
triggered the close, its Document
no longer exists, or it was already garbage
collected, as described above.
MessagePort
objects are transferable
objects. Their transfer steps, given value and
dataHolder, are:
Set value's has been shipped flag to true.
Set dataHolder.[[PortMessageQueue]] to value's port message queue.
If value is entangled with another port remotePort, then:
Set remotePort's has been shipped flag to true.
Set dataHolder.[[RemotePort]] to remotePort.
Otherwise, set dataHolder.[[RemotePort]] to null.
Their transfer-receiving steps, given dataHolder and value, are:
Set value's has been shipped flag to true.
Move all the tasks that are to fire message
events in dataHolder.[[PortMessageQueue]] to the
port message queue of value, if any, leaving value's
port message queue in its initial disabled state, and, if value's
relevant global object is a Window
, associating the moved tasks with value's relevant global object's
associated Document
.
If dataHolder.[[RemotePort]] is not null, then entangle dataHolder.[[RemotePort]] and value. (This will disentangle dataHolder.[[RemotePort]] from the original port that was transferred.)
The message port post message steps, given sourcePort, targetPort, message and options are as follows:
Let transfer be options["transfer
"].
If transfer contains
sourcePort, then throw a "DataCloneError
"
DOMException
.
Let doomed be false.
If targetPort is not null and transfer contains targetPort, then set doomed to true and optionally report to a developer console that the target port was posted to itself, causing the communication channel to be lost.
Let serializeWithTransferResult be StructuredSerializeWithTransfer(message, transfer). Rethrow any exceptions.
If targetPort is null, or if doomed is true, then return.
Add a task that runs the following steps to the port message queue of targetPort:
Let finalTargetPort be the MessagePort
in whose port message
queue the task now finds itself.
This can be different from targetPort, if targetPort itself was transferred and thus all its tasks moved along with it.
Let messageEventTarget be finalTargetPort's message event target.
Let targetRealm be finalTargetPort's relevant realm.
Let deserializeRecord be StructuredDeserializeWithTransfer(serializeWithTransferResult, targetRealm).
If this throws an exception, catch it, fire an
event named messageerror
at
messageEventTarget, using MessageEvent
, and then return.
Let messageClone be deserializeRecord.[[Deserialized]].
Let newPorts be a new frozen array consisting of all
MessagePort
objects in deserializeRecord.[[TransferredValues]], if any,
maintaining their relative order.
Fire an event named message
at messageEventTarget, using
MessageEvent
, with the data
attribute
initialized to messageClone and the ports
attribute initialized to
newPorts.
The postMessage(message,
options)
method steps are:
Let targetPort be the port with which this is entangled, if any; otherwise let it be null.
Run the message port post message steps providing this, targetPort, message and options.
The postMessage(message,
transfer)
method steps are:
Let targetPort be the port with which this is entangled, if any; otherwise let it be null.
Let options be «[ "transfer
" → transfer
]».
Run the message port post message steps providing this, targetPort, message and options.
The start()
method steps are to enable this's port message queue, if it is not
already enabled.
The close()
method steps are:
Set this's [[Detached]] internal slot value to true.
If this is entangled, disentangle it.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by all objects implementing the
MessagePort
interface:
Event handler | Event handler event type |
---|---|
onclose | close
|
The first time a MessagePort
object's onmessage
IDL attribute is set, the port's
port message queue must be enabled, as if the start()
method had been called.
When a MessagePort
object o is garbage collected, if o is
entangled, then the user agent must disentangle
o.
When a MessagePort
object o is entangled and message
or messageerror
event listener is registered, user agents must act as if o's entangled
MessagePort
object has a strong reference to o.
Furthermore, a MessagePort
object must not be garbage collected while there
exists an event referenced by a task in a task
queue that is to be dispatched on that MessagePort
object, or while the
MessagePort
object's port message queue is enabled and not empty.
Thus, a message port can be received, given an event listener, and then forgotten, and so long as that event listener could receive a message, the channel will be maintained.
Of course, if this was to occur on both sides of the channel, then both ports could be garbage collected, since they would not be reachable from live code, despite having a strong reference to each other. However, if a message port has a pending message, it is not garbage collected.
Authors are strongly encouraged to explicitly close MessagePort
objects to disentangle them, so that their resources can be recollected. Creating many
MessagePort
objects and discarding them without closing them can lead to high
transient memory usage since garbage collection is not necessarily performed promptly, especially
for MessagePort
s where garbage collection can involve cross-process coordination.
Pages on a single origin opened by the same user in the same user agent but in different unrelated browsing contexts sometimes need to send notifications to each other, for example "hey, the user logged in over here, check your credentials again".
For elaborate cases, e.g. to manage locking of shared state, to manage synchronization of
resources between a server and multiple local clients, to share a WebSocket
connection with a remote host, and so forth, shared workers are
the most appropriate solution.
For simple cases, though, where a shared worker would be an unreasonable overhead, authors can use the simple channel-based broadcast mechanism described in this section.
[Exposed=(Window,Worker)]
interface BroadcastChannel : EventTarget {
constructor(DOMString name);
readonly attribute DOMString name;
undefined postMessage(any message);
undefined close();
attribute EventHandler onmessage;
attribute EventHandler onmessageerror;
};
broadcastChannel = new BroadcastChannel(name)
Returns a new BroadcastChannel
object via which messages for the given channel
name can be sent and received.
broadcastChannel.name
Returns the channel name (as passed to the constructor).
broadcastChannel.postMessage(message)
Sends the given message to other BroadcastChannel
objects set up for this
channel. Messages can be structured objects, e.g. nested objects and arrays.
broadcastChannel.close()
Closes the BroadcastChannel
object, opening it up to garbage
collection.
A BroadcastChannel
object has a channel name and a closed flag.
The new BroadcastChannel(name)
constructor steps are:
Set this's channel name to name.
Set this's closed flag to false.
The name
getter steps are to return
this's channel name.
A BroadcastChannel
object is said to be eligible for messaging when
its relevant global object is either:
a Window
object whose associated
Document
is fully active, or
a WorkerGlobalScope
object whose closing flag is false and whose
worker is not a suspendable worker.
The postMessage(message)
method
steps are:
If this is not eligible for messaging, then return.
If this's closed flag
is true, then throw an "InvalidStateError
"
DOMException
.
Let serialized be StructuredSerialize(message). Rethrow any exceptions.
Let sourceOrigin be this's relevant settings object's origin.
Let sourceStorageKey be the result of running obtain a storage key for non-storage purposes with this's relevant settings object.
Let destinations be a list of BroadcastChannel
objects that
match the following criteria:
They are eligible for messaging.
The result of running obtain a storage key for non-storage purposes with their relevant settings object equals sourceStorageKey.
Their channel name is this's channel name.
Remove source from destinations.
Sort destinations such that all BroadcastChannel
objects whose
relevant agents are the same are sorted in creation order,
oldest first. (This does not define a complete ordering. Within this constraint, user agents may
sort the list in any implementation-defined manner.)
For each destination in destinations, queue a global task on the DOM manipulation task source given destination's relevant global object to perform the following steps:
If destination's closed flag is true, then abort these steps.
Let targetRealm be destination's relevant realm.
Let data be StructuredDeserialize(serialized, targetRealm).
If this throws an exception, catch it, fire an
event named messageerror
at
destination, using MessageEvent
, with the origin
attribute initialized to the serialization of sourceOrigin, and then
abort these steps.
Fire an event named message
at destination, using
MessageEvent
, with the data
attribute
initialized to data and the origin
attribute initialized to the serialization of
sourceOrigin.
While a BroadcastChannel
object whose closed flag is false has an event listener
registered for message
or messageerror
events, there must be a strong reference from the
BroadcastChannel
object's relevant global object to the
BroadcastChannel
object itself.
The close()
method steps are to set
this's closed flag to true.
Authors are strongly encouraged to explicitly close BroadcastChannel
objects when they are no longer needed, so that they can be garbage collected. Creating many
BroadcastChannel
objects and discarding them while leaving them with an event
listener and without closing them can lead to an apparent memory leak, since the objects will
continue to live for as long as they have an event listener (or until their page or worker is
closed).
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by all objects implementing the
BroadcastChannel
interface:
Event handler | Event handler event type |
---|---|
onmessage | message
|
onmessageerror | messageerror
|
Suppose a page wants to know when the user logs out, even when the user does so from another tab at the same site:
var authChannel = new BroadcastChannel('auth');
authChannel.onmessage = function (event) {
if (event.data == 'logout')
showLogout();
}
function logoutRequested() {
// called when the user asks us to log them out
doLogout();
showLogout();
authChannel.postMessage('logout');
}
function doLogout() {
// actually log the user out (e.g. clearing cookies)
// ...
}
function showLogout() {
// update the UI to indicate we're logged out
// ...
}
This specification defines an API for running scripts in the background independently of any user interface scripts.
This allows for long-running scripts that are not interrupted by scripts that respond to clicks or other user interactions, and allows long tasks to be executed without yielding to keep the page responsive.
Workers (as these background scripts are called herein) are relatively heavy-weight, and are not intended to be used in large numbers. For example, it would be inappropriate to launch one worker for each pixel of a four megapixel image. The examples below show some appropriate uses of workers.
Generally, workers are expected to be long-lived, have a high start-up performance cost, and a high per-instance memory cost.
There are a variety of uses that workers can be put to. The following subsections show various examples of this use.
The simplest use of workers is for performing a computationally expensive task without interrupting the user interface.
In this example, the main document spawns a worker to (naïvely) compute prime numbers, and progressively displays the most recently found prime number.
The main page is as follows:
EXAMPLE workers/primes/page.html
The Worker()
constructor call creates a worker and returns a
Worker
object representing that worker, which is used to communicate with the worker.
That object's onmessage
event handler
allows the code to receive messages from the worker.
The worker itself is as follows:
EXAMPLE workers/primes/worker.js
The bulk of this code is simply an unoptimized search for a prime number. The postMessage()
method is used to send a
message back to the page when a prime is found.
All of our examples so far show workers that run classic
scripts. Workers can instead be instantiated using module
scripts, which have the usual benefits: the ability to use the JavaScript
import
statement to import other modules; strict mode by default; and
top-level declarations not polluting the worker's global scope.
As the import
statement is available, the importScripts()
method will automatically fail
inside module workers.
In this example, the main document uses a worker to do off-main-thread image manipulation. It imports the filters used from another module.
The main page is as follows:
EXAMPLE workers/modules/page.html
The worker file is then:
EXAMPLE workers/modules/worker.js
Which imports the file filters.js
:
EXAMPLE workers/modules/filters.js
This section introduces shared workers using a Hello World example. Shared workers use slightly different APIs, since each worker can have multiple connections.
This first example shows how you connect to a worker and how a worker can send a message back to the page when it connects to it. Received messages are displayed in a log.
Here is the HTML page:
EXAMPLE workers/shared/001/test.html
Here is the JavaScript worker:
EXAMPLE workers/shared/001/test.js
This second example extends the first one by changing two things: first, messages are received
using addEventListener()
instead of an event handler IDL attribute, and second, a message is sent to the
worker, causing the worker to send another message in return. Received messages are again
displayed in a log.
Here is the HTML page:
EXAMPLE workers/shared/002/test.html
Here is the JavaScript worker:
EXAMPLE workers/shared/002/test.js
Finally, the example is extended to show how two pages can connect to the same worker; in this
case, the second page is merely in an iframe
on the first page, but the same
principle would apply to an entirely separate page in a separate top-level
traversable.
Here is the outer HTML page:
EXAMPLE workers/shared/003/test.html
Here is the inner HTML page:
EXAMPLE workers/shared/003/inner.html
Here is the JavaScript worker:
EXAMPLE workers/shared/003/test.js
In this example, multiple windows (viewers) can be opened that are all viewing the same map. All the windows share the same map information, with a single worker coordinating all the viewers. Each viewer can move around independently, but if they set any data on the map, all the viewers are updated.
The main page isn't interesting, it merely provides a way to open the viewers:
EXAMPLE workers/multiviewer/page.html
The viewer is more involved:
EXAMPLE workers/multiviewer/viewer.html
There are several key things worth noting about the way the viewer is written.
Multiple listeners. Instead of a single message processing function, the code here attaches multiple event listeners, each one performing a quick check to see if it is relevant for the message. In this example it doesn't make much difference, but if multiple authors wanted to collaborate using a single port to communicate with a worker, it would allow for independent code instead of changes having to all be made to a single event handling function.
Registering event listeners in this way also allows you to unregister specific listeners when
you are done with them, as is done with the configure()
method in this
example.
Finally, the worker:
EXAMPLE workers/multiviewer/worker.js
Connecting to multiple pages. The script uses the onconnect
event listener to listen for
multiple connections.
Direct channels. When the worker receives a "msg" message from one viewer naming another viewer, it sets up a direct connection between the two, so that the two viewers can communicate directly without the worker having to proxy all the messages.
With multicore CPUs becoming prevalent, one way to obtain better performance is to split computationally expensive tasks amongst multiple workers. In this example, a computationally expensive task that is to be performed for every number from 1 to 10,000,000 is farmed out to ten subworkers.
The main page is as follows, it just reports the result:
EXAMPLE workers/multicore/page.html
The worker itself is as follows:
EXAMPLE workers/multicore/worker.js
It consists of a loop to start the subworkers, and then a handler that waits for all the subworkers to respond.
The subworkers are implemented as follows:
EXAMPLE workers/multicore/core.js
They receive two numbers in two events, perform the computation for the range of numbers thus specified, and then report the result back to the parent.
Suppose that a cryptography library is made available that provides three tasks:
The library itself is as follows:
EXAMPLE workers/crypto/libcrypto-v1.js
Note that the crypto functions here are just stubs and don't do real cryptography.
This library could be used as follows:
EXAMPLE workers/crypto/page.html
A later version of the API, though, might want to offload all the crypto work onto subworkers. This could be done as follows:
EXAMPLE workers/crypto/libcrypto-v2.js
The little subworkers would then be as follows.
For generating key pairs:
EXAMPLE workers/crypto/libcrypto-v2-generator.js
For encrypting:
EXAMPLE workers/crypto/libcrypto-v2-encryptor.js
For decrypting:
EXAMPLE workers/crypto/libcrypto-v2-decryptor.js
Notice how the users of the API don't have to even know that this is happening — the API hasn't changed; the library can delegate to subworkers without changing its API, even though it is accepting data using message channels.
Creating a worker requires a URL to a JavaScript file. The Worker()
constructor is invoked with the URL to that file as its only
argument; a worker is then created and returned:
var worker = new Worker('helper.js');
If you want your worker script to be interpreted as a module script instead of the default classic script, you need to use a slightly different signature:
var worker = new Worker('helper.mjs', { type: "module" });
Dedicated workers use MessagePort
objects behind the scenes, and thus support all
the same features, such as sending structured data, transferring binary data, and transferring
other ports.
To receive messages from a dedicated worker, use the onmessage
event handler IDL attribute on the Worker
object:
worker.onmessage = function (event) { ... };
You can also use the addEventListener()
method.
The implicit MessagePort
used by dedicated workers has its port
message queue implicitly enabled when it is created, so there is no equivalent to the
MessagePort
interface's start()
method on
the Worker
interface.
To send data to a worker, use the postMessage()
method. Structured data can be sent over this
communication channel. To send ArrayBuffer
objects
efficiently (by transferring them rather than cloning them), list them in an array in the second
argument.
worker.postMessage({
operation: 'find-edges',
input: buffer, // an ArrayBuffer object
threshold: 0.6,
}, [buffer]);
To receive a message inside the worker, the onmessage
event handler IDL attribute is used.
onmessage = function (event) { ... };
You can again also use the addEventListener()
method.
In either case, the data is provided in the event object's data
attribute.
To send messages back, you again use postMessage()
. It supports the
structured data in the same manner.
postMessage(event.data.input, [event.data.input]); // transfer the buffer back
Shared workers are identified by the URL of the script used to create it, optionally with an explicit name. The name allows multiple instances of a particular shared worker to be started.
Shared workers are scoped by origin. Two different sites using the same names will not collide. However, if a page tries to use the same shared worker name as another page on the same site, but with a different script URL, it will fail.
Creating shared workers is done using the SharedWorker()
constructor. This constructor takes the URL to the script to use for its first argument, and the
name of the worker, if any, as the second argument.
var worker = new SharedWorker('service.js');
Communicating with shared workers is done with explicit MessagePort
objects. The
object returned by the SharedWorker()
constructor holds a
reference to the port on its port
attribute.
worker.port.onmessage = function (event) { ... };
worker.port.postMessage('some message');
worker.port.postMessage({ foo: 'structured', bar: ['data', 'also', 'possible']});
Inside the shared worker, new clients of the worker are announced using the connect
event. The port for the new client is
given by the event object's source
attribute.
onconnect = function (event) {
var newPort = event.source;
// set up a listener
newPort.onmessage = function (event) { ... };
// send a message back to the port
newPort.postMessage('ready!'); // can also send structured data, of course
};
This standard defines two kinds of workers: dedicated workers, and shared workers. Dedicated workers, once created, are linked to their creator, but message ports can be used to communicate from a dedicated worker to multiple other browsing contexts or workers. Shared workers, on the other hand, are named, and once created any script running in the same origin can obtain a reference to that worker and communicate with it. Service Workers defines a third kind. SW
The global scope is the "inside" of a worker.
WorkerGlobalScope
common interface[Exposed=Worker]
interface WorkerGlobalScope : EventTarget {
readonly attribute WorkerGlobalScope self;
readonly attribute WorkerLocation location;
readonly attribute WorkerNavigator navigator;
undefined importScripts((TrustedScriptURL
or USVString)... urls);
attribute OnErrorEventHandler onerror;
attribute EventHandler onlanguagechange;
attribute EventHandler onoffline;
attribute EventHandler ononline;
attribute EventHandler onrejectionhandled;
attribute EventHandler onunhandledrejection;
};
WorkerGlobalScope
serves as the base class for specific types of worker global
scope objects, including DedicatedWorkerGlobalScope
,
SharedWorkerGlobalScope
, and ServiceWorkerGlobalScope
.
A WorkerGlobalScope
object has an associated owner set (a
set of Document
and WorkerGlobalScope
objects). It is
initially empty and populated when the worker is created or obtained.
It is a set, instead of a single owner, to accommodate
SharedWorkerGlobalScope
objects.
A WorkerGlobalScope
object has an associated type ("classic
" or "module
"). It is set during creation.
A WorkerGlobalScope
object has an associated url (null or a URL). It is initially
null.
A WorkerGlobalScope
object has an associated name (a string). It is set during creation.
The name can have different
semantics for each subclass of WorkerGlobalScope
. For
DedicatedWorkerGlobalScope
instances, it is simply a developer-supplied name, useful
mostly for debugging purposes. For SharedWorkerGlobalScope
instances, it allows
obtaining a reference to a common shared worker via the SharedWorker()
constructor. For
ServiceWorkerGlobalScope
objects, it doesn't make sense (and as such isn't exposed
through the JavaScript API at all).
A WorkerGlobalScope
object has an associated policy container (a policy
container). It is initially a new policy container.
A WorkerGlobalScope
object has an associated embedder policy (an embedder
policy).
A WorkerGlobalScope
object has an associated module map. It is a module map,
initially empty.
A WorkerGlobalScope
object has an associated cross-origin isolated
capability boolean. It is initially false.
workerGlobal.self
workerGlobal.location
WorkerLocation
object.workerGlobal.navigator
WorkerNavigator
object.workerGlobal.importScripts(...urls)
The self
attribute must return the
WorkerGlobalScope
object itself.
The location
attribute must return the
WorkerLocation
object whose associated WorkerGlobalScope
object is
the WorkerGlobalScope
object.
While the WorkerLocation
object is created after the
WorkerGlobalScope
object, this is not problematic as it cannot be observed from
script.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by objects implementing the
WorkerGlobalScope
interface:
Event handler | Event handler event type |
---|---|
onerror | error
|
onlanguagechange | languagechange
|
onoffline | offline
|
ononline | online
|
onrejectionhandled | rejectionhandled
|
onunhandledrejection | unhandledrejection
|
DedicatedWorkerGlobalScope
interface[Global=(Worker,DedicatedWorker),Exposed=DedicatedWorker]
interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
[Replaceable] readonly attribute DOMString name;
undefined postMessage(any message, sequence<object> transfer);
undefined postMessage(any message, optional StructuredSerializeOptions options = {});
undefined close();
};
DedicatedWorkerGlobalScope includes MessageEventTarget;
DedicatedWorkerGlobalScope
objects have an associated inside port (a
MessagePort
). This port is part of a channel that is set up when the worker is
created, but it is not exposed. This object must never be garbage collected before
the DedicatedWorkerGlobalScope
object.
dedicatedWorkerGlobal.name
Returns dedicatedWorkerGlobal's name, i.e. the value given to the
Worker
constructor. Primarily useful for debugging.
dedicatedWorkerGlobal.postMessage(message [, transfer ])
dedicatedWorkerGlobal.postMessage(message [, { transfer } ])
Clones message and transmits it to the Worker
object associated
with dedicatedWorkerGlobal. transfer can be passed as a list of objects
that are to be transferred rather than cloned.
dedicatedWorkerGlobal.close()
Aborts dedicatedWorkerGlobal.
The name
getter steps are to return
this's name. Its value
represents the name given to the worker using the Worker
constructor, used primarily
for debugging purposes.
The postMessage(message,
transfer)
and postMessage(message,
options)
methods on DedicatedWorkerGlobalScope
objects act as
if, when invoked, it immediately invoked the respective postMessage(message, transfer)
and postMessage(message,
options)
on the port, with the same arguments, and returned the same return
value.
To close a worker, given a workerGlobal, run these steps:
Discard any tasks that have been added to workerGlobal's relevant agent's event loop's task queues.
Set workerGlobal's closing flag to true. (This prevents any further tasks from being queued.)
The close()
method steps are to
close a worker given this.
SharedWorkerGlobalScope
interface[Global=(Worker,SharedWorker),Exposed=SharedWorker]
interface SharedWorkerGlobalScope : WorkerGlobalScope {
[Replaceable] readonly attribute DOMString name;
undefined close();
attribute EventHandler onconnect;
};
A SharedWorkerGlobalScope
object has an associated constructor origin, constructor
url, and credentials. They are initialized when
the SharedWorkerGlobalScope
object is created, in the run a worker
algorithm.
Shared workers receive message ports through connect
events on their SharedWorkerGlobalScope
object for each
connection.
sharedWorkerGlobal.name
Returns sharedWorkerGlobal's name, i.e. the value given to the
SharedWorker
constructor. Multiple SharedWorker
objects can correspond
to the same shared worker (and SharedWorkerGlobalScope
), by reusing the same
name.
sharedWorkerGlobal.close()
Aborts sharedWorkerGlobal.
The name
getter steps are to return
this's name. Its value
represents the name that can be used to obtain a reference to the worker using the
SharedWorker
constructor.
The close()
method steps are to close a
worker given this.
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by objects implementing the
SharedWorkerGlobalScope
interface:
Event handler | Event handler event type |
---|---|
onconnect | connect
|
A worker event loop's task queues only have events, callbacks, and networking activity as tasks. These worker event loops are created by the run a worker algorithm.
Each WorkerGlobalScope
object has a closing flag, which must be initially
false, but which can get set to true by the algorithms in the processing model
section belowwhen the worker is requested to close.
Once the WorkerGlobalScope
's closing flag is set to true, the event
loop's task queues must discard any
further tasks that would be added to them (tasks already on the
queue are unaffected except where otherwise specified). Effectively, once the closing flag is true, timers stop firing,
notifications for all pending background operations are dropped, etc.
Workers communicate with other workers and with Window
s through message channels and their MessagePort
objects.
Each WorkerGlobalScope
object worker global scope has a list of
the worker's ports, which consists of all the MessagePort
objects
that are entangled with another port and that have one (but only one) port owned by worker
global scope. This list includes the implicit MessagePort
in the case of dedicated workers.
Given an environment settings
object o when creating or obtaining a worker, the relevant owner to
add depends on the type of global
object specified by o. If o's global object is a WorkerGlobalScope
object (i.e., if we are creating a nested dedicated worker), then the relevant owner is that
global object. Otherwise, o's global
object is a Window
object, and the relevant owner is that
Window
's associated
Document
.
A worker is said to be a permissible worker if its WorkerGlobalScope
's
owner set is not empty or:
WorkerGlobalScope
object is a SharedWorkerGlobalScope
object
(i.e., the worker is a shared worker), andThe second part of this definition allows a shared worker to survive for a short time while a page is loading, in case that page is going to contact the shared worker again. This can be used by user agents as a way to avoid the cost of restarting a shared worker used by a site when the user is navigating from page to page within that site.
A worker is said to be an active needed worker if any of its owners are either Document
objects that are fully active or
active needed workers.
A worker is said to be a protected worker if it is an active needed
worker and either it has outstanding timers, database transactions, or network connections,
or its list of the worker's ports is not empty, or its WorkerGlobalScope
is actually a SharedWorkerGlobalScope
object (i.e., the worker is a shared
worker).
A worker is said to be a suspendable worker if it is not an active needed worker but it is a permissible worker.
When a user agent is to run a worker for a script with Worker
or
SharedWorker
object worker, URL url,
environment settings object outside settings, MessagePort
outside port, and a WorkerOptions
dictionary options, it must
run the following steps.
Let is shared be true if worker is a SharedWorker
object, and false otherwise.
Let owner be the relevant owner to add given outside settings.
Let unsafeWorkerCreationTime be the unsafe shared current time.
Let agent be the result of obtaining a dedicated/shared worker agent given outside settings and is shared. Run the rest of these steps in that agent.
Let realm execution context be the result of creating a new realm given agent and the following customizations:
For the global object, if is shared is true, create a new
SharedWorkerGlobalScope
object. Otherwise, create a new
DedicatedWorkerGlobalScope
object.
Let worker global scope be the global object of realm execution context's Realm component.
This is the DedicatedWorkerGlobalScope
or
SharedWorkerGlobalScope
object created in the previous step.
Set up a worker environment settings object with realm execution context, outside settings, and unsafeWorkerCreationTime, and let inside settings be the result.
Set worker global scope's name to the value of options's
name
member.
Append owner to worker global scope's owner set.
If is shared is true, then:
Set worker global scope's constructor origin to outside settings's origin.
Set worker global scope's constructor url to url.
Set worker global scope's type to the value of options's
type
member.
Set worker global scope's credentials to the value of
options's credentials
member.
Let destination be "sharedworker
" if is
shared is true, and "worker
" otherwise.
Obtain script by switching on the value of options's type
member:
classic
"module
"credentials
member of options, inside settings, and with onComplete and
performFetch as defined below.In both cases, let performFetch be the following perform the fetch hook given request, isTopLevel and processCustomFetchResponse:
If isTopLevel is false, fetch request with processResponseConsumeBody set to processCustomFetchResponse, and abort these steps.
Fetch request with processResponseConsumeBody set to the following steps given response response and null, failure, or a byte sequence bodyBytes:
Set worker global scope's url to response's url.
Initialize worker global scope's policy container given worker global scope, response, and inside settings.
If the Run CSP initialization for a global object algorithm returns
"Blocked
" when executed upon worker global scope, set
response to a network error. CSP
If worker global scope's embedder policy's value is compatible with cross-origin
isolation and is shared is true, then set agent's agent
cluster's cross-origin isolation
mode to "logical
" or "concrete
". The one chosen is
implementation-defined.
This really ought to be set when the agent cluster is created, which requires a redesign of this section.
If the result of checking a global object's embedder policy with worker global scope, outside settings, and response is false, then set response to a network error.
Set worker global scope's cross-origin isolated
capability to true if agent's agent cluster's cross-origin isolation mode is "concrete
".
If is shared is false and owner's cross-origin isolated capability is false, then set worker global scope's cross-origin isolated capability to false.
If is shared is false and response's
url's scheme is "data
", then set
worker global scope's cross-origin isolated
capability to false.
This is a conservative default for now, while we figure out how workers in
general, and data:
URL workers in particular (which are
cross-origin from their owner), will be treated in the context of permissions policies. See
w3c/webappsec-permissions-policy
issue #207 for more details.
Run processCustomFetchResponse with response and bodyBytes.
In both cases, let onComplete given script be the following steps:
If script is null or if script's error to rethrow is non-null, then:
Queue a global task on the DOM manipulation task source given
worker's relevant global object to fire an event named error
at worker.
Run the environment discarding steps for inside settings.
Abort these steps.
Associate worker with worker global scope.
Let inside port be a new MessagePort
object in
inside settings's realm.
If shared is false, then:
Set inside port's message event target to worker global scope.
Set worker global scope's inside port to inside port.
Entangle outside port and inside port.
Create a new WorkerLocation
object and associate it with worker global
scope.
Closing orphan workers: Start monitoring the worker such that no sooner than it stops being a protected worker, and no later than it stops being a permissible worker, worker global scope's closing flag is set to true.
Suspending workers: Start monitoring the worker, such that whenever worker global scope's closing flag is false and the worker is a suspendable worker, the user agent suspends execution of script in that worker until such time as either the closing flag switches to true or the worker stops being a suspendable worker.
Set inside settings's execution ready flag.
If script is a classic script, then run the classic script script. Otherwise, it is a module script; run the module script script.
In addition to the usual possibilities of returning a value or failing due to an exception, this could be prematurely aborted by the terminate a worker algorithm defined below.
Enable outside port's port message queue.
If is shared is false, enable the port message queue of the worker's implicit port.
If is shared is true, then queue a global task on DOM
manipulation task source given worker global scope to fire an event named connect
at worker global scope, using
MessageEvent
, with the data
attribute
initialized to the empty string, the ports
attribute
initialized to a new frozen array containing inside port, and the source
attribute initialized to inside
port.
Enable the client message queue of the
ServiceWorkerContainer
object whose associated service worker client is
worker global scope's relevant settings object.
Event loop: Run the responsible event loop specified by inside settings until it is destroyed.
The handling of events or the execution of callbacks by tasks run by the event loop might get prematurely aborted by the terminate a worker algorithm defined below.
The worker processing model remains on this step until the event loop is destroyed, which happens after the closing flag is set to true, as described in the event loop processing model.
Clear the worker global scope's map of active timers.
Disentangle all the ports in the list of the worker's ports.
Empty worker global scope's owner set.
When a user agent is to terminate a worker it must run the following steps in parallel with the worker's main loop (the "run a worker" processing model defined above):
Set the worker's WorkerGlobalScope
object's closing flag to true.
If there are any tasks queued in the
WorkerGlobalScope
object's relevant agent's event loop's task
queues, discard them without processing them.
Abort the script currently running in the worker.
If the worker's WorkerGlobalScope
object is actually a
DedicatedWorkerGlobalScope
object (i.e. the worker is a dedicated worker), then
empty the port message queue of the port that the worker's implicit port is
entangled with.
User agents may invoke the terminate a worker algorithm when a worker stops being an active needed worker and the worker continues executing even after its closing flag was set to true.
Whenever an uncaught runtime script error occurs in one of the worker's scripts, if the error
did not occur while handling a previous script error, the user agent will report it for the worker's WorkerGlobalScope
object.
AbstractWorker
mixinWorker
and SharedWorker
interface mixin AbstractWorker {
attribute EventHandler onerror;
};
The following are the event handlers (and their corresponding event handler event types) that must be supported,
as event handler IDL attributes, by objects implementing the
AbstractWorker
interfaceWorker
and
SharedWorker
objects:
Event handler | Event handler event type |
---|---|
onerror | error
|
To set up a worker environment settings object, given a JavaScript execution context execution context, an environment settings object outside settings, and a number unsafeWorkerCreationTime:
Let inherited origin be outside settings's origin.
Let realm be the value of execution context's Realm component.
Let worker global scope be realm's global object.
Let settings object be a new environment settings object whose algorithms are defined as follows:
Return execution context.
Return worker global scope's module map.
Return worker global scope's url.
Return a unique opaque origin if worker
global scope's url's scheme is "data
", and inherited
origin otherwise.
Return worker global scope's policy container.
Return worker global scope's cross-origin isolated capability.
Return the result of coarsening unsafeWorkerCreationTime with worker global scope's cross-origin isolated capability.
Set settings object's id to a new unique opaque string, creation URL to worker global scope's url, top-level creation URL to null, target browsing context to null, and active service worker to null.
If worker global scope is a DedicatedWorkerGlobalScope
object,
then set settings object's top-level origin to outside
settings's top-level origin.
Otherwise, set settings object's top-level origin to an implementation-defined value.
See Client-Side Storage Partitioning for the latest on properly defining this.
Set realm's [[HostDefined]] field to settings object.
Return settings object.
Worker
interface[Exposed=(Window,DedicatedWorker,SharedWorker)]
interface Worker : EventTarget {
constructor((TrustedScriptURL
or USVString) scriptURL, optional WorkerOptions options = {});
undefined terminate();
undefined postMessage(any message, sequence<object> transfer);
undefined postMessage(any message, optional StructuredSerializeOptions options = {});
};
dictionary WorkerOptions {
WorkerType type = "classic";
RequestCredentials credentials = "same-origin"; // credentials is only used if type is "module"
DOMString name = "";
};
enum WorkerType { "classic", "module" };
Worker includes AbstractWorker;
Worker includes MessageEventTarget;
worker = new Worker(scriptURL [, options ])
Returns a new Worker
object. scriptURL will be fetched and
executed in the background, creating a new global environment for which worker
represents the communication channel. options can be used to define the name of that global environment via the name
option, primarily for debugging purposes. It can also ensure this new
global environment supports JavaScript modules (specify type: "module"
),
and if that is specified, can also be used to specify how scriptURL is fetched through
the credentials
option.
worker.terminate()
worker.postMessage(message [, transfer ])
worker.postMessage(message [, { transfer } ])
Clones message and transmits it to worker's global environment. transfer can be passed as a list of objects that are to be transferred rather than cloned.
Each Worker
object has an associated outside port (a
MessagePort
). This port is part of a channel that is set up when the worker is
created, but it is not exposed. This object must never be garbage collected before the
Worker
object.
The terminate()
method, when invoked, must cause the terminate a worker algorithm to be run on the
worker with which the object is associated.
The postMessage(message, transfer)
and postMessage(message,
options)
methods on Worker
objects act as if, when invoked,
they immediately invoked the respective postMessage(message, transfer)
and postMessage(message,
options)
on this's outside port, with the same
arguments, and returned the same return value.
The postMessage()
method's first argument can be structured data:
worker.postMessage({opcode: 'activate', device: 1938, parameters: [23, 102]});
When the Worker(scriptURL,
options)
constructor is invoked, the user agent must run the following
steps:
Let compliantScriptURL be the result of invoking the Get Trusted Type compliant string algorithm with TrustedScriptURL
, this's relevant global
object, scriptURL, "Worker constructor
", and "script
".
Let outside settings be the current settings object.
Let worker URL be the result of encoding-parsing a URL given compliantScriptURL, relative to outside settings.
Any same-origin URL (including blob:
URLs) can be used. data:
URLs can also be used, but they create a worker with an opaque origin.
If worker URL is failure, then throw a "SyntaxError
"
DOMException
.
Let worker be a new Worker
object.
Let outside port be a new MessagePort
in outside
settings's realm.
Set outside port's message event target to worker.
Set worker's outside port to outside port.
Run this step in parallel:
Run a worker given worker, worker URL, outside settings, outside port, and options.
Return worker.
SharedWorker
interface[Exposed=Window]
interface SharedWorker : EventTarget {
constructor((TrustedScriptURL
or USVString) scriptURL, optional (DOMString or WorkerOptions) options = {});
readonly attribute MessagePort port;
};
SharedWorker includes AbstractWorker;
sharedWorker = new SharedWorker(scriptURL [, name ])
Returns a new SharedWorker
object. scriptURL will be fetched and
executed in the background, creating a new global environment for which sharedWorker
represents the communication channel. name can be used to define the name of that global environment.
sharedWorker = new SharedWorker(scriptURL [, options ])
Returns a new SharedWorker
object. scriptURL will be fetched and
executed in the background, creating a new global environment for which sharedWorker
represents the communication channel. options can be used to define the name of that global environment via the name
option. It can also ensure this new global environment supports JavaScript
modules (specify type: "module"
), and if that is specified, can also be
used to specify how scriptURL is fetched through the credentials
option. Note that attempting to construct a shared worker with
options whose type
or credentials
values
mismatch an existing shared worker will cause the returned sharedWorker to fire an
error event and not connect to the existing shared worker.
sharedWorker.port
Returns sharedWorker's MessagePort
object which can be used to
communicate with the global environment.
The port
attribute must return the value it was assigned by the object's constructor. It represents the
MessagePort
for communicating with the shared worker.
A user agent has an associated shared worker manager which is the result of starting a new parallel queue.
Each user agent has a single shared worker manager for simplicity. Implementations could use one per origin; that would not be observably different and enables more concurrency.
When the SharedWorker(scriptURL, options)
constructor is invoked:
Let compliantScriptURL be the result of invoking the Get Trusted Type compliant string algorithm with TrustedScriptURL
, this's relevant global
object, scriptURL, "SharedWorker constructor
", and
"script
".
If options is a DOMString
, set
options to a new WorkerOptions
dictionary whose name
member is set to the value of options and whose other members
are set to their default values.
Let outside settings be the current settings object.
Let urlRecord be the result of encoding-parsing a URL given compliantScriptURL, relative to outside settings.
Any same-origin URL (including blob:
URLs) can be used. data:
URLs can also be used, but they create a worker with an opaque origin.
If urlRecord is failure, then throw a "SyntaxError
"
DOMException
.
Let worker be a new SharedWorker
object.
Let outside port be a new MessagePort
in outside
settings's realm.
Assign outside port to the port
attribute of worker.
Let callerIsSecureContext be true if outside settings is a secure context; otherwise, false.
Let outside storage key be the result of running obtain a storage key for non-storage purposes given outside settings.
Enqueue the following steps to the shared worker manager:
Let worker global scope be null.
For each scope in the list of all
SharedWorkerGlobalScope
objects:
Let worker storage key be the result of running obtain a storage key for non-storage purposes given scope's relevant settings object.
If all of the following are true:
name
member,then:
Set worker global scope to scope.
Break.
data:
URLs create a worker with an opaque origin. Both the constructor origin and
constructor url are
compared so the same data:
URL can be used within an
origin to get to the same SharedWorkerGlobalScope
object, but cannot
be used to bypass the same origin restriction.
If worker global scope is not null, but the user agent has been configured to disallow communication between the worker represented by the worker global scope and the scripts whose settings object is outside settings, then set worker global scope to null.
For example, a user agent could have a development mode that isolates a particular top-level traversable from all other pages, and scripts in that development mode could be blocked from connecting to shared workers running in the normal browser mode.
If worker global scope is not null, then check if worker global
scope's type and credentials match the
options values. If not, queue a task to fire an event named error
and abort these steps.
If worker global scope is not null, then run these subsubsteps:
Let settings object be the relevant settings object for worker global scope.
Let workerIsSecureContext be true if settings object is a secure context; otherwise, false.
If workerIsSecureContext is not callerIsSecureContext, then
queue a task to fire an event named
error
at worker and abort these steps.
SECURE-CONTEXTS
Associate worker with worker global scope.
Let inside port be a new MessagePort
in
settings object's realm.
Entangle outside port and inside port.
Queue a task, using the DOM manipulation task source, to
fire an event named connect
at worker global scope,
using MessageEvent
, with the data
attribute initialized to the empty string, the ports
attribute initialized to a new frozen
array containing only inside port, and the source
attribute initialized to inside
port.
Append the relevant owner to add given outside settings to worker global scope's owner set.
Otherwise, in parallel, run a worker given worker, urlRecord, outside settings, outside port, and options.
Return worker.
interface mixin NavigatorConcurrentHardware {
readonly attribute unsigned long long hardwareConcurrency;
};
self.navigator.hardwareConcurrency
Returns the number of logical processors potentially available to the user agent.
The navigator.hardwareConcurrency
attribute's
getter must return a number between 1 and the number of logical processors potentially available
to the user agent. If this cannot be determined, the getter must return 1.
User agents should err toward exposing the number of logical processors available, using lower values only in cases where there are user-agent specific limits in place (such as a limitation on the number of workers that can be created) or when the user agent desires to limit fingerprinting possibilities.
The importScripts(...urls)
method steps are:
Let urlStrings be « ».
For each url of urls:
Append the result of invoking the Get Trusted Type compliant string algorithm with TrustedScriptURL
, this's relevant
global object, url, "Worker importScripts
", and "script
" to urlStrings.
Import scripts into worker global scope given this and urlStrings.
To import scripts into worker global scope, given a
WorkerGlobalScope
object worker global scope, a list of
scalar value strings urls, and an optional
perform the fetch hook
performFetch:
If worker global scope's type is "module
", throw a
TypeError
exception.
Let settings object be the current settings object.
If urls is empty, return.
Let urlRecords be « ».
For each url of urls:
Let urlRecord be the result of encoding-parsing a URL given url, relative to settings object.
If urlRecord is failure, then throw a "SyntaxError
"
DOMException
.
Append urlRecord to urlRecords.
For each urlRecord of urlRecords:
Fetch a classic worker-imported script given urlRecord and settings object, passing along performFetch if provided. If this succeeds, let script be the result. Otherwise, rethrow the exception.
Run the classic script script, with the rethrow errors argument set to true.
script will run until it either returns, fails to parse, fails to catch an exception, or gets prematurely aborted by the terminate a worker algorithm defined above.
If an exception was thrown or if the script was prematurely aborted, then abort all these steps, letting the exception or aborting continue to be processed by the calling script.
Service Workers is an example of a specification that runs this algorithm with its own perform the fetch hook. SW
WorkerNavigator
interfaceThe navigator
attribute of the
WorkerGlobalScope
interface must return an instance of the
WorkerNavigator
interface, which represents the identity and state of the user agent
(the client):
[Exposed=Worker]
interface WorkerNavigator {};
WorkerNavigator includes NavigatorID;
WorkerNavigator includes NavigatorLanguage;
WorkerNavigator includes NavigatorOnLine;
WorkerNavigator includes NavigatorConcurrentHardware;
The WorkerNavigator
interface implements a subset of the Navigator
interface, consisting of the following APIs:
WorkerLocation
interface[Exposed=Worker]
interface WorkerLocation {
stringifier readonly attribute USVString href;
readonly attribute USVString origin;
readonly attribute USVString protocol;
readonly attribute USVString host;
readonly attribute USVString hostname;
readonly attribute USVString port;
readonly attribute USVString pathname;
readonly attribute USVString search;
readonly attribute USVString hash;
};
The WorkerLocation
interface is like the Location
interface,
but lacks the assign()
, replace()
, reload()
,
and ancestorOrigins
members.
A WorkerLocation
object has an associated WorkerGlobalScope
object (a
WorkerGlobalScope
object).
The href
getter steps are to return this's
WorkerGlobalScope
object's url, serialized.
The origin
getter steps are to return the serialization of this's WorkerGlobalScope
object's
url's origin.
The protocol
getter steps are to return
this's WorkerGlobalScope
object's
url's scheme, followed by ":
".
The host
getter steps are:
Let url be this's WorkerGlobalScope
object's
url.
If url's host is null, return the empty string.
If url's port is null, return url's host, serialized.
Return url's host, serialized, followed by ":
" and url's port, serialized.
The hostname
getter steps are:
Let host be this's WorkerGlobalScope
object's
url's host.
If host is null, return the empty string.
Return host, serialized.
The port
getter steps are:
Let port be this's WorkerGlobalScope
object's
url's port.
If port is null, return the empty string.
Return port, serialized.
The pathname
getter steps are to return the result
of URL path serializing this's WorkerGlobalScope
object's
url.
The search
getter steps are:
Let query be this's WorkerGlobalScope
object's
url's query.
If query is either null or the empty string, return the empty string.
Return "?
", followed by query.
The hash
getter steps are:
Let fragment be this's WorkerGlobalScope
object's
url's fragment.
If fragment is either null or the empty string, return the empty string.
Return "#
", followed by fragment.
Worklets are a piece of specification infrastructure which can be used for running scripts independent of the main JavaScript execution environment, while not requiring any particular implementation model.
The worklet infrastructure specified here cannot be used directly by web developers. Instead, other specifications build upon it to create directly-usable worklet types, specialized for running in particular parts of the browser implementation pipeline.
Allowing extension points to rendering, or other sensitive parts of the implementation pipeline
such as audio output, is difficult. If extension points were done with full access to the APIs
available on Window
, engines would need to abandon previously-held assumptions for
what could happen in the middle of those phases. For example, during the layout phase, rendering
engines assume that no DOM will be modified.
Additionally, defining extension points in the Window
environment would restrict
user agents to performing work in the same thread as the Window
object. (Unless
implementations added complex, high-overhead infrastructure to allow thread-safe APIs, as well
as thread-joining guarantees.)
Worklets are designed to allow extension points, while keeping guarantees that user agents
currently rely on. This is done through new global environments, based on subclasses of
WorkletGlobalScope
.
Worklets are similar to web workers. However, they:
Are thread-agnostic. That is, they are not designed to run on a dedicated separate thread, like each worker is. Implementations can run worklets wherever they choose (including on the main thread).
Are able to have multiple duplicate instances of the global scope created, for the purpose of parallelism.
Do not use an event-based API. Instead, classes are registered on the global scope, whose methods are invoked by the user agent.
Have a reduced API surface on the global scope.
Have a lifetime for their global object which is defined by other specifications, often in an implementation-defined manner.
As worklets have relatively high overhead, they are best used sparingly. Due to this, a given
WorkletGlobalScope
is expected to be shared between multiple separate scripts. (This
is similar to how a single Window
is shared between multiple separate scripts.)
Worklets are a general technology that serve different use cases. Some worklets, such as those defined in CSS Painting API, provide extension points intended for stateless, idempotent, and short-running computations, which have special considerations as described in the next couple of sections. Others, such as those defined in Web Audio API, are used for stateful, long-running operations. CSSPAINT WEBAUDIO
Some specifications which use worklets are intended to allow user agents to parallelize work over multiple threads, or to move work between threads as required. In these specifications, user agents might invoke methods on a web-developer-provided class in an implementation-defined order.
As a result of this, to prevent interoperability issues, authors who register classes on such
WorkletGlobalScope
s should make their code idempotent. That is, a method or set of
methods on the class should produce the same output given a particular input.
This specification uses the following techniques in order to encourage authors to write code in an idempotent way:
No reference to the global object is available (i.e., there is no counterpart to self
on WorkletGlobalScope
).
Although this was the intention when worklets were first specified, the
introduction of globalThis
has made it no longer true. See issue #6059 for more discussion.
Code is loaded as a module script, which results in the code being executed
in strict mode and with no shared this
referencing the global
proxy.
Together, these restrictions help prevent two different scripts from sharing state using properties of the global object.
Additionally, specifications which use worklets and intend to allow implementation-defined behavior must obey the following:
They must require user agents to always have at least two WorkletGlobalScope
instances per Worklet
, and randomly assign a method or set of methods on a class to
a particular WorkletGlobalScope
instance. These specifications may provide an
opt-out under memory constraints.
These specifications must allow user agents to create and destroy instances of their
WorkletGlobalScope
subclasses at any time.
Some specifications which use worklets can invoke methods on a web-developer-provided class based on the state of the user agent. To increase concurrency between threads, a user agent may invoke a method speculatively, based on potential future states.
In these specifications, user agents might invoke such methods at any time, and with any arguments, not just ones corresponding to the current state of the user agent. The results of such speculative evaluations are not displayed immediately, but can be cached for use if the user agent state matches the speculated state. This can increase the concurrency between the user agent and worklet threads.
As a result of this, to prevent interoperability risks between user agents, authors who
register classes on such WorkletGlobalScope
s should make their code stateless. That
is, the only effect of invoking a method should be its result, and not any side effects such as
updating mutable state.
The same techniques which encourage code idempotence also encourage authors to write stateless code.
For these examples, we'll use a fake worklet. The Window
object provides two
Worklet
instances, which each run code in their own collection of
FakeWorkletGlobalScope
s:
partial interface Window {
[SameObject, SecureContext] readonly attribute Worklet fakeWorklet1;
[SameObject, SecureContext] readonly attribute Worklet fakeWorklet2;
};
window.fakeWorklet1
window.fakeWorklet2
Each Window
has two Worklet
instances, fake
worklet 1 and fake worklet 2. Both of these have their worklet
global scope type set to FakeWorkletGlobalScope
, and their worklet
destination type set to "fakeworklet
". User agents should create at
least two FakeWorkletGlobalScope
instances per worklet.
"fakeworklet
" is not actually a valid destination per Fetch. But this
illustrates how real worklets would generally have their own worklet-type-specific destination.
FETCH
The fakeWorklet1
getter steps are to return
this's fake worklet 1.
The fakeWorklet2
getter steps are to return
this's fake worklet 2.
[Global=(Worklet,FakeWorklet),
Exposed=FakeWorklet,
SecureContext]
interface FakeWorkletGlobalScope : WorkletGlobalScope {
undefined registerFake(DOMString type, Function classConstructor);
};
Inside a FakeWorkletGlobalScope
, the following global method is
available:
registerFake(type, classConstructor)
Each FakeWorkletGlobalScope
has a registered class constructors map,
which is an ordered map, initially empty.
The registerFake(type, classConstructor)
method
steps are to set this's registered class constructors
map[type] to classConstructor.
To load scripts into fake worklet 1, a web developer would write:
window.fakeWorklet1.addModule('script1.mjs');
window.fakeWorklet1.addModule('script2.mjs');
Note that which script finishes fetching and runs first is dependent on network timing: it
could be either script1.mjs
or script2.mjs
. This
generally won't matter for well-written scripts intended to be loaded in worklets, if they follow
the suggestions about preparing for speculative
evaluation.
If a web developer wants to perform a task only after the scripts have successfully run and loaded into some worklets, they could write:
Promise.all([
window.fakeWorklet1.addModule('script1.mjs'),
window.fakeWorklet2.addModule('script2.mjs')
]).then(() => {
// Do something which relies on those scripts being loaded.
});
Another important point about script-loading is that loaded scripts can be run in multiple
WorkletGlobalScope
s per Worklet
, as discussed in the section on code idempotence. In particular, the specification above
for fake worklet 1 and fake worklet 2 require this. So, consider a
scenario such as the following:
// script.mjs
console.log("Hello from a FakeWorkletGlobalScope!");
// app.mjs
window.fakeWorklet1.addModule("script.mjs");
This could result in output such as the following from a user agent's console:
[fakeWorklet1#1] Hello from a FakeWorkletGlobalScope!
[fakeWorklet1#4] Hello from a FakeWorkletGlobalScope!
[fakeWorklet1#2] Hello from a FakeWorkletGlobalScope!
[fakeWorklet1#3] Hello from a FakeWorkletGlobalScope!
If the user agent at some point decided to kill and restart the third instance of
FakeWorkletGlobalScope
, the console would again print [fakeWorklet1#3] Hello from a FakeWorkletGlobalScope!
when this occurs.
Let's say that one of the intended usages of our fake worklet by web developers is to allow them to customize the highly-complex process of boolean negation. They might register their customization as follows:
// script.mjs
registerFake('negation-processor', class {
process(arg) {
return !arg;
}
});
// app.mjs
window.fakeWorklet1.addModule("script.mjs");
To make use of such registered classes, the specification for fake worklets could define a find the opposite of true algorithm, given a
Worklet
worklet, which invokes the process
method on any class registered to one of worklet's global
scopes as having type "negation-processor
", with true as the argument, and
then uses the result in some way.:
Optionally, create a worklet global scope for worklet.
Let workletGlobalScope be one of worklet's global scopes, chosen in an implementation-defined manner.
Let classConstructor be workletGlobalScope's registered class
constructors map["negation-processor
"].
Let classInstance be the result of constructing classConstructor, with no arguments.
Let function be Get(classInstance,
"process
"). Rethrow any exceptions.
Let callback be the result of converting function to a Web IDL Function
instance.
Return the result of invoking
callback with « true » and "rethrow
", and with callback this value set to
classInstance.
Another, perhaps better, specification architecture would be to extract the "process
" property and convert it into a Function
at registration time, as part of the registerFake()
method steps.
Subclasses of WorkletGlobalScope
are used to create global objects wherein code loaded into a particular Worklet
can
execute.
[Exposed=Worklet, SecureContext]
interface WorkletGlobalScope {};
Other specifications are intended to subclass WorkletGlobalScope
,
adding APIs to register a class, as well as other APIs specific for their worklet type.
Each WorkletGlobalScope
has an associated module map. It is a module map,
initially empty.
Each WorkletGlobalScope
is contained in its own worklet agent, which
has its corresponding event loop. However, in
practice, implementation of these agents and event loops is expected to be different from most
others.
A worklet agent exists for each WorkletGlobalScope
since, in theory,
an implementation could use a separate thread for each WorkletGlobalScope
instance,
and allowing this level of parallelism is best done using agents. However, because their
[[CanBlock]] value is false, there is no requirement that agents and threads are one-to-one. This
allows implementations the freedom to execute scripts loaded into a worklet on any thread,
including one running code from other agents with [[CanBlock]] of false, such as the thread of a
similar-origin window agent ("the main thread"). Contrast this with dedicated worker agents, whose true value for [[CanBlock]]
effectively requires them to get a dedicated operating system thread.
Worklet event loops are also somewhat special. They are only
used for tasks associated with addModule()
, tasks wherein the user agent invokes
author-defined methods, and microtasks. Thus, even though the event loop processing model specifies that all event loops
run continuously, implementations can achieve observably-equivalent results using a simpler
strategy, which just invokes author-provided
methods and then relies on that process to perform a microtask checkpoint.
To create a worklet global scope for a Worklet
worklet:
Let outsideSettings be worklet's relevant settings object.
Let agent be the result of obtaining a worklet agent given outsideSettings. Run the rest of these steps in that agent.
Let realmExecutionContext be the result of creating a new realm given agent and the following customizations:
For the global object, create a new object of the type given by worklet's worklet global scope type.
Let workletGlobalScope be the global object of realmExecutionContext's Realm component.
Let insideSettings be the result of setting up a worklet environment settings object given realmExecutionContext and outsideSettings.
Let pendingAddedModules be a clone of worklet's added modules list.
Let runNextAddedModule be the following steps:
If pendingAddedModules is not empty, then:
Let moduleURL be the result of dequeueing from pendingAddedModules.
Fetch a worklet script graph given moduleURL, insideSettings, worklet's worklet destination type, what credentials mode?, insideSettings, worklet's module responses map, and with the following steps given script:
This will not actually perform a network request, as it will just reuse responses from worklet's module responses map. The main purpose of this step is to create a new workletGlobalScope-specific module script from the response.
Assert: script is not null, since the fetch succeeded and the source text was successfully parsed when worklet's module responses map was initially populated with moduleURL.
Run a module script given script.
Run runNextAddedModule.
Append workletGlobalScope to
outsideSettings's global
object's associated
Document
's worklet
global scopes.
Append workletGlobalScope to worklet's global scopes.
Run the responsible event loop specified by insideSettings.
Run runNextAddedModule.
To terminate a worklet global scope given a WorkletGlobalScope
workletGlobalScope:
Let eventLoop be workletGlobalScope's relevant agent's event loop.
If there are any tasks queued in eventLoop's task queues, discard them without processing them.
Wait for eventLoop to complete the currently running task.
If the previous step doesn't complete within an implementation-defined period of time, then abort the script currently running in the worklet.
Destroy eventLoop.
Remove workletGlobalScope from the global scopes of the Worklet
whose
global scopes contains
workletGlobalScope.
Remove workletGlobalScope from the worklet global scopes of the
Document
whose worklet global
scopes contains workletGlobalScope.
To set up a worklet environment settings object, given a JavaScript execution context executionContext and an environment settings object outsideSettings:
Let origin be a unique opaque origin.
Let inheritedAPIBaseURL be outsideSettings's API base URL.
Let inheritedPolicyContainer be a clone of outsideSettings's policy container.
Let realm be the value of executionContext's Realm component.
Let workletGlobalScope be realm's global object.
Let settingsObject be a new environment settings object whose algorithms are defined as follows:
Return executionContext.
Return workletGlobalScope's module map.
Return inheritedAPIBaseURL.
Unlike workers or other globals derived from a single resource, worklets have
no primary resource; instead, multiple scripts, each with their own URL, are loaded into the
global scope via worklet.addModule()
. So this API base URL
is rather unlike that of other globals. However, so far this doesn't matter, as no APIs
available to worklet code make use of the API base URL.
Return origin.
Return inheritedPolicyContainer.
Return TODO.
Assert: this algorithm is never called, because the time origin is not available in a worklet context.
Set settingsObject's id to a new unique opaque string, creation URL to inheritedAPIBaseURL, top-level creation URL to null, top-level origin to outsideSettings's top-level origin, target browsing context to null, and active service worker to null.
Set realm's [[HostDefined]] field to settingsObject.
Return settingsObject.
Worklet
classThe Worklet
class provides the capability to add module scripts into its
associated WorkletGlobalScope
s. The user agent can then create classes registered on
the WorkletGlobalScope
s and invoke their methods.
[Exposed=Window, SecureContext]
interface Worklet {
[NewObject] Promise<undefined> addModule(USVString moduleURL, optional WorkletOptions options = {});
};
dictionary WorkletOptions {
RequestCredentials credentials = "same-origin";
};
Specifications that create Worklet
instances must specify the following for a
given instance:
its worklet global scope type, which must be a Web IDL type that inherits from WorkletGlobalScope
; and
its worklet destination type, which must be a destination, and is used when fetching scripts.
await worklet.addModule(moduleURL[, { credentials }])
Loads and executes the module script given by moduleURL into all of worklet's global scopes. It can also create additional global scopes as part of this process, depending on the worklet type. The returned promise will fulfill once the script has been successfully loaded and run in all global scopes.
The credentials
option can be set to a
credentials mode to modify the
script-fetching process. It defaults to "same-origin
".
Any failures in fetching the script or its
dependencies will cause the returned promise to be rejected with an
"AbortError
" DOMException
. Any errors in parsing the
script or its dependencies will cause the returned promise to be rejected with the exception
generated during parsing.
A Worklet
has a list of global scopes, which contains
instances of the Worklet
's worklet global scope type. It is initially
empty.
A Worklet
has an added modules
list, which is a list of URLs, initially empty.
Access to this list should be thread-safe.
A Worklet
has a module
responses map, which is an ordered map from URLs to
either "fetching
" or tuples consisting of a
response and either null, failure, or a byte
sequence representing the response body. This map is initially empty, and access to it
should be thread-safe.
The added modules list and module responses map exist to ensure that
WorkletGlobalScope
s created at different times get equivalent module scripts run in them, based on the same source text. This allows the
creation of additional WorkletGlobalScope
s to be transparent to the author.
In practice, user agents are not expected to implement these data structures, and the
algorithms that consult them, using thread-safe programming techniques. Instead, when addModule()
is called, user agents can fetch the module
graph on the main thread, and send the fetched source text (i.e., the important data contained in
the module responses map) to each
thread which has a WorkletGlobalScope
.
Then, when a user agent creates a new
WorkletGlobalScope
for a given Worklet
, it can simply send the map of
fetched source text and the list of entry points from the main thread to the thread containing
the new WorkletGlobalScope
.
The addModule(moduleURL,
options)
method steps are:
Let outsideSettings be the relevant settings object of this.
Let moduleURLRecord be the result of encoding-parsing a URL given moduleURL, relative to outsideSettings.
If moduleURLRecord is failure, then return a promise rejected with
a "SyntaxError
" DOMException
.
Let promise be a new promise.
Run the following steps in parallel:
If this's global scopes is empty, then:
Create a worklet global scope given this.
Optionally, create additional global scope instances given this, depending on the specific worklet in question and its specification.
Wait for all steps of the creation process(es) — including those taking place within the worklet agents — to complete, before moving on.
Let pendingTasks be this's global scopes's size.
Let addedSuccessfully be false.
For each workletGlobalScope of
this's global scopes,
queue a global task on the networking task source given
workletGlobalScope to fetch a worklet script graph given
moduleURLRecord, outsideSettings, this's worklet
destination type, options["credentials
"], workletGlobalScope's
relevant settings object, this's module responses map, and the following
steps given script:
Only the first of these fetches will actually perform a network request; the
ones for other WorkletGlobalScope
s will reuse responses from this's module responses map.
If script is null, then:
Queue a global task on the networking task source given this's relevant global object to perform the following steps:
If pendingTasks is not −1, then:
Set pendingTasks to −1.
Reject promise with an "AbortError
"
DOMException
.
Abort these steps.
If script's error to rethrow is not null, then:
Queue a global task on the networking task source given this's relevant global object to perform the following steps:
If pendingTasks is not −1, then:
Set pendingTasks to −1.
Reject promise with script's error to rethrow.
Abort these steps.
If addedSuccessfully is false, then:
Append moduleURLRecord to this's added modules list.
Set addedSuccessfully to true.
Run a module script given script.
Queue a global task on the networking task source given this's relevant global object to perform the following steps:
If pendingTasks is not −1, then:
Set pendingTasks to pendingTasks − 1.
If pendingTasks is 0, then resolve promise.
Return promise.
The lifetime of a Worklet
has no special considerations; it is tied to the object
it belongs to, such as the Window
.
Each Document
has a worklet
global scopes, which is a set of WorkletGlobalScope
s, initially
empty.
The lifetime of a WorkletGlobalScope
is, at a minimum, tied to the
Document
whose worklet global
scopes contain it. In particular, destroying the
Document
will terminate the
corresponding WorkletGlobalScope
and allow it to be garbage-collected.
Additionally, user agents may, at any time, terminate a given WorkletGlobalScope
, unless the specification defining
the corresponding worklet type says otherwise. For example, they might terminate them if the
worklet agent's event loop has no
tasks queued, or if the user agent has no pending operations
planning to make use of the worklet, or if the user agent detects abnormal operations such as
infinite loops or callbacks exceeding imposed time limits.
Finally, specifications for specific worklet types can give more specific details on when to
create WorkletGlobalScope
s for a
given worklet type. For example, they might create them during specific processes that call upon
worklet code, as in the example.
This specification introduces two related mechanisms, similar to HTTP session cookies, for storing name-value pairs on the client side. COOKIES
The first is designed for scenarios where the user is carrying out a single transaction, but could be carrying out multiple transactions in different windows at the same time.
Cookies don't really handle this case well. For example, a user could be buying plane tickets in two different windows, using the same site. If the site used cookies to keep track of which ticket the user was buying, then as the user clicked from page to page in both windows, the ticket currently being purchased would "leak" from one window to the other, potentially causing the user to buy two tickets for the same flight without noticing.
To address this, this specification introduces the sessionStorage
getter. Sites can add data to the session
storage, and it will be accessible to any page from the same site opened in that window.
For example, a page could have a checkbox that the user ticks to indicate that they want insurance:
<label>
<input type="checkbox" onchange="sessionStorage.insurance = checked ? 'true' : ''">
I want insurance on this trip.
</label>
A later page could then check, from script, whether the user had checked the checkbox or not:
if (sessionStorage.insurance) { ... }
If the user had multiple windows opened on the site, each one would have its own individual copy of the session storage object.
The second storage mechanism is designed for storage that spans multiple windows, and lasts beyond the current session. In particular, web applications might wish to store megabytes of user data, such as entire user-authored documents or a user's mailbox, on the client side for performance reasons.
Again, cookies do not handle this case well, because they are transmitted with every request.
The localStorage
getter is used to access a page's local
storage area.
The site at example.com can display a count of how many times the user has loaded its page by putting the following at the bottom of its page:
<p>
You have viewed this page
<span id="count">an untold number of</span>
time(s).
</p>
<script>
if (!localStorage.pageLoadCount)
localStorage.pageLoadCount = 0;
localStorage.pageLoadCount = parseInt(localStorage.pageLoadCount) + 1;
document.getElementById('count').textContent = localStorage.pageLoadCount;
</script>
Each site has its own separate storage area.
The localStorage
getter provides access
to shared state. This specification does not define the interaction with other agent clusters
in a multiprocess user agent, and authors are encouraged to assume that there is no locking
mechanism. A site could, for instance, try to read the value of a key, increment its value, then
write it back out, using the new value as a unique identifier for the session; if the site does
this twice in two different browser windows at the same time, it might end up using the same
"unique" identifier for both sessions, with potentially disastrous effects.
Storage
interface[Exposed=Window]
interface Storage {
readonly attribute unsigned long length;
DOMString? key(unsigned long index);
getter DOMString? getItem(DOMString key);
setter undefined setItem(DOMString key, DOMString value);
deleter undefined removeItem(DOMString key);
undefined clear();
};
storage.length
Returns the number of key/value pairs.
storage.key (n)
Returns the name of the nth key, or null if n is greater than or equal to the number of key/value pairs.
value = storage.getItem (key)
value = storage[key]
Returns the current value associated with the given key, or null if the given key does not exist.
storage.setItem (key, value)
storage[key] = value
Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.
Throws a "QuotaExceededError
" DOMException
exception
if the new value couldn't be set. (Setting could fail if, e.g., the user has disabled storage
for the site, or if the quota has been exceeded.)
Dispatches a storage
event on Window
objects
holding an equivalent Storage
object.
storage.removeItem (key)
delete
storage[key]Removes the key/value pair with the given key, if a key/value pair with the given key exists.
Dispatches a storage
event on Window
objects
holding an equivalent Storage
object.
storage.clear()
Removes all key/value pairs, if there are any.
Dispatches a storage
event on Window
objects
holding an equivalent Storage
object.
A Storage
object has an associated:
local
" or "session
".
To reorder a Storage
object
storage, reorder storage's map's
entries in an implementation-defined manner.
Unfortunate as it is, iteration order is not defined and can change upon most mutations.
To broadcast a Storage
object
storage, given a key, oldValue, and newValue, run
these steps:
Let thisDocument be storage's relevant global object's associated Document
.
Let url be thisDocument's URL.
Let remoteStorages be all Storage
objects excluding
storage whose:
and, if type is "session
",
whose relevant settings object's associated
Document
's node navigable's traversable navigable is thisDocument's node
navigable's traversable navigable.
For each remoteStorage of
remoteStorages: queue a global task on the DOM manipulation task
source given remoteStorage's relevant global object to fire an event named storage
at remoteStorage's relevant global
object, using StorageEvent
, with key
initialized to key, oldValue
initialized to oldValue, newValue
initialized to newValue, url
initialized to url, and storageArea
initialized to
remoteStorage.
The Document
object associated with the resulting task is not necessarily fully active, but events fired
on such objects are ignored by the event loop until the Document
becomes fully active again.
The length
getter
steps are to return this's map's size.
The key(index)
method steps are:
If index is greater than or equal to this's map's size, then return null.
Let keys be the result of running get the keys on this's map.
Return keys[index].
The supported property names on a Storage
object storage
are the result of running get the keys on
storage's map.
The getItem(key)
method steps are:
If this's map[key] does not exist, then return null.
Return this's map[key].
The setItem(key,
value)
method are:
Let oldValue be null.
Let reorder be true.
If this's map[key] exists:
Set oldValue to this's map[key].
If oldValue is value, then return.
Set reorder to false.
If value cannot be stored, then throw a
"QuotaExceededError
" DOMException
exception.
Set this's map[key] to value.
If reorder is true, then reorder this.
Broadcast this with key, oldValue, and value.
The removeItem(key)
method steps are:
If this's map[key] does not exist, then return null.
Set oldValue to this's map[key].
Remove this's map[key].
Reorder this.
Broadcast this with key, oldValue, and null.
The clear()
method
steps are:
Clear this's map.
Broadcast this with null, null, and null.
sessionStorage
getterinterface mixin WindowSessionStorage {
readonly attribute Storage sessionStorage;
};
Window includes WindowSessionStorage;
window.sessionStorage
Returns the Storage
object associated with that window's origin's
session storage area.
Throws a "SecurityError
" DOMException
if the
Document
's origin is an opaque origin or if the request violates a policy decision
(e.g., if the user agent is configured to not allow the page to persist data).
A Document
object has an associated session storage holder, which is
null or a Storage
object. It is initially null.
The sessionStorage
getter steps are:
If this's associated
Document
's session storage holder is non-null, then return
this's associated
Document
's session storage holder.
Let map be the result of running obtain a session storage bottle
map with this's relevant settings object and "sessionStorage
".
If map is failure, then throw a "SecurityError
"
DOMException
.
Let storage be a new Storage
object whose map is map.
Set this's associated
Document
's session storage holder to
storage.
Return storage.
After creating a new auxiliary browsing context and document, the session storage is copied over.
localStorage
getterinterface mixin WindowLocalStorage {
readonly attribute Storage localStorage;
};
Window includes WindowLocalStorage;
window.localStorage
Returns the Storage
object associated with window's origin's local
storage area.
Throws a "SecurityError
" DOMException
if the
Document
's origin is an opaque origin or if the request violates a policy decision
(e.g., if the user agent is configured to not allow the page to persist data).
A Document
object has an associated local storage holder, which is null
or a Storage
object. It is initially null.
The localStorage
getter steps are:
If this's associated
Document
's local storage holder is non-null, then return
this's associated
Document
's local storage holder.
Let map be the result of running obtain a local storage bottle map
with this's relevant settings object and "localStorage
".
If map is failure, then throw a "SecurityError
"
DOMException
.
Let storage be a new Storage
object whose map is map.
Set this's associated
Document
's local storage holder to storage.
Return storage.
StorageEvent
interface[Exposed=Window]
interface StorageEvent : Event {
constructor(DOMString type, optional StorageEventInit eventInitDict = {});
readonly attribute DOMString? key;
readonly attribute DOMString? oldValue;
readonly attribute DOMString? newValue;
readonly attribute USVString url;
readonly attribute Storage? storageArea;
undefined initStorageEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional DOMString? key = null, optional DOMString? oldValue = null, optional DOMString? newValue = null, optional USVString url = "", optional Storage? storageArea = null);
};
dictionary StorageEventInit : EventInit {
DOMString? key = null;
DOMString? oldValue = null;
DOMString? newValue = null;
USVString url = "";
Storage? storageArea = null;
};
event.key
Returns the key of the storage item being changed.
event.oldValue
Returns the old value of the key of the storage item whose value is being changed.
event.newValue
Returns the new value of the key of the storage item whose value is being changed.
event.url
Returns the URL of the document whose storage item changed.
event.storageArea
Returns the Storage
object that was affected.
The key
,
oldValue
,
newValue
,
url
, and storageArea
attributes must return the values they were initialized to.
The initStorageEvent(type, bubbles,
cancelable, key, oldValue, newValue, url,
storageArea)
method must initialize the event in a manner analogous to the
similarly-named initEvent()
method. DOM
A third-party advertiser (or any entity capable of getting content distributed to multiple sites) could use a unique identifier stored in its local storage area to track a user across multiple sessions, building a profile of the user's interests to allow for highly targeted advertising. In conjunction with a site that is aware of the user's real identity (for example an e-commerce site that requires authenticated credentials), this could allow oppressive groups to target individuals with greater accuracy than in a world with purely anonymous web usage.
There are a number of techniques that can be used to mitigate the risk of user tracking:
User agents may restrict access to the localStorage
objects to scripts originating at the domain of the active
document of the top-level traversable, for instance denying access to the
API for pages from other domains running in iframe
s.
User agents may, possibly in a manner configured by the user, automatically delete stored data after a period of time.
For example, a user agent could be configured to treat third-party local storage areas as session-only storage, deleting the data once the user had closed all the navigables that could access it.
This can restrict the ability of a site to track a user, as the site would then only be able to track the user across multiple sessions when they authenticate with the site itself (e.g. by making a purchase or logging in to a service).
However, this also reduces the usefulness of the API as a long-term storage mechanism. It can also put the user's data at risk, if the user does not fully understand the implications of data expiration.
If users attempt to protect their privacy by clearing cookies without also clearing data stored in the local storage area, sites can defeat those attempts by using the two features as redundant backup for each other. User agents should present the interfaces for clearing these in a way that helps users to understand this possibility and enables them to delete data in all persistent storage features simultaneously. COOKIES
User agents may allow sites to access session storage areas in an unrestricted manner, but require the user to authorize access to local storage areas.
User agents may record the origins of sites that contained content from third-party origins that caused data to be stored.
If this information is then used to present the view of data currently in persistent storage, it would allow the user to make informed decisions about which parts of the persistent storage to prune. Combined with a blocklist ("delete this data and prevent this domain from ever storing data again"), the user can restrict the use of persistent storage to sites that they trust.
User agents may allow users to share their persistent storage domain blocklists.
This would allow communities to act together to protect their privacy.
While these suggestions prevent trivial use of this API for user tracking, they do not block it altogether. Within a single domain, a site can continue to track the user during a session, and can then pass all this information to the third party along with any identifying information (names, credit card numbers, addresses) obtained by the site. If a third party cooperates with multiple sites to obtain such information, a profile can still be created.
However, user tracking is to some extent possible even with no cooperation from the user agent whatsoever, for instance by using session identifiers in URLs, a technique already commonly used for innocuous purposes but easily repurposed for user tracking (even retroactively). This information can then be shared with other sites, using visitors' IP addresses and other user-specific data (e.g. user-agent headers and configuration settings) to combine separate sessions into coherent user profiles.
User agents should treat persistently stored data as potentially sensitive; it's quite possible for emails, calendar appointments, health records, or other confidential documents to be stored in this mechanism.
To this end, user agents should ensure that when deleting data, it is promptly deleted from the underlying storage.
Because of the potential for DNS spoofing attacks, one cannot guarantee that a host claiming to be in a certain domain really is from that domain. To mitigate this, pages can use TLS. Pages using TLS can be sure that only the user, software working on behalf of the user, and other pages using TLS that have certificates identifying them as being from the same domain, can access their storage areas.
Different authors sharing one host name, for example users hosting content on the now defunct
geocities.com
, all share one local storage object. There is no feature to
restrict the access by pathname. Authors on shared hosts are therefore urged to avoid using these
features, as it would be trivial for other authors to read the data and overwrite it.
Even if a path-restriction feature was made available, the usual DOM scripting security model would make it trivial to bypass this protection and access the data from any path.
The two primary risks when implementing these persistent storage features are letting hostile sites read information from other domains, and letting hostile sites write information that is then read from other domains.
Letting third-party sites read data that is not supposed to be read from their domain causes information leakage. For example, a user's shopping wishlist on one domain could be used by another domain for targeted advertising; or a user's work-in-progress confidential documents stored by a word-processing site could be examined by the site of a competing company.
Letting third-party sites write data to the persistent storage of other domains can result in information spoofing, which is equally dangerous. For example, a hostile site could add items to a user's wishlist; or a hostile site could set a user's session identifier to a known ID that the hostile site can then use to track the user's actions on the victim site.
Thus, strictly following the origin model described in this specification is important for user security.
This section only describes the rules for resources labeled with an HTML MIME type. Rules for XML resources are discussed in the section below entitled "The XML syntax".
This section only applies to documents, authoring tools, and markup generators. In particular, it does not apply to conformance checkers; conformance checkers must use the requirements given in the next section ("parsing HTML documents").
Documents must consist of the following parts, in the given order:
html
element.The various types of content mentioned above are described in the next few sections.
In addition, there are some restrictions on how character encoding declarations are to be serialized, as discussed in the section on that topic.
ASCII whitespace before the html
element, at the start of the
html
element and before the head
element, will be dropped when the
document is parsed; ASCII whitespace after the html
element
will be parsed as if it were at the end of the body
element. Thus, ASCII
whitespace around the document element does not round-trip.
It is suggested that newlines be inserted after the DOCTYPE, after any comments that are
before the document element, after the html
element's start tag (if it is not omitted), and after any comments that are inside the
html
element but before the head
element.
Many strings in the HTML syntax (e.g. the names of elements and their attributes) are case-insensitive, but only for ASCII upper alphas and ASCII lower alphas. For convenience, in this section this is just referred to as "case-insensitive".
A DOCTYPE is a required preamble.
DOCTYPEs are required for legacy reasons. When omitted, browsers tend to use a different rendering mode that is incompatible with some specifications. Including the DOCTYPE in a document ensures that the browser makes a best-effort attempt at following the relevant specifications.
A DOCTYPE must consist of the following components, in this order:
<!DOCTYPE
".html
".In other words, <!DOCTYPE html>
, case-insensitively.
For the purposes of HTML generators that cannot output HTML markup with the short DOCTYPE
"<!DOCTYPE html>
", a DOCTYPE legacy string may be inserted
into the DOCTYPE (in the position defined above). This string must consist of:
SYSTEM
".about:legacy-compat
".In other words, <!DOCTYPE html SYSTEM "about:legacy-compat">
or
<!DOCTYPE html SYSTEM 'about:legacy-compat'>
, case-insensitively except for the
part in single or double quotes.
The DOCTYPE legacy string should not be used unless the document is generated from a system that cannot output the shorter string.
There are six different kinds of elements: void
elements, the template
element, raw text
elements, escapable raw text elements, foreign elements, and
normal elements.
area
, base
, br
, col
, embed
,
hr
, img
, input
, link
, meta
,
source
, track
, wbr
template
elementtemplate
script
, style
textarea
, title
Tags are used to delimit the start and end of elements in the markup. Raw text, escapable raw text, and normal elements have a start tag to indicate where they begin, and an end tag to indicate where they end. The start and end tags of certain normal elements can be omitted, as described below in the section on optional tags. Those that cannot be omitted must not be omitted. Void elements only have a start tag; end tags must not be specified for void elements. Foreign elements must either have a start tag and an end tag, or a start tag that is marked as self-closing, in which case they must not have an end tag.
The contents of the element must be placed between just after the start tag (which might be implied, in certain cases) and just before the end tag (which again, might be implied in certain cases). The exact allowed contents of each individual element depend on the content model of that element, as described earlier in this specification. Elements must not contain content that their content model disallows. In addition to the restrictions placed on the contents by those content models, however, the five types of elements have additional syntactic requirements.
Void elements can't have any contents (since there's no end tag, no content can be put between the start tag and the end tag).
The template
element can have
template contents, but such template contents are not children of the
template
element itself. Instead, they are stored in a DocumentFragment
associated with a different Document
— without a browsing context — so
as to avoid the template
contents interfering with the main Document
.
The markup for the template contents of a template
element is placed
just after the template
element's start tag and just before template
element's end tag (as with other elements), and may consist of any text, character references, elements, and comments, but
the text must not contain the character U+003C LESS-THAN SIGN (<) or an ambiguous ampersand.
Raw text elements can have text, though it has restrictions described below.
Escapable raw text elements can have text and character references, but the text must not contain an ambiguous ampersand. There are also further restrictions described below.
Foreign elements whose start tag is marked as self-closing can't have any contents (since, again, as there's no end tag, no content can be put between the start tag and the end tag). Foreign elements whose start tag is not marked as self-closing can have text, character references, CDATA sections, other elements, and comments, but the text must not contain the character U+003C LESS-THAN SIGN (<) or an ambiguous ampersand.
The HTML syntax does not support namespace declarations, even in foreign elements.
For instance, consider the following HTML fragment:
<p>
<svg>
<metadata>
<!-- this is invalid -->
<cdr:license xmlns:cdr="https://www.example.com/cdr/metadata" name="MIT"/>
</metadata>
</svg>
</p>
The innermost element, cdr:license
, is actually in the SVG namespace, as
the "xmlns:cdr
" attribute has no effect (unlike in XML). In fact, as the
comment in the fragment above says, the fragment is actually non-conforming. This is because
SVG 2 does not define any elements called "cdr:license
" in
the SVG namespace.
Normal elements can have text, character references, other elements, and comments, but the text must not contain the character U+003C LESS-THAN SIGN (<) or an ambiguous ampersand. Some normal elements also have yet more restrictions on what content they are allowed to hold, beyond the restrictions imposed by the content model and those described in this paragraph. Those restrictions are described below.
Tags contain a tag name, giving the element's name. HTML elements all have names that only use ASCII alphanumerics. In the HTML syntax, tag names, even those for foreign elements, may be written with any mix of lower- and uppercase letters that, when converted to all-lowercase, matches the element's tag name; tag names are case-insensitive.
Start tags must have the following format:
End tags must have the following format:
Attributes for an element are expressed inside the element's start tag.
Attributes have a name and a value. Attribute names must consist of one or more characters other than controls, U+0020 SPACE, U+0022 ("), U+0027 ('), U+003E (>), U+002F (/), U+003D (=), and noncharacters. In the HTML syntax, attribute names, even those for foreign elements, may be written with any mix of ASCII lower and ASCII upper alphas.
Attribute values are a mixture of text and character references, except with the additional restriction that the text cannot contain an ambiguous ampersand.
Attributes can be specified in four different ways:
Just the attribute name. The value is implicitly the empty string.
In the following example, the disabled
attribute is
given with the empty attribute syntax:
<input disabled>
If an attribute using the empty attribute syntax is to be followed by another attribute, then there must be ASCII whitespace separating the two.
The attribute name, followed by zero or more ASCII whitespace, followed by a single U+003D EQUALS SIGN character, followed by zero or more ASCII whitespace, followed by the attribute value, which, in addition to the requirements given above for attribute values, must not contain any literal ASCII whitespace, any U+0022 QUOTATION MARK characters ("), U+0027 APOSTROPHE characters ('), U+003D EQUALS SIGN characters (=), U+003C LESS-THAN SIGN characters (<), U+003E GREATER-THAN SIGN characters (>), or U+0060 GRAVE ACCENT characters (`), and must not be the empty string.
In the following example, the value
attribute is given
with the unquoted attribute value syntax:
<input value=yes>
If an attribute using the unquoted attribute syntax is to be followed by another attribute or by the optional U+002F SOLIDUS character (/) allowed in step 6 of the start tag syntax above, then there must be ASCII whitespace separating the two.
The attribute name, followed by zero or more ASCII whitespace, followed by a single U+003D EQUALS SIGN character, followed by zero or more ASCII whitespace, followed by a single U+0027 APOSTROPHE character ('), followed by the attribute value, which, in addition to the requirements given above for attribute values, must not contain any literal U+0027 APOSTROPHE characters ('), and finally followed by a second single U+0027 APOSTROPHE character (').
In the following example, the type
attribute is given
with the single-quoted attribute value syntax:
<input type='checkbox'>
If an attribute using the single-quoted attribute syntax is to be followed by another attribute, then there must be ASCII whitespace separating the two.
The attribute name, followed by zero or more ASCII whitespace, followed by a single U+003D EQUALS SIGN character, followed by zero or more ASCII whitespace, followed by a single U+0022 QUOTATION MARK character ("), followed by the attribute value, which, in addition to the requirements given above for attribute values, must not contain any literal U+0022 QUOTATION MARK characters ("), and finally followed by a second single U+0022 QUOTATION MARK character (").
In the following example, the name
attribute is given with
the double-quoted attribute value syntax:
<input name="be evil">
If an attribute using the double-quoted attribute syntax is to be followed by another attribute, then there must be ASCII whitespace separating the two.
There must never be two or more attributes on the same start tag whose names are an ASCII case-insensitive match for each other.
When a foreign element has one of the namespaced attributes given by the local name and namespace of the first and second cells of a row from the following table, it must be written using the name given by the third cell from the same row.
Local name | Namespace | Attribute name |
---|---|---|
actuate | XLink namespace | xlink:actuate
|
arcrole | XLink namespace | xlink:arcrole
|
href | XLink namespace | xlink:href
|
role | XLink namespace | xlink:role
|
show | XLink namespace | xlink:show
|
title | XLink namespace | xlink:title
|
type | XLink namespace | xlink:type
|
lang | XML namespace | xml:lang
|
space | XML namespace | xml:space
|
xmlns | XMLNS namespace | xmlns
|
xlink | XMLNS namespace | xmlns:xlink
|
No other namespaced attribute can be expressed in the HTML syntax.
Whether the attributes in the table above are conforming or not is defined by other specifications (e.g. SVG 2 and MathML); this section only describes the syntax rules if the attributes are serialized using the HTML syntax.
Certain tags can be omitted.
Omitting an element's start tag in the
situations described below does not mean the element is not present; it is implied, but it is
still there. For example, an HTML document always has a root html
element, even if
the string <html>
doesn't appear anywhere in the markup.
An html
element's start tag may be omitted
if the first thing inside the html
element is not a comment.
For example, in the following case it's ok to remove the "<html>
"
tag:
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>Welcome to this example.</p>
</body>
</html>
Doing so would make the document look like this:
<!DOCTYPE HTML>
<head>
<title>Hello</title>
</head>
<body>
<p>Welcome to this example.</p>
</body>
</html>
This has the exact same DOM. In particular, note that whitespace around the document element is ignored by the parser. The following example would also have the exact same DOM:
<!DOCTYPE HTML><head>
<title>Hello</title>
</head>
<body>
<p>Welcome to this example.</p>
</body>
</html>
However, in the following example, removing the start tag moves the comment to before the
html
element:
<!DOCTYPE HTML>
<html>
<!-- where is this comment in the DOM? -->
<head>
<title>Hello</title>
</head>
<body>
<p>Welcome to this example.</p>
</body>
</html>
With the tag removed, the document actually turns into the same as this:
<!DOCTYPE HTML>
<!-- where is this comment in the DOM? -->
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>Welcome to this example.</p>
</body>
</html>
This is why the tag can only be removed if it is not followed by a comment: removing the tag when there is a comment there changes the document's resulting parse tree. Of course, if the position of the comment does not matter, then the tag can be omitted, as if the comment had been moved to before the start tag in the first place.
An html
element's end tag may be omitted if
the html
element is not immediately followed by a comment.
A head
element's start tag may be omitted if
the element is empty, or if the first thing inside the head
element is an
element.
A head
element's end tag may be omitted if
the head
element is not immediately followed by ASCII whitespace or a
comment.
A body
element's start tag may be omitted
if the element is empty, or if the first thing inside the body
element is not
ASCII whitespace or a comment, except if the
first thing inside the body
element is a meta
, noscript
,
link
, script
, style
, or template
element.
A body
element's end tag may be omitted if the
body
element is not immediately followed by a comment.
Note that in the example above, the head
element start and end tags, and the
body
element start tag, can't be omitted, because they are surrounded by
whitespace:
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
</head>
<body>
<p>Welcome to this example.</p>
</body>
</html>
(The body
and html
element end tags could be omitted without
trouble; any spaces after those get parsed into the body
element anyway.)
Usually, however, whitespace isn't an issue. If we first remove the whitespace we don't care about:
<!DOCTYPE HTML><html><head><title>Hello</title></head><body><p>Welcome to this example.</p></body></html>
Then we can omit a number of tags without affecting the DOM:
<!DOCTYPE HTML><title>Hello</title><p>Welcome to this example.</p>
At that point, we can also add some whitespace back:
<!DOCTYPE HTML>
<title>Hello</title>
<p>Welcome to this example.</p>
This would be equivalent to this document, with the omitted tags shown in their
parser-implied positions; the only whitespace text node that results from this is the newline at
the end of the head
element:
<!DOCTYPE HTML>
<html><head><title>Hello</title>
</head><body><p>Welcome to this example.</p></body></html>
An li
element's end tag may be omitted if the
li
element is immediately followed by another li
element or if there is
no more content in the parent element.
A dt
element's end tag may be omitted if the
dt
element is immediately followed by another dt
element or a
dd
element.
A dd
element's end tag may be omitted if the
dd
element is immediately followed by another dd
element or a
dt
element, or if there is no more content in the parent element.
A p
element's end tag may be omitted if the
p
element is immediately followed by an address
, article
,
aside
, blockquote
, details
, dialog
,
div
, dl
, fieldset
, figcaption
,
figure
, footer
, form
, h1
, h2
,
h3
, h4
, h5
, h6
, header
,
hgroup
, hr
, main
, menu
, nav
,
ol
, p
, pre
, search
, section
,
table
, or ul
element, or if there is no more content in the parent
element and the parent element is an HTML element that is not
an a
, audio
, del
, ins
, map
,
noscript
, or video
element, or an autonomous custom
element.
We can thus simplify the earlier example further:
<!DOCTYPE HTML><title>Hello</title><p>Welcome to this example.
An rt
element's end tag may be omitted if the
rt
element is immediately followed by an rt
or rp
element,
or if there is no more content in the parent element.
An rp
element's end tag may be omitted if the
rp
element is immediately followed by an rt
or rp
element,
or if there is no more content in the parent element.
An optgroup
element's end tag may be omitted
if the optgroup
element is
immediately followed by another optgroup
element, if it is immediately followed by an
hr
element, or if there is no more content in the parent
element.
An option
element's end tag may be omitted if
the option
element is immediately followed by another option
element, if
it is immediately followed by an optgroup
element, if it is immediately followed by
an hr
element, or if there is no more content in the parent element.
A colgroup
element's start tag may be
omitted if the first thing inside the colgroup
element is a col
element,
and if the element is not immediately preceded by another colgroup
element whose
end tag has been omitted. (It can't be omitted if the element
is empty.)
A colgroup
element's end tag may be omitted
if the colgroup
element is not immediately followed by ASCII whitespace
or a comment.
A caption
element's end tag may be omitted if
the caption
element is not immediately followed by ASCII whitespace or a
comment.
A thead
element's end tag may be omitted if
the thead
element is immediately followed by a tbody
or
tfoot
element.
A tbody
element's start tag may be omitted
if the first thing inside the tbody
element is a tr
element, and if the
element is not immediately preceded by a tbody
, thead
, or
tfoot
element whose end tag has been omitted. (It
can't be omitted if the element is empty.)
A tbody
element's end tag may be omitted if
the tbody
element is immediately followed by a tbody
or
tfoot
element, or if there is no more content in the parent element.
A tfoot
element's end tag may be omitted if
there is no more content in the parent element.
A tr
element's end tag may be omitted if the
tr
element is immediately followed by another tr
element, or if there is
no more content in the parent element.
A td
element's end tag may be omitted if the
td
element is immediately followed by a td
or th
element,
or if there is no more content in the parent element.
A th
element's end tag may be omitted if the
th
element is immediately followed by a td
or th
element,
or if there is no more content in the parent element.
The ability to omit all these table-related tags makes table markup much terser.
Take this example:
<table>
<caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)</caption>
<colgroup><col><col><col></colgroup>
<thead>
<tr>
<th>Function</th>
<th>Control Unit</th>
<th>Central Station</th>
</tr>
</thead>
<tbody>
<tr>
<td>Headlights</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Interior Lights</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Electric locomotive operating sounds</td>
<td>✔</td>
<td>✔</td>
</tr>
<tr>
<td>Engineer's cab lighting</td>
<td></td>
<td>✔</td>
</tr>
<tr>
<td>Station Announcements - Swiss</td>
<td></td>
<td>✔</td>
</tr>
</tbody>
</table>
The exact same table, modulo some whitespace differences, could be marked up as follows:
<table>
<caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)
<colgroup><col><col><col>
<thead>
<tr>
<th>Function
<th>Control Unit
<th>Central Station
<tbody>
<tr>
<td>Headlights
<td>✔
<td>✔
<tr>
<td>Interior Lights
<td>✔
<td>✔
<tr>
<td>Electric locomotive operating sounds
<td>✔
<td>✔
<tr>
<td>Engineer's cab lighting
<td>
<td>✔
<tr>
<td>Station Announcements - Swiss
<td>
<td>✔
</table>
Since the cells take up much less room this way, this can be made even terser by having each row on one line:
<table>
<caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)
<colgroup><col><col><col>
<thead>
<tr> <th>Function <th>Control Unit <th>Central Station
<tbody>
<tr> <td>Headlights <td>✔ <td>✔
<tr> <td>Interior Lights <td>✔ <td>✔
<tr> <td>Electric locomotive operating sounds <td>✔ <td>✔
<tr> <td>Engineer's cab lighting <td> <td>✔
<tr> <td>Station Announcements - Swiss <td> <td>✔
</table>
The only differences between these tables, at the DOM level, is with the precise position of the (in any case semantically-neutral) whitespace.
However, a start tag must never be omitted if it has any attributes.
Returning to the earlier example with all the whitespace removed and then all the optional tags removed:
<!DOCTYPE HTML><title>Hello</title><p>Welcome to this example.
If the body
element in this example had to have a class
attribute and the html
element had to have a lang
attribute, the markup would have to become:
<!DOCTYPE HTML><html lang="en"><title>Hello</title><body class="demo"><p>Welcome to this example.
This section assumes that the document is conforming, in particular, that there are no content model violations. Omitting tags in the fashion described in this section in a document that does not conform to the content models described in this specification is likely to result in unexpected DOM differences (this is, in part, what the content models are designed to avoid).
For historical reasons, certain elements have extra restrictions beyond even the restrictions given by their content model.
A table
element must not contain tr
elements, even though these
elements are technically allowed inside table
elements according to the content
models described in this specification. (If a tr
element is put inside a
table
in the markup, it will in fact imply a tbody
start tag before
it.)
A single newline may be placed immediately after the start tag of pre
and textarea
elements.
This does not affect the processing of the element. The otherwise optional newline must be included if the element's contents
themselves start with a newline (because otherwise the
leading newline in the contents would be treated like the optional newline, and ignored).
The following two pre
blocks are equivalent:
<pre>Hello</pre>
<pre>
Hello</pre>
The text in raw text and escapable raw text
elements must not contain any occurrences of the string "</
"
(U+003C LESS-THAN SIGN, U+002F SOLIDUS) followed by characters that case-insensitively match the
tag name of the element followed by one of U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED
(LF), U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), U+0020 SPACE, U+003E GREATER-THAN SIGN
(>), or U+002F SOLIDUS (/).
Text is allowed inside elements, attribute values, and comments. Extra constraints are placed on what is and what is not allowed in text based on where the text is to be put, as described in the other sections.
Newlines in HTML may be represented either as U+000D CARRIAGE RETURN (CR) characters, U+000A LINE FEED (LF) characters, or pairs of U+000D CARRIAGE RETURN (CR), U+000A LINE FEED (LF) characters in that order.
Where character references are allowed, a character reference of a U+000A LINE FEED (LF) character (but not a U+000D CARRIAGE RETURN (CR) character) also represents a newline.
In certain cases described in other sections, text may be mixed with character references. These can be used to escape characters that couldn't otherwise legally be included in text.
Character references must start with a U+0026 AMPERSAND character (&). Following this, there are three possible kinds of character references:
The numeric character reference forms described above are allowed to reference any code point excluding U+000D CR, noncharacters, and controls other than ASCII whitespace.
An ambiguous ampersand is a U+0026 AMPERSAND character (&) that is followed by one or more ASCII alphanumerics, followed by a U+003B SEMICOLON character (;), where these characters do not match any of the names given in the named character references section.
CDATA sections must consist of the following components, in this order:
<![CDATA[
".]]>
".]]>
".CDATA sections can only be used in foreign content (MathML or SVG). In this example, a CDATA
section is used to escape the contents of a MathML ms
element:
<p>You can add a string to a number, but this stringifies the number:</p>
<math>
<ms><![CDATA[x<y]]></ms>
<mo>+</mo>
<mn>3</mn>
<mo>=</mo>
<ms><![CDATA[x<y3]]></ms>
</math>
Comments must have the following format:
<!--
".>
", nor start with the string
"->
", nor contain the strings "<!--
", "-->
", or "--!>
", nor end with the string "<!-
".-->
".The text is allowed to end with the string
"<!
", as in <!--My favorite operators are > and
<!-->
.
This section only applies to user agents, data mining tools, and conformance checkers.
The rules for parsing XML documents into DOM trees are covered by the next section, entitled "The XML syntax".
User agents must use the parsing rules described in this section to generate the DOM trees from
text/html
resources. Together, these rules define what is referred to as the
HTML parser.
While the HTML syntax described in this specification bears a close resemblance to SGML and XML, it is a separate language with its own parsing rules.
Some earlier versions of HTML (in particular from HTML2 to HTML4) were based on SGML and used SGML parsing rules. However, few (if any) web browsers ever implemented true SGML parsing for HTML documents; the only user agents to strictly handle HTML as an SGML application have historically been validators. The resulting confusion — with validators claiming documents to have one representation while widely deployed web browsers interoperably implemented a different representation — has wasted decades of productivity. This version of HTML thus returns to a non-SGML basis.
Authors interested in using SGML tools in their authoring pipeline are encouraged to use XML tools and the XML serialization of HTML.
For the purposes of conformance checkers, if a resource is determined to be in the HTML syntax, then it is an HTML document.
As stated in the terminology section,
references to element types that do not explicitly specify a
namespace always refer to elements in the HTML namespace. For example, if the spec
talks about "a menu
element", then that is an element with the local name "menu
", the namespace "http://www.w3.org/1999/xhtml
", and
the interface HTMLMenuElement
. Where possible, references to such elements are
hyperlinked to their definition.
The input to the HTML parsing process consists of a stream of code
points, which is passed through a tokenization stage followed by a tree
construction stage. The output is a Document
object.
Implementations that do not support scripting do not
have to actually create a DOM Document
object, but the DOM tree in such cases is
still used as the model for the rest of the specification.
In the common case, the data handled by the tokenization stage comes from the network, but
it can also come from script running in the user
agent, e.g. using the document.write()
API.
There is only one set of states for the tokenizer stage and the tree construction stage, but the tree construction stage is reentrant, meaning that while the tree construction stage is handling one token, the tokenizer might be resumed, causing further tokens to be emitted and processed before the first token's processing is complete.
In the following example, the tree construction stage will be called upon to handle a "p" start tag token while handling the "script" end tag token:
...
<script>
document.write('<p>');
</script>
...
To handle these cases, parsers have a script nesting level, which must be initially set to zero, and a parser pause flag, which must be initially set to false.
This specification defines the parsing rules for HTML documents, whether they are syntactically correct or not. Certain points in the parsing algorithm are said to be parse errors. The error handling for parse errors is well-defined (that's the processing rules described throughout this specification), but user agents, while parsing an HTML document, may abort the parser at the first parse error that they encounter for which they do not wish to apply the rules described in this specification.
Conformance checkers must report at least one parse error condition to the user if one or more parse error conditions exist in the document and must not report parse error conditions if none exist in the document. Conformance checkers may report more than one parse error condition if more than one parse error condition exists in the document.
Parse errors are only errors with the syntax of HTML. In addition to checking for parse errors, conformance checkers will also verify that the document obeys all the other conformance requirements described in this specification.
Some parse errors have dedicated codes outlined in the table below that should be used by conformance checkers in reports.
Error descriptions in the table below are non-normative.
Code | Description |
---|---|
abrupt-closing-of-empty-comment | This error occurs if the parser encounters an empty comment that is abruptly closed by a U+003E (>) code
point (i.e., |
abrupt-doctype-public-identifier | This error occurs if the parser encounters a U+003E (>) code point in the
DOCTYPE public identifier (e.g., |
abrupt-doctype-system-identifier | This error occurs if the parser encounters a U+003E (>) code point in the
DOCTYPE system identifier (e.g., |
absence-of-digits-in-numeric-character-reference | This error occurs if the parser encounters a numeric character reference that doesn't contain any digits (e.g., |
cdata-in-html-content | This error occurs if the parser encounters a CDATA
section outside of foreign content (SVG or MathML). The parser treats such CDATA
sections (including leading " |
character-reference-outside-unicode-range | This error occurs if the parser encounters a numeric character reference that references a code point that is greater than the valid Unicode range. The parser resolves such a character reference to a U+FFFD REPLACEMENT CHARACTER. |
control-character-in-input-stream | This error occurs if the input stream contains a control code point that is not ASCII whitespace or U+0000 NULL. Such code points are parsed as-is and usually, where parsing rules don't apply any additional restrictions, make their way into the DOM. |
control-character-reference | This error occurs if the parser encounters a numeric character reference that references a control code point that is not ASCII whitespace or is a U+000D CARRIAGE RETURN. The parser resolves such character references as-is except C1 control references that are replaced according to the numeric character reference end state. |
duplicate-attribute | This error occurs if the parser encounters an attribute in a tag that already has an attribute with the same name. The parser ignores all such duplicate occurrences of the attribute. |
end-tag-with-attributes | This error occurs if the parser encounters an end tag with attributes. Attributes in end tags are ignored and do not make their way into the DOM. |
end-tag-with-trailing-solidus | This error occurs if the parser encounters an end
tag that has a U+002F (/) code point right before the closing U+003E (>)
code point (e.g., |
eof-before-tag-name | This error occurs if the parser encounters the end of the input stream
where a tag name is expected. In this case the parser treats the beginning of a start tag (i.e., |
eof-in-cdata | This error occurs if the parser encounters the end of the input stream in a CDATA section. The parser treats such CDATA sections as if they are closed immediately before the end of the input stream. |
eof-in-comment | This error occurs if the parser encounters the end of the input stream in a comment. The parser treats such comments as if they are closed immediately before the end of the input stream. |
eof-in-doctype | This error occurs if the parser encounters the end of the input stream in a DOCTYPE. In such a case, if the DOCTYPE is correctly placed as a
document preamble, the parser sets the |
eof-in-script-html-comment-like-text |
This error occurs if the parser encounters the end of the input stream in text
that resembles an HTML comment inside
Syntactic structures that resemble HTML comments in |
eof-in-tag | This error occurs if the parser encounters the end of the input stream in a
start tag or an end
tag (e.g., |
incorrectly-closed-comment | This error occurs if the parser encounters a comment that is closed by the " |
incorrectly-opened-comment |
This error occurs if the parser encounters the " One possible cause of this error is using an XML markup declaration (e.g.,
|
invalid-character-sequence-after-doctype-name | This error occurs if the parser encounters any code point sequence other
than " |
invalid-first-character-of-tag-name |
This error occurs if the parser encounters a code point that is not an ASCII alpha where first code point of a start tag name or an end tag name is expected. If a start tag was expected such code point and a preceding U+003C (<) is treated as text content, and all content that follows is treated as markup. Whereas, if an end tag was expected, such code point and all content that follows up to a U+003E (>) code point (if present) or to the end of the input stream is treated as a comment. For example, consider the following markup:
This will be parsed into:
While the first code point of a tag name is limited to an ASCII alpha, a wide range of code points (including ASCII digits) is allowed in subsequent positions. |
missing-attribute-value | This error occurs if the parser encounters a U+003E (>) code point where an
attribute value is expected (e.g., |
missing-doctype-name | This error occurs if the parser encounters a DOCTYPE that is missing a name (e.g., |
missing-doctype-public-identifier | This error occurs if the parser encounters a U+003E (>) code point where
start of the DOCTYPE public identifier is expected (e.g.,
|
missing-doctype-system-identifier | This error occurs if the parser encounters a U+003E (>) code point where
start of the DOCTYPE system identifier is expected (e.g.,
|
missing-end-tag-name | This error occurs if the parser encounters a U+003E (>) code point where an
end tag name is expected, i.e., |
missing-quote-before-doctype-public-identifier | This error occurs if the parser encounters the DOCTYPE public identifier that is not preceded by a quote (e.g.,
|
missing-quote-before-doctype-system-identifier | This error occurs if the parser encounters the DOCTYPE system identifier that is not preceded by a quote (e.g.,
|
missing-semicolon-after-character-reference |
This error occurs if the parser encounters a character reference that is not terminated by a U+003B (;) code point. Usually the parser behaves as if character reference is terminated by the U+003B (;) code point; however, there are some ambiguous cases in which the parser includes subsequent code points in the character reference. For example, |
missing-whitespace-after-doctype-public-keyword | This error occurs if the parser encounters a DOCTYPE whose " |
missing-whitespace-after-doctype-system-keyword | This error occurs if the parser encounters a DOCTYPE whose " |
missing-whitespace-before-doctype-name | This error occurs if the parser encounters a DOCTYPE whose " |
missing-whitespace-between-attributes | This error occurs if the parser encounters attributes that are not separated by ASCII
whitespace (e.g., |
missing-whitespace-between-doctype-public-and-system-identifiers | This error occurs if the parser encounters a DOCTYPE whose public and system identifiers are not separated by ASCII whitespace. In this case the parser behaves as if ASCII whitespace is present. |
nested-comment | This error occurs if the parser encounters a nested comment (e.g., |
noncharacter-character-reference | This error occurs if the parser encounters a numeric character reference that references a noncharacter. The parser resolves such character references as-is. |
noncharacter-in-input-stream | This error occurs if the input stream contains a noncharacter. Such code points are parsed as-is and usually, where parsing rules don't apply any additional restrictions, make their way into the DOM. |
non-void-html-element-start-tag-with-trailing-solidus |
This error occurs if the parser encounters a start tag for an element that is not in the list of void elements or is not a part of foreign content (i.e., not an SVG or MathML element) that has a U+002F (/) code point right before the closing U+003E (>) code point. The parser behaves as if the U+002F (/) is not present. For example, consider the following markup:
This will be parsed into:
The trailing U+002F (/) in a start tag name can be used only in foreign content to specify self-closing tags. (Self-closing tags don't exist in HTML.) It is also allowed for void elements, but doesn't have any effect in this case. |
null-character-reference | This error occurs if the parser encounters a numeric character reference that references a U+0000 NULL code point. The parser resolves such character references to a U+FFFD REPLACEMENT CHARACTER. |
surrogate-character-reference | This error occurs if the parser encounters a numeric character reference that references a surrogate. The parser resolves such character references to a U+FFFD REPLACEMENT CHARACTER. |
surrogate-in-input-stream |
This error occurs if the input stream contains a surrogate. Such code points are parsed as-is and usually, where parsing rules don't apply any additional restrictions, make their way into the DOM. Surrogates can only find their way into the input stream via script APIs such
as |
unexpected-character-after-doctype-system-identifier | This error occurs if the parser encounters any code points other than ASCII whitespace or closing U+003E (>) after the DOCTYPE system identifier. The parser ignores these code points. |
unexpected-character-in-attribute-name |
This error occurs if the parser encounters a U+0022 ("), U+0027 ('), or U+003C (<) code point in an attribute name. The parser includes such code points in the attribute name. Code points that trigger this error are usually a part of another syntactic construct and can be a sign of a typo around the attribute name. For example, consider the following markup:
Due to a forgotten U+003E (>) code point after As another example of this error, consider the following markup:
Due to a forgotten U+003D (=) code point between an attribute name and value the parser
treats this markup as a |
unexpected-character-in-unquoted-attribute-value |
This error occurs if the parser encounters a U+0022 ("), U+0027 ('), U+003C (<), U+003D (=), or U+0060 (`) code point in an unquoted attribute value. The parser includes such code points in the attribute value. Code points that trigger this error are usually a part of another syntactic construct and can be a sign of a typo around the attribute value. U+0060 (`) is in the list of code points that trigger this error because certain legacy user agents treat it as a quote. For example, consider the following markup:
Due to a misplaced U+0027 (') code point the parser sets the value of the " |
unexpected-equals-sign-before-attribute-name |
This error occurs if the parser encounters a U+003D (=) code point before an attribute name. In this case the parser treats U+003D (=) as the first code point of the attribute name. The common reason for this error is a forgotten attribute name. For example, consider the following markup:
Due to a forgotten attribute name the parser treats this markup as a |
unexpected-null-character | This error occurs if the parser encounters a U+0000 NULL code point in the input stream in certain positions. In general, such code points are either ignored or, for security reasons, replaced with a U+FFFD REPLACEMENT CHARACTER. |
unexpected-question-mark-instead-of-tag-name |
This error occurs if the parser encounters a U+003F (?) code point where first code point of a start tag name is expected. The U+003F (?) and all content that follows up to a U+003E (>) code point (if present) or to the end of the input stream is treated as a comment. For example, consider the following markup:
This will be parsed into:
The common reason for this error is an XML processing instruction (e.g., |
unexpected-solidus-in-tag | This error occurs if the parser encounters a U+002F (/) code point that is
not a part of a quoted attribute value and not
immediately followed by a U+003E (>) code point in a tag (e.g., |
unknown-named-character-reference | This error occurs if the parser encounters an ambiguous ampersand. In this case the parser doesn't resolve the character reference. |
The stream of code points that comprises the input to the tokenization stage will be initially seen by the user agent as a stream of bytes (typically coming over the network or from the local file system). The bytes encode the actual characters according to a particular character encoding, which the user agent uses to decode the bytes into characters.
For XML documents, the algorithm user agents are required to use to determine the character encoding is given by XML. This section does not apply to XML documents. XML
Usually, the encoding sniffing algorithm defined below is used to determine the character encoding.
Given a character encoding, the bytes in the input byte stream must be converted to characters for the tokenizer's input stream, by passing the input byte stream and character encoding to decode.
A leading Byte Order Mark (BOM) causes the character encoding argument to be ignored and will itself be skipped.
Bytes or sequences of bytes in the original byte stream that did not conform to the Encoding standard (e.g. invalid UTF-8 byte sequences in a UTF-8 input byte stream) are errors that conformance checkers are expected to report. ENCODING
The decoder algorithms describe how to handle invalid input; for security reasons, it is imperative that those rules be followed precisely. Differences in how invalid byte sequences are handled can result in, amongst other problems, script injection vulnerabilities ("XSS").
When the HTML parser is decoding an input byte stream, it uses a character encoding and a confidence. The confidence is either tentative, certain, or irrelevant. The encoding used, and whether the confidence in that encoding is tentative or certain, is used during the parsing to determine whether to change the encoding. If no encoding is necessary, e.g. because the parser is operating on a Unicode stream and doesn't have to use a character encoding at all, then the confidence is irrelevant.
Some algorithms feed the parser by directly adding characters to the input stream rather than adding bytes to the input byte stream.
When the HTML parser is to operate on an input byte stream that has a known definite encoding, then the character encoding is that encoding and the confidence is certain.
In some cases, it might be impractical to unambiguously determine the encoding before parsing the document. Because of this, this specification provides for a two-pass mechanism with an optional pre-scan. Implementations are allowed, as described below, to apply a simplified parsing algorithm to whatever bytes they have available before beginning to parse the document. Then, the real parser is started, using a tentative encoding derived from this pre-parse and other out-of-band metadata. If, while the document is being loaded, the user agent discovers a character encoding declaration that conflicts with this information, then the parser can get reinvoked to perform a parse of the document with the real encoding.
User agents must use the following algorithm, called the encoding sniffing algorithm, to determine the character encoding to use when decoding a document in the first pass. This algorithm takes as input any out-of-band metadata available to the user agent (e.g. the Content-Type metadata of the document) and all the bytes available so far, and returns a character encoding and a confidence that is either tentative or certain.
If the result of BOM sniffing is an encoding, return that encoding with confidence certain.
Although the decode algorithm will itself change the encoding to use based on the presence of a byte order mark, this algorithm sniffs the BOM as well in order to set the correct document's character encoding and confidence.
If the user has explicitly instructed the user agent to override the document's character encoding with a specific encoding, optionally return that encoding with the confidence certain.
Typically, user agents remember such user requests across sessions, and in some
cases apply them to documents in iframe
s as well.
The user agent may wait for more bytes of the resource to be available, either in this step or at any later step in this algorithm. For instance, a user agent might wait 500ms or 1024 bytes, whichever came first. In general preparsing the source to find the encoding improves performance, as it reduces the need to throw away the data structures used when parsing upon finding the encoding information. However, if the user agent delays too long to obtain data to determine the encoding, then the cost of the delay could outweigh any performance improvements from the preparse.
The authoring conformance requirements for character encoding declarations limit them to only appearing in the first 1024 bytes. User agents are therefore encouraged to use the prescan algorithm below (as invoked by these steps) on the first 1024 bytes, but not to stall beyond that.
If the transport layer specifies a character encoding, and it is supported, return that encoding with the confidence certain.
Optionally prescan the byte stream to determine its encoding, with the end condition being when the user agent decides that scanning further bytes would not be efficient. User agents are encouraged to only prescan the first 1024 bytes. User agents may decide that scanning any bytes is not efficient, in which case these substeps are entirely skipped.
The aforementioned algorithm returns either a character encoding or failure. If it returns a character encoding, then return the same encoding, with confidence tentative.
If the HTML parser for which this algorithm is being run is associated with a
Document
d whose container
document is non-null, then:
Let parentDocument be d's container document.
If parentDocument's origin is same origin with d's origin and parentDocument's character encoding is not UTF-16BE/LE, then return parentDocument's character encoding, with the confidence tentative.
Otherwise, if the user agent has information on the likely encoding for this page, e.g. based on the encoding of the page when it was last visited, then return that encoding, with the confidence tentative.
The user agent may attempt to autodetect the character encoding from applying frequency analysis or other algorithms to the data stream. Such algorithms may use information about the resource other than the resource's contents, including the address of the resource. If autodetection succeeds in determining a character encoding, and that encoding is a supported encoding, then return that encoding, with the confidence tentative. UNIVCHARDET
User agents are generally discouraged from attempting to autodetect encodings for resources obtained over the network, since doing so involves inherently non-interoperable heuristics. Attempting to detect encodings based on an HTML document's preamble is especially tricky since HTML markup typically uses only ASCII characters, and HTML documents tend to begin with a lot of markup rather than with text content.
The UTF-8 encoding has a highly detectable bit pattern. Files from the local file system that contain bytes with values greater than 0x7F which match the UTF-8 pattern are very likely to be UTF-8, while documents with byte sequences that do not match it are very likely not. When a user agent can examine the whole file, rather than just the preamble, detecting for UTF-8 specifically can be especially effective. PPUTF8 UTF8DET
Otherwise, return an implementation-defined or user-specified default character encoding, with the confidence tentative.
In controlled environments or in environments where the encoding of documents can be
prescribed (for example, for user agents intended for dedicated use in new networks), the
comprehensive UTF-8
encoding is suggested.
In other environments, the default encoding is typically dependent on the user's locale (an approximation of the languages, and thus often encodings, of the pages that the user is likely to frequent). The following table gives suggested defaults based on the user's locale, for compatibility with legacy content. Locales are identified by BCP 47 language tags. BCP47 ENCODING
Locale language | Suggested default encoding | |
---|---|---|
ar | Arabic | windows-1256 |
az | Azeri | windows-1254 |
ba | Bashkir | windows-1251 |
be | Belarusian | windows-1251 |
bg | Bulgarian | windows-1251 |
cs | Czech | windows-1250 |
el | Greek | ISO-8859-7 |
et | Estonian | windows-1257 |
fa | Persian | windows-1256 |
he | Hebrew | windows-1255 |
hr | Croatian | windows-1250 |
hu | Hungarian | ISO-8859-2 |
ja | Japanese | Shift_JIS |
kk | Kazakh | windows-1251 |
ko | Korean | EUC-KR |
ku | Kurdish | windows-1254 |
ky | Kyrgyz | windows-1251 |
lt | Lithuanian | windows-1257 |
lv | Latvian | windows-1257 |
mk | Macedonian | windows-1251 |
pl | Polish | ISO-8859-2 |
ru | Russian | windows-1251 |
sah | Yakut | windows-1251 |
sk | Slovak | windows-1250 |
sl | Slovenian | ISO-8859-2 |
sr | Serbian | windows-1251 |
tg | Tajik | windows-1251 |
th | Thai | windows-874 |
tr | Turkish | windows-1254 |
tt | Tatar | windows-1251 |
uk | Ukrainian | windows-1251 |
vi | Vietnamese | windows-1258 |
zh-Hans, zh-CN, zh-SG | Chinese, Simplified | GBK |
zh-Hant, zh-HK, zh-MO, zh-TW | Chinese, Traditional | Big5 |
All other locales | windows-1252 |
The contents of this table are derived from the intersection of Windows, Chrome, and Firefox defaults.
The document's character encoding must immediately be set to the value returned from this algorithm, at the same time as the user agent uses the returned value to select the decoder to use for the input byte stream.
When an algorithm requires a user agent to prescan a byte stream to determine its encoding, given some defined end condition, then it must run the following steps. If at any point during these steps (including during instances of the get an attribute algorithm invoked by this one) the user agent either runs out of bytes (meaning the position pointer created in the first step below goes beyond the end of the byte stream obtained so far) or reaches its end condition, then abort the prescan a byte stream to determine its encoding algorithm and return the result get an XML encoding applied to the same bytes that the prescan a byte stream to determine its encoding algorithm was applied to. Otherwise, these steps will return a character encoding.
Let fallback encoding be null.
Let position be a pointer to a byte in the input byte stream, initially pointing at the first byte.
Prescan for UTF-16 XML declarations: If position points to:
Return UTF-16LE.
Return UTF-16BE.
For historical reasons, the prefix is two bytes longer than in Appendix F of XML and the encoding name is not checked.
Loop: If position points to:
<!--
`)Advance the position pointer so that it points at the first 0x3E byte which is preceded by two 0x2D bytes (i.e. at the end of an ASCII '-->' sequence) and comes after the 0x3C byte that was found. (The two 0x2D bytes can be the same as those in the '<!--' sequence.)
Advance the position pointer so that it points at the next 0x09, 0x0A, 0x0C, 0x0D, 0x20, or 0x2F byte (the one in sequence of characters matched above).
Let attribute list be an empty list of strings.
Let got pragma be false.
Let need pragma be null.
Let charset be the null value (which, for the purposes of this algorithm, is distinct from an unrecognized encoding or the empty string).
Attributes: Get an attribute and its value. If no attribute was sniffed, then jump to the processing step below.
If the attribute's name is already in attribute list, then return to the step labeled attributes.
Add the attribute's name to attribute list.
Run the appropriate step from the following list, if one applies:
http-equiv
"If the attribute's value is "content-type
", then set got pragma to true.
content
"Apply the algorithm for extracting a character encoding from a
meta
element, giving the attribute's value as the string to parse. If a
character encoding is returned, and if charset is still set to null,
let charset be the encoding returned, and set need
pragma to true.
charset
"Let charset be the result of getting an encoding from the attribute's value, and set need pragma to false.
Return to the step labeled attributes.
Processing: If need pragma is null, then jump to the step below labeled next byte.
If need pragma is true but got pragma is false, then jump to the step below labeled next byte.
If charset is failure, then jump to the step below labeled next byte.
If charset is UTF-16BE/LE, then set charset to UTF-8.
If charset is x-user-defined, then set charset to windows-1252.
Return charset.
Advance the position pointer so that it points at the next 0x09 (HT), 0x0A (LF), 0x0C (FF), 0x0D (CR), 0x20 (SP), or 0x3E (>) byte.
Repeatedly get an attribute until no further attributes can be found, then jump to the step below labeled next byte.
<!
`)</
`)<?
`)Advance the position pointer so that it points at the first 0x3E byte (>) that comes after the 0x3C byte that was found.
Do nothing with that byte.
When the prescan a byte stream to determine its encoding algorithm says to get an attribute, it means doing this:
If the byte at position is one of 0x09 (HT), 0x0A (LF), 0x0C (FF), 0x0D (CR), 0x20 (SP), or 0x2F (/) then advance position to the next byte and redo this step.
If the byte at position is 0x3E (>), then abort the get an attribute algorithm. There isn't one.
Otherwise, the byte at position is the start of the attribute name. Let attribute name and attribute value be the empty string.
Process the byte at position as follows:
Advance position to the next byte and return to the previous step.
Spaces: If the byte at position is one of 0x09 (HT), 0x0A (LF), 0x0C (FF), 0x0D (CR), or 0x20 (SP) then advance position to the next byte, then, repeat this step.
If the byte at position is not 0x3D (=), abort the get an attribute algorithm. The attribute's name is the value of attribute name, its value is the empty string.
Advance position past the 0x3D (=) byte.
Value: If the byte at position is one of 0x09 (HT), 0x0A (LF), 0x0C (FF), 0x0D (CR), or 0x20 (SP) then advance position to the next byte, then, repeat this step.
Process the byte at position as follows:
Process the byte at position as follows:
Advance position to the next byte and return to the previous step.
When the prescan a byte stream to determine its encoding algorithm is aborted without returning an encoding, get an XML encoding means doing this.
Looking for syntax resembling an XML declaration, even in text/html
,
is necessary for compatibility with existing content.
Let encodingPosition be a pointer to the start of the stream.
If encodingPosition does not point to the start of a byte sequence 0x3C, 0x3F,
0x78, 0x6D, 0x6C (`<?xml
`), then return failure.
Let xmlDeclarationEnd be a pointer to the next byte in the input byte stream which is 0x3E (>). If there is no such byte, then return failure.
Set encodingPosition to the position of the first occurrence of the subsequence
of bytes 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67 (`encoding
`) at or
after the current encodingPosition. If there is no such sequence, then return
failure.
Advance encodingPosition past the 0x67 (g) byte.
While the byte at encodingPosition is less than or equal to 0x20 (i.e., it is either an ASCII space or control character), advance encodingPosition to the next byte.
If the byte at encodingPosition is not 0x3D (=), then return failure.
Advance encodingPosition to the next byte.
While the byte at encodingPosition is less than or equal to 0x20 (i.e., it is either an ASCII space or control character), advance encodingPosition to the next byte.
Let quoteMark be the byte at encodingPosition.
If quoteMark is not either 0x22 (") or 0x27 ('), then return failure.
Advance encodingPosition to the next byte.
Let encodingEndPosition be the position of the next occurrence of quoteMark at or after encodingPosition. If quoteMark does not occur again, then return failure.
Let potentialEncoding be the sequence of the bytes between encodingPosition (inclusive) and encodingEndPosition (exclusive).
If potentialEncoding contains one or more bytes whose byte value is 0x20 or below, then return failure.
Let encoding be the result of getting an encoding given potentialEncoding isomorphic decoded.
If the encoding is UTF-16BE/LE, then change it to UTF-8.
Return encoding.
For the sake of interoperability, user agents should not use a pre-scan algorithm that returns different results than the one described above. (But, if you do, please at least let us know, so that we can improve this algorithm and benefit everyone...)
User agents must support the encodings defined in Encoding, including, but not limited to, UTF-8, ISO-8859-2, ISO-8859-7, ISO-8859-8, windows-874, windows-1250, windows-1251, windows-1252, windows-1254, windows-1255, windows-1256, windows-1257, windows-1258, GBK, Big5, ISO-2022-JP, Shift_JIS, EUC-KR, UTF-16BE, UTF-16LE, UTF-16BE/LE, and x-user-defined. User agents must not support other encodings.
The above prohibits supporting, for example, CESU-8, UTF-7, BOCU-1, SCSU, EBCDIC, and UTF-32. This specification does not make any attempt to support prohibited encodings in its algorithms; support and use of prohibited encodings would thus lead to unexpected behavior. CESU8 UTF7 BOCU1 SCSU
When the parser requires the user agent to change the encoding, it must run the following steps. This might happen if the encoding sniffing algorithm described above failed to find a character encoding, or if it found a character encoding that was not the actual encoding of the file.
If the encoding that is already being used to interpret the input stream is UTF-16BE/LE, then set the confidence to certain and return. The new encoding is ignored; if it was anything but the same encoding, then it would be clearly incorrect.
If the new encoding is UTF-16BE/LE, then change it to UTF-8.
If the new encoding is x-user-defined, then change it to windows-1252.
If the new encoding is identical or equivalent to the encoding that is already being used to interpret the input stream, then set the confidence to certain and return. This happens when the encoding information found in the file matches what the encoding sniffing algorithm determined to be the encoding, and in the second pass through the parser if the first pass found that the encoding sniffing algorithm described in the earlier section failed to find the right encoding.
If all the bytes up to the last byte converted by the current decoder have the same Unicode interpretations in both the current encoding and the new encoding, and if the user agent supports changing the converter on the fly, then the user agent may change to the new converter for the encoding on the fly. Set the document's character encoding and the encoding used to convert the input stream to the new encoding, set the confidence to certain, and return.
Otherwise, restart the navigate algorithm, with historyHandling set to "replace
" and other inputs kept the same, but
this time skip the encoding sniffing algorithm and instead just set the encoding to
the new encoding and the confidence to
certain. Whenever possible, this should be done without actually contacting the network
layer (the bytes should be re-parsed from memory), even if, e.g., the document is marked as not
being cacheable. If this is not possible and contacting the network layer would involve repeating
a request that uses a method other than `GET
`, then instead set the confidence to certain and ignore the new
encoding. The resource will be misinterpreted. User agents may notify the user of the situation,
to aid in application development.
This algorithm is only invoked when a new encoding is found declared on a
meta
element.
The input stream consists of the characters pushed into it as the input byte stream is decoded or from the various APIs that directly manipulate the input stream.
Any occurrences of surrogates are surrogate-in-input-stream parse errors. Any occurrences of noncharacters are noncharacter-in-input-stream parse errors and any occurrences of controls other than ASCII whitespace and U+0000 NULL characters are control-character-in-input-stream parse errors.
The handling of U+0000 NULL characters varies based on where the characters are found and happens at the later stages of the parsing. They are either ignored or, for security reasons, replaced with a U+FFFD REPLACEMENT CHARACTER. This handling is, by necessity, spread across both the tokenization stage and the tree construction stage.
Before the tokenization stage, the input stream must be preprocessed by normalizing newlines. Thus, newlines in HTML DOMs are represented by U+000A LF characters, and there are never any U+000D CR characters in the input to the tokenization stage.
The next input character is the first character in the input stream that has not yet been consumed or explicitly ignored by the requirements in this section. Initially, the next input character is the first character in the input. The current input character is the last character to have been consumed.
The insertion point is the position (just before a character or just before the end
of the input stream) where content inserted using document.write()
is actually inserted. The insertion point is
relative to the position of the character immediately after it, it is not an absolute offset into
the input stream. Initially, the insertion point is undefined.
The "EOF" character in the tables below is a conceptual character representing the end of the
input stream. If the parser is a script-created parser, then the end of
the input stream is reached when an explicit "EOF" character (inserted by
the document.close()
method) is consumed. Otherwise, the
"EOF" character is not a real character in the stream, but rather the lack of any further
characters.
The insertion mode is a state variable that controls the primary operation of the tree construction stage.
Initially, the insertion mode is "initial". It can change to "before html", "before head", "in head", "in head noscript", "after head", "in body", "text", "in table", "in table text", "in caption", "in column group", "in table body", "in row", "in cell", "in select", "in select in table", "in template", "after body", "in frameset", "after frameset", "after after body", and "after after frameset" during the course of the parsing, as described in the tree construction stage. The insertion mode affects how tokens are processed and whether CDATA sections are supported.
Several of these modes, namely "in head", "in body", "in table", and "in select", are special, in that the other modes defer to them at various times. When the algorithm below says that the user agent is to do something "using the rules for the m insertion mode", where m is one of these modes, the user agent must use the rules described under the m insertion mode's section, but must leave the insertion mode unchanged unless the rules in m themselves switch the insertion mode to a new value.
When the insertion mode is switched to "text" or "in table text", the original insertion mode is also set. This is the insertion mode to which the tree construction stage will return.
Similarly, to parse nested template
elements, a stack of template insertion
modes is used. It is initially empty. The current template insertion mode is the
insertion mode that was most recently added to the stack of template insertion modes.
The algorithms in the sections below will push insertion modes onto this stack, meaning
that the specified insertion mode is to be added to the stack, and pop insertion modes from
the stack, which means that the most recently added insertion mode must be removed from the
stack.
When the steps below require the UA to reset the insertion mode appropriately, it means the UA must follow these steps:
Let last be false.
Let node be the last node in the stack of open elements.
Loop: If node is the first node in the stack of open elements, then set last to true, and, if the parser was created as part of the HTML fragment parsing algorithm (fragment case), set node to the context element passed to that algorithm.
If node is a select
element, run these substeps:
If last is true, jump to the step below labeled done.
Let ancestor be node.
Loop: If ancestor is the first node in the stack of open elements, jump to the step below labeled done.
Let ancestor be the node before ancestor in the stack of open elements.
If ancestor is a template
node, jump to the step below
labeled done.
If ancestor is a table
node, switch the insertion
mode to "in select in table"
and return.
Jump back to the step labeled loop.
Done: Switch the insertion mode to "in select" and return.
If node is a td
or th
element and last is
false, then switch the insertion mode to "in
cell" and return.
If node is a tr
element, then switch the insertion
mode to "in row" and return.
If node is a tbody
, thead
, or
tfoot
element, then switch the insertion mode to "in table body" and return.
If node is a caption
element, then switch the
insertion mode to "in caption" and
return.
If node is a colgroup
element, then switch the
insertion mode to "in column
group" and return.
If node is a table
element, then switch the
insertion mode to "in table" and
return.
If node is a template
element, then switch the
insertion mode to the current template insertion mode and
return.
If node is a head
element and last is
false, then switch the insertion mode to "in
head" and return.
If node is a body
element, then switch the
insertion mode to "in body" and
return.
If node is a frameset
element, then switch the
insertion mode to "in frameset" and
return. (fragment case)
If node is an html
element, run these substeps:
If the head
element pointer is null, switch the
insertion mode to "before head"
and return. (fragment case)
Otherwise, the head
element pointer is not null, switch the
insertion mode to "after head" and
return.
If last is true, then switch the insertion mode to "in body" and return. (fragment case)
Let node now be the node before node in the stack of open elements.
Return to the step labeled loop.
Initially, the stack of open elements is empty. The stack grows downwards; the topmost node on the stack is the first one added to the stack, and the bottommost node of the stack is the most recently added node in the stack (notwithstanding when the stack is manipulated in a random access fashion as part of the handling for misnested tags).
The "before html"
insertion mode creates the html
document element, which is
then added to the stack.
In the fragment case, the stack of open elements is
initialized to contain an html
element that is created as part of that algorithm. (The fragment case skips the
"before html" insertion mode.)
The html
node, however it is created, is the topmost node of the stack. It only
gets popped off the stack when the parser finishes.
The current node is the bottommost node in this stack of open elements.
The adjusted current node is the context element if the parser was created as part of the HTML fragment parsing algorithm and the stack of open elements has only one element in it (fragment case); otherwise, the adjusted current node is the current node.
When the current node is removed from the stack of open elements, process internal resource links given the current node's node document.
Elements in the stack of open elements fall into the following categories:
The following elements have varying levels of special parsing rules: HTML's
address
, applet
, area
, article
,
aside
, base
, basefont
, bgsound
,
blockquote
, body
, br
, button
,
caption
, center
, col
, colgroup
,
dd
, details
, dir
, div
, dl
,
dt
, embed
, fieldset
, figcaption
,
figure
, footer
, form
, frame
,
frameset
, h1
, h2
, h3
, h4
,
h5
, h6
, head
, header
, hgroup
,
hr
, html
, iframe
,
img
, input
, keygen
, li
, link
,
listing
, main
, marquee
, menu
,
meta
, nav
, noembed
, noframes
,
noscript
, object
, ol
, p
,
param
, plaintext
, pre
, script
,
search
, section
, select
, source
,
style
, summary
, table
, tbody
,
td
, template
, textarea
, tfoot
,
th
, thead
, title
, tr
, track
,
ul
, wbr
, xmp
; MathML mi
,
MathML mo
, MathML mn
, MathML
ms
, MathML mtext
, and MathML
annotation-xml
; and SVG foreignObject
, SVG
desc
, and SVG title
.
An image
start tag token is handled by the tree builder,
but it is not in this list because it is not an element; it gets turned into an img
element.
The following HTML elements are those that end up in the list of active formatting
elements: a
, b
, big
, code
,
em
, font
, i
, nobr
, s
,
small
, strike
, strong
, tt
, and
u
.
All other elements found while parsing an HTML document.
Typically, the special elements have the start and end tag tokens
handled specifically, while ordinary elements' tokens fall into "any other start tag"
and "any other end tag" clauses, and some parts of the tree builder check if a particular element
in the stack of open elements is in the special category. However, some
elements (e.g., the option
element) have their start or end tag tokens handled
specifically, but are still not in the special category, so that they get the
ordinary handling elsewhere.
The stack of open elements is said to have an element target node in a specific scope consisting of a list of element types list when the following algorithm terminates in a match state:
Initialize node to be the current node (the bottommost node of the stack).
If node is the target node, terminate in a match state.
Otherwise, if node is one of the element types in list, terminate in a failure state.
Otherwise, set node to the previous entry in the stack of open
elements and return to step 2. (This will never fail, since the loop will always terminate
in the previous step if the top of the stack — an html
element — is
reached.)
The stack of open elements is said to have a particular element in scope when it has that element in the specific scope consisting of the following element types:
applet
caption
html
table
td
th
marquee
object
template
mi
mo
mn
ms
mtext
annotation-xml
foreignObject
desc
title
The stack of open elements is said to have a particular element in list item scope when it has that element in the specific scope consisting of the following element types:
ol
in the HTML namespaceul
in the HTML namespaceThe stack of open elements is said to have a particular element in button scope when it has that element in the specific scope consisting of the following element types:
button
in the HTML namespaceThe stack of open elements is said to have a particular element in table scope when it has that element in the specific scope consisting of the following element types:
html
in the HTML namespacetable
in the HTML namespacetemplate
in the HTML namespaceThe stack of open elements is said to have a particular element in select scope when it has that element in the specific scope consisting of all element types except the following:
optgroup
in the HTML namespaceoption
in the HTML namespaceNothing happens if at any time any of the elements in the stack of open elements
are moved to a new location in, or removed from, the Document
tree. In particular,
the stack is not changed in this situation. This can cause, amongst other strange effects, content
to be appended to nodes that are no longer in the DOM.
In some cases (namely, when closing misnested formatting elements), the stack is manipulated in a random-access fashion.
Initially, the list of active formatting elements is empty. It is used to handle mis-nested formatting element tags.
The list contains elements in the formatting category, and markers. The markers are inserted when entering applet
,
object
, marquee
, template
, td
,
th
, and caption
elements, and are used to prevent formatting from
"leaking" into applet
, object
, marquee
,
template
, td
, th
, and caption
elements.
In addition, each element in the list of active formatting elements is associated with the token for which it was created, so that further elements can be created for that token if necessary.
When the steps below require the UA to push onto the list of active formatting elements an element element, the UA must perform the following steps:
If there are already three elements in the list of active formatting elements after the last marker, if any, or anywhere in the list if there are no markers, that have the same tag name, namespace, and attributes as element, then remove the earliest such element from the list of active formatting elements. For these purposes, the attributes must be compared as they were when the elements were created by the parser; two elements have the same attributes if all their parsed attributes can be paired such that the two attributes in each pair have identical names, namespaces, and values (the order of the attributes does not matter).
This is the Noah's Ark clause. But with three per family instead of two.
Add element to the list of active formatting elements.
When the steps below require the UA to reconstruct the active formatting elements, the UA must perform the following steps:
If there are no entries in the list of active formatting elements, then there is nothing to reconstruct; stop this algorithm.
If the last (most recently added) entry in the list of active formatting elements is a marker, or if it is an element that is in the stack of open elements, then there is nothing to reconstruct; stop this algorithm.
Let entry be the last (most recently added) element in the list of active formatting elements.
Rewind: If there are no entries before entry in the list of active formatting elements, then jump to the step labeled create.
Let entry be the entry one earlier than entry in the list of active formatting elements.
If entry is neither a marker nor an element that is also in the stack of open elements, go to the step labeled rewind.
Advance: Let entry be the element one later than entry in the list of active formatting elements.
Create: Insert an HTML element for the token for which the element entry was created, to obtain new element.
Replace the entry for entry in the list with an entry for new element.
If the entry for new element in the list of active formatting elements is not the last entry in the list, return to the step labeled advance.
This has the effect of reopening all the formatting elements that were opened in the current body, cell, or caption (whichever is youngest) that haven't been explicitly closed.
The way this specification is written, the list of active formatting elements always consists of elements in chronological order with the least recently added element first and the most recently added element last (except for while steps 7 to 10 of the above algorithm are being executed, of course).
When the steps below require the UA to clear the list of active formatting elements up to the last marker, the UA must perform the following steps:
Let entry be the last (most recently added) entry in the list of active formatting elements.
Remove entry from the list of active formatting elements.
If entry was a marker, then stop the algorithm at this point. The list has been cleared up to the last marker.
Go to step 1.
Initially, the head
element pointer and the form
element pointer are both null.
Once a head
element has been parsed (whether implicitly or explicitly) the
head
element pointer gets set to point to this node.
The form
element pointer points to the last
form
element that was opened and whose end tag has not yet been seen. It is used to
make form controls associate with forms in the face of dramatically bad markup, for historical
reasons. It is ignored inside template
elements.
The scripting flag is set to "enabled" if scripting
was enabled for the Document
with which the parser is associated when the
parser was created, and "disabled" otherwise.
The scripting flag can be enabled even when the parser was created as
part of the HTML fragment parsing algorithm, even though script
elements
don't execute in that case.
The frameset-ok flag is set to "ok" when the parser is created. It is set to "not ok" after certain tokens are seen.
Implementations must act as if they used the following state machine to tokenize HTML. The state machine must start in the data state. Most states consume a single character, which may have various side-effects, and either switches the state machine to a new state to reconsume the current input character, or switches it to a new state to consume the next character, or stays in the same state to consume the next character. Some states have more complicated behavior and can consume several characters before switching to another state. In some cases, the tokenizer state is also changed by the tree construction stage.
When a state says to reconsume a matched character in a specified state, that means to switch to that state, but when it attempts to consume the next input character, provide it with the current input character instead.
The exact behavior of certain states depends on the insertion mode and the stack of open elements. Certain states also use a temporary buffer to track progress, and the character reference state uses a return state to return to the state it was invoked from.
The output of the tokenization step is a series of zero or more of the following tokens: DOCTYPE, start tag, end tag, comment, character, end-of-file. DOCTYPE tokens have a name, a public identifier, a system identifier, and a force-quirks flag. When a DOCTYPE token is created, its name, public identifier, and system identifier must be marked as missing (which is a distinct state from the empty string), and the force-quirks flag must be set to off (its other state is on). Start and end tag tokens have a tag name, a self-closing flag, and a list of attributes, each of which has a name and a value. When a start or end tag token is created, its self-closing flag must be unset (its other state is that it be set), and its attributes list must be empty. Comment and character tokens have data.
When a token is emitted, it must immediately be handled by the tree construction
stage. The tree construction stage can affect the state of the tokenization stage, and can insert
additional characters into the stream. (For example, the script
element can result in
scripts executing and using the dynamic markup insertion APIs to insert characters
into the stream being tokenized.)
Creating a token and emitting it are distinct actions. It is possible for a token to be created but implicitly abandoned (never emitted), e.g. if the file ends unexpectedly while processing the characters that are being parsed into a start tag token.
When a start tag token is emitted with its self-closing flag set, if the flag is not acknowledged when it is processed by the tree construction stage, that is a non-void-html-element-start-tag-with-trailing-solidus parse error.
When an end tag token is emitted with attributes, that is an end-tag-with-attributes parse error.
When an end tag token is emitted with its self-closing flag set, that is an end-tag-with-trailing-solidus parse error.
An appropriate end tag token is an end tag token whose tag name matches the tag name of the last start tag to have been emitted from this tokenizer, if any. If no start tag has been emitted from this tokenizer, then no end tag token is appropriate.
A character reference is said to be consumed as part of an attribute if the return state is either attribute value (double-quoted) state, attribute value (single-quoted) state or attribute value (unquoted) state.
When a state says to flush code points consumed as a character reference, it means that for each code point in the temporary buffer (in the order they were added to the buffer) user agent must append the code point from the buffer to the current attribute's value if the character reference was consumed as part of an attribute, or emit the code point as a character token otherwise.
Before each step of the tokenizer, the user agent must first check the parser pause flag. If it is true, then the tokenizer must abort the processing of any nested invocations of the tokenizer, yielding control back to the caller.
The tokenizer state machine consists of the states defined in the following subsections.
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
script
", then switch to the script data double escaped state.
Otherwise, switch to the script data escaped state. Emit the current input
character as a character token.Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
script
", then switch to the script data escaped state. Otherwise,
switch to the script data double escaped state. Emit the current input
character as a character token.Consume the next input character:
Consume the next input character:
When the user agent leaves the attribute name state (and before emitting the tag token, if appropriate), the complete attribute's name must be compared to the other attributes on the same token; if there is already an attribute on the token with the exact same name, then this is a duplicate-attribute parse error and the new attribute must be removed from the token.
If an attribute is so removed from a token, it, and the value that gets associated with it, if any, are never subsequently used by the parser, and are therefore effectively discarded. Removing the attribute in this way does not change its status as the "current attribute" for the purposes of the tokenizer, however.
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
If the next few characters are:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
If the six characters starting from the current input character are an ASCII case-insensitive match for the word "PUBLIC", then consume those characters and switch to the after DOCTYPE public keyword state.
Otherwise, if the six characters starting from the current input character are an ASCII case-insensitive match for the word "SYSTEM", then consume those characters and switch to the after DOCTYPE system keyword state.
Otherwise, this is an invalid-character-sequence-after-doctype-name parse error. Set the current DOCTYPE token's force-quirks flag to on. Reconsume in the bogus DOCTYPE state.
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
U+0000 NULL characters are handled in the tree construction stage, as part of the in foreign content insertion mode, which is the only place where CDATA sections can appear.
Consume the next input character:
Consume the next input character:
Set the temporary buffer to the empty string. Append a U+0026 AMPERSAND (&) character to the temporary buffer. Consume the next input character:
Consume the maximum number of characters possible, where the consumed characters are one of the identifiers in the first column of the named character references table. Append each character to the temporary buffer when it's consumed.
If the character reference was consumed as part of an attribute, and the last character matched is not a U+003B SEMICOLON character (;), and the next input character is either a U+003D EQUALS SIGN character (=) or an ASCII alphanumeric, then, for historical reasons, flush code points consumed as a character reference and switch to the return state.
Otherwise:
If the last character matched is not a U+003B SEMICOLON character (;), then this is a missing-semicolon-after-character-reference parse error.
Set the temporary buffer to the empty string. Append one or two characters corresponding to the character reference name (as given by the second column of the named character references table) to the temporary buffer.
If the markup contains (not in an attribute) the string I'm ¬it; I
tell you
, the character reference is parsed as "not", as in, I'm ¬it;
I tell you
(and this is a parse error). But if the markup was I'm
∉ I tell you
, the character reference would be parsed as "notin;", resulting
in I'm ∉ I tell you
(and no parse error).
However, if the markup contains the string I'm ¬it; I tell you
in an attribute, no character reference is parsed and string remains intact (and there is no
parse error).
Consume the next input character:
Set the character reference code to zero (0).
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Consume the next input character:
Check the character reference code:
If the number is 0x00, then this is a null-character-reference parse error. Set the character reference code to 0xFFFD.
If the number is greater than 0x10FFFF, then this is a character-reference-outside-unicode-range parse error. Set the character reference code to 0xFFFD.
If the number is a surrogate, then this is a surrogate-character-reference parse error. Set the character reference code to 0xFFFD.
If the number is a noncharacter, then this is a noncharacter-character-reference parse error.
If the number is 0x0D, or a control that's not ASCII whitespace, then this is a control-character-reference parse error. If the number is one of the numbers in the first column of the following table, then find the row with that number in the first column, and set the character reference code to the number in the second column of that row.
Number | Code point | |
---|---|---|
0x80 | 0x20AC | EURO SIGN (€) |
0x82 | 0x201A | SINGLE LOW-9 QUOTATION MARK (‚) |
0x83 | 0x0192 | LATIN SMALL LETTER F WITH HOOK (ƒ) |
0x84 | 0x201E | DOUBLE LOW-9 QUOTATION MARK („) |
0x85 | 0x2026 | HORIZONTAL ELLIPSIS (…) |
0x86 | 0x2020 | DAGGER (†) |
0x87 | 0x2021 | DOUBLE DAGGER (‡) |
0x88 | 0x02C6 | MODIFIER LETTER CIRCUMFLEX ACCENT (ˆ) |
0x89 | 0x2030 | PER MILLE SIGN (‰) |
0x8A | 0x0160 | LATIN CAPITAL LETTER S WITH CARON (Š) |
0x8B | 0x2039 | SINGLE LEFT-POINTING ANGLE QUOTATION MARK (‹) |
0x8C | 0x0152 | LATIN CAPITAL LIGATURE OE (Œ) |
0x8E | 0x017D | LATIN CAPITAL LETTER Z WITH CARON (Ž) |
0x91 | 0x2018 | LEFT SINGLE QUOTATION MARK (‘) |
0x92 | 0x2019 | RIGHT SINGLE QUOTATION MARK (’) |
0x93 | 0x201C | LEFT DOUBLE QUOTATION MARK (“) |
0x94 | 0x201D | RIGHT DOUBLE QUOTATION MARK (”) |
0x95 | 0x2022 | BULLET (•) |
0x96 | 0x2013 | EN DASH (–) |
0x97 | 0x2014 | EM DASH (—) |
0x98 | 0x02DC | SMALL TILDE (˜) |
0x99 | 0x2122 | TRADE MARK SIGN (™) |
0x9A | 0x0161 | LATIN SMALL LETTER S WITH CARON (š) |
0x9B | 0x203A | SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (›) |
0x9C | 0x0153 | LATIN SMALL LIGATURE OE (œ) |
0x9E | 0x017E | LATIN SMALL LETTER Z WITH CARON (ž) |
0x9F | 0x0178 | LATIN CAPITAL LETTER Y WITH DIAERESIS (Ÿ) |
Set the temporary buffer to the empty string. Append a code point equal to the character reference code to the temporary buffer. Flush code points consumed as a character reference. Switch to the return state.
The input to the tree construction stage is a sequence of tokens from the
tokenization stage. The tree construction stage is associated with a DOM
Document
object when a parser is created. The "output" of this stage consists of
dynamically modifying or extending that document's DOM tree.
This specification does not define when an interactive user agent has to render the
Document
so that it is available to the user, or when it has to begin accepting user
input.
As each token is emitted from the tokenizer, the user agent must follow the appropriate steps from the following list, known as the tree construction dispatcher:
annotation-xml
element and the token is a start tag whose tag name is "svg"The next token is the token that is about to be processed by the tree construction dispatcher (even if the token is subsequently just ignored).
A node is a MathML text integration point if it is one of the following elements:
mi
elementmo
elementmn
elementms
elementmtext
elementA node is an HTML integration point if it is one of the following elements:
annotation-xml
element whose start tag token had an
attribute with the name "encoding" whose value was an ASCII case-insensitive match
for the string "text/html
"annotation-xml
element whose start tag token had an
attribute with the name "encoding" whose value was an ASCII case-insensitive match
for the string "application/xhtml+xml
"foreignObject
elementdesc
elementtitle
elementIf the node in question is the context element passed to the HTML fragment parsing algorithm, then the start tag token for that element is the "fake" token created during by that HTML fragment parsing algorithm.
Not all of the tag names mentioned below are conformant tag names in this specification; many are included to handle legacy content. They still form part of the algorithm that implementations are required to implement to claim conformance.
The algorithm described below places no limit on the depth of the DOM tree
generated, or on the length of tag names, attribute names, attribute values, Text
nodes, etc. While implementers are encouraged to avoid arbitrary limits, it is
recognized that practical concerns will likely force user agents to impose nesting depth
constraints.
While the parser is processing a token, it can enable or disable foster parenting. This affects the following algorithm.
The appropriate place for inserting a node, optionally using a particular override target, is the position in an element returned by running the following steps:
If there was an override target specified, then let target be the override target.
Otherwise, let target be the current node.
Determine the adjusted insertion location using the first matching steps from the following list:
table
, tbody
, tfoot
,
thead
, or tr
elementFoster parenting happens when content is misnested in tables.
Run these substeps:
Let last template be the last template
element in the
stack of open elements, if any.
Let last table be the last table
element in the
stack of open elements, if any.
If there is a last template and either there is no last table, or there is one, but last template is lower (more recently added) than last table in the stack of open elements, then: let adjusted insertion location be inside last template's template contents, after its last child (if any), and abort these steps.
If there is no last table, then let adjusted insertion
location be inside the first element in the stack of open elements (the
html
element), after its last child (if any), and abort these steps.
(fragment case)
If last table has a parent node, then let adjusted insertion location be inside last table's parent node, immediately before last table, and abort these steps.
Let previous element be the element immediately above last table in the stack of open elements.
Let adjusted insertion location be inside previous element, after its last child (if any).
These steps are involved in part because it's possible for elements, the
table
element in this case in particular, to have been moved by a script around
in the DOM, or indeed removed from the DOM entirely, after the element was inserted by the
parser.
Let adjusted insertion location be inside target, after its last child (if any).
If the adjusted insertion location is inside a template
element, let it instead be inside the template
element's template
contents, after its last child (if any).
Return the adjusted insertion location.
When the steps below require the UA to create an element for a token in a particular given namespace and with a particular intended parent, the UA must run the following steps:
If the active speculative HTML parser is not null, then return the result of creating a speculative mock element given given namespace, the tag name of the given token, and the attributes of the given token.
Otherwise, optionally create a speculative mock element given given namespace, the tag name of the given token, and the attributes of the given token.
The result is not used. This step allows for a speculative fetch to be initiated from non-speculative parsing. The fetch is still speculative at this point, because, for example, by the time the element is inserted, intended parent might have been removed from the document.
Let document be intended parent's node document.
Let local name be the tag name of the token.
Let is be the value of the "is
" attribute in the
given token, if such an attribute exists, or null otherwise.
Let definition be the result of looking up a custom element definition given document, given namespace, local name, and is.
If definition is non-null and the parser was not created as part of the HTML fragment parsing algorithm, then let will execute script be true. Otherwise, let it be false.
If will execute script is true, then:
Increment document's throw-on-dynamic-markup-insertion counter.
If the JavaScript execution context stack is empty, then perform a microtask checkpoint.
Push a new element queue onto document's relevant agent's custom element reactions stack.
Let element be the result of creating an element given document, localName, given namespace, null, and is. If will execute script is true, set the synchronous custom elements flag; otherwise, leave it unset.
This will cause custom element constructors to run, if will execute script is true. However, since we incremented the throw-on-dynamic-markup-insertion counter, this cannot cause new characters to be inserted into the tokenizer, or the document to be blown away.
Append each attribute in the given token to element.
This can enqueue a custom element callback reaction for the
attributeChangedCallback
, which might run immediately (in the next
step).
Even though the is
attribute governs the creation of a customized built-in element, it is
not present during the execution of the relevant custom element constructor; it is
appended in this step, along with all other attributes.
If will execute script is true, then:
Let queue be the result of popping from document's relevant agent's custom element reactions stack. (This will be the same element queue as was pushed above.)
Invoke custom element reactions in queue.
Decrement document's throw-on-dynamic-markup-insertion counter.
If element has an xmlns
attribute in the XMLNS
namespace whose value is not exactly the same as the element's namespace, that is a
parse error. Similarly, if element has an xmlns:xlink
attribute in the XMLNS namespace whose value is not the
XLink Namespace, that is a parse error.
If element is a resettable element, invoke its reset algorithm. (This initializes the element's value and checkedness based on the element's attributes.)
If element is a form-associated element and not a
form-associated custom element, the
form
element pointer is not null, there is no
template
element on the stack of open elements, element is
either not listed or doesn't have a form
attribute, and the intended parent is in the same
tree as the element pointed to by the form
element
pointer, then associate element
with the form
element pointed to by the form
element
pointer and set element's parser inserted flag.
Return element.
To insert an element at the adjusted insertion location with an element element:
Let the adjusted insertion location be the appropriate place for inserting a node.
If it is not possible to insert element at the adjusted insertion location, abort these steps.
If the parser was not created as part of the HTML fragment parsing algorithm, then push a new element queue onto element's relevant agent's custom element reactions stack.
Insert element at the adjusted insertion location.
If the parser was not created as part of the HTML fragment parsing algorithm, then pop the element queue from element's relevant agent's custom element reactions stack, and invoke custom element reactions in that queue.
If the adjusted insertion location cannot accept more elements, e.g.,
because it's a Document
that already has an element child, then element is
dropped on the floor.
When the steps below require the user agent to insert a foreign element for a token in a given namespace and with a boolean onlyAddToElementStack, the user agent must run these steps:
Let the adjusted insertion location be the appropriate place for inserting a node.
Let element be the result of creating an element for the token in the given namespace, with the intended parent being the element in which the adjusted insertion location finds itself.
If onlyAddToElementStack is false, then run insert an element at the adjusted insertion location with element.
Push element onto the stack of open elements so that it is the new current node.
Return element.
When the steps below require the user agent to insert an HTML element for a token, the user agent must insert a foreign element for the token, with the HTML namespace and false.
When the steps below require the user agent to adjust MathML attributes for a token,
then, if the token has an attribute named definitionurl
, change its name to
definitionURL
(note the case difference).
When the steps below require the user agent to adjust SVG attributes for a token, then, for each attribute on the token whose attribute name is one of the ones in the first column of the following table, change the attribute's name to the name given in the corresponding cell in the second column. (This fixes the case of SVG attributes that are not all lowercase.)
Attribute name on token | Attribute name on element |
---|---|
attributename | attributeName
|
attributetype | attributeType
|
basefrequency | baseFrequency
|
baseprofile | baseProfile
|
calcmode | calcMode
|
clippathunits | clipPathUnits
|
diffuseconstant | diffuseConstant
|
edgemode | edgeMode
|
filterunits | filterUnits
|
glyphref | glyphRef
|
gradienttransform | gradientTransform
|
gradientunits | gradientUnits
|
kernelmatrix | kernelMatrix
|
kernelunitlength | kernelUnitLength
|
keypoints | keyPoints
|
keysplines | keySplines
|
keytimes | keyTimes
|
lengthadjust | lengthAdjust
|
limitingconeangle | limitingConeAngle
|
markerheight | markerHeight
|
markerunits | markerUnits
|
markerwidth | markerWidth
|
maskcontentunits | maskContentUnits
|
maskunits | maskUnits
|
numoctaves | numOctaves
|
pathlength | pathLength
|
patterncontentunits | patternContentUnits
|
patterntransform | patternTransform
|
patternunits | patternUnits
|
pointsatx | pointsAtX
|
pointsaty | pointsAtY
|
pointsatz | pointsAtZ
|
preservealpha | preserveAlpha
|
preserveaspectratio | preserveAspectRatio
|
primitiveunits | primitiveUnits
|
refx | refX
|
refy | refY
|
repeatcount | repeatCount
|
repeatdur | repeatDur
|
requiredextensions | requiredExtensions
|
requiredfeatures | requiredFeatures
|
specularconstant | specularConstant
|
specularexponent | specularExponent
|
spreadmethod | spreadMethod
|
startoffset | startOffset
|
stddeviation | stdDeviation
|
stitchtiles | stitchTiles
|
surfacescale | surfaceScale
|
systemlanguage | systemLanguage
|
tablevalues | tableValues
|
targetx | targetX
|
targety | targetY
|
textlength | textLength
|
viewbox | viewBox
|
viewtarget | viewTarget
|
xchannelselector | xChannelSelector
|
ychannelselector | yChannelSelector
|
zoomandpan | zoomAndPan
|
When the steps below require the user agent to adjust foreign attributes for a
token, then, if any of the attributes on the token match the strings given in the first column of
the following table, let the attribute be a namespaced attribute, with the prefix being the string
given in the corresponding cell in the second column, the local name being the string given in the
corresponding cell in the third column, and the namespace being the namespace given in the
corresponding cell in the fourth column. (This fixes the use of namespaced attributes, in
particular lang
attributes in the XML
namespace.)
Attribute name | Prefix | Local name | Namespace |
---|---|---|---|
xlink:actuate | xlink | actuate | XLink namespace |
xlink:arcrole | xlink | arcrole | XLink namespace |
xlink:href | xlink | href | XLink namespace |
xlink:role | xlink | role | XLink namespace |
xlink:show | xlink | show | XLink namespace |
xlink:title | xlink | title | XLink namespace |
xlink:type | xlink | type | XLink namespace |
xml:lang | xml | lang | XML namespace |
xml:space | xml | space | XML namespace |
xmlns | (none) | xmlns | XMLNS namespace |
xmlns:xlink | xmlns | xlink | XMLNS namespace |
When the steps below require the user agent to insert a character while processing a token, the user agent must run the following steps:
Let data be the characters passed to the algorithm, or, if no characters were explicitly specified, the character of the character token being processed.
Let the adjusted insertion location be the appropriate place for inserting a node.
If the adjusted insertion location is in a Document
node,
then return.
The DOM will not let Document
nodes have Text
node
children, so they are dropped on the floor.
If there is a Text
node immediately before the adjusted insertion
location, then append data to that Text
node's data.
Otherwise, create a new Text
node whose data is data and
whose node document is the same as that of the
element in which the adjusted insertion location finds itself, and insert
the newly created node at the adjusted insertion location.
Here are some sample inputs to the parser and the corresponding number of Text
nodes that they result in, assuming a user agent that executes scripts.
Input | Number of Text nodes
|
---|---|
| One Text node in the document, containing "AB".
|
| Three Text nodes; "A" before the script, the script's contents, and "BC" after the script (the parser appends to the Text node created by the script).
|
| Two adjacent Text nodes in the document, containing "A" and "BC".
|
| One Text node before the table, containing "ABCD". (This is caused by foster parenting.)
|
| One Text node before the table, containing "A B C" (A-space-B-space-C). (This is caused by foster parenting.)
|
| One Text node before the table, containing "A BC" (A-space-B-C), and one Text node inside the table (as a child of a tbody ) with a single space character. (Space characters separated from non-space characters by non-character tokens are not affected by foster parenting, even if those other tokens then get ignored.)
|
When the steps below require the user agent to insert a comment while processing a comment token, optionally with an explicitly insertion position position, the user agent must run the following steps:
Let data be the data given in the comment token being processed.
If position was specified, then let the adjusted insertion location be position. Otherwise, let adjusted insertion location be the appropriate place for inserting a node.
Create a Comment
node whose data
attribute is set to
data and whose node document is
the same as that of the node in which the adjusted insertion location finds
itself.
Insert the newly created node at the adjusted insertion location.
The generic raw text element parsing algorithm and the generic RCDATA element parsing algorithm consist of the following steps. These algorithms are always invoked in response to a start tag token.
Insert an HTML element for the token.
If the algorithm that was invoked is the generic raw text element parsing algorithm, switch the tokenizer to the RAWTEXT state; otherwise the algorithm invoked was the generic RCDATA element parsing algorithm, switch the tokenizer to the RCDATA state.
Let the original insertion mode be the current insertion mode.
Then, switch the insertion mode to "text".
When the steps below require the UA to generate implied end tags, then, while the
current node is a dd
element, a dt
element, an
li
element, an optgroup
element, an option
element, a
p
element, an rb
element, an rp
element, an rt
element, or an rtc
element, the UA must pop the current node off the
stack of open elements.
If a step requires the UA to generate implied end tags but lists an element to exclude from the process, then the UA must perform the above steps as if that element was not in the above list.
When the steps below require the UA to generate all implied end tags thoroughly,
then, while the current node is a caption
element, a
colgroup
element, a dd
element, a dt
element, an
li
element, an optgroup
element, an option
element, a
p
element, an rb
element, an rp
element, an rt
element, an rtc
element, a tbody
element, a td
element, a
tfoot
element, a th
element, a thead
element, or a
tr
element, the UA must pop the current node off the
stack of open elements.
A Document
object has an associated parser cannot change the mode flag
(a boolean). It is initially false.
When the user agent is to apply the rules for the "initial" insertion mode, the user agent must handle the token as follows:
Ignore the token.
Insert a comment as the last child of the Document
object.
If the DOCTYPE token's name is not "html
", or the token's public
identifier is not missing, or the token's system identifier is neither missing nor
"about:legacy-compat
", then there is a parse error.
Append a DocumentType
node to the Document
node, with its name set to the name given in the DOCTYPE token, or the
empty string if the name was missing; its public
ID set to the public identifier given in the DOCTYPE token, or the empty string if the
public identifier was missing; and its system ID
set to the system identifier given in the DOCTYPE token, or the empty string if the system
identifier was missing.
This also ensures that the DocumentType
node is returned as the
value of the doctype
attribute of the
Document
object.
Then, if the document is not an iframe
srcdoc
document, and the parser cannot
change the mode flag is false, and the DOCTYPE token matches one of the conditions in the
following list, then set the Document
to quirks mode:
html
". -//W3O//DTD W3 HTML Strict 3.0//EN//
" -/W3C/DTD HTML 4.0 Transitional/EN
" HTML
" http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd
" +//Silmaril//dtd html Pro v0r11 19970101//
" -//AS//DTD HTML 3.0 asWedit + extensions//
" -//AdvaSoft Ltd//DTD HTML 3.0 asWedit + extensions//
" -//IETF//DTD HTML 2.0 Level 1//
" -//IETF//DTD HTML 2.0 Level 2//
" -//IETF//DTD HTML 2.0 Strict Level 1//
" -//IETF//DTD HTML 2.0 Strict Level 2//
" -//IETF//DTD HTML 2.0 Strict//
" -//IETF//DTD HTML 2.0//
" -//IETF//DTD HTML 2.1E//
" -//IETF//DTD HTML 3.0//
" -//IETF//DTD HTML 3.2 Final//
" -//IETF//DTD HTML 3.2//
" -//IETF//DTD HTML 3//
" -//IETF//DTD HTML Level 0//
" -//IETF//DTD HTML Level 1//
" -//IETF//DTD HTML Level 2//
" -//IETF//DTD HTML Level 3//
" -//IETF//DTD HTML Strict Level 0//
" -//IETF//DTD HTML Strict Level 1//
" -//IETF//DTD HTML Strict Level 2//
" -//IETF//DTD HTML Strict Level 3//
" -//IETF//DTD HTML Strict//
" -//IETF//DTD HTML//
" -//Metrius//DTD Metrius Presentational//
" -//Microsoft//DTD Internet Explorer 2.0 HTML Strict//
" -//Microsoft//DTD Internet Explorer 2.0 HTML//
" -//Microsoft//DTD Internet Explorer 2.0 Tables//
" -//Microsoft//DTD Internet Explorer 3.0 HTML Strict//
" -//Microsoft//DTD Internet Explorer 3.0 HTML//
" -//Microsoft//DTD Internet Explorer 3.0 Tables//
" -//Netscape Comm. Corp.//DTD HTML//
" -//Netscape Comm. Corp.//DTD Strict HTML//
" -//O'Reilly and Associates//DTD HTML 2.0//
" -//O'Reilly and Associates//DTD HTML Extended 1.0//
" -//O'Reilly and Associates//DTD HTML Extended Relaxed 1.0//
" -//SQ//DTD HTML 2.0 HoTMetaL + extensions//
" -//SoftQuad Software//DTD HoTMetaL PRO 6.0::19990601::extensions to HTML 4.0//
" -//SoftQuad//DTD HoTMetaL PRO 4.0::19971010::extensions to HTML 4.0//
" -//Spyglass//DTD HTML 2.0 Extended//
" -//Sun Microsystems Corp.//DTD HotJava HTML//
" -//Sun Microsystems Corp.//DTD HotJava Strict HTML//
" -//W3C//DTD HTML 3 1995-03-24//
" -//W3C//DTD HTML 3.2 Draft//
" -//W3C//DTD HTML 3.2 Final//
" -//W3C//DTD HTML 3.2//
" -//W3C//DTD HTML 3.2S Draft//
" -//W3C//DTD HTML 4.0 Frameset//
" -//W3C//DTD HTML 4.0 Transitional//
" -//W3C//DTD HTML Experimental 19960712//
" -//W3C//DTD HTML Experimental 970421//
" -//W3C//DTD W3 HTML//
" -//W3O//DTD W3 HTML 3.0//
" -//WebTechs//DTD Mozilla HTML 2.0//
" -//WebTechs//DTD Mozilla HTML//
" -//W3C//DTD HTML 4.01 Frameset//
" -//W3C//DTD HTML 4.01 Transitional//
" Otherwise, if the document is not an iframe
srcdoc
document, and the parser cannot change
the mode flag is false, and the DOCTYPE token matches one of the conditions in the
following list, then set the Document
to limited-quirks mode:
-//W3C//DTD XHTML 1.0 Frameset//
" -//W3C//DTD XHTML 1.0 Transitional//
" -//W3C//DTD HTML 4.01 Frameset//
" -//W3C//DTD HTML 4.01 Transitional//
" The system identifier and public identifier strings must be compared to the values given in the lists above in an ASCII case-insensitive manner. A system identifier whose value is the empty string is not considered missing for the purposes of the conditions above.
Then, switch the insertion mode to "before html".
If the document is not an iframe
srcdoc
document, then this is a parse
error; if the parser cannot change the mode flag is false, set the
Document
to quirks mode.
In any case, switch the insertion mode to "before html", then reprocess the token.
When the user agent is to apply the rules for the "before html" insertion mode, the user agent must handle the token as follows:
Parse error. Ignore the token.
Insert a comment as the last child of the Document
object.
Ignore the token.
Create an element for the token in the HTML namespace, with the
Document
as the intended parent. Append it to the Document
object. Put
this element in the stack of open elements.
Switch the insertion mode to "before head".
Act as described in the "anything else" entry below.
Parse error. Ignore the token.
Create an html
element whose node document is the Document
object. Append
it to the Document
object. Put this element in the stack of open
elements.
Switch the insertion mode to "before head", then reprocess the token.
The document element can end up being removed from the Document
object, e.g. by scripts; nothing in particular happens in such cases, content continues being
appended to the nodes as described in the next section.
When the user agent is to apply the rules for the "before head" insertion mode, the user agent must handle the token as follows:
Ignore the token.
Insert a comment.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
Insert an HTML element for the token.
Set the head
element pointer to the newly created
head
element.
Switch the insertion mode to "in head".
Act as described in the "anything else" entry below.
Parse error. Ignore the token.
Insert an HTML element for a "head" start tag token with no attributes.
Set the head
element pointer to the newly created
head
element.
Switch the insertion mode to "in head".
Reprocess the current token.
When the user agent is to apply the rules for the "in head" insertion mode, the user agent must handle the token as follows:
Insert the character.
Insert a comment.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
If the active speculative HTML parser is null, then:
If the element has a charset
attribute, and getting an encoding from
its value results in an encoding, and the
confidence is currently tentative,
then change the encoding to the resulting encoding.
Otherwise, if the element has an http-equiv
attribute whose value is an ASCII case-insensitive match for the string "Content-Type
", and the element has a content
attribute, and applying the algorithm for
extracting a character encoding from a meta
element to that attribute's
value returns an encoding, and the
confidence is currently tentative,
then change the encoding to the extracted encoding.
The speculative HTML parser doesn't speculatively apply character encoding declarations in order to reduce implementation complexity.
Follow the generic RCDATA element parsing algorithm.
Follow the generic raw text element parsing algorithm.
Insert an HTML element for the token.
Switch the insertion mode to "in head noscript".
Run these steps:
Let the adjusted insertion location be the appropriate place for inserting a node.
Create an element for the token in the HTML namespace, with the intended parent being the element in which the adjusted insertion location finds itself.
Set the element's parser document to the Document
, and set the
element's force async to false.
This ensures that, if the script is external, any document.write()
calls in the script will execute in-line,
instead of blowing the document away, as would happen in most other cases. It also prevents
the script from executing until the end tag is seen.
If the parser was created as part of the HTML fragment parsing algorithm,
then set the script
element's already started to true.
(fragment case)
If the parser was invoked via the document.write()
or document.writeln()
methods, then optionally set the
script
element's already started to true. (For example, the user
agent might use this clause to prevent execution of cross-origin
scripts inserted via document.write()
under slow
network conditions, or when the page has already taken a long time to load.)
Insert the newly created element at the adjusted insertion location.
Push the element onto the stack of open elements so that it is the new current node.
Switch the tokenizer to the script data state.
Let the original insertion mode be the current insertion mode.
Switch the insertion mode to "text".
Pop the current node (which will be the head
element) off the
stack of open elements.
Switch the insertion mode to "after head".
Act as described in the "anything else" entry below.
Let template start tag be the start tag.
Insert a marker at the end of the list of active formatting elements.
Set the frameset-ok flag to "not ok".
Switch the insertion mode to "in template".
Push "in template" onto the stack of template insertion modes so that it is the new current template insertion mode.
Let the adjusted insertion location be the appropriate place for inserting a node.
Let intended parent be the element in which the adjusted insertion location finds itself.
Let document be intended parent's node document.
If any of the following are false:
shadowrootmode
is not in
the none state;then insert an HTML element for the token.
Otherwise:
Let declarative shadow host element be adjusted current node.
Let template be the result of insert a foreign element for template start tag, with HTML namespace and true.
Let mode be template start tag's shadowrootmode
attribute's value.
Let clonable be true if template start tag has a shadowrootclonable
attribute; otherwise
false.
Let serializable be true if template start tag has a shadowrootserializable
attribute;
otherwise false.
Let delegatesFocus be true if template start tag has a shadowrootdelegatesfocus
attribute;
otherwise false.
If declarative shadow host element is a shadow host, then insert an element at the adjusted insertion location with template.
Otherwise:
Attach a shadow root with
declarative shadow host element, mode, clonable,
serializable, delegatesFocus, and "named
".
If an exception is thrown, then catch it and:
Insert an element at the adjusted insertion location with template.
The user agent may report an error to the developer console.
Return.
Let shadow be declarative shadow host element's shadow root.
Set shadow's declarative to true.
Set template's template contents property to shadow.
Set shadow's available to element internals to true.
If there is no template
element on the stack of open elements, then
this is a parse error; ignore the token.
Otherwise, run these steps:
Generate all implied end tags thoroughly.
If the current node is not a template
element, then this is a
parse error.
Pop elements from the stack of open elements until a template
element has been popped from the stack.
Pop the current template insertion mode off the stack of template insertion modes.
Reset the insertion mode appropriately.
Parse error. Ignore the token.
Pop the current node (which will be the head
element) off the
stack of open elements.
Switch the insertion mode to "after head".
Reprocess the token.
When the user agent is to apply the rules for the "in head noscript" insertion mode, the user agent must handle the token as follows:
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
Pop the current node (which will be a noscript
element) from the
stack of open elements; the new current node will be a
head
element.
Switch the insertion mode to "in head".
Process the token using the rules for the "in head" insertion mode.
Act as described in the "anything else" entry below.
Parse error. Ignore the token.
Parse error.
Pop the current node (which will be a noscript
element) from the
stack of open elements; the new current node will be a
head
element.
Switch the insertion mode to "in head".
Reprocess the token.
When the user agent is to apply the rules for the "after head" insertion mode, the user agent must handle the token as follows:
Insert the character.
Insert a comment.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
Insert an HTML element for the token.
Set the frameset-ok flag to "not ok".
Switch the insertion mode to "in body".
Insert an HTML element for the token.
Switch the insertion mode to "in frameset".
Parse error.
Push the node pointed to by the head
element pointer onto
the stack of open elements.
Process the token using the rules for the "in head" insertion mode.
Remove the node pointed to by the head
element pointer
from the stack of open elements. (It might not be the current node at
this point.)
The head
element pointer cannot be null at
this point.
Process the token using the rules for the "in head" insertion mode.
Act as described in the "anything else" entry below.
Parse error. Ignore the token.
Insert an HTML element for a "body" start tag token with no attributes.
Switch the insertion mode to "in body".
Reprocess the current token.
When the user agent is to apply the rules for the "in body" insertion mode, the user agent must handle the token as follows:
Parse error. Ignore the token.
Reconstruct the active formatting elements, if any.
Insert the token's character.
Reconstruct the active formatting elements, if any.
Insert the token's character.
Set the frameset-ok flag to "not ok".
Insert a comment.
Parse error. Ignore the token.
Parse error.
If there is a template
element on the stack of open elements, then
ignore the token.
Otherwise, for each attribute on the token, check to see if the attribute is already present on the top element of the stack of open elements. If it is not, add the attribute and its corresponding value to that element.
Process the token using the rules for the "in head" insertion mode.
Parse error.
If the stack of open elements has only one node on it, if the second element
on the stack of open elements is not a body
element, or if there is a
template
element on the stack of open elements, then ignore the token.
(fragment case or there is a template
element on the stack)
Otherwise, set the frameset-ok flag to "not ok"; then, for each attribute on the
token, check to see if the attribute is already present on the body
element (the
second element) on the stack of open elements, and if it is not, add the attribute
and its corresponding value to that element.
Parse error.
If the stack of open elements has only one node on it, or if the second element
on the stack of open elements is not a body
element, then ignore the
token. (fragment case or there is a template
element on the
stack)
If the frameset-ok flag is set to "not ok", ignore the token.
Otherwise, run the following steps:
Remove the second element on the stack of open elements from its parent node, if it has one.
Pop all the nodes from the bottom of the stack of open elements, from the
current node up to, but not including, the root html
element.
Insert an HTML element for the token.
Switch the insertion mode to "in frameset".
If the stack of template insertion modes is not empty, then process the token using the rules for the "in template" insertion mode.
Otherwise, follow these steps:
If there is a node in the stack of open elements that is not either a
dd
element, a dt
element, an li
element, an
optgroup
element, an option
element, a p
element, an
rb
element, an rp
element, an rt
element, an
rtc
element, a tbody
element, a td
element, a
tfoot
element, a th
element, a thead
element, a
tr
element, the body
element, or the html
element, then
this is a parse error.
Stop parsing.
If the stack of open elements does not have a body
element in scope, this is a parse error;
ignore the token.
Otherwise, if there is a node in the stack of open elements that is not either a
dd
element, a dt
element, an li
element, an
optgroup
element, an option
element, a p
element, an
rb
element, an rp
element, an rt
element, an
rtc
element, a tbody
element, a td
element, a
tfoot
element, a th
element, a thead
element, a
tr
element, the body
element, or the html
element, then
this is a parse error.
Switch the insertion mode to "after body".
If the stack of open elements does not have a body
element in scope, this is a parse error;
ignore the token.
Otherwise, if there is a node in the stack of open elements that is not either a
dd
element, a dt
element, an li
element, an
optgroup
element, an option
element, a p
element, an
rb
element, an rp
element, an rt
element, an
rtc
element, a tbody
element, a td
element, a
tfoot
element, a th
element, a thead
element, a
tr
element, the body
element, or the html
element, then
this is a parse error.
Switch the insertion mode to "after body".
Reprocess the token.
If the stack of open elements has a
p
element in button scope, then close a p
element.
Insert an HTML element for the token.
If the stack of open elements has a
p
element in button scope, then close a p
element.
If the current node is an HTML element whose tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then this is a parse error; pop the current node off the stack of open elements.
Insert an HTML element for the token.
If the stack of open elements has
a p
element in button scope, then close a p
element.
Insert an HTML element for the token.
If the next token is a U+000A LINE FEED (LF) character token, then ignore that
token and move on to the next one. (Newlines at the start of pre
blocks are ignored
as an authoring convenience.)
Set the frameset-ok flag to "not ok".
If the form
element pointer is not null, and there is
no template
element on the stack of open elements, then this is a
parse error; ignore the token.
Otherwise:
If the stack of open elements has
a p
element in button scope, then close a p
element.
Insert an HTML element for the token, and, if there is no template
element on the stack of open elements, set the form
element pointer to point to the element created.
Run these steps:
Set the frameset-ok flag to "not ok".
Initialize node to be the current node (the bottommost node of the stack).
Loop: If node is an li
element, then run these
substeps:
Generate implied end tags, except for li
elements.
If the current node is not an li
element, then this is a
parse error.
Pop elements from the stack of open elements until an li
element has been popped from the stack.
Jump to the step labeled done below.
If node is in the special category, but is not an
address
, div
, or p
element, then jump to the step
labeled done below.
Otherwise, set node to the previous entry in the stack of open elements and return to the step labeled loop.
Done: If the stack of open elements has a p
element in button scope, then close a
p
element.
Finally, insert an HTML element for the token.
Run these steps:
Set the frameset-ok flag to "not ok".
Initialize node to be the current node (the bottommost node of the stack).
Loop: If node is a dd
element, then run these
substeps:
Generate implied end tags, except for dd
elements.
If the current node is not a dd
element, then this is a
parse error.
Pop elements from the stack of open elements until a dd
element has been popped from the stack.
Jump to the step labeled done below.
If node is a dt
element, then run these substeps:
Generate implied end tags, except for dt
elements.
If the current node is not a dt
element, then this is a
parse error.
Pop elements from the stack of open elements until a dt
element has been popped from the stack.
Jump to the step labeled done below.
If node is in the special category, but is not an
address
, div
, or p
element, then jump to the step
labeled done below.
Otherwise, set node to the previous entry in the stack of open elements and return to the step labeled loop.
Done: If the stack of open elements has a p
element in button scope, then close a
p
element.
Finally, insert an HTML element for the token.
If the stack of open elements has a
p
element in button scope, then close a p
element.
Insert an HTML element for the token.
Switch the tokenizer to the PLAINTEXT state.
Once a start tag with the tag name "plaintext" has been seen, all remaining
tokens will be character tokens (and a final end-of-file token) because there is no way to
switch the tokenizer out of the PLAINTEXT state. However, as the tree builder
remains in its existing insertion mode, it might reconstruct the active formatting
elements while processing those character tokens. This means that the parser can
insert other elements into the plaintext
element.
If the stack of open elements has a
button
element in scope, then run these substeps:
Parse error.
Generate implied end tags.
Pop elements from the stack of open elements until a button
element has been popped from the stack.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token.
Set the frameset-ok flag to "not ok".
If the stack of open elements does not have an element in scope that is an HTML element with the same tag name as that of the token, then this is a parse error; ignore the token.
Otherwise, run these steps:
Generate implied end tags.
If the current node is not an HTML element with the same tag name as that of the token, then this is a parse error.
Pop elements from the stack of open elements until an HTML element with the same tag name as the token has been popped from the stack.
If there is no template
element on the stack of open elements, then
run these substeps:
Let node be the element that the form
element pointer is set to, or null if it is not set to an element.
Set the form
element pointer to null.
If node is null or if the stack of open elements does not have node in scope, then this is a parse error; return and ignore the token.
Generate implied end tags.
If the current node is not node, then this is a parse error.
Remove node from the stack of open elements.
If there is a template
element on the stack of open
elements, then run these substeps instead:
If the stack of open elements does not have a form
element in scope, then this is a parse
error; return and ignore the token.
Generate implied end tags.
If the current node is not a form
element, then this is a
parse error.
Pop elements from the stack of open elements until a form
element has been popped from the stack.
If the stack of open elements does not have a p
element in button scope, then this is a parse
error; insert an HTML element for a "p" start tag token with no
attributes.
Close a p
element.
If the stack of open elements does not have an li
element in list item scope, then this is a parse
error; ignore the token.
Otherwise, run these steps:
Generate implied end tags, except for li
elements.
If the current node is not an li
element, then this is a
parse error.
Pop elements from the stack of open elements until an li
element has been popped from the stack.
If the stack of open elements does not have an element in scope that is an HTML element with the same tag name as that of the token, then this is a parse error; ignore the token.
Otherwise, run these steps:
Generate implied end tags, except for HTML elements with the same tag name as the token.
If the current node is not an HTML element with the same tag name as that of the token, then this is a parse error.
Pop elements from the stack of open elements until an HTML element with the same tag name as the token has been popped from the stack.
If the stack of open elements does not have an element in scope that is an HTML element and whose tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then this is a parse error; ignore the token.
Otherwise, run these steps:
Generate implied end tags.
If the current node is not an HTML element with the same tag name as that of the token, then this is a parse error.
Pop elements from the stack of open elements until an HTML element whose tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6" has been popped from the stack.
Take a deep breath, then act as described in the "any other end tag" entry below.
If the list of active formatting elements contains an a
element
between the end of the list and the last marker on
the list (or the start of the list if there is no marker on the list), then this is a parse
error; run the adoption agency algorithm for the token, then remove that
element from the list of active formatting elements and the stack of open
elements if the adoption agency algorithm didn't already remove it (it might
not have if the element is not in table
scope).
In the non-conforming stream
<a href="a">a<table><a href="b">b</table>x
, the first
a
element would be closed upon seeing the second one, and the "x" character would
be inside a link to "b", not to "a". This is despite the fact that the outer a
element is not in table scope (meaning that a regular </a>
end tag at the start
of the table wouldn't close the outer a
element). The result is that the two
a
elements are indirectly nested inside each other — non-conforming markup
will often result in non-conforming DOMs when parsed.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token. Push onto the list of active formatting elements that element.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token. Push onto the list of active formatting elements that element.
Reconstruct the active formatting elements, if any.
If the stack of open elements has a
nobr
element in scope, then this is a parse error; run the
adoption agency algorithm for the token, then once again reconstruct the
active formatting elements, if any.
Insert an HTML element for the token. Push onto the list of active formatting elements that element.
Run the adoption agency algorithm for the token.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token.
Insert a marker at the end of the list of active formatting elements.
Set the frameset-ok flag to "not ok".
If the stack of open elements does not have an element in scope that is an HTML element with the same tag name as that of the token, then this is a parse error; ignore the token.
Otherwise, run these steps:
Generate implied end tags.
If the current node is not an HTML element with the same tag name as that of the token, then this is a parse error.
Pop elements from the stack of open elements until an HTML element with the same tag name as the token has been popped from the stack.
If the Document
is not set to quirks mode, and the
stack of open elements has a
p
element in button scope, then close a p
element.
Insert an HTML element for the token.
Set the frameset-ok flag to "not ok".
Switch the insertion mode to "in table".
Parse error. Drop the attributes from the token, and act as described in the next entry; i.e. act as if this was a "br" start tag token with no attributes, rather than the end tag token that it actually is.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
Set the frameset-ok flag to "not ok".
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
If the token does not have an attribute with the name "type", or if it does, but that
attribute's value is not an ASCII case-insensitive match for the string "hidden
", then: set the frameset-ok flag to "not ok".
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
If the stack of open elements has a
p
element in button scope, then close a p
element.
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
Set the frameset-ok flag to "not ok".
Parse error. Change the token's tag name to "img" and reprocess it. (Don't ask.)
Run these steps:
Insert an HTML element for the token.
If the next token is a U+000A LINE FEED (LF) character token, then ignore
that token and move on to the next one. (Newlines at the start of textarea
elements are ignored as an authoring convenience.)
Switch the tokenizer to the RCDATA state.
Let the original insertion mode be the current insertion mode.
Set the frameset-ok flag to "not ok".
Switch the insertion mode to "text".
If the stack of open elements has a
p
element in button scope, then close a p
element.
Reconstruct the active formatting elements, if any.
Set the frameset-ok flag to "not ok".
Follow the generic raw text element parsing algorithm.
Set the frameset-ok flag to "not ok".
Follow the generic raw text element parsing algorithm.
Follow the generic raw text element parsing algorithm.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token.
Set the frameset-ok flag to "not ok".
If the insertion mode is one of "in table", "in caption", "in table body", "in row", or "in cell", then switch the insertion mode to "in select in table". Otherwise, switch the insertion mode to "in select".
If the current node is an option
element, then pop the
current node off the stack of open elements.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token.
If the stack of open elements has a
ruby
element in scope, then generate implied end tags. If the
current node is not now a ruby
element, this is a
parse error.
Insert an HTML element for the token.
If the stack of open elements has a
ruby
element in scope, then generate implied end tags, except
for rtc
elements. If the current node is not now a rtc
element or a ruby
element, this is a parse error.
Insert an HTML element for the token.
Reconstruct the active formatting elements, if any.
Adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink.)
Insert a foreign element for the token, with MathML namespace and false.
If the token has its self-closing flag set, pop the current node off the stack of open elements and acknowledge the token's self-closing flag.
Reconstruct the active formatting elements, if any.
Adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
Insert a foreign element for the token, with SVG namespace and false.
If the token has its self-closing flag set, pop the current node off the stack of open elements and acknowledge the token's self-closing flag.
Parse error. Ignore the token.
Reconstruct the active formatting elements, if any.
Insert an HTML element for the token.
This element will be an ordinary element. With one exception: if
the scripting flag is disabled, it can also be a noscript
element.
Run these steps:
Initialize node to be the current node (the bottommost node of the stack).
Loop: If node is an HTML element with the same tag name as the token, then:
Generate implied end tags, except for HTML elements with the same tag name as the token.
If node is not the current node, then this is a parse error.
Pop all the nodes from the current node up to node, including node, then stop these steps.
Otherwise, if node is in the special category, then this is a parse error; ignore the token, and return.
Set node to the previous entry in the stack of open elements.
Return to the step labeled loop.
When the steps above say the user agent is to close a p
element, it
means that the user agent must run the following steps:
Generate implied end tags, except for p
elements.
If the current node is not a p
element, then this is a
parse error.
Pop elements from the stack of open elements until a p
element
has been popped from the stack.
The adoption agency algorithm, which takes as its only argument a token token for which the algorithm is being run, consists of the following steps:
Let subject be token's tag name.
If the current node is an HTML element whose tag name is subject, and the current node is not in the list of active formatting elements, then pop the current node off the stack of open elements and return.
Let outerLoopCounter be 0.
While true:
If outerLoopCounter is greater than or equal to 8, then return.
Increment outerLoopCounter by 1.
Let formattingElement be the last element in the list of active formatting elements that:
If there is no such element, then return and instead act as described in the "any other end tag" entry above.
If formattingElement is not in the stack of open elements, then this is a parse error; remove the element from the list, and return.
If formattingElement is in the stack of open elements, but the element is not in scope, then this is a parse error; return.
If formattingElement is not the current node, this is a parse error. (But do not return.)
Let furthestBlock be the topmost node in the stack of open elements that is lower in the stack than formattingElement, and is an element in the special category. There might not be one.
If there is no furthestBlock, then the UA must first pop all the nodes from the bottom of the stack of open elements, from the current node up to and including formattingElement, then remove formattingElement from the list of active formatting elements, and finally return.
Let commonAncestor be the element immediately above formattingElement in the stack of open elements.
Let a bookmark note the position of formattingElement in the list of active formatting elements relative to the elements on either side of it in the list.
Let node and lastNode be furthestBlock.
Let innerLoopCounter be 0.
While true:
Increment innerLoopCounter by 1.
Let node be the element immediately above node in the stack of open elements, or if node is no longer in the stack of open elements (e.g. because it got removed by this algorithm), the element that was immediately above node in the stack of open elements before node was removed.
If node is formattingElement, then break.
If innerLoopCounter is greater than 3 and node is in the list of active formatting elements, then remove node from the list of active formatting elements.
If node is not in the list of active formatting elements, then remove node from the stack of open elements and continue.
Create an element for the token for which the element node was created, in the HTML namespace, with commonAncestor as the intended parent; replace the entry for node in the list of active formatting elements with an entry for the new element, replace the entry for node in the stack of open elements with an entry for the new element, and let node be the new element.
If last node is furthestBlock, then move the aforementioned bookmark to be immediately after the new node in the list of active formatting elements.
Append lastNode to node.
Set lastNode to node.
Insert whatever lastNode ended up being in the previous step at the appropriate place for inserting a node, but using commonAncestor as the override target.
Create an element for the token for which formattingElement was created, in the HTML namespace, with furthestBlock as the intended parent.
Take all of the child nodes of furthestBlock and append them to the element created in the last step.
Append that new element to furthestBlock.
Remove formattingElement from the list of active formatting elements, and insert the new element into the list of active formatting elements at the position of the aforementioned bookmark.
Remove formattingElement from the stack of open elements, and insert the new element into the stack of open elements immediately below the position of furthestBlock in that stack.
This algorithm's name, the "adoption agency algorithm", comes from the way it causes elements to change parents, and is in contrast with other possible algorithms for dealing with misnested content.
When the user agent is to apply the rules for the "text" insertion mode, the user agent must handle the token as follows:
Insert the token's character.
This can never be a U+0000 NULL character; the tokenizer converts those to U+FFFD REPLACEMENT CHARACTER characters.
Parse error.
If the current node is a script
element, then set its already
started to true.
Pop the current node off the stack of open elements.
Switch the insertion mode to the original insertion mode and reprocess the token.
If the active speculative HTML parser is null and the JavaScript execution context stack is empty, then perform a microtask checkpoint.
Let script be the current node (which will be a
script
element).
Pop the current node off the stack of open elements.
Switch the insertion mode to the original insertion mode.
Let the old insertion point have the same value as the current insertion point. Let the insertion point be just before the next input character.
Increment the parser's script nesting level by one.
If the active speculative HTML parser is null, then prepare the script element script. This might cause some script to execute, which might cause new characters to be inserted into the tokenizer, and might cause the tokenizer to output more tokens, resulting in a reentrant invocation of the parser.
Decrement the parser's script nesting level by one. If the parser's script nesting level is zero, then set the parser pause flag to false.
Let the insertion point have the value of the old insertion point. (In other words, restore the insertion point to its previous value. This value might be the "undefined" value.)
At this stage, if the pending parsing-blocking script is not null, then:
Set the parser pause flag to true, and abort the processing of any nested invocations of the tokenizer, yielding control back to the caller. (Tokenization will resume when the caller returns to the "outer" tree construction stage.)
The tree construction stage of this particular parser is being called reentrantly, say from a call to document.write()
.
While the pending parsing-blocking script is not null:
Let the script be the pending parsing-blocking script.
Set the pending parsing-blocking script to null.
Start the speculative HTML parser for this instance of the HTML parser.
Block the tokenizer for this instance of the HTML parser, such that the event loop will not run tasks that invoke the tokenizer.
If the parser's Document
has a style sheet that is blocking
scripts or the script's ready to be parser-executed is false:
spin the event loop until the parser's Document
has no style
sheet that is blocking scripts and the script's ready to be
parser-executed becomes true.
If this parser has been aborted in the meantime, return.
This could happen if, e.g., while the spin the event loop
algorithm is running, the Document
gets destroyed, or the document.open()
method gets invoked on the Document
.
Stop the speculative HTML parser for this instance of the HTML parser.
Unblock the tokenizer for this instance of the HTML parser, such that tasks that invoke the tokenizer can again be run.
Let the insertion point be just before the next input character.
Increment the parser's script nesting level by one (it should be zero before this step, so this sets it to one).
Execute the script element the script.
Decrement the parser's script nesting level by one. If the parser's script nesting level is zero (which it always should be at this point), then set the parser pause flag to false.
Let the insertion point be undefined again.
Pop the current node off the stack of open elements.
Switch the insertion mode to the original insertion mode.
When the user agent is to apply the rules for the "in table" insertion mode, the user agent must handle the token as follows:
table
, tbody
, template
, tfoot
, thead
, or tr
elementLet the pending table character tokens be an empty list of tokens.
Let the original insertion mode be the current insertion mode.
Switch the insertion mode to "in table text" and reprocess the token.
Insert a comment.
Parse error. Ignore the token.
Clear the stack back to a table context. (See below.)
Insert a marker at the end of the list of active formatting elements.
Insert an HTML element for the token, then switch the insertion mode to "in caption".
Clear the stack back to a table context. (See below.)
Insert an HTML element for the token, then switch the insertion mode to "in column group".
Clear the stack back to a table context. (See below.)
Insert an HTML element for a "colgroup" start tag token with no attributes, then switch the insertion mode to "in column group".
Reprocess the current token.
Clear the stack back to a table context. (See below.)
Insert an HTML element for the token, then switch the insertion mode to "in table body".
Clear the stack back to a table context. (See below.)
Insert an HTML element for a "tbody" start tag token with no attributes, then switch the insertion mode to "in table body".
Reprocess the current token.
Parse error.
If the stack of open elements does not have a table
element in table scope, ignore the token.
Otherwise:
Pop elements from this stack until a table
element has been popped from the
stack.
Reset the insertion mode appropriately.
Reprocess the token.
If the stack of open elements does not have a table
element in table scope, this is a parse
error; ignore the token.
Otherwise:
Pop elements from this stack until a table
element has been popped from the
stack.
Reset the insertion mode appropriately.
Parse error. Ignore the token.
Process the token using the rules for the "in head" insertion mode.
If the token does not have an attribute with the name "type", or if it does, but that
attribute's value is not an ASCII case-insensitive match for the string "hidden
", then: act as described in the "anything else" entry below.
Otherwise:
Parse error.
Insert an HTML element for the token.
Pop that input
element off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
Parse error.
If there is a template
element on the stack of open elements, or if
the form
element pointer is not null, ignore the
token.
Otherwise:
Insert an HTML element for the token, and set the form
element pointer to point to the element created.
Pop that form
element off the stack of open elements.
Process the token using the rules for the "in body" insertion mode.
Parse error. Enable foster parenting, process the token using the rules for the "in body" insertion mode, and then disable foster parenting.
When the steps above require the UA to clear the stack back to a table context, it
means that the UA must, while the current node is not a table
,
template
, or html
element, pop elements from the stack of open
elements.
This is the same list of elements as used in the has an element in table scope steps.
The current node being an html
element after this
process is a fragment case.
When the user agent is to apply the rules for the "in table text" insertion mode, the user agent must handle the token as follows:
Parse error. Ignore the token.
Append the character token to the pending table character tokens list.
If any of the tokens in the pending table character tokens list are character tokens that are not ASCII whitespace, then this is a parse error: reprocess the character tokens in the pending table character tokens list using the rules given in the "anything else" entry in the "in table" insertion mode.
Otherwise, insert the characters given by the pending table character tokens list.
Switch the insertion mode to the original insertion mode and reprocess the token.
When the user agent is to apply the rules for the "in caption" insertion mode, the user agent must handle the token as follows:
If the stack of open elements does not have a caption
element in table scope, this is a parse
error; ignore the token. (fragment case)
Otherwise:
Generate implied end tags.
Now, if the current node is not a caption
element, then this is a
parse error.
Pop elements from this stack until a caption
element has been popped from the
stack.
Clear the list of active formatting elements up to the last marker.
Switch the insertion mode to "in table".
If the stack of open elements does not have a caption
element in table scope, this is a parse
error; ignore the token. (fragment case)
Otherwise:
Generate implied end tags.
Now, if the current node is not a caption
element, then this is a
parse error.
Pop elements from this stack until a caption
element has been popped from the
stack.
Clear the list of active formatting elements up to the last marker.
Switch the insertion mode to "in table".
Reprocess the token.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
When the user agent is to apply the rules for the "in column group" insertion mode, the user agent must handle the token as follows:
Insert the character.
Insert a comment.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
If the current node is not a colgroup
element, then this is a
parse error; ignore the token.
Otherwise, pop the current node from the stack of open elements. Switch the insertion mode to "in table".
Parse error. Ignore the token.
Process the token using the rules for the "in head" insertion mode.
Process the token using the rules for the "in body" insertion mode.
If the current node is not a colgroup
element, then this is a
parse error; ignore the token.
Otherwise, pop the current node from the stack of open elements.
Switch the insertion mode to "in table".
Reprocess the token.
When the user agent is to apply the rules for the "in table body" insertion mode, the user agent must handle the token as follows:
Clear the stack back to a table body context. (See below.)
Insert an HTML element for the token, then switch the insertion mode to "in row".
Parse error.
Clear the stack back to a table body context. (See below.)
Insert an HTML element for a "tr" start tag token with no attributes, then switch the insertion mode to "in row".
Reprocess the current token.
If the stack of open elements does not have an element in table scope that is an HTML element with the same tag name as the token, this is a parse error; ignore the token.
Otherwise:
Clear the stack back to a table body context. (See below.)
Pop the current node from the stack of open elements. Switch the insertion mode to "in table".
If the stack of open elements does not have a tbody
, thead
, or tfoot
element in table
scope, this is a parse error; ignore the token.
Otherwise:
Clear the stack back to a table body context. (See below.)
Pop the current node from the stack of open elements. Switch the insertion mode to "in table".
Reprocess the token.
Parse error. Ignore the token.
Process the token using the rules for the "in table" insertion mode.
When the steps above require the UA to clear the stack back to a table body context,
it means that the UA must, while the current node is not a tbody
,
tfoot
, thead
, template
, or html
element, pop
elements from the stack of open elements.
The current node being an html
element after this
process is a fragment case.
When the user agent is to apply the rules for the "in row" insertion mode, the user agent must handle the token as follows:
Clear the stack back to a table row context. (See below.)
Insert an HTML element for the token, then switch the insertion mode to "in cell".
Insert a marker at the end of the list of active formatting elements.
If the stack of open elements does not have a tr
element in table scope, this is a parse error;
ignore the token.
Otherwise:
Clear the stack back to a table row context. (See below.)
Pop the current node (which will be a tr
element) from the
stack of open elements. Switch the insertion mode to "in table body".
If the stack of open elements does not have a tr
element in table scope, this is a parse error;
ignore the token.
Otherwise:
Clear the stack back to a table row context. (See below.)
Pop the current node (which will be a tr
element) from the
stack of open elements. Switch the insertion mode to "in table body".
Reprocess the token.
If the stack of open elements does not have an element in table scope that is an HTML element with the same tag name as the token, this is a parse error; ignore the token.
If the stack of open elements does not have a tr
element in table scope, ignore the token.
Otherwise:
Clear the stack back to a table row context. (See below.)
Pop the current node (which will be a tr
element) from the
stack of open elements. Switch the insertion mode to "in table body".
Reprocess the token.
Parse error. Ignore the token.
Process the token using the rules for the "in table" insertion mode.
When the steps above require the UA to clear the stack back to a table row context,
it means that the UA must, while the current node is not a tr
,
template
, or html
element, pop elements from the stack of open
elements.
The current node being an html
element after this
process is a fragment case.
When the user agent is to apply the rules for the "in cell" insertion mode, the user agent must handle the token as follows:
If the stack of open elements does not have an element in table scope that is an HTML element with the same tag name as that of the token, then this is a parse error; ignore the token.
Otherwise:
Generate implied end tags.
Now, if the current node is not an HTML element with the same tag name as the token, then this is a parse error.
Pop elements from the stack of open elements until an HTML element with the same tag name as the token has been popped from the stack.
Clear the list of active formatting elements up to the last marker.
Switch the insertion mode to "in row".
Assert: The stack of open elements has a td
or th
element in table scope.
Close the cell (see below) and reprocess the token.
Parse error. Ignore the token.
If the stack of open elements does not have an element in table scope that is an HTML element with the same tag name as that of the token, then this is a parse error; ignore the token.
Otherwise, close the cell (see below) and reprocess the token.
Process the token using the rules for the "in body" insertion mode.
Where the steps above say to close the cell, they mean to run the following algorithm:
Generate implied end tags.
If the current node is not now a td
element or a th
element, then this is a parse error.
Pop elements from the stack of open elements until a td
element or a th
element has been popped from the stack.
Clear the list of active formatting elements up to the last marker.
Switch the insertion mode to "in row".
The stack of open elements cannot have both a td
and a
th
element in table scope at the
same time, nor can it have neither when the close the cell algorithm is invoked.
When the user agent is to apply the rules for the "in select" insertion mode, the user agent must handle the token as follows:
Parse error. Ignore the token.
Insert the token's character.
Insert a comment.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
If the current node is an option
element, pop that node from the
stack of open elements.
Insert an HTML element for the token.
If the current node is an option
element, pop that node from the
stack of open elements.
If the current node is an optgroup
element, pop that node from the
stack of open elements.
Insert an HTML element for the token.
If the current node is an option
element, pop that node from the
stack of open elements.
If the current node is an optgroup
element, pop that node from the
stack of open elements.
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
First, if the current node is an option
element, and the node
immediately before it in the stack of open elements is an optgroup
element, then pop the current node from the stack of open
elements.
If the current node is an optgroup
element, then pop that node from
the stack of open elements. Otherwise, this is a parse error; ignore
the token.
If the current node is an option
element, then pop that node from
the stack of open elements. Otherwise, this is a parse error; ignore
the token.
If the stack of open elements does not have a select
element in select scope, this is a parse
error; ignore the token. (fragment case)
Otherwise:
Pop elements from the stack of open elements until a select
element
has been popped from the stack.
Reset the insertion mode appropriately.
Parse error.
If the stack of open elements does not have a select
element in select scope, ignore the token.
(fragment case)
Otherwise:
Pop elements from the stack of open elements until a select
element
has been popped from the stack.
Reset the insertion mode appropriately.
It just gets treated like an end tag.
Parse error.
If the stack of open elements does not have a select
element in select scope, ignore the token.
(fragment case)
Otherwise:
Pop elements from the stack of open elements until a select
element
has been popped from the stack.
Reset the insertion mode appropriately.
Reprocess the token.
Process the token using the rules for the "in head" insertion mode.
Process the token using the rules for the "in body" insertion mode.
Parse error. Ignore the token.
When the user agent is to apply the rules for the "in select in table" insertion mode, the user agent must handle the token as follows:
Parse error.
Pop elements from the stack of open elements until a select
element
has been popped from the stack.
Reset the insertion mode appropriately.
Reprocess the token.
Parse error.
If the stack of open elements does not have an element in table scope that is an HTML element with the same tag name as that of the token, then ignore the token.
Otherwise:
Pop elements from the stack of open elements until a select
element
has been popped from the stack.
Reset the insertion mode appropriately.
Reprocess the token.
Process the token using the rules for the "in select" insertion mode.
When the user agent is to apply the rules for the "in template" insertion mode, the user agent must handle the token as follows:
Process the token using the rules for the "in body" insertion mode.
Process the token using the rules for the "in head" insertion mode.
Pop the current template insertion mode off the stack of template insertion modes.
Push "in table" onto the stack of template insertion modes so that it is the new current template insertion mode.
Switch the insertion mode to "in table", and reprocess the token.
Pop the current template insertion mode off the stack of template insertion modes.
Push "in column group" onto the stack of template insertion modes so that it is the new current template insertion mode.
Switch the insertion mode to "in column group", and reprocess the token.
Pop the current template insertion mode off the stack of template insertion modes.
Push "in table body" onto the stack of template insertion modes so that it is the new current template insertion mode.
Switch the insertion mode to "in table body", and reprocess the token.
Pop the current template insertion mode off the stack of template insertion modes.
Push "in row" onto the stack of template insertion modes so that it is the new current template insertion mode.
Switch the insertion mode to "in row", and reprocess the token.
Pop the current template insertion mode off the stack of template insertion modes.
Push "in body" onto the stack of template insertion modes so that it is the new current template insertion mode.
Switch the insertion mode to "in body", and reprocess the token.
Parse error. Ignore the token.
If there is no template
element on the stack of open elements, then
stop parsing. (fragment case)
Otherwise, this is a parse error.
Pop elements from the stack of open elements until a template
element has been popped from the stack.
Clear the list of active formatting elements up to the last marker.
Pop the current template insertion mode off the stack of template insertion modes.
Reset the insertion mode appropriately.
Reprocess the token.
When the user agent is to apply the rules for the "after body" insertion mode, the user agent must handle the token as follows:
Process the token using the rules for the "in body" insertion mode.
Insert a comment as the last child of the first element in the stack of
open elements (the html
element).
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
If the parser was created as part of the HTML fragment parsing algorithm, this is a parse error; ignore the token. (fragment case)
Otherwise, switch the insertion mode to "after after body".
Stop parsing.
Parse error. Switch the insertion mode to "in body" and reprocess the token.
When the user agent is to apply the rules for the "in frameset" insertion mode, the user agent must handle the token as follows:
Insert the character.
Insert a comment.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
Insert an HTML element for the token.
If the current node is the root html
element, then this is a
parse error; ignore the token. (fragment case)
Otherwise, pop the current node from the stack of open elements.
If the parser was not created as part of the HTML fragment parsing algorithm
(fragment case), and the current node is no longer a
frameset
element, then switch the insertion mode to "after frameset".
Insert an HTML element for the token. Immediately pop the current node off the stack of open elements.
Acknowledge the token's self-closing flag, if it is set.
Process the token using the rules for the "in head" insertion mode.
If the current node is not the root html
element, then this is a
parse error.
The current node can only be the root
html
element in the fragment case.
Stop parsing.
Parse error. Ignore the token.
When the user agent is to apply the rules for the "after frameset" insertion mode, the user agent must handle the token as follows:
Insert the character.
Insert a comment.
Parse error. Ignore the token.
Process the token using the rules for the "in body" insertion mode.
Switch the insertion mode to "after after frameset".
Process the token using the rules for the "in head" insertion mode.
Stop parsing.
Parse error. Ignore the token.
When the user agent is to apply the rules for the "after after body" insertion mode, the user agent must handle the token as follows:
Insert a comment as the last child of the Document
object.
Process the token using the rules for the "in body" insertion mode.
Stop parsing.
Parse error. Switch the insertion mode to "in body" and reprocess the token.
When the user agent is to apply the rules for the "after after frameset" insertion mode, the user agent must handle the token as follows:
Insert a comment as the last child of the Document
object.
Process the token using the rules for the "in body" insertion mode.
Stop parsing.
Process the token using the rules for the "in head" insertion mode.
Parse error. Ignore the token.
When the user agent is to apply the rules for parsing tokens in foreign content, the user agent must handle the token as follows:
Parse error. Insert a U+FFFD REPLACEMENT CHARACTER character.
Insert the token's character.
Insert the token's character.
Set the frameset-ok flag to "not ok".
Insert a comment.
Parse error. Ignore the token.
Parse error.
While the current node is not a MathML text integration point, an HTML integration point, or an element in the HTML namespace, pop elements from the stack of open elements.
Reprocess the token according to the rules given in the section corresponding to the current insertion mode in HTML content.
If the adjusted current node is an element in the MathML namespace, adjust MathML attributes for the token. (This fixes the case of MathML attributes that are not all lowercase.)
If the adjusted current node is an element in the SVG namespace, and the token's tag name is one of the ones in the first column of the following table, change the tag name to the name given in the corresponding cell in the second column. (This fixes the case of SVG elements that are not all lowercase.)
Tag name | Element name |
---|---|
altglyph | altGlyph
|
altglyphdef | altGlyphDef
|
altglyphitem | altGlyphItem
|
animatecolor | animateColor
|
animatemotion | animateMotion
|
animatetransform | animateTransform
|
clippath | clipPath
|
feblend | feBlend
|
fecolormatrix | feColorMatrix
|
fecomponenttransfer | feComponentTransfer
|
fecomposite | feComposite
|
feconvolvematrix | feConvolveMatrix
|
fediffuselighting | feDiffuseLighting
|
fedisplacementmap | feDisplacementMap
|
fedistantlight | feDistantLight
|
fedropshadow | feDropShadow
|
feflood | feFlood
|
fefunca | feFuncA
|
fefuncb | feFuncB
|
fefuncg | feFuncG
|
fefuncr | feFuncR
|
fegaussianblur | feGaussianBlur
|
feimage | feImage
|
femerge | feMerge
|
femergenode | feMergeNode
|
femorphology | feMorphology
|
feoffset | feOffset
|
fepointlight | fePointLight
|
fespecularlighting | feSpecularLighting
|
fespotlight | feSpotLight
|
fetile | feTile
|
feturbulence | feTurbulence
|
foreignobject | foreignObject
|
glyphref | glyphRef
|
lineargradient | linearGradient
|
radialgradient | radialGradient
|
textpath | textPath
|
If the adjusted current node is an element in the SVG namespace, adjust SVG attributes for the token. (This fixes the case of SVG attributes that are not all lowercase.)
Adjust foreign attributes for the token. (This fixes the use of namespaced attributes, in particular XLink in SVG.)
Insert a foreign element for the token, with adjusted current node's namespace and false.
If the token has its self-closing flag set, then run the appropriate steps from the following list:
Acknowledge the token's self-closing flag, and then act as described in the steps for a "script" end tag below.
Pop the current node off the stack of open elements and acknowledge the token's self-closing flag.
script
elementPop the current node off the stack of open elements.
Let the old insertion point have the same value as the current insertion point. Let the insertion point be just before the next input character.
Increment the parser's script nesting level by one. Set the parser pause flag to true.
If the active speculative HTML parser is null and the user agent supports SVG,
then Process the
SVG script
element according to the SVG rules. SVG
Even if this causes new characters to be inserted into the tokenizer, the parser will not be executed reentrantly, since the parser pause flag is true.
Decrement the parser's script nesting level by one. If the parser's script nesting level is zero, then set the parser pause flag to false.
Let the insertion point have the value of the old insertion point. (In other words, restore the insertion point to its previous value. This value might be the "undefined" value.)
Run these steps:
Initialize node to be the current node (the bottommost node of the stack).
If node's tag name, converted to ASCII lowercase, is not the same as the tag name of the token, then this is a parse error.
Loop: If node is the topmost element in the stack of open elements, then return. (fragment case)
If node's tag name, converted to ASCII lowercase, is the same as the tag name of the token, pop elements from the stack of open elements until node has been popped from the stack, and then return.
Set node to the previous entry in the stack of open elements.
If node is not an element in the HTML namespace, return to the step labeled loop.
Otherwise, process the token according to the rules given in the section corresponding to the current insertion mode in HTML content.
Once the user agent stops parsing the document, the user agent must run the following steps:
If the active speculative HTML parser is not null, then stop the speculative HTML parser and return.
Set the insertion point to undefined.
Update the current document readiness to "interactive
".
Pop all the nodes off the stack of open elements.
While the list of scripts that will execute when the document has finished parsing is not empty:
Spin the event loop until the first script
in the list
of scripts that will execute when the document has finished parsing has its ready
to be parser-executed set to true and the parser's Document
has no style sheet that is blocking scripts.
Execute the script element given by the first script
in
the list of scripts that will execute when the document has finished
parsing.
Remove the first script
element from the list of scripts that will
execute when the document has finished parsing (i.e. shift out the first entry in the
list).
Queue a global task on the DOM manipulation task source given the
Document
's relevant global object to run the following substeps:
Set the Document
's load timing info's DOM content loaded
event start time to the current high resolution time given the
Document
's relevant global object.
Fire an event named DOMContentLoaded
at the Document
object, with its bubbles
attribute initialized to
true.
Set the Document
's load timing info's DOM content loaded
event end time to the current high resolution time given the
Document
's relevant global object.
Enable the client message queue of the
ServiceWorkerContainer
object whose associated service worker client is the
Document
object's relevant settings object.
Invoke WebDriver BiDi DOM content loaded with the Document
's
browsing context, and a new WebDriver BiDi
navigation status whose id is the
Document
object's during-loading
navigation ID for WebDriver BiDi, status
is "pending
", and url is the Document
object's URL.
Spin the event loop until the set of scripts that will execute as soon as possible and the list of scripts that will execute in order as soon as possible are empty.
Spin the event loop until there is nothing that delays the load event in the Document
.
Queue a global task on the DOM manipulation task source given the
Document
's relevant global object to run the following steps:
Update the current document readiness to "complete
".
If the Document
object's browsing
context is null, then abort these steps.
Let window be the Document
's relevant global
object.
Set the Document
's load timing info's load event start
time to the current high resolution time given window.
Fire an event named load
at window, with legacy target override
flag set.
Invoke WebDriver BiDi load complete with the Document
's browsing context, and a new WebDriver BiDi
navigation status whose id is the
Document
object's during-loading
navigation ID for WebDriver BiDi, status
is "complete
", and url is the Document
object's URL.
Set the Document
object's during-loading navigation ID for WebDriver BiDi
to null.
Set the Document
's load timing info's load event end
time to the current high resolution time given window.
Assert: Document
's page showing is
false.
Set the Document
's page showing flag to true.
Fire a page transition event named pageshow
at window with false.
Completely finish loading the Document
.
Queue the navigation timing entry for the Document
.
If the Document
's print when loaded flag is set, then run the
printing steps.
The Document
is now ready for post-load tasks.
When the user agent is to abort a parser, it must run the following steps:
Throw away any pending content in the input stream, and discard any future content that would have been added to it.
Stop the speculative HTML parser for this HTML parser.
Update the current document readiness to "interactive
".
Pop all the nodes off the stack of open elements.
Update the current document readiness to "complete
".
User agents may implement an optimization, as described in this section, to speculatively fetch resources that are declared in the HTML markup while the HTML parser is waiting for a pending parsing-blocking script to be fetched and executed, or during normal parsing, at the time an element is created for a token. While this optimization is not defined in precise detail, there are some rules to consider for interoperability.
Each HTML parser can have an active speculative HTML parser. It is initially null.
The speculative HTML parser must act like the normal HTML parser (e.g., the tree builder rules apply), with some exceptions:
The state of the normal HTML parser and the document itself must not be affected.
For example, the next input character or the stack of open elements for the normal HTML parser is not affected by the speculative HTML parser.
Bytes pushed into the HTML parser's input byte stream must also be pushed into the speculative HTML parser's input byte stream. Bytes read from the streams must be independent.
The result of the speculative parsing is primarily a series of speculative fetches. Which kinds of resources to speculatively fetch is implementation-defined, but user agents must not speculatively fetch resources that would not be fetched with the normal HTML parser, under the assumption that the script that is blocking the HTML parser does nothing.
It is possible that the same markup is seen multiple times from the speculative HTML parser and then the normal HTML parser. It is expected that duplicated fetches will be prevented by caching rules, which are not yet fully specified.
A speculative fetch for a speculative mock element element must follow these rules:
Should some of these things be applied to the document "for real", even though they are found speculatively?
If the speculative HTML parser encounters one of the following elements, then act as if that element is processed for the purpose of its effect of subsequent speculative fetches.
base
element.meta
element whose http-equiv
attribute is in the Content
security policy state.meta
element whose name
attribute is an
ASCII case-insensitive match for "referrer
".meta
element whose name
attribute is an
ASCII case-insensitive match for "viewport
". (This can
affect whether a media query list matches the environment.) CSSDEVICEADAPTLet url be the URL that element would fetch if it was processed normally. If there is no such URL or if it is the empty string, then do nothing. Otherwise, if url is already in the list of speculative fetch URLs, then do nothing. Otherwise, fetch url as if the element was processed normally, and add url to the list of speculative fetch URLs.
Each Document
has a list of speculative fetch URLs, which is a
list of URLs, initially empty.
To start the speculative HTML parser for an instance of an HTML parser parser:
Optionally, return.
This step allows user agents to opt out of speculative HTML parsing.
If parser's active speculative HTML parser is not null, then stop the speculative HTML parser for parser.
This can happen when document.write()
writes another parser-blocking script. For simplicity, this specification always restarts
speculative parsing, but user agents can implement a more efficient strategy, so long as the end
result is equivalent.
Let speculativeParser be a new speculative HTML parser, with the same state as parser.
Let speculativeDoc be a new isomorphic representation of parser's
Document
, where all elements are instead speculative mock elements. Let speculativeParser parse into
speculativeDoc.
Set parser's active speculative HTML parser to speculativeParser.
In parallel, run speculativeParser until it is stopped or until it reaches the end of its input stream.
To stop the speculative HTML parser for an instance of an HTML parser parser:
Let speculativeParser be parser's active speculative HTML parser.
If speculativeParser is null, then return.
Throw away any pending content in speculativeParser's input stream, and discard any future content that would have been added to it.
Set parser's active speculative HTML parser to null.
The speculative HTML parser will create speculative mock elements instead of normal elements. DOM operations that the tree builder normally does on elements are expected to work appropriately on speculative mock elements.
A speculative mock element is a struct with the following items:
A string namespace, corresponding to an element's namespace.
A string local name, corresponding to an element's local name.
A list attribute list, corresponding to an element's attribute list.
A list children, corresponding to an element's children.
To create a speculative mock element given a namespace, tagName, and attributes:
Let element be a new speculative mock element.
Set element's namespace to namespace.
Set element's local name to tagName.
Set element's attribute list to attributes.
Set element's children to a new empty list.
Optionally, perform a speculative fetch for element.
Return element.
When the tree builder says to insert an element into a template
element's
template contents, if that is a speculative mock element, and the
template
element's template contents is not a
ShadowRoot
node, instead do nothing. URLs found speculatively inside
non-declarative-shadow-root template
elements might themselves be templates, and must
not be speculatively fetched.
When an application uses an HTML parser in conjunction with an XML pipeline, it is
possible that the constructed DOM is not compatible with the XML tool chain in certain subtle
ways. For example, an XML toolchain might not be able to represent attributes with the name xmlns
, since they conflict with the Namespaces in XML syntax. There is also some
data that the HTML parser generates that isn't included in the DOM itself. This
section specifies some rules for handling these issues.
If the XML API being used doesn't support DOCTYPEs, the tool may drop DOCTYPEs altogether.
If the XML API doesn't support attributes in no namespace that are named "xmlns
", attributes whose names start with "xmlns:
", or
attributes in the XMLNS namespace, then the tool may drop such attributes.
The tool may annotate the output with any namespace declarations required for proper operation.
If the XML API being used restricts the allowable characters in the local names of elements and attributes, then the tool may map all element and attribute local names that the API wouldn't support to a set of names that are allowed, by replacing any character that isn't supported with the uppercase letter U and the six digits of the character's code point when expressed in hexadecimal, using digits 0-9 and capital letters A-F as the symbols, in increasing numeric order.
For example, the element name foo<bar
, which can be
output by the HTML parser, though it is neither a legal HTML element name nor a
well-formed XML element name, would be converted into fooU00003Cbar
, which
is a well-formed XML element name (though it's still not legal in HTML by any means).
As another example, consider the attribute xlink:href
.
Used on a MathML element, it becomes, after being adjusted, an attribute with a prefix "xlink
" and a local
name "href
". However, used on an HTML element, it becomes an attribute with
no prefix and the local name "xlink:href
", which is not a valid NCName, and
thus might not be accepted by an XML API. It could thus get converted, becoming "xlinkU00003Ahref
".
The resulting names from this conversion conveniently can't clash with any attribute generated by the HTML parser, since those are all either lowercase or those listed in the adjust foreign attributes algorithm's table.
If the XML API restricts comments from having two consecutive U+002D HYPHEN-MINUS characters (--), the tool may insert a single U+0020 SPACE character between any such offending characters.
If the XML API restricts comments from ending in a U+002D HYPHEN-MINUS character (-), the tool may insert a single U+0020 SPACE character at the end of such comments.
If the XML API restricts allowed characters in character data, attribute values, or comments, the tool may replace any U+000C FORM FEED (FF) character with a U+0020 SPACE character, and any other literal non-XML character with a U+FFFD REPLACEMENT CHARACTER.
If the tool has no way to convey out-of-band information, then the tool may drop the following information:
form
element ancestor (use of the form
element pointer in the parser)template
elements.The mutations allowed by this section apply after the HTML
parser's rules have been applied. For example, a <a::>
start tag
will be closed by a </a::>
end tag, and never by a </aU00003AU00003A>
end tag, even if the user agent is using the rules above to
then generate an actual element in the DOM with the name aU00003AU00003A
for
that start tag.
This section examines some erroneous markup and discusses how the HTML parser handles these cases.
The most-often discussed example of erroneous markup is as follows:
<p>1<b>2<i>3</b>4</i>5</p>
The parsing of this markup is straightforward up to the "3". At this point, the DOM looks like this:
html
head
body
p
#text
: 1b
#text
: 2i
#text
: 3Here, the stack of open elements has five elements on it: html
,
body
, p
, b
, and i
. The list of active
formatting elements just has two: b
and i
. The insertion
mode is "in body".
Upon receiving the end tag token with the tag name "b", the "adoption
agency algorithm" is invoked. This is a simple case, in that the formattingElement
is the b
element, and there is no furthest block.
Thus, the stack of open elements ends up with just three elements: html
,
body
, and p
, while the list of active formatting elements
has just one: i
. The DOM tree is unmodified at this point.
The next token is a character ("4"), triggers the reconstruction of the active formatting elements, in this case just
the i
element. A new i
element is thus created for the "4"
Text
node. After the end tag token for the "i" is also received, and the "5"
Text
node is inserted, the DOM looks as follows:
html
head
body
p
#text
: 1b
#text
: 2i
#text
: 3i
#text
: 4#text
: 5A case similar to the previous one is the following:
<b>1<p>2</b>3</p>
Up to the "2" the parsing here is straightforward:
html
head
body
b
#text
: 1p
#text
: 2The interesting part is when the end tag token with the tag name "b" is parsed.
Before that token is seen, the stack of open elements has four elements on it:
html
, body
, b
, and p
. The list of active
formatting elements just has the one: b
. The insertion mode is
"in body".
Upon receiving the end tag token with the tag name "b", the "adoption
agency algorithm" is invoked, as in the previous example. However, in this case, there
is a furthest block, namely the p
element. Thus, this
time the adoption agency algorithm isn't skipped over.
The common ancestor is the body
element. A conceptual
"bookmark" marks the position of the b
in the list of active formatting
elements, but since that list has only one element in it, the bookmark won't have much
effect.
As the algorithm progresses, node ends up set to the formatting element
(b
), and last node ends up set to the furthest
block (p
).
The last node gets appended (moved) to the common ancestor, so that the DOM looks like:
html
head
body
b
#text
: 1p
#text
: 2A new b
element is created, and the children of the p
element are
moved to it:
html
head
body
b
#text
: 1p
b
#text
: 2Finally, the new b
element is appended to the p
element, so that the
DOM looks like:
html
head
body
b
#text
: 1p
b
#text
: 2The b
element is removed from the list of active formatting elements
and the stack of open elements, so that when the "3" is parsed, it is appended to the
p
element:
html
head
body
b
#text
: 1p
b
#text
: 2#text
: 3Error handling in tables is, for historical reasons, especially strange. For example, consider the following markup:
<table><b><tr><td>aaa</td></tr>bbb</table>ccc
The highlighted b
element start tag is not allowed directly inside a table like
that, and the parser handles this case by placing the element before the table. (This is
called foster parenting.) This can be seen by examining the DOM tree
as it stands just after the table
element's start tag has been seen:
html
head
body
table
...and then immediately after the b
element start tag has been seen:
html
head
body
b
table
At this point, the stack of open elements has on it the elements
html
, body
, table
, and b
(in that order,
despite the resulting DOM tree); the list of active formatting elements just has the
b
element in it; and the insertion mode is "in table".
The tr
start tag causes the b
element to be popped off the stack and
a tbody
start tag to be implied; the tbody
and tr
elements
are then handled in a rather straight-forward manner, taking the parser through the "in table body" and "in row" insertion modes, after which the DOM looks as follows:
html
head
body
b
table
tbody
tr
Here, the stack of open elements has on it the elements html
,
body
, table
, tbody
, and tr
; the list of
active formatting elements still has the b
element in it; and the
insertion mode is "in row".
The td
element start tag token, after putting a td
element on the
tree, puts a marker on the list of active
formatting elements (it also switches to the "in
cell" insertion mode).
html
head
body
b
table
tbody
tr
td
The marker means that when the "aaa" character
tokens are seen, no b
element is created to hold the resulting Text
node:
html
head
body
b
table
tbody
tr
td
#text
: aaaThe end tags are handled in a straight-forward manner; after handling them, the stack of
open elements has on it the elements html
, body
,
table
, and tbody
; the list of active formatting elements
still has the b
element in it (the marker
having been removed by the "td" end tag token); and the insertion mode is "in table body".
Thus it is that the "bbb" character tokens are found. These trigger the "in table text" insertion mode to be used (with the original
insertion mode set to "in table body").
The character tokens are collected, and when the next token (the table
element end
tag) is seen, they are processed as a group. Since they are not all spaces, they are handled as
per the "anything else" rules in the "in table"
insertion mode, which defer to the "in body"
insertion mode but with foster parenting.
When the active formatting elements
are reconstructed, a b
element is created and foster parented, and then the "bbb" Text
node is appended to it:
html
head
body
b
b
#text
: bbbtable
tbody
tr
td
#text
: aaaThe stack of open elements has on it the elements html
,
body
, table
, tbody
, and the new b
(again, note
that this doesn't match the resulting tree!); the list of active formatting elements
has the new b
element in it; and the insertion mode is still "in table body".
Had the character tokens been only ASCII whitespace instead of "bbb", then that
ASCII whitespace would just be appended to the tbody
element.
Finally, the table
is closed by a "table" end tag. This pops all the nodes from
the stack of open elements up to and including the table
element, but it
doesn't affect the list of active formatting elements, so the "ccc" character tokens
after the table result in yet another b
element being created, this time after the
table:
html
head
body
b
b
#text
: bbbtable
tbody
tr
td
#text
: aaab
#text
: cccConsider the following markup, which for this example we will assume is the document with
URL https://example.com/inner
, being rendered as the content of
an iframe
in another document with the URL https://example.com/outer
:
<div id=a>
<script>
var div = document.getElementById('a');
parent.document.body.appendChild(div);
</script>
<script>
alert(document.URL);
</script>
</div>
<script>
alert(document.URL);
</script>
Up to the first "script" end tag, before the script is parsed, the result is relatively straightforward:
html
head
body
div
id
="a
"#text
:
script
#text
: var div = document.getElementById('a'); ⏎ parent.document.body.appendChild(div);After the script is parsed, though, the div
element and its child
script
element are gone:
html
head
body
They are, at this point, in the Document
of the aforementioned outer
browsing context. However, the stack of open elements still contains
the div
element.
Thus, when the second script
element is parsed, it is inserted into the outer
Document
object.
Those parsed into different Document
s than the one the parser was created for do
not execute, so the first alert does not show.
Once the div
element's end tag is parsed, the div
element is popped
off the stack, and so the next script
element is in the inner
Document
:
html
head
body
script
#text
: alert(document.URL);This script does execute, resulting in an alert that says "https://example.com/inner".
Elaborating on the example in the previous section, consider the case where the second
script
element is an external script (i.e. one with a src
attribute). Since the element was not in the parser's
Document
when it was created, that external script is not even downloaded.
In a case where a script
element with a src
attribute is parsed normally into its parser's Document
, but while the external
script is being downloaded, the element is moved to another document, the script continues to
download, but does not execute.
In general, moving script
elements between Document
s is
considered a bad practice.
The following markup shows how nested formatting elements (such as b
) get
collected and continue to be applied even as the elements they are contained in are closed, but
that excessive duplicates are thrown away.
<!DOCTYPE html>
<p><b class=x><b class=x><b><b class=x><b class=x><b>X
<p>X
<p><b><b class=x><b>X
<p></b></b></b></b></b></b>X
The resulting DOM tree is as follows:
html
html
head
body
p
b
class
="x
"b
class
="x
"b
b
class
="x
"b
class
="x
"b
#text
: X⏎p
b
class
="x
"b
b
class
="x
"b
class
="x
"b
#text
: X⏎p
b
class
="x
"b
b
class
="x
"b
class
="x
"b
b
b
class
="x
"b
#text
: X⏎p
#text
: X⏎Note how the second p
element in the markup has no explicit b
elements, but in the resulting DOM, up to three of each kind of formatting element (in this case
three b
elements with the class attribute, and two unadorned b
elements)
get reconstructed before the element's "X".
Also note how this means that in the final paragraph only six b
end tags are
needed to completely clear the list of active formatting elements, even though nine
b
start tags have been seen up to this point.
For the purposes of the following algorithm, an element serializes as void if its
element type is one of the void elements, or is basefont
,
bgsound
, frame
, keygen
, or param
.
The following steps form the HTML fragment serialization algorithm. The algorithm takes as input a DOM
Element
, Document
, or DocumentFragment
referred to as
the node, a boolean serializableShadowRoots, and a
sequence<ShadowRoot>
shadowRoots, and returns a string.
This algorithm serializes the children of the node being serialized, not the node itself.
If the node serializes as void, then return the empty string.
Let s be a string, and initialize it to the empty string.
If the node is a template
element, then let the node instead be the template
element's template
contents (a DocumentFragment
node).
If current node is a shadow host, then:
Let shadow be current node's shadow root.
If one of the following is true:
serializableShadowRoots is true and shadow's serializable is true; or
shadowRoots contains shadow,
then:
Append "<template shadowrootmode="
".
If shadow's mode
is "open
", then append "open
".
Otherwise, append "closed
".
Append ""
".
If shadow's delegates focus is set, then append
" shadowrootdelegatesfocus=""
".
If shadow's serializable is set, then append
" shadowrootserializable=""
".
If shadow's clonable is set, then append
" shadowrootclonable=""
".
Append ">
".
Append the value of running the HTML fragment serialization algorithm with shadow, serializableShadowRoots, and shadowRoots (thus recursing into this algorithm for that element).
Append "</template>
".
For each child node of the node, in tree order, run the following steps:
Let current node be the child node being processed.
Append the appropriate string from the following list to s:
Element
If current node is an element in the HTML namespace, the MathML namespace, or the SVG namespace, then let tagname be current node's local name. Otherwise, let tagname be current node's qualified name.
Append a U+003C LESS-THAN SIGN character (<), followed by tagname.
For HTML elements created by the HTML parser or
createElement()
, tagname will be
lowercase.
If current node's is
value is not null, and the element does not have an is
attribute in its attribute list, then append the string " is="
", followed by current node's is
value escaped as described below in attribute mode,
followed by a U+0022 QUOTATION MARK character (").
For each attribute that the element has, append a U+0020 SPACE character, the attribute's serialized name as described below, a U+003D EQUALS SIGN character (=), a U+0022 QUOTATION MARK character ("), the attribute's value, escaped as described below in attribute mode, and a second U+0022 QUOTATION MARK character (").
An attribute's serialized name for the purposes of the previous paragraph must be determined as follows:
The attribute's serialized name is the attribute's local name.
For attributes on HTML elements set by the HTML
parser or by setAttribute()
, the
local name will be lowercase.
The attribute's serialized name is the string "xml:
" followed
by the attribute's local name.
xmlns
The attribute's serialized name is the string "xmlns
".
xmlns
The attribute's serialized name is the string "xmlns:
"
followed by the attribute's local name.
The attribute's serialized name is the string "xlink:
"
followed by the attribute's local name.
The attribute's serialized name is the attribute's qualified name.
While the exact order of attributes is implementation-defined, and may depend on factors such as the order that the attributes were given in the original markup, the sort order must be stable, such that consecutive invocations of this algorithm serialize an element's attributes in the same order.
Append a U+003E GREATER-THAN SIGN character (>).
If current node serializes as void, then continue on to the next child node at this point.
Append the value of running the HTML fragment serialization algorithm with current node, serializableShadowRoots, and shadowRoots (thus recursing into this algorithm for that node), followed by a U+003C LESS-THAN SIGN character (<), a U+002F SOLIDUS character (/), tagname again, and finally a U+003E GREATER-THAN SIGN character (>).
Text
nodeIf the parent of current node is a style
,
script
, xmp
, iframe
, noembed
,
noframes
, or plaintext
element, or if the parent of current node is a noscript
element and scripting is enabled for the node, then append the value of
current node's data literally.
Otherwise, append the value of current node's data, escaped as described below.
Comment
Append "<!--
" (U+003C LESS-THAN SIGN, U+0021
EXCLAMATION MARK, U+002D HYPHEN-MINUS, U+002D HYPHEN-MINUS), followed by the value of
current node's data, followed by the
literal string "-->
" (U+002D HYPHEN-MINUS, U+002D HYPHEN-MINUS,
U+003E GREATER-THAN SIGN).
ProcessingInstruction
Append "<?
" (U+003C LESS-THAN SIGN, U+003F
QUESTION MARK), followed by the value of current node's target
IDL attribute, followed by a single U+0020 SPACE character, followed
by the value of current node's data,
followed by a single U+003E GREATER-THAN SIGN character (>).
DocumentType
Append "<!DOCTYPE
" (U+003C LESS-THAN SIGN, U+0021
EXCLAMATION MARK, U+0044 LATIN CAPITAL LETTER D, U+004F LATIN CAPITAL LETTER O, U+0043 LATIN
CAPITAL LETTER C, U+0054 LATIN CAPITAL LETTER T, U+0059 LATIN CAPITAL LETTER Y, U+0050 LATIN
CAPITAL LETTER P, U+0045 LATIN CAPITAL LETTER E), followed by a space (U+0020 SPACE),
followed by the value of current node's name, followed by ">
"
(U+003E GREATER-THAN SIGN).
Return s.
It is possible that the output of this algorithm, if parsed with an HTML parser, will not return the original tree structure. Tree structures that do not roundtrip a serialize and reparse step can also be produced by the HTML parser itself, although such cases are typically non-conforming.
For instance, if a textarea
element to which a Comment
node has been appended is serialized and the output is then reparsed, the comment will end up
being displayed in the text control. Similarly, if, as a result of DOM manipulation, an element
contains a comment that contains "-->
", then when
the result of serializing the element is parsed, the comment will be truncated at that point and
the rest of the comment will be interpreted as markup. More examples would be making a
script
element contain a Text
node with the text string "</script>
", or having a p
element that contains a
ul
element (as the ul
element's start
tag would imply the end tag for the p
).
This can enable cross-site scripting attacks. An example of this would be a page that lets the
user enter some font family names that are then inserted into a CSS style
block via
the DOM and which then uses the innerHTML
IDL attribute to get
the HTML serialization of that style
element: if the user enters
"</style><script>attack</script>
" as a font family name, innerHTML
will return markup that, if parsed in a different context,
would contain a script
node, even though no script
node existed in the
original DOM.
For example, consider the following markup:
<form id="outer"><div></form><form id="inner"><input>
This will be parsed into:
html
head
body
form
id
="outer
"div
form
id
="inner
"input
The input
element will be associated with the inner form
element.
Now, if this tree structure is serialized and reparsed, the <form
id="inner">
start tag will be ignored, and so the input
element will be
associated with the outer form
element instead.
<html><head></head><body><form id="outer"><div><form id="inner"><input></form></div></form></body></html>
html
head
body
form
id
="outer
"div
input
As another example, consider the following markup:
<a><table><a>
This will be parsed into:
html
head
body
a
a
table
That is, the a
elements are nested, because the second a
element is
foster parented. After a serialize-reparse roundtrip, the
a
elements and the table
element would all be siblings, because the
second <a>
start tag implicitly closes the first a
element.
<html><head></head><body><a><a></a><table></table></a></body></html>
html
head
body
a
a
table
For historical reasons, this algorithm does not round-trip an initial U+000A LINE FEED (LF)
character in pre
, textarea
, or listing
elements, even
though (in the first two cases) the markup being round-tripped can be conforming. The HTML
parser will drop such a character during parsing, but this algorithm does not
serialize an extra U+000A LINE FEED (LF) character.
For example, consider the following markup:
<pre>
Hello.</pre>
When this document is first parsed, the pre
element's child text
content starts with a single newline character. After a serialize-reparse roundtrip, the
pre
element's child text content is simply "Hello.
".
Because of the special role of the is
attribute in signaling the creation of customized built-in elements, in that it provides a mechanism for parsed
HTML to set the element's is
value, we special-case its handling during serialization. This ensures that an element's
is
value is preserved
through serialize-parse roundtrips.
When creating a customized built-in element via the parser, a developer uses the is
attribute directly; in such cases serialize-parse roundtrips work fine.
<script>
window.SuperP = class extends HTMLParagraphElement {};
customElements.define("super-p", SuperP, { extends: "p" });
</script>
<div id="container"><p is="super-p">Superb!</p></div>
<script>
console.log(container.innerHTML); // <p is="super-p">
container.innerHTML = container.innerHTML;
console.log(container.innerHTML); // <p is="super-p">
console.assert(container.firstChild instanceof SuperP);
</script>
But when creating a customized built-in element via its constructor or via createElement()
, the is
attribute is not added. Instead, the is
value (which is what the custom elements machinery uses) is set
without intermediating through an attribute.
<script>
container.innerHTML = "";
const p = document.createElement("p", { is: "super-p" });
container.appendChild(p);
// The is attribute is not present in the DOM:
console.assert(!p.hasAttribute("is"));
// But the element is still a super-p:
console.assert(p instanceof SuperP);
</script>
To ensure that serialize-parse roundtrips still work, the serialization process explicitly
writes out the element's is
value as an is
attribute:
<script>
console.log(container.innerHTML); // <p is="super-p">
container.innerHTML = container.innerHTML;
console.log(container.innerHTML); // <p is="super-p">
console.assert(container.firstChild instanceof SuperP);
</script>
Escaping a string (for the purposes of the algorithm above) consists of running the following steps:
Replace any occurrence of the "&
" character by the string "&
".
Replace any occurrences of the U+00A0 NO-BREAK SPACE character by the string "
".
If the algorithm was invoked in the attribute mode, replace any occurrences of the
""
" character by the string ""
".
If the algorithm was not invoked in the attribute mode, replace any
occurrences of the "<
" character by the string "<
", and any occurrences of the ">
" character by
the string ">
".
The following steps form the HTML fragment parsing algorithm. The algorithm
takes as input an Element
node, referred to as the context element, which gives the context for
the parser, input, a string to parse, and an optional boolean
allowDeclarativeShadowRoots (default false). It returns a list of zero or more
nodes.
Parts marked fragment case in algorithms in the parser section are parts that only occur if the parser was created for the purposes of this algorithm. The algorithms have been annotated with such markings for informational purposes only; such markings have no normative weight. If it is possible for a condition described as a fragment case to occur even when the parser wasn't created for the purposes of handling this algorithm, then that is an error in the specification.
Create a new Document
node, and mark it as being an HTML document.
If the
node document of the context element is in
quirks mode, then let the Document
be in quirks mode.
Otherwise, if the
node document of the context element is in
limited-quirks mode, then let the Document
be in limited-quirks
mode. Otherwise, leave the Document
in no-quirks mode.
If allowDeclarativeShadowRoots is true, then set the Document
's
allow declarative shadow
roots to true.
Create a new HTML parser, and associate it with the just created
Document
node.
Set the state of the HTML parser's tokenization stage as follows, switching on the context element:
title
textarea
style
xmp
iframe
noembed
noframes
script
noscript
plaintext
For performance reasons, an implementation that does not report errors and that uses the actual state machine described in this specification directly could use the PLAINTEXT state instead of the RAWTEXT and script data states where those are mentioned in the list above. Except for rules regarding parse errors, they are equivalent, since there is no appropriate end tag token in the fragment case, yet they involve far fewer state transitions.
Let root be a new html
element with no attributes.
Append the element root to the Document
node created
above.
Set up the parser's stack of open elements so that it contains just the single element root.
If the context element is a
template
element, push "in
template" onto the stack of template insertion modes so that it is the new
current template insertion mode.
Create a start tag token whose name is the local name of context and whose attributes are the attributes of context.
Let this start tag token be the start tag token of the context node, e.g. for the purposes of determining if it is an HTML integration point.
Reset the parser's insertion mode appropriately.
The parser will reference the context element as part of that algorithm.
Set the parser's form
element pointer to the nearest node to the
context element that is a form
element (going straight up the ancestor chain, and including the element itself, if it is a
form
element), if any. (If there is no such form
element, the
form
element pointer keeps its initial value, null.)
Place the input into the input stream for the HTML parser just created. The encoding confidence is irrelevant.
Start the parser and let it run until it has consumed all the characters just inserted into the input stream.
Return the child nodes of root, in tree order.
This table lists the character reference names that are supported by HTML, and the code points to which they refer. It is referenced by the previous sections.
It is intentional, for legacy compatibility, that many code points have multiple character reference names. For example, some appear both with and without the trailing semicolon, or with different capitalizations.
Name | Character(s) | Glyph |
---|
This data is also available as a JSON file.
The glyphs displayed above are non-normative. Refer to Unicode for formal definitions of the characters listed above.
The character reference names originate from XML Entity Definitions for Characters, though only the above is considered normative. XMLENTITY
This list is static and will not be expanded or changed in the future.
This section only describes the rules for XML resources. Rules for
text/html
resources are discussed in the section above entitled "The HTML
syntax".
Using the XML syntax is not recommended, for
reasons which include the fact that there is no specification which defines the rules for how an
XML parser must map a string of bytes or characters into a Document
object, as well
as the fact that the XML syntax is essentially unmaintained — in that, it’s not expected that any
further features will ever be added to the XML syntax (even when such features have been added to
the HTML syntax).
The XML syntax for HTML was formerly referred to as "XHTML", but this specification does not use that term (among other reasons, because no such term is used for the HTML syntaxes of MathML and SVG).
The syntax for XML is defined in XML and Namespaces in XML. XML XMLNS
This specification does not define any syntax-level requirements beyond those defined for XML proper.
XML documents may contain a DOCTYPE
if desired, but this is not required
to conform to this specification. This specification does not define a public or system
identifier, nor provide a formal DTD.
According to XML, XML processors are not guaranteed to process
the external DTD subset referenced in the DOCTYPE. This means, for example, that using entity references for characters in XML documents
is unsafe if they are defined in an external file (except for <
,
>
, &
,
"
, and '
).
This section describes the relationship between XML and the DOM, with a particular emphasis on how this interacts with HTML.
An XML parser, for the purposes of this specification, is a construct that
follows the rules given in XML to map a string of bytes or characters into a
Document
object.
At the time of writing, no such rules actually exist.
An XML parser is either associated with a Document
object when it is
created, or creates one implicitly.
This Document
must then be populated with DOM nodes that represent the tree
structure of the input passed to the parser, as defined by XML, Namespaces
in XML, and DOM. When creating DOM nodes representing elements,
the create an element for a token algorithm
or some equivalent that operates on appropriate XML data structures must be used, to ensure the
proper element interfaces are created and that custom elements are set up correctly.
For the operations that the XML parser performs on the Document
's
tree, the user agent must act as if elements and attributes were individually appended and set
respectively so as to trigger rules in this specification regarding what happens when an element
is inserted into a document or has its attributes set, and DOM's requirements
regarding mutation observers mean that mutation observers are fired.
XML XMLNS DOM UIEVENTS
Between the time an element's start tag is parsed and the time either the element's end tag is parsed or the parser detects a well-formedness error, the user agent must act as if the element was in a stack of open elements.
This is used by various elements to only start certain processes once they are popped off of the stack of open elements.
This specification provides the following additional information that user agents should use when retrieving an external entity: the public identifiers given in the following list all correspond to the URL given by this link. (This URL is a DTD containing the entity declarations for the names listed in the named character references section.) XML
-//W3C//DTD XHTML 1.0 Transitional//EN
-//W3C//DTD XHTML 1.1//EN
-//W3C//DTD XHTML 1.0 Strict//EN
-//W3C//DTD XHTML 1.0 Frameset//EN
-//W3C//DTD XHTML Basic 1.0//EN
-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN
-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN
-//W3C//DTD MathML 2.0//EN
-//WAPFORUM//DTD XHTML Mobile 1.0//EN
Furthermore, user agents should attempt to retrieve the above external entity's content when one of the above public identifiers is used, and should not attempt to retrieve any other external entity's content.
This is not strictly a violation of XML, but it does contradict the spirit of XML's requirements. This is motivated by a desire for user agents to all handle entities in an interoperable fashion without requiring any network access for handling external subsets. XML
XML parsers can be invoked with XML scripting support enabled or XML scripting support disabled. Except where otherwise specified, XML parsers are invoked with XML scripting support enabled.
When an XML parser with XML scripting support
enabled creates a script
element, it must have its parser
document set and its force async set to false. If
the parser was created as part of the XML fragment parsing algorithm, then the
element's already started must be set to true. When the element's end tag is
subsequently parsed, the user agent must perform a microtask checkpoint, and then
prepare the script
element. If this
causes there to be a pending parsing-blocking script, then the user agent must run
the following steps:
Block this instance of the XML parser, such that the event loop will not run tasks that invoke it.
Spin the event loop until the parser's Document
has no
style sheet that is blocking scripts and the pending parsing-blocking
script's ready to be parser-executed is true.
Unblock this instance of the XML parser, such that tasks that invoke it can again be run.
Execute the script element given by the pending parsing-blocking script.
Set the pending parsing-blocking script to null.
Since the document.write()
API is not
available for XML documents, much of the complexity in the HTML parser
is not needed in the XML parser.
When the XML parser has XML scripting support disabled, none of this happens.
When an XML parser would append a node to a
template
element, it must instead append it to the template
element's
template contents (a DocumentFragment
node).
This is a willful violation of XML; unfortunately,
XML is not formally extensible in the manner that is needed for template
processing.
XML
When an XML parser creates a Node
object, its node document
must be set to the node document of
the node into which the newly created node is to be inserted.
Certain algorithms in this specification spoon-feed the parser characters one string at a time. In such cases, the XML parser must act as it would have if faced with a single string consisting of the concatenation of all those characters.
When an XML parser reaches the end of its input, it must stop parsing, following the same rules as the HTML parser. An XML parser can also be aborted, which must again be done in the same way as for an HTML parser.
For the purposes of conformance checkers, if a resource is determined to be in the XML syntax, then it is an XML document.
The XML fragment serialization
algorithm for a Document
or Element
node either returns a fragment
of XML that represents that node or throws an exception.
For Document
s, the algorithm must return a string in the form of a document entity, if none of the error cases
below apply.
For Element
s, the algorithm must return a string in the form of an internal general parsed entity, if none of the
error cases below apply.
In both cases, the string returned must be XML namespace-well-formed and must be an isomorphic
serialization of all of that node's relevant child nodes, in tree order.
User agents may adjust prefixes and namespace declarations in the serialization (and indeed might
be forced to do so in some cases to obtain namespace-well-formed XML). User agents may use a
combination of regular text and character references to represent Text
nodes in the
DOM.
A node's relevant child nodes are those that apply given the following rules:
template
elementstemplate
element's template contents, if any.For Element
s, if any of the elements in the serialization are in no namespace, the
default namespace in scope for those elements must be explicitly declared as the empty string. (This doesn't apply in the Document
case.) XML
XMLNS
For the purposes of this section, an internal general parsed entity is considered XML namespace-well-formed if a document consisting of an element with no namespace declarations whose contents are the internal general parsed entity would itself be XML namespace-well-formed.
If any of the following error cases are found in the DOM subtree being serialized, then the
algorithm must throw an "InvalidStateError
" DOMException
instead of returning a string:
Document
node with no child element nodes.DocumentType
node that has an external subset public identifier that contains
characters that are not matched by the XML PubidChar
production. XMLDocumentType
node that has an external subset system identifier that contains
both a U+0022 QUOTATION MARK (") and a U+0027 APOSTROPHE (') or that contains characters that are
not matched by the XML Char
production. XMLName
production. XMLAttr
node with no namespace whose local name is the lowercase string "xmlns
". XMLNSElement
node with two or more attributes with the same local name and
namespace.Attr
node, Text
node, Comment
node, or
ProcessingInstruction
node whose data contains characters that are not matched by
the XML Char
production. XMLComment
node whose data contains two adjacent U+002D HYPHEN-MINUS characters
(-) or ends with such a character.ProcessingInstruction
node whose target name is an ASCII
case-insensitive match for the string "xml
".ProcessingInstruction
node whose target name contains a U+003A COLON (:).ProcessingInstruction
node whose data contains the string "?>
".These are the only ways to make a DOM unserialisable. The DOM enforces all the
other XML constraints; for example, trying to append two elements to a Document
node
will throw a "HierarchyRequestError
" DOMException
.
The XML fragment parsing algorithm either returns a Document
or throws
a "SyntaxError
" DOMException
. Given a string
input and a context element context, the
algorithm is as follows:
Create a new XML parser.
Feed the parser just created the string corresponding to the start tag of the context element, declaring all the namespace prefixes that are in scope on that element in the DOM, as well as declaring the default namespace (if any) that is in scope on that element in the DOM.
A namespace prefix is in scope if the DOM lookupNamespaceURI()
method
on the element would return a non-null value for that prefix.
The default namespace is the namespace for which the DOM isDefaultNamespace()
method on the element would return true.
No
DOCTYPE
is passed to the parser, and therefore no external subset is
referenced, and therefore no entities will be recognized.
Feed the parser just created the string input.
Feed the parser just created the string corresponding to the end tag of the context element.
If there is an XML well-formedness or XML namespace well-formedness error, then throw a
"SyntaxError
" DOMException
.
If the document element of the resulting Document
has any sibling
nodes, then throw a "SyntaxError
" DOMException
.
Return the child nodes of the document element of the resulting
Document
, in tree order.
User agents are not required to present HTML documents in any particular way. However, this section provides a set of suggestions for rendering HTML documents that, if followed, are likely to lead to a user experience that closely resembles the experience intended by the documents' authors. So as to avoid confusion regarding the normativity of this section, "must" has not been used. Instead, the term "expected" is used to indicate behavior that will lead to this experience. For the purposes of conformance for user agents designated as supporting the suggested default rendering, the term "expected" in this section has the same conformance implications as "must".
The suggestions in this section are generally expressed in CSS terms. User agents are expected to either support CSS, or translate from the CSS rules given in this section to approximations for other presentation mechanisms.
In the absence of style-layer rules to the contrary (e.g. author style sheets), user agents are expected to render an element so that it conveys to the user the meaning that the element represents, as described by this specification.
The suggestions in this section generally assume a visual output medium with a resolution of 96dpi or greater, but HTML is intended to apply to multiple media (it is a media-independent language). User agent implementers are encouraged to adapt the suggestions in this section to their target media.
An element is being rendered if it has any associated CSS layout boxes, SVG layout boxes, or some equivalent in other styling languages.
Just being off-screen does not mean the element is not being
rendered. The presence of the hidden
attribute normally
means the element is not being rendered, though this might be overridden by the style
sheets.
The fully active state does not affect whether an element is being rendered or not. Even if a document is not fully active and not shown at all to the user, elements within it can still qualify as "being rendered".
An element is said to intersect the viewport when it is being rendered and its associated CSS layout box intersects the viewport.
Similar to the being rendered state, elements in non-fully active documents can still intersect the viewport. The viewport is not shared between documents and might not always be shown to the user, so an element in a non-fully active document can still intersect the viewport associated with its document.
This specification does not define the precise timing for when the intersection is tested, but it is suggested that the timing match that of the Intersection Observer API. INTERSECTIONOBSERVER
An element is delegating its rendering to its children if it is not being rendered but its children (if any) could be rendered, as a result of CSS 'display: contents', or some equivalent in other styling languages. CSSDISPLAY
User agents that do not honor author-level CSS style sheets are nonetheless expected to act as if they applied the CSS rules given in these sections in a manner consistent with this specification and the relevant CSS and Unicode specifications. CSS UNICODE BIDI
This is especially important for issues relating to the 'display', 'unicode-bidi', and 'direction' properties.
The CSS rules given in these subsections are, except where otherwise specified, expected to be used as part of the user-agent level style sheet defaults for all documents that contain HTML elements.
Some rules are intended for the author-level zero-specificity presentational hints part of the CSS cascade; these are explicitly called out as presentational hints.
When the text below says that an attribute attribute on an element element maps to the pixel length property (or properties) properties, it means that if element has an attribute attribute set, and parsing that attribute's value using the rules for parsing non-negative integers doesn't generate an error, then the user agent is expected to use the parsed value as a pixel length for a presentational hint for properties.
When the text below says that an attribute attribute on an element element maps to the dimension property (or properties) properties, it means that if element has an attribute attribute set, and parsing that attribute's value using the rules for parsing dimension values doesn't generate an error, then the user agent is expected to use the parsed dimension as the value for a presentational hint for properties, with the value given as a pixel length if the dimension was a length, and with the value given as a percentage if the dimension was a percentage.
When the text below says that an attribute attribute on an element element maps to the dimension property (ignoring zero) (or properties) properties, it means that if element has an attribute attribute set, and parsing that attribute's value using the rules for parsing nonzero dimension values doesn't generate an error, then the user agent is expected to use the parsed dimension as the value for a presentational hint for properties, with the value given as a pixel length if the dimension was a length, and with the value given as a percentage if the dimension was a percentage.
When the text below says that a pair of attributes w and h on an
element element map to the aspect-ratio property, it means that if
element has both attributes w and h, and parsing those
attributes' values using the rules for parsing non-negative integers doesn't
generate an error for either, then the user agent is expected to use the parsed integers as a
presentational hint for the 'aspect-ratio'
property of the form auto w / h
.
When the text below says that a pair of attributes w and h on an
element element map to the aspect-ratio property (using dimension rules), it
means that if element has both attributes w and h, and parsing
those attributes' values using the rules for parsing dimension values doesn't
generate an error or return a percentage for either, then the user agent is expected to use the
parsed dimensions as a presentational hint for the
'aspect-ratio' property of the form auto
w / h
.
When a user agent is to align descendants of a node, the user agent is expected to
align only those descendants that have both their 'margin-inline-start' and
'margin-inline-end' properties computing to a value other than 'auto', that are
over-constrained and that have one of those two margins with a used value forced to a
greater value, and that do not themselves have an applicable align
attribute. When multiple elements are to align a
particular descendant, the most deeply nested such element is expected to override the others.
Aligned elements are expected to be aligned by having the used
values of their margins on the line-left and line-right sides be
set accordingly. CSSLOGICAL CSSWM
@namespace "http://www.w3.org/1999/xhtml";
area, base, basefont, datalist, head, link, meta, noembed,
noframes, param, rp, script, style, template, title {
display: none;
}
{
display: none;
}
[hidden=until-found i]:not(embed) {
content-visibility: hidden;
}
embed[hidden] { display: inline; height: 0; width: 0; }
input[type=hidden i] { display: none !important; }
@media (scripting) {
noscript { display: none !important; }
}
@namespace "http://www.w3.org/1999/xhtml";
html, body { display: block; }
For each property in the table below, given a body
element, the first attribute
that exists maps to the pixel length property on the body
element. If
none of the attributes for a property are found, or if the value of the attribute that was found
cannot be parsed successfully, then a default value of 8px is expected to be used for that
property instead.
Property | Source |
---|---|
'margin-top' | The body element's marginheight attribute
|
The body element's topmargin attribute
| |
The body element's container frame element's marginheight attribute
| |
'margin-right' | The body element's marginwidth attribute
|
The body element's rightmargin attribute
| |
The body element's container frame element's marginwidth attribute
| |
'margin-bottom' | The body element's marginheight attribute
|
The body element's bottommargin attribute
| |
The body element's container frame element's marginheight attribute
| |
'margin-left' | The body element's marginwidth attribute
|
The body element's leftmargin attribute
| |
The body element's container frame element's marginwidth attribute
|
If the body
element's node document's node navigable is
a child navigable, and the container of that
navigable is a frame
or iframe
element, then the
container frame element of the body
element is that frame
or
iframe
element. Otherwise, there is no container frame element.
The above requirements imply that a page can change the margins of another page
(including one from another origin) using, for example, an iframe
. This
is potentially a security risk, as it might in some cases allow an attack to contrive a situation
in which a page is rendered not as the author intended, possibly for the purposes of phishing or
otherwise misleading the user.
If a Document
's node navigable is a child navigable,
then it is expected to be positioned and sized to fit inside the content box of the
container of that navigable. If the container is not being rendered, the
navigable is expected to have a viewport with zero width and zero
height.
If a Document
's node navigable is a child navigable,
the container of that navigable is a
frame
or iframe
element, that element has a scrolling
attribute, and that attribute's value is an ASCII
case-insensitive match for the string "off
", "noscroll
", or "no
", then the user agent is expected to
prevent any scrollbars from being shown for the viewport of the
Document
's node navigable, regardless of the 'overflow'
property that applies to that viewport.
When a body
element has a background
attribute set to a non-empty value, the new value is expected to be encoding-parsed-and-serialized relative to
the element's node document, and if that does not return failure, the user agent is
expected to treat the attribute as a presentational
hint setting the element's 'background-image' property to the return
value.
When a body
element has a bgcolor
attribute set, the new value is expected to be parsed using the rules for parsing a legacy
color value, and if that does not return failure, the user agent is expected to treat the
attribute as a presentational hint setting the
element's 'background-color' property to the resulting color.
When a body
element has a text
attribute, its
value is expected to be parsed using the rules for parsing a legacy color value, and
if that does not return failure, the user agent is expected to treat the attribute as a presentational hint setting the element's
'color' property to the resulting color.
When a body
element has a link
attribute, its
value is expected to be parsed using the rules for parsing a legacy color value, and
if that does not return failure, the user agent is expected to treat the attribute as a presentational hint setting the 'color' property
of any element in the Document
matching the :link
pseudo-class to the resulting color.
When a body
element has a vlink
attribute,
its value is expected to be parsed using the rules for parsing a legacy color value,
and if that does not return failure, the user agent is expected to treat the attribute as a presentational hint setting the 'color' property
of any element in the Document
matching the :visited
pseudo-class to the resulting color.
When a body
element has an alink
attribute,
its value is expected to be parsed using the rules for parsing a legacy color value,
and if that does not return failure, the user agent is expected to treat the attribute as a presentational hint setting the 'color' property
of any element in the Document
matching the
:active
pseudo-class and either the :link
pseudo-class or the :visited
pseudo-class to the resulting color.
@namespace "http://www.w3.org/1999/xhtml";
address, blockquote, center, dialog, div, figure, figcaption, footer, form,
header, hr, legend, listing, main, p, plaintext, pre, search, xmp {
display: block;
}
blockquote, figure, listing, p, plaintext, pre, xmp {
margin-block: 1em;
}
blockquote, figure { margin-inline: 40px; }
address { font-style: italic; }
listing, plaintext, pre, xmp {
font-family: monospace; white-space: pre;
}
dialog:not([open]) { display: none; }
dialog {
position: absolute;
inset-inline-start: 0; inset-inline-end: 0;
width: fit-content;
height: fit-content;
margin: auto;
border: solid;
padding: 1em;
background-color: Canvas;
color: CanvasText;
}
dialog:modal {
position: fixed;
overflow: auto;
inset-block: 0;
max-width: calc(100% - 6px - 2em);
max-height: calc(100% - 6px - 2em);
}
dialog::backdrop {
background: rgba(0,0,0,0.1);
}
[popover]:not(:popover-open):not(dialog[open]) {
display:none;
}
dialog:popover-open {
display:block;
}
[popover] {
position: fixed;
inset: 0;
width: fit-content;
height: fit-content;
margin: auto;
border: solid;
padding: 0.25em;
overflow: auto;
color: CanvasText;
background-color: Canvas;
}
:popover-open::backdrop {
position: fixed;
inset: 0;
pointer-events: none !important;
background-color: transparent;
}
slot {
display: contents;
}
The following rules are also expected to apply, as presentational hints:
@namespace "http://www.w3.org/1999/xhtml";
pre[wrap] { white-space: pre-wrap; }
In quirks mode, the following rules are also expected to apply:
@namespace "http://www.w3.org/1999/xhtml";
form { margin-block-end: 1em; }
The center
element, and the div
element when it has an align
attribute whose value is an ASCII
case-insensitive match for either the string "center
" or the string
"middle
", are expected to center text within themselves, as if they had
their 'text-align' property set to 'center' in a presentational hint, and to align descendants to the center.
The div
element, when it has an align
attribute whose value is an ASCII case-insensitive match for the string "left
", is expected to left-align text within itself, as if it had its
'text-align' property set to 'left' in a presentational hint, and to align descendants to the left.
The div
element, when it has an align
attribute whose value is an ASCII case-insensitive match for the string "right
", is expected to right-align text within itself, as if it had its
'text-align' property set to 'right' in a presentational hint, and to align descendants to the right.
The div
element, when it has an align
attribute whose value is an ASCII case-insensitive match for the string "justify
", is expected to full-justify text within itself, as if it had its
'text-align' property set to 'justify' in a presentational hint, and to align descendants to the left.
@namespace "http://www.w3.org/1999/xhtml";
cite, dfn, em, i, var { font-style: italic; }
b, strong { font-weight: bolder; }
code, kbd, samp, tt { font-family: monospace; }
big { font-size: larger; }
small { font-size: smaller; }
sub { vertical-align: sub; }
sup { vertical-align: super; }
sub, sup { line-height: normal; font-size: smaller; }
ruby { display: ruby; }
rt { display: ruby-text; }
:link { color: #0000EE; }
:visited { color: #551A8B; }
:link:active, :visited:active { color: #FF0000; }
:link, :visited { text-decoration: underline; cursor: pointer; }
:focus-visible { outline: auto; }
mark { background: yellow; color: black; } /* this color is just a suggestion and can be changed based on implementation feedback */
abbr[title], acronym[title] { text-decoration: dotted underline; }
ins, u { text-decoration: underline; }
del, s, strike { text-decoration: line-through; }
q::before { content: open-quote; }
q::after { content: close-quote; }
br { display-outside: newline; } /* this also has bidi implications */
nobr { white-space: nowrap; }
wbr { display-outside: break-opportunity; } /* this also has bidi implications */
nobr wbr { white-space: normal; }
The following rules are also expected to apply, as presentational hints:
@namespace "http://www.w3.org/1999/xhtml";
br[clear=left i] { clear: left; }
br[clear=right i] { clear: right; }
br[clear=all i], br[clear=both i] { clear: both; }
For the purposes of the CSS ruby model, runs of children of ruby
elements that are
not rt
or rp
elements are expected to be wrapped in anonymous boxes
whose 'display' property has the value 'ruby-base'. CSSRUBY
When a particular part of a ruby has more than one annotation, the annotations should be distributed on both sides of the base text so as to minimize the stacking of ruby annotations on one side.
When it becomes possible to do so, the preceding requirement will be updated to be
expressed in terms of CSS ruby. (Currently, CSS ruby does not handle nested ruby
elements or multiple sequential rt
elements, which is how this semantic is
expressed.)
User agents that do not support correct ruby rendering are expected to render parentheses
around the text of rt
elements in the absence of rp
elements.
User agents are expected to support the 'clear' property on inline elements (in
order to render br
elements with clear
attributes) in the manner described in the non-normative note to this effect in CSS.
The initial value for the 'color' property is expected to be black. The initial value for the 'background-color' property is expected to be 'transparent'. The canvas's background is expected to be white.
When a font
element has a color
attribute, its value is expected to be parsed using the rules for parsing a legacy color
value, and if that does not return failure, the user agent is expected to treat the
attribute as a presentational hint setting the
element's 'color' property to the resulting color.
When a font
element has a face
attribute, the user agent is expected to treat the attribute as a presentational hint setting the element's 'font-family' property to the
attribute's value.
When a font
element has a size
attribute, the user agent is expected to use the following steps, known as the rules for
parsing a legacy font size, to treat the attribute as a presentational hint setting the element's 'font-size' property:
Let input be the attribute's value.
Let position be a pointer into input, initially pointing at the start of the string.
Skip ASCII whitespace within input given position.
If position is past the end of input, there is no presentational hint. Return.
If the character at position is a U+002B PLUS SIGN character (+), then let mode be relative-plus, and advance position to the next character. Otherwise, if the character at position is a U+002D HYPHEN-MINUS character (-), then let mode be relative-minus, and advance position to the next character. Otherwise, let mode be absolute.
Collect a sequence of code points that are ASCII digits from input given position, and let the resulting sequence be digits.
If digits is the empty string, there is no presentational hint. Return.
Interpret digits as a base-ten integer. Let value be the resulting number.
If mode is relative-plus, then increment value by 3. If mode is relative-minus, then let value be the result of subtracting value from 3.
If value is greater than 7, let it be 7.
If value is less than 1, let it be 1.
Set 'font-size' to the keyword corresponding to the value of value according to the following table:
value | 'font-size' keyword |
---|---|
1 | 'x-small' |
2 | 'small' |
3 | 'medium' |
4 | 'large' |
5 | 'x-large' |
6 | 'xx-large' |
7 | 'xxx-large' |
@namespace "http://www.w3.org/1999/xhtml";
[dir]:dir(ltr), bdi:dir(ltr), input[type=tel i]:dir(ltr) { direction: ltr; }
[dir]:dir(rtl), bdi:dir(rtl) { direction: rtl; }
address, blockquote, center, div, figure, figcaption, footer, form, header, hr,
legend, listing, main, p, plaintext, pre, summary, xmp, article, aside, h1, h2,
h3, h4, h5, h6, hgroup, nav, section, search, table, caption, colgroup, col,
thead, tbody, tfoot, tr, td, th, dir, dd, dl, dt, menu, ol, ul, li, bdi, output,
[dir=ltr i], [dir=rtl i], [dir=auto i] {
unicode-bidi: isolate;
}
bdo, bdo[dir] { unicode-bidi: isolate-override; }
input[dir=auto i]:is([type=search i], [type=tel i], [type=url i],
[type=email i]), textarea[dir=auto i], pre[dir=auto i] {
unicode-bidi: plaintext;
}
/* see prose for input elements whose type attribute is in the Text state */
/* the rules setting the 'content' property on br
and wbr
elements also has bidi implications */
When an input
element's dir
attribute is in the
auto state and its type
attribute is in the Text state, then the user agent is
expected to act as if it had a user-agent-level style sheet rule setting the
'unicode-bidi' property to 'plaintext'.
Input fields (i.e. textarea
elements, and input
elements when their
type
attribute is in the Text, Search,
Telephone, URL,
or Email state) are expected to present an editing
user interface with a directionality that matches the element's 'direction'
property.
When the document's character encoding is ISO-8859-8, the following rules are additionally expected to apply, following those above: ENCODING
@namespace "http://www.w3.org/1999/xhtml";
address, blockquote, center, div, figure, figcaption, footer, form, header, hr,
legend, listing, main, p, plaintext, pre, summary, xmp, article, aside, h1, h2,
h3, h4, h5, h6, hgroup, nav, section, search, table, caption, colgroup, col,
thead, tbody, tfoot, tr, td, th, dir, dd, dl, dt, menu, ol, ul, li, [dir=ltr i],
[dir=rtl i], [dir=auto i], *|* {
unicode-bidi: bidi-override;
}
input:not([type=submit i]):not([type=reset i]):not([type=button i]),
textarea {
unicode-bidi: normal;
}
@namespace "http://www.w3.org/1999/xhtml";
article, aside, h1, h2, h3, h4, h5, h6, hgroup, nav, section {
display: block;
}
h1 { margin-block: 0.67em; font-size: 2.00em; font-weight: bold; }
h2 { margin-block: 0.83em; font-size: 1.50em; font-weight: bold; }
h3 { margin-block: 1.00em; font-size: 1.17em; font-weight: bold; }
h4 { margin-block: 1.33em; font-size: 1.00em; font-weight: bold; }
h5 { margin-block: 1.67em; font-size: 0.83em; font-weight: bold; }
h6 { margin-block: 2.33em; font-size: 0.67em; font-weight: bold; }
In the following CSS block, x is shorthand for the following selector:
:is(article, aside, nav, section)
@namespace "http://www.w3.org/1999/xhtml";
x h1 { margin-block: 0.83em; font-size: 1.50em; }
x x h1 { margin-block: 1.00em; font-size: 1.17em; }
x x x h1 { margin-block: 1.33em; font-size: 1.00em; }
x x x x h1 { margin-block: 1.67em; font-size: 0.83em; }
x x x x x h1 { margin-block: 2.33em; font-size: 0.67em; }
The shorthand is used to keep this block at least mildly readable.
@namespace "http://www.w3.org/1999/xhtml";
dir, dd, dl, dt, menu, ol, ul { display: block; }
li { display: list-item; text-align: match-parent; }
dir, dl, menu, ol, ul { margin-block: 1em; }
:is(dir, dl, menu, ol, ul) :is(dir, dl, menu, ol, ul) {
margin-block: 0;
}
dd { margin-inline-start: 40px; }
dir, menu, ol, ul { padding-inline-start: 40px; }
ol, ul, menu { counter-reset: list-item; }
ol { list-style-type: decimal; }
dir, menu, ul {
list-style-type: disc;
}
:is(dir, menu, ol, ul) :is(dir, menu, ul) {
list-style-type: circle;
}
:is(dir, menu, ol, ul) :is(dir, menu, ol, ul) :is(dir, menu, ul) {
list-style-type: square;
}
The following rules are also expected to apply, as presentational hints:
@namespace "http://www.w3.org/1999/xhtml";
ol[type="1"], li[type="1"] { list-style-type: decimal; }
ol[type=a s], li[type=a s] { list-style-type: lower-alpha; }
ol[type=A s], li[type=A s] { list-style-type: upper-alpha; }
ol[type=i s], li[type=i s] { list-style-type: lower-roman; }
ol[type=I s], li[type=I s] { list-style-type: upper-roman; }
ul[type=none i], li[type=none i] { list-style-type: none; }
ul[type=disc i], li[type=disc i] { list-style-type: disc; }
ul[type=circle i], li[type=circle i] { list-style-type: circle; }
ul[type=square i], li[type=square i] { list-style-type: square; }
When rendering li
elements, non-CSS user agents are expected to use the
ordinal value of the li
element to render the counter in the list item
marker.
For CSS user agents, some aspects of rendering list items are defined by the CSS Lists specification. Additionally, the following attribute mappings are expected to apply: CSSLISTS
When an li
element has a value
attribute, and parsing that attribute's value using the
rules for parsing integers doesn't generate an error, the user agent is expected to
use the parsed value value as a presentational
hint for the 'counter-set' property of the form list-item
value
.
When an ol
element has a start
attribute or a reversed
attribute, or both, the user agent
is expected to use the following steps to treat the attributes as a presentational hint for the 'counter-reset' property:
Let value be null.
If the element has a start
attribute, then set
value to the result of parsing the attribute's value using the rules for
parsing integers.
If the element has a reversed
attribute, then:
If value is an integer, then increment value by 1 and return
reversed(list-item) value
.
Otherwise, return reversed(list-item)
.
Either the start
attribute was absent, or
parsing its value resulted in an error.
Otherwise:
If value is an integer, then decrement value by 1 and return
list-item value
.
Otherwise, there is no presentational hint.
@namespace "http://www.w3.org/1999/xhtml";
table { display: table; }
caption { display: table-caption; }
colgroup, colgroup[hidden] { display: table-column-group; }
col, col[hidden] { display: table-column; }
thead, thead[hidden] { display: table-header-group; }
tbody, tbody[hidden] { display: table-row-group; }
tfoot, tfoot[hidden] { display: table-footer-group; }
tr, tr[hidden] { display: table-row; }
td, th { display: table-cell; }
colgroup[hidden], col[hidden], thead[hidden], tbody[hidden],
tfoot[hidden], tr[hidden] {
visibility: collapse;
}
table {
box-sizing: border-box;
border-spacing: 2px;
border-collapse: separate;
text-indent: initial;
}
td, th { padding: 1px; }
th { font-weight: bold; }
caption { text-align: center; }
thead, tbody, tfoot, table > tr { vertical-align: middle; }
tr, td, th { vertical-align: inherit; }
thead, tbody, tfoot, tr { border-color: inherit; }
table[rules=none i], table[rules=groups i], table[rules=rows i],
table[rules=cols i], table[rules=all i], table[frame=void i],
table[frame=above i], table[frame=below i], table[frame=hsides i],
table[frame=lhs i], table[frame=rhs i], table[frame=vsides i],
table[frame=box i], table[frame=border i],
table[rules=none i] > tr > td, table[rules=none i] > tr > th,
table[rules=groups i] > tr > td, table[rules=groups i] > tr > th,
table[rules=rows i] > tr > td, table[rules=rows i] > tr > th,
table[rules=cols i] > tr > td, table[rules=cols i] > tr > th,
table[rules=all i] > tr > td, table[rules=all i] > tr > th,
table[rules=none i] > thead > tr > td, table[rules=none i] > thead > tr > th,
table[rules=groups i] > thead > tr > td, table[rules=groups i] > thead > tr > th,
table[rules=rows i] > thead > tr > td, table[rules=rows i] > thead > tr > th,
table[rules=cols i] > thead > tr > td, table[rules=cols i] > thead > tr > th,
table[rules=all i] > thead > tr > td, table[rules=all i] > thead > tr > th,
table[rules=none i] > tbody > tr > td, table[rules=none i] > tbody > tr > th,
table[rules=groups i] > tbody > tr > td, table[rules=groups i] > tbody > tr > th,
table[rules=rows i] > tbody > tr > td, table[rules=rows i] > tbody > tr > th,
table[rules=cols i] > tbody > tr > td, table[rules=cols i] > tbody > tr > th,
table[rules=all i] > tbody > tr > td, table[rules=all i] > tbody > tr > th,
table[rules=none i] > tfoot > tr > td, table[rules=none i] > tfoot > tr > th,
table[rules=groups i] > tfoot > tr > td, table[rules=groups i] > tfoot > tr > th,
table[rules=rows i] > tfoot > tr > td, table[rules=rows i] > tfoot > tr > th,
table[rules=cols i] > tfoot > tr > td, table[rules=cols i] > tfoot > tr > th,
table[rules=all i] > tfoot > tr > td, table[rules=all i] > tfoot > tr > th {
border-color: black;
}
The following rules are also expected to apply, as presentational hints:
@namespace "http://www.w3.org/1999/xhtml";
table[align=left i] { float: left; }
table[align=right i] { float: right; }
table[align=center i] { margin-inline: auto; }
thead[align=absmiddle i], tbody[align=absmiddle i], tfoot[align=absmiddle i],
tr[align=absmiddle i], td[align=absmiddle i], th[align=absmiddle i] {
text-align: center;
}
caption[align=bottom i] { caption-side: bottom; }
p[align=left i], h1[align=left i], h2[align=left i], h3[align=left i],
h4[align=left i], h5[align=left i], h6[align=left i] {
text-align: left;
}
p[align=right i], h1[align=right i], h2[align=right i], h3[align=right i],
h4[align=right i], h5[align=right i], h6[align=right i] {
text-align: right;
}
p[align=center i], h1[align=center i], h2[align=center i], h3[align=center i],
h4[align=center i], h5[align=center i], h6[align=center i] {
text-align: center;
}
p[align=justify i], h1[align=justify i], h2[align=justify i], h3[align=justify i],
h4[align=justify i], h5[align=justify i], h6[align=justify i] {
text-align: justify;
}
thead[valign=top i], tbody[valign=top i], tfoot[valign=top i],
tr[valign=top i], td[valign=top i], th[valign=top i] {
vertical-align: top;
}
thead[valign=middle i], tbody[valign=middle i], tfoot[valign=middle i],
tr[valign=middle i], td[valign=middle i], th[valign=middle i] {
vertical-align: middle;
}
thead[valign=bottom i], tbody[valign=bottom i], tfoot[valign=bottom i],
tr[valign=bottom i], td[valign=bottom i], th[valign=bottom i] {
vertical-align: bottom;
}
thead[valign=baseline i], tbody[valign=baseline i], tfoot[valign=baseline i],
tr[valign=baseline i], td[valign=baseline i], th[valign=baseline i] {
vertical-align: baseline;
}
td[nowrap], th[nowrap] { white-space: nowrap; }
table[rules=none i], table[rules=groups i], table[rules=rows i],
table[rules=cols i], table[rules=all i] {
border-style: hidden;
border-collapse: collapse;
}
table[border] { border-style: outset; } /* only if border is not equivalent to zero */
table[frame=void i] { border-style: hidden; }
table[frame=above i] { border-style: outset hidden hidden hidden; }
table[frame=below i] { border-style: hidden hidden outset hidden; }
table[frame=hsides i] { border-style: outset hidden outset hidden; }
table[frame=lhs i] { border-style: hidden hidden hidden outset; }
table[frame=rhs i] { border-style: hidden outset hidden hidden; }
table[frame=vsides i] { border-style: hidden outset; }
table[frame=box i], table[frame=border i] { border-style: outset; }
table[border] > tr > td, table[border] > tr > th,
table[border] > thead > tr > td, table[border] > thead > tr > th,
table[border] > tbody > tr > td, table[border] > tbody > tr > th,
table[border] > tfoot > tr > td, table[border] > tfoot > tr > th {
/* only if border is not equivalent to zero */
border-width: 1px;
border-style: inset;
}
table[rules=none i] > tr > td, table[rules=none i] > tr > th,
table[rules=none i] > thead > tr > td, table[rules=none i] > thead > tr > th,
table[rules=none i] > tbody > tr > td, table[rules=none i] > tbody > tr > th,
table[rules=none i] > tfoot > tr > td, table[rules=none i] > tfoot > tr > th,
table[rules=groups i] > tr > td, table[rules=groups i] > tr > th,
table[rules=groups i] > thead > tr > td, table[rules=groups i] > thead > tr > th,
table[rules=groups i] > tbody > tr > td, table[rules=groups i] > tbody > tr > th,
table[rules=groups i] > tfoot > tr > td, table[rules=groups i] > tfoot > tr > th,
table[rules=rows i] > tr > td, table[rules=rows i] > tr > th,
table[rules=rows i] > thead > tr > td, table[rules=rows i] > thead > tr > th,
table[rules=rows i] > tbody > tr > td, table[rules=rows i] > tbody > tr > th,
table[rules=rows i] > tfoot > tr > td, table[rules=rows i] > tfoot > tr > th {
border-width: 1px;
border-style: none;
}
table[rules=cols i] > tr > td, table[rules=cols i] > tr > th,
table[rules=cols i] > thead > tr > td, table[rules=cols i] > thead > tr > th,
table[rules=cols i] > tbody > tr > td, table[rules=cols i] > tbody > tr > th,
table[rules=cols i] > tfoot > tr > td, table[rules=cols i] > tfoot > tr > th {
border-width: 1px;
border-block-style: none;
border-inline-style: solid;
}
table[rules=all i] > tr > td, table[rules=all i] > tr > th,
table[rules=all i] > thead > tr > td, table[rules=all i] > thead > tr > th,
table[rules=all i] > tbody > tr > td, table[rules=all i] > tbody > tr > th,
table[rules=all i] > tfoot > tr > td, table[rules=all i] > tfoot > tr > th {
border-width: 1px;
border-style: solid;
}
table[rules=groups i] > colgroup {
border-inline-width: 1px;
border-inline-style: solid;
}
table[rules=groups i] > thead,
table[rules=groups i] > tbody,
table[rules=groups i] > tfoot {
border-block-width: 1px;
border-block-style: solid;
}
table[rules=rows i] > tr, table[rules=rows i] > thead > tr,
table[rules=rows i] > tbody > tr, table[rules=rows i] > tfoot > tr {
border-block-width: 1px;
border-block-style: solid;
}
In quirks mode, the following rules are also expected to apply:
@namespace "http://www.w3.org/1999/xhtml";
table {
font-weight: initial;
font-style: initial;
font-variant: initial;
font-size: initial;
line-height: initial;
white-space: initial;
text-align: initial;
}
For the purposes of the CSS table model, the col
element is expected to be treated
as if it was present as many times as its span
attribute specifies.
For the purposes of the CSS table model, the colgroup
element, if it contains no
col
element, is expected to be treated as if it had as many such children as its
span
attribute specifies.
For the purposes of the CSS table model, the colspan
and
rowspan
attributes on td
and th
elements are expected to provide the
special knowledge regarding cells spanning rows and columns.
In HTML documents, the following rules are also expected to apply:
@namespace "http://www.w3.org/1999/xhtml";
:is(table, thead, tbody, tfoot, tr) > form { display: none !important; }
The table
element's cellspacing
attribute maps to the pixel length property 'border-spacing' on the
element.
The table
element's cellpadding
attribute maps to the pixel length
properties 'padding-top', 'padding-right',
'padding-bottom', and 'padding-left' of any td
and
th
elements that have corresponding cells in the
table corresponding to the table
element.
The table
element's height
attribute
maps to the dimension property 'height' on the table
element.
The table
element's width
attribute
maps to the dimension property (ignoring zero) 'width' on the
table
element.
The col
element's width
attribute maps
to the dimension property 'width' on the col
element.
The thead
, tbody
, and tfoot
elements' height
attribute maps to the dimension property
'height' on the element.
The tr
element's height
attribute maps
to the dimension property 'height' on the tr
element.
The td
and th
elements' height
attributes map to the dimension
property (ignoring zero) 'height' on the element.
The td
and th
elements' width
attributes map to the dimension
property (ignoring zero) 'width' on the element.
The thead
, tbody
, tfoot
, tr
,
td
, and th
elements, when they have an align
attribute whose value is an ASCII case-insensitive match for either the string "center
" or the string "middle
", are expected to center
text within themselves, as if they had their 'text-align' property set to 'center' in
a presentational hint, and to align
descendants to the center.
The thead
, tbody
, tfoot
, tr
,
td
, and th
elements, when they have an align
attribute whose value is an ASCII case-insensitive match for the string "left
", are expected to left-align text within themselves, as if they had their
'text-align' property set to 'left' in a presentational hint, and to align descendants to the left.
The thead
, tbody
, tfoot
, tr
,
td
, and th
elements, when they have an align
attribute whose value is an ASCII case-insensitive match for the string "right
", are expected to right-align text within themselves, as if they had their
'text-align' property set to 'right' in a presentational hint, and to align descendants to the right.
The thead
, tbody
, tfoot
, tr
,
td
, and th
elements, when they have an align
attribute whose value is an ASCII case-insensitive match for the string "justify
", are expected to full-justify text within themselves, as if they had
their 'text-align' property set to 'justify' in a presentational hint, and to align descendants to the left.
User agents are expected to have a rule in their user agent style sheet that matches
th
elements that have a parent node whose computed value for the
'text-align' property is its initial value, whose declaration block consists of just
a single declaration that sets the 'text-align' property to the value 'center'.
When a table
, thead
, tbody
, tfoot
,
tr
, td
, or th
element has a background
attribute set to a non-empty value, the new value is
expected to be encoding-parsed-and-serialized relative to the element's node document,
and if that does not return failure, the user agent is expected to treat the attribute as a presentational hint setting the element's
'background-image' property to the return value.
When a table
, thead
, tbody
, tfoot
,
tr
, td
, or th
element has a bgcolor
attribute set, the new value is expected to be parsed using the rules for parsing a legacy
color value, and if that does not return failure, the user agent is expected to treat the
attribute as a presentational hint setting the element's
'background-color' property to the resulting color.
When a table
element has a bordercolor
attribute, its value is expected to be parsed using the rules for parsing a legacy color
value, and if that does not return failure, the user agent is expected to treat the
attribute as a presentational hint setting the
element's 'border-top-color', 'border-right-color',
'border-bottom-color', and 'border-left-color' properties to the
resulting color.
The table
element's border
attribute maps to the pixel length properties
'border-top-width', 'border-right-width',
'border-bottom-width', 'border-left-width' on the element. If the
attribute is present but parsing the attribute's value using the rules for parsing
non-negative integers generates an error, a default value of 1px is expected to be used for
that property instead.
Rules marked "only if border is not equivalent to zero"
in the CSS block above is expected to only be applied if the border
attribute mentioned in the selectors for the rule is not
only present but, when parsed using the rules for parsing non-negative integers, is
also found to have a value other than zero or to generate an error.
In quirks mode, a td
element or a th
element that has a
nowrap
attribute but also has a width
attribute whose value, when parsed using the rules for
parsing nonzero dimension values, is found to be a length (not an error or a number
classified as a percentage), is expected to have a presentational hint setting the element's 'white-space' property to
'normal', overriding the rule in the CSS block above that sets it to 'nowrap'.
A node is substantial if it is a text node that is not inter-element whitespace, or if it is an element node.
A node is blank if it is an element that contains no substantial nodes.
The elements with default margins
are the following elements: blockquote
, dir
, dl
,
h1
, h2
, h3
, h4
, h5
,
h6
, listing
, menu
, ol
,
p
, plaintext
, pre
, ul
, xmp
In quirks mode, any element
with default margins that is the child of a
body
, td
, or th
element and has no substantial previous siblings is expected to have a
user-agent level style sheet rule that sets its 'margin-block-start' property to
zero.
In quirks mode, any element
with default margins that is the child of a
body
, td
, or th
element, has no substantial previous siblings, and is blank, is expected to have a user-agent level style sheet
rule that sets its 'margin-block-end' property to zero also.
In quirks mode, any element
with default margins that is the child of a
td
or th
element, has no substantial following siblings, and is blank, is expected to have a user-agent level style sheet
rule that sets its 'margin-block-start' property to zero.
In quirks mode, any p
element that is the child of a td
or th
element and has
no substantial following siblings, is expected
to have a user-agent level style sheet rule that sets its 'margin-block-end' property
to zero.
@namespace "http://www.w3.org/1999/xhtml";
input, select, button, textarea {
letter-spacing: initial;
word-spacing: initial;
line-height: initial;
text-transform: initial;
text-indent: initial;
text-shadow: initial;
appearance: auto;
}
input:not([type=image i], [type=range i], [type=checkbox i], [type=radio i]) {
overflow: clip !important;
overflow-clip-margin: 0 !important;
}
input, select, textarea {
text-align: initial;
}
:autofill {
field-sizing: fixed !important;
}
input:is([type=reset i], [type=button i], [type=submit i]), button {
text-align: center;
}
input, button {
display: inline-block;
}
input[type=hidden i], input[type=file i], input[type=image i] {
appearance: none;
}
input:is([type=radio i], [type=checkbox i], [type=reset i], [type=button i],
[type=submit i], [type=color i], [type=search i]), select, button {
box-sizing: border-box;
}
textarea { white-space: pre-wrap; }
In quirks mode, the following rules are also expected to apply:
@namespace "http://www.w3.org/1999/xhtml";
input:not([type=image i]), textarea { box-sizing: border-box; }
Each kind of form control is also described in the Widgets section, which describes the look and feel of the control.
For input
elements where the type
attribute
is not in the Hidden state or the Image Button state, and that are being
rendered, are expected to act as follows:
The inner display type is always 'flow-root'.
hr
element@namespace "http://www.w3.org/1999/xhtml";
hr {
color: gray;
border-style: inset;
border-width: 1px;
margin-block: 0.5em;
margin-inline: auto;
overflow: hidden;
}
The following rules are also expected to apply, as presentational hints:
@namespace "http://www.w3.org/1999/xhtml";
hr[align=left i] { margin-left: 0; margin-right: auto; }
hr[align=right i] { margin-left: auto; margin-right: 0; }
hr[align=center i] { margin-left: auto; margin-right: auto; }
hr[color], hr[noshade] { border-style: solid; }
If an hr
element has either a color
attribute
or a noshade
attribute, and furthermore also has a size
attribute, and parsing that attribute's value using the
rules for parsing non-negative integers doesn't generate an error, then the user
agent is expected to use the parsed value divided by two as a pixel length for
presentational hints for the properties 'border-top-width',
'border-right-width', 'border-bottom-width', and
'border-left-width' on the element.
Otherwise, if an hr
element has neither a color
attribute nor a noshade
attribute, but does have a size
attribute, and parsing that attribute's value using the
rules for parsing non-negative integers doesn't generate an error, then: if the
parsed value is one, then the user agent is expected to use the attribute as a presentational hint setting the element's
'border-bottom-width' to 0; otherwise, if the parsed value is greater than one, then
the user agent is expected to use the parsed value minus two as a pixel length for
presentational hints for the 'height' property on the element.
The width
attribute on an hr
element maps
to the dimension property 'width' on the element.
When an hr
element has a color
attribute, its
value is expected to be parsed using the rules for parsing a legacy color value, and
if that does not return failure, the user agent is expected to treat the attribute as a presentational hint setting the element's
'color' property to the resulting color.
fieldset
and legend
elements@namespace "http://www.w3.org/1999/xhtml";
fieldset {
display: block;
margin-inline: 2px;
border: groove 2px ThreeDFace;
padding-block: 0.35em 0.625em;
padding-inline: 0.75em;
min-inline-size: min-content;
}
legend {
padding-inline: 2px;
}
legend[align=left i] {
justify-self: left;
}
legend[align=center i] {
justify-self: center;
}
legend[align=right i] {
justify-self: right;
}
The fieldset
element, when it generates a CSS box, is expected to act
as follows:
The element is expected to establish a new block formatting context.
The 'display' property is expected to act as follows:
If the computed value of 'display' is a value such that the outer display type is 'inline', then behave as 'inline-block'.
Otherwise, behave as 'flow-root'.
This does not change the computed value.
If the element's box has a child box that matches the conditions in the list below, then the first such child box is the 'fieldset' element's rendered legend:
legend
element.If the element has a rendered legend, then the border is expected to not be painted behind the rectangle defined as follows, using the writing mode of the fieldset:
The block-start edge of the rectangle is the smaller of the block-start edge of the
rendered legend's margin rectangle at its static position (ignoring transforms),
and the block-start outer edge of the fieldset
's border.
The block-end edge of the rectangle is the larger of the block-end edge of the
rendered legend's margin rectangle at its static position (ignoring transforms),
and the block-end outer edge of the fieldset
's border.
The inline-start edge of the rectangle is the smaller of the inline-start edge of the
rendered legend's border rectangle at its static position (ignoring transforms),
and the inline-start outer edge of the fieldset
's border.
The inline-end edge of the rectangle is the larger of the inline-end edge of the
rendered legend's border rectangle at its static position (ignoring transforms),
and the inline-end outer edge of the fieldset
's border.
The space allocated for the element's border on the block-start side is expected to be
the element's 'border-block-start-width' or the rendered legend's
margin box size in the fieldset
's block-flow direction, whichever is
greater.
For the purpose of calculating the used 'block-size', if the computed 'block-size' is not 'auto', the space allocated for the rendered legend's margin box that spills out past the border, if any, is expected to be subtracted from the 'block-size'. If the content box's block-size would be negative, then let the content box's block-size be zero instead.
If the element has a rendered legend, then that element is expected to be the first child box.
The anonymous fieldset content box is expected to appear after the
rendered legend and is expected to contain the content (including the '::before'
and '::after' pseudo-elements) of the fieldset
element except for the
rendered legend, if there is one.
The used value of the 'padding-top', 'padding-right', 'padding-bottom', and 'padding-left' properties are expected to be zero.
For the purpose of calculating the min-content inline size, use the greater of the min-content inline size of the rendered legend and the min-content inline size of the anonymous fieldset content box.
For the purpose of calculating the max-content inline size, use the greater of the max-content inline size of the rendered legend and the max-content inline size of the anonymous fieldset content box.
A fieldset
element's rendered legend, if any, is expected to act as
follows:
The element is expected to establish a new formatting context for its contents. The type of this formatting context is determined by its 'display' value, as usual.
The 'display' property is expected to behave as if its computed value was blockified.
This does not change the computed value.
If the computed value of 'inline-size' is 'auto', then the used value is the fit-content inline size.
The element is expected to be positioned in the inline direction as is normal for blocks (e.g., taking into account margins and the 'justify-self' property).
The element's box is expected to be constrained in the inline direction by the inline
content size of the fieldset
as if it had used its computed inline padding.
For example, if the fieldset
has a specified padding of 50px, then the
rendered legend will be positioned 50px in from the fieldset
's
border. The padding will further apply to the anonymous fieldset content box
instead of the fieldset
element itself.
The element is expected to be positioned in the block-flow direction such that its border
box is centered over the border on the block-start side of the fieldset
element.
A fieldset
element's anonymous fieldset content box is expected to
act as follows:
The 'display' property is expected to act as follows:
If the computed value of 'display' on the fieldset
element
is 'grid' or 'inline-grid', then set the used value to 'grid'.
If the computed value of 'display' on the fieldset
element
is 'flex' or 'inline-flex', then set the used value to 'flex'.
Otherwise, set the used value to 'flow-root'.
The following properties are expected to inherit from the fieldset
element:
The 'block-size' property is expected to be set to '100%'.
For the purpose of calculating percentage padding, act as if the padding was calculated
for the fieldset
element.
The following elements can be replaced
elements: audio
, canvas
, embed
, iframe
,
img
, input
, object
, and video
.
The embed
, iframe
, and video
elements are expected to be
treated as replaced elements.
A canvas
element that represents embedded content is
expected to be treated as a replaced element; the contents of such elements are the
element's bitmap, if any, or else a transparent black bitmap with the same
natural dimensions as the element. Other canvas
elements are expected
to be treated as ordinary elements in the rendering model.
An object
element that represents an image, plugin, or its
content navigable is expected to be treated as a replaced element.
Other object
elements are expected to be treated as ordinary elements in the
rendering model.
The audio
element, when it is exposing a user interface, is expected to be treated as a
replaced element about one line high, as wide as is necessary to expose the user
agent's user interface features. When an audio
element is not exposing a user interface, the user agent is expected to force
its 'display' property to compute to 'none', irrespective of CSS rules.
Whether a video
element is exposing a user interface is not expected to affect the size of the rendering;
controls are expected to be overlaid above the page content without causing any layout changes,
and are expected to disappear when the user does not need them.
When a video
element represents a poster frame or frame of video, the poster frame
or frame of video is expected to be rendered at the largest size that maintains the aspect ratio
of that poster frame or frame of video without being taller or wider than the video
element itself, and is expected to be centered in the video
element.
Any subtitles or captions are expected to be overlaid directly on top of their
video
element, as defined by the relevant rendering rules; for WebVTT, those are the
rules for updating the display of WebVTT text tracks. WEBVTT
When the user agent starts exposing a user
interface for a video
element, the user agent should run the rules for
updating the text track rendering of each of the text
tracks in the video
element's list of text tracks that are showing and whose text track kind is one of subtitles
or captions
(e.g., for text
tracks based on WebVTT, the rules for updating the display of WebVTT text
tracks). WEBVTT
Resizing video
and canvas
elements does not interrupt
video playback or clear the canvas.
The following CSS rules are expected to apply:
@namespace "http://www.w3.org/1999/xhtml";
iframe { border: 2px inset; }
video { object-fit: contain; }
User agents are expected to render img
elements and input
elements
whose type
attributes are in the Image Button state, according to the first applicable rules
from the following list:
alt
attribute, or
Document
is in quirks mode, and the element already has
natural dimensions (e.g., from the dimension attributes or CSS
rules)
input
elements, the element
is expected to appear button-like to indicate that the element is a button.img
element that represents some text and the
user agent does not expect this to changeimg
element that represents nothing and the
user agent does not expect this to changeinput
element that does not represent an image and the user agent does not expect this to changeThe icons mentioned above are expected to be relatively small so as not to disrupt most text but be easily clickable. In a visual environment, for instance, icons could be 16 pixels by 16 pixels square, or 1em by 1em if the images are scalable. In an audio environment, the icon could be a short bleep. The icons are intended to indicate to the user that they can be used to get to whatever options the UA provides for images, and, where appropriate, are expected to provide access to the context menu that would have come up if the user interacted with the actual image.
All animated images with the same absolute URL and the same image data are expected to be rendered synchronized to the same timeline as a group, with the timeline starting at the time of the least recent addition to the group.
In other words, when a second image with the same absolute URL and animated image data is inserted into a document, it jumps to the point in the animation cycle that is currently being displayed by the first image.
When a user agent is to restart the animation for an img
element
showing an animated image, all animated images with the same absolute URL and the
same image data in that img
element's node document are expected to restart
their animation from the beginning.
The following CSS rules are expected to apply:
@namespace "http://www.w3.org/1999/xhtml";
img:is([sizes="auto" i], [sizes^="auto," i]) {
contain: size !important;
contain-intrinsic-size: 300px 150px;
}
The following CSS rules are expected to apply when the Document
is in quirks
mode:
@namespace "http://www.w3.org/1999/xhtml";
img[align=left i] { margin-right: 3px; }
img[align=right i] { margin-left: 3px; }
The following CSS rules are expected to apply as presentational hints:
@namespace "http://www.w3.org/1999/xhtml";
iframe[frameborder='0'], iframe[frameborder=no i] { border: none; }
embed[align=left i], iframe[align=left i], img[align=left i],
input[type=image i][align=left i], object[align=left i] {
float: left;
}
embed[align=right i], iframe[align=right i], img[align=right i],
input[type=image i][align=right i], object[align=right i] {
float: right;
}
embed[align=top i], iframe[align=top i], img[align=top i],
input[type=image i][align=top i], object[align=top i] {
vertical-align: top;
}
embed[align=baseline i], iframe[align=baseline i], img[align=baseline i],
input[type=image i][align=baseline i], object[align=baseline i] {
vertical-align: baseline;
}
embed[align=texttop i], iframe[align=texttop i], img[align=texttop i],
input[type=image i][align=texttop i], object[align=texttop i] {
vertical-align: text-top;
}
embed[align=absmiddle i], iframe[align=absmiddle i], img[align=absmiddle i],
input[type=image i][align=absmiddle i], object[align=absmiddle i],
embed[align=abscenter i], iframe[align=abscenter i], img[align=abscenter i],
input[type=image i][align=abscenter i], object[align=abscenter i] {
vertical-align: middle;
}
embed[align=bottom i], iframe[align=bottom i], img[align=bottom i],
input[type=image i][align=bottom i], object[align=bottom i] {
vertical-align: bottom;
}
When an embed
, iframe
, img
, or object
element, or an input
element whose type
attribute is in the Image Button state, has an align
attribute whose value is an ASCII case-insensitive match for
the string "center
" or the string "middle
", the user
agent is expected to act as if the element's 'vertical-align' property was set to a
value that aligns the vertical middle of the element with the parent element's baseline.
The hspace
attribute of embed
,
img
, or object
elements, and input
elements with a type
attribute in the Image
Button state, maps to the dimension
properties 'margin-left' and 'margin-right' on the element.
The vspace
attribute of embed
,
img
, or object
elements, and input
elements with a type
attribute in the Image
Button state, maps to the dimension
properties 'margin-top' and 'margin-bottom' on the element.
When an img
element, object
element, or input
element
with a type
attribute in the Image Button state has a border
attribute whose value, when parsed using the rules for
parsing non-negative integers, is found to be a number greater than zero, the user agent is
expected to use the parsed value for eight presentational hints: four setting the
parsed value as a pixel length for the element's 'border-top-width',
'border-right-width', 'border-bottom-width', and
'border-left-width' properties, and four setting the element's
'border-top-style', 'border-right-style',
'border-bottom-style', and 'border-left-style' properties to the value
'solid'.
The width
and height
attributes on an img
element's dimension attribute source map to the dimension properties
'width' and 'height' on the img
element respectively. They
similarly map to the aspect-ratio property (using dimension rules) of the
img
element.
The width
and height
attributes on embed
, iframe
, object
, and video
elements, and input
elements with a type
attribute in the Image Button state and that either
represents an image or that the user expects will eventually represent an image, map to the dimension properties
'width' and 'height' on the element respectively.
The width
and height
attributes map to the aspect-ratio property (using dimension rules) on
img
and video
elements, and input
elements with a type
attribute in the Image
Button state.
The width
and height
attributes map to the aspect-ratio property
on canvas
elements.
Shapes on an image map are expected to act, for the purpose of the CSS cascade, as
elements independent of the original area
element that happen to match the same style
rules but inherit from the img
or object
element.
For the purposes of the rendering, only the 'cursor' property is expected to have any effect on the shape.
Thus, for example, if an area
element has a style
attribute that sets the 'cursor' property to 'help',
then when the user designates that shape, the cursor would change to a Help cursor.
Similarly, if an area
element had a CSS rule that set its
'cursor' property to 'inherit' (or if no rule setting the 'cursor'
property matched the element at all), the shape's cursor would be inherited from the
img
or object
element of the image map, not from the parent
of the area
element.
The CSS Basic User Interface specification calls elements that can have a native appearance widgets, and defines whether to use that native appearance depending on the 'appearance' property. That logic, in turn, depends on whether on whether each the element is classified as a devolvable widget or non-devolvable widget. This section defines which elements match these concepts for HTML, what their native appearance is, and any particularity of their devolved state or primitive appearance. CSSUI
The following elements can have a native appearance for the purpose of the CSS 'appearance' property.
button
input
meter
progress
select
textarea
Several widgets have their rendering controlled by the 'writing-mode' CSS property. For the purposes of those widgets, we have the following definitions.
A horizontal writing mode is when resolving the 'writing-mode' property of the control results in a computed value of 'horizontal-tb'.
A vertical writing mode is when resolving the 'writing-mode' property of the control results in a computed value of either 'vertical-rl', 'vertical-lr', 'sideways-rl' or 'sideways-lr'.
When an element uses button layout, it is a devolvable widget, and it's native appearance is that of a button.
Button layout is as follows:
If the element is a button
element, then the 'display' property is
expected to act as follows:
If the computed value of 'display' is 'inline-grid', 'grid', 'inline-flex', 'flex', 'none', or 'contents', then behave as the computed value.
Otherwise, if the computed value of 'display' is a value such that the outer display type is 'inline', then behave as 'inline-block'.
Otherwise, behave as 'flow-root'.
The element is expected to establish a new formatting context for its contents. The type of this formatting context is determined by its 'display' value, as usual.
If the element is absolutely-positioned, then for the purpose of the CSS visual formatting model, act as if the element is a replaced element. CSS
If the computed value of 'inline-size' is 'auto', then the used value is the fit-content inline size.
For the purpose of the 'normal' keyword of the 'align-self' property, act as if the element is a replaced element.
If the element is an input
element, or if it is a button
element
and its computed value for 'display' is not 'inline-grid', 'grid', 'inline-flex',
or 'flex', then the element's box has a child anonymous button content box with the
following behaviors:
The box is a block-level block container that establishes a new block formatting context (i.e., 'display' is 'flow-root').
If the box does not overflow in the horizontal axis, then it is centered horizontally.
If the box does not overflow in the vertical axis, then it is centered vertically.
Otherwise, there is no anonymous button content box.
Need to define the expected primitive appearance.
button
elementThe button
element, when it generates a CSS box, is expected to
depict a button and to use button layout whose anonymous button content
box's contents (if there is an anonymous button content box) are the child
boxes the element's box would otherwise have.
details
and summary
elements@namespace "http://www.w3.org/1999/xhtml";
details, summary {
display: block;
}
details > summary:first-of-type {
display: list-item;
counter-increment: list-item 0;
list-style: disclosure-closed inside;
}
details[open] > summary:first-of-type {
list-style-type: disclosure-open;
}
The details
element is expected to have an internal shadow tree with
three child elements:
The first child element is a slot
that is expected to take the
details
element's first summary
element child, if any. This element
has a single child summary
element called the default summary which has
text content that is implementation-defined (and probably locale-specific).
The summary
element that this slot represents is expected to allow
the user to request the details be shown or hidden.
The second child element is a slot
that is expected to take the
details
element's remaining descendants, if any. This element has no contents.
This element is expected to match the '::details-content' pseudo-element.
This element is expected to have its style
attribute set to
"display: block; content-visibility: hidden;
" when the
details
element does not have an open
attribute. When it does have the open
attribute, the
style
attribute is expected to be set to
"display: block;
".
Because the slots are hidden inside a shadow tree, this style
attribute is not directly visible to author code. Its impacts,
however, are visible. Notably, the choice of content-visibility: hidden
instead of, e.g., display: none
, impacts the results of various APIs that
query layout information.
The third child element is either a link
or style
element with the following styles for the default summary:
:host summary {
display: list-item;
counter-increment: list-item 0;
list-style: disclosure-closed inside;
}
:host([open]) summary {
list-style-type: disclosure-open;
}
The position of this child element relative to the other two is not observable. This means that implementations might have it in a different order relative to its siblings. Implementations might even associate the style with the shadow tree using a mechanism that is not an element.
The structure of this shadow tree is observable through the ways that the children
of the details
element and the '::details-content' pseudo-element respond to CSS
styles.
input
element as a text entry widgetAn input
element whose type
attribute is in
the Text, Telephone, URL, or
Email state, is a devolvable widget. Its
expected native appearance is to render as an 'inline-block' box depicting
a one-line text control.
An input
element whose type
attribute is in
the Search state is a devolvable widget.
Its expected native appearance is to render as an 'inline-block' box
depicting a one-line text control. If the computed value of the element's
'appearance' property is not 'textfield'
, it may have a distinct style
indicating that it is a search field.
An input
element whose type
attribute is in
the Password state is a devolvable
widget. Its expected native appearance is to render as an
'inline-block' box depicting a one-line text control that obscures data entry.
For input
elements whose type
attribute is
in one of the above states, the used value of the 'line-height' property
must be a length value that is no smaller than what the used value would be for
'line-height: normal'.
The used value will not be the actual keyword 'normal'. Also, this rule does not affect the computed value.
If these text controls provide a text selection, then, when the user changes the current
selection, the user agent is expected to queue an element task on the user
interaction task source given the input
element to fire an event named select
at the element, with the bubbles
attribute initialized to
true.
An input
element whose type
attribute is
in one of the above states is an element with default preferred size, and user
agents are expected to apply the 'field-sizing' CSS property to the element. User
agents are expected to determine the inline size of its intrinsic size
by the following steps:
If the 'field-sizing' property on the element has a computed value
of 'content', the inline size is
determined by the text which the element shows. The text is either a
value or a short hint specified by the
placeholder
attribute. User agents may take the
text caret size into account in the inline size.
If the element has a size
attribute, and parsing that
attribute's value using the rules for parsing non-negative integers doesn't
generate an error, return the value obtained from applying the converting a character
width to pixels algorithm to the value of the attribute.
Otherwise, return the value obtained from applying the converting a character width to pixels algorithm to the number 20.
The converting a character width to pixels algorithm returns (size-1)×avg + max, where size is the character width to convert, avg is the average character width of the primary font for the element for which the algorithm is being run, in pixels, and max is the maximum character width of that same font, also in pixels. (The element's 'letter-spacing' property does not affect the result.)
These text controls are expected to be scroll containers and support scrolling in the inline axis, but not the block axis.
Need to detail the expected native appearance and primitive appearance.
input
element as domain-specific widgetsAn input
element whose type
attribute is in
the Date state is a devolvable widget
expected to render as an 'inline-block' box depicting a date control.
An input
element whose type
attribute is in
the Month state is a devolvable widget
expected to render as an 'inline-block' box depicting a month control.
An input
element whose type
attribute is in
the Week state is a devolvable widget
expected to render as an 'inline-block' box depicting a week control.
An input
element whose type
attribute is in
the Time state is a devolvable widget
expected to render as an 'inline-block' box depicting a time control.
An input
element whose type
attribute is in
the Local Date and Time state is a
devolvable widget expected to render as an 'inline-block' box depicting
a local date and time control.
An input
element whose type
attribute is in
the Number state is a devolvable widget
expected to render as an 'inline-block' box depicting a number control.
An input
element whose type
attribute is in
the Number state is an
element with default preferred size, and user agents are expected to apply the
'field-sizing' CSS property to the element. The block size of the
intrinsic size is about one line high. If the 'field-sizing' property
on the element has a computed value of
'content', the inline size of the
intrinsic size is expected to be about as wide as necessary to show the current
value. Otherwise, the inline size of the
intrinsic size is expected to be about as wide as necessary to show the widest
possible value.
An input
element whose type
attribute is in
the Date,
Month,
Week, Time,
or Local Date and Time state, is expected to
be about one line high, and about as wide as necessary to show the widest possible value.
Need to detail the expected native appearance and primitive appearance.
input
element as a range controlAn input
element whose type
attribute is in
the Range state is a non-devolvable
widget. Its expected native appearance is to render as an
'inline-block' box depicting a slider control.
When this control has a horizontal writing mode, the control is expected to be a horizontal slider. Its lowest value is on the right if the 'direction' property has a computed value of 'rtl', and on the left otherwise. When this control has a vertical writing mode, it is expected to be a vertical slider. Its lowest value is on the bottom if the 'direction' property has a computed value of 'rtl', and on the top otherwise.
Predefined suggested values (provided by the list
attribute) are expected to be shown as tick marks on the slider, which the slider can snap to.
Need to detail the expected primitive appearance.
input
element as a color
wellAn input
element whose type
attribute is in
the Color state is expected to depict a color well,
which, when activated, provides the user with a color picker (e.g. a color wheel or color
palette) from which the color can be changed. The element, when it generates a CSS
box, is expected to use button layout, that has no child boxes of the
anonymous button content box. The anonymous button content box is
expected to have a presentational hint setting the
'background-color' property to the element's value.
Predefined suggested values (provided by the list
attribute) are expected to be shown in the color picker interface, not on the color well
itself.
Need to detail the expected native appearance and primitive appearance.
input
element as a checkbox and radio button widgetsAn input
element whose type
attribute is in
the Checkbox state is a non-devolvable
widget expected to render as an 'inline-block' box containing a single
checkbox control, with no label.
Need to detail the expected native appearance and primitive appearance.
An input
element whose type
attribute is in
the Radio Button state is a non-devolvable
widget expected to render as an 'inline-block' box containing a single radio
button control, with no label.
Need to detail the expected native appearance and primitive appearance.
input
element as a file upload controlAn input
element whose type
attribute is in
the File Upload state, when it generates a CSS
box, is expected to render as an 'inline-block' box containing a span of text
giving the filename(s) of the selected
files, if any, followed by a button that, when activated, provides the user with a file
picker from which the selection can be changed. The button is expected to use button
layout and match the '::file-selector-button' pseudo-element. The contents of
its anonymous button content box are expected to be
implementation-defined (and possibly locale-specific) text, for example "Choose
file".
User agents may handle an input
element whose
type
attribute is in the
File Upload state as an
element with default preferred size, and user agents may apply the
'field-sizing' CSS property to the element. If the 'field-sizing'
property on the element has a computed value of
'content', the intrinsic size of the
element is expected to depend on its content such as the '::file-selector-button'
pseudo-element and chosen file names.
input
element as a buttonAn input
element whose type
attribute is in
the Submit Button, Reset Button, or Button state, when it generates a CSS box, is
expected to depict a button and use button layout and the contents of the
anonymous button content box are expected to be the text of the element's value
attribute, if any, or text derived from the element's type
attribute in an implementation-defined (and
probably locale-specific) fashion, if not.
marquee
element@namespace "http://www.w3.org/1999/xhtml";
marquee {
display: inline-block;
text-align: initial;
overflow: hidden !important;
}
The marquee
element, while turned on, is
expected to render in an animated fashion according to its attributes as follows:
behavior
attribute is in the
scroll stateSlide the contents of the element in the direction described by the direction
attribute as defined below, such that it begins
off the start side of the marquee
, and ends flush with the inner end side.
For example, if the direction
attribute is left (the default), then the
contents would start such that their left edge are off the side of the right edge of the
marquee
's content area, and the contents would then slide up to the
point where the left edge of the contents are flush with the left inner edge of the
marquee
's content area.
Once the animation has ended, the user agent is expected to increment the marquee current loop index. If the element is still turned on after this, then the user agent is expected to restart the animation.
behavior
attribute is in the
slide stateSlide the contents of the element in the direction described by the direction
attribute as defined below, such that it begins
off the start side of the marquee
, and ends off the end side of the
marquee
.
For example, if the direction
attribute is left (the default), then the
contents would start such that their left edge are off the side of the right edge of the
marquee
's content area, and the contents would then slide up to the
point where the right edge of the contents are flush with the left inner edge of the
marquee
's content area.
Once the animation has ended, the user agent is expected to increment the marquee current loop index. If the element is still turned on after this, then the user agent is expected to restart the animation.
behavior
attribute is in the
alternate stateWhen the marquee current loop index is even (or zero), slide the contents of the
element in the direction described by the direction
attribute as defined below, such that it begins flush with the start side of the
marquee
, and ends flush with the end side of the marquee
.
When the marquee current loop index is odd, slide the contents of the element in
the opposite direction than that described by the direction
attribute as defined below, such that it begins
flush with the end side of the marquee
, and ends flush with the start side of the
marquee
.
For example, if the direction
attribute is left (the default), then the
contents would with their right edge flush with the right inner edge of the
marquee
's content area, and the contents would then slide up to the
point where the left edge of the contents are flush with the left inner edge of the
marquee
's content area.
Once the animation has ended, the user agent is expected to increment the marquee current loop index. If the element is still turned on after this, then the user agent is expected to continue the animation.
The direction
attribute has the meanings described
in the following table:
direction attribute state
| Direction of animation | Start edge | End edge | Opposite direction |
---|---|---|---|---|
left | ← Right to left | Right | Left | → Left to Right |
right | → Left to Right | Left | Right | ← Right to left |
up | ↑ Up (Bottom to Top) | Bottom | Top | ↓ Down (Top to Bottom) |
down | ↓ Down (Top to Bottom) | Top | Bottom | ↑ Up (Bottom to Top) |
In any case, the animation should proceed such that there is a delay given by the marquee scroll interval between each frame, and such that the content moves at most the distance given by the marquee scroll distance with each frame.
When a marquee
element has a bgcolor
attribute set, the value is expected to be parsed using the rules for parsing a legacy color
value, and if that does not return failure, the user agent is expected to treat the
attribute as a presentational hint setting the element's
'background-color' property to the resulting color.
The width
and height
attributes on a marquee
element
map to the dimension properties
'width' and 'height' on the element respectively.
The natural height of a marquee
element with its direction
attribute in the up or down states is 200 CSS
pixels.
The vspace
attribute of a
marquee
element maps to the dimension
properties 'margin-top' and 'margin-bottom' on the element. The
hspace
attribute of a marquee
element maps to the dimension properties
'margin-left' and 'margin-right' on the element.
meter
element@namespace "http://www.w3.org/1999/xhtml";
meter { appearance: auto; }
The meter
element is a devolvable widget. Its expected native
appearance is to render as an 'inline-block' box with a 'block-size'
of '1em' and a 'inline-size' of '5em', a 'vertical-align' of '-0.2em', and
with its contents depicting a gauge.
When this element has a horizontal writing mode, the depiction is expected to be of a horizontal gauge. Its minimum value is on the right if the 'direction' property has a computed value of 'rtl', and on the left otherwise. When this element has a vertical writing mode, it is expected to depict a vertical gauge. Its minimum value is on the bottom if the 'direction' property has a computed value of 'rtl', and on the top otherwise.
User agents are expected to use a presentation consistent with platform conventions for gauges, if any.
Requirements for what must be depicted in the gauge are
included in the definition of the meter
element.
Need to detail the expected primitive appearance.
progress
element@namespace "http://www.w3.org/1999/xhtml";
progress { appearance: auto; }
The progress
element is a devolvable widget. Its expected
native appearance is to render as an 'inline-block' box with a
'block-size' of '1em' and a 'inline-size' of '10em', and a
'vertical-align' of '-0.2em'.
When the this element has a horizontal writing mode, the element is expected to be depicted as a horizontal progress bar. The start is on the right and the end is on the left if the 'direction' property on this element has a computed value of 'rtl', and with the start on the left and the end on the right otherwise. When this element has a vertical writing mode, it is expected to be depicted as a vertical progress bar. The start is on the bottom and the end is on the top if the 'direction' property on this element has a computed value of 'rtl', and with the start on the top and the end on the bottom otherwise.
User agents are expected to use a presentation consistent with platform conventions for progress bars. In particular, user agents are expected to use different presentations for determinate and indeterminate progress bars. User agents are also expected to vary the presentation based on the dimensions of the element.
Requirements for how to determine if the progress bar is determinate or
indeterminate, and what progress a determinate progress bar is to show, are included in the
definition of the progress
element.
Need to detail the expected primitive appearance.
select
elementThe select
element is an element with default preferred size, and
user agents are expected to apply the 'field-sizing' CSS property to
select
elements.
A select
element is either a list box or a drop-down box, depending on its attributes.
A select
element whose multiple
attribute is present is expected to render as a multi-select list box.
A select
element whose multiple
attribute is absent, and whose display size is greater
than 1, is expected to render as a single-select list box.
When the element renders as a list box, it is a devolvable widget
expected to render as an 'inline-block' box. The inline size of its
intrinsic size is the width of the select
's labels plus
the width of a scrollbar. The block size of its intrinsic size is
determined by the following steps:
If the 'field-sizing' property on the element has a computed value of 'content', return the height necessary to contain all rows for items.
If the size
attribute is absent or it has no valid
value, return the height necessary to contain four rows.
Otherwise, return the height necessary to contain as many rows for items as given by the element's display size.
A select
element whose multiple
attribute is absent, and whose display size is 1, is
expected to render as an 'inline-block' one-line drop-down box.
The inline size of its intrinsic size is the
width of the select
's labels. If the 'field-sizing'
property on the element has a computed value of
'content', the inline size of the
intrinsic size depends on the shown text. The shown text is typically the label of
an option
of which selectedness is
set to true.
When the element renders as a drop-down box, it is a devolvable
widget. Its appearance in the devolved state, as well as its appearance when the
computed value of the element's 'appearance' property is
'menulist-button'
, is that of a drop-down box, including a "drop-down button",
but not necessarily rendered using a native control of the host operating system. In such a state,
CSS properties such as 'color', 'background-color', and 'border' should
not be disregarded (as is generally permissible when rendering an element according to its
native appearance).
In either case (list box or drop-down box), the element's items are
expected to be the element's list of options,
with the element's optgroup
element children
providing headers for groups of options where applicable.
An optgroup
element is expected to be rendered by displaying the element's label
attribute.
An option
element is expected to be rendered by displaying the element's label, indented under its optgroup
element if it
has one.
Each sequence of one or more child hr
element siblings may be rendered as a single
separator.
The width of the select
's labels is the wider of the width necessary to
render the widest optgroup
, and the width necessary to render the widest
option
element in the element's list of
options (including its indent, if any).
If a select
element contains a placeholder label option, the user
agent is expected to render that option
in a manner that conveys that it is a label,
rather than a valid option of the control. This can include preventing the placeholder label
option from being explicitly selected by the user. When the placeholder label
option's selectedness is true, the control
is expected to be displayed in a fashion that indicates that no valid option is currently
selected.
User agents are expected to render the labels in a select
in such a manner that
any alignment remains consistent whether the label is being displayed as part of the page or in a
menu control.
Need to detail the expected native appearance and primitive appearance.
textarea
elementThe textarea
element is a devolvable widget expected to render as an
'inline-block' box depicting a multiline text control. If this multiline text control
provides a selection, then, when the user changes the current selection, the user agent is
expected to queue an element task on the user interaction task source
given the textarea
element to fire an event
named select
at the element, with the bubbles
attribute initialized to true.
The textarea
element is an element with default preferred size, and
user agents are expected to apply the 'field-sizing' CSS property to
textarea
elements.
If the 'field-sizing' property on the element has a computed value
of 'content', the intrinsic size is
determined from the text which the element shows. The text is either a
raw value or a short hint specified by the
placeholder
attribute. User agents may take the
text caret size into account in the intrinsic size. Otherwise, its
intrinsic size is computed from textarea effective width and
textarea effective height (as defined below).
The textarea effective width of a textarea
element is size×avg + sbw, where
size is the element's character width,
avg is the average character width of the primary font of the element, in CSS pixels, and sbw is the width of a scrollbar, in CSS pixels. (The element's 'letter-spacing' property does not
affect the result.)
The textarea effective height of a textarea
element is the height in
CSS pixels of the number of lines specified the element's character height, plus the height of a scrollbar in CSS pixels.
User agents are expected to apply the 'white-space' CSS property to
textarea
elements. For historical reasons, if the element has a wrap
attribute whose value is an ASCII
case-insensitive match for the string "off
", then the user agent is expected to treat the attribute as a presentational hint setting the element's
'white-space' property to 'pre'.
Need to detail the expected native appearance and primitive appearance.
User agents are expected to render frameset
elements as a box with the height and
width of the viewport, with a surface rendered according to the following layout
algorithm:
The cols and rows variables are lists of zero or more pairs consisting of a number and a unit, the unit being one of percentage, relative, and absolute.
Use the rules for parsing a list of dimensions to parse the value of the
element's cols
attribute, if there is one.
Let cols be the result, or an empty list if there is no such attribute.
Use the rules for parsing a list of dimensions to parse the value of the
element's rows
attribute, if there is one.
Let rows be the result, or an empty list if there is no such attribute.
For any of the entries in cols or rows that have the number zero and the unit relative, change the entry's number to one.
If cols has no entries, then add a single entry consisting of the value 1 and the unit relative to cols.
If rows has no entries, then add a single entry consisting of the value 1 and the unit relative to rows.
Invoke the algorithm defined below to convert a list of dimensions to a list of pixel
values using cols as the input list, and the width of the surface that the
frameset
is being rendered into, in CSS pixels, as the
input dimension. Let sized cols be the resulting list.
Invoke the algorithm defined below to convert a list of dimensions to a list of pixel
values using rows as the input list, and the height of the surface that the
frameset
is being rendered into, in CSS pixels, as the
input dimension. Let sized rows be the resulting list.
Split the surface into a grid of w×h rectangles, where w is the number of entries in sized cols and h is the number of entries in sized rows.
Size the columns so that each column in the grid is as many CSS pixels wide as the corresponding entry in the sized cols list.
Size the rows so that each row in the grid is as many CSS pixels high as the corresponding entry in the sized rows list.
Let children be the list of frame
and frameset
elements
that are children of the frameset
element
for which the algorithm was invoked.
For each row of the grid of rectangles created in the previous step, from top to bottom, run these substeps:
For each rectangle in the row, from left to right, run these substeps:
If there are any elements left in children, take the first element in the list, and assign it to the rectangle.
If this is a frameset
element, then recurse the entire frameset
layout algorithm for that frameset
element, with the rectangle as the
surface.
Otherwise, it is a frame
element; render its content
navigable, positioned and sized to fit the rectangle.
If there are any elements left in children, remove the first element from children.
If the frameset
element has a border, draw an outer set of borders
around the rectangles, using the element's frame border color.
For each rectangle, if there is an element assigned to that rectangle, and that element has a border, draw an inner set of borders around that rectangle, using the element's frame border color.
For each (visible) border that does not abut a rectangle that is assigned a
frame
element with a noresize
attribute (including rectangles in further nested frameset
elements), the user
agent is expected to allow the user to move the border, resizing the rectangles within, keeping
the proportions of any nested frameset
grids.
A frameset
or frame
element has a border if the
following algorithm returns true:
If the element has a frameborder
attribute whose value is not the
empty string and whose first character is either a U+0031 DIGIT ONE (1) character, a U+0079
LATIN SMALL LETTER Y character (y), or a U+0059 LATIN CAPITAL LETTER Y character (Y), then
return true.
Otherwise, if the element has a frameborder
attribute, return
false.
Otherwise, if the element has a parent element that is a frameset
element,
then return true if that element has a border, and false if it does
not.
Otherwise, return true.
The frame border color of a
frameset
or frame
element is the color obtained from the following
algorithm:
If the element has a bordercolor
attribute, and applying the
rules for parsing a legacy color value to that attribute's value does not return
failure, then return the color so obtained.
Otherwise, if the element has a parent element that is a frameset
element,
then return the frame border color of that element.
Otherwise, return gray.
The algorithm to convert a list of dimensions to a list of pixel values consists of the following steps:
Let input list be the list of numbers and units passed to the algorithm.
Let output list be a list of numbers the same length as input list, all zero.
Entries in output list correspond to the entries in input list that have the same position.
Let input dimension be the size passed to the algorithm.
Let count percentage be the number of entries in input list whose unit is percentage.
Let total percentage be the sum of all the numbers in input list whose unit is percentage.
Let count relative be the number of entries in input list whose unit is relative.
Let total relative be the sum of all the numbers in input list whose unit is relative.
Let count absolute be the number of entries in input list whose unit is absolute.
Let total absolute be the sum of all the numbers in input list whose unit is absolute.
Let remaining space be the value of input dimension.
If total absolute is greater than remaining space, then for each entry in input list whose unit is absolute, set the corresponding value in output list to the number of the entry in input list multiplied by remaining space and divided by total absolute. Then, set remaining space to zero.
Otherwise, for each entry in input list whose unit is absolute, set the corresponding value in output list to the number of the entry in input list. Then, decrement remaining space by total absolute.
If total percentage multiplied by the input dimension and divided by 100 is greater than remaining space, then for each entry in input list whose unit is percentage, set the corresponding value in output list to the number of the entry in input list multiplied by remaining space and divided by total percentage. Then, set remaining space to zero.
Otherwise, for each entry in input list whose unit is percentage, set the corresponding value in output list to the number of the entry in input list multiplied by the input dimension and divided by 100. Then, decrement remaining space by total percentage multiplied by the input dimension and divided by 100.
For each entry in input list whose unit is relative, set the corresponding value in output list to the number of the entry in input list multiplied by remaining space and divided by total relative.
Return output list.
User agents working with integer values for frame widths (as opposed to user agents that can lay frames out with subpixel accuracy) are expected to distribute the remainder first to the last entry whose unit is relative, then equally (not proportionally) to each entry whose unit is percentage, then equally (not proportionally) to each entry whose unit is absolute, and finally, failing all else, to the last entry.
The contents of a frame
element that does not have a frameset
parent
are expected to be rendered as transparent black; the user agent is expected to not
render its content navigable in this case, and its content navigable is
expected to have a viewport with zero width and zero height.
User agents are expected to allow the user to control aspects of hyperlink activation and form submission, such as which navigable is to be used for the subsequent navigation.
User agents are expected to allow users to discover the destination of hyperlinks and of forms before triggering their navigation.
User agents are expected to inform the user of whether a hyperlink includes hyperlink auditing, and to let them know at a minimum which domains will be contacted as part of such auditing.
User agents may allow users to navigate navigables to the URLs indicated by the cite
attributes on q
,
blockquote
, ins
, and del
elements.
User agents may surface hyperlinks created by link
elements in their user interface, as discussed previously.
title
attributeUser agents are expected to expose the advisory information of elements upon user request, and to make the user aware of the presence of such information.
On interactive graphical systems where the user can use a pointing device, this could take the form of a tooltip. When the user is unable to use a pointing device, then the user agent is expected to make the content available in some other fashion, e.g. by making the element a focusable area and always displaying the advisory information of the currently focused element, or by showing the advisory information of the elements under the user's finger on a touch device as the user pans around the screen.
U+000A LINE FEED (LF) characters are expected to cause line breaks in the tooltip; U+0009 CHARACTER TABULATION (tab) characters are expected to render as a nonzero horizontal shift that lines up the next glyph with the next tab stop, with tab stops occurring at points that are multiples of 8 times the width of a U+0020 SPACE character.
For example, a visual user agent could make elements with a title
attribute focusable, and could make
any focused element with a title
attribute
show its tooltip under the element while the element has focus. This would allow a user to tab
around the document to find all the advisory text.
As another example, a screen reader could provide an audio cue when reading an element with a tooltip, with an associated key to read the last tooltip for which a cue was played.
The current text editing caret (i.e. the active range, if it is empty and in an editing host), if any, is expected to act like an inline replaced element with the vertical dimensions of the caret and with zero width for the purposes of the CSS rendering model.
This means that even an empty block can have the caret inside it, and that when the caret is in such an element, it prevents margins from collapsing through the element.
User agents are expected to honor the Unicode semantics of text that is exposed in user interfaces, for example supporting the bidirectional algorithm in text shown in dialogs, title bars, popup menus, and tooltips. Text from the contents of elements is expected to be rendered in a manner that honors the directionality of the element from which the text was obtained. Text from attributes is expected to be rendered in a manner that honours the directionality of the attribute.
Consider the following markup, which has Hebrew text asking for a programming language, the languages being text for which a left-to-right direction is important given the punctuation in some of their names:
<p dir="rtl" lang="he">
<label>
בחר שפת תכנות:
<select>
<option dir="ltr">C++</option>
<option dir="ltr">C#</option>
<option dir="ltr">FreePascal</option>
<option dir="ltr">F#</option>
</select>
</label>
</p>
If the select
element was rendered as a drop down box, a correct rendering would
ensure that the punctuation was the same both in the drop down, and in the box showing the
current selection.
The directionality of attributes depends on the attribute and on the element's dir
attribute, as the following example demonstrates. Consider this
markup:
<table>
<tr>
<th abbr="(א" dir=ltr>A
<th abbr="(א" dir=rtl>A
<th abbr="(א" dir=auto>A
</table>
If the abbr
attributes are rendered, e.g. in a tooltip or
other user interface, the first will have a left parenthesis (because the direction is 'ltr'),
the second will have a right parenthesis (because the direction is 'rtl'), and the third will
have a right parenthesis (because the direction is determined from the attribute value
to be 'rtl').
However, if instead the attribute was not a directionality-capable attribute, the results would be different:
<table>
<tr>
<th data-abbr="(א" dir=ltr>A
<th data-abbr="(א" dir=rtl>A
<th data-abbr="(א" dir=auto>A
</table>
In this case, if the user agent were to expose the data-abbr
attribute
in the user interface (e.g. in a debugging environment), the last case would be rendered with a
left parenthesis, because the direction would be determined from the element's
contents.
A string provided by a script (e.g. the argument to window.alert()
) is expected to be treated as an independent set of one or
more bidirectional algorithm paragraphs when displayed, as defined by the bidirectional algorithm,
including, for instance, supporting the paragraph-breaking behavior of U+000A LINE FEED (LF)
characters. For the purposes of determining the paragraph level of such text in the bidirectional
algorithm, this specification does not provide a higher-level override of rules P2 and
P3. BIDI
When necessary, authors can enforce a particular direction for a given paragraph by starting it with the Unicode U+200E LEFT-TO-RIGHT MARK or U+200F RIGHT-TO-LEFT MARK characters.
Thus, the following script:
alert('\u05DC\u05DE\u05D3 HTML \u05D4\u05D9\u05D5\u05DD!')
...would always result in a message reading "למד LMTH היום!" (not "דמל HTML םויה!"), regardless of the language of the user agent interface or the direction of the page or any of its elements.
For a more complex example, consider the following script:
/* Warning: this script does not handle right-to-left scripts correctly */
var s;
if (s = prompt('What is your name?')) {
alert(s + '! Ok, Fred, ' + s + ', and Wilma will get the car.');
}
When the user enters "Kitty", the user agent would alert "Kitty! Ok, Fred, Kitty, and Wilma will get the car.". However, if the user enters "لا أفهم", then the bidirectional algorithm will determine that the direction of the paragraph is right-to-left, and so the output will be the following unintended mess: "لا أفهم! derF ,kO, لا أفهم, rac eht teg lliw amliW dna."
To force an alert that starts with user-provided text (or other text of unknown directionality) to render left-to-right, the string can be prefixed with a U+200E LEFT-TO-RIGHT MARK character:
var s;
if (s = prompt('What is your name?')) {
alert('\u200E' + s + '! Ok, Fred, ' + s + ', and Wilma will get the car.');
}
User agents are expected to allow the user to request the opportunity to obtain a physical
form (or a representation of a physical form) of a Document
. For example,
selecting the option to print a page or convert it to PDF format. PDF
When the user actually obtains a physical form (or
a representation of a physical form) of a Document
, the user agent is expected to
create a new rendering of the Document
for the print media.
HTML user agents may, in certain circumstances, find themselves rendering non-HTML documents that use vocabularies for which they lack any built-in knowledge. This section provides for a way for user agents to handle such documents in a somewhat useful manner.
While a Document
is an unstyled document, the user agent is expected
to render an unstyled document view.
A Document
is an unstyled document while it matches the following
conditions:
Document
has no author style sheets (whether referenced by HTTP headers, processing instructions, elements like link
, inline elements like style
, or any other mechanism).
Document
have any presentational hints.
Document
have any style attributes.
Document
are in any of the following namespaces: HTML namespace, SVG namespace, MathML namespace
Document
has no focusable area (e.g. from XLink) other than the viewport.
Document
has no hyperlinks (e.g. from XLink).
Window
object with
this Document
as its associated
Document
.
Document
have any registered event listeners.
An unstyled document view is one where the DOM is not rendered according to CSS
(which would, since there are no applicable styles in this context, just result in a wall of
text), but is instead rendered in a manner that is useful for a developer. This could consist of
just showing the Document
object's source, maybe with syntax highlighting, or it
could consist of displaying just the DOM tree, or simply a message saying that the page is not a
styled document.
If a Document
stops being an unstyled document, then the
conditions above stop applying, and thus a user agent following these requirements will switch to
using the regular CSS rendering.
Features listed in this section will trigger warnings in conformance checkers.
Authors should not specify a border
attribute on an
img
element. If the attribute is present, its value must be the string "0
". CSS should be used instead.
Authors should not specify a charset
attribute on a
script
element. If the attribute is present, its value must be an ASCII
case-insensitive match for "utf-8
". (This has no effect in a
document that conforms to the requirements elsewhere in this standard of being encoded as
UTF-8.)
Authors should not specify a language
attribute on a
script
element. If the attribute is present, its value must be an ASCII
case-insensitive match for the string "JavaScript
" and either the
type
attribute must be omitted or its value must be an
ASCII case-insensitive match for the string "text/javascript
".
The attribute should be entirely omitted instead (with the value "JavaScript
", it has no effect), or replaced with use of the type
attribute.
Authors should not specify a value for the type
attribute on script
elements that is the empty string or a JavaScript MIME type
essence match. Instead, they should omit the attribute, which has the same effect.
Authors should not specify a type
attribute on a
style
element. If the attribute is present, its value must be an ASCII
case-insensitive match for "text/css
".
Authors should not specify the name
attribute on
a
elements. If the attribute is present, its value must not be the empty string and
must neither be equal to the value of any of the IDs in the
element's tree other than the element's own ID, if
any, nor be equal to the value of any of the other name
attributes on a
elements in the element's tree. If this attribute is
present and the element has an ID, then the attribute's value
must be equal to the element's ID. In earlier versions of the
language, this attribute was intended as a way to specify possible targets for fragments in URLs. The id
attribute should be used instead.
Authors should not, but may despite requirements to the contrary elsewhere in this
specification, specify the maxlength
and size
attributes on input
elements whose type
attributes are in the Number state. One valid reason for using these attributes
regardless is to help legacy user agents that do not support input
elements with
type="number"
to still render the text control with a useful width.
To ease the transition from HTML4 Transitional documents to the language defined in this specification, and to discourage certain features that are only allowed in very few circumstances, conformance checkers must warn the user when the following features are used in a document. These are generally old obsolete features that have no effect, and are allowed only to distinguish between likely mistakes (regular conformance errors) and mere vestigial markup or unusual and discouraged practices (these warnings).
The following features must be categorized as described above:
The presence of a border
attribute on an
img
element if its value is the string "0
".
The presence of a charset
attribute on a
script
element if its value is an ASCII case-insensitive match for
"utf-8
".
The presence of a language
attribute on a
script
element if its value is an ASCII case-insensitive match for the
string "JavaScript
" and if there is no type
attribute or there is and its value is an ASCII
case-insensitive match for the string "text/javascript
".
The presence of a type
attribute on a
script
element if its value is a JavaScript MIME type essence
match.
The presence of a type
attribute on a
style
element if its value is an ASCII case-insensitive match for
"text/css
".
The presence of a name
attribute on an a
element, if its value is not the empty string.
The presence of a maxlength
attribute on an
input
element whose type
attribute is in the
Number state.
The presence of a size
attribute on an
input
element whose type
attribute is in the
Number state.
Conformance checkers must distinguish between pages that have no conformance errors and have none of these obsolete features, and pages that have no conformance errors but do have some of these obsolete features.
For example, a validator could report some pages as "Valid HTML" and others as "Valid HTML with warnings".
Elements in the following list are entirely obsolete, and must not be used by authors:
applet
Use embed
or object
instead.
acronym
Use abbr
instead.
bgsound
Use audio
instead.
dir
Use ul
instead.
frame
frameset
noframes
Either use iframe
and CSS instead, or use server-side includes to generate complete pages with the various invariant parts merged in.
isindex
Use an explicit form
and text control combination instead.
keygen
For enterprise device management use cases, use native on-device management capabilities.
For certificate enrollment use cases, use the Web Cryptography API to generate a keypair for the certificate, and then export the certificate and key to allow the user to install them manually. WEBCRYPTO
listing
Use pre
and code
instead.
menuitem
To implement a custom context menu, use script to handle the contextmenu
event.
nextid
Use GUIDs instead.
noembed
Use object
instead of embed
when fallback is necessary.
param
Use the data
attribute of the object
element to set the
URL of the external resource.
plaintext
Use the "text/plain
" MIME type instead.
rb
rtc
Providing the ruby base directly inside the ruby
element or using nested
ruby
elements is sufficient.
strike
Use del
instead if the element is marking an edit, otherwise use s
instead.
xmp
Use pre
and code
instead, and escape "<
" and "&
" characters as "<
" and "&
" respectively.
basefont
big
blink
center
font
marquee
multicol
nobr
spacer
tt
Use appropriate elements or CSS instead.
Where the tt
element would have been used for marking up keyboard input,
consider the kbd
element; for variables, consider the var
element; for
computer code, consider the code
element; and for computer output, consider the
samp
element.
Similarly, if the big
element is being used to denote a heading, consider using
the h1
element; if it is being used for marking up important passages, consider the
strong
element; and if it is being used for highlighting text for reference
purposes, consider the mark
element.
See also the text-level semantics usage summary for more suggestions with examples.
The following attributes are obsolete (though the elements are still part of the language), and must not be used by authors:
charset
on a
elementscharset
on link
elementsUse an HTTP `Content-Type
` header on the linked resource instead.
charset
on script
elements (except as noted in the previous section)Omit the attribute. Both documents and scripts are required to use UTF-8, so
it is redundant to specify it on the script
element since it inherits from the
document.
coords
on a
elementsshape
on a
elementsUse area
instead of a
for image maps.
methods
on a
elementsmethods
on link
elementsUse the HTTP OPTIONS feature instead.
name
on a
elements (except as noted in the previous section)name
on embed
elementsname
on img
elementsname
on option
elementsUse the id
attribute instead.
rev
on a
elementsrev
on link
elementsUse the rel
attribute instead, with an opposite term. (For example, instead of
rev="made"
, use rel="author"
.)
urn
on a
elementsurn
on link
elementsSpecify the preferred persistent identifier using the href
attribute instead.
accept
on form
elementsUse the accept
attribute directly on the input
elements instead.
hreflang
on area
elementstype
on area
elementsThese attributes do not do anything useful, and for historical reasons there are no
corresponding IDL attributes on area
elements. Omit them altogether.
nohref
on area
elementsOmitting the href
attribute is sufficient; the nohref
attribute is
unnecessary. Omit it altogether.
profile
on head
elementsUnnecessary. Omit it altogether.
manifest
on html
elementsUse service workers instead. SW
version
on html
elementsUnnecessary. Omit it altogether.
ismap
on input
elementsUnnecessary. Omit it altogether. All input
elements with a type
attribute in the Image
Button state are processed as server-side image maps.
usemap
on input
elementsusemap
on object
elementsUse the img
element for image maps.
longdesc
on iframe
elementslongdesc
on img
elementsUse a regular a
element to link to the
description, or (in the case of images) use an image
map to provide a link from the image to the image's
description.
lowsrc
on img
elementsUse a progressive JPEG image (given in the src
attribute),
instead of using two separate images.
target
on link
elementsUnnecessary. Omit it altogether.
type
on menu
elementsTo implement a custom context menu, use script to handle the contextmenu
event. For toolbar menus, omit the
attribute.
label
on menu
elementscontextmenu
on all elementsonshow
on all elementsTo implement a custom context menu, use script to handle the contextmenu
event.
scheme
on meta
elementsUse only one scheme per field, or make the scheme declaration part of the value.
archive
on object
elementsclassid
on object
elementscode
on object
elementscodebase
on object
elementscodetype
on object
elementsUse the data
and type
attributes to invoke plugins.
declare
on object
elementsRepeat the object
element completely each time the resource is to be reused.
standby
on object
elementsOptimize the linked resource so that it loads quickly or, at least, incrementally.
typemustmatch
on object
elementsAvoid using object
elements with untrusted resources.
language
on script
elements (except as noted in the previous section)Omit the attribute for JavaScript; for data blocks, use
the type
attribute instead.
event
on script
elementsfor
on script
elementsUse DOM events mechanisms to register event listeners. DOM
type
on style
elements (except as noted in the previous section)Omit the attribute for CSS; for data blocks, use
script
as the container instead of style
.
datapagesize
on table
elementsUnnecessary. Omit it altogether.
summary
on table
elementsUse one of the techniques for describing
tables given in the table
section instead.
abbr
on td
elementsUse text that begins in an unambiguous and terse manner, and include any more elaborate text after that. The title
attribute can also be useful in including more detailed text, so that the cell's contents can be made terse. If it's a heading, use th
(which has an abbr
attribute).
axis
on td
and th
elementsUse the scope
attribute on the relevant th
.
scope
on td
elementsUse th
elements for heading cells.
datasrc
on a
, button
, div
, frame
, iframe
, img
, input
, label
, legend
, marquee
, object
, option
, select
, span
, table
, and textarea
elementsdatafld
on a
, button
, div
, fieldset
, frame
, iframe
, img
, input
, label
, legend
, marquee
, object
, select
, span
, and textarea
elementsdataformatas
on button
, div
, input
, label
, legend
, marquee
, object
, option
, select
, span
, and table
elementsUse script and a mechanism such as XMLHttpRequest
to populate the page dynamically. XHR
dropzone
on all elementsUse script to handle the dragenter
and dragover
events instead.
alink
on body
elementsbgcolor
on body
elementsbottommargin
on body
elementsleftmargin
on body
elementslink
on body
elementsmarginheight
on body
elementsmarginwidth
on body
elementsrightmargin
on body
elementstext
on body
elementstopmargin
on body
elementsvlink
on body
elementsclear
on br
elementsalign
on caption
elementsalign
on col
elementschar
on col
elementscharoff
on col
elementsvalign
on col
elementswidth
on col
elementsalign
on div
elementscompact
on dl
elementsalign
on embed
elementshspace
on embed
elementsvspace
on embed
elementsalign
on hr
elementscolor
on hr
elementsnoshade
on hr
elementssize
on hr
elementswidth
on hr
elementsalign
on h1
—h6
elementsalign
on iframe
elementsallowtransparency
on iframe
elementsframeborder
on iframe
elementsframespacing
on iframe
elementshspace
on iframe
elementsmarginheight
on iframe
elementsmarginwidth
on iframe
elementsscrolling
on iframe
elementsvspace
on iframe
elementsalign
on input
elementsborder
on input
elementshspace
on input
elementsvspace
on input
elementsalign
on img
elementsborder
on img
elements (except as noted in the previous section)hspace
on img
elementsvspace
on img
elementsalign
on legend
elementstype
on li
elementscompact
on menu
elementsalign
on object
elementsborder
on object
elementshspace
on object
elementsvspace
on object
elementscompact
on ol
elementsalign
on p
elementswidth
on pre
elementsalign
on table
elementsbgcolor
on table
elementsborder
on table
elementsbordercolor
on table
elementscellpadding
on table
elementscellspacing
on table
elementsframe
on table
elementsheight
on table
elementsrules
on table
elementswidth
on table
elementsalign
on tbody
, thead
, and tfoot
elementschar
on tbody
, thead
, and tfoot
elementscharoff
on tbody
, thead
, and tfoot
elementsheight
on thead
, tbody
, and tfoot
elementsvalign
on tbody
, thead
, and tfoot
elementsalign
on td
and th
elementsbgcolor
on td
and th
elementschar
on td
and th
elementscharoff
on td
and th
elementsheight
on td
and th
elementsnowrap
on td
and th
elementsvalign
on td
and th
elementswidth
on td
and th
elementsalign
on tr
elementsbgcolor
on tr
elementschar
on tr
elementscharoff
on tr
elementsheight
on tr
elementsvalign
on tr
elementscompact
on ul
elementstype
on ul
elementsbackground
on body
, table
, thead
, tbody
, tfoot
, tr
, td
, and th
elementsUse CSS instead.
marquee
elementThe marquee
element is a presentational element that animates content. CSS
transitions and animations are a more appropriate mechanism. CSSANIMATIONS CSSTRANSITIONS
The marquee
element must implement the HTMLMarqueeElement
interface.
[Exposed=Window]
interface HTMLMarqueeElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString behavior;
[CEReactions] attribute DOMString bgColor;
[CEReactions] attribute DOMString direction;
[CEReactions] attribute DOMString height;
[CEReactions] attribute unsigned long hspace;
[CEReactions] attribute long loop;
[CEReactions] attribute unsigned long scrollAmount;
[CEReactions] attribute unsigned long scrollDelay;
[CEReactions] attribute boolean trueSpeed;
[CEReactions] attribute unsigned long vspace;
[CEReactions] attribute DOMString width;
undefined start();
undefined stop();
};
A marquee
element can be turned on or turned off. When it is created, it is turned on.
When the start()
method is called, the marquee
element
must be turned on.
When the stop()
method is called, the marquee
element
must be turned off.
The behavior
content attribute on marquee
elements is an enumerated attribute with
the following keywords and states (all non-conforming):
Keyword | State |
---|---|
scroll
| scroll |
slide
| slide |
alternate
| alternate |
The attribute's missing value default and invalid value default are both the scroll state.
The direction
content attribute on marquee
elements is an enumerated attribute with the following keywords and states (all
non-conforming):
Keyword | State |
---|---|
left
| left |
right
| right |
up
| up |
down
| down |
The attribute's missing value default and invalid value default are both the left state.
The truespeed
content attribute on marquee
elements is a boolean attribute.
A marquee
element has a marquee scroll interval, which is obtained as
follows:
If the element has a scrolldelay
attribute,
and parsing its value using the rules for parsing non-negative integers does not
return an error, then let delay be the parsed value. Otherwise, let delay
be 85.
If the element does not have a truespeed
attribute, and the delay value is less than 60, then let delay be 60
instead.
The marquee scroll interval is delay, interpreted in milliseconds.
A marquee
element has a marquee scroll distance, which, if the element
has a scrollamount
attribute, and
parsing its value using the rules for parsing non-negative integers does not return
an error, is the parsed value interpreted in CSS pixels, and otherwise
is 6 CSS pixels.
A marquee
element has a marquee loop count, which, if the element has a
loop
attribute, and
parsing its value using the rules for parsing integers does not return an error or a
number less than 1, is the parsed value, and otherwise is −1.
The loop
IDL attribute, on getting, must return the element's marquee loop count; and on
setting, if the new value is different than the element's marquee loop count and
either greater than zero or equal to −1, must set the element's loop
content attribute (adding it if necessary) to the
valid integer that represents the new value. (Other values are ignored.)
A marquee
element also has a marquee current loop index, which is zero
when the element is created.
The rendering layer will occasionally increment the marquee current loop index, which must cause the following steps to be run:
If the marquee loop count is −1, then return.
Increment the marquee current loop index by one.
If the marquee current loop index is now greater than or equal to the
element's marquee loop count, turn off the
marquee
element.
The behavior
, direction
, height
, hspace
, vspace
, and width
IDL attributes must
reflect the respective content attributes of the same name.
The bgColor
IDL attribute must reflect the
bgcolor
content attribute.
The scrollAmount
IDL attribute must
reflect the scrollamount
content attribute. The default value is 6.
The scrollDelay
IDL attribute must reflect
the scrolldelay
content attribute. The
default value is 85.
The trueSpeed
IDL attribute must reflect the
truespeed
content attribute.
The frameset
element acts as the body element in
documents that use frames.
The frameset
element must implement the HTMLFrameSetElement
interface.
[Exposed=Window]
interface HTMLFrameSetElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString cols;
[CEReactions] attribute DOMString rows;
};
HTMLFrameSetElement includes WindowEventHandlers;
The cols
and rows
IDL attributes of the frameset
element must reflect the respective
content attributes of the same name.
The frameset
element exposes as event handler content attributes a
number of the event handlers of the Window
object. It also mirrors their
event handler IDL attributes.
The event handlers of the Window
object named by the
Window
-reflecting body element event handler set, exposed on the
frameset
element, replace the generic event handlers with the same names
normally supported by HTML elements.
The frame
element has a content navigable similar
to the iframe
element, but rendered within a frameset
element.
The frame
HTML element insertion steps, given
insertedNode, are:
If insertedNode is not in a document tree, then return.
If insertedNode's root's browsing context is null, then return.
Create a new child navigable for insertedNode.
Process the frame
attributes for insertedNode, with
initialInsertion set to true.
The frame
HTML element removing steps, given removedNode,
are to destroy a child navigable given removedNode.
Whenever a frame
element with a non-null content navigable has its
src
attribute set, changed, or removed, the user
agent must process the frame
attributes.
To process the frame
attributes for an element element, with
an optional boolean initialInsertion:
Let url be the result of running the shared attribute processing steps
for iframe
and frame
elements given element and
initialInsertion.
If url is null, then return.
If url matches about:blank
and
initialInsertion is true, then:
Fire an event named load
at element.
Return.
Navigate an iframe
or frame
given
element, url, and the empty string.
The frame
element potentially delays the load event.
The frame
element must implement the HTMLFrameElement
interface.
[Exposed=Window]
interface HTMLFrameElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString name;
[CEReactions] attribute DOMString scrolling;
[CEReactions] attribute USVString src;
[CEReactions] attribute DOMString frameBorder;
[CEReactions] attribute USVString longDesc;
[CEReactions] attribute boolean noResize;
readonly attribute Document? contentDocument;
readonly attribute WindowProxy? contentWindow;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth;
};
The name
, scrolling
, and
src
IDL attributes
of the frame
element must reflect the respective content attributes of
the same name. For the purposes of reflection, the frame
element's src
content attribute is defined as containing a
URL.
The frameBorder
IDL attribute of the frame
element must reflect the element's frameborder
content attribute.
The longDesc
IDL attribute of the frame
element
must reflect the element's longdesc
content attribute, which for the purposes of
reflection is defined as containing a URL.
The noResize
IDL attribute of the frame
element
must reflect the element's noresize
content attribute.
The marginHeight
IDL attribute of the frame
element must reflect the element's marginheight
content attribute.
The marginWidth
IDL attribute of the frame
element must reflect the element's marginwidth
content attribute.
The contentDocument
getter steps are to return
this's content document.
The contentWindow
getter steps are to return
this's content window.
User agents must treat acronym
elements in a manner
equivalent to abbr
elements in terms of semantics and
for purposes of rendering.
partial interface HTMLAnchorElement {
[CEReactions] attribute DOMString coords;
[CEReactions] attribute DOMString charset;
[CEReactions] attribute DOMString name;
[CEReactions] attribute DOMString rev;
[CEReactions] attribute DOMString shape;
};
The coords
,
charset
, name
, rev
, and shape
IDL attributes of the
a
element must reflect the respective content attributes of the same
name.
partial interface HTMLAreaElement {
[CEReactions] attribute boolean noHref;
};
The noHref
IDL
attribute of the area
element must reflect the element's nohref
content attribute.
partial interface HTMLBodyElement {
[CEReactions] attribute [LegacyNullToEmptyString] DOMString text;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString link;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString vLink;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString aLink;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
[CEReactions] attribute DOMString background;
};
The text
IDL
attribute of the body
element must reflect the element's text
content attribute.
The link
IDL
attribute of the body
element must reflect the element's link
content attribute.
The aLink
IDL
attribute of the body
element must reflect the element's alink
content attribute.
The vLink
IDL
attribute of the body
element must reflect the element's vlink
content attribute.
The bgColor
IDL attribute of the body
element must reflect the element's bgcolor
content attribute.
The background
IDL attribute of the body
element must reflect the element's background
content attribute. (The background
content is not
defined to contain a URL, despite rules regarding its handling in the Rendering
section above.)
partial interface HTMLBRElement {
[CEReactions] attribute DOMString clear;
};
The clear
IDL
attribute of the br
element must reflect the content attribute of the
same name.
partial interface HTMLTableCaptionElement {
[CEReactions] attribute DOMString align;
};
The align
IDL attribute of the caption
element
must reflect the content attribute of the same name.
partial interface HTMLTableColElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString ch;
[CEReactions] attribute DOMString chOff;
[CEReactions] attribute DOMString vAlign;
[CEReactions] attribute DOMString width;
};
The align
and width
IDL
attributes of the col
element must reflect the respective content
attributes of the same name.
The ch
IDL
attribute of the col
element must reflect the element's char
content attribute.
The chOff
IDL attribute of the col
element must reflect the element's charoff
content attribute.
The vAlign
IDL attribute of the col
element must reflect the element's valign
content attribute.
User agents must treat dir
elements in a manner equivalent to ul
elements in terms of semantics and for purposes of rendering.
The dir
element must implement the HTMLDirectoryElement
interface.
[Exposed=Window]
interface HTMLDirectoryElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean compact;
};
The compact
IDL attribute of the dir
element must
reflect the content attribute of the same name.
partial interface HTMLDivElement {
[CEReactions] attribute DOMString align;
};
The align
IDL
attribute of the div
element must reflect the content attribute of the
same name.
partial interface HTMLDListElement {
[CEReactions] attribute boolean compact;
};
The compact
IDL attribute of the dl
element must reflect the content attribute of
the same name.
partial interface HTMLEmbedElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString name;
};
The name
and
align
IDL
attributes of the embed
element must reflect the respective content
attributes of the same name.
The font
element must implement the HTMLFontElement
interface.
[Exposed=Window]
interface HTMLFontElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute [LegacyNullToEmptyString] DOMString color;
[CEReactions] attribute DOMString face;
[CEReactions] attribute DOMString size;
};
The color
, face
, and size
IDL attributes of the
font
element must reflect the respective content attributes of the same
name.
partial interface HTMLHeadingElement {
[CEReactions] attribute DOMString align;
};
The align
IDL
attribute of the h1
–h6
elements must reflect the
content attribute of the same name.
The profile
IDL attribute on head
elements (with
the HTMLHeadElement
interface) is intentionally omitted. Unless so required by another applicable specification, implementations
would therefore not support this attribute. (It is mentioned here as it was defined in a previous
version of DOM.)
partial interface HTMLHRElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString color;
[CEReactions] attribute boolean noShade;
[CEReactions] attribute DOMString size;
[CEReactions] attribute DOMString width;
};
The align
, color
, size
, and width
IDL attributes of the
hr
element must reflect the respective content attributes of the same
name.
The noShade
IDL
attribute of the hr
element must reflect the element's noshade
content attribute.
partial interface HTMLHtmlElement {
[CEReactions] attribute DOMString version;
};
The version
IDL attribute of the html
element must reflect the content attribute of
the same name.
partial interface HTMLIFrameElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString scrolling;
[CEReactions] attribute DOMString frameBorder;
[CEReactions] attribute USVString longDesc;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString marginHeight;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString marginWidth;
};
The align
and scrolling
IDL attributes of the iframe
element must reflect the respective content attributes of the same name.
The frameBorder
IDL attribute of the iframe
element must reflect the element's frameborder
content attribute.
The longDesc
IDL attribute of the iframe
element must reflect the element's longdesc
content attribute, which for the purposes of
reflection is defined as containing a URL.
The marginHeight
IDL attribute of the
iframe
element must reflect the element's marginheight
content attribute.
The marginWidth
IDL attribute of the iframe
element must reflect the element's marginwidth
content attribute.
partial interface HTMLImageElement {
[CEReactions] attribute DOMString name;
[CEReactions] attribute USVString lowsrc;
[CEReactions] attribute DOMString align;
[CEReactions] attribute unsigned long hspace;
[CEReactions] attribute unsigned long vspace;
[CEReactions] attribute USVString longDesc;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString border;
};
The name
, align
, border
, hspace
, and vspace
IDL attributes of the
img
element must reflect the respective content attributes of the same
name.
The longDesc
IDL attribute of the img
element must reflect the element's longdesc
content attribute, which for the purposes of reflection
is defined as containing a URL.
The lowsrc
IDL
attribute of the img
element must reflect the element's lowsrc
content attribute, which for the purposes of reflection is
defined as containing a URL.
partial interface HTMLInputElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString useMap;
};
The align
IDL
attribute of the input
element must reflect the content attribute of the
same name.
The useMap
IDL attribute of the input
element must reflect the element's usemap
content attribute.
partial interface HTMLLegendElement {
[CEReactions] attribute DOMString align;
};
The align
IDL attribute of the legend
element must reflect the content attribute
of the same name.
partial interface HTMLLIElement {
[CEReactions] attribute DOMString type;
};
The type
IDL
attribute of the li
element must reflect the content attribute of the
same name.
partial interface HTMLLinkElement {
[CEReactions] attribute DOMString charset;
[CEReactions] attribute DOMString rev;
[CEReactions] attribute DOMString target;
};
The charset
,
rev
, and target
IDL attributes
of the link
element must reflect the respective content attributes of
the same name.
User agents must treat listing
elements in a manner equivalent to pre
elements in terms of semantics and for purposes of rendering.
partial interface HTMLMenuElement {
[CEReactions] attribute boolean compact;
};
The compact
IDL attribute of the menu
element must reflect the content attribute of
the same name.
partial interface HTMLMetaElement {
[CEReactions] attribute DOMString scheme;
};
User agents may treat the scheme
content attribute on the
meta
element as an extension of the element's name
content attribute when processing a meta
element
with a name
attribute whose value is one that the user agent
recognizes as supporting the scheme
attribute.
User agents are encouraged to ignore the scheme
attribute
and instead process the value given to the metadata name as if it had been specified for each
expected value of the scheme
attribute.
For example, if the user agent acts on meta
elements with name
attributes having the value "eGMS.subject.keyword", and knows
that the scheme
attribute is used with this metadata name,
then it could take the scheme
attribute into account,
acting as if it was an extension of the name
attribute. Thus
the following two meta
elements could be treated as two elements giving values for
two different metadata names, one consisting of a combination of "eGMS.subject.keyword" and
"LGCL", and the other consisting of a combination of "eGMS.subject.keyword" and "ORLY":
<!-- this markup is invalid -->
<meta name="eGMS.subject.keyword" scheme="LGCL" content="Abandoned vehicles">
<meta name="eGMS.subject.keyword" scheme="ORLY" content="Mah car: kthxbye">
The suggested processing of this markup, however, would be equivalent to the following:
<meta name="eGMS.subject.keyword" content="Abandoned vehicles">
<meta name="eGMS.subject.keyword" content="Mah car: kthxbye">
The scheme
IDL
attribute of the meta
element must reflect the content attribute of the
same name.
partial interface HTMLObjectElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString archive;
[CEReactions] attribute DOMString code;
[CEReactions] attribute boolean declare;
[CEReactions] attribute unsigned long hspace;
[CEReactions] attribute DOMString standby;
[CEReactions] attribute unsigned long vspace;
[CEReactions] attribute DOMString codeBase;
[CEReactions] attribute DOMString codeType;
[CEReactions] attribute DOMString useMap;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString border;
};
The align
,
archive
,
border
, code
, declare
, hspace
, standby
, and vspace
IDL attributes of the
object
element must reflect the respective content attributes of the
same name.
The codeBase
IDL attribute of the object
element must reflect the element's codebase
content attribute, which for the purposes of
reflection is defined as containing a URL.
The codeType
IDL attribute of the object
element must reflect the element's codetype
content attribute.
The useMap
IDL attribute must reflect the usemap
content attribute.
partial interface HTMLOListElement {
[CEReactions] attribute boolean compact;
};
The compact
IDL attribute of the ol
element must reflect the content attribute of
the same name.
partial interface HTMLParagraphElement {
[CEReactions] attribute DOMString align;
};
The align
IDL
attribute of the p
element must reflect the content attribute of the
same name.
The param
element must implement the HTMLParamElement
interface.
[Exposed=Window]
interface HTMLParamElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute DOMString name;
[CEReactions] attribute DOMString value;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString valueType;
};
The name
,
value
, and type
IDL attributes
of the param
element must reflect the respective content attributes of
the same name.
The valueType
IDL attribute of the param
element must reflect the element's valuetype
content
attribute.
User agents must treat plaintext
elements in a manner equivalent to
pre
elements in terms of semantics and for purposes of rendering. (The parser has
special behavior for this element, though.)
partial interface HTMLPreElement {
[CEReactions] attribute long width;
};
The width
IDL
attribute of the pre
element must reflect the content attribute of the
same name.
partial interface HTMLStyleElement {
[CEReactions] attribute DOMString type;
};
The type
IDL
attribute of the style
element must reflect the element's type
content attribute.
partial interface HTMLScriptElement {
[CEReactions] attribute DOMString charset;
[CEReactions] attribute DOMString event;
[CEReactions] attribute DOMString htmlFor;
};
The charset
and event
IDL attributes of the script
element
must reflect the respective content attributes of the same name.
The htmlFor
IDL attribute of the script
element
must reflect the element's for
content
attribute.
partial interface HTMLTableElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString border;
[CEReactions] attribute DOMString frame;
[CEReactions] attribute DOMString rules;
[CEReactions] attribute DOMString summary;
[CEReactions] attribute DOMString width;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString cellPadding;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString cellSpacing;
};
The align
,
border
, frame
, summary
, rules
, and width
, IDL attributes of the
table
element must reflect the respective content attributes of the same
name.
The bgColor
IDL attribute of the table
element must reflect the element's bgcolor
content attribute.
The cellPadding
IDL attribute of the table
element must reflect the element's cellpadding
content attribute.
The cellSpacing
IDL attribute of the table
element must reflect the element's cellspacing
content attribute.
partial interface HTMLTableSectionElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString ch;
[CEReactions] attribute DOMString chOff;
[CEReactions] attribute DOMString vAlign;
};
The align
IDL attribute of the tbody
,
thead
, and tfoot
elements must reflect the content
attribute of the same name.
The ch
IDL attribute of the tbody
, thead
, and tfoot
elements must
reflect the elements' char
content
attributes.
The chOff
IDL attribute of the tbody
,
thead
, and tfoot
elements must reflect the elements' charoff
content attributes.
The vAlign
IDL attribute of the tbody
,
thead
, and tfoot
element must reflect the elements' valign
content attributes.
partial interface HTMLTableCellElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString axis;
[CEReactions] attribute DOMString height;
[CEReactions] attribute DOMString width;
[CEReactions] attribute DOMString ch;
[CEReactions] attribute DOMString chOff;
[CEReactions] attribute boolean noWrap;
[CEReactions] attribute DOMString vAlign;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
};
The align
,
axis
, height
, and width
IDL
attributes of the td
and th
elements must reflect the
respective content attributes of the same name.
The ch
IDL
attribute of the td
and th
elements must reflect the
elements' char
content attributes.
The chOff
IDL attribute of the td
and th
elements must reflect the
elements' charoff
content attributes.
The noWrap
IDL attribute of the td
and
th
elements must reflect the elements' nowrap
content attributes.
The vAlign
IDL attribute of the td
and
th
elements must reflect the elements' valign
content attributes.
The bgColor
IDL attribute of the td
and
th
elements must reflect the elements' bgcolor
content attributes.
partial interface HTMLTableRowElement {
[CEReactions] attribute DOMString align;
[CEReactions] attribute DOMString ch;
[CEReactions] attribute DOMString chOff;
[CEReactions] attribute DOMString vAlign;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
};
The align
IDL
attribute of the tr
element must reflect the content attribute of the
same name.
The ch
IDL
attribute of the tr
element must reflect the element's char
content attribute.
The chOff
IDL
attribute of the tr
element must reflect the element's charoff
content attribute.
The vAlign
IDL attribute of the tr
element must reflect the element's valign
content attribute.
The bgColor
IDL attribute of the tr
element must reflect the element's bgcolor
content attribute.
partial interface HTMLUListElement {
[CEReactions] attribute boolean compact;
[CEReactions] attribute DOMString type;
};
The compact
and type
IDL
attributes of the ul
element must reflect the respective content
attributes of the same name.
User agents must treat xmp
elements in a manner equivalent to pre
elements in terms of semantics and for purposes of rendering. (The parser has special behavior for
this element though.)
partial interface Document {
[CEReactions] attribute [LegacyNullToEmptyString] DOMString fgColor;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString linkColor;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString vlinkColor;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString alinkColor;
[CEReactions] attribute [LegacyNullToEmptyString] DOMString bgColor;
[SameObject] readonly attribute HTMLCollection anchors;
[SameObject] readonly attribute HTMLCollection applets;
undefined clear();
undefined captureEvents();
undefined releaseEvents();
[SameObject] readonly attribute HTMLAllCollection all;
};
The attributes of the Document
object listed in the first column of the following
table must reflect the content attribute on the body element with the
name given in the corresponding cell in the second column on the same row, if the body
element is a body
element (as opposed to a frameset
element).
When there is no body element or if it is a
frameset
element, the attributes must instead return the empty string on getting and
do nothing on setting.
IDL attribute | Content attribute |
---|---|
fgColor
| text
|
linkColor
| link
|
vlinkColor
| vlink
|
alinkColor
| alink
|
bgColor
| bgcolor
|
The anchors
attribute must return an HTMLCollection
rooted at the Document
node,
whose filter matches only a
elements with name
attributes.
The applets
attribute must return an HTMLCollection
rooted at the Document
node,
whose filter matches nothing. (It exists for historical reasons.)
The clear()
,
captureEvents()
,
and releaseEvents()
methods must do nothing.
The all
attribute
must return an HTMLAllCollection
rooted at the Document
node, whose
filter matches all elements.
partial interface Window {
undefined captureEvents();
undefined releaseEvents();
[Replaceable, SameObject] readonly attribute External external;
};
The captureEvents()
and releaseEvents()
methods must do nothing.
The external
attribute of
the Window
interface must return an instance of the External
interface:
[Exposed=Window]
interface External {
undefined AddSearchProvider();
undefined IsSearchProviderInstalled();
};
The AddSearchProvider()
and IsSearchProviderInstalled()
methods
must do nothing.
text/html
This registration is for community review and will be submitted to the IESG for review, approval, and registration with IANA.
charset
The charset
parameter may be provided to specify the
document's character encoding, overriding any character encoding declarations in the document other than a Byte Order
Mark (BOM). The parameter's value must be an ASCII case-insensitive match for the
string "utf-8
". ENCODING
Entire novels have been written about the security considerations that apply to HTML documents. Many are listed in this document, to which the reader is referred for more details. Some general concerns bear mentioning here, however:
HTML is scripted language, and has a large number of APIs (some of which are described in this document). Script can expose the user to potential risks of information leakage, credential leakage, cross-site scripting attacks, cross-site request forgeries, and a host of other problems. While the designs in this specification are intended to be safe if implemented correctly, a full implementation is a massive undertaking and, as with any software, user agents are likely to have security bugs.
Even without scripting, there are specific features in HTML which, for historical reasons,
are required for broad compatibility with legacy content but that expose the user to unfortunate
security problems. In particular, the img
element can be used in conjunction with
some other features as a way to effect a port scan from the user's location on the Internet.
This can expose local network topologies that the attacker would otherwise not be able to
determine.
HTML relies on a compartmentalization scheme sometimes known as the same-origin policy. An origin in most cases consists of all the pages served from the same host, on the same port, using the same protocol.
It is critical, therefore, to ensure that any untrusted content that forms part of a site be hosted on a different origin than any sensitive content on that site. Untrusted content can easily spoof any other page on the same origin, read data from that origin, cause scripts in that origin to execute, submit forms to and from that origin even if they are protected from cross-site request forgery attacks by unique tokens, and make use of any third-party resources exposed to or rights granted to that origin.
html
" and "htm
"
are commonly, but certainly not exclusively, used as the
extension for HTML documents.TEXT
Fragments used with text/html
resources
either refer to the indicated part of the corresponding Document
, or
provide state information for in-page scripts.
multipart/x-mixed-replace
This registration is for community review and will be submitted to the IESG for review, approval, and registration with IANA.
boundary
(defined in RFC2046) RFC2046
multipart/x-mixed-replace
resource can be of any type, including types with non-trivial
security implications such as text/html
.
multipart/mixed
. RFC2046
multipart/x-mixed-replace
resource.Fragments used with
multipart/x-mixed-replace
resources apply to each body part as defined by the type
used by that body part.
application/xhtml+xml
This registration is for community review and will be submitted to the IESG for review, approval, and registration with IANA.
application/xml
RFC7303application/xml
RFC7303application/xml
RFC7303application/xml
RFC7303application/xml
RFC7303application/xhtml+xml
type asserts that the
resource is an XML document that likely has a document element from the HTML
namespace. Thus, the relevant specifications are XML, Namespaces in
XML, and this specification. XML XMLNSapplication/xml
RFC7303application/xml
RFC7303xhtml
" and "xht
" are sometimes used as
extensions for XML resources that have a document element from the HTML
namespace.TEXT
Fragments used with
application/xhtml+xml
resources have the same semantics as with any
XML MIME type. RFC7303
text/ping
This registration is for community review and will be submitted to the IESG for review, approval, and registration with IANA.
charset
The charset
parameter may be provided. The parameter's value must be
"utf-8
". This parameter serves no purpose; it is only allowed for
compatibility with legacy servers.
If used exclusively in the fashion described in the context of hyperlink auditing, this type introduces no new security concerns.
text/ping
resources always consist of the four
bytes 0x50 0x49 0x4E 0x47 (`PING
`).ping
attribute.Fragments have no meaning with
text/ping
resources.
application/microdata+json
This registration is for community review and will be submitted to the IESG for review, approval, and registration with IANA.
application/json
JSONapplication/json
JSONapplication/json
JSONapplication/json
JSONapplication/microdata+json
type asserts that the
resource is a JSON text that consists of an object with a single entry called "items
" consisting of an array of entries, each of which consists of an object
with an entry called "id
" whose value is a string, an entry called "type
" whose value is another string, and an entry called "properties
" whose value is an object whose entries each have a value consisting
of an array of either objects or strings, the objects being of the same form as the objects in
the aforementioned "items
" entry. Thus, the relevant specifications are
JSON and this specification. JSON
Applications that transfer data intended for use with HTML's microdata feature, especially in the context of drag-and-drop, are the primary application class for this type.
Fragments used with
application/microdata+json
resources have the same semantics as when used with
application/json
(namely, at the time of writing, no semantics at all).
JSON
text/event-stream
This registration is for community review and will be submitted to the IESG for review, approval, and registration with IANA.
charset
The charset
parameter may be provided. The parameter's value must be
"utf-8
". This parameter serves no purpose; it is only allowed for
compatibility with legacy servers.
An event stream from an origin distinct from the origin of the content consuming the event stream can result in information leakage. To avoid this, user agents are required to apply CORS semantics. FETCH
Event streams can overwhelm a user agent; a user agent is expected to apply suitable restrictions to avoid depleting local resources because of an overabundance of information from an event stream.
Servers can be overwhelmed if a situation develops in which the server is causing clients to reconnect rapidly. Servers should use a 5xx status code to indicate capacity problems, as this will prevent conforming clients from reconnecting automatically.
Fragments have no meaning with
text/event-stream
resources.
web+
scheme prefixThis section describes a convention for use with the IANA URI scheme registry. It does not itself register a specific scheme. RFC7595
web+
" followed by one or more letters in the range
a
-z
.
web+
" schemes should use UTF-8 encodings where relevant.web+
" schemes. As
such, these schemes must not be used for features intended to be core platform features (e.g.,
HTTP). Similarly, such schemes must not store confidential information in their URLs, such as
usernames, passwords, personal information, or confidential project names.
The following sections only cover conforming elements and features.
Element | Description | Categories | Parents† | Children | Attributes | Interface |
---|---|---|---|---|---|---|
a |
Hyperlink | flow; phrasing*; interactive; palpable | phrasing | transparent* | globals;
href ;
target ;
download ;
ping ;
rel ;
hreflang ;
type ;
referrerpolicy |
HTMLAnchorElement |
abbr |
Abbreviation | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
address |
Contact information for a page or article element |
flow; palpable | flow | flow* | globals | HTMLElement |
area |
Hyperlink or dead area on an image map | flow; phrasing | phrasing* | empty | globals;
alt ;
coords ;
shape ;
href ;
target ;
download ;
ping ;
rel ;
referrerpolicy |
HTMLAreaElement |
article |
Self-contained syndicatable or reusable composition | flow; sectioning; palpable | flow | flow | globals | HTMLElement |
aside |
Sidebar for tangentially related content | flow; sectioning; palpable | flow | flow | globals | HTMLElement |
audio |
Audio player | flow; phrasing; embedded; interactive; palpable* | phrasing | source *;
track *;
transparent* |
globals;
src ;
crossorigin ;
preload ;
autoplay ;
loop ;
muted ;
controls |
HTMLAudioElement |
b |
Keywords | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
base |
Base URL and default target navigable for hyperlinks and forms | metadata | head |
empty | globals;
href ;
target |
HTMLBaseElement |
bdi |
Text directionality isolation | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
bdo |
Text directionality formatting | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
blockquote |
A section quoted from another source | flow; palpable | flow | flow | globals;
cite |
HTMLQuoteElement |
body |
Document body | none | html |
flow | globals;
onafterprint ;
onbeforeprint ;
onbeforeunload ;
onhashchange ;
onlanguagechange ;
onmessage ;
onmessageerror ;
onoffline ;
ononline ;
onpageswap ;
onpagehide ;
onpagereveal ;
onpageshow ;
onpopstate ;
onrejectionhandled ;
onstorage ;
onunhandledrejection ;
onunload |
HTMLBodyElement |
br |
Line break, e.g. in poem or postal address | flow; phrasing | phrasing | empty | globals | HTMLBRElement |
button |
Button control | flow; phrasing; interactive; listed; labelable; submittable; form-associated; palpable | phrasing | phrasing* | globals;
disabled ;
form ;
formaction ;
formenctype ;
formmethod ;
formnovalidate ;
formtarget ;
name ;
popovertarget ;
popovertargetaction ;
type ;
value |
HTMLButtonElement |
canvas |
Scriptable bitmap canvas | flow; phrasing; embedded; palpable | phrasing | transparent | globals;
width ;
height |
HTMLCanvasElement |
caption |
Table caption | none | table |
flow* | globals | HTMLTableCaptionElement |
cite |
Title of a work | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
code |
Computer code | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
col |
Table column | none | colgroup |
empty | globals;
span |
HTMLTableColElement |
colgroup |
Group of columns in a table | none | table |
col *;
template * |
globals;
span |
HTMLTableColElement |
data |
Machine-readable equivalent | flow; phrasing; palpable | phrasing | phrasing | globals;
value |
HTMLDataElement |
datalist |
Container for options for combo box control | flow; phrasing | phrasing | phrasing*;
option *;
script-supporting elements* |
globals | HTMLDataListElement |
dd |
Content for corresponding dt element(s) |
none | dl ;
div * |
flow | globals | HTMLElement |
del |
A removal from the document | flow; phrasing*; palpable | phrasing | transparent | globals;
cite ;
datetime |
HTMLModElement |
details |
Disclosure control for hiding details | flow; interactive; palpable | flow | summary *;
flow |
globals;
name ;
open |
HTMLDetailsElement |
dfn |
Defining instance | flow; phrasing; palpable | phrasing | phrasing* | globals | HTMLElement |
dialog |
Dialog box or window | flow | flow | flow | globals;
open |
HTMLDialogElement |
div |
Generic flow container, or container for name-value groups in dl elements |
flow; palpable | flow;
dl |
flow | globals | HTMLDivElement |
dl |
Association list consisting of zero or more name-value groups | flow; palpable | flow | dt *;
dd *;
div *;
script-supporting elements |
globals | HTMLDListElement |
dt |
Legend for corresponding dd element(s) |
none | dl ;
div * |
flow* | globals | HTMLElement |
em |
Stress emphasis | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
embed |
Plugin | flow; phrasing; embedded; interactive; palpable | phrasing | empty | globals;
src ;
type ;
width ;
height ;
any* |
HTMLEmbedElement |
fieldset |
Group of form controls | flow; listed; form-associated; palpable | flow | legend *;
flow |
globals;
disabled ;
form ;
name |
HTMLFieldSetElement |
figcaption |
Caption for figure |
none | figure |
flow | globals | HTMLElement |
figure |
Figure with optional caption | flow; palpable | flow | figcaption *;
flow |
globals | HTMLElement |
footer |
Footer for a page or section | flow; palpable | flow | flow* | globals | HTMLElement |
form |
User-submittable form | flow; palpable | flow | flow* | globals;
accept-charset ;
action ;
autocomplete ;
enctype ;
method ;
name ;
novalidate ;
rel ;
target |
HTMLFormElement |
h1 , h2 , h3 , h4 , h5 , h6 |
Heading | flow; heading; palpable | legend ;
summary ;
flow |
phrasing | globals | HTMLHeadingElement |
head |
Container for document metadata | none | html |
metadata content* | globals | HTMLHeadElement |
header |
Introductory or navigational aids for a page or section | flow; palpable | flow | flow* | globals | HTMLElement |
hgroup |
Heading container | flow; palpable |
legend ;
summary ;
flow |
h1 ;
h2 ;
h3 ;
h4 ;
h5 ;
h6 ;
script-supporting elements |
globals | HTMLElement |
hr |
Thematic break | flow | flow | empty | globals | HTMLHRElement |
html |
Root element | none | none* | head *;
body * |
globals;
manifest |
HTMLHtmlElement |
i |
Alternate voice | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
iframe |
Child navigable | flow; phrasing; embedded; interactive; palpable | phrasing | empty | globals;
src ;
srcdoc ;
name ;
sandbox ;
allow ;
allowfullscreen ;
width ;
height ;
referrerpolicy ;
loading |
HTMLIFrameElement |
img |
Image | flow; phrasing; embedded; interactive*; form-associated; palpable | phrasing;
picture |
empty | globals;
alt ;
src ;
srcset ;
sizes ;
crossorigin ;
usemap ;
ismap ;
width ;
height ;
referrerpolicy ;
decoding ;
loading ;
fetchpriority |
HTMLImageElement |
input |
Form control | flow; phrasing; interactive*; listed; labelable; submittable; resettable; form-associated; palpable* | phrasing | empty | globals;
accept ;
alpha ;
alt ;
autocomplete ;
checked ;
colorspace ;
dirname ;
disabled ;
form ;
formaction ;
formenctype ;
formmethod ;
formnovalidate ;
formtarget ;
height ;
list ;
max ;
maxlength ;
min ;
minlength ;
multiple ;
name ;
pattern ;
placeholder ;
popovertarget ;
popovertargetaction ;
readonly ;
required ;
size ;
src ;
step ;
type ;
value ;
width |
HTMLInputElement |
ins |
An addition to the document | flow; phrasing*; palpable | phrasing | transparent | globals;
cite ;
datetime |
HTMLModElement |
kbd |
User input | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
label |
Caption for a form control | flow; phrasing; interactive; palpable | phrasing | phrasing* | globals;
for |
HTMLLabelElement |
legend |
Caption for fieldset |
none | fieldset |
phrasing; heading content | globals | HTMLLegendElement |
li |
List item | none | ol ;
ul ;
menu * |
flow | globals;
value * |
HTMLLIElement |
link |
Link metadata | metadata; flow*; phrasing* | head ;
noscript *;
phrasing* |
empty | globals;
href ;
crossorigin ;
rel ;
as ;
media ;
hreflang ;
type ;
sizes ;
imagesrcset ;
imagesizes ;
referrerpolicy ;
integrity ;
blocking ;
color ;
disabled ;
fetchpriority |
HTMLLinkElement |
main |
Container for the dominant contents of the document | flow; palpable | flow* | flow | globals | HTMLElement |
map |
Image map | flow; phrasing*; palpable | phrasing | transparent;
area * |
globals;
name |
HTMLMapElement |
mark |
Highlight | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
MathML math |
MathML root | flow; phrasing; embedded; palpable | phrasing | per MATHML | per MATHML | Element |
menu |
Menu of commands | flow; palpable* | flow | li ;
script-supporting elements |
globals | HTMLMenuElement |
meta |
Text metadata | metadata; flow*; phrasing* | head ;
noscript *;
phrasing* |
empty | globals;
name ;
http-equiv ;
content ;
charset ;
media |
HTMLMetaElement |
meter |
Gauge | flow; phrasing; labelable; palpable | phrasing | phrasing* | globals;
value ;
min ;
max ;
low ;
high ;
optimum |
HTMLMeterElement |
nav |
Section with navigational links | flow; sectioning; palpable | flow | flow | globals | HTMLElement |
noscript |
Fallback content for script | metadata; flow; phrasing | head *;
phrasing* |
varies* | globals | HTMLElement |
object |
Image, child navigable, or plugin | flow; phrasing; embedded; interactive*; listed; form-associated; palpable | phrasing | transparent | globals;
data ;
type ;
name ;
form ;
width ;
height |
HTMLObjectElement |
ol |
Ordered list | flow; palpable* | flow | li ;
script-supporting elements |
globals;
reversed ;
start ;
type |
HTMLOListElement |
optgroup |
Group of options in a list box | none | select |
option ;
script-supporting elements |
globals;
disabled ;
label |
HTMLOptGroupElement |
option |
Option in a list box or combo box control | none | select ;
datalist ;
optgroup |
text* | globals;
disabled ;
label ;
selected ;
value |
HTMLOptionElement |
output |
Calculated output value | flow; phrasing; listed; labelable; resettable; form-associated; palpable | phrasing | phrasing | globals;
for ;
form ;
name |
HTMLOutputElement |
p |
Paragraph | flow; palpable | flow | phrasing | globals | HTMLParagraphElement |
picture |
Image | flow; phrasing; embedded; palpable | phrasing | source *;
one img ;
script-supporting elements |
globals | HTMLPictureElement |
pre |
Block of preformatted text | flow; palpable | flow | phrasing | globals | HTMLPreElement |
progress |
Progress bar | flow; phrasing; labelable; palpable | phrasing | phrasing* | globals;
value ;
max |
HTMLProgressElement |
q |
Quotation | flow; phrasing; palpable | phrasing | phrasing | globals;
cite |
HTMLQuoteElement |
rp |
Parenthesis for ruby annotation text | none | ruby |
text | globals | HTMLElement |
rt |
Ruby annotation text | none | ruby |
phrasing | globals | HTMLElement |
ruby |
Ruby annotation(s) | flow; phrasing; palpable | phrasing | phrasing;
rt ;
rp * |
globals | HTMLElement |
s |
Inaccurate text | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
samp |
Computer output | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
script |
Embedded script | metadata; flow; phrasing; script-supporting | head ;
phrasing;
script-supporting |
script, data, or script documentation* | globals;
src ;
type ;
nomodule ;
async ;
defer ;
crossorigin ;
integrity ;
referrerpolicy ;
blocking ;
fetchpriority |
HTMLScriptElement |
search |
Container for search controls | flow; palpable | flow | flow | globals | HTMLElement |
section |
Generic document or application section | flow; sectioning; palpable | flow | flow | globals | HTMLElement |
select |
List box control | flow; phrasing; interactive; listed; labelable; submittable; resettable; form-associated; palpable | phrasing | option ;
optgroup ;
script-supporting elements |
globals;
autocomplete ;
disabled ;
form ;
multiple ;
name ;
required ;
size |
HTMLSelectElement |
slot |
Shadow tree slot | flow; phrasing | phrasing | transparent | globals;
name |
HTMLSlotElement |
small |
Side comment | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
source |
Image source for img or media source for video or audio |
none | picture ;
video ;
audio |
empty | globals;
type ;
media ;
src ;
srcset ;
sizes ;
width ;
height |
HTMLSourceElement |
span |
Generic phrasing container | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLSpanElement |
strong |
Importance | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
style |
Embedded styling information | metadata | head ;
noscript * |
text* | globals;
media ;
blocking |
HTMLStyleElement |
sub |
Subscript | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
summary |
Caption for details |
none | details |
phrasing; heading content | globals | HTMLElement |
sup |
Superscript | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
SVG svg |
SVG root | flow; phrasing; embedded; palpable | phrasing | per SVG | per SVG | SVGSVGElement |
table |
Table | flow; palpable | flow | caption *;
colgroup *;
thead *;
tbody *;
tfoot *;
tr *;
script-supporting elements |
globals | HTMLTableElement |
tbody |
Group of rows in a table | none | table |
tr ;
script-supporting elements |
globals | HTMLTableSectionElement |
td |
Table cell | none | tr |
flow | globals;
colspan ;
rowspan ;
headers |
HTMLTableCellElement |
template |
Template | metadata; flow; phrasing; script-supporting | metadata;
phrasing;
script-supporting;
colgroup * |
empty | globals;
shadowrootmode ;
shadowrootdelegatesfocus ;
shadowrootclonable ;
shadowrootserializable |
HTMLTemplateElement |
textarea |
Multiline text controls | flow; phrasing; interactive; listed; labelable; submittable; resettable; form-associated; palpable | phrasing | text | globals;
autocomplete ;
cols ;
dirname ;
disabled ;
form ;
maxlength ;
minlength ;
name ;
placeholder ;
readonly ;
required ;
rows ;
wrap |
HTMLTextAreaElement |
tfoot |
Group of footer rows in a table | none | table |
tr ;
script-supporting elements |
globals | HTMLTableSectionElement |
th |
Table header cell | interactive* | tr |
flow* | globals;
colspan ;
rowspan ;
headers ;
scope ;
abbr |
HTMLTableCellElement |
thead |
Group of heading rows in a table | none | table |
tr ;
script-supporting elements |
globals | HTMLTableSectionElement |
time |
Machine-readable equivalent of date- or time-related data | flow; phrasing; palpable | phrasing | phrasing | globals;
datetime |
HTMLTimeElement |
title |
Document title | metadata | head |
text* | globals | HTMLTitleElement |
tr |
Table row | none | table ;
thead ;
tbody ;
tfoot |
th *;
td ;
script-supporting elements |
globals | HTMLTableRowElement |
track |
Timed text track | none | audio ;
video |
empty | globals;
default ;
kind ;
label ;
src ;
srclang |
HTMLTrackElement |
u |
Unarticulated annotation | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
ul |
List | flow; palpable* | flow | li ;
script-supporting elements |
globals | HTMLUListElement |
var |
Variable | flow; phrasing; palpable | phrasing | phrasing | globals | HTMLElement |
video |
Video player | flow; phrasing; embedded; interactive; palpable | phrasing | source *;
track *;
transparent* |
globals;
src ;
crossorigin ;
poster ;
preload ;
autoplay ;
playsinline ;
loop ;
muted ;
controls ;
width ;
height |
HTMLVideoElement |
wbr |
Line breaking opportunity | flow; phrasing | phrasing | empty | globals | HTMLElement |
autonomous custom elements | Author-defined elements | flow; phrasing; palpable | flow; phrasing | transparent | globals; any, as decided by the element's author | Supplied by the element's author (inherits from HTMLElement ) |
An asterisk (*) in a cell indicates that the actual rules are more complicated than indicated in the table above.
† Categories in the "Parents" column refer to parents that list
the given categories in their content model, not to elements that themselves are in those
categories. For example, the a
element's "Parents" column says "phrasing", so any
element whose content model contains the "phrasing" category could be a parent of an
a
element. Since the "flow" category includes all the "phrasing" elements, that means
the th
element could be a parent to an a
element.
Category | Elements | Elements with exceptions |
---|---|---|
Metadata content |
base ;
link ;
meta ;
noscript ;
script ;
style ;
template ;
title
| — |
Flow content |
a ;
abbr ;
address ;
article ;
aside ;
audio ;
b ;
bdi ;
bdo ;
blockquote ;
br ;
button ;
canvas ;
cite ;
code ;
data ;
datalist ;
del ;
details ;
dfn ;
dialog ;
div ;
dl ;
em ;
embed ;
fieldset ;
figure ;
footer ;
form ;
h1 ;
h2 ;
h3 ;
h4 ;
h5 ;
h6 ;
header ;
hgroup ;
hr ;
i ;
iframe ;
img ;
input ;
ins ;
kbd ;
label ;
map ;
mark ;
MathML math ;
menu ;
meter ;
nav ;
noscript ;
object ;
ol ;
output ;
p ;
picture ;
pre ;
progress ;
q ;
ruby ;
s ;
samp ;
script ;
search ;
section ;
select ;
slot ;
small ;
span ;
strong ;
sub ;
sup ;
SVG svg ;
table ;
template ;
textarea ;
time ;
u ;
ul ;
var ;
video ;
wbr ;
autonomous custom elements;
Text
|
area (if it is a descendant of a map element);
link (if it is allowed in the body);
main (if it is a hierarchically correct main element);
meta (if the itemprop attribute is present)
|
Sectioning content |
article ;
aside ;
nav ;
section
| — |
Heading content |
h1 ;
h2 ;
h3 ;
h4 ;
h5 ;
h6 ;
hgroup
| — |
Phrasing content |
a ;
abbr ;
audio ;
b ;
bdi ;
bdo ;
br ;
button ;
canvas ;
cite ;
code ;
data ;
datalist ;
del ;
dfn ;
em ;
embed ;
i ;
iframe ;
img ;
input ;
ins ;
kbd ;
label ;
map ;
mark ;
MathML math ;
meter ;
noscript ;
object ;
output ;
picture ;
progress ;
q ;
ruby ;
s ;
samp ;
script ;
select ;
slot ;
small ;
span ;
strong ;
sub ;
sup ;
SVG svg ;
template ;
textarea ;
time ;
u ;
var ;
video ;
wbr ;
autonomous custom elements;
Text
|
area (if it is a descendant of a map element);
link (if it is allowed in the body);
meta (if the itemprop attribute is present)
|
Embedded content |
audio ;
canvas ;
embed ;
iframe ;
img ;
MathML math ;
object ;
picture ;
SVG svg ;
video
| — |
Interactive content |
button ;
details ;
embed ;
iframe ;
label ;
select ;
textarea
|
a (if the href attribute is present);
audio (if the controls attribute is present);
img (if the usemap attribute is present);
input (if the type attribute is not in the Hidden state);
video (if the controls attribute is present)
|
Form-associated elements |
button ;
fieldset ;
input ;
label ;
object ;
output ;
select ;
textarea ;
img ;
form-associated custom elements
| — |
Listed elements |
button ;
fieldset ;
input ;
object ;
output ;
select ;
textarea ;
form-associated custom elements
| — |
Submittable elements |
button ;
input ;
select ;
textarea ;
form-associated custom elements
| — |
Resettable elements |
input ;
output ;
select ;
textarea ;
form-associated custom elements
| — |
Autocapitalize-and-autocorrect inheriting elements |
button ;
fieldset ;
input ;
output ;
select ;
textarea
| — |
Labelable elements |
button ;
input ;
meter ;
output ;
progress ;
select ;
textarea ;
form-associated custom elements
| — |
Palpable content |
a ;
abbr ;
address ;
article ;
aside ;
b ;
bdi ;
bdo ;
blockquote ;
button ;
canvas ;
cite ;
code ;
data ;
del ;
details ;
dfn ;
div ;
em ;
embed ;
fieldset ;
figure ;
footer ;
form ;
h1 ;
h2 ;
h3 ;
h4 ;
h5 ;
h6 ;
header ;
hgroup ;
i ;
iframe ;
img ;
ins ;
kbd ;
label ;
main ;
map ;
mark ;
MathML math ;
meter ;
nav ;
object ;
output ;
p ;
picture ;
pre ;
progress ;
q ;
ruby ;
s ;
samp ;
search ;
section ;
select ;
small ;
span ;
strong ;
sub ;
sup ;
SVG svg ;
table ;
textarea ;
time ;
u ;
var ;
video ;
autonomous custom elements
|
audio (if the controls attribute is present);
dl (if the element's children include at least one name-value group);
input (if the type attribute is not in the Hidden state);
menu (if the element's children include at least one li element);
ol (if the element's children include at least one li element);
ul (if the element's children include at least one li element);
Text that is not inter-element whitespace
|
Script-supporting elements |
script ;
template
| — |
Attribute | Element(s) | Description | Value |
---|---|---|---|
abbr
| th
| Alternative label to use for the header cell when referencing the cell in other contexts | Text* |
accept
| input
| Hint for expected file type in file upload controls | Set of comma-separated tokens* consisting of valid MIME type strings with no parameters or audio/* , video/* , or image/*
|
accept-charset
| form
| Character encodings to use for form submission | ASCII case-insensitive match for "UTF-8 "
|
accesskey
| HTML elements | Keyboard shortcut to activate or focus element | Ordered set of unique space-separated tokens, none of which are identical to another, each consisting of one code point in length |
action
| form
| URL to use for form submission | Valid non-empty URL potentially surrounded by spaces |
allow
| iframe
| Permissions policy to be applied to the iframe 's contents
| Serialized permissions policy |
allowfullscreen
| iframe
| Whether to allow the iframe 's contents to use requestFullscreen()
| Boolean attribute |
alpha
| input
| Allow the color's alpha component to be set | Boolean attribute |
alt
| area ;
img ;
input
| Replacement text for use when images are not available | Text* |
as
| link
| Potential destination for a preload request (for rel ="preload " and rel ="modulepreload ")
| Potential destination, for rel ="preload "; script-like destination, for rel ="modulepreload "
|
async
| script
| Execute script when available, without blocking while fetching | Boolean attribute |
autocapitalize
| HTML elements | Recommended autocapitalization behavior (for supported input methods) | "on ";
"off ";
"none ";
"sentences ";
"words ";
"characters "
|
autocomplete
| form
| Default setting for autofill feature for controls in the form | "on "; "off "
|
autocomplete
| input ;
select ;
textarea
| Hint for form autofill feature | Autofill field name and related tokens* |
autocorrect
| HTML elements | Recommended autocorrection behavior (for supported input methods) | "on ";
"off "
|
autofocus
| HTML elements | Automatically focus the element when the page is loaded | Boolean attribute |
autoplay
| audio ;
video
| Hint that the media resource can be started automatically when the page is loaded | Boolean attribute |
blocking
| link ;
script ;
style
| Whether the element is potentially render-blocking | Unordered set of unique space-separated tokens* |
charset
| meta
| Character encoding declaration | "utf-8 "
|
checked
| input
| Whether the control is checked | Boolean attribute |
cite
| blockquote ;
del ;
ins ;
q
| Link to the source of the quotation or more information about the edit | Valid URL potentially surrounded by spaces |
class
| HTML elements | Classes to which the element belongs | Set of space-separated tokens |
color
| link
| Color to use when customizing a site's icon (for rel ="mask-icon ")
| CSS <color> |
colorspace
| input
| The color space of the serialized color | "limited-srgb ";
"display-p3 "
|
cols
| textarea
| Maximum number of characters per line | Valid non-negative integer greater than zero |
colspan
| td ;
th
| Number of columns that the cell is to span | Valid non-negative integer greater than zero |
content
| meta
| Value of the element | Text* |
contenteditable
| HTML elements | Whether the element is editable | "true "; "plaintext-only ";
"false "
|
controls
| audio ;
video
| Show user agent controls | Boolean attribute |
coords
| area
| Coordinates for the shape to be created in an image map | Valid list of floating-point numbers* |
crossorigin
| audio ;
img ;
link ;
script ;
video
| How the element handles crossorigin requests | "anonymous "; "use-credentials "
|
data
| object
| Address of the resource | Valid non-empty URL potentially surrounded by spaces |
datetime
| del ;
ins
| Date and (optionally) time of the change | Valid date string with optional time |
datetime
| time
| Machine-readable value | Valid month string, valid date string, valid yearless date string, valid time string, valid local date and time string, valid time-zone offset string, valid global date and time string, valid week string, valid non-negative integer, or valid duration string |
decoding
| img
| Decoding hint to use when processing this image for presentation | "sync ";
"async ";
"auto "
|
default
| track
| Enable the track if no other text track is more suitable | Boolean attribute |
defer
| script
| Defer script execution | Boolean attribute |
dir
| HTML elements | The text directionality of the element | "ltr "; "rtl "; "auto "
|
dir
| bdo
| The text directionality of the element | "ltr "; "rtl "
|
dirname
| input ;
textarea
| Name of form control to use for sending the element's directionality in form submission | Text* |
disabled
| button ;
input ;
optgroup ;
option ;
select ;
textarea ;
form-associated custom elements
| Whether the form control is disabled | Boolean attribute |
disabled
| fieldset
| Whether the descendant form controls, except any inside legend , are disabled
| Boolean attribute |
disabled
| link
| Whether the link is disabled | Boolean attribute |
download
| a ;
area
| Whether to download the resource instead of navigating to it, and its filename if so | Text |
draggable
| HTML elements | Whether the element is draggable | "true "; "false "
|
enctype
| form
| Entry list encoding type to use for form submission | "application/x-www-form-urlencoded "; "multipart/form-data "; "text/plain "
|
enterkeyhint
| HTML elements | Hint for selecting an enter key action | "enter ";
"done ";
"go ";
"next ";
"previous ";
"search ";
"send "
|
fetchpriority
| img ;
link ;
script
| Sets the priority for fetches initiated by the element | "auto ";
"high ";
"low "
|
for
| label
| Associate the label with form control | ID* |
for
| output
| Specifies controls from which the output was calculated | Unordered set of unique space-separated tokens consisting of IDs* |
form
| button ;
fieldset ;
input ;
object ;
output ;
select ;
textarea ;
form-associated custom elements
| Associates the element with a form element
| ID* |
formaction
| button ;
input
| URL to use for form submission | Valid non-empty URL potentially surrounded by spaces |
formenctype
| button ;
input
| Entry list encoding type to use for form submission | "application/x-www-form-urlencoded "; "multipart/form-data "; "text/plain "
|
formmethod
| button ;
input
| Variant to use for form submission | "GET ";
"POST ";
"dialog "
|
formnovalidate
| button ;
input
| Bypass form control validation for form submission | Boolean attribute |
formtarget
| button ;
input
| Navigable for form submission | Valid navigable target name or keyword |
headers
| td ;
th
| The header cells for this cell | Unordered set of unique space-separated tokens consisting of IDs* |
height
| canvas ;
embed ;
iframe ;
img ;
input ;
object ;
source (in picture );
video
| Vertical dimension | Valid non-negative integer |
hidden
| HTML elements | Whether the element is relevant | "until-found ";
"hidden ";
the empty string
|
high
| meter
| Low limit of high range | Valid floating-point number* |
href
| a ;
area
| Address of the hyperlink | Valid URL potentially surrounded by spaces |
href
| link
| Address of the hyperlink | Valid non-empty URL potentially surrounded by spaces |
href
| base
| Document base URL | Valid URL potentially surrounded by spaces |
hreflang
| a ;
link
| Language of the linked resource | Valid BCP 47 language tag |
http-equiv
| meta
| Pragma directive | "content-type ";
"default-style ";
"refresh ";
"x-ua-compatible ";
"content-security-policy "
|
id
| HTML elements | The element's ID | Text* |
imagesizes
| link
| Image sizes for different page layouts (for rel ="preload ")
| Valid source size list |
imagesrcset
| link
| Images to use in different situations, e.g., high-resolution displays, small monitors, etc. (for rel ="preload ")
| Comma-separated list of image candidate strings |
inert
| HTML elements | Whether the element is inert. | Boolean attribute |
inputmode
| HTML elements | Hint for selecting an input modality | "none ";
"text ";
"tel ";
"email ";
"url ";
"numeric ";
"decimal ";
"search "
|
integrity
| link ;
script
| Integrity metadata used in Subresource Integrity checks SRI | Text |
is
| HTML elements | Creates a customized built-in element | Valid custom element name of a defined customized built-in element |
ismap
| img
| Whether the image is a server-side image map | Boolean attribute |
itemid
| HTML elements | Global identifier for a microdata item | Valid URL potentially surrounded by spaces |
itemprop
| HTML elements | Property names of a microdata item | Unordered set of unique space-separated tokens consisting of valid absolute URLs, defined property names, or text* |
itemref
| HTML elements | Referenced elements | Unordered set of unique space-separated tokens consisting of IDs* |
itemscope
| HTML elements | Introduces a microdata item | Boolean attribute |
itemtype
| HTML elements | Item types of a microdata item | Unordered set of unique space-separated tokens consisting of valid absolute URLs* |
kind
| track
| The type of text track | "subtitles ";
"captions ";
"descriptions ";
"chapters ";
"metadata "
|
label
| optgroup ;
option ;
track
| User-visible label | Text |
lang
| HTML elements | Language of the element | Valid BCP 47 language tag or the empty string |
list
| input
| List of autocomplete options | ID* |
loading
| iframe ;
img
| Used when determining loading deferral | "lazy ";
"eager "
|
loop
| audio ;
video
| Whether to loop the media resource | Boolean attribute |
low
| meter
| High limit of low range | Valid floating-point number* |
max
| input
| Maximum value | Varies* |
max
| meter ;
progress
| Upper bound of range | Valid floating-point number* |
maxlength
| input ;
textarea
| Maximum length of value | Valid non-negative integer |
media
| link ;
meta ;
source ;
style
| Applicable media | Valid media query list |
method
| form
| Variant to use for form submission | "GET ";
"POST ";
"dialog "
|
min
| input
| Minimum value | Varies* |
min
| meter
| Lower bound of range | Valid floating-point number* |
minlength
| input ;
textarea
| Minimum length of value | Valid non-negative integer |
multiple
| input ;
select
| Whether to allow multiple values | Boolean attribute |
muted
| audio ;
video
| Whether to mute the media resource by default | Boolean attribute |
name
| button ;
fieldset ;
input ;
output ;
select ;
textarea ;
form-associated custom elements
| Name of the element to use for form submission and in the form.elements API
| Text* |
name
| details
| Name of group of mutually-exclusive details elements
| Text* |
name
| form
| Name of form to use in the document.forms API
| Text* |
name
| iframe ;
object
| Name of content navigable | Valid navigable target name or keyword |
name
| map
| Name of image map to reference from the usemap attribute
| Text* |
name
| meta
| Metadata name | Text* |
name
| slot
| Name of shadow tree slot | Text |
nomodule
| script
| Prevents execution in user agents that support module scripts | Boolean attribute |
nonce
| HTML elements | Cryptographic nonce used in Content Security Policy checks CSP | Text |
novalidate
| form
| Bypass form control validation for form submission | Boolean attribute |
open
| details
| Whether the details are visible | Boolean attribute |
open
| dialog
| Whether the dialog box is showing | Boolean attribute |
optimum
| meter
| Optimum value in gauge | Valid floating-point number* |
pattern
| input
| Pattern to be matched by the form control's value | Regular expression matching the JavaScript Pattern production |
ping
| a ;
area
| URLs to ping | Set of space-separated tokens consisting of valid non-empty URLs |
placeholder
| input ;
textarea
| User-visible label to be placed within the form control | Text* |
playsinline
| video
| Encourage the user agent to display video content within the element's playback area | Boolean attribute |
popover
| HTML elements | Makes the element a popover element | "auto ";
"manual ";
|
popovertarget
| button ;
input
| Targets a popover element to toggle, show, or hide | ID* |
popovertargetaction
| button ;
input
| Indicates whether a targeted popover element is to be toggled, shown, or hidden | "toggle ";
"show ";
"hide "
|
poster
| video
| Poster frame to show prior to video playback | Valid non-empty URL potentially surrounded by spaces |
preload
| audio ;
video
| Hints how much buffering the media resource will likely need | "none ";
"metadata ";
"auto "
|
readonly
| input ;
textarea
| Whether to allow the value to be edited by the user | Boolean attribute |
readonly
| form-associated custom elements | Affects willValidate , plus any behavior added by the custom element author
| Boolean attribute |
referrerpolicy
| a ;
area ;
iframe ;
img ;
link ;
script
| Referrer policy for fetches initiated by the element | Referrer policy |
rel
| a ;
area
| Relationship between the location in the document containing the hyperlink and the destination resource | Unordered set of unique space-separated tokens* |
rel
| link
| Relationship between the document containing the hyperlink and the destination resource | Unordered set of unique space-separated tokens* |
required
| input ;
select ;
textarea
| Whether the control is required for form submission | Boolean attribute |
reversed
| ol
| Number the list backwards | Boolean attribute |
rows
| textarea
| Number of lines to show | Valid non-negative integer greater than zero |
rowspan
| td ;
th
| Number of rows that the cell is to span | Valid non-negative integer |
sandbox
| iframe
| Security rules for nested content | Unordered set of unique space-separated tokens, ASCII case-insensitive, consisting of
|
scope
| th
| Specifies which cells the header cell applies to | "row ";
"col ";
"rowgroup ";
"colgroup "
|
selected
| option
| Whether the option is selected by default | Boolean attribute |
shadowrootclonable
| template
| Sets clonable on a declarative shadow root | Boolean attribute |
shadowrootdelegatesfocus
| template
| Sets delegates focus on a declarative shadow root | Boolean attribute |
shadowrootmode
| template
| Enables streaming declarative shadow roots | "open ";
"closed "
|
shadowrootserializable
| template
| Sets serializable on a declarative shadow root | Boolean attribute |
shape
| area
| The kind of shape to be created in an image map | "circle ";
"default ";
"poly ";
"rect "
|
size
| input ;
select
| Size of the control | Valid non-negative integer greater than zero |
sizes
| link
| Sizes of the icons (for rel ="icon ")
| Unordered set of unique space-separated tokens, ASCII case-insensitive, consisting of sizes* |
sizes
| img ;
source
| Image sizes for different page layouts | Valid source size list |
slot
| HTML elements | The element's desired slot | Text |
span
| col ;
colgroup
| Number of columns spanned by the element | Valid non-negative integer greater than zero |
spellcheck
| HTML elements | Whether the element is to have its spelling and grammar checked | "true ";
"false ";
the empty string
|
src
| audio ;
embed ;
iframe ;
img ;
input ;
script ;
source (in video or audio );
track ;
video
| Address of the resource | Valid non-empty URL potentially surrounded by spaces |
srcdoc
| iframe
| A document to render in the iframe
| The source of an iframe srcdoc document*
|
srclang
| track
| Language of the text track | Valid BCP 47 language tag |
srcset
| img ;
source
| Images to use in different situations, e.g., high-resolution displays, small monitors, etc. | Comma-separated list of image candidate strings |
start
| ol
| Starting value of the list | Valid integer |
step
| input
| Granularity to be matched by the form control's value | Valid floating-point number greater than zero, or "any "
|
style
| HTML elements | Presentational and formatting instructions | CSS declarations* |
tabindex
| HTML elements | Whether the element is focusable and sequentially focusable, and the relative order of the element for the purposes of sequential focus navigation | Valid integer |
target
| a ;
area
| Navigable for hyperlink navigation | Valid navigable target name or keyword |
target
| base
| Default navigable for hyperlink navigation and form submission | Valid navigable target name or keyword |
target
| form
| Navigable for form submission | Valid navigable target name or keyword |
title
| HTML elements | Advisory information for the element | Text |
title
| abbr ;
dfn
| Full term or expansion of abbreviation | Text |
title
| input
| Description of pattern (when used with pattern attribute)
| Text |
title
| link
| Title of the link | Text |
title
| link ;
style
| CSS style sheet set name | Text |
translate
| HTML elements | Whether the element is to be translated when the page is localized | "yes "; "no "
|
type
| a ;
link
| Hint for the type of the referenced resource | Valid MIME type string |
type
| button
| Type of button | "submit ";
"reset ";
"button "
|
type
| embed ;
object ;
source
| Type of embedded resource | Valid MIME type string |
type
| input
| Type of form control | input type keyword
|
type
| ol
| Kind of list marker | "1 ";
"a ";
"A ";
"i ";
"I "
|
type
| script
| Type of script | "module "; a valid MIME type string that is not a JavaScript MIME type essence match
|
usemap
| img
| Name of image map to use | Valid hash-name reference* |
value
| button ;
option
| Value to be used for form submission | Text |
value
| data
| Machine-readable value | Text* |
value
| input
| Value of the form control | Varies* |
value
| li
| Ordinal value of the list item | Valid integer |
value
| meter ;
progress
| Current value of the element | Valid floating-point number |
width
| canvas ;
embed ;
iframe ;
img ;
input ;
object ;
source (in picture );
video
| Horizontal dimension | Valid non-negative integer |
wrap
| textarea
| How the value of the form control is to be wrapped for form submission | "soft ";
"hard "
|
writingsuggestions
| HTML elements | Whether the element can offer writing suggestions or not. | "true ";
"false ";
the empty string
|
An asterisk (*) in a cell indicates that the actual rules are more complicated than indicated in the table above.
Attribute | Element(s) | Description | Value |
---|---|---|---|
onafterprint
| body
| afterprint event handler for Window object
| Event handler content attribute |
onauxclick
| HTML elements | auxclick event handler
| Event handler content attribute |
onbeforeinput
| HTML elements | beforeinput event handler
| Event handler content attribute |
onbeforematch
| HTML elements | beforematch event handler
| Event handler content attribute |
onbeforeprint
| body
| beforeprint event handler for Window object
| Event handler content attribute |
onbeforeunload
| body
| beforeunload event handler for Window object
| Event handler content attribute |
onbeforetoggle
| HTML elements | beforetoggle event handler
| Event handler content attribute |
onblur
| HTML elements | blur event handler
| Event handler content attribute |
oncancel
| HTML elements | cancel event handler
| Event handler content attribute |
oncanplay
| HTML elements | canplay event handler
| Event handler content attribute |
oncanplaythrough
| HTML elements | canplaythrough event handler
| Event handler content attribute |
onchange
| HTML elements | change event handler
| Event handler content attribute |
onclick
| HTML elements | click event handler
| Event handler content attribute |
onclose
| HTML elements | close event handler
| Event handler content attribute |
oncontextlost
| HTML elements | contextlost event handler
| Event handler content attribute |
oncontextmenu
| HTML elements | contextmenu event handler
| Event handler content attribute |
oncontextrestored
| HTML elements | contextrestored event handler
| Event handler content attribute |
oncopy
| HTML elements | copy event handler
| Event handler content attribute |
oncuechange
| HTML elements | cuechange event handler
| Event handler content attribute |
oncut
| HTML elements | cut event handler
| Event handler content attribute |
ondblclick
| HTML elements | dblclick event handler
| Event handler content attribute |
ondrag
| HTML elements | drag event handler
| Event handler content attribute |
ondragend
| HTML elements | dragend event handler
| Event handler content attribute |
ondragenter
| HTML elements | dragenter event handler
| Event handler content attribute |
ondragleave
| HTML elements | dragleave event handler
| Event handler content attribute |
ondragover
| HTML elements | dragover event handler
| Event handler content attribute |
ondragstart
| HTML elements | dragstart event handler
| Event handler content attribute |
ondrop
| HTML elements | drop event handler
| Event handler content attribute |
ondurationchange
| HTML elements | durationchange event handler
| Event handler content attribute |
onemptied
| HTML elements | emptied event handler
| Event handler content attribute |
onended
| HTML elements | ended event handler
| Event handler content attribute |
onerror
| HTML elements | error event handler
| Event handler content attribute |
onfocus
| HTML elements | focus event handler
| Event handler content attribute |
onformdata
| HTML elements | formdata event handler
| Event handler content attribute |
onhashchange
| body
| hashchange event handler for Window object
| Event handler content attribute |
oninput
| HTML elements | input event handler
| Event handler content attribute |
oninvalid
| HTML elements | invalid event handler
| Event handler content attribute |
onkeydown
| HTML elements | keydown event handler
| Event handler content attribute |
onkeypress
| HTML elements | keypress event handler
| Event handler content attribute |
onkeyup
| HTML elements | keyup event handler
| Event handler content attribute |
onlanguagechange
| body
| languagechange event handler for Window object
| Event handler content attribute |
onload
| HTML elements | load event handler
| Event handler content attribute |
onloadeddata
| HTML elements | loadeddata event handler
| Event handler content attribute |
onloadedmetadata
| HTML elements | loadedmetadata event handler
| Event handler content attribute |
onloadstart
| HTML elements | loadstart event handler
| Event handler content attribute |
onmessage
| body
| message event handler for Window object
| Event handler content attribute |
onmessageerror
| body
| messageerror event handler for Window object
| Event handler content attribute |
onmousedown
| HTML elements | mousedown event handler
| Event handler content attribute |
onmouseenter
| HTML elements | mouseenter event handler
| Event handler content attribute |
onmouseleave
| HTML elements | mouseleave event handler
| Event handler content attribute |
onmousemove
| HTML elements | mousemove event handler
| Event handler content attribute |
onmouseout
| HTML elements | mouseout event handler
| Event handler content attribute |
onmouseover
| HTML elements | mouseover event handler
| Event handler content attribute |
onmouseup
| HTML elements | mouseup event handler
| Event handler content attribute |
onoffline
| body
| offline event handler for Window object
| Event handler content attribute |
ononline
| body
| online event handler for Window object
| Event handler content attribute |
onpagehide
| body
| pagehide event handler for Window object
| Event handler content attribute |
onpagereveal
| body
| pagereveal event handler for Window object
| Event handler content attribute |
onpageshow
| body
| pageshow event handler for Window object
| Event handler content attribute |
onpageswap
| body
| pageswap event handler for Window object
| Event handler content attribute |
onpaste
| HTML elements | paste event handler
| Event handler content attribute |
onpause
| HTML elements | pause event handler
| Event handler content attribute |
onplay
| HTML elements | play event handler
| Event handler content attribute |
onplaying
| HTML elements | playing event handler
| Event handler content attribute |
onpopstate
| body
| popstate event handler for Window object
| Event handler content attribute |
onprogress
| HTML elements | progress event handler
| Event handler content attribute |
onratechange
| HTML elements | ratechange event handler
| Event handler content attribute |
onreset
| HTML elements | reset event handler
| Event handler content attribute |
onresize
| HTML elements | resize event handler
| Event handler content attribute |
onrejectionhandled
| body
| rejectionhandled event handler for Window object
| Event handler content attribute |
onscroll
| HTML elements | scroll event handler
| Event handler content attribute |
onscrollend
| HTML elements | scrollend event handler
| Event handler content attribute |
onsecuritypolicyviolation
| HTML elements | securitypolicyviolation event handler
| Event handler content attribute |
onseeked
| HTML elements | seeked event handler
| Event handler content attribute |
onseeking
| HTML elements | seeking event handler
| Event handler content attribute |
onselect
| HTML elements | select event handler
| Event handler content attribute |
onslotchange
| HTML elements | slotchange event handler
| Event handler content attribute |
onstalled
| HTML elements | stalled event handler
| Event handler content attribute |
onstorage
| body
| storage event handler for Window object
| Event handler content attribute |
onsubmit
| HTML elements | submit event handler
| Event handler content attribute |
onsuspend
| HTML elements | suspend event handler
| Event handler content attribute |
ontimeupdate
| HTML elements | timeupdate event handler
| Event handler content attribute |
ontoggle
| HTML elements | toggle event handler
| Event handler content attribute |
onunhandledrejection
| body
| unhandledrejection event handler for Window object
| Event handler content attribute |
onunload
| body
| unload event handler for Window object
| Event handler content attribute |
onvolumechange
| HTML elements | volumechange event handler
| Event handler content attribute |
onwaiting
| HTML elements | waiting event handler
| Event handler content attribute |
onwheel
| HTML elements | wheel event handler
| Event handler content attribute |
Element(s) | Interface(s) |
---|---|
a
| HTMLAnchorElement : HTMLElement
|
abbr
| HTMLElement
|
address
| HTMLElement
|
area
| HTMLAreaElement : HTMLElement
|
article
| HTMLElement
|
aside
| HTMLElement
|
audio
| HTMLAudioElement : HTMLMediaElement : HTMLElement
|
b
| HTMLElement
|
base
| HTMLBaseElement : HTMLElement
|
bdi
| HTMLElement
|
bdo
| HTMLElement
|
blockquote
| HTMLQuoteElement : HTMLElement
|
body
| HTMLBodyElement : HTMLElement
|
br
| HTMLBRElement : HTMLElement
|
button
| HTMLButtonElement : HTMLElement
|
canvas
| HTMLCanvasElement : HTMLElement
|
caption
| HTMLTableCaptionElement : HTMLElement
|
cite
| HTMLElement
|
code
| HTMLElement
|
col
| HTMLTableColElement : HTMLElement
|
colgroup
| HTMLTableColElement : HTMLElement
|
data
| HTMLDataElement : HTMLElement
|
datalist
| HTMLDataListElement : HTMLElement
|
dd
| HTMLElement
|
del
| HTMLModElement : HTMLElement
|
details
| HTMLDetailsElement : HTMLElement
|
dfn
| HTMLElement
|
dialog
| HTMLDialogElement : HTMLElement
|
div
| HTMLDivElement : HTMLElement
|
dl
| HTMLDListElement : HTMLElement
|
dt
| HTMLElement
|
em
| HTMLElement
|
embed
| HTMLEmbedElement : HTMLElement
|
fieldset
| HTMLFieldSetElement : HTMLElement
|
figcaption
| HTMLElement
|
figure
| HTMLElement
|
footer
| HTMLElement
|
form
| HTMLFormElement : HTMLElement
|
h1
| HTMLHeadingElement : HTMLElement
|
h2
| HTMLHeadingElement : HTMLElement
|
h3
| HTMLHeadingElement : HTMLElement
|
h4
| HTMLHeadingElement : HTMLElement
|
h5
| HTMLHeadingElement : HTMLElement
|
h6
| HTMLHeadingElement : HTMLElement
|
head
| HTMLHeadElement : HTMLElement
|
header
| HTMLElement
|
hgroup
| HTMLElement
|
hr
| HTMLHRElement : HTMLElement
|
html
| HTMLHtmlElement : HTMLElement
|
i
| HTMLElement
|
iframe
| HTMLIFrameElement : HTMLElement
|
img
| HTMLImageElement : HTMLElement
|
input
| HTMLInputElement : HTMLElement
|
ins
| HTMLModElement : HTMLElement
|
kbd
| HTMLElement
|
label
| HTMLLabelElement : HTMLElement
|
legend
| HTMLLegendElement : HTMLElement
|
li
| HTMLLIElement : HTMLElement
|
link
| HTMLLinkElement : HTMLElement
|
main
| HTMLElement
|
map
| HTMLMapElement : HTMLElement
|
mark
| HTMLElement
|
menu
| HTMLMenuElement : HTMLElement
|
meta
| HTMLMetaElement : HTMLElement
|
meter
| HTMLMeterElement : HTMLElement
|
nav
| HTMLElement
|
noscript
| HTMLElement
|
object
| HTMLObjectElement : HTMLElement
|
ol
| HTMLOListElement : HTMLElement
|
optgroup
| HTMLOptGroupElement : HTMLElement
|
option
| HTMLOptionElement : HTMLElement
|
output
| HTMLOutputElement : HTMLElement
|
p
| HTMLParagraphElement : HTMLElement
|
picture
| HTMLPictureElement : HTMLElement
|
pre
| HTMLPreElement : HTMLElement
|
progress
| HTMLProgressElement : HTMLElement
|
q
| HTMLQuoteElement : HTMLElement
|
rp
| HTMLElement
|
rt
| HTMLElement
|
ruby
| HTMLElement
|
s
| HTMLElement
|
samp
| HTMLElement
|
search
| HTMLElement
|
script
| HTMLScriptElement : HTMLElement
|
section
| HTMLElement
|
select
| HTMLSelectElement : HTMLElement
|
slot
| HTMLSlotElement : HTMLElement
|
small
| HTMLElement
|
source
| HTMLSourceElement : HTMLElement
|
span
| HTMLSpanElement : HTMLElement
|
strong
| HTMLElement
|
style
| HTMLStyleElement : HTMLElement
|
sub
| HTMLElement
|
summary
| HTMLElement
|
sup
| HTMLElement
|
table
| HTMLTableElement : HTMLElement
|
tbody
| HTMLTableSectionElement : HTMLElement
|
td
| HTMLTableCellElement : HTMLElement
|
template
| HTMLTemplateElement : HTMLElement
|
textarea
| HTMLTextAreaElement : HTMLElement
|
tfoot
| HTMLTableSectionElement : HTMLElement
|
th
| HTMLTableCellElement : HTMLElement
|
thead
| HTMLTableSectionElement : HTMLElement
|
time
| HTMLTimeElement : HTMLElement
|
title
| HTMLTitleElement : HTMLElement
|
tr
| HTMLTableRowElement : HTMLElement
|
track
| HTMLTrackElement : HTMLElement
|
u
| HTMLElement
|
ul
| HTMLUListElement : HTMLElement
|
var
| HTMLElement
|
video
| HTMLVideoElement : HTMLMediaElement : HTMLElement
|
wbr
| HTMLElement
|
custom elements | supplied by the element's author (inherits from HTMLElement )
|
The following table lists events fired by this document, excluding those already defined in media element events and drag-and-drop events.
Event | Interface | Interesting targets | Description |
---|---|---|---|
DOMContentLoaded
| Event
| Document
| Fired at the Document once the parser has finished
|
afterprint
| Event
| Window
| Fired at the Window after printing
|
beforeprint
| Event
| Window
| Fired at the Window before printing
|
beforematch
| Event
| Elements | Fired on elements with the hidden=until-found attribute before they are
revealed.
|
beforetoggle
| ToggleEvent
| Elements | Fired on elements with the popover attribute when they
are transitioning between showing and hidden
|
beforeunload
| BeforeUnloadEvent
| Window
| Fired at the Window when the page is about to be unloaded, in case the page would like to show a warning prompt
|
blur
| Event
| Window , elements
| Fired at nodes when they stop being focused |
cancel
| Event
| CloseWatcher , dialog elements, input elements
| Fired at CloseWatcher objects or dialog elements when they receive a close request, or at input elements in the File state when the user does not change their selection
|
change
| Event
| Form controls | Fired at controls when the user commits a value change (see also the input event)
|
click
| PointerEvent
| Elements | Normally a mouse event; also synthetically fired at an element before its activation behavior is run, when an element is activated from a non-pointer input device (e.g. a keyboard) |
close
| Event
| CloseWatcher , dialog elements, MessagePort
| Fired at CloseWatcher objects or dialog elements when they are closed via a close request or via web developer code, or at MessagePort objects when disentangled
|
connect
| MessageEvent
| SharedWorkerGlobalScope
| Fired at a shared worker's global scope when a new client connects |
contextlost
| Event
| canvas elements, OffscreenCanvas objects
| Fired when the corresponding CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D is lost
|
contextrestored
| Event
| canvas elements, OffscreenCanvas objects
| Fired when the corresponding CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D is restored after being lost
|
currententrychange
| NavigationCurrentEntryChangeEvent
| Navigation
| Fired when navigation.currentEntry changes
|
dispose
| Event
| NavigationHistoryEntry
| Fired when the session history entry corresponding to the NavigationHistoryEntry has been permanently evicted from session history and can no longer be traversed to
|
error
| Event or ErrorEvent
| Global scope objects, Worker objects, elements, networking-related objects
| Fired when unexpected errors occur (e.g. networking errors, script errors, decoding errors) |
focus
| Event
| Window , elements
| Fired at nodes gaining focus |
formdata
| FormDataEvent
| form elements
| Fired at a form element when it is constructing the entry list
|
hashchange
| HashChangeEvent
| Window
| Fired at the Window when the fragment part of the document's URL changes
|
input
| Event
| Elements | Fired when the user changes the contenteditable element's content, or the form control's value. See also the change event for form controls.
|
invalid
| Event
| Form controls | Fired at controls during form validation if they do not satisfy their constraints |
languagechange
| Event
| Global scope objects | Fired at the global scope object when the user's preferred languages change |
load
| Event
| Window , elements
| Fired at the Window when the document has finished loading; fired at an element containing a resource (e.g. img , embed ) when its resource has finished loading
|
message
| MessageEvent
| Window , EventSource , MessagePort , BroadcastChannel , DedicatedWorkerGlobalScope , Worker , ServiceWorkerContainer
| Fired at an object when it receives a message |
messageerror
| MessageEvent
| Window , MessagePort , BroadcastChannel , DedicatedWorkerGlobalScope , Worker , ServiceWorkerContainer
| Fired at an object when it receives a message that cannot be deserialized |
navigate
| NavigateEvent
| Navigation
| Fired before the navigable navigates, reloads, traverses, or otherwise changes its URL |
navigateerror
| ErrorEvent
| Navigation
| Fired when a navigation does not complete successfully |
navigatesuccess
| Event
| Navigation
| Fired when a navigation completes successfully |
offline
| Event
| Global scope objects | Fired at the global scope object when the network connections fails |
online
| Event
| Global scope objects | Fired at the global scope object when the network connections returns |
open
| Event
| EventSource
| Fired at EventSource objects when a connection is established
|
pageswap
| PageSwapEvent
| Window
| Fired at the Window right before a document is unloaded as a result of a navigation.
|
pagehide
| PageTransitionEvent
| Window
| Fired at the Window when the page's session history entry stops
being the active entry
|
pagereveal
| PageRevealEvent
| Window
| Fired at the Window when the page begins to render for the first time after
it has been initialized or reactivated
|
pageshow
| PageTransitionEvent
| Window
| Fired at the Window when the page's session history entry
becomes the active entry
|
pointercancel
| PointerEvent
| Elements and Text nodes
| Fired at the source node when the user attempts to initiate a drag-and-drop operation |
popstate
| PopStateEvent
| Window
| Fired at the Window when in some cases of session history traversal
|
readystatechange
| Event
| Document
| Fired at the Document when it finishes parsing and again when all its subresources have finished loading
|
rejectionhandled
| PromiseRejectionEvent
| Global scope objects | Fired at global scope objects when a previously-unhandled promise rejection becomes handled |
reset
| Event
| form elements
| Fired at a form element when it is reset
|
select
| Event
| Form controls | Fired at form controls when their text selection is adjusted (whether by an API or by the user) |
storage
| StorageEvent
| Window
| Fired at Window event when the corresponding localStorage or sessionStorage storage areas change
|
submit
| SubmitEvent
| form elements
| Fired at a form element when it is submitted
|
toggle
| ToggleEvent
| details and popover elements
| Fired at details elements when they open or close; fired on elements with the
popover attribute when they are transitioning between
showing and hidden
|
unhandledrejection
| PromiseRejectionEvent
| Global scope objects | Fired at global scope objects when a promise rejection goes unhandled |
unload
| Event
| Window
| Fired at the Window object when the page is going away
|
visibilitychange
| Event
| Document
| Fired at the Document object when the page becomes visible or hidden to the
user
|
The following HTTP request headers are defined by this specification:
Last-Event-ID
`Ping-From
`Ping-To
`The following HTTP response headers are defined by this specification:
Cross-Origin-Embedder-Policy
`Cross-Origin-Embedder-Policy-Report-Only
`Cross-Origin-Opener-Policy
`Cross-Origin-Opener-Policy-Report-Only
`Origin-Agent-Cluster
`Refresh
`X-Frame-Options
`The following MIME types are mentioned in this specification:
application/atom+xml
application/json
application/octet-stream
application/microdata+json
application/rss+xml
application/wasm
application/x-www-form-urlencoded
application/xhtml+xml
application/xml
image/gif
image/jpeg
image/png
image/svg+xml
multipart/form-data
multipart/mixed
multipart/x-mixed-replace
text/css
text/event-stream
text/javascript
text/json
text/plain
text/html
text/ping
text/uri-list
text/vcard
text/vtt
text/xml
video/mp4
video/mpeg
All references are normative unless marked "Non-normative".
XMLHttpRequest
, A. van Kesteren. WHATWG.Thanks to Tim Berners-Lee for inventing HTML, without which none of this would exist.
Thanks to Aankhen, Aaqa Ishtyaq, Aaron Boodman, Aaron Leventhal, Aaron Krajeski, Abhishek Ghaskata, Abhishek Gupta, Adam Barth, Adam de Boor, Adam Hepton, Adam Klein, Adam Rice, Adam Roben, Addison Phillips, Adele Peterson, Adrian Bateman, Adrian Roselli, Adrian Sutton, Agustín Fernández, Aharon (Vladimir) Lanin, Ajai Tirumali, Ajay Poshak, Akash Balenalli, Akatsuki Kitamura, Alan Jeffrey, Alan Plum, Alastair Campbell, Alejandro G. Castro, Alex Bishop, Alex Nicolaou, Alex Nozdriukhin, Alex Rousskov, Alex Soncodi, Alexander Farkas, Alexander J. Vincent, Alexander Kalenik, Alexandre Dieulot, Alexandre Morgaut, Alexey Feldgendler, Алексей Проскуряков (Alexey Proskuryakov), Alexey Shvayka, Alexis Deveria, Alfred Agrell, Ali Juma, Alice Boxhall, Alice Wonder, Allan Clements, Allen Wirfs-Brock, Alex Komoroske, Alex Russell, Alphan Chen, Aman Ansari, Ami Fischman, Amos Jeffries, Amos Lim, Anders Carlsson, André Bargull, André E. Veltstra, Andrea Rendine, Andreas, Andreas Deuschlinger, Andreas Farre, Andreas Kling, Andrei Popescu, Andres Gomez, Andres Rios, Andreu Botella, Andrew Barfield, Andrew Clover, Andrew Gove, Andrew Grieve, Andrew Kaster, Andrew Macpherson, Andrew Oakley, Andrew Paseltiner, Andrew Simons, Andrew Smith, Andrew W. Hagen, Andrew Williams, Andrey V. Lukyanov, Andry Rendy, Andy Davies, Andy Earnshaw, Andy Heydon, Andy Paicu, Andy Palay, Anjana Vakil, Ankur Kaushal, Anna Belle Leiserson, Anna Sidwell, Anthony Boyd, Anthony Bryan, Anthony Hickson, Anthony Ramine, Anthony Ricaud, Anton Vayvod, Antonio Sartori, Antti Koivisto, Arfat Salman, Arkadiusz Michalski, Arne Thomassen, Aron Spohr, Arphen Lin, Arthur Hemery, Arthur Sonzogni, Arthur Stolyar, Arun Patole, Aryeh Gregor, Asanka Herath, Asbjørn Ulsberg, Ashley Gullen, Ashley Sheridan, Asumu Takikawa, Atsushi Takayama, Attila Haraszti, Aurelien Levy, Ave Wrigley, Avi Drissman, Axel Dahmen, 방성범 (Bang Seongbeom), Barry Pollard, Ben Boyle, Ben Godfrey, Ben Golightly, Ben Kelly, Ben Lerner, Ben Leslie, Ben Meadowcroft, Ben Millard, Benjamin Carl Wiley Sittler, Benjamin Hawkes-Lewis, Benji Bilheimer, Benoit Ren, Bert Bos, Bijan Parsia, Bil Corry, Bill Mason, Bill McCoy, Billy Wong, Billy Woods, Bjartur Thorlacius, Björn Höhrmann, Blake Frantz, Bob Lund, Bob Owen, Bobby Holley, Boris Zbarsky, Brad Fults, Brad Neuberg, Brad Spencer, Bradley Meck, Brady Eidson, Brandon Jones, Brendan Eich, Brenton Simpson, Brett Wilson, Brett Zamir, Brian Birtles, Brian Blakely, Brian Campbell, Brian Korver, Brian Kuhn, Brian M. Dube, Brian Ryner, Brian Smith, Brian Wilson, Bryan Sullivan, Bruce Bailey, Bruce D'Arcus, Bruce Lawson, Bruce Miller, Bugs Nash, C. Scott Ananian, C. Williams, Cameron McCormack, Cameron Zemek, Cao Yipeng, Carlos Amengual, Carlos Gabriel Cardona, Carlos Ibarra López, Carlos Perelló Marín, Carolyn MacLeod, Casey Leask, Cătălin Badea, Cătălin Mariș, Cem Turesoy, ceving, Chao Cai, 윤석찬 (Channy Yun), Charl van Niekerk, Charlene Wright, Charles Iliya Krempeaux, Charles McCathie Nevile, Charlie Reis, 白丞祐 (Cheng-You Bai), Chris Apers, Chris Cressman, Chris Dumez, Chris Evans, Chris Harrelson, Chris Markiewicz, Chris Morris, Chris Nardi, Chris Needham, Chris Pearce, Chris Peterson, Chris Rebert, Chris Weber, Chris Wilson, Christian Biesinger, Christian Johansen, Christian Schmidt, Christoph Päper, Christophe Dumez, Christopher Aillon, Christopher Cameron, Christopher Ferris, Chriswa, Clark Buehler, Cole Robison, Colin Fine, Collin Jackson, Corey Farwell, Corprew Reed, Craig Cockburn, Csaba Gabor, Csaba Marton, Cynthia Shelly, Cyrille Tuzi, Daksh Shah, Dan Callahan, Dan Yoder, Dane Foster, Daniel Barclay, Daniel Bratell, Daniel Brooks, Daniel Brumbaugh Keeney, Daniel Buchner, Daniel Cheng, Daniel Clark, Daniel Davis, Daniel Ehrenberg, Daniel Glazman, Daniel Holbert, Daniel Peng, Daniel Schattenkirchner, Daniel Spång, Daniel Steinberg, Daniel Tan, Daniel Trebbien, Daniel Vogelheim, Danny Sullivan, Daphne Preston-Kendal, Darien Maillet Valentine, Darin Adler, Darin Fisher, Darxus, Dave Camp, Dave Cramer, Dave Hodder, Dave Lampton, Dave Singer, Dave Tapuska, Dave Townsend, David Baron, David Bloom, David Bokan, David Bruant, David Carlisle, David E. Cleary, David Egan Evans, David Fink, David Flanagan, David Gerard, David Grogan, David Hale, David Håsäther, David Hyatt, David I. Lehn, David John Burrowes, David Matja, David Remahl, David Resseguie, David Smith, David Storey, David Vest, David Woolley, David Zbarsky, Dave Methvin, DeWitt Clinton, Dean Edridge, Dean Edwards, Dean Jackson, Debanjana Sarkar, Debi Orton, Delan Azabani, Derek Featherstone, Derek Guenther, Devarshi Pant, Devdatta, Devin Mullins, Devin Rousso, Di Zhang, Diego Ferreiro Val, Diego González Zúñiga, Diego Ponce de León, Dimitri Glazkov, Dimitry Golubovsky, Dirk Pranke, Dirk Schulze, Dirkjan Ochtman, Divya Manian, Dmitry Lazutkin, Dmitry Titov, dolphinling, Dominic Cooney, Dominique Hazaël-Massieux, Don Brutzman, Donovan Glover, Doron Rosenberg, Doug Kramer, Doug Simpkinson, Drew Wilson, Edgar Chen, Edmund Lai, Eduard Pascual, Eduardo Vela, Edward Welbourne, Edward Z. Yang, Ehsan Akhgari, Eira Monstad, Eitan Adler, Eli Friedman, Eli Grey, Eliot Graff, Elisabeth Robson, Elizabeth Castro, Elliott Sprehn, Elliotte Harold, Emilio Cobos Álvarez, Emily Stark, Eric Carlson, Eric Casler, Eric Lawrence, Eric Portis, Eric Rescorla, Eric Semling, Eric Shepherd, Eric Willigers, Erik Arvidsson, Erik Charlebois, Erik Rose, 栗本 英理子 (Eriko Kurimoto), espretto, Evan Jacobs, Evan Martin, Evan Prodromou, Evan Stade, Evert, Evgeny Kapun, ExE-Boss, Ezequiel Garzón, fantasai, Félix Sanz, Felix Sasaki, Fernando Altomare Serboncini, Forbes Lindesay, Francesco Schwarz, Francis Brosnan Blazquez, Franck 'Shift' Quélain, François Marier, Frank Barchard, Frank Liberato, Franklin Shirley, Frederik Braun, Fredrik Söderquist, 鵜飼文敏 (Fumitoshi Ukai), Futomi Hatano, Gavin Carothers, Gavin Kistner, Gareth Rees, Garrett Smith, Gary Blackwood, Gary Kacmarcik, Gary Katsevman, Geoff Richards, Geoffrey Garen, Georg Neis, George Lund, Gianmarco Armellin, Giovanni Campagna, Giuseppe Pascale, Glenn Adams, Glenn Maynard, Graham Klyne, Greg Botten, Greg Houston, Greg Wilkins, Gregg Tavares, Gregory J. Rosmaita, Gregory Terzian, Grey, guest271314, Guilherme Johansson Tramontina, Guy Bedford, Gytis Jakutonis, Håkon Wium Lie, Habib Virji, Hajime Morrita, Hallvord Reiar Michaelsen Steen, Hanna Laakso, Hans S. Tømmerhalt, Hans Stimer, Harald Alvestrand, Hayato Ito, 何志翔 (HE Zhixiang), Henri Sivonen, Henrik Lied, Henrik Lievonen, Henry Lewis, Henry Mason, Henry Story, Hermann Donfack Zeufack, 中川博貴 (Hiroki Nakagawa), Hiroshige Hayashizaki, Hiroyuki USHITO, Hitoshi Yoshida, Hongchan Choi, 王华 (Hua Wang), Hugh Bellamy, Hugh Guiney, Hugh Winkler, Ian Bicking, Ian Clelland, Ian Davis, Ian Fette, Ian Henderson, Ian Kilpatrick, Ibrahim Ahmed, Ido Green, Ignacio Javier, Igor Oliveira, 安次嶺 一功 (Ikko Ashimine), Ilya Grigorik, Ingvar Stepanyan, isonmad, Iurii Kucherov, Ivan Enderlin, Ivan Nikulin, Ivan Panchenko, Ivo Emanuel Gonçalves, J. King, J.C. Jones, Jackson Ray Hamilton, Jacob Davies, Jacques Distler, Jake Archibald, Jake Verbaten, Jakub Vrána, Jakub Łopuszański, Jakub Wilk, James Craig, James Graham, James Greene, James Justin Harrell, James Kozianski, James M Snell, James Perrett, James Robinson, Jamie Liu, Jamie Lokier, Jamie Mansfield, Jan Kühle, Jan Miksovsky, Janice Shiu, Janusz Majnert, Jan-Ivar Bruaroey, Jan-Klaas Kollhof, Jared Jacobs, Jason Duell, Jason Kersey, Jason Lustig, Jason Orendorff, Jason White, Jasper Bryant-Greene, Jasper St. Pierre, Jatinder Mann, Jay Henry Kao, Jean-Yves Avenard, Jed Hartman, Jeff Balogh, Jeff Cutsinger, Jeff Gilbert, Jeff "=JeffH" Hodges, Jeff Schiller, Jeff Walden, Jeffrey Yasskin, Jeffrey Zeldman, 胡慧鋒 (Jennifer Braithwaite), Jellybean Stonerfish, Jennifer Apacible, Jens Bannmann, Jens Fendler, Jens Oliver Meiert, Jens Widell, Jer Noble, Jeremey Hustman, Jeremy Keith, Jeremy Orlow, Jeremy Roman, Jeroen van der Meer, Jerry Smith, Jesse Renée Beach, Jessica Jong, jfkthame, Jian Li, Jihye Hong, Jim Jewett, Jim Ley, Jim Meehan, Jim Michaels, Jinho Bang, Jinjiang (勾三股四), Jirka Kosek, Jjgod Jiang, Joaquim Medeiros, João Eiras, Jochen Eisinger, Joe Clark, Joe Gregorio, Joel Spolsky, Joel Verhagen, Joey Arhar, Johan Herland, Johanna Herman, John Boyer, John Bussjaeger, John Carpenter, John Daggett, John Fallows, John Foliot, John Harding, John Keiser, John Law, John Musgrave, John Snyders, John Stockton, John-Mark Bell, Johnny Stenback, Jon Coppeard, Jon Ferraiolo, Jon Gibbins, Jon Jensen, Jon Perlow, Jonas Sicking, Jonathan Cook, Jonathan Kew, Jonathan Neal, Jonathan Oddy, Jonathan Rees, Jonathan Watt, Jonathan Worent, Jonny Axelsson, Joram Schrijver, Jordan Tucker, Jorgen Horstink, Joris van der Wel, Jorunn Danielsen Newth, Joseph Kesselman, Joseph Mansfield, Joseph Pecoraro, Josh Aas, Josh Hart, Josh Juran, Josh Levenberg, Josh Matthews, Joshua Bell, Joshua Chen, Joshua Randall, Juan Olvera, Juanmi Huertas, Jukka K. Korpela, Jules Clément-Ripoche, Julian Reschke, Julio Lopez, 小勝 純 (Jun Kokatsu), Jun Yang (harttle), Jungkee Song, Jürgen Jeka, Justin Lebar, Justin Novosad, Justin Rogers, Justin Schuh, Justin Sinclair, Juuso Lapinlampi, Ka-Sing Chou, Kagami Sascha Rosylight, Kai Hendry, Kamishetty Sreeja, 呂康豪 (KangHao Lu), Karl Dubost, Karl Tomlinson, Kartik Arora, Kartikaya Gupta, Kathy Walton, 河童エクマ(Kawarabe Ecma) Keith Cirkel, Keith Rollin, Keith Yeung, Kelly Ford, Kelly Norton, Ken Russell, Kenji Baheux, Kevin Benson, Kevin Cole, Kevin Gadd, Kevin Venkiteswaran, Khushal Sagar, Kinuko Yasuda, Koji Ishii, Kornél Pál, Kornel Lesinski, 上野 康平 (UENO, Kouhei), Kris Northfield, Kristof Zelechovski, Krzysztof Maczyński, 黒澤剛志 (Kurosawa Takeshi), Kyle Barnhart, Kyle Hofmann, Kyle Huey, Léonard Bouchet, Léonie Watson, Lachlan Hunt, Larry Masinter, Larry Page, Lars Gunther, Lars Solberg, Laura Carlson, Laura Granka, Laura L. Carlson, Laura Wisewell, Laurens Holst, Lawrence Forooghian, Lee Kowalkowski, Leif Halvard Silli, Leif Kornstaedt, Lenny Domnitser, Leonard Rosenthol, Leons Petrazickis, Liviu Tinta, Lobotom Dysmon, Logan, Logan Moore, Loune, Lucas Gadani, Łukasz Pilorz, Luke Kenneth Casson Leighton, Luke Warlow, Luke Wilde, Maciej Stachowiak, Magne Andersson, Magnus Kristiansen, Maik Merten, Majid Valipour, Malcolm Rowe, Manish Goregaokar, Manish Tripathi, Manuel Martinez-Almeida, Manuel Rego Casasnovas, Marc Hoyois, Marc-André Choquette, Marc-André Lafortune, Marco Zehe, Marcus Bointon, Marcus Otterström, Marijn Kruisselbrink, Mark Amery, Mark Birbeck, Mark Davis, Mark Green, Mark Miller, Mark Nottingham, Mark Pilgrim, Mark Rogers, Mark Rowe, Mark Schenk, Mark Vickers, Mark Wilton-Jones, Markus Cadonau, Markus Stange, Martijn van der Ven, Martijn Wargers, Martin Atkins, Martin Chaov, Martin Dürst, Martin Honnen, Martin Janecke, Martin Kutschker, Martin Nilsson, Martin Thomson, Masataka Yakura, Masatoshi Kimura, Mason Freed, Mason Mize, Mathias Bynens, Mathieu Henri, Matias Larsson, Matt Brubeck, Matt Di Pasquale, Matt Falkenhagen, Matt Giuca, Matt Harding, Matt Schmidt, Matt Wright, Matthew Gaudet, Matthew Gregan, Matthew Mastracci, Matthew Noorenberghe, Matthew Raymond, Matthew Thomas, Matthew Tylee Atkinson, Mattias Waldau, Max Romantschuk, Maxim Tsoy, Mayeul Cantan, Menachem Salomon, Menno van Slooten, Micah Dubinko, Micah Nerren, Michael 'Ratt' Iannarelli, Michael A. Nachbaur, Michael A. Puls II, Michael Carter, Michael Daskalov, Michael Day, Michael Dyck, Michael Enright, Michael Ficarra, Michael Gratton, Michael Kohler, Michael McKelvey, Michael Nordman, Michael Powers, Michael Rakowski, Michael(tm) Smith, Michael Walmsley, Michal Zalewski, Michel Buffa, Michel Fortin, Michelangelo De Simone, Michiel van der Blonk, Miguel Casas-Sanchez, Mihai Şucan, Mihai Parparita, Mike Brown, Mike Dierken, Mike Dixon, Mike Hearn, Mike Pennisi, Mike Schinkel, Mike Shaver, Mikko Rantalainen, Mingye Wang, Mirko Brodesser, Mohamed Zergaoui, Mohammad Al Houssami, Mohammad Reza Zakerinasab, Momdo Nakamura, Morten Stenshorne, Mounir Lamouri, Ms2ger, mtrootyy, 邱慕安 (Mu-An Chiou), Mukilan Thiyagarajan, Mustaq Ahmed, Myles Borins, Nadia Heninger, Nate Chapin, NARUSE Yui, Navid Zolghadr, Neil Deakin, Neil Rashbrook, Neil Soiffer, Nereida Rondon, networkException, Nicholas Shanks, Nicholas Stimpson, Nicholas Zakas, Nickolay Ponomarev, Nicolas Gallagher, Nicolas Pena Moreno, Nicolò Ribaudo, Nidhi Jaju, Nikki Bee, Niklas Gögge, Nina Satragno, Noah Mendelsohn, Noah Slater, Noam Rosenthal, Noel Gordon, Nolan Waite, NoozNooz42, Norbert Lindenberg, Oisín Nolan, Ojan Vafai, Olaf Hoffmann, Olav Junker Kjær, Oldřich Vetešník, Oli Studholme, Oliver Hunt, Oliver Rigby, Olivia (Xiaoni) Lai, Olivier Gendrin, Olli Pettay, Ondřej Žára, Ori Avtalion, Oriol Brufau, oSand, Pablo Flouret, Patrick Dark, Patrick Garies, Patrick H. Lauke, Patrik Persson, Paul Adenot, Paul Lewis, Paul Norman, Per-Erik Brodin, 一丝 (percyley), Perry Smith, Peter Beverloo, Peter Karlsson, Peter Kasting, Peter Moulder, Peter Occil, Peter Stark, Peter Van der Beken, Peter van der Zee, Peter-Paul Koch, Phil Pickering, Philip Ahlberg, Philip Brembeck, Philip Taylor, Philip TAYLOR, Philippe De Ryck, Pierre-Arnaud Allumé, Pierre-Marie Dartus, Pierre-Yves Gérardy, Piers Wombwell, Pooja Sanklecha, Prashant Hiremath, Prashanth Chandra, Prateek Rungta, Pravir Gupta, Prayag Verma, 李普君 (Pujun Li), Rachid Finge, Rafael Weinstein, Rafał Miłecki, Rahul Purohit, Raj Doshi, Rajas Moonka, Rakina Zata Amni, Ralf Stoltze, Ralph Giles, Raphael Champeimont, Rebecca Star, Remci Mizkur, Remco, Remy Sharp, Rene Saarsoo, Rene Stach, Ric Hardacre, Rich Clark, Rich Doughty, Richa Rupela, Richard Gibson, Richard Ishida, Ricky Mondello, Rigo Wenning, Rikkert Koppes, Rimantas Liubertas, Riona Macnamara, Rob Buis, Rob Ennals, Rob Jellinghaus, Rob S, Rob Smith, Robert Blaut, Robert Collins, Robert Hogan, Robert Kieffer, Robert Linder, Robert Millan, Robert O'Callahan, Robert Sayre, Robin Berjon, Robin Schaufler, Rodger Combs, Roland Steiner, Roma Matusevich, Romain Deltour, Roman Ivanov, Roy Fielding, Rune Lillesveen, Russell Bicknell, Ruud Steltenpool, Ryan King, Ryan Landay, Ryan Sleevi, Ryo Kajiwara, Ryo Kato, Ryosuke Niwa, S. Mike Dierken, Salvatore Loreto, Sam Atkins, Sam Dutton, Sam Kuper, Sam Ruby, Sam Sneddon, Sam Weinig, Samikshya Chand, Samuel Bronson, Samy Kamkar, Sander van Lambalgen, Sanjoy Pal, Sanket Joshi, Sarah Gebauer, Sarven Capadisli, Satrujit Behera, Sayan Sivakumaran, Schalk Neethling, Scott Beardsley, Scott González, Scott Hess, Scott Miles, Scott O'Hara, Sean B. Palmer, Sean Feng, Sean Fraser, Sean Hayes, Sean Hogan, Sean Knapp, Sebastian Markbåge, Sebastian Schnitzenbaumer, Sendil Kumar N, Seth Call, Seth Dillingham, Shannon Moeller, Shanti Rao, Shaun Inman, Shiino Yuki, 贺师俊 (HE Shi-Jun), Shiki Okasaka, Shivani Sharma, shreyateeza, Shubheksha Jalan, Sidak Singh Aulakh, Sierk Bornemann, Sigbjørn Finne, Sigbjørn Vik, Silver Ghost, Silvia Pfeiffer, Šime Vidas, Simon Fraser, Simon Montagu, Simon Sapin, Yu Han, Simon Spiegel, Simon Wülker, skeww, Smylers, Srirama Chandra Sekhar Mogali, Stanton McCandlish, stasoid, Stefan Håkansson, Stefan Haustein, Stefan Santesson, Stefan Schumacher, Ştefan Vargyas, Stefan Weiss, Steffen Meschkat, Stephen Ma, Stephen Stewart, Stephen White, Steve Comstock, Steve Faulkner, Steve Fink, Steve Orvell, Steve Runyon, Steven Bennett, Steven Bingler, Steven Garrity, Steven Tate, Stewart Brodie, Stuart Ballard, Stuart Langridge, Stuart Parmenter, Subramanian Peruvemba, Sudhanshu Jaiswal, sudokus999, Sunava Dutta, Surma, Susan Borgrink, Susan Lesch, Sylvain Pasche, T.J. Crowder, Tab Atkins-Bittner, Taiju Tsuiki, Takashi Toyoshima, Takayoshi Kochi, Takeshi Yoshino, Tantek Çelik, 田村健人 (Kent TAMURA), Tawanda Moyo, Taylor Hunt, Ted Mielczarek, Terence Eden, Terrence Wood, Tetsuharu OHZEKI, Theresa O'Connor, Thijs van der Vossen, Thomas Broyer, Thomas Koetter, Thomas O'Connor, Tim Altman, Tim Dresser, Tim Johansson, Tim Nguyen, Tim Perry, Tim van der Lippe, TJ VanToll, Tobias Schneider, Tobie Langel, Toby Inkster, Todd Moody, Tom Baker, Tom Pike, Tom Schuster, Tom ten Thij, Tomasz Jakut, Tomek Wytrębowicz, Tommy Thorsen, Tony Ross, Tooru Fujisawa, Toru Kobayashi, Traian Captan, Travis Leithead, Trevor Rowbotham, Trevor Saunders, Trey Eckels, triple-underscore, Tristan Fraipont, Tristan Parisot, 保呂 毅 (Tsuyoshi Horo), Tyler Close, Valentin Gosu, Vardhan Gupta, Vas Sudanagunta, Veli Şenol, Victor Carbune, Victor Costan, Vipul Snehadeep Chawathe, Vitya Muhachev, Vlad Levin, Vladimir Katardjiev, Vladimir Vukićević, Vyacheslav Aristov, voracity, Walter Steiner, Wakaba, Wayne Carr, Wayne Pollock, Wellington Fernando de Macedo, Wenson Hsieh, Weston Ruter, Wilhelm Joys Andersen, Will Levine, Will Ray, William Chen, William Swanson, Willy Martin Aguirre Rodriguez, Wladimir Palant, Wojciech Mach, Wolfram Kriesing, Xan Gregg, xenotheme, XhmikosR, Xida Chen, Xidorn Quan, Xue Fuqiao, Yang Chen, Yao Xiao, Yash Handa, Yay295, Ye-Kui Wang, Yehuda Katz, Yi Xu, Yi-An Huang, Yngve Nysaeter Pettersen, Yoav Weiss, Yonathan Randolph, Yu Huojiang, Yuki Okushi, Yury Delendik, 平野裕 (Yutaka Hirano), Yuzo Fujishima, 西條柚 (Yuzu Saijo), Zhenbin Xu, 张智强 (Zhiqiang Zhang), Zoltan Herczeg, Zyachel, and Øistein E. Andersen, for their useful comments, both large and small, that have led to changes to this specification over the years.
Thanks also to everyone who has ever posted about HTML to their blogs, public mailing lists, or forums, including all the contributors to the various W3C HTML WG lists and the various WHATWG lists.
Special thanks to Richard Williamson for creating the first implementation of
canvas
in Safari, from which the canvas feature was designed.
Special thanks also to the Microsoft employees who first implemented the event-based
drag-and-drop mechanism, contenteditable
, and other
features first widely deployed by the Windows Internet Explorer browser.
Special thanks and $10,000 to David Hyatt who came up with a broken implementation of the adoption agency algorithm that the editor had to reverse engineer and fix before using it in the parsing section.
Thanks to the participants of the microdata usability study for allowing us to use their mistakes as a guide for designing the microdata feature.
Thanks to the many sources that provided inspiration for the examples used in the specification.
Thanks also to the Microsoft blogging community for some ideas, to the attendees of the W3C Workshop on Web Applications and Compound Documents for inspiration, to the #mrt crew, the #mrt.no crew, and the #whatwg crew, and to Pillar and Hedral for their ideas and support.
Thanks to Igor Zhbanov for generating PDF versions of the specification.
Special thanks to the RICG for developing
the picture
element and related features; in particular thanks to Adrian Bateman,
Bruce Lawson, David Newton, Ilya Grigorik, John Schoenick, Leon de Rijke, Mat Marquis, Marcos
Cáceres, Tab Atkins, Theresa O'Connor, and Yoav Weiss for their contributions.
Special thanks to the WPWG for incubating the custom elements feature. In particular, thanks to David Hyatt and Ian Hickson for their influence through the XBL specifications, Dimitri Glazkov for the first draft of the custom elements specification, and to Alex Komoroske, Alex Russell, Andres Rios, Boris Zbarsky, Brian Kardell, Daniel Buchner, Dominic Cooney, Erik Arvidsson, Elliott Sprehn, Hajime Morrita, Hayato Ito, Jan Miksovsky, Jonas Sicking, Olli Pettay, Rafael Weinstein, Roland Steiner, Ryosuke Niwa, Scott Miles, Steve Faulkner, Steve Orvell, Tab Atkins, Theresa O'Connor, Tim Perry, and William Chen for their contributions.
Special thanks to the CSSWG for developing the worklets. In particular, thanks to Ian Kilpatrick for his work as editor of the original worklets specification.
For about ten years starting in 2003, this standard was almost entirely written by Ian Hickson (Google, ian@hixie.ch).
Starting in 2015, the editor group expanded. It is currently maintained by Anne van Kesteren (Apple, annevk@annevk.nl), Domenic Denicola (Google, d@domenic.me) Dominic Farolino (Google, domfarolino@gmail.com), Philip Jägenstedt (Google, philip@foolip.org), and Simon Pieters (Mozilla, zcorpan@gmail.com).
The image in the introduction is based on a photo by Wonderlane. (CC BY 2.0)
The image of the wolf in the embedded content introduction is based on a photo by Barry O'Neill. (Public domain)
The image of the kettlebell swing in the embedded content introduction is based on a photo by kokkarina. (CC0 1.0)
The Blue Robot Player sprite used in the canvas demo is based on a work by JohnColburn. (CC BY-SA 3.0)
The photograph of robot 148 climbing the tower at the FIRST Robotics Competition 2013 Silicon Valley Regional is based on a work by Lenore Edman. (CC BY 2.0)
The diagram showing how async
and defer
impact script
loading is based on a
similar diagram from a
blog post by Peter Beverloo.
(CC0 1.0)
The image decoding demo used to demonstrate module-based workers draws on some example code from a tutorial by Ilmari Heikkinen. (CC BY 3.0)
The <flag-icon>
example was inspired by a custom element by Steven
Skelton. (MIT)
Part of the revision history of the
picture
element and related features can be found in the ResponsiveImagesCG/picture-element
repository, which is available under the W3C Software and
Document License.
Part of the revision history of the theme-color
metadata name can be found in the whatwg/meta-theme-color
repository, which is available under CC0.
Part of the revision history of the custom elements feature can be found in the w3c/webcomponents
repository, which
is available under the W3C Software and
Document License.
Part of the revision history of the innerText
getter and setter can be found in the rocallahan/innerText-spec
repository, which is available under CC0.
Part of the revision history of the worklets feature can be found in the w3c/css-houdini-drafts
repository, which is available under the W3C Software and
Document License.
Part of the revision history of the import maps feature can be found in the WICG/import-maps
repository, which is available under the W3C Software and
Document License.
Part of the revision history of the navigation API feature can be found in the WICG/navigation-api
repository, which is available under the W3C Software and
Document License.
Part of the revision history of the Close requests and close watchers section can be
found in the WICG/close-watcher
repository, which is available under the W3C Software and
Document License.
Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). This work is licensed under a Creative Commons Attribution 4.0 International License. To the extent portions of it are incorporated into source code, such portions in the source code are licensed under the BSD 3-Clause License instead.
This is the Living Standard. Those interested in the patent-review version should view the Living Standard Review Draft.