summaryrefslogtreecommitdiff
path: root/extensions/webidl
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/webidl')
-rw-r--r--extensions/webidl/00_webidl.js39
-rw-r--r--extensions/webidl/internal.d.ts18
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;