summaryrefslogtreecommitdiff
path: root/op_crates
diff options
context:
space:
mode:
Diffstat (limited to 'op_crates')
-rw-r--r--op_crates/web/00_webidl.js36
-rw-r--r--op_crates/web/internal.d.ts19
2 files changed, 52 insertions, 3 deletions
diff --git a/op_crates/web/00_webidl.js b/op_crates/web/00_webidl.js
index 72c58c377..8831cb71e 100644
--- a/op_crates/web/00_webidl.js
+++ b/op_crates/web/00_webidl.js
@@ -662,10 +662,44 @@
};
}
- window.__bootstrap = window.__bootstrap || {};
+ // https://heycam.github.io/webidl/#es-enumeration
+ function createEnumConverter(name, values) {
+ const E = new Set(values);
+
+ return function (V, opts = {}) {
+ const S = String(V);
+
+ if (!E.has(S)) {
+ throw makeException(
+ TypeError,
+ `The provided value '${V}' is not a valid enum value of type ${name}.`,
+ opts,
+ );
+ }
+
+ return S;
+ };
+ }
+
+ function createNullableConverter(converter) {
+ return (V, opts = {}) => {
+ // FIXME: If Type(V) is not Object, and the conversion to an IDL value is
+ // being performed due to V being assigned to an attribute whose type is a
+ // nullable callback function that is annotated with
+ // [LegacyTreatNonObjectAsNull], then return the IDL nullable type T?
+ // value null.
+
+ if (V === null || V === undefined) return null;
+ return converter(V, opts);
+ };
+ }
+
+ window.__bootstrap ??= {};
window.__bootstrap.webidl = {
converters,
requiredArguments,
createDictionaryConverter,
+ createEnumConverter,
+ createNullableConverter,
};
})(this);
diff --git a/op_crates/web/internal.d.ts b/op_crates/web/internal.d.ts
index 6f6849a7e..04fc061bb 100644
--- a/op_crates/web/internal.d.ts
+++ b/op_crates/web/internal.d.ts
@@ -209,13 +209,28 @@ declare namespace globalThis {
required?: boolean;
}
- /**ie
- * Assert that the a function has at least a required amount of arguments.
+ /**
+ * Create a converter for dictionaries.
*/
declare function createDictionaryConverter<T>(
name: string,
...dictionaries: Dictionary[]
): (v: any, opts: ValueConverterOpts) => T;
+
+ /**
+ * Create a converter for enums.
+ */
+ declare function createEnumConverter(
+ name: string,
+ values: string[],
+ ): (v: any, opts: ValueConverterOpts) => string;
+
+ /**
+ * Create a converter that makes the contained type nullable.
+ */
+ declare function createNullableConverter<T>(
+ converter: (v: any, opts: ValueConverterOpts) => T,
+ ): (v: any, opts: ValueConverterOpts) => T | null;
}
declare var url: {