Description
This is a continuation of #130.
There are a number of places on the platform that end up marking their dictionary arguments as "optional", even though they're not really optional. They just have a requirement that can't be expressed in IDL today: at least one member must be present. Examples:
- DOM's MutationObserverInit (I think... it's a bit complicated)
- Web Share's ShareData
- Media Capture and Stream's MediaStreamConstraints (although they'd need to remove the default
= false
values, otherwise both members are always present) - The planned URLPatternInit
I think we might have reached the point where it's worth making this pattern first-class. It would remove a bit of spec boilerplate in each spec, and it would make the IDL less confusing for readers (see e.g. whatwg/dom#332).
I suggest something like
partial interface MutationObserver {
void observe(Node target, [OneMemberRequired] MutationObserverInit options);
};
I believe this explicitness sidesteps the problems mentioned in #130, where we were worried that people would not properly mark truly-optional trailing dictionaries as optional. You have to really know what you're doing to use this kind of extended attribute.
We could also use a keyword (onememberrequired MutationObserverInit options
) for symmetry with optional
. In general the dividing line between syntax and extended attributes is kind of blurry in Web IDL; see some discussion in #857 (comment).