- From: Elad Alon <notifications@github.com>
- Date: Mon, 03 Apr 2023 04:58:55 -0700
- To: whatwg/dom <dom@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/dom/issues/1182@github.com>
Consider a Web app that calls a method exposed by the browser.
* What happens if one of the method's parameters is a dictionary? Dictionaries may be extended over time, and there are no good ways for Web apps to check whether the user agent supports recognizes new members.
* Similar problem with enum values.
* The problem is recursive, as parameters can themselves have sub-fields which are dictionaries.
@beaufortfrancois has raised the same issue in #1181. I suspect we might have both been prompted by the same [recent discussion](https://github.com/w3c/mediacapture-screen-share/issues/260). François' proposal is interesting. I'd like to enrich the discussion by adding one more possible solution.
```webidl
enum SomeEnum {
"value0",
"value1"
};
interface SomeDictionary {
boolean boolField;
int intField;
int otherIntField;
SomeEnum someEnumField;
}
[ExposeParameters] // <-- NEW!
void someFunction(SomeDictionary p0, int p1) {
// ...
}
```
The new tag would then produce bindings that would allow something like this:
```js
if (func.parameters.length >= 1 &&
func.parameters[0].type == "enum" &&
"someValue" in func.parameters[0].supportedValues) {
...
}
```
Because this is recursive, it could even extend to real use-cases we're encountering in the field, which are somewhat complex:
```js
const func = navigator.mediaDevices.getDisplayMedia;
// We know getDisplayMedia has >= 1 params, the first of which is a dictionary.
// No need to check. (But we could if we wanted to.)
const dict = func.parameters[0];
if ("selfBrowserSurface" in dict.members &&
dict.members.selfBrowserSurface.type == "enum" &&
"exclude" in dict.members.selfBrowserSurface.values) {
// ...
}
```
We could also add an `[ExposeParametersAs]` tag to allow the exposure point of this metadata somewhere other than `.parameters`. But IMHO that doesn't matter much, as I am not familiar with any existing method exposed by the UA, where `.parameters` is taken. (Not to be confused with a **parameter** called "parameters", btw.)
Comparing the two proposals (the current one and #1181):
* The current proposal exposes method parameters; #1181 exposes members on interfaces. (The current proposal could be extended to interfaces.)
* The current proposal exposes recursively.
* The current proposal exposes field types.
* The current proposal exposes parameter types.
* The current proposal exposes enums' legal values.
* The current proposal is, sadly, more complex than #1181.
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/dom/issues/1182
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/dom/issues/1182@github.com>
Received on Monday, 3 April 2023 11:59:07 UTC