Description
What is the issue with the HTML Standard?
In order to support the stylable select aka appearance:base-select proposal, we need to make changes to the HTML parser to allow more tags inside <select>
, because the current HTML parser basically throws away all tags besides <option>
, <optgroup>
, and <hr>
.
Here are options for how we can extend the HTML parser with varying levels of web compatibility:
- Allow any tags within
<select>
- Allow
<button>
and<datalist>
tags in<select>
, and allow any tags within<button>
and<datalist>
- Allow any tags within a
<select>
’s<option>
,<button>
, or<datalist>
1. Allow any tags within <select>
Allowing any tags within <select>
would be good because it is more flexible for developers since they won’t necessarily have to add a <datalist>
, but it is the most breaking change of the options I listed. I added a use counter for tags which get dropped in select mode, and it is at 0.3%, which is quite high. I also looked at dozens of the websites with an experimental patch to allow any tags, and while most of them seemed unaffected by allowing anything, some of them were broken:
- http://tx.7ma.cn/
This website has a<select>
tag without a closing</select>
tag, and it causes a bunch of the HTML to get put inside the<select>
instead of being rendered/parsed after the<select>
. - http://top.ge/
This website has a<select>
with additional tags inside the<option>
s, but it doesn’t actually use the<select>
element to render and instead has some other custom thing which appears to be reading out the DOM contents of the<select>
. The dropdown in the website now has a bunch of newlines and odd content in the options.
There’s good reason to believe other sites will be affected in a similar way.
2. Allow <button>
and <datalist>
tags in <select>
A more web-compatible option would be to make the parser allow <button>
and <datalist>
in <select>
, and then make the parser allow anything inside <button>
/<datalist>
. These tags correspond to the two visual parts of the <select>
as per the explainer. I have use counters for <button>
and <datalist>
tags inside <select>
here, and they have very low usage (0.001% and 0.0001% respectively):
https://chromestatus.com/metrics/feature/timeline/popularity/4771
https://chromestatus.com/metrics/feature/timeline/popularity/4772
These usage numbers are low enough that we would be willing to ship in chrome.
3. Allow any tags within a <select>
’s <option>
, <button>
, or <datalist>
This is like the first option, but doesn’t allow other tags in between <option>
s. Based on the sites which broke, I don’t think this would be significantly more compatible than just allowing all tags. I also think this might be confusing to developers when arbitrary content can be added inside options but not in between them unless they are all wrapped by a datalist tag.
I also looked through the commit logs of both the webkit/chromium implementation and spec (and here) in order to find out what the justification was for dropping tags inside <select>
, and I didn’t find out anything useful. The implementation had minimal context here. When going through the commit log of the HTML spec, I got back to the initial commit of the git repo, which didn’t explain either.
My preference is option 2 because it has the lowest risk of breaking websites, but I have gotten feedback that requiring developers to write <datalist>
is not great. Nevertheless, given this compat data I think that’s our best option for moving forward.