diff options
| author | Luca Casonato <hello@lcas.dev> | 2021-06-15 13:46:02 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-15 13:46:02 +0200 |
| commit | 4cbc4a7eb321ae2808cf3dce9428f45aaed0e338 (patch) | |
| tree | 593fa6e34cd0d222029ea37b404dbb7dd3fad54a /extensions/webidl | |
| parent | 1eac527adb8263acd6d6cc1147e53caa901d938d (diff) | |
fix: make WHATWG streams more compliant (#10967)
Diffstat (limited to 'extensions/webidl')
| -rw-r--r-- | extensions/webidl/00_webidl.js | 39 | ||||
| -rw-r--r-- | extensions/webidl/internal.d.ts | 18 |
2 files changed, 48 insertions, 9 deletions
diff --git a/extensions/webidl/00_webidl.js b/extensions/webidl/00_webidl.js index 49f586135..a54d2fe6e 100644 --- a/extensions/webidl/00_webidl.js +++ b/extensions/webidl/00_webidl.js @@ -566,6 +566,7 @@ converters["sequence<double>"] = createSequenceConverter( converters["double"], ); + converters["Promise<undefined>"] = createPromiseConverter(() => undefined); function requiredArguments(length, required, opts = {}) { if (length < required) { @@ -578,11 +579,6 @@ } } - function isEmptyObject(V) { - for (const _ in V) return false; - return true; - } - function createDictionaryConverter(name, ...dictionaries) { let hasRequiredKey = false; const allMembers = []; @@ -642,10 +638,8 @@ const idlDict = { ...defaultValues }; - // NOTE: fast path Null and Undefined and empty objects. - if ( - (V === undefined || V === null || isEmptyObject(V)) && !hasRequiredKey - ) { + // NOTE: fast path Null and Undefined. + if ((V === undefined || V === null) && !hasRequiredKey) { return idlDict; } @@ -774,6 +768,31 @@ }; } + function createPromiseConverter(converter) { + return (V, opts) => Promise.resolve(V).then((V) => converter(V, opts)); + } + + function invokeCallbackFunction( + callable, + args, + thisArg, + returnValueConverter, + opts, + ) { + try { + const rv = Reflect.apply(callable, thisArg, args); + return returnValueConverter(rv, { + prefix: opts.prefix, + context: "return value", + }); + } catch (err) { + if (opts.returnsPromise === true) { + return Promise.reject(err); + } + throw err; + } + } + const brand = Symbol("[[webidl.brand]]"); function createInterfaceConverter(name, prototype) { @@ -927,6 +946,8 @@ createNullableConverter, createSequenceConverter, createRecordConverter, + createPromiseConverter, + invokeCallbackFunction, createInterfaceConverter, brand, createBranded, diff --git a/extensions/webidl/internal.d.ts b/extensions/webidl/internal.d.ts index 2d23f0ed2..4d0f1ad45 100644 --- a/extensions/webidl/internal.d.ts +++ b/extensions/webidl/internal.d.ts @@ -249,6 +249,24 @@ declare namespace globalThis { ): (v: any, opts: ValueConverterOpts) => T[]; /** + * Create a converter that converts a Promise of the inner type. + */ + declare function createPromiseConverter<T>( + converter: (v: any, opts: ValueConverterOpts) => T, + ): (v: any, opts: ValueConverterOpts) => Promise<T>; + + /** + * Invoke a callback function. + */ + declare function invokeCallbackFunction<T>( + callable: (...args: any) => any, + args: any[], + thisArg: any, + returnValueConverter: (v: any, opts: ValueConverterOpts) => T, + opts: ConverterOpts & { returnsPromise?: boolean }, + ): T; + + /** * Throw an illegal constructor error. */ declare function illegalConstructor(): never; |
