From a26fe99d83ea409e5dd4425db2757b23d4819060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Fri, 30 Jan 2026 22:56:32 +0100 Subject: [PATCH 01/21] Parse XML-style processing instructions Notably behavior and their rationale: - While `` always closes it. This to match the bogus comment tokenizer behavior, so that exactly the same characters are consumed as bogus comments in existing parsers. Any deviation would make this a much riskier parser change. - The target must start with ASCII alpha, but after that almost anything goes, matching tag names. This doesn't have to be this way, but there's no obvious precedent to follow. - The target is ASCII-lowercased by the tokenizer, just like tag and attribute names. This is for consistency, and there's precedent from the SVG-in-HTML parser behavior. - A `?` that isn't followed by `>` is treated like whitespace, similar to `/` in opening tags. This is also the simplest, with a single tokenizer state used whenever `?` is encountered. - `` and `The attribute list concept
  • The data of a CharacterData node and its replace data algorithm
  • +
  • The target of a ProcessingInstruction node
  • The child text content of a node
  • The descendant text content of a node
  • The name, @@ -134768,6 +134769,35 @@ dictionary StorageEventInit : EventInit { <!-->.

    +

    Processing instructions

    + +

    Processing instructions mark locations in + a document for further processing.

    + +
    +

    A processing instructions must have the following format:

    + +
      +
    1. The string "<?".
    2. + +
    3. A target, consisting of ASCII alphanumeric + characters.
    4. + +
    5. One or more ASCII whitespace.
    6. + +
    7. Optionally, text, with the additional restriction that the + text must not contain a U+003E GREATER-THAN SIGN character (>), nor end with a U+003F QUESTION + MARK character (?).
    8. + +
    9. Optionally, a U+003F QUESTION MARK character (?).
    10. + +
    11. A U+003E GREATER-THAN SIGN character (>).
    12. +
    +
    + +

    TODO compare and contrast to XML processing instructions.

    + +
    @@ -134965,6 +134995,12 @@ dictionary StorageEventInit : EventInit { code point (e.g., </div/>). Such a tag is treated as a regular end tag.

    + + eof-before-pi-target +

    This error occurs if the parser encounters the end of the input stream + where a processing instruction target is expected. The parser treats this as a comment with + the text "?".

    + eof-before-tag-name

    This error occurs if the parser encounters the end of the input stream @@ -134991,6 +135027,13 @@ dictionary StorageEventInit : EventInit { data-x="syntax-doctype">DOCTYPE. In such a case, if the DOCTYPE is correctly placed as a document preamble, the parser sets the Document to quirks mode.

    + + eof-in-pi +

    This error occurs if the parser encounters the end of the input stream in a + processing instruction. The parser treats + such processing instructions as if they are closed immediately before the end of the input + stream.

    + eof-in-script-html-comment-like-text @@ -135040,6 +135083,15 @@ dictionary StorageEventInit : EventInit { and if the parser cannot change the mode flag is false, sets the Document to quirks mode.

    + + invalid-first-character-of-pi-target + +

    This error occurs if the parser encounters a code point that is not an + ASCII alpha where first code point of a processing instruction target is expected. The preceding + U+003F (?) 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.

    + invalid-first-character-of-tag-name @@ -135320,29 +135372,6 @@ dictionary StorageEventInit : EventInit { 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:

    - -
    <?xml-stylesheet type="text/css" href="style.css"?>
    - -

    This will be parsed into:

    - -
    • #comment: ?xml-stylesheet type="text/css" href="style.css"?
    • html
      • head
      • body
    -
    - -

    The common reason for this error is an XML processing instruction (e.g., <?xml-stylesheet type="text/css" href="style.css"?>) or an XML declaration - (e.g., <?xml version="1.0" encoding="UTF-8"?>) being used in - HTML.

    - unexpected-solidus-in-tag

    This error occurs if the parser encounters a U+002F (/) code point that is @@ -135351,6 +135380,13 @@ dictionary StorageEventInit : EventInit { id="foo">). In this case the parser behaves as if it encountered ASCII whitespace.

    + + unexpected-question-mark-in-pi +

    This error occurs if the parser encounters a U+003F (?) code point that is + not immediately followed by a U+003E (>) code point in a processing instruction (e.g., <?marker? >). In this case the parser behaves as if it encountered + ASCII whitespace.

    + unknown-named-character-reference

    This error occurs if the parser encounters an StorageEventInit : EventInit { the tag name state.

    U+003F QUESTION MARK (?)
    -
    This is an unexpected-question-mark-instead-of-tag-name - parse error. Create a comment token whose data is the empty string. - Reconsume in the bogus comment state.
    +
    Switch to the processing instruction open state.
    EOF
    This is an eof-before-tag-name @@ -138266,7 +138299,7 @@ dictionary StorageEventInit : EventInit {
    Switch to the data state. Emit the current comment token.
    EOF
    -
    Emit the comment. Emit an end-of-file token.
    +
    Emit the current comment token. Emit an end-of-file token.
    U+0000 NULL
    This is an StorageEventInit : EventInit { +
    Processing instruction open state
    + +
    +

    Consume the next input character:

    + +
    +
    ASCII alpha
    +
    Create a processing instruction token whose target and data are both the empty string. + Reconsume in the processing instruction target state. + +
    EOF
    +
    This is an eof-before-pi-target + parse error. Emit a comment token whose data is the "?" string.
    + +
    Anything else
    +
    This is an invalid-first-character-of-pi-target + parse error. Create a comment token whose data is the "?" string. + Reconsume in the bogus comment state.
    +
    +
    + + + +
    Processing instruction target state
    + +
    +

    Consume the next input character:

    + +
    +
    U+0009 CHARACTER TABULATION (tab)
    +
    U+000A LINE FEED (LF)
    +
    U+000C FORM FEED (FF)
    + +
    U+0020 SPACE
    +
    Switch to the after processing instruction target state.
    + +
    U+003F QUESTION MARK (?)
    +
    Switch to the processing instruction question mark state.
    + +
    U+003E GREATER-THAN SIGN (>)
    +
    Switch to the data state. Emit the processing instruction token.
    + +
    ASCII upper alpha
    +
    Append the lowercase version of the current input character (add 0x0020 to the + character's code point) to the current processing instruction token's target.
    + +
    U+0000 NULL
    +
    This is an unexpected-null-character parse + error. Append a U+FFFD REPLACEMENT CHARACTER character to the current processing instruction token's target.
    + +
    EOF
    +
    This is an eof-in-pi parse error. + Emit the current processing instruction token.
    + +
    Anything else
    +
    Append the current input character to the current processing instruction token's target.
    +
    +
    + + + +
    After processing instruction target state
    + +
    +

    Consume the next input character:

    + +
    +
    U+0009 CHARACTER TABULATION (tab)
    +
    U+000A LINE FEED (LF)
    +
    U+000C FORM FEED (FF)
    + +
    U+0020 SPACE
    +
    Ignore the character.
    + +
    U+003F QUESTION MARK (?)
    +
    Switch to the processing instruction question mark state.
    + +
    U+003E GREATER-THAN SIGN (>)
    +
    Switch to the data state. Emit the processing instruction token.
    + +
    EOF
    +
    This is an eof-in-pi parse error. + Emit the current processing instruction token.
    + +
    Anything else
    +
    Reconsume in the processing instruction data state.
    +
    +
    + + + +
    Processing instruction data state
    + +
    +

    Consume the next input character:

    + +
    +
    U+003F QUESTION MARK (?)
    +
    Switch to the processing instruction question mark state.
    + +
    U+003E GREATER-THAN SIGN (>)
    +
    Switch to the data state. Emit the processing instruction token.
    + +
    EOF
    +
    This is an eof-in-pi parse error. + Emit the current processing instruction token.
    + +
    Anything else
    +
    Append the current input character to the current processing instruction token's data.
    +
    +
    + + + +
    Processing instruction question mark state
    + +
    +

    Consume the next input character:

    + +
    +
    U+003E GREATER-THAN SIGN (>)
    +
    Switch to the data state. Emit the processing instruction token.
    + +
    EOF
    +
    This is an eof-in-pi parse error. + Emit the current processing instruction token.
    + +
    Anything else
    +
    This is an unexpected-question-mark-in-pi + parse error. Reconsume in the processing instruction data state.
    +
    +
    + + +
    Character reference state
    @@ -140098,6 +140268,24 @@ document.body.appendChild(text);
    +
    +

    When the steps below require the user agent to insert a processing instruction while + processing a processing instruction token, the user agent must run the following steps:

    + +
      +
    1. Let target be the target given in the comment token being processed.

    2. + +
    3. Let data be the data given in the comment token being processed.

    4. + +
    5. Create a ProcessingInstruction node whose target is target, data is data, and node document is the + same as that of the node in which the adjusted insertion location finds itself.

      + +
    6. Insert the newly created node at the adjusted insertion location.

    7. +
    +
    +
    Parsing elements that contain only text
    @@ -140178,6 +140366,12 @@ document.body.appendChild(text);

    Insert a comment as the last child of the Document object.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction as the last child of the Document + object.

    +
    +
    A DOCTYPE token

    If the DOCTYPE token's name is not "html", or the token's public @@ -140321,6 +140515,12 @@ document.body.appendChild(text);

    Insert a comment as the last child of the Document object.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction as the last child of the Document + object.

    +
    +
    A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
    @@ -140385,6 +140585,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -140457,6 +140662,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -140861,6 +141071,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -140984,6 +141199,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -142345,6 +142565,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -142672,6 +142897,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -143201,6 +143431,12 @@ document.body.appendChild(text); open elements (the html element).

    +
    A processing instruction token
    +
    +

    Insert a processing instruction as the last child of the first element in the + stack of open elements (the html element).

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -143254,6 +143490,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -143339,6 +143580,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    @@ -143389,6 +143635,12 @@ document.body.appendChild(text);

    Insert a comment as the last child of the Document object.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction as the last child of the Document + object.

    +
    +
    A DOCTYPE token
    A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
    @@ -143426,6 +143678,12 @@ document.body.appendChild(text);

    Insert a comment as the last child of the Document object.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction as the last child of the Document + object.

    +
    +
    A DOCTYPE token
    A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE
    @@ -143487,6 +143745,11 @@ document.body.appendChild(text);

    Insert a comment.

    +
    A processing instruction token
    +
    +

    Insert a processing instruction.

    +
    +
    A DOCTYPE token

    Parse error. Ignore the token.

    From d785561625e4326f31a9c6764af39f7aee1d9043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 31 Jan 2026 09:31:58 +0100 Subject: [PATCH 02/21] Emit end-of-file tokens --- source | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/source b/source index 02d46e85b03..f14ba314d14 100644 --- a/source +++ b/source @@ -138333,8 +138333,8 @@ dictionary StorageEventInit : EventInit { an element in the HTML namespace, then switch to the CDATA section state. Otherwise, this is a cdata-in-html-content parse - error. Create a comment token whose data is the "[CDATA[" string. Switch to the - bogus comment state.
    + error. Create a comment token whose data is "[CDATA[". Switch to + the bogus comment state.
    Anything else
    This is an StorageEventInit : EventInit {
    EOF
    This is an eof-before-pi-target - parse error. Emit a comment token whose data is the "?" string.
    + parse error. Emit a comment token whose data is "?". Emit an + end-of-file token.
    Anything else
    This is an invalid-first-character-of-pi-target - parse error. Create a comment token whose data is the "?" string. + parse error. Create a comment token whose data is "?". Reconsume in the bogus comment state.
    @@ -139270,7 +139271,7 @@ dictionary StorageEventInit : EventInit {
    Switch to the processing instruction question mark state.
    U+003E GREATER-THAN SIGN (>)
    -
    Switch to the data state. Emit the processing instruction token.
    +
    Switch to the data state. Emit the current processing instruction token.
    ASCII upper alpha
    Append the lowercase version of the current input character (add 0x0020 to the @@ -139283,7 +139284,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-pi parse error. - Emit the current processing instruction token.
    + Emit the current processing instruction token. Emit an end-of-file token.
    Anything else
    Append the current input character to the current processing instruction token's target.
    @@ -139313,7 +139314,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-pi parse error. - Emit the current processing instruction token.
    + Emit the current processing instruction token. Emit an end-of-file token.
    Anything else
    Reconsume in the processing instruction data state.
    @@ -139336,7 +139337,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-pi parse error. - Emit the current processing instruction token.
    + Emit the current processing instruction token. Emit an end-of-file token.
    Anything else
    Append the current input character to the current processing instruction token's data.
    @@ -139356,7 +139357,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-pi parse error. - Emit the current processing instruction token.
    + Emit the current processing instruction token. Emit an end-of-file token.
    Anything else
    This is an Date: Sat, 31 Jan 2026 12:53:53 +0100 Subject: [PATCH 03/21] Use temporary buffer to disallow StorageEventInit : EventInit {
    ASCII alpha
    -
    Create a processing instruction token whose target and data are both the empty string. +
    Create a processing instruction token whose target and data are both the empty string. Set + the temporary buffer to the empty string. Reconsume in the processing instruction target state.
    EOF
    @@ -139265,29 +139266,36 @@ dictionary StorageEventInit : EventInit {
    U+000C FORM FEED (FF)
    U+0020 SPACE
    -
    Switch to the after processing instruction target state.
    -
    U+003F QUESTION MARK (?)
    -
    Switch to the processing instruction question mark state.
    -
    U+003E GREATER-THAN SIGN (>)
    -
    Switch to the data state. Emit the current processing instruction token.
    +
    If the current processing instruction token's target is "xml" or + "xml-stylesheet", discard the current processing instruction token, + create a comment token whose data is the concatenation of "?" and the + temporary buffer, and reconsume in the + bogus comment state. Othwerwise, reconsume in the after + processing instruction target state.
    ASCII upper alpha
    Append the lowercase version of the current input character (add 0x0020 to the - character's code point) to the current processing instruction token's target.
    + character's code point) to the current processing instruction token's target. Append the + current input character to the temporary + buffer.
    U+0000 NULL
    This is an unexpected-null-character parse - error. Append a U+FFFD REPLACEMENT CHARACTER character to the current processing instruction token's target.
    + error. Append a U+FFFD REPLACEMENT CHARACTER character to the current processing + instruction token's target. Append a U+FFFD REPLACEMENT CHARACTER character to the temporary buffer.
    EOF
    This is an eof-in-pi parse error. Emit the current processing instruction token. Emit an end-of-file token.
    Anything else
    -
    Append the current input character to the current processing instruction token's target.
    +
    Append the current input character to the current processing instruction token's + target. Append the current input character to the temporary buffer.
    @@ -139310,7 +139318,7 @@ dictionary StorageEventInit : EventInit {
    Switch to the processing instruction question mark state.
    U+003E GREATER-THAN SIGN (>)
    -
    Switch to the data state. Emit the processing instruction token.
    +
    Switch to the data state. Emit the current processing instruction token.
    EOF
    This is an eof-in-pi parse error. @@ -139333,7 +139341,7 @@ dictionary StorageEventInit : EventInit {
    Switch to the processing instruction question mark state.
    U+003E GREATER-THAN SIGN (>)
    -
    Switch to the data state. Emit the processing instruction token.
    +
    Switch to the data state. Emit the current processing instruction token.
    EOF
    This is an eof-in-pi parse error. From 3e24e4ed02ab3a23ece504874e64226cff3a4605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 31 Jan 2026 13:16:34 +0100 Subject: [PATCH 04/21] Update the syntax section --- source | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/source b/source index b2a7f8ba1da..28a350fa2f7 100644 --- a/source +++ b/source @@ -134771,27 +134771,26 @@ dictionary StorageEventInit : EventInit {

    Processing instructions

    -

    Processing instructions mark locations in - a document for further processing.

    +

    A processing instruction marks a location in a document for further processing.

    -

    A processing instructions must have the following format:

    +

    Processing instructions must have the following format:

      -
    1. The string "<?".
    2. +
    3. "<?".
    4. A target, consisting of ASCII alphanumeric characters.
    5. -
    6. One or more ASCII whitespace.
    7. +
    8. Zero or more ASCII whitespace. If there is to be text in the next step, there + must be one or more ASCII whitespace.
    9. Optionally, text, with the additional restriction that the - text must not contain a U+003E GREATER-THAN SIGN character (>), nor end with a U+003F QUESTION - MARK character (?).
    10. + text must not contain U+003E (>), nor end with U+003F (?). -
    11. Optionally, a U+003F QUESTION MARK character (?).
    12. +
    13. Optionally, U+003F (?).
    14. -
    15. A U+003E GREATER-THAN SIGN character (>).
    16. +
    17. U+003E (>).
    From 06dfd680cf9d26748fb2f29f04201a830ece0fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 31 Jan 2026 13:29:38 +0100 Subject: [PATCH 05/21] Shorten code points in prose --- source | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/source b/source index 28a350fa2f7..54f44996a5c 100644 --- a/source +++ b/source @@ -135088,8 +135088,8 @@ dictionary StorageEventInit : EventInit {

    This error occurs if the parser encounters a code point that is not an ASCII alpha where first code point of a processing instruction target is expected. The preceding - U+003F (?) 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.

    + U+003F (?) and all content that follows up to a U+003E (>) (if present) or to the end of the + input stream is treated as a comment.

    invalid-first-character-of-tag-name @@ -135381,10 +135381,9 @@ dictionary StorageEventInit : EventInit { unexpected-question-mark-in-pi -

    This error occurs if the parser encounters a U+003F (?) code point that is - not immediately followed by a U+003E (>) code point in a processing instruction (e.g., <?marker? >). In this case the parser behaves as if it encountered - ASCII whitespace.

    +

    This error occurs if the parser encounters a U+003F (?) that is not immediately followed + by a U+003E (>) in a processing instruction (e.g., <?marker? >). + In this case the parser behaves as if it encountered ASCII whitespace.

    unknown-named-character-reference From f87fd45de6be18c9614b8d0376d92898be0b4aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 31 Jan 2026 19:37:24 +0100 Subject: [PATCH 06/21] Add an easter egg --- source | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source b/source index 54f44996a5c..86c2d8e4452 100644 --- a/source +++ b/source @@ -139313,7 +139313,7 @@ dictionary StorageEventInit : EventInit {
    Ignore the character.
    U+003F QUESTION MARK (?)
    -
    Switch to the processing instruction question mark state.
    +
    Switch to the processing instruction questionable state.
    U+003E GREATER-THAN SIGN (>)
    Switch to the data state. Emit the current processing instruction token.
    @@ -139336,7 +139336,7 @@ dictionary StorageEventInit : EventInit {
    U+003F QUESTION MARK (?)
    -
    Switch to the processing instruction question mark state.
    +
    Switch to the processing instruction questionable state.
    U+003E GREATER-THAN SIGN (>)
    Switch to the data state. Emit the current processing instruction token.
    @@ -139352,7 +139352,7 @@ dictionary StorageEventInit : EventInit { -
    Processing instruction question mark state
    +
    Processing instruction questionable state

    Consume the next input character:

    From 6b9f62465a34852a619099d1aa7a35db465467e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 31 Jan 2026 21:13:42 +0100 Subject: [PATCH 07/21] Drop the unexpected-question-mark-in-pi error; append the ? like in XML --- source | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/source b/source index 86c2d8e4452..d9bde46f2da 100644 --- a/source +++ b/source @@ -135379,12 +135379,6 @@ dictionary StorageEventInit : EventInit { id="foo">). In this case the parser behaves as if it encountered ASCII whitespace.

    - - unexpected-question-mark-in-pi -

    This error occurs if the parser encounters a U+003F (?) that is not immediately followed - by a U+003E (>) in a processing instruction (e.g., <?marker? >). - In this case the parser behaves as if it encountered ASCII whitespace.

    - unknown-named-character-reference

    This error occurs if the parser encounters an StorageEventInit : EventInit { Emit the current processing instruction token. Emit an end-of-file token.

    Anything else
    -
    This is an unexpected-question-mark-in-pi - parse error. Reconsume in the processing instruction data state.
    +
    Append U+003F (?) to the current processing instruction token's data. Reconsume + in the processing instruction data state.
    From 6b4c1e8e08a7a70f0dfe24eda6e58aa23f6f12c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 31 Jan 2026 22:11:33 +0100 Subject: [PATCH 08/21] Expand on syntax; make xml and xml-stylesheet targets an error --- source | 68 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/source b/source index d9bde46f2da..c267d113f27 100644 --- a/source +++ b/source @@ -134779,22 +134779,52 @@ dictionary StorageEventInit : EventInit {
    1. "<?".
    2. -
    3. A target, consisting of ASCII alphanumeric - characters.
    4. +
    5. A target.
    6. -
    7. Zero or more ASCII whitespace. If there is to be text in the next step, there - must be one or more ASCII whitespace.
    8. +
    9. Zero or more ASCII whitespace. If there is to be data in the next step, there must be one or more ASCII + whitespace.
    10. -
    11. Optionally, text, with the additional restriction that the - text must not contain U+003E (>), nor end with U+003F (?).
    12. +
    13. Optionally, data.
    14. Optionally, U+003F (?).
    15. U+003E (>).
    - -

    TODO compare and contrast to XML processing instructions.

    +

    The target consists of ASCII alphanumeric + and U+002D (-) code points. It must start with an ASCII alpha and must not be an + ASCII case-insensitive match for "xml" or + "xml-stylesheet".

    + +

    The data is text, with the + additional restriction that the text must not contain U+003E (>), nor end with U+003F (?).

    + + +
    +

    Processing instructions in the HTML syntax have some notable differences to + processing instructions in XML:

    + +
      +
    • In HTML, the target can be written with any mix of ASCII + lower and ASCII upper alphas, but is converted + to lowercase by the parser, similar to tag names. In XML, the processing instruction target case + is preserved.

    • + +
    • In HTML, a processing instruction can end with ">" or + "?>", while in XML it can only end with + "?>". This is for compatibility with previously specified behavior of + the "<?" syntax, which was treated as a bogus comment, ending with + ">".

    • + +
    • In HTML, "<?xml ...?>" and + "<?xml-stylesheet ...?>" specifically are not parsed as processing + instructions but instead treated as bogus comments. + This is for compatibility with existing HTML content, where such syntax is relatively common + but should have no effect.

    • +
    +
    @@ -135116,6 +135146,17 @@ dictionary StorageEventInit : EventInit { alpha, a wide range of code points (including ASCII digits) is allowed in subsequent positions.

    + + invalid-pi-target + +

    This error occurs if the parser encounters a processing + instruction target that is "xml" or + "xml-stylesheet". + ASCII alpha where first code point of a processing instruction target is expected. The preceding + U+003F (?) and all content that follows up to a U+003E (>) (if present) or to the end of the + input stream is treated as a comment.

    + missing-attribute-value

    This error occurs if the parser encounters a U+003E (>) code point where an @@ -139261,11 +139302,12 @@ dictionary StorageEventInit : EventInit {

    U+003F QUESTION MARK (?)
    U+003E GREATER-THAN SIGN (>)
    If the current processing instruction token's target is "xml" or - "xml-stylesheet", discard the current processing instruction token, - create a comment token whose data is the concatenation of "?" and the - temporary buffer, and reconsume in the - bogus comment state. Othwerwise, reconsume in the after - processing instruction target state.
    + "xml-stylesheet", this is an invalid-pi-target parse error; + discard the current processing instruction token, create a comment token whose data is the + concatenation of "?" and the temporary + buffer, and reconsume in the bogus comment state. Othwerwise, + reconsume in the after processing instruction target state.
    ASCII upper alpha
    Append the lowercase version of the current input character (add 0x0020 to the From 205c1d7cf67cfbc7a40bf6cbe67fac80f61f4ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 31 Jan 2026 22:33:04 +0100 Subject: [PATCH 09/21] Expand error names (still not the longest) --- source | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/source b/source index c267d113f27..0cea871ee12 100644 --- a/source +++ b/source @@ -135025,7 +135025,7 @@ dictionary StorageEventInit : EventInit { tag.

    - eof-before-pi-target + eof-before-processing-instruction-target

    This error occurs if the parser encounters the end of the input stream where a processing instruction target is expected. The parser treats this as a comment with the text "?".

    @@ -135113,7 +135113,7 @@ dictionary StorageEventInit : EventInit { to quirks mode.

    - invalid-first-character-of-pi-target + invalid-first-character-of-processing-instruction-target

    This error occurs if the parser encounters a code point that is not an ASCII alpha where first code point of a StorageEventInit : EventInit { subsequent positions.

    - invalid-pi-target + invalid-processing-instruction-target

    This error occurs if the parser encounters a processing instruction target that is "xml" or @@ -139275,12 +139275,12 @@ dictionary StorageEventInit : EventInit { Reconsume in the processing instruction target state.

    EOF
    -
    This is an eof-before-pi-target +
    This is an eof-before-processing-instruction-target parse error. Emit a comment token whose data is "?". Emit an end-of-file token.
    Anything else
    -
    This is an invalid-first-character-of-pi-target +
    This is an invalid-first-character-of-processing-instruction-target parse error. Create a comment token whose data is "?". Reconsume in the bogus comment state.
    @@ -139303,11 +139303,12 @@ dictionary StorageEventInit : EventInit {
    U+003E GREATER-THAN SIGN (>)
    If the current processing instruction token's target is "xml" or "xml-stylesheet", this is an invalid-pi-target parse error; - discard the current processing instruction token, create a comment token whose data is the - concatenation of "?" and the temporary - buffer, and reconsume in the bogus comment state. Othwerwise, - reconsume in the after processing instruction target state.
    + data-x="parse-error-invalid-processing-instruction-target">invalid-processing-instruction-target + parse error; discard the current processing instruction token, create a comment + token whose data is the concatenation of "?" and the temporary buffer, and reconsume in the bogus + comment state. Othwerwise, reconsume in the after processing + instruction target state.
    ASCII upper alpha
    Append the lowercase version of the current input character (add 0x0020 to the From b8d6d03adafd4fe5b7388f0ff6041fcb3b844e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Mon, 2 Feb 2026 15:44:15 +0100 Subject: [PATCH 10/21] s/Othwerwise/Otherwise/ --- source | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source b/source index 0cea871ee12..dfb0b9284e4 100644 --- a/source +++ b/source @@ -139307,8 +139307,8 @@ dictionary StorageEventInit : EventInit { parse error; discard the current processing instruction token, create a comment token whose data is the concatenation of "?" and the temporary buffer, and reconsume in the bogus - comment state. Othwerwise, reconsume in the after processing - instruction target state.
    + comment state. Otherwise, reconsume in the after processing instruction + target state.
    ASCII upper alpha
    Append the lowercase version of the current input character (add 0x0020 to the From e1f818297ccecbcc9fe6ca62794b443273b6eccf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Tue, 3 Feb 2026 11:14:30 +0100 Subject: [PATCH 11/21] s/comment/processing instruction/ --- source | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source b/source index dfb0b9284e4..85eb22d7443 100644 --- a/source +++ b/source @@ -140316,9 +140316,11 @@ document.body.appendChild(text); processing a processing instruction token, the user agent must run the following steps:

      -
    1. Let target be the target given in the comment token being processed.

    2. +
    3. Let target be the target given in the processing instruction token being + processed.

    4. -
    5. Let data be the data given in the comment token being processed.

    6. +
    7. Let data be the data given in the processing instruction token being + processed.

    8. Create a ProcessingInstruction node whose target is target, Date: Wed, 4 Feb 2026 18:49:52 +0100 Subject: [PATCH 12/21] Expand eof-in-pi error (missed before) --- source | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/source b/source index 85eb22d7443..fb2ca366a2c 100644 --- a/source +++ b/source @@ -135057,7 +135057,7 @@ dictionary StorageEventInit : EventInit { document preamble, the parser sets the Document to quirks mode.

      - eof-in-pi + eof-in-processing-instruction

      This error occurs if the parser encounters the end of the input stream in a processing instruction. The parser treats such processing instructions as if they are closed immediately before the end of the input @@ -139324,8 +139324,9 @@ dictionary StorageEventInit : EventInit { data-x="temporary buffer">temporary buffer.

    EOF
    -
    This is an eof-in-pi parse error. - Emit the current processing instruction token. Emit an end-of-file token.
    +
    This is an eof-in-processing-instruction + parse error. Emit the current processing instruction token. Emit an end-of-file + token.
    Anything else
    Append the current input character to the current processing instruction token's @@ -139356,8 +139357,9 @@ dictionary StorageEventInit : EventInit {
    Switch to the data state. Emit the current processing instruction token.
    EOF
    -
    This is an eof-in-pi parse error. - Emit the current processing instruction token. Emit an end-of-file token.
    +
    This is an eof-in-processing-instruction + parse error. Emit the current processing instruction token. Emit an end-of-file + token.
    Anything else
    Reconsume in the processing instruction data state.
    @@ -139379,8 +139381,9 @@ dictionary StorageEventInit : EventInit {
    Switch to the data state. Emit the current processing instruction token.
    EOF
    -
    This is an eof-in-pi parse error. - Emit the current processing instruction token. Emit an end-of-file token.
    +
    This is an eof-in-processing-instruction + parse error. Emit the current processing instruction token. Emit an end-of-file + token.
    Anything else
    Append the current input character to the current processing instruction token's data.
    @@ -139399,8 +139402,9 @@ dictionary StorageEventInit : EventInit {
    Switch to the data state. Emit the processing instruction token.
    EOF
    -
    This is an eof-in-pi parse error. - Emit the current processing instruction token. Emit an end-of-file token.
    +
    This is an eof-in-processing-instruction + parse error. Emit the current processing instruction token. Emit an end-of-file + token.
    Anything else
    Append U+003F (?) to the current processing instruction token's data. Reconsume From 2cfc613970524ae2aba3f0b72ca1c4354810e695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Feb 2026 19:02:18 +0100 Subject: [PATCH 13/21] Drop PIs for eof-in-processing-instruction --- source | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/source b/source index fb2ca366a2c..7a0619bfbf5 100644 --- a/source +++ b/source @@ -135024,12 +135024,6 @@ dictionary StorageEventInit : EventInit { code point (e.g., </div/>). Such a tag is treated as a regular end tag.

    - - eof-before-processing-instruction-target -

    This error occurs if the parser encounters the end of the input stream - where a processing instruction target is expected. The parser treats this as a comment with - the text "?".

    - eof-before-tag-name

    This error occurs if the parser encounters the end of the input stream @@ -135059,9 +135053,9 @@ dictionary StorageEventInit : EventInit { eof-in-processing-instruction

    This error occurs if the parser encounters the end of the input stream in a - processing instruction. The parser treats - such processing instructions as if they are closed immediately before the end of the input - stream.

    + processing instruction (e.g., <? or <?marker name=). Such processing + instructions are ignored.

    eof-in-script-html-comment-like-text @@ -139275,9 +139269,8 @@ dictionary StorageEventInit : EventInit { Reconsume in the processing instruction target state.
    EOF
    -
    This is an eof-before-processing-instruction-target - parse error. Emit a comment token whose data is "?". Emit an - end-of-file token.
    +
    This is an eof-in-processing-instruction + parse error. Emit an end-of-file token.
    Anything else
    This is an invalid-first-character-of-processing-instruction-target @@ -139325,8 +139318,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-processing-instruction - parse error. Emit the current processing instruction token. Emit an end-of-file - token.
    + parse error. Emit an end-of-file token.
    Anything else
    Append the current input character to the current processing instruction token's @@ -139358,8 +139350,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-processing-instruction - parse error. Emit the current processing instruction token. Emit an end-of-file - token.
    + parse error. Emit an end-of-file token.
    Anything else
    Reconsume in the processing instruction data state.
    @@ -139382,8 +139373,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-processing-instruction - parse error. Emit the current processing instruction token. Emit an end-of-file - token.
    + parse error. Emit an end-of-file token.
    Anything else
    Append the current input character to the current processing instruction token's data.
    @@ -139403,8 +139393,7 @@ dictionary StorageEventInit : EventInit {
    EOF
    This is an eof-in-processing-instruction - parse error. Emit the current processing instruction token. Emit an end-of-file - token.
    + parse error. Emit an end-of-file token.
    Anything else
    Append U+003F (?) to the current processing instruction token's data. Reconsume From adabda9f4d91e9fb96b55e4605d8af1ace47dd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Feb 2026 19:13:05 +0100 Subject: [PATCH 14/21] Avoid should --- source | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source b/source index 7a0619bfbf5..351ede785e7 100644 --- a/source +++ b/source @@ -134821,8 +134821,8 @@ dictionary StorageEventInit : EventInit {
  • In HTML, "<?xml ...?>" and "<?xml-stylesheet ...?>" specifically are not parsed as processing instructions but instead treated as bogus comments. - This is for compatibility with existing HTML content, where such syntax is relatively common - but should have no effect.

  • + This is for compatibility with existing HTML content, where such syntax is relatively common, + but has no effect.

  • From 64f133a0801f941ee40cdfdaddb90f26342f3f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Feb 2026 23:36:15 +0100 Subject: [PATCH 15/21] Require PI target to be alphanumeric+hyphens or it becomes a comment --- source | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/source b/source index 351ede785e7..25efeb0177a 100644 --- a/source +++ b/source @@ -135005,6 +135005,15 @@ dictionary StorageEventInit : EventInit { as-is except C1 control references that are replaced according to the numeric character reference end state.

    + + disallowed-processing-instruction-target + +

    This error occurs if the parser encounters an ASCII case-insensitive match + for "xml" or "xml-stylesheet" where a processing instruction target that is expected. The + preceding U+003F (?) and all content that follows up to a U+003E (>) (if present) or to the + end of the input stream is treated as a comment.

    + duplicate-attribute

    This error occurs if the parser encounters an StorageEventInit : EventInit { invalid-first-character-of-processing-instruction-target

    This error occurs if the parser encounters a code point that is not an - ASCII alpha where first code point of a ASCII alpha where the first code point of a processing instruction target is expected. The preceding U+003F (?) and all content that follows up to a U+003E (>) (if present) or to the end of the input stream is treated as a comment.

    @@ -135119,7 +135128,7 @@ dictionary StorageEventInit : EventInit { 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 + ASCII alpha where the 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 @@ -135143,10 +135152,8 @@ dictionary StorageEventInit : EventInit { invalid-processing-instruction-target -

    This error occurs if the parser encounters a processing - instruction target that is "xml" or - "xml-stylesheet". - ASCII alpha where first code point of a This error occurs if the parser encounters a code point that is not an + ASCII alphanumeric or U+002D (-) where a processing instruction target is expected. The preceding U+003F (?) and all content that follows up to a U+003E (>) (if present) or to the end of the input stream is treated as a comment.

    @@ -139295,8 +139302,8 @@ dictionary StorageEventInit : EventInit {
    U+003F QUESTION MARK (?)
    U+003E GREATER-THAN SIGN (>)
    If the current processing instruction token's target is "xml" or - "xml-stylesheet", this is an invalid-processing-instruction-target + "xml-stylesheet", this is a disallowed-processing-instruction-target parse error; discard the current processing instruction token, create a comment token whose data is the concatenation of "?" and the temporary buffer, and reconsume in the bogus @@ -139309,21 +139316,23 @@ dictionary StorageEventInit : EventInit { current input character to the temporary buffer.
    -
    U+0000 NULL
    -
    This is an unexpected-null-character parse - error. Append a U+FFFD REPLACEMENT CHARACTER character to the current processing - instruction token's target. Append a U+FFFD REPLACEMENT CHARACTER character to the temporary buffer.
    +
    ASCII lower alpha
    +
    ASCII digit
    +
    U+002D HYPHEN-MINUS (-)
    +
    Append the current input character to the current processing instruction + token's target. Append the current input character to the temporary buffer.
    EOF
    This is an eof-in-processing-instruction parse error. Emit an end-of-file token.
    Anything else
    -
    Append the current input character to the current processing instruction token's - target. Append the current input character to the temporary buffer.
    +
    This is an invalid-processing-instruction-target + parse error. Discard the current processing instruction token. Create a comment + token whose data is the concatenation of "?" and the temporary buffer. Reconsume in the bogus + comment state.
    From 5aebf7ea78de73806e07f81ccdfec774bf693e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Thu, 5 Feb 2026 23:14:55 +0100 Subject: [PATCH 16/21] Editorial: use the temporary buffer until token type is decided (never discard) --- source | 65 +++++++++++++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/source b/source index 25efeb0177a..cdaf64b797d 100644 --- a/source +++ b/source @@ -135008,11 +135008,11 @@ dictionary StorageEventInit : EventInit { disallowed-processing-instruction-target -

    This error occurs if the parser encounters an ASCII case-insensitive match - for "xml" or "xml-stylesheet" where a processing instruction target that is expected. The - preceding U+003F (?) and all content that follows up to a U+003E (>) (if present) or to the - end of the input stream is treated as a comment.

    +

    This error occurs if the parser encounters a processing + instruction target that is an ASCII case-insensitive match for "xml" or "xml-stylesheet". The preceding U+003F (?) and + all content that follows up to a U+003E (>) (if present) or to the end of the input + stream is treated as a comment.

    duplicate-attribute @@ -139271,8 +139271,7 @@ dictionary StorageEventInit : EventInit {
    ASCII alpha
    -
    Create a processing instruction token whose target and data are both the empty string. Set - the temporary buffer to the empty string. +
    Set the temporary buffer to the empty string. Reconsume in the processing instruction target state.
    EOF
    @@ -139301,26 +139300,37 @@ dictionary StorageEventInit : EventInit {
    U+0020 SPACE
    U+003F QUESTION MARK (?)
    U+003E GREATER-THAN SIGN (>)
    -
    If the current processing instruction token's target is "xml" or - "xml-stylesheet", this is a disallowed-processing-instruction-target - parse error; discard the current processing instruction token, create a comment - token whose data is the concatenation of "?" and the temporary buffer, and reconsume in the bogus - comment state. Otherwise, reconsume in the after processing instruction - target state.
    +
    +

    Let target be the temporary buffer, + converted to ASCII lowercase.

    -
    ASCII upper alpha
    -
    Append the lowercase version of the current input character (add 0x0020 to the - character's code point) to the current processing instruction token's target. Append the - current input character to the temporary - buffer.
    +

    If target is "xml" or "xml-stylesheet":

    -
    ASCII lower alpha
    -
    ASCII digit
    +
      +
    1. This is a disallowed-processing-instruction-target + parse error.

    2. + +
    3. Create a comment token whose data is the concatenation of "?" and + the temporary buffer.

    4. + +
    5. Reconsume in the bogus comment state.

    6. +
    + +

    Otherwise:

    + +
      +
    1. Create a processing instruction token whose target is target and data is the + empty string.

    2. + +
    3. Reconsume in the after processing instruction target + state.

    4. +
    + + +
    ASCII alphanumeric
    U+002D HYPHEN-MINUS (-)
    -
    Append the current input character to the current processing instruction - token's target. Append the current input character to the temporary buffer.
    EOF
    @@ -139329,10 +139339,9 @@ dictionary StorageEventInit : EventInit {
    Anything else
    This is an invalid-processing-instruction-target - parse error. Discard the current processing instruction token. Create a comment - token whose data is the concatenation of "?" and the temporary buffer. Reconsume in the bogus - comment state.
    + parse error. Create a comment token whose data is the concatenation of "?" and the temporary buffer. + Reconsume in the bogus comment state.
    From e7be184a53cdd37b39f4471987b51f6d7b07abc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Sat, 7 Feb 2026 00:54:28 +0100 Subject: [PATCH 17/21] Preserve PI target case and replace with comment on error --- source | 58 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/source b/source index cdaf64b797d..98393b70d5a 100644 --- a/source +++ b/source @@ -137110,6 +137110,25 @@ dictionary StorageEventInit : EventInit { character token otherwise.

    +
    +

    To replace processing instruction with comment:

    + +
      +
    1. Assert: The current token is a processing instruction token whose data is the + empty string.

    2. + +
    3. Let consumed be the current processing instruction token's target.

    4. + +
    5. +

      Create a comment token whose data is "?".

      + +

      This replaces the processing instruction token, which is never emitted.

      +
    6. + +
    7. Append consumed to the current comment token's data.

    8. +
    +
    +

    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 @@ -137266,7 +137285,8 @@ dictionary StorageEventInit : EventInit { the tag name state.

    U+003F QUESTION MARK (?)
    -
    Switch to the processing instruction open state.
    +
    Create a processing instruction token whose target and data are both the empty string. Switch + to the processing instruction open state.
    EOF
    This is an eof-before-tag-name @@ -139271,8 +139291,8 @@ dictionary StorageEventInit : EventInit {
    ASCII alpha
    -
    Set the temporary buffer to the empty string. - Reconsume in the processing instruction target state. +
    Append the current input character to the current processing instruction + token's target. Switch to the processing instruction target state.
    EOF
    This is an eof-in-processing-instruction @@ -139280,7 +139300,7 @@ dictionary StorageEventInit : EventInit {
    Anything else
    This is an invalid-first-character-of-processing-instruction-target - parse error. Create a comment token whose data is "?". + parse error. Replace processing instruction with comment. Reconsume in the bogus comment state.
    @@ -139301,18 +139321,14 @@ dictionary StorageEventInit : EventInit {
    U+003F QUESTION MARK (?)
    U+003E GREATER-THAN SIGN (>)
    -

    Let target be the temporary buffer, - converted to ASCII lowercase.

    - -

    If target is "xml" or "xml-stylesheet":

    +

    If the current processing instruction token's target is "xml" or + "xml-stylesheet":

    1. This is a disallowed-processing-instruction-target parse error.

    2. -
    3. Create a comment token whose data is the concatenation of "?" and - the temporary buffer.

    4. +
    5. Replace processing instruction with comment.

    6. Reconsume in the bogus comment state.

    @@ -139320,9 +139336,6 @@ dictionary StorageEventInit : EventInit {

    Otherwise:

      -
    1. Create a processing instruction token whose target is target and data is the - empty string.

    2. -
    3. Reconsume in the after processing instruction target state.

    @@ -139330,8 +139343,8 @@ dictionary StorageEventInit : EventInit {
    ASCII alphanumeric
    U+002D HYPHEN-MINUS (-)
    -
    Append the current input character to the temporary buffer.
    +
    Append the current input character to the current processing instruction + token's target.
    EOF
    This is an eof-in-processing-instruction @@ -139339,8 +139352,7 @@ dictionary StorageEventInit : EventInit {
    Anything else
    This is an invalid-processing-instruction-target - parse error. Create a comment token whose data is the concatenation of "?" and the temporary buffer. + parse error. Replace processing instruction with comment. Reconsume in the bogus comment state.
    @@ -139360,16 +139372,6 @@ dictionary StorageEventInit : EventInit {
    U+0020 SPACE
    Ignore the character.
    -
    U+003F QUESTION MARK (?)
    -
    Switch to the processing instruction questionable state.
    - -
    U+003E GREATER-THAN SIGN (>)
    -
    Switch to the data state. Emit the current processing instruction token.
    - -
    EOF
    -
    This is an eof-in-processing-instruction - parse error. Emit an end-of-file token.
    -
    Anything else
    Reconsume in the processing instruction data state.
    From 4deed122373d939f3b7e9449aa12bc6c49883323 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Tue, 10 Feb 2026 21:17:32 +0100 Subject: [PATCH 18/21] Make target case-sensitive in syntax and error desc --- source | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/source b/source index 98393b70d5a..7e85a77fbac 100644 --- a/source +++ b/source @@ -134792,10 +134792,9 @@ dictionary StorageEventInit : EventInit {
  • U+003E (>).
  • -

    The target consists of ASCII alphanumeric - and U+002D (-) code points. It must start with an ASCII alpha and must not be an - ASCII case-insensitive match for "xml" or - "xml-stylesheet".

    +

    The target consists of ASCII alphanumeric and + U+002D (-) code points. It must start with an ASCII alpha and must not equal "xml" or "xml-stylesheet".

    The data is text, with the additional restriction that the text must not contain U+003E (>), nor end with U+003F (?).

    @@ -134806,11 +134805,6 @@ dictionary StorageEventInit : EventInit { processing instructions in XML:

      -
    • In HTML, the target can be written with any mix of ASCII - lower and ASCII upper alphas, but is converted - to lowercase by the parser, similar to tag names. In XML, the processing instruction target case - is preserved.

    • -
    • In HTML, a processing instruction can end with ">" or "?>", while in XML it can only end with "?>". This is for compatibility with previously specified behavior of @@ -135009,10 +135003,10 @@ dictionary StorageEventInit : EventInit { disallowed-processing-instruction-target

      This error occurs if the parser encounters a processing - instruction target that is an ASCII case-insensitive match for "xml" or "xml-stylesheet". The preceding U+003F (?) and - all content that follows up to a U+003E (>) (if present) or to the end of the input - stream is treated as a comment.

      + instruction target that is "xml" or "xml-stylesheet". The preceding U+003F (?) and all content that follows up to + a U+003E (>) (if present) or to the end of the input stream is treated as a + comment.

      duplicate-attribute From 85030c62806448226e44f4c4542b05dbf76b51eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Tue, 10 Feb 2026 21:24:47 +0100 Subject: [PATCH 19/21] leave out "but has no effect" --- source | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source b/source index 7e85a77fbac..2697206f42a 100644 --- a/source +++ b/source @@ -134815,8 +134815,8 @@ dictionary StorageEventInit : EventInit {
    • In HTML, "<?xml ...?>" and "<?xml-stylesheet ...?>" specifically are not parsed as processing instructions but instead treated as bogus comments. - This is for compatibility with existing HTML content, where such syntax is relatively common, - but has no effect.

    • + This is for compatibility with existing HTML content, where such syntax is relatively + common.

    From 65216c4d1a0b0630f98bb04f93ff2e172fab8f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Tue, 10 Feb 2026 21:31:13 +0100 Subject: [PATCH 20/21] lowercase after assert --- source | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source b/source index 2697206f42a..9fd80281d26 100644 --- a/source +++ b/source @@ -137108,7 +137108,7 @@ dictionary StorageEventInit : EventInit {

    To replace processing instruction with comment:

      -
    1. Assert: The current token is a processing instruction token whose data is the +

    2. Assert: the current token is a processing instruction token whose data is the empty string.

    3. Let consumed be the current processing instruction token's target.

    4. @@ -143268,7 +143268,7 @@ document.body.appendChild(text);
      A start tag whose tag name is one of: "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr"
      -

      Assert: The stack of open elements has a td or th element in table scope.