Skip to content

Support <selectedcontent> in <select multiple>#12430

Open
josepharhar wants to merge 31 commits into
whatwg:mainfrom
josepharhar:selectedcontentmultiple
Open

Support <selectedcontent> in <select multiple>#12430
josepharhar wants to merge 31 commits into
whatwg:mainfrom
josepharhar:selectedcontentmultiple

Conversation

@josepharhar
Copy link
Copy Markdown
Contributor

@josepharhar josepharhar commented May 8, 2026

This PR adds support for using the selectedcontent element in a select
element with the multiple attribute by cloning each of the option
elements into the selectedcontent element.

Each cloned option will be wrapped by a generated div element inside the
selectedcontent element, so the resulting DOM would look like this:

<select multiple size=1>
  <selectedcontent>
    <div>one</div>
    <div>two</div>
  </selectedcontent>
  <option selected>one</option>
  <option selected>two</option>
  <option>three</option>
</select>

Fixes #12342

(See WHATWG Working Mode: Changes for more details.)


/form-elements.html ( diff )

This PR improves the "clear a select's non-primary selectedcontent
elements" algorithm by making it create a list of selectedcontent
elements to modify separately from modifying them in order to prevent
the list of elements to change while iterating.

Fixes whatwg#11880
This PR makes sure that the contents of the selectedcontent element stay
up to date when the selected option is changed in the selectedness
setting algorithm.

This issue was found here:
web-platform-tests/wpt#55849 (comment)
In order to make the selectedness setting algorithm match
implementations, this PR makes the selectedness setting algorithm avoid
changing the selectedness of option elements which haven't ran their
insertion steps yet by checking whether the options have their cached
nearest ancestor select element assigned yet or not.

This was discussed here: whatwg#11825
…contentredo

Merged the PRs, now I need to do the selectedcontent rewrite to clone
into all descendant selectedcontent elements.
This PR adds support for using the selectedcontent element in a select
element with the multiple attribute by cloning each of the option
elements into the selectedcontent element.

Each cloned option will be wrapped by a generated div element inside the
selectedcontent element, so the resulting DOM would look like this:

```html
<select multiple size=1>
  <selectedcontent>
    <div>one</div>
    <div>two</div>
  </selectedcontent>
  <option selected>one</option>
  <option selected>two</option>
  <option>three</option>
</select>
```

Fixes whatwg#12342
@josepharhar
Copy link
Copy Markdown
Contributor Author

This PR is currently based on the other PR to rewrite a bunch of selectedcontent stuff, and therefore includes all of its contents: #12263

When that PR is merged, the diff of this one should be easier to read.

Here is a diff which shows the actual changes of this proposal by diffing the other PR with this one: https://github.com/josepharhar/html/compare/selectedcontentredo...josepharhar:html:selectedcontentmultiple?expand=1

@annevk annevk added the topic: select The <select> element label May 11, 2026
Comment thread source
Comment on lines +59533 to +59541
<li><p>If <var>option</var> is <span data-x="concept-option-selectedness">selected</span>, then
<span data-x="list append">append</span> <var>option</var> to
<var>selectedOptions</var>.</p></li>
</ol>
</li>

<li><p>If <var>select</var> has the <code data-x="attr-select-multiple">multiple</code>
attribute, then run <span>clone multiple options into a <code>selectedcontent</code></span> given
<var>selectedOptions</var> and <var>selectedcontent</var>.</p></li>
Copy link
Copy Markdown
Member

@keithamus keithamus May 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make more sense here to do something like:

  1. Let isMulitple be true if select has the multiple attribute.
  2. For each option in select's list of options.
    1. If option is not selected then continue.
    2. If isMultiple is false, run clone an option into a selectedcontent given option and selectedcontent, and return.
    3. Append option to selectedoptions given selectedOptions and selectedcontent.
  3. If selectedoptions is empty, then run clear a selectedcontent given selectedcontent.
  4. Otherwise, run clone multiple options into a selectedcontent given selectedOptions and selectedcontent.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the suggestion! The difference is that this algorithm can return earlier when it sees a selected option for a non-multiple select, right?

@zcorpan
Copy link
Copy Markdown
Member

zcorpan commented May 18, 2026

The performance cost during parsing could be pretty bad if the cloning of all selected options (seen so far) happens for every option end tag, right?

@josepharhar
Copy link
Copy Markdown
Contributor Author

The performance cost during parsing could be pretty bad if the cloning of all selected options (seen so far) happens for every option end tag, right?

Agreed, thanks for catching that! I pushed a change to stop updating selectedcontent elements during option parsing if the select is multiple, and instead update them at the end of the select tag's parsing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

topic: select The <select> element

Development

Successfully merging this pull request may close these issues.

Selectedcontent in select multiple

4 participants