From f78b760c3a5fd8815cef29e303a7fac0e103179b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Mon, 2 Mar 2026 21:44:13 +0100 Subject: [PATCH 01/15] Define processing instruction attributes --- dom.bs | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 164 insertions(+), 1 deletion(-) diff --git a/dom.bs b/dom.bs index 5266d1bbe..3d4470da0 100644 --- a/dom.bs +++ b/dom.bs @@ -6005,11 +6005,15 @@ method steps are: "?>", then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. -
  • Return a new {{ProcessingInstruction}} +
  • Let pi be a new {{ProcessingInstruction}} node, with target set to target, data set to data, and node document set to this. + +
  • Update attributes from data for pi. + +
  • Return pi.
    @@ -8263,6 +8267,9 @@ with an integer offset, integer count, and string dat end offset by data's length and decrease it by count. +
  • If node is a {{ProcessingInstruction}} node, + then update attributes from data for node. +

  • If node's parent is non-null, then run the children changed steps for node's parent. @@ -8518,17 +8525,173 @@ interface CDATASection : Text {

     [Exposed=Window]
     interface ProcessingInstruction : CharacterData {
    +  constructor(DOMString target, optional DOMString data = "");
    +
       readonly attribute DOMString target;
    +
    +  DOMString? getAttribute(DOMString name);
    +  undefined setAttribute(DOMString name, DOMString value);
    +  undefined removeAttribute(DOMString name);
    +  boolean hasAttribute(DOMString name);
     };
    +
    +
    pi = new ProcessingInstruction(target [, data = ""]) +
    Returns a new {{ProcessingInstruction}} node whose + target is target and + data is data. +
    + +
    +

    The new ProcessingInstruction(target, data) +constructor steps are: + +

      +
    1. If target does not match the [=XML/Name=] production, + then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. + +

    2. If data contains the string + "?>", then throw an + "{{InvalidCharacterError!!exception}}" {{DOMException}}. + +

    3. Set this's target to target, + this's data to data, and + this's node document to current global object's + associated Document. + +

    4. Update attributes from data for this. +

    +
    +

    {{ProcessingInstruction}} nodes have an associated target. +

    {{ProcessingInstruction}} nodes have an associated +attribute map, which is a +map, initially empty. +

    The target getter steps are to return this's target.

    +
    +

    The getAttribute(name) method +steps are: + +

      +
    1. If this's node document is an HTML document, then set + name to name in ASCII lowercase. + +

    2. Return this's attribute map[name] + with default null. +

    +
    + +
    +

    The setAttribute(name, value) +method steps are: + +

      +
    1. If this's node document is an HTML document, then set + name to name in ASCII lowercase. + +

    2. Set this's attribute map[name] + to value. + +

    3. Update data from attributes for this. +

    +
    + +
    +

    The removeAttribute(name) +method steps are: + +

      +
    1. If this's node document is an HTML document, then set + name to name in ASCII lowercase. + +

    2. Remove this's + attribute map[name]. + +

    3. Update data from attributes for this. +

    +
    + +
    +

    The hasAttribute(name) +method steps are: + +

      +
    1. If this's node document is an HTML document, then set + name to name in ASCII lowercase. + +

    2. Return true if this's attribute map[name] + exists; otherwise false. +

    +
    + +
    +

    To update attributes from data for a {{ProcessingInstruction}} node pi: + +

      +
    1. Clear pi's attribute map. + +

    2. Let context be the result of creating an element given + pi's node document, "html", and the HTML namespace. + +

    3. Let markup be the concatentation of "<attrs ", + pi's data, and + "></attrs>". + +

    4. Let fragment be the result of invoking the fragment parsing algorithm steps with context and markup. + +

    5. +

      If fragment's first child is an element: + +

        +
      1. Let element be the first child of fragment. + +

      2. Assert: element is an element with local name "attrs". + +

      3. For each attribute of element's + attribute list, set pi's + attribute map[attribute's local name] + to attribute's value. +

      +
    +
    + +
    +

    To update data from attributes for a {{ProcessingInstruction}} node pi: + +

      +
    1. Let data be the empty string. + +

    2. +

      For each namevalue of pi's + attribute map: + +

        +
      1. If data is not the empty string, append U+0020 SPACE to data. + +

      2. Append name to data. + +

      3. Append U+003D (=) to data. + +

      4. Append U+0022 (") to data. + +

      5. Append the result of escaping a string + given value to data. + +

      6. Append U+0022 (") to data. +

      + +
    3. Replace data of pi with 0, pi's length, and + data. +

    +
    +

    Interface {{Comment}}

    From 3af535d0c4a6d8bcbe4abc781bdeb2b711eed760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Mar 2026 15:07:23 +0100 Subject: [PATCH 02/15] Check valid attribute local name in pi.setAttribute() --- dom.bs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dom.bs b/dom.bs index 3d4470da0..68813c09d 100644 --- a/dom.bs +++ b/dom.bs @@ -8593,6 +8593,9 @@ steps are: method steps are:
      +
    1. If name is not a valid attribute local name, then throw an + "{{InvalidCharacterError!!exception}}" {{DOMException}}. +

    2. If this's node document is an HTML document, then set name to name in ASCII lowercase. From 5e8ef49e384ac44dfafb8ef380b183f405691f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Mar 2026 15:16:02 +0100 Subject: [PATCH 03/15] hasAttributes() --- dom.bs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dom.bs b/dom.bs index 68813c09d..73a7b4b7e 100644 --- a/dom.bs +++ b/dom.bs @@ -8529,6 +8529,7 @@ interface ProcessingInstruction : CharacterData { readonly attribute DOMString target; + boolean hasAttributes(); DOMString? getAttribute(DOMString name); undefined setAttribute(DOMString name, DOMString value); undefined removeAttribute(DOMString name); @@ -8575,6 +8576,12 @@ constructor steps are: this's target. +

      +

      The hasAttributes() method steps are to +return false if this's attribute map is empty; +otherwise true. +

      +

      The getAttribute(name) method steps are: From 1e323086cfa429e6ad60cc8f59856f0cb544fa87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Mar 2026 15:20:46 +0100 Subject: [PATCH 04/15] getAttributeNames() --- dom.bs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dom.bs b/dom.bs index 73a7b4b7e..d92282c3f 100644 --- a/dom.bs +++ b/dom.bs @@ -8530,6 +8530,7 @@ interface ProcessingInstruction : CharacterData { readonly attribute DOMString target; boolean hasAttributes(); + sequence<DOMString> getAttributeNames(); DOMString? getAttribute(DOMString name); undefined setAttribute(DOMString name, DOMString value); undefined removeAttribute(DOMString name); @@ -8582,6 +8583,12 @@ return false if this's attribute map +

      +

      The getAttribute(name) method steps are: From 5738e8698206ec1b574d0c1a7b728a18c8fea05a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Mar 2026 15:33:45 +0100 Subject: [PATCH 05/15] toggleAttribute() --- dom.bs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/dom.bs b/dom.bs index d92282c3f..ff7cc2841 100644 --- a/dom.bs +++ b/dom.bs @@ -8534,6 +8534,7 @@ interface ProcessingInstruction : CharacterData { DOMString? getAttribute(DOMString name); undefined setAttribute(DOMString name, DOMString value); undefined removeAttribute(DOMString name); + boolean toggleAttribute(DOMString name, optional boolean force); boolean hasAttribute(DOMString name); }; @@ -8635,6 +8636,37 @@ method steps are:

    +
    +

    The toggleAttribute(name, force) +method steps are: + +

      +
    1. If name is not a valid attribute local name, then throw an + "{{InvalidCharacterError!!exception}}" {{DOMException}}. + +

    2. If this's node document is an HTML document, then set + name to name in ASCII lowercase. + +

    3. Let attributes be this's attribute map. + +

    4. +

      If attributes[name] does not exist: + +

        +
      1. If force is not given or is true, set attributes[name] + to the empty string, update data from attributes for this, and then return true. + +

      2. Return false. +

      + +
    5. Otherwise, if force is not given or is false, remove + attributes[name], update data from attributes for this, and + then return false. + +

    6. Return true. +

    +
    +

    The hasAttribute(name) method steps are: From 45e7affc9158fe757f640c542a5a45d121089306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Wed, 4 Mar 2026 16:29:20 +0100 Subject: [PATCH 06/15] Avoid updating attributes when updating data from attributes --- dom.bs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/dom.bs b/dom.bs index ff7cc2841..e1d41c333 100644 --- a/dom.bs +++ b/dom.bs @@ -8225,7 +8225,8 @@ string called data.

    To replace data of a node node -with an integer offset, integer count, and string data: +with an integer offset, integer count, string data, and an optional +boolean piAttributesAlreadyUpdated (default false):

    1. Let length be node's length. @@ -8267,8 +8268,9 @@ with an integer offset, integer count, and string dat end offset by data's length and decrease it by count. -

    2. If node is a {{ProcessingInstruction}} node, - then update attributes from data for node. +

    3. If node is a {{ProcessingInstruction}} node and + piAttributesAlreadyUpdated is false, then update attributes from data for + node.

    4. If node's parent is non-null, then run the children changed steps for node's parent. @@ -8736,8 +8738,8 @@ method steps are:

    5. Append U+0022 (") to data.

    -
  • Replace data of pi with 0, pi's length, and - data. +

  • Replace data of pi with 0, pi's length, + data, and true. From a44155a8fc0c2c4a4398110ba5d60337628ed95f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Thu, 5 Mar 2026 09:39:27 +0100 Subject: [PATCH 07/15] wrap at 100 --- dom.bs | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/dom.bs b/dom.bs index e1d41c333..626c6473e 100644 --- a/dom.bs +++ b/dom.bs @@ -8548,7 +8548,8 @@ interface ProcessingInstruction : CharacterData {

    -

    The new ProcessingInstruction(target, data) +

    The +new ProcessingInstruction(target, data) constructor steps are:

      @@ -8582,8 +8583,8 @@ constructor steps are:

      The hasAttributes() method steps are to -return false if this's attribute map is empty; -otherwise true. +return false if this's attribute map +is empty; otherwise true.

      @@ -8606,7 +8607,8 @@ steps are:
      -

      The setAttribute(name, value) +

      The +setAttribute(name, value) method steps are:

        @@ -8616,8 +8618,8 @@ method steps are:
      1. If this's node document is an HTML document, then set name to name in ASCII lowercase. -

      2. Set this's attribute map[name] - to value. +

      3. Set this's + attribute map[name] to value.

      4. Update data from attributes for this.

      @@ -8639,7 +8641,8 @@ method steps are:
      -

      The toggleAttribute(name, force) +

      The +toggleAttribute(name, force) method steps are:

        @@ -8683,7 +8686,8 @@ method steps are:
      -

      To update attributes from data for a {{ProcessingInstruction}} node pi: +

      To update attributes from data for a {{ProcessingInstruction}} node +pi:

      1. Clear pi's attribute map. @@ -8695,7 +8699,8 @@ method steps are: pi's data, and "></attrs>". -

      2. Let fragment be the result of invoking the fragment parsing algorithm steps with context and markup. +

      3. Let fragment be the result of invoking the + fragment parsing algorithm steps with context and markup.

      4. If fragment's first child is an element: @@ -8703,7 +8708,8 @@ method steps are:

        1. Let element be the first child of fragment. -

        2. Assert: element is an element with local name "attrs". +

        3. Assert: element is an element with local name + "attrs".

        4. For each attribute of element's attribute list, set pi's @@ -8714,7 +8720,8 @@ method steps are:

      -

      To update data from attributes for a {{ProcessingInstruction}} node pi: +

      To update data from attributes for a {{ProcessingInstruction}} node +pi:

      1. Let data be the empty string. @@ -8732,8 +8739,9 @@ method steps are:

      2. Append U+0022 (") to data. -

      3. Append the result of escaping a string - given value to data. +

      4. Append the result of + escaping a string given + value to data.

      5. Append U+0022 (") to data.

      From ddac16ffe1a500cad4eb6ae14e86a2af2edde5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Thu, 5 Mar 2026 09:40:13 +0100 Subject: [PATCH 08/15] if...then --- dom.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dom.bs b/dom.bs index 626c6473e..8ecc10827 100644 --- a/dom.bs +++ b/dom.bs @@ -8731,7 +8731,7 @@ method steps are: attribute map:
        -
      1. If data is not the empty string, append U+0020 SPACE to data. +

      2. If data is not the empty string, then append U+0020 SPACE to data.

      3. Append name to data. From d296298e126b9c7309ff73a8379ae70e93f4f30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Thu, 5 Mar 2026 09:57:18 +0100 Subject: [PATCH 09/15] complete domintro --- dom.bs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/dom.bs b/dom.bs index 8ecc10827..3bec9fcbb 100644 --- a/dom.bs +++ b/dom.bs @@ -8545,6 +8545,36 @@ interface ProcessingInstruction : CharacterData {

        Returns a new {{ProcessingInstruction}} node whose target is target and data is data. + +
        pi . {{ProcessingInstruction/target}} +
        Returns the target. + +
        pi . hasAttributes() +

        Returns true if pi has attributes; otherwise false. + +

        pi . getAttributeNames() +

        Returns the names of all of pi's attributes. Cannot contain duplicates. + +

        pi . getAttribute(name) +

        Returns the value of pi's attribute named name, and null if there is + no such attribute. + +

        pi . setAttribute(name, value) +

        Sets pi's attribute named name to value. + +

        pi . removeAttribute(name) +

        Removes pi's attribute named name. + +

        pi . toggleAttribute(name [, force]) +
        +

        If force is not given, "toggles" name, removing it if it is + present and adding it if it is not present. If force is true, adds + name. If force is false, removes name. + +

        Returns true if name is now present; otherwise false. + +

        pi . hasAttribute(name) +

        Returns true if pi has an attribute named name; otherwise false.

        From 0ea96c1c1f258ad96cd7896a3857bce65a2f4895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Mon, 9 Mar 2026 14:32:02 +0100 Subject: [PATCH 10/15] Add an initialize algo for ProcessingInstruction --- dom.bs | 59 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/dom.bs b/dom.bs index 3bec9fcbb..7e98142cd 100644 --- a/dom.bs +++ b/dom.bs @@ -815,7 +815,7 @@ method steps are:
        1. If this's dispatch flag is set, then return. -

        2. Initialize this with type, bubbles, and +

        3. Initialize this with type, bubbles, and cancelable.

        @@ -886,7 +886,7 @@ method steps are:
        1. If this's dispatch flag is set, then return. -

        2. Initialize this with type, bubbles, and +

        3. Initialize this with type, bubbles, and cancelable.

        4. Set this's {{CustomEvent/detail}} attribute to detail. @@ -5997,23 +5997,13 @@ and node document is this. method steps are:

            -
          1. If target does not match the - [=XML/Name=] production, - then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. +
          2. Let pi be a new {{ProcessingInstruction}} + node, with node document set to this. -

          3. If data contains the string - "?>", then throw an - "{{InvalidCharacterError!!exception}}" {{DOMException}}. - -
          4. Let pi be a new {{ProcessingInstruction}} - node, with - target set to target, - data set to data, and - node document set to this. - -
          5. Update attributes from data for pi. +
          6. Initialize pi with target and + data. -

          7. Return pi. +
          8. Return pi.


          @@ -8583,18 +8573,12 @@ interface ProcessingInstruction : CharacterData { constructor steps are:
            -
          1. If target does not match the [=XML/Name=] production, - then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. - -

          2. If data contains the string - "?>", then throw an - "{{InvalidCharacterError!!exception}}" {{DOMException}}. - -

          3. Set this's target to target, - this's data to data, and - this's node document to current global object's +

          4. Set this's node document to current global object's associated Document. +

          5. Initialize this with target and + data. +

          6. Update attributes from data for this.

      @@ -8715,6 +8699,27 @@ method steps are:
    +
    +

    To initialize a +{{ProcessingInstruction}} node pi with target and +data: + +

      +
    1. If target does not match the [=XML/Name=] production, then + throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. + + +

    2. If data contains the string "?>", then throw an + "{{InvalidCharacterError!!exception}}" {{DOMException}}. + +

    3. Set pi's target to target. + +

    4. Set pi's data to data. + +

    5. Update attributes from data for pi. +

    +
    +

    To update attributes from data for a {{ProcessingInstruction}} node pi: From b7f28b0686ab542684b3c9c2df7bb208d9b2c96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Mon, 9 Mar 2026 20:03:38 +0100 Subject: [PATCH 11/15] Make PI attribute API case-sensitive --- dom.bs | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/dom.bs b/dom.bs index 7e98142cd..c738fac88 100644 --- a/dom.bs +++ b/dom.bs @@ -8609,15 +8609,8 @@ are to return the result of getting the keys of this's

    The getAttribute(name) method -steps are: - -

      -
    1. If this's node document is an HTML document, then set - name to name in ASCII lowercase. - -

    2. Return this's attribute map[name] - with default null. -

    +steps are to return this's attribute map[name] +with default null.
    @@ -8629,9 +8622,6 @@ method steps are:
  • If name is not a valid attribute local name, then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. -

  • If this's node document is an HTML document, then set - name to name in ASCII lowercase. -

  • Set this's attribute map[name] to value. @@ -8644,9 +8634,6 @@ method steps are: method steps are:

      -
    1. If this's node document is an HTML document, then set - name to name in ASCII lowercase. -

    2. Remove this's attribute map[name]. @@ -8663,9 +8650,6 @@ method steps are:

    3. If name is not a valid attribute local name, then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. -

    4. If this's node document is an HTML document, then set - name to name in ASCII lowercase. -

    5. Let attributes be this's attribute map.

    6. @@ -8688,15 +8672,9 @@ method steps are:

      The hasAttribute(name) -method steps are: - -

        -
      1. If this's node document is an HTML document, then set - name to name in ASCII lowercase. - -

      2. Return true if this's attribute map[name] - exists; otherwise false. -

      +method steps are to return true if this's +attribute map[name] exists; otherwise +false.
      From aa979b581723c6d048b47d25c6608f72a56b539b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Mon, 9 Mar 2026 23:07:28 +0100 Subject: [PATCH 12/15] Handle exceptions in fragment parsing algorithm steps --- dom.bs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dom.bs b/dom.bs index c738fac88..8b84cef27 100644 --- a/dom.bs +++ b/dom.bs @@ -8713,7 +8713,8 @@ false. "></attrs>".
    7. Let fragment be the result of invoking the - fragment parsing algorithm steps with context and markup. + fragment parsing algorithm steps with context and markup. If this + throws an exception, then return.

    8. If fragment's first child is an element: From c19459c77a2083361a755d4a83179b31f91d4f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Thu, 12 Mar 2026 15:49:30 +0100 Subject: [PATCH 13/15] Always parse PI attributes using the HTML parser --- dom.bs | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/dom.bs b/dom.bs index 8b84cef27..03ec59764 100644 --- a/dom.bs +++ b/dom.bs @@ -8705,31 +8705,19 @@ false.

      1. Clear pi's attribute map. -

      2. Let context be the result of creating an element given - pi's node document, "html", and the HTML namespace. +

      3. Let document be a new {{Document}} node whose type is + "html". -

      4. Let markup be the concatentation of "<attrs ", - pi's data, and - "></attrs>". +

      5. Let html be the concatentation of "<html ", + pi's data, and ">". -

      6. Let fragment be the result of invoking the - fragment parsing algorithm steps with context and markup. If this - throws an exception, then return. +

      7. Parse HTML from a string + given document and html. -

      8. -

        If fragment's first child is an element: - -

          -
        1. Let element be the first child of fragment. - -

        2. Assert: element is an element with local name - "attrs". - -

        3. For each attribute of element's - attribute list, set pi's - attribute map[attribute's local name] - to attribute's value. -

        +
      9. For each attribute of document's + document element's attribute list, set pi's + attribute map[attribute's local name] + to attribute's value.

      From 10bfd75ad0523e287ef26dc1c0ecefb046efbaa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Thu, 12 Mar 2026 16:34:08 +0100 Subject: [PATCH 14/15] Canonicalize to lowercase in PI APIs --- dom.bs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/dom.bs b/dom.bs index 03ec59764..99941eb23 100644 --- a/dom.bs +++ b/dom.bs @@ -8609,8 +8609,14 @@ are to return the result of getting the keys of this's

      The getAttribute(name) method -steps are to return this's attribute map[name] -with default null. +steps are: + +

        +
      1. Set name to name in ASCII lowercase. + +

      2. Return this's attribute map[name] + with default null. +

      @@ -8622,6 +8628,8 @@ method steps are:
    9. If name is not a valid attribute local name, then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. +

    10. Set name to name in ASCII lowercase. +

    11. Set this's attribute map[name] to value. @@ -8634,6 +8642,8 @@ method steps are: method steps are:

        +
      1. Set name to name in ASCII lowercase. +

      2. Remove this's attribute map[name]. @@ -8650,6 +8660,8 @@ method steps are:

      3. If name is not a valid attribute local name, then throw an "{{InvalidCharacterError!!exception}}" {{DOMException}}. +

      4. Set name to name in ASCII lowercase. +

      5. Let attributes be this's attribute map.

      6. @@ -8672,9 +8684,14 @@ method steps are:

        The hasAttribute(name) -method steps are to return true if this's -attribute map[name] exists; otherwise -false. +method steps are: + +

          +
        1. Set name to name in ASCII lowercase. + +

        2. Return true if this's attribute map[name] + exists; otherwise false. +

        From c715387ce8f85f1c938a38dd459a45905988ddb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20J=C3=A4genstedt?= Date: Fri, 24 Apr 2026 17:37:29 +0200 Subject: [PATCH 15/15] fix typo --- dom.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dom.bs b/dom.bs index 99941eb23..e337fd35a 100644 --- a/dom.bs +++ b/dom.bs @@ -8725,7 +8725,7 @@ method steps are:
      7. Let document be a new {{Document}} node whose type is "html". -

      8. Let html be the concatentation of "<html ", +

      9. Let html be the concatenation of "<html ", pi's data, and ">".

      10. Parse HTML from a string