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/00_webidl.js | |
parent | 1eac527adb8263acd6d6cc1147e53caa901d938d (diff) |
fix: make WHATWG streams more compliant (#10967)
Diffstat (limited to 'extensions/webidl/00_webidl.js')
-rw-r--r-- | extensions/webidl/00_webidl.js | 39 |
1 files changed, 30 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, |