diff --git a/web/CHANGELOG.md b/web/CHANGELOG.md index 72de9522..7776d4ad 100644 --- a/web/CHANGELOG.md +++ b/web/CHANGELOG.md @@ -11,6 +11,7 @@ - Exposed constants with primitive values as non-`external` so they can be `switch`ed over. - Add an extension `responseHeaders` to `XMLHttpRequest`. +- Correctly namespace `WebAssembly` types. ## 1.0.0 diff --git a/web/lib/src/dom/wasm_js_api.dart b/web/lib/src/dom/wasm_js_api.dart index 2035190f..e8783177 100644 --- a/web/lib/src/dom/wasm_js_api.dart +++ b/web/lib/src/dom/wasm_js_api.dart @@ -73,6 +73,7 @@ extension type ModuleImportDescriptor._(JSObject _) implements JSObject { external ImportExportKind get kind; external set kind(ImportExportKind value); } +@JS('WebAssembly.Module') extension type Module._(JSObject _) implements JSObject { external factory Module(BufferSource bytes); @@ -83,6 +84,7 @@ extension type Module._(JSObject _) implements JSObject { String sectionName, ); } +@JS('WebAssembly.Instance') extension type Instance._(JSObject _) implements JSObject { external factory Instance( Module module, [ @@ -102,6 +104,7 @@ extension type MemoryDescriptor._(JSObject _) implements JSObject { external int get maximum; external set maximum(int value); } +@JS('WebAssembly.Memory') extension type Memory._(JSObject _) implements JSObject { external factory Memory(MemoryDescriptor descriptor); @@ -122,6 +125,7 @@ extension type TableDescriptor._(JSObject _) implements JSObject { external int get maximum; external set maximum(int value); } +@JS('WebAssembly.Table') extension type Table._(JSObject _) implements JSObject { external factory Table( TableDescriptor descriptor, [ @@ -150,6 +154,7 @@ extension type GlobalDescriptor._(JSObject _) implements JSObject { external bool get mutable; external set mutable(bool value); } +@JS('WebAssembly.Global') extension type Global._(JSObject _) implements JSObject { external factory Global( GlobalDescriptor descriptor, [ diff --git a/web_generator/CHANGELOG.md b/web_generator/CHANGELOG.md index d9c47969..69a023a3 100644 --- a/web_generator/CHANGELOG.md +++ b/web_generator/CHANGELOG.md @@ -1,3 +1,11 @@ ## 1.0.0-wip -- Initial separation of `web_generator` from `web`. \ No newline at end of file +- Initial separation of `web_generator` from `web`. +- New IDL interface `RHL` added. `ExtendedAttribute` idl interface updated to + expose its `rhs` property and `Interfacelike` idl interface updated to expose + `extAttrs` property. The generator now adds a + `JS(LegacyNamespace.$extensionTypeName)` annotation on `JS` objects if + they've an IDL extended attribute `[LegacyNamespace=Foo]` defined in their IDL + description. + + \ No newline at end of file diff --git a/web_generator/lib/src/translator.dart b/web_generator/lib/src/translator.dart index 554ea9b4..d0a2c310 100644 --- a/web_generator/lib/src/translator.dart +++ b/web_generator/lib/src/translator.dart @@ -5,6 +5,7 @@ import 'dart:js_interop'; import 'package:code_builder/code_builder.dart' as code; +import 'package:collection/collection.dart'; import 'package:path/path.dart' as p; import 'banned_names.dart'; @@ -1244,6 +1245,7 @@ class Translator { code.ExtensionType _extensionType({ required String jsName, required String dartClassName, + required List extendedAttributes, required MdnInterface? mdnInterface, required BCDInterfaceStatus? interfaceStatus, required List implements, @@ -1257,6 +1259,12 @@ class Translator { final jsObject = _typeReference(_RawType('JSObject', false)); const representationFieldName = '_'; + final legacyNameSpace = extendedAttributes + .firstWhereOrNull( + (extendedAttribute) => extendedAttribute.name == 'LegacyNamespace', + ) + ?.rhs + .value; final instancePropertyMethods = []; final staticPropertyMethods = []; final propertySpecs = _properties(properties, mdnInterface); @@ -1267,7 +1275,12 @@ class Translator { return code.ExtensionType((b) => b ..docs.addAll(docs) ..annotations.addAll( - _jsOverride(isObjectLiteral || jsName == dartClassName ? '' : jsName)) + _jsOverride( + legacyNameSpace != null + ? '$legacyNameSpace.$jsName' + : (isObjectLiteral || jsName == dartClassName ? '' : jsName), + ), + ) ..name = dartClassName ..primaryConstructorName = '_' ..representationDeclaration = code.RepresentationDeclaration((b) => b @@ -1300,6 +1313,7 @@ class Translator { final type = interfacelike.type; final isNamespace = type == 'namespace'; final isDictionary = type == 'dictionary'; + final extendedAttributes = idlInterfacelike.extAttrs.toDart; final mdnInterface = docProvider.interfaceFor(jsName); @@ -1327,6 +1341,7 @@ class Translator { _extensionType( jsName: jsName, dartClassName: dartClassName, + extendedAttributes: extendedAttributes, mdnInterface: mdnInterface, interfaceStatus: interfaceStatus, implements: implements, diff --git a/web_generator/lib/src/webidl_api.dart b/web_generator/lib/src/webidl_api.dart index 676b3334..841d8068 100644 --- a/web_generator/lib/src/webidl_api.dart +++ b/web_generator/lib/src/webidl_api.dart @@ -35,6 +35,7 @@ extension type Interfacelike._(JSObject _) implements Named { external bool get partial; external JSArray get members; external String? get inheritance; + external JSArray get extAttrs; } extension type Callback._(JSObject _) implements Named { @@ -66,6 +67,12 @@ extension type Member._(JSObject _) implements JSObject { extension type ExtendedAttribute._(JSObject _) implements JSObject { external String get name; + external RHS get rhs; +} + +extension type RHS._(JSObject _) implements JSObject { + external String get type; + external String get value; } extension type Argument._(JSObject _) implements JSObject {