-
Notifications
You must be signed in to change notification settings - Fork 3k
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.