[heycam/webidl] Consider a pattern for dictionary arguments which must have at least one member (#903)

This is a continuation of https://github.com/heycam/webidl/issues/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](https://dom.spec.whatwg.org/#dom-mutationobserver-observe) (I think... it's a bit complicated)
- Web Share's [ShareData](https://w3c.github.io/web-share/#share-method)
- Media Capture and Stream's [MediaStreamConstraints](https://w3c.github.io/mediacapture-main/#dom-mediadevices-getusermedia) (although they'd need to remove the default `= false` values, otherwise both members are always present)
- The planned [URLPatternInit](https://github.com/wanderview/service-worker-scope-pattern-matching/blob/master/explainer.md#urlpattern)

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. https://github.com/whatwg/dom/issues/332).

I suggest something like

```webidl
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 https://github.com/heycam/webidl/pull/857#issuecomment-604388055.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/heycam/webidl/issues/903

Received on Monday, 27 July 2020 21:52:05 UTC