From a6beab824815cededf0ba9fc7904d3b00fde75e4 Mon Sep 17 00:00:00 2001 From: Anonymous <65428781+00ff0000red@users.noreply.github.com> Date: Mon, 15 Feb 2021 15:13:46 -0800 Subject: [PATCH] chore: add internal webidl helpers for enums and nullables (#9504) Co-authored-by: Luca Casonato --- op_crates/web/00_webidl.js | 36 +++++++++++++++++++++++++++++++++++- op_crates/web/internal.d.ts | 19 +++++++++++++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/op_crates/web/00_webidl.js b/op_crates/web/00_webidl.js index 72c58c3772ef16..8831cb71e66f1d 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 6f6849a7e7a890..04fc061bbaf676 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( 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( + converter: (v: any, opts: ValueConverterOpts) => T, + ): (v: any, opts: ValueConverterOpts) => T | null; } declare var url: {