Skip to content

Clone into all descendant selectedcontent elements#12263

Open
josepharhar wants to merge 20 commits intowhatwg:mainfrom
josepharhar:selectedcontentredo
Open

Clone into all descendant selectedcontent elements#12263
josepharhar wants to merge 20 commits intowhatwg:mainfrom
josepharhar:selectedcontentredo

Conversation

@josepharhar
Copy link
Copy Markdown
Contributor

@josepharhar josepharhar commented Mar 16, 2026

This PR changes several things:

  • Instead of the first selectedcontent element in DOM order staying up to date, now all descendant selectedcontent elements of the select element will be kept up to date.
  • Rewrites the selectedness setting algorithm to prevent setting selectedness of options which haven't had their insertion steps run yet in order to match implementations and to update selectedcontent elements.
  • Creates a list of selectedcontent elements to update before doing actual DOM operations.

Fixes #12096
Fixes #11880
Fixes #11883
Fixes #11825

(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.
Copy link
Copy Markdown
Member

@annevk annevk left a comment

Choose a reason for hiding this comment

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

Thanks @josepharhar! Here's some minor editorial feedback to start. Will try to verify these changes by implementing them.

source Outdated
Comment on lines +59315 to +59326
<li><p>Let <var>descendantSelectedcontents</var> be « ».</p></li>

<li><p>Let <var>option</var> be the first <code>option</code> in <var>select</var>'s <span
data-x="concept-select-option-list">list of options</span> whose <span
data-x="concept-option-selectedness">selectedness</span> is true, if any such <code>option</code>
exists, otherwise null.</p></li>
<li>
<p>For each <var>descendant</var> of <var>select</var>'s <span
data-x="descendant">descendants</span>:</p>

<li><p>If <var>option</var> is null, then run <span>clear a <code>selectedcontent</code></span>
given <var>selectedcontent</var>.</p></li>
<ol>
<li><p>If <var>descendant</var> is a <code>selectedcontent</code> element, then <span
data-x="list append">append</span> <var>descendant</var> to
<var>descendantSelectedcontents</var>.</p></li>
</ol>
</li>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We don't need a loop for this. We can state this declaratively:

Let selectedContents be select's descendants that are selectedcontent elements, in tree order.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Also, I have a more substantive question here. Why doesn't this skip disabled selectedcontent elements immediately?

I think the selectedcontent-nested.html test currently expects this, but it seems wasteful and best avoided.

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.

We don't need a loop for this. We can state this declaratively:

Done, thanks

Also, I have a more substantive question here. Why doesn't this skip disabled selectedcontent elements immediately?

Disabled selectedcontents will be skipped deeper in the algorithms called by this one - "clone an option into a selectedcontent" and "clear a selectedcontent" both check if the selectedcontent is disabled before modifying the DOM, and return early.

We could add a step to skip disabled selectedcontents here, but it would functionally be redundant, unless I'm misreading something. What do you think? Can we leave it as-is?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

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.

Ok, yes I see how it would change the behavior to check if the selectedcontent elements are disabled before adding them to the list. I'll change the spec here and update the WPT.

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

Labels

None yet

2 participants