Repository: rustwasm/wasm-bindgen
Pull request #3704 (2023-11-13 14:53:32)

Add a test runner to two of the typescript tests to actually run them
This adds Jest as the test runner framework.
I have chosen this framework because it was the framework I managed to get running and because it seems reasonably popular:
https://2022.stateofjs.com/en-US/libraries/testing/

This uncovers that some of the tests are unrealistic code which would crash at runtime.

Before this PR, these tests were just compiled with tsc, but never run.

This PR also adds the new test script to the `crates/typescript-tests/run.sh` file which makes them run in the CI.


Patch:
diff --git a/.github/workflows/bump.yml b/.github/workflows/bump.yml
index 8c94d86a..89e43bf7 100644
--- a/.github/workflows/bump.yml
+++ b/.github/workflows/bump.yml
@@ -17,6 +17,10 @@ on:
 
 jobs:
   bump:
+    permissions:
+      contents: write
+      pull-requests: write
+
     runs-on: ubuntu-latest
     if: github.event.inputs.action == 'bump'
     steps:
@@ -45,7 +49,7 @@ jobs:
       - uses: dtolnay/rust-toolchain@stable
       - run: rustc publish.rs
       - name: assert we're on bump branch
-        run: test "$(git git branch --show-current)" = "bump"
+        run: test "$(git branch --show-current)" = "bump"
       - run: ./publish publish
         env:
           CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 62f8afab..2a246ee6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,18 +1,52 @@
 # `wasm-bindgen` Change Log
 --------------------------------------------------------------------------------
 
-## [Unreleased](https://github.com/rustwasm/wasm-bindgen/compare/0.2.88...main)
+## [Unreleased](https://github.com/rustwasm/wasm-bindgen/compare/0.2.89...main)
+
+### Added
+
+* Add bindings for `UserActivation`.
+  [#3719](https://github.com/rustwasm/wasm-bindgen/pull/3719)
+
+### Fixed
+
+* Fixed a compiler error when using `#[wasm_bindgen]` inside `macro_rules!`.
+  [#3725](https://github.com/rustwasm/wasm-bindgen/pull/3725)
+
+### Removed
+
+* Removed Gecko-only `InstallTriggerData` and Gecko-internal `FlexLineGrowthState`, `GridDeclaration`, `GridTrackState`,
+  `RtcLifecycleEvent` and `WebrtcGlobalStatisticsReport` features.
+  [#3723](https://github.com/rustwasm/wasm-bindgen/pull/3723)
+
+## [0.2.89](https://github.com/rustwasm/wasm-bindgen/compare/0.2.88...0.2.89)
+
+Released 2023-11-27.
 
 ### Added
 
 * Add additional constructor to `DataView` for `SharedArrayBuffer`.
   [#3695](https://github.com/rustwasm/wasm-bindgen/pull/3695)
 
+* Stabilize `wasm_bindgen::module()`.
+  [#3690](https://github.com/rustwasm/wasm-bindgen/pull/3690)
+
 ### Fixed
 
 * The DWARF section is now correctly modified instead of leaving it in a broken state.
   [#3483](https://github.com/rustwasm/wasm-bindgen/pull/3483)
 
+* Fixed an issue where `#[wasm_bindgen]` automatically derived the `TryFrom` trait for any struct, preventing custom `TryFrom<JsValue>` implementations. It has been updated to utilize a new `TryFromJsValue` trait instead.
+  [#3709](https://github.com/rustwasm/wasm-bindgen/pull/3709)
+
+* Update the TypeScript signature of `__wbindgen_thread_destroy` to indicate that it's parameters are optional.
+  [#3703](https://github.com/rustwasm/wasm-bindgen/pull/3703)
+
+### Removed
+
+* Removed Gecko-internal dictionary bindings `Csp`, `CspPolicies`, `CspReport` and `CspReportProperties`.
+  [#3721](https://github.com/rustwasm/wasm-bindgen/pull/3721)
+
 ## [0.2.88](https://github.com/rustwasm/wasm-bindgen/compare/0.2.87...0.2.88)
 
 Released 2023-11-01
diff --git a/Cargo.toml b/Cargo.toml
index 6bc9c385..ac65e7d8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 readme = "README.md"
@@ -42,15 +42,15 @@ xxx_debug_only_print_generated_code = [
 ]
 
 [dependencies]
-wasm-bindgen-macro = { path = "crates/macro", version = "=0.2.88" }
+wasm-bindgen-macro = { path = "crates/macro", version = "=0.2.89" }
 serde = { version = "1.0", optional = true }
 serde_json = { version = "1.0", optional = true }
 cfg-if = "1.0.0"
 
 [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
-js-sys = { path = 'crates/js-sys', version = '0.3.65' }
-wasm-bindgen-test = { path = 'crates/test', version = '=0.3.38' }
-wasm-bindgen-futures = { path = 'crates/futures', version = '=0.4.38' }
+js-sys = { path = 'crates/js-sys', version = '0.3.66' }
+wasm-bindgen-test = { path = 'crates/test', version = '=0.3.39' }
+wasm-bindgen-futures = { path = 'crates/futures', version = '=0.4.39' }
 serde_derive = "1.0"
 wasm-bindgen-test-crate-a = { path = 'tests/crates/a', version = '0.1' }
 wasm-bindgen-test-crate-b = { path = 'tests/crates/b', version = '0.1' }
diff --git a/crates/backend/Cargo.toml b/crates/backend/Cargo.toml
index ba3a65f8..70aeffae 100644
--- a/crates/backend/Cargo.toml
+++ b/crates/backend/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-backend"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend"
@@ -23,4 +23,4 @@ once_cell = "1.12"
 proc-macro2 = "1.0"
 quote = '1.0'
 syn = { version = '2.0', features = ['full'] }
-wasm-bindgen-shared = { path = "../shared", version = "=0.2.88" }
+wasm-bindgen-shared = { path = "../shared", version = "=0.2.89" }
diff --git a/crates/backend/src/codegen.rs b/crates/backend/src/codegen.rs
index 6c854e5e..bbcbc9ce 100644
--- a/crates/backend/src/codegen.rs
+++ b/crates/backend/src/codegen.rs
@@ -297,10 +297,10 @@ impl ToTokens for ast::Struct {
             }
 
             #[allow(clippy::all)]
-            impl #wasm_bindgen::__rt::core::convert::TryFrom<#wasm_bindgen::JsValue> for #name {
+            impl #wasm_bindgen::convert::TryFromJsValue for #name {
                 type Error = #wasm_bindgen::JsValue;
 
-                fn try_from(value: #wasm_bindgen::JsValue)
+                fn try_from_js_value(value: #wasm_bindgen::JsValue)
                     -> #wasm_bindgen::__rt::std::result::Result<Self, Self::Error> {
                     let idx = #wasm_bindgen::convert::IntoWasmAbi::into_abi(&value);
 
@@ -389,7 +389,14 @@ impl ToTokens for ast::StructField {
         };
         let maybe_assert_copy = respan(maybe_assert_copy, ty);
 
-        let mut val = quote_spanned!(self.rust_name.span()=> (*js).borrow().#rust_name);
+        // Split this out so that it isn't affected by `quote_spanned!`.
+        //
+        // If we don't do this, it might end up being unable to reference `js`
+        // properly because it doesn't have the same span.
+        //
+        // See https://github.com/rustwasm/wasm-bindgen/pull/3725.
+        let js_token = quote! { js };
+        let mut val = quote_spanned!(self.rust_name.span()=> (*#js_token).borrow().#rust_name);
         if let Some(span) = self.getter_with_clone {
             val = quote_spanned!(span=> <#ty as Clone>::clone(&#val) );
         }
@@ -819,6 +826,7 @@ impl ToTokens for ast::ImportType {
 
             #[automatically_derived]
             const _: () = {
+                use #wasm_bindgen::convert::TryFromJsValue;
                 use #wasm_bindgen::convert::{IntoWasmAbi, FromWasmAbi};
                 use #wasm_bindgen::convert::{OptionIntoWasmAbi, OptionFromWasmAbi};
                 use #wasm_bindgen::convert::{RefFromWasmAbi, LongRefFromWasmAbi};
@@ -1452,11 +1460,12 @@ impl ToTokens for ast::Enum {
             }
 
             #[allow(clippy::all)]
-            impl #wasm_bindgen::__rt::core::convert::TryFrom<#wasm_bindgen::JsValue> for #enum_name {
+            impl #wasm_bindgen::convert::TryFromJsValue for #enum_name {
                 type Error = #wasm_bindgen::JsValue;
 
-                fn try_from(value: #wasm_bindgen::JsValue)
-                    -> #wasm_bindgen::__rt::std::result::Result<Self, <#enum_name as #wasm_bindgen::__rt::core::convert::TryFrom<JsValue>>::Error> {
+                fn try_from_js_value(value: #wasm_bindgen::JsValue)
+                    -> #wasm_bindgen::__rt::std::result::Result<Self, <#enum_name as #wasm_bindgen::convert::TryFromJsValue>::Error> {
+                    use #wasm_bindgen::__rt::core::convert::TryFrom;
                     let js = f64::try_from(&value)? as u32;
 
                     #wasm_bindgen::__rt::std::result::Result::Ok(
diff --git a/crates/cli-support/Cargo.toml b/crates/cli-support/Cargo.toml
index 1213c61a..641a8a0e 100644
--- a/crates/cli-support/Cargo.toml
+++ b/crates/cli-support/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-cli-support"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/cli-support"
@@ -20,10 +20,10 @@ rustc-demangle = "0.1.13"
 serde_json = "1.0"
 tempfile = "3.0"
 walrus = "0.20.2"
-wasm-bindgen-externref-xform = { path = '../externref-xform', version = '=0.2.88' }
-wasm-bindgen-multi-value-xform = { path = '../multi-value-xform', version = '=0.2.88' }
-wasm-bindgen-shared = { path = "../shared", version = '=0.2.88' }
-wasm-bindgen-threads-xform = { path = '../threads-xform', version = '=0.2.88' }
-wasm-bindgen-wasm-conventions = { path = '../wasm-conventions', version = '=0.2.88' }
-wasm-bindgen-wasm-interpreter = { path = "../wasm-interpreter", version = '=0.2.88' }
+wasm-bindgen-externref-xform = { path = '../externref-xform', version = '=0.2.89' }
+wasm-bindgen-multi-value-xform = { path = '../multi-value-xform', version = '=0.2.89' }
+wasm-bindgen-shared = { path = "../shared", version = '=0.2.89' }
+wasm-bindgen-threads-xform = { path = '../threads-xform', version = '=0.2.89' }
+wasm-bindgen-wasm-conventions = { path = '../wasm-conventions', version = '=0.2.89' }
+wasm-bindgen-wasm-interpreter = { path = "../wasm-interpreter", version = '=0.2.89' }
 unicode-ident = "1.0.5"
diff --git a/crates/cli-support/src/wasm2es6js.rs b/crates/cli-support/src/wasm2es6js.rs
index 9dc42f9d..981dce62 100644
--- a/crates/cli-support/src/wasm2es6js.rs
+++ b/crates/cli-support/src/wasm2es6js.rs
@@ -55,6 +55,10 @@ fn push_index_identifier(i: usize, s: &mut String) {
     }
 }
 
+fn args_are_optional(name: &str) -> bool {
+    name == "__wbindgen_thread_destroy"
+}
+
 pub fn interface(module: &Module) -> Result<String, Error> {
     let mut exports = String::new();
 
@@ -81,6 +85,9 @@ pub fn interface(module: &Module) -> Result<String, Error> {
             }
 
             push_index_identifier(i, &mut args);
+            if args_are_optional(&entry.name) {
+                args.push('?');
+            }
             args.push_str(": number");
         }
 
diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml
index a8f322db..b0ab4f99 100644
--- a/crates/cli/Cargo.toml
+++ b/crates/cli/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-cli"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/cli"
@@ -34,8 +34,8 @@ ureq = { version = "2.7", default-features = false, features = [
     "gzip",
 ] }
 walrus = { version = "0.20.2", features = ['parallel'] }
-wasm-bindgen-cli-support = { path = "../cli-support", version = "=0.2.88" }
-wasm-bindgen-shared = { path = "../shared", version = "=0.2.88" }
+wasm-bindgen-cli-support = { path = "../cli-support", version = "=0.2.89" }
+wasm-bindgen-shared = { path = "../shared", version = "=0.2.89" }
 
 [dev-dependencies]
 assert_cmd = "1.0"
diff --git a/crates/externref-xform/Cargo.toml b/crates/externref-xform/Cargo.toml
index e14deec3..8618390b 100644
--- a/crates/externref-xform/Cargo.toml
+++ b/crates/externref-xform/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-externref-xform"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/externref-xform"
diff --git a/crates/futures/Cargo.toml b/crates/futures/Cargo.toml
index 1343ddd0..96a05031 100644
--- a/crates/futures/Cargo.toml
+++ b/crates/futures/Cargo.toml
@@ -7,14 +7,14 @@ license = "MIT OR Apache-2.0"
 name = "wasm-bindgen-futures"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/futures"
 readme = "./README.md"
-version = "0.4.38"
+version = "0.4.39"
 edition = "2018"
 rust-version = "1.57"
 
 [dependencies]
 cfg-if = "1.0.0"
-js-sys = { path = "../js-sys", version = '0.3.65' }
-wasm-bindgen = { path = "../..", version = '0.2.88' }
+js-sys = { path = "../js-sys", version = '0.3.66' }
+wasm-bindgen = { path = "../..", version = '0.2.89' }
 futures-core =  { version = '0.3.8', default-features = false, optional = true }
 
 [features]
@@ -29,6 +29,6 @@ features = [
 ]
 
 [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
-wasm-bindgen-test = { path = '../test', version = '0.3.38' }
+wasm-bindgen-test = { path = '../test', version = '0.3.39' }
 futures-channel-preview = { version = "0.3.0-alpha.18" }
 futures-lite = { version = "1.11.3", default-features = false }
diff --git a/crates/js-sys/Cargo.toml b/crates/js-sys/Cargo.toml
index 1ab5ed4d..a08acf0d 100644
--- a/crates/js-sys/Cargo.toml
+++ b/crates/js-sys/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "js-sys"
-version = "0.3.65"
+version = "0.3.66"
 authors = ["The wasm-bindgen Developers"]
 readme = "./README.md"
 categories = ["wasm"]
@@ -20,9 +20,9 @@ test = false
 doctest = false
 
 [dependencies]
-wasm-bindgen = { path = "../..", version = "0.2.88" }
+wasm-bindgen = { path = "../..", version = "0.2.89" }
 
 [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
-wasm-bindgen-test = { path = '../test', version = '=0.3.38' }
-wasm-bindgen-futures = { path = '../futures', version = '0.4.38' }
-web-sys = { path = "../web-sys", version = "0.3.65", features = ["Headers", "Response", "ResponseInit"] }
+wasm-bindgen-test = { path = '../test', version = '=0.3.39' }
+wasm-bindgen-futures = { path = '../futures', version = '0.4.39' }
+web-sys = { path = "../web-sys", version = "0.3.66", features = ["Headers", "Response", "ResponseInit"] }
diff --git a/crates/macro-support/Cargo.toml b/crates/macro-support/Cargo.toml
index 83ac09a4..5cfbab72 100644
--- a/crates/macro-support/Cargo.toml
+++ b/crates/macro-support/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-macro-support"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support"
@@ -21,5 +21,5 @@ strict-macro = []
 syn = { version = '2.0', features = ['visit', 'full'] }
 quote = '1.0'
 proc-macro2 = "1.0"
-wasm-bindgen-backend = { path = "../backend", version = "=0.2.88" }
-wasm-bindgen-shared = { path = "../shared", version = "=0.2.88" }
+wasm-bindgen-backend = { path = "../backend", version = "=0.2.89" }
+wasm-bindgen-shared = { path = "../shared", version = "=0.2.89" }
diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml
index bdbd4af5..563c8774 100644
--- a/crates/macro/Cargo.toml
+++ b/crates/macro/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-macro"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro"
@@ -21,11 +21,11 @@ xxx_debug_only_print_generated_code = []
 strict-macro = ["wasm-bindgen-macro-support/strict-macro"]
 
 [dependencies]
-wasm-bindgen-macro-support = { path = "../macro-support", version = "=0.2.88" }
+wasm-bindgen-macro-support = { path = "../macro-support", version = "=0.2.89" }
 quote = "1.0"
 
 [dev-dependencies]
 trybuild = "1.0"
-wasm-bindgen = { path = "../..", version = "0.2.88" }
-wasm-bindgen-futures = { path = "../futures", version = "0.4.38" }
-web-sys = { path = "../web-sys", version = "0.3.65", features = ["Worker"] }
+wasm-bindgen = { path = "../..", version = "0.2.89" }
+wasm-bindgen-futures = { path = "../futures", version = "0.4.39" }
+web-sys = { path = "../web-sys", version = "0.3.66", features = ["Worker"] }
diff --git a/crates/multi-value-xform/Cargo.toml b/crates/multi-value-xform/Cargo.toml
index 40f9a701..f185a54b 100644
--- a/crates/multi-value-xform/Cargo.toml
+++ b/crates/multi-value-xform/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-multi-value-xform"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/multi-value-xform"
diff --git a/crates/shared/Cargo.toml b/crates/shared/Cargo.toml
index aebb041b..bae3d5ca 100644
--- a/crates/shared/Cargo.toml
+++ b/crates/shared/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-shared"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared"
diff --git a/crates/threads-xform/Cargo.toml b/crates/threads-xform/Cargo.toml
index e917945b..d26205e9 100644
--- a/crates/threads-xform/Cargo.toml
+++ b/crates/threads-xform/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-threads-xform"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/threads-xform"
@@ -15,7 +15,7 @@ rust-version = "1.57"
 [dependencies]
 anyhow = "1.0"
 walrus = "0.20.2"
-wasm-bindgen-wasm-conventions = { path = "../wasm-conventions", version = "=0.2.88" }
+wasm-bindgen-wasm-conventions = { path = "../wasm-conventions", version = "=0.2.89" }
 
 [dev-dependencies]
 rayon = "1.0"
diff --git a/crates/wasm-conventions/Cargo.toml b/crates/wasm-conventions/Cargo.toml
index 0d540652..634b5285 100644
--- a/crates/wasm-conventions/Cargo.toml
+++ b/crates/wasm-conventions/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-wasm-conventions"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/wasm-conventions"
diff --git a/crates/wasm-interpreter/Cargo.toml b/crates/wasm-interpreter/Cargo.toml
index 8a49c618..324b7c2b 100644
--- a/crates/wasm-interpreter/Cargo.toml
+++ b/crates/wasm-interpreter/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-wasm-interpreter"
-version = "0.2.88"
+version = "0.2.89"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/main/crates/wasm-interpreter"
@@ -16,7 +16,7 @@ rust-version = "1.57"
 anyhow = "1.0"
 log = "0.4"
 walrus = "0.20.2"
-wasm-bindgen-wasm-conventions = { path = "../wasm-conventions", version = "0.2.88" }
+wasm-bindgen-wasm-conventions = { path = "../wasm-conventions", version = "0.2.89" }
 
 [dev-dependencies]
 tempfile = "3"
diff --git a/crates/web-sys/Cargo.toml b/crates/web-sys/Cargo.toml
index afb2bfa5..baa3d352 100644
--- a/crates/web-sys/Cargo.toml
+++ b/crates/web-sys/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "web-sys"
-version = "0.3.65"
+version = "0.3.66"
 authors = ["The wasm-bindgen Developers"]
 readme = "./README.md"
 homepage = "https://rustwasm.github.io/wasm-bindgen/web-sys/index.html"
@@ -22,12 +22,12 @@ doctest = false
 test = false
 
 [dependencies]
-wasm-bindgen = { path = "../..", version = "0.2.88" }
-js-sys = { path = '../js-sys', version = '0.3.65' }
+wasm-bindgen = { path = "../..", version = "0.2.89" }
+js-sys = { path = '../js-sys', version = '0.3.66' }
 
 [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
-wasm-bindgen-test = { path = '../test', version = '0.3.38' }
-wasm-bindgen-futures = { path = '../futures', version = '0.4.38' }
+wasm-bindgen-test = { path = '../test', version = '0.3.39' }
+wasm-bindgen-futures = { path = '../futures', version = '0.4.39' }
 
 # This list is auto-generated by the wasm-bindgen-webidl program
 [features]
@@ -237,10 +237,6 @@ CredentialsContainer = []
 Crypto = []
 CryptoKey = []
 CryptoKeyPair = []
-Csp = []
-CspPolicies = []
-CspReport = []
-CspReportProperties = []
 CssAnimation = ["Animation", "EventTarget"]
 CssBoxType = []
 CssConditionRule = ["CssGroupingRule", "CssRule"]
@@ -409,7 +405,6 @@ FileSystemSyncAccessHandle = []
 FileSystemWritableFileStream = ["WritableStream"]
 FillMode = []
 FlashClassification = []
-FlexLineGrowthState = []
 FlowControlType = []
 FocusEvent = ["Event", "UiEvent"]
 FocusEventInit = []
@@ -575,8 +570,6 @@ GpuVertexBufferLayout = []
 GpuVertexFormat = []
 GpuVertexState = []
 GpuVertexStepMode = []
-GridDeclaration = []
-GridTrackState = []
 GroupedHistoryEventInit = []
 HalfOpenInfoDict = []
 HardwareAcceleration = []
@@ -728,7 +721,6 @@ ImageTrack = ["EventTarget"]
 ImageTrackList = []
 InputEvent = ["Event", "UiEvent"]
 InputEventInit = []
-InstallTriggerData = []
 IntersectionObserver = []
 IntersectionObserverEntry = []
 IntersectionObserverEntryInit = []
@@ -1094,7 +1086,6 @@ RtcIdentityProviderOptions = []
 RtcIdentityProviderRegistrar = []
 RtcIdentityValidationResult = []
 RtcInboundRtpStreamStats = []
-RtcLifecycleEvent = []
 RtcMediaStreamStats = []
 RtcMediaStreamTrackStats = []
 RtcOfferAnswerOptions = []
@@ -1432,6 +1423,7 @@ UsbPermissionStorage = []
 UsbRecipient = []
 UsbRequestType = []
 UsbTransferStatus = []
+UserActivation = []
 UserProximityEvent = ["Event"]
 UserProximityEventInit = []
 UserVerificationRequirement = []
@@ -1543,7 +1535,6 @@ WebglDepthTexture = []
 WebglDrawBuffers = []
 WebglLoseContext = []
 WebglMultiDraw = []
-WebrtcGlobalStatisticsReport = []
 WgslLanguageFeatures = []
 WheelEvent = ["Event", "MouseEvent", "UiEvent"]
 WheelEventInit = []
diff --git a/crates/web-sys/src/features/gen_Csp.rs b/crates/web-sys/src/features/gen_Csp.rs
deleted file mode 100644
index 5fb46ed9..00000000
--- a/crates/web-sys/src/features/gen_Csp.rs
+++ /dev/null
@@ -1,402 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use super::*;
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-extern "C" {
-    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = CSP)]
-    #[derive(Debug, Clone, PartialEq, Eq)]
-    #[doc = "The `Csp` dictionary."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub type Csp;
-}
-impl Csp {
-    #[doc = "Construct a new `Csp`."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn new() -> Self {
-        #[allow(unused_mut)]
-        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
-        ret
-    }
-    #[doc = "Change the `base-uri` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn base_uri(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("base-uri"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `block-all-mixed-content` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn block_all_mixed_content(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("block-all-mixed-content"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `child-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn child_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("child-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `connect-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn connect_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("connect-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `default-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn default_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("default-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `font-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn font_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("font-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `form-action` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn form_action(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("form-action"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `frame-ancestors` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn frame_ancestors(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("frame-ancestors"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `frame-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn frame_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("frame-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `img-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn img_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("img-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `manifest-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn manifest_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("manifest-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `media-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn media_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("media-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `object-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn object_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("object-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `referrer` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn referrer(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("referrer"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `report-only` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn report_only(&mut self, val: bool) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("report-only"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `report-uri` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn report_uri(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("report-uri"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `require-sri-for` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn require_sri_for(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("require-sri-for"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `sandbox` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn sandbox(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("sandbox"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `script-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn script_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("script-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `style-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn style_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("style-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `upgrade-insecure-requests` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn upgrade_insecure_requests(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("upgrade-insecure-requests"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `worker-src` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `Csp`*"]
-    pub fn worker_src(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("worker-src"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-}
-impl Default for Csp {
-    fn default() -> Self {
-        Self::new()
-    }
-}
diff --git a/crates/web-sys/src/features/gen_CspPolicies.rs b/crates/web-sys/src/features/gen_CspPolicies.rs
deleted file mode 100644
index 2ee8221a..00000000
--- a/crates/web-sys/src/features/gen_CspPolicies.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use super::*;
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-extern "C" {
-    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = CSPPolicies)]
-    #[derive(Debug, Clone, PartialEq, Eq)]
-    #[doc = "The `CspPolicies` dictionary."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspPolicies`*"]
-    pub type CspPolicies;
-}
-impl CspPolicies {
-    #[doc = "Construct a new `CspPolicies`."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspPolicies`*"]
-    pub fn new() -> Self {
-        #[allow(unused_mut)]
-        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
-        ret
-    }
-    #[doc = "Change the `csp-policies` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspPolicies`*"]
-    pub fn csp_policies(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("csp-policies"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-}
-impl Default for CspPolicies {
-    fn default() -> Self {
-        Self::new()
-    }
-}
diff --git a/crates/web-sys/src/features/gen_CspReport.rs b/crates/web-sys/src/features/gen_CspReport.rs
deleted file mode 100644
index 77ef67e0..00000000
--- a/crates/web-sys/src/features/gen_CspReport.rs
+++ /dev/null
@@ -1,46 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use super::*;
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-extern "C" {
-    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = CSPReport)]
-    #[derive(Debug, Clone, PartialEq, Eq)]
-    #[doc = "The `CspReport` dictionary."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReport`*"]
-    pub type CspReport;
-}
-impl CspReport {
-    #[doc = "Construct a new `CspReport`."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReport`*"]
-    pub fn new() -> Self {
-        #[allow(unused_mut)]
-        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
-        ret
-    }
-    #[cfg(feature = "CspReportProperties")]
-    #[doc = "Change the `csp-report` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReport`, `CspReportProperties`*"]
-    pub fn csp_report(&mut self, val: &CspReportProperties) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("csp-report"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-}
-impl Default for CspReport {
-    fn default() -> Self {
-        Self::new()
-    }
-}
diff --git a/crates/web-sys/src/features/gen_CspReportProperties.rs b/crates/web-sys/src/features/gen_CspReportProperties.rs
deleted file mode 100644
index 8b7cb005..00000000
--- a/crates/web-sys/src/features/gen_CspReportProperties.rs
+++ /dev/null
@@ -1,181 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use super::*;
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-extern "C" {
-    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = CSPReportProperties)]
-    #[derive(Debug, Clone, PartialEq, Eq)]
-    #[doc = "The `CspReportProperties` dictionary."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub type CspReportProperties;
-}
-impl CspReportProperties {
-    #[doc = "Construct a new `CspReportProperties`."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn new() -> Self {
-        #[allow(unused_mut)]
-        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
-        ret
-    }
-    #[doc = "Change the `blocked-uri` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn blocked_uri(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("blocked-uri"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `column-number` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn column_number(&mut self, val: i32) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("column-number"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `document-uri` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn document_uri(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("document-uri"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `line-number` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn line_number(&mut self, val: i32) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("line-number"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `original-policy` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn original_policy(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("original-policy"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `referrer` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn referrer(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("referrer"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `script-sample` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn script_sample(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("script-sample"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `source-file` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn source_file(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("source-file"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `violated-directive` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `CspReportProperties`*"]
-    pub fn violated_directive(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("violated-directive"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-}
-impl Default for CspReportProperties {
-    fn default() -> Self {
-        Self::new()
-    }
-}
diff --git a/crates/web-sys/src/features/gen_FlexLineGrowthState.rs b/crates/web-sys/src/features/gen_FlexLineGrowthState.rs
deleted file mode 100644
index 8b4bd3fd..00000000
--- a/crates/web-sys/src/features/gen_FlexLineGrowthState.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-#[doc = "The `FlexLineGrowthState` enum."]
-#[doc = ""]
-#[doc = "*This API requires the following crate features to be activated: `FlexLineGrowthState`*"]
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum FlexLineGrowthState {
-    Unchanged = "unchanged",
-    Shrinking = "shrinking",
-    Growing = "growing",
-}
diff --git a/crates/web-sys/src/features/gen_GridDeclaration.rs b/crates/web-sys/src/features/gen_GridDeclaration.rs
deleted file mode 100644
index c01e2adb..00000000
--- a/crates/web-sys/src/features/gen_GridDeclaration.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-#[doc = "The `GridDeclaration` enum."]
-#[doc = ""]
-#[doc = "*This API requires the following crate features to be activated: `GridDeclaration`*"]
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum GridDeclaration {
-    Explicit = "explicit",
-    Implicit = "implicit",
-}
diff --git a/crates/web-sys/src/features/gen_GridTrackState.rs b/crates/web-sys/src/features/gen_GridTrackState.rs
deleted file mode 100644
index c3c43cf5..00000000
--- a/crates/web-sys/src/features/gen_GridTrackState.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-#[doc = "The `GridTrackState` enum."]
-#[doc = ""]
-#[doc = "*This API requires the following crate features to be activated: `GridTrackState`*"]
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum GridTrackState {
-    Static = "static",
-    Repeat = "repeat",
-    Removed = "removed",
-}
diff --git a/crates/web-sys/src/features/gen_InstallTriggerData.rs b/crates/web-sys/src/features/gen_InstallTriggerData.rs
deleted file mode 100644
index 44c494c5..00000000
--- a/crates/web-sys/src/features/gen_InstallTriggerData.rs
+++ /dev/null
@@ -1,71 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use super::*;
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-extern "C" {
-    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = InstallTriggerData)]
-    #[derive(Debug, Clone, PartialEq, Eq)]
-    #[doc = "The `InstallTriggerData` dictionary."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `InstallTriggerData`*"]
-    pub type InstallTriggerData;
-}
-impl InstallTriggerData {
-    #[doc = "Construct a new `InstallTriggerData`."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `InstallTriggerData`*"]
-    pub fn new() -> Self {
-        #[allow(unused_mut)]
-        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
-        ret
-    }
-    #[doc = "Change the `Hash` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `InstallTriggerData`*"]
-    pub fn hash(&mut self, val: Option<&str>) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("Hash"), &JsValue::from(val));
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `IconURL` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `InstallTriggerData`*"]
-    pub fn icon_url(&mut self, val: Option<&str>) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("IconURL"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-    #[doc = "Change the `URL` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `InstallTriggerData`*"]
-    pub fn url(&mut self, val: &str) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("URL"), &JsValue::from(val));
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-}
-impl Default for InstallTriggerData {
-    fn default() -> Self {
-        Self::new()
-    }
-}
diff --git a/crates/web-sys/src/features/gen_Navigator.rs b/crates/web-sys/src/features/gen_Navigator.rs
index 17197347..a9b499e6 100644
--- a/crates/web-sys/src/features/gen_Navigator.rs
+++ b/crates/web-sys/src/features/gen_Navigator.rs
@@ -105,6 +105,14 @@ extern "C" {
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `CredentialsContainer`, `Navigator`*"]
     pub fn credentials(this: &Navigator) -> CredentialsContainer;
+    #[cfg(feature = "UserActivation")]
+    # [wasm_bindgen (structural , method , getter , js_class = "Navigator" , js_name = userActivation)]
+    #[doc = "Getter for the `userActivation` field of this object."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userActivation)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `Navigator`, `UserActivation`*"]
+    pub fn user_activation(this: &Navigator) -> UserActivation;
     #[cfg(web_sys_unstable_apis)]
     #[cfg(feature = "Bluetooth")]
     # [wasm_bindgen (structural , method , getter , js_class = "Navigator" , js_name = bluetooth)]
diff --git a/crates/web-sys/src/features/gen_RtcLifecycleEvent.rs b/crates/web-sys/src/features/gen_RtcLifecycleEvent.rs
deleted file mode 100644
index 98fd2a54..00000000
--- a/crates/web-sys/src/features/gen_RtcLifecycleEvent.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-#[doc = "The `RtcLifecycleEvent` enum."]
-#[doc = ""]
-#[doc = "*This API requires the following crate features to be activated: `RtcLifecycleEvent`*"]
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum RtcLifecycleEvent {
-    Initialized = "initialized",
-    Icegatheringstatechange = "icegatheringstatechange",
-    Iceconnectionstatechange = "iceconnectionstatechange",
-}
diff --git a/crates/web-sys/src/features/gen_UserActivation.rs b/crates/web-sys/src/features/gen_UserActivation.rs
new file mode 100644
index 00000000..deef4a5c
--- /dev/null
+++ b/crates/web-sys/src/features/gen_UserActivation.rs
@@ -0,0 +1,29 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = UserActivation , typescript_type = "UserActivation")]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `UserActivation` class."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/UserActivation)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `UserActivation`*"]
+    pub type UserActivation;
+    # [wasm_bindgen (structural , method , getter , js_class = "UserActivation" , js_name = hasBeenActive)]
+    #[doc = "Getter for the `hasBeenActive` field of this object."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/UserActivation/hasBeenActive)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `UserActivation`*"]
+    pub fn has_been_active(this: &UserActivation) -> bool;
+    # [wasm_bindgen (structural , method , getter , js_class = "UserActivation" , js_name = isActive)]
+    #[doc = "Getter for the `isActive` field of this object."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/UserActivation/isActive)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `UserActivation`*"]
+    pub fn is_active(this: &UserActivation) -> bool;
+}
diff --git a/crates/web-sys/src/features/gen_WebrtcGlobalStatisticsReport.rs b/crates/web-sys/src/features/gen_WebrtcGlobalStatisticsReport.rs
deleted file mode 100644
index a06f06ed..00000000
--- a/crates/web-sys/src/features/gen_WebrtcGlobalStatisticsReport.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-#![allow(unused_imports)]
-#![allow(clippy::all)]
-use super::*;
-use wasm_bindgen::prelude::*;
-#[wasm_bindgen]
-extern "C" {
-    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = WebrtcGlobalStatisticsReport)]
-    #[derive(Debug, Clone, PartialEq, Eq)]
-    #[doc = "The `WebrtcGlobalStatisticsReport` dictionary."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `WebrtcGlobalStatisticsReport`*"]
-    pub type WebrtcGlobalStatisticsReport;
-}
-impl WebrtcGlobalStatisticsReport {
-    #[doc = "Construct a new `WebrtcGlobalStatisticsReport`."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `WebrtcGlobalStatisticsReport`*"]
-    pub fn new() -> Self {
-        #[allow(unused_mut)]
-        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
-        ret
-    }
-    #[doc = "Change the `reports` field of this object."]
-    #[doc = ""]
-    #[doc = "*This API requires the following crate features to be activated: `WebrtcGlobalStatisticsReport`*"]
-    pub fn reports(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
-        use wasm_bindgen::JsValue;
-        let r = ::js_sys::Reflect::set(
-            self.as_ref(),
-            &JsValue::from("reports"),
-            &JsValue::from(val),
-        );
-        debug_assert!(
-            r.is_ok(),
-            "setting properties should never fail on our dictionary objects"
-        );
-        let _ = r;
-        self
-    }
-}
-impl Default for WebrtcGlobalStatisticsReport {
-    fn default() -> Self {
-        Self::new()
-    }
-}
diff --git a/crates/web-sys/src/features/mod.rs b/crates/web-sys/src/features/mod.rs
index 12094200..8333053b 100644
--- a/crates/web-sys/src/features/mod.rs
+++ b/crates/web-sys/src/features/mod.rs
@@ -1234,30 +1234,6 @@ mod gen_CryptoKeyPair;
 #[cfg(feature = "CryptoKeyPair")]
 pub use gen_CryptoKeyPair::*;
 
-#[cfg(feature = "Csp")]
-#[allow(non_snake_case)]
-mod gen_Csp;
-#[cfg(feature = "Csp")]
-pub use gen_Csp::*;
-
-#[cfg(feature = "CspPolicies")]
-#[allow(non_snake_case)]
-mod gen_CspPolicies;
-#[cfg(feature = "CspPolicies")]
-pub use gen_CspPolicies::*;
-
-#[cfg(feature = "CspReport")]
-#[allow(non_snake_case)]
-mod gen_CspReport;
-#[cfg(feature = "CspReport")]
-pub use gen_CspReport::*;
-
-#[cfg(feature = "CspReportProperties")]
-#[allow(non_snake_case)]
-mod gen_CspReportProperties;
-#[cfg(feature = "CspReportProperties")]
-pub use gen_CspReportProperties::*;
-
 #[cfg(feature = "CssAnimation")]
 #[allow(non_snake_case)]
 mod gen_CssAnimation;
@@ -2266,12 +2242,6 @@ mod gen_FlashClassification;
 #[cfg(feature = "FlashClassification")]
 pub use gen_FlashClassification::*;
 
-#[cfg(feature = "FlexLineGrowthState")]
-#[allow(non_snake_case)]
-mod gen_FlexLineGrowthState;
-#[cfg(feature = "FlexLineGrowthState")]
-pub use gen_FlexLineGrowthState::*;
-
 #[cfg(feature = "FlowControlType")]
 #[allow(non_snake_case)]
 mod gen_FlowControlType;
@@ -3262,18 +3232,6 @@ mod gen_GpuVertexStepMode;
 #[cfg(feature = "GpuVertexStepMode")]
 pub use gen_GpuVertexStepMode::*;
 
-#[cfg(feature = "GridDeclaration")]
-#[allow(non_snake_case)]
-mod gen_GridDeclaration;
-#[cfg(feature = "GridDeclaration")]
-pub use gen_GridDeclaration::*;
-
-#[cfg(feature = "GridTrackState")]
-#[allow(non_snake_case)]
-mod gen_GridTrackState;
-#[cfg(feature = "GridTrackState")]
-pub use gen_GridTrackState::*;
-
 #[cfg(feature = "GroupedHistoryEventInit")]
 #[allow(non_snake_case)]
 mod gen_GroupedHistoryEventInit;
@@ -4180,12 +4138,6 @@ mod gen_InputEventInit;
 #[cfg(feature = "InputEventInit")]
 pub use gen_InputEventInit::*;
 
-#[cfg(feature = "InstallTriggerData")]
-#[allow(non_snake_case)]
-mod gen_InstallTriggerData;
-#[cfg(feature = "InstallTriggerData")]
-pub use gen_InstallTriggerData::*;
-
 #[cfg(feature = "IntersectionObserver")]
 #[allow(non_snake_case)]
 mod gen_IntersectionObserver;
@@ -6376,12 +6328,6 @@ mod gen_RtcInboundRtpStreamStats;
 #[cfg(feature = "RtcInboundRtpStreamStats")]
 pub use gen_RtcInboundRtpStreamStats::*;
 
-#[cfg(feature = "RtcLifecycleEvent")]
-#[allow(non_snake_case)]
-mod gen_RtcLifecycleEvent;
-#[cfg(feature = "RtcLifecycleEvent")]
-pub use gen_RtcLifecycleEvent::*;
-
 #[cfg(feature = "RtcMediaStreamStats")]
 #[allow(non_snake_case)]
 mod gen_RtcMediaStreamStats;
@@ -8404,6 +8350,12 @@ mod gen_UsbTransferStatus;
 #[cfg(feature = "UsbTransferStatus")]
 pub use gen_UsbTransferStatus::*;
 
+#[cfg(feature = "UserActivation")]
+#[allow(non_snake_case)]
+mod gen_UserActivation;
+#[cfg(feature = "UserActivation")]
+pub use gen_UserActivation::*;
+
 #[cfg(feature = "UserProximityEvent")]
 #[allow(non_snake_case)]
 mod gen_UserProximityEvent;
@@ -9070,12 +9022,6 @@ mod gen_WebglMultiDraw;
 #[cfg(feature = "WebglMultiDraw")]
 pub use gen_WebglMultiDraw::*;
 
-#[cfg(feature = "WebrtcGlobalStatisticsReport")]
-#[allow(non_snake_case)]
-mod gen_WebrtcGlobalStatisticsReport;
-#[cfg(feature = "WebrtcGlobalStatisticsReport")]
-pub use gen_WebrtcGlobalStatisticsReport::*;
-
 #[cfg(feature = "WgslLanguageFeatures")]
 #[allow(non_snake_case)]
 mod gen_WgslLanguageFeatures;
diff --git a/crates/web-sys/webidls/enabled/CSPDictionaries.webidl b/crates/web-sys/webidls/enabled/CSPDictionaries.webidl
deleted file mode 100644
index f8de1c9a..00000000
--- a/crates/web-sys/webidls/enabled/CSPDictionaries.webidl
+++ /dev/null
@@ -1,38 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/**
-  * Dictionary used to display CSP info.
-  */
-
-dictionary CSP {
-  boolean report-only = false;
-
-  sequence<DOMString> default-src;
-  sequence<DOMString> script-src;
-  sequence<DOMString> object-src;
-  sequence<DOMString> style-src;
-  sequence<DOMString> img-src;
-  sequence<DOMString> media-src;
-  sequence<DOMString> frame-src;
-  sequence<DOMString> font-src;
-  sequence<DOMString> connect-src;
-  sequence<DOMString> report-uri;
-  sequence<DOMString> frame-ancestors;
-  // sequence<DOMString> reflected-xss; // not supported in Firefox
-  sequence<DOMString> base-uri;
-  sequence<DOMString> form-action;
-  sequence<DOMString> referrer;
-  sequence<DOMString> manifest-src;
-  sequence<DOMString> upgrade-insecure-requests;
-  sequence<DOMString> child-src;
-  sequence<DOMString> block-all-mixed-content;
-  sequence<DOMString> require-sri-for;
-  sequence<DOMString> sandbox;
-  sequence<DOMString> worker-src;
-};
-
-dictionary CSPPolicies {
-  sequence<CSP> csp-policies;
-};
diff --git a/crates/web-sys/webidls/enabled/CSPReport.webidl b/crates/web-sys/webidls/enabled/CSPReport.webidl
deleted file mode 100644
index 301ca288..00000000
--- a/crates/web-sys/webidls/enabled/CSPReport.webidl
+++ /dev/null
@@ -1,24 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/**
-  * This dictionary holds the parameters used to send
-  * CSP reports in JSON format.
-  */
-
-dictionary CSPReportProperties {
-  DOMString document-uri = "";
-  DOMString referrer = "";
-  DOMString blocked-uri = "";
-  DOMString violated-directive = "";
-  DOMString original-policy= "";
-  DOMString source-file;
-  DOMString script-sample;
-  long line-number;
-  long column-number;
-};
-
-dictionary CSPReport {
-  CSPReportProperties csp-report;
-};
diff --git a/crates/web-sys/webidls/enabled/ChildSHistory.webidl b/crates/web-sys/webidls/enabled/ChildSHistory.webidl
deleted file mode 100644
index 7ae2151b..00000000
--- a/crates/web-sys/webidls/enabled/ChildSHistory.webidl
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-// invalid widl
-///interface nsISHistory;
-
-/**
- * The ChildSHistory interface represents the child side of a browsing
- * context's session history.
- */
-[ChromeOnly]
-interface ChildSHistory {
-  [Pure]
-  readonly attribute long count;
-  [Pure]
-  readonly attribute long index;
-
-  boolean canGo(long aOffset);
-  [Throws]
-  undefined go(long aOffset);
-
-  /**
-   * Reload the current entry. The flags which should be passed to this
-   * function are documented and defined in nsIWebNavigation.idl
-   */
-  [Throws]
-  undefined reload(unsigned long aReloadFlags);
-
-  /**
-   * Getter for the legacy nsISHistory implementation.
-   *
-   * This getter _will be going away_, but is needed while we finish
-   * implementing all of the APIs which we will need in the content
-   * process on ChildSHistory.
-   */
-  readonly attribute nsISHistory legacySHistory;
-};
diff --git a/crates/web-sys/webidls/enabled/Flex.webidl b/crates/web-sys/webidls/enabled/Flex.webidl
deleted file mode 100644
index 58c71363..00000000
--- a/crates/web-sys/webidls/enabled/Flex.webidl
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-/**
- * These objects support visualization of flex containers by the
- * dev tools.
- */
-
-[ChromeOnly]
-interface Flex
-{
-  sequence<FlexLine> getLines();
-};
-
-/**
- * Lines with items that have been shrunk are shrinking; with items
- * that have grown are growing, and all others are unchanged.
- */
-enum FlexLineGrowthState { "unchanged", "shrinking", "growing" };
-
-[ChromeOnly]
-interface FlexLine
-{
-  readonly attribute FlexLineGrowthState growthState;
-  readonly attribute double crossStart;
-  readonly attribute double crossSize;
-
-  // firstBaselineOffset measures from flex-start edge.
-  readonly attribute double firstBaselineOffset;
-
-  // lastBaselineOffset measures from flex-end edge.
-  readonly attribute double lastBaselineOffset;
-
-  /**
-   * getItems() returns FlexItems only for the Elements in this Flex
-   * container -- ignoring struts and abs-pos Elements.
-   */
-  sequence<FlexItem> getItems();
-};
-
-[ChromeOnly]
-interface FlexItem
-{
-  readonly attribute Node? node;
-  readonly attribute double mainBaseSize;
-  readonly attribute double mainDeltaSize;
-  readonly attribute double mainMinSize;
-  readonly attribute double mainMaxSize;
-  readonly attribute double crossMinSize;
-  readonly attribute double crossMaxSize;
-};
diff --git a/crates/web-sys/webidls/enabled/FrameLoader.webidl b/crates/web-sys/webidls/enabled/FrameLoader.webidl
deleted file mode 100644
index 7cf40f22..00000000
--- a/crates/web-sys/webidls/enabled/FrameLoader.webidl
+++ /dev/null
@@ -1,219 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-// invalid widl
-//interface LoadContext;
-//interface TabParent;
-//interface URI;
-//interface nsIDocShell;
-//interface nsIPrintSettings;
-//interface nsIWebBrowserPersistDocumentReceiver;
-//interface nsIWebProgressListener;
-
-[ChromeOnly]
-interface FrameLoader {
-  /**
-   * Get the docshell from the frame loader.
-   */
-  [GetterThrows]
-  readonly attribute nsIDocShell? docShell;
-
-  /**
-   * Get this frame loader's TabParent, if it has a remote frame.  Otherwise,
-   * returns null.
-   */
-  readonly attribute TabParent? tabParent;
-
-  /**
-   * Get an nsILoadContext for the top-level docshell. For remote
-   * frames, a shim is returned that contains private browsing and app
-   * information.
-   */
-  readonly attribute LoadContext loadContext;
-
-  /**
-   * Get the ParentSHistory for the nsFrameLoader. May return null if this
-   * frameloader is not for a toplevel frame.
-   */
-  readonly attribute ParentSHistory? parentSHistory;
-
-  /**
-   * Adds a blocking promise for the current cross process navigation.
-   * This method can only be called while the "BrowserWillChangeProcess" event
-   * is being fired.
-   */
-  [Throws]
-  undefined addProcessChangeBlockingPromise(Promise<any> aPromise);
-
-  /**
-   * Find out whether the loader's frame is at too great a depth in
-   * the frame tree.  This can be used to decide what operations may
-   * or may not be allowed on the loader's docshell.
-   */
-  [Pure]
-  readonly attribute boolean depthTooGreat;
-
-  /**
-   * Activate remote frame.
-   * Throws an exception with non-remote frames.
-   */
-  [Throws]
-  undefined activateRemoteFrame();
-
-  /**
-   * Deactivate remote frame.
-   * Throws an exception with non-remote frames.
-   */
-  [Throws]
-  undefined deactivateRemoteFrame();
-
-  /**
-   * @see nsIDOMWindowUtils sendMouseEvent.
-   */
-  [Throws]
-  undefined sendCrossProcessMouseEvent(DOMString aType,
-                                  float aX,
-                                  float aY,
-                                  long aButton,
-                                  long aClickCount,
-                                  long aModifiers,
-                                  optional boolean aIgnoreRootScrollFrame = false);
-
-  /**
-   * Activate event forwarding from client (remote frame) to parent.
-   */
-  [Throws]
-  undefined activateFrameEvent(DOMString aType, boolean capture);
-
-  // Note, when frameloaders are swapped, also messageManagers are swapped.
-  readonly attribute MessageSender? messageManager;
-
-  /**
-   * Request that the next time a remote layer transaction has been
-   * received by the Compositor, a MozAfterRemoteFrame event be sent
-   * to the window.
-   */
-  undefined requestNotifyAfterRemotePaint();
-
-  /**
-   * Close the window through the ownerElement.
-   */
-  [Throws]
-  undefined requestFrameLoaderClose();
-
-  /**
-   * Force a remote browser to recompute its dimension and screen position.
-   */
-  [Throws]
-  undefined requestUpdatePosition();
-
-  /**
-   * Print the current document.
-   *
-   * @param aOuterWindowID the ID of the outer window to print
-   * @param aPrintSettings optional print settings to use; printSilent can be
-   *                       set to prevent prompting.
-   * @param aProgressListener optional print progress listener.
-   */
-  [Throws]
-  undefined print(unsigned long long aOuterWindowID,
-             nsIPrintSettings aPrintSettings,
-             optional nsIWebProgressListener? aProgressListener = null);
-
-  /**
-   * If false, then the subdocument is not clipped to its CSS viewport, and the
-   * subdocument's viewport scrollbar(s) are not rendered.
-   * Defaults to true.
-   */
-  attribute boolean clipSubdocument;
-
-  /**
-   * If false, then the subdocument's scroll coordinates will not be clamped
-   * to their scroll boundaries.
-   * Defaults to true.
-   */
-  attribute boolean clampScrollPosition;
-
-  /**
-   * The element which owns this frame loader.
-   *
-   * For example, if this is a frame loader for an <iframe>, this attribute
-   * returns the iframe element.
-   */
-  [Pure]
-  readonly attribute Element? ownerElement;
-
-
-  /**
-   * Cached childID of the ContentParent owning the TabParent in this frame
-   * loader. This can be used to obtain the childID after the TabParent died.
-   */
-  [Pure]
-  readonly attribute unsigned long long childID;
-
-  /**
-   * Find out whether the owner content really is a mozbrowser. <xul:browser>
-   * is not considered to be a mozbrowser frame.
-   */
-  [Pure]
-  readonly attribute boolean ownerIsMozBrowserFrame;
-
-  /**
-   * The last known width of the frame. Reading this property will not trigger
-   * a reflow, and therefore may not reflect the current state of things. It
-   * should only be used in asynchronous APIs where values are not guaranteed
-   * to be up-to-date when received.
-   */
-  [Pure]
-  readonly attribute unsigned long lazyWidth;
-
-  /**
-   * The last known height of the frame. Reading this property will not trigger
-   * a reflow, and therefore may not reflect the current state of things. It
-   * should only be used in asynchronous APIs where values are not guaranteed
-   * to be up-to-date when received.
-   */
-  [Pure]
-  readonly attribute unsigned long lazyHeight;
-
-  /**
-   * Is `true` if the frameloader is dead (destroy has been called on it)
-   */
-  [Pure]
-  readonly attribute boolean isDead;
-};
-
-/**
- * Interface for objects which represent a document that can be
- * serialized with nsIWebBrowserPersist.  This interface is
- * asynchronous because the actual document can be in another process
- * (e.g., if this object is a FrameLoader for an out-of-process
- * frame).
- *
- * XXXbz This method should really just return a Promise...
- *
- * @see nsIWebBrowserPersistDocumentReceiver
- * @see nsIWebBrowserPersistDocument
- * @see nsIWebBrowserPersist
- *
- * @param aOuterWindowID
- *        The outer window ID of the subframe we'd like to persist.
- *        If set at 0, WebBrowserPersistable will attempt to persist
- *        the top-level document. If the outer window ID is for a subframe
- *        that does not exist, or is not held beneath the WebBrowserPersistable,
- *        aRecv's onError method will be called with NS_ERROR_NO_CONTENT.
- * @param aRecv
- *        The nsIWebBrowserPersistDocumentReceiver is a callback that
- *        will be fired once the document is ready for persisting.
- */
-interface mixin WebBrowserPersistable
-{
-  [Throws]
-  undefined startPersistence(unsigned long long aOuterWindowID,
-                        nsIWebBrowserPersistDocumentReceiver aRecv);
-};
-
-FrameLoader includes WebBrowserPersistable;
diff --git a/crates/web-sys/webidls/enabled/Grid.webidl b/crates/web-sys/webidls/enabled/Grid.webidl
deleted file mode 100644
index 0b5dbf23..00000000
--- a/crates/web-sys/webidls/enabled/Grid.webidl
+++ /dev/null
@@ -1,127 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-/* These objects support visualization of a css-grid by the dev tools. */
-
-/**
- * Explicit and implicit types apply to tracks, lines, and areas.
- * https://drafts.csswg.org/css-grid/#explicit-grids
- * https://drafts.csswg.org/css-grid/#implicit-grids
- */
-enum GridDeclaration { "explicit", "implicit" };
-
-/**
- * Tracks expanded from auto-fill are repeat , auto-fits with elements are
- * also repeat, auto-fits with no elements are removed, other tracks are static.
- */
-enum GridTrackState { "static", "repeat", "removed" };
-
-[ChromeOnly]
-interface Grid
-{
-  readonly attribute GridDimension rows;
-  readonly attribute GridDimension cols;
-  [Cached, Constant]
-  readonly attribute sequence<GridArea> areas;
-};
-
-[ChromeOnly]
-interface GridDimension
-{
-  readonly attribute GridLines lines;
-  readonly attribute GridTracks tracks;
-};
-
-[ChromeOnly]
-interface GridLines
-{
-  readonly attribute unsigned long length;
-
-  /**
-   * This accessor method allows array-like access to lines.
-   * @param index A 0-indexed value.
-   */
-  getter GridLine? item(unsigned long index);
-};
-
-[ChromeOnly]
-interface GridLine
-{
-  /**
-   * Names include both explicit names and implicit names, which will be
-   * assigned if the line contributes to a named area.
-   * https://drafts.csswg.org/css-grid/#implicit-named-lines
-   */
-  [Cached, Constant]
-  readonly attribute sequence<DOMString> names;
-
-  readonly attribute double start;
-
-  /**
-   * Breadth is the gap between the start of this line and the start of the
-   * next track in flow direction. It primarily is set by use of the -gap
-   * properties.
-   * https://drafts.csswg.org/css-grid/#gutters
-   */
-  readonly attribute double breadth;
-
-  readonly attribute GridDeclaration type;
-
-  /**
-   * Number is the 1-indexed index of the line in flow order. The
-   * first explicit line has number 1, and numbers increment by 1 for
-   * each line after that. Lines before the first explicit line
-   * have number 0, which is not a valid addressable line number, and
-   * should be filtered out by callers.
-   */
-  readonly attribute unsigned long number;
-
-  /**
-   * NegativeNumber is the 1-indexed index of the line in reverse
-   * flow order. The last explicit line has negativeNumber -1, and
-   * negativeNumbers decrement by 1 for each line before that.
-   * Lines after the last explicit line have negativeNumber 0, which
-   * is not a valid addressable line number, and should be filtered
-   * out by callers.
-   */
-  readonly attribute long negativeNumber;
-};
-
-[ChromeOnly]
-interface GridTracks
-{
-  readonly attribute unsigned long length;
-
-  /**
-   * This accessor method allows array-like access to tracks.
-   * @param index A 0-indexed value.
-   */
-  getter GridTrack? item(unsigned long index);
-};
-
-[ChromeOnly]
-interface GridTrack
-{
-  readonly attribute double start;
-  readonly attribute double breadth;
-  readonly attribute GridDeclaration type;
-  readonly attribute GridTrackState state;
-};
-
-[ChromeOnly]
-interface GridArea
-{
-  readonly attribute DOMString name;
-  readonly attribute GridDeclaration type;
-
-  /**
-   * These values are 1-indexed line numbers bounding the area.
-   */
-  readonly attribute unsigned long rowStart;
-  readonly attribute unsigned long rowEnd;
-  readonly attribute unsigned long columnStart;
-  readonly attribute unsigned long columnEnd;
-};
diff --git a/crates/web-sys/webidls/enabled/InstallTrigger.webidl b/crates/web-sys/webidls/enabled/InstallTrigger.webidl
deleted file mode 100644
index 17a1d18f..00000000
--- a/crates/web-sys/webidls/enabled/InstallTrigger.webidl
+++ /dev/null
@@ -1,90 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-
-/**
- * A callback function that webpages can implement to be notified when triggered
- * installs complete.
- */
-callback InstallTriggerCallback = undefined(DOMString url, short status);
-
-dictionary InstallTriggerData {
-  DOMString URL;
-  DOMString? IconURL;
-  DOMString? Hash;
-};
-
-/**
- * The interface for the InstallTrigger object available to all websites.
- */
-[ChromeOnly,
- JSImplementation="@mozilla.org/addons/installtrigger;1"]
-interface InstallTriggerImpl {
-  /**
-   * Retained for backwards compatibility.
-   */
-  const unsigned short SKIN = 1;
-  const unsigned short LOCALE = 2;
-  const unsigned short CONTENT = 4;
-  const unsigned short PACKAGE = 7;
-
-  /**
-   * Tests if installation is enabled.
-   */
-  boolean enabled();
-
-  /**
-   * Tests if installation is enabled.
-   *
-   * @deprecated Use "enabled" in the future.
-   */
-  boolean updateEnabled();
-
-  /**
-   * Starts a new installation of a set of add-ons.
-   *
-   * @param  aArgs
-   *         The add-ons to install. This should be a JS object, each property
-   *         is the name of an add-on to be installed. The value of the
-   *         property should either be a string URL, or an object with the
-   *         following properties:
-   *          * URL for the add-on's URL
-   *          * IconURL for an icon for the add-on
-   *          * Hash for a hash of the add-on
-   * @param  aCallback
-   *         A callback to call as each installation succeeds or fails
-   * @return true if the installations were successfully started
-   */
-  boolean install(record<DOMString, (DOMString or InstallTriggerData)> installs,
-                  optional InstallTriggerCallback callback);
-
-  /**
-   * Starts installing a new add-on.
-   *
-   * @deprecated use "install" in the future.
-   *
-   * @param  aType
-   *         Unused, retained for backwards compatibility
-   * @param  aUrl
-   *         The URL of the add-on
-   * @param  aSkin
-   *         Unused, retained for backwards compatibility
-   * @return true if the installation was successfully started
-   */
-  boolean installChrome(unsigned short type, DOMString url, DOMString skin);
-
-  /**
-   * Starts installing a new add-on.
-   *
-   * @deprecated use "install" in the future.
-   *
-   * @param  aUrl
-   *         The URL of the add-on
-   * @param  aFlags
-   *         Unused, retained for backwards compatibility
-   * @return true if the installation was successfully started
-   */
-  boolean startSoftwareUpdate(DOMString url, optional unsigned short flags);
-};
diff --git a/crates/web-sys/webidls/enabled/ParentSHistory.webidl b/crates/web-sys/webidls/enabled/ParentSHistory.webidl
deleted file mode 100644
index f892172d..00000000
--- a/crates/web-sys/webidls/enabled/ParentSHistory.webidl
+++ /dev/null
@@ -1,18 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-/**
- * The ParentSHistory interface represents the parent side of a browsing
- * context's session history. Theoretically this object manages all session
- * history state for the browsing context.
- */
-[ChromeOnly]
-interface ParentSHistory {
-  [Pure]
-  readonly attribute long count;
-  [Pure]
-  readonly attribute long index;
-};
diff --git a/crates/web-sys/webidls/enabled/PeerConnectionImpl.webidl b/crates/web-sys/webidls/enabled/PeerConnectionImpl.webidl
deleted file mode 100644
index f6d817be..00000000
--- a/crates/web-sys/webidls/enabled/PeerConnectionImpl.webidl
+++ /dev/null
@@ -1,134 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * PeerConnection.js' interface to the C++ PeerConnectionImpl.
- *
- * Do not confuse with RTCPeerConnection. This interface is purely for
- * communication between the PeerConnection JS DOM binding and the C++
- * implementation in SIPCC.
- *
- * See media/webrtc/signaling/include/PeerConnectionImpl.h
- *
- */
-
-// invalid widl
-//interface nsISupports;
-
-/* Must be created first. Observer events will be dispatched on the thread provided */
-[ChromeOnly, Constructor]
-interface PeerConnectionImpl  {
-  /* Must be called first. Observer events dispatched on the thread provided */
-  [Throws]
-  undefined initialize(PeerConnectionObserver observer, Window window,
-                  RTCConfiguration iceServers,
-                  nsISupports thread);
-
-  /* JSEP calls */
-  [Throws]
-  undefined createOffer(optional RTCOfferOptions options);
-  [Throws]
-  undefined createAnswer();
-  [Throws]
-  undefined setLocalDescription(long action, DOMString sdp);
-  [Throws]
-  undefined setRemoteDescription(long action, DOMString sdp);
-
-  /* Stats call, calls either |onGetStatsSuccess| or |onGetStatsError| on our
-     observer. (see the |PeerConnectionObserver| interface) */
-  [Throws]
-  undefined getStats(MediaStreamTrack? selector);
-
-  /* Adds the tracks created by GetUserMedia */
-  [Throws]
-  TransceiverImpl createTransceiverImpl(DOMString kind,
-                                        MediaStreamTrack? track);
-  [Throws]
-  boolean checkNegotiationNeeded();
-  [Throws]
-  undefined insertDTMF(TransceiverImpl transceiver, DOMString tones,
-                  optional unsigned long duration = 100,
-                  optional unsigned long interToneGap = 70);
-  [Throws]
-  DOMString getDTMFToneBuffer(RTCRtpSender sender);
-  [Throws]
-  sequence<RTCRtpSourceEntry> getRtpSources(MediaStreamTrack track,
-                                            DOMHighResTimeStamp rtpSourceNow);
-  DOMHighResTimeStamp getNowInRtpSourceReferenceTime();
-
-  [Throws]
-  undefined replaceTrackNoRenegotiation(TransceiverImpl transceiverImpl,
-                                   MediaStreamTrack? withTrack);
-  [Throws]
-  undefined closeStreams();
-
-  [Throws]
-  undefined addRIDExtension(MediaStreamTrack recvTrack, unsigned short extensionId);
-  [Throws]
-  undefined addRIDFilter(MediaStreamTrack recvTrack, DOMString rid);
-
-  // Inserts CSRC data for the RtpSourceObserver for testing
-  [Throws]
-  undefined insertAudioLevelForContributingSource(MediaStreamTrack recvTrack,
-                                             unsigned long source,
-                                             DOMHighResTimeStamp timestamp,
-                                             boolean hasLevel,
-                                             byte level);
-
-  [Throws]
-  undefined enablePacketDump(unsigned long level,
-                        mozPacketDumpType type,
-                        boolean sending);
-
-  [Throws]
-  undefined disablePacketDump(unsigned long level,
-                         mozPacketDumpType type,
-                         boolean sending);
-
-  /* As the ICE candidates roll in this one should be called each time
-   * in order to keep the candidate list up-to-date for the next SDP-related
-   * call PeerConnectionImpl does not parse ICE candidates, just sticks them
-   * into the SDP.
-   */
-  [Throws]
-  undefined addIceCandidate(DOMString candidate, DOMString mid, unsigned short level);
-
-  /* Puts the SIPCC engine back to 'kIdle', shuts down threads, deletes state */
-  [Throws]
-  undefined close();
-
-  /* Notify DOM window if this plugin crash is ours. */
-  boolean pluginCrash(unsigned long long pluginId, DOMString name);
-
-  /* Attributes */
-  /* This provides the implementation with the certificate it uses to
-   * authenticate itself.  The JS side must set this before calling
-   * createOffer/createAnswer or retrieving the value of fingerprint.  This has
-   * to be delayed because generating the certificate takes some time. */
-  attribute RTCCertificate certificate;
-  [Constant]
-  readonly attribute DOMString fingerprint;
-  readonly attribute DOMString localDescription;
-  readonly attribute DOMString currentLocalDescription;
-  readonly attribute DOMString pendingLocalDescription;
-  readonly attribute DOMString remoteDescription;
-  readonly attribute DOMString currentRemoteDescription;
-  readonly attribute DOMString pendingRemoteDescription;
-
-  readonly attribute PCImplIceConnectionState iceConnectionState;
-  readonly attribute PCImplIceGatheringState iceGatheringState;
-  readonly attribute PCImplSignalingState signalingState;
-  attribute DOMString id;
-
-  [SetterThrows]
-  attribute DOMString peerIdentity;
-  readonly attribute boolean privacyRequested;
-
-  /* Data channels */
-  [Throws]
-  RTCDataChannel createDataChannel(DOMString label, DOMString protocol,
-    unsigned short type, boolean ordered,
-    unsigned short maxTime, unsigned short maxNum,
-    boolean externalNegotiated, unsigned short stream);
-};
diff --git a/crates/web-sys/webidls/enabled/PeerConnectionObserver.webidl b/crates/web-sys/webidls/enabled/PeerConnectionObserver.webidl
deleted file mode 100644
index 88f27bca..00000000
--- a/crates/web-sys/webidls/enabled/PeerConnectionObserver.webidl
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-// invalid widl
-// interface nsISupports;
-
-[ChromeOnly,
- JSImplementation="@mozilla.org/dom/peerconnectionobserver;1",
- Constructor (RTCPeerConnection domPC)]
-interface PeerConnectionObserver
-{
-  /* JSEP callbacks */
-  undefined onCreateOfferSuccess(DOMString offer);
-  undefined onCreateOfferError(unsigned long name, DOMString message);
-  undefined onCreateAnswerSuccess(DOMString answer);
-  undefined onCreateAnswerError(unsigned long name, DOMString message);
-  undefined onSetLocalDescriptionSuccess();
-  undefined onSetRemoteDescriptionSuccess();
-  undefined onSetLocalDescriptionError(unsigned long name, DOMString message);
-  undefined onSetRemoteDescriptionError(unsigned long name, DOMString message);
-  undefined onAddIceCandidateSuccess();
-  undefined onAddIceCandidateError(unsigned long name, DOMString message);
-  undefined onIceCandidate(unsigned short level, DOMString mid, DOMString candidate);
-
-  /* Stats callbacks */
-  undefined onGetStatsSuccess(optional RTCStatsReportInternal report);
-  undefined onGetStatsError(unsigned long name, DOMString message);
-
-  /* Data channel callbacks */
-  undefined notifyDataChannel(RTCDataChannel channel);
-
-  /* Notification of one of several types of state changed */
-  undefined onStateChange(PCObserverStateType state);
-
-  /* Transceiver management; called when setRemoteDescription causes a
-     transceiver to be created on the C++ side */
-  undefined onTransceiverNeeded(DOMString kind, TransceiverImpl transceiverImpl);
-
-  /* DTMF callback */
-  undefined onDTMFToneChange(MediaStreamTrack track, DOMString tone);
-
-  /* Packet dump callback */
-  undefined onPacket(unsigned long level, mozPacketDumpType type, boolean sending,
-                ArrayBuffer packet);
-
-  /* Transceiver sync */
-  undefined syncTransceivers();
-};
diff --git a/crates/web-sys/webidls/enabled/RTCPeerConnectionStatic.webidl b/crates/web-sys/webidls/enabled/RTCPeerConnectionStatic.webidl
deleted file mode 100644
index 85db3f5a..00000000
--- a/crates/web-sys/webidls/enabled/RTCPeerConnectionStatic.webidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-/*
-  Right now, it is not possible to add static functions to a JS implemented
-  interface (see bug 863952), so we need to create a simple interface with a
-  trivial constructor and no data to hold these functions that really ought to
-  be static in RTCPeerConnection.
-  TODO(bcampen@mozilla.com) Merge this code into RTCPeerConnection once this
-  limitation is gone. (Bug 1017082)
-*/
-
-enum RTCLifecycleEvent {
-    "initialized",
-    "icegatheringstatechange",
-    "iceconnectionstatechange"
-};
-
-callback PeerConnectionLifecycleCallback = undefined (RTCPeerConnection pc,
-                                                 unsigned long long windowId,
-                                                 RTCLifecycleEvent eventType);
-
-[ChromeOnly,
- Pref="media.peerconnection.enabled",
- JSImplementation="@mozilla.org/dom/peerconnectionstatic;1",
- Constructor()]
-interface RTCPeerConnectionStatic {
-
-  /* One slot per window (the window in which the register call is made),
-     automatically unregistered when window goes away.
-     Fires when a PC is created, and whenever the ICE connection state or
-     gathering state changes. */
-  undefined registerPeerConnectionLifecycleCallback(
-    PeerConnectionLifecycleCallback cb);
-};
-
diff --git a/crates/web-sys/webidls/enabled/TransceiverImpl.webidl b/crates/web-sys/webidls/enabled/TransceiverImpl.webidl
deleted file mode 100644
index 395c1bbd..00000000
--- a/crates/web-sys/webidls/enabled/TransceiverImpl.webidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * PeerConnection.js' interface to the C++ TransceiverImpl.
- *
- * Do not confuse with RTCRtpTransceiver. This interface is purely for
- * communication between the PeerConnection JS DOM binding and the C++
- * implementation.
- *
- * See media/webrtc/signaling/src/peerconnection/TransceiverImpl.h
- *
- */
-
-// Constructed by PeerConnectionImpl::CreateTransceiverImpl.
-[ChromeOnly]
-interface TransceiverImpl {
-  MediaStreamTrack getReceiveTrack();
-  [Throws]
-  undefined syncWithJS(RTCRtpTransceiver transceiver);
-};
-
diff --git a/crates/web-sys/webidls/enabled/UserActivation.webidl b/crates/web-sys/webidls/enabled/UserActivation.webidl
new file mode 100644
index 00000000..302f9d73
--- /dev/null
+++ b/crates/web-sys/webidls/enabled/UserActivation.webidl
@@ -0,0 +1,9 @@
+[Exposed=Window]
+interface UserActivation {
+  readonly attribute boolean hasBeenActive;
+  readonly attribute boolean isActive;
+};
+
+partial interface Navigator {
+  [SameObject] readonly attribute UserActivation userActivation;
+};
diff --git a/crates/web-sys/webidls/enabled/WebrtcGlobalInformation.webidl b/crates/web-sys/webidls/enabled/WebrtcGlobalInformation.webidl
deleted file mode 100644
index 6c77c09f..00000000
--- a/crates/web-sys/webidls/enabled/WebrtcGlobalInformation.webidl
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-dictionary WebrtcGlobalStatisticsReport {
-  sequence<RTCStatsReportInternal> reports;
-};
-
-callback WebrtcGlobalStatisticsCallback = undefined (WebrtcGlobalStatisticsReport reports);
-callback WebrtcGlobalLoggingCallback = undefined (sequence<DOMString> logMessages);
-
-[ChromeOnly]
-interface WebrtcGlobalInformation {
-
-  [Throws]
-  static undefined getAllStats(WebrtcGlobalStatisticsCallback callback,
-                          optional DOMString pcIdFilter);
-
-  static undefined clearAllStats();
-
-  [Throws]
-  static undefined getLogging(DOMString pattern,
-                         WebrtcGlobalLoggingCallback callback);
-
-  static undefined clearLogging();
-
-  // NSPR WebRTC Trace debug level (0 - 65535)
-  //
-  // Notes:
-  // - Setting a non-zero debug level turns on gathering of log for file output.
-  // - Subsequently setting a zero debug level writes that log to disk.
-
-  static attribute long debugLevel;
-
-  // WebRTC AEC debugging enable
-  static attribute boolean aecDebug;
-
-  static readonly attribute DOMString aecDebugLogDir;
-};
diff --git a/crates/web-sys/webidls/enabled/WindowRoot.webidl b/crates/web-sys/webidls/enabled/WindowRoot.webidl
deleted file mode 100644
index 0ddb1a9f..00000000
--- a/crates/web-sys/webidls/enabled/WindowRoot.webidl
+++ /dev/null
@@ -1,9 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-[ChromeOnly]
-interface WindowRoot : EventTarget {
-};
diff --git a/crates/webidl/Cargo.toml b/crates/webidl/Cargo.toml
index 95dd3527..b4cfae77 100644
--- a/crates/webidl/Cargo.toml
+++ b/crates/webidl/Cargo.toml
@@ -21,7 +21,7 @@ log = "0.4.1"
 proc-macro2 = "1.0"
 quote = '1.0'
 syn = { version = '2.0', features = ['full'] }
-wasm-bindgen-backend = { version = "=0.2.88", path = "../backend" }
+wasm-bindgen-backend = { version = "=0.2.89", path = "../backend" }
 weedle = { git = "https://github.com/rustwasm/weedle.git" }
 once_cell = "1.12"
 sourcefile = "0.1"
diff --git a/examples/add/Cargo.toml b/examples/add/Cargo.toml
index 5d5c11c4..8b27a3db 100644
--- a/examples/add/Cargo.toml
+++ b/examples/add/Cargo.toml
@@ -9,4 +9,4 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/canvas/Cargo.toml b/examples/canvas/Cargo.toml
index cdfa0721..e8e0a307 100644
--- a/examples/canvas/Cargo.toml
+++ b/examples/canvas/Cargo.toml
@@ -9,8 +9,8 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-js-sys = "0.3.65"
-wasm-bindgen = "0.2.88"
+js-sys = "0.3.66"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/char/Cargo.toml b/examples/char/Cargo.toml
index 982e2da8..74221088 100644
--- a/examples/char/Cargo.toml
+++ b/examples/char/Cargo.toml
@@ -9,4 +9,4 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/closures/Cargo.toml b/examples/closures/Cargo.toml
index ff0436f5..7b418767 100644
--- a/examples/closures/Cargo.toml
+++ b/examples/closures/Cargo.toml
@@ -9,8 +9,8 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
-js-sys = "0.3.65"
+wasm-bindgen = "0.2.89"
+js-sys = "0.3.66"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/console_log/Cargo.toml b/examples/console_log/Cargo.toml
index 8c6c21a8..ceafbfda 100644
--- a/examples/console_log/Cargo.toml
+++ b/examples/console_log/Cargo.toml
@@ -9,5 +9,5 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
-web-sys = { version = "0.3.65", features = ['console'] }
+wasm-bindgen = "0.2.89"
+web-sys = { version = "0.3.66", features = ['console'] }
diff --git a/examples/deno/Cargo.toml b/examples/deno/Cargo.toml
index e2eb56a8..840129b0 100644
--- a/examples/deno/Cargo.toml
+++ b/examples/deno/Cargo.toml
@@ -9,4 +9,4 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/dom/Cargo.toml b/examples/dom/Cargo.toml
index f55fc74d..79390099 100644
--- a/examples/dom/Cargo.toml
+++ b/examples/dom/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/duck-typed-interfaces/Cargo.toml b/examples/duck-typed-interfaces/Cargo.toml
index 6507b2c7..aa5433d9 100644
--- a/examples/duck-typed-interfaces/Cargo.toml
+++ b/examples/duck-typed-interfaces/Cargo.toml
@@ -9,4 +9,4 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/fetch/Cargo.toml b/examples/fetch/Cargo.toml
index eb6e9535..628945d9 100644
--- a/examples/fetch/Cargo.toml
+++ b/examples/fetch/Cargo.toml
@@ -9,9 +9,9 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
-js-sys = "0.3.65"
-wasm-bindgen-futures = "0.4.38"
+wasm-bindgen = "0.2.89"
+js-sys = "0.3.66"
+wasm-bindgen-futures = "0.4.39"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/guide-supported-types-examples/Cargo.toml b/examples/guide-supported-types-examples/Cargo.toml
index facaef2f..7ff7b14d 100644
--- a/examples/guide-supported-types-examples/Cargo.toml
+++ b/examples/guide-supported-types-examples/Cargo.toml
@@ -9,5 +9,5 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
-js-sys = "0.3.65"
+wasm-bindgen = "0.2.89"
+js-sys = "0.3.66"
diff --git a/examples/hello_world/Cargo.toml b/examples/hello_world/Cargo.toml
index ba8c73f1..cfdf4ffc 100644
--- a/examples/hello_world/Cargo.toml
+++ b/examples/hello_world/Cargo.toml
@@ -9,4 +9,4 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/import_js/crate/Cargo.toml b/examples/import_js/crate/Cargo.toml
index 3687dd87..a89b24fe 100644
--- a/examples/import_js/crate/Cargo.toml
+++ b/examples/import_js/crate/Cargo.toml
@@ -8,4 +8,4 @@ edition = "2018"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/julia_set/Cargo.toml b/examples/julia_set/Cargo.toml
index d6181acd..e178bec8 100644
--- a/examples/julia_set/Cargo.toml
+++ b/examples/julia_set/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/paint/Cargo.toml b/examples/paint/Cargo.toml
index 595bb6cc..5ad08214 100644
--- a/examples/paint/Cargo.toml
+++ b/examples/paint/Cargo.toml
@@ -9,8 +9,8 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-js-sys = "0.3.65"
-wasm-bindgen = "0.2.88"
+js-sys = "0.3.66"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/performance/Cargo.toml b/examples/performance/Cargo.toml
index f2a7d8a8..d12f83e8 100644
--- a/examples/performance/Cargo.toml
+++ b/examples/performance/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 humantime = "2"
 
 [dependencies.web-sys]
diff --git a/examples/raytrace-parallel/Cargo.toml b/examples/raytrace-parallel/Cargo.toml
index 7443517c..916b96d1 100644
--- a/examples/raytrace-parallel/Cargo.toml
+++ b/examples/raytrace-parallel/Cargo.toml
@@ -10,14 +10,14 @@ crate-type = ["cdylib"]
 
 [dependencies]
 console_error_panic_hook = "0.1"
-js-sys = "0.3.65"
+js-sys = "0.3.66"
 rayon = "1.1.0"
 rayon-core = "1.5.0"
 raytracer = { git = 'https://github.com/alexcrichton/raytracer', branch = 'update-deps' }
 serde-wasm-bindgen = "0.4.3"
 futures-channel-preview = "0.3.0-alpha.18"
-wasm-bindgen = "0.2.88"
-wasm-bindgen-futures = "0.4.38"
+wasm-bindgen = "0.2.89"
+wasm-bindgen-futures = "0.4.39"
 
 [dependencies.web-sys]
 version = "0.3.23"
diff --git a/examples/request-animation-frame/Cargo.toml b/examples/request-animation-frame/Cargo.toml
index 3f2c7960..909c7b5c 100644
--- a/examples/request-animation-frame/Cargo.toml
+++ b/examples/request-animation-frame/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/synchronous-instantiation/Cargo.toml b/examples/synchronous-instantiation/Cargo.toml
index b5a76aa0..9997b91e 100644
--- a/examples/synchronous-instantiation/Cargo.toml
+++ b/examples/synchronous-instantiation/Cargo.toml
@@ -9,4 +9,4 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/todomvc/Cargo.toml b/examples/todomvc/Cargo.toml
index f1502545..1d2bca91 100644
--- a/examples/todomvc/Cargo.toml
+++ b/examples/todomvc/Cargo.toml
@@ -12,8 +12,8 @@ crate-type = ["cdylib"]
 askama = "0.10.0"
 
 [dependencies]
-js-sys = "0.3.65"
-wasm-bindgen = "0.2.88"
+js-sys = "0.3.66"
+wasm-bindgen = "0.2.89"
 askama = "0.10.0"
 console_error_panic_hook = "0.1.5"
 
diff --git a/examples/wasm-audio-worklet/Cargo.toml b/examples/wasm-audio-worklet/Cargo.toml
index 5fe0c3c0..fcfc5823 100644
--- a/examples/wasm-audio-worklet/Cargo.toml
+++ b/examples/wasm-audio-worklet/Cargo.toml
@@ -9,9 +9,9 @@ crate-type = ["cdylib"]
 
 [dependencies]
 console_log = "0.2.0"
-js-sys = "0.3.65"
-wasm-bindgen = "0.2.88"
-wasm-bindgen-futures = "0.4.38"
+js-sys = "0.3.66"
+wasm-bindgen = "0.2.89"
+wasm-bindgen-futures = "0.4.39"
 
 [dependencies.web-sys]
 version = "0.3.59"
diff --git a/examples/wasm-in-wasm-imports/Cargo.toml b/examples/wasm-in-wasm-imports/Cargo.toml
index f0323c81..e7910e09 100644
--- a/examples/wasm-in-wasm-imports/Cargo.toml
+++ b/examples/wasm-in-wasm-imports/Cargo.toml
@@ -9,6 +9,6 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
-js-sys = "0.3.65"
-wasm-bindgen-futures = "0.4.38"
+wasm-bindgen = "0.2.89"
+js-sys = "0.3.66"
+wasm-bindgen-futures = "0.4.39"
diff --git a/examples/wasm-in-wasm/Cargo.toml b/examples/wasm-in-wasm/Cargo.toml
index f63904cd..19e5c83b 100644
--- a/examples/wasm-in-wasm/Cargo.toml
+++ b/examples/wasm-in-wasm/Cargo.toml
@@ -9,6 +9,6 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
-js-sys = "0.3.65"
-wasm-bindgen-futures = "0.4.38"
+wasm-bindgen = "0.2.89"
+js-sys = "0.3.66"
+wasm-bindgen-futures = "0.4.39"
diff --git a/examples/wasm-in-web-worker/Cargo.toml b/examples/wasm-in-web-worker/Cargo.toml
index bd0d720d..367ce450 100644
--- a/examples/wasm-in-web-worker/Cargo.toml
+++ b/examples/wasm-in-web-worker/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 console_error_panic_hook = { version = "0.1.6", optional = true }
 
 [dependencies.web-sys]
diff --git a/examples/wasm2js/Cargo.toml b/examples/wasm2js/Cargo.toml
index 7da276e5..26681f6f 100644
--- a/examples/wasm2js/Cargo.toml
+++ b/examples/wasm2js/Cargo.toml
@@ -9,4 +9,4 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
diff --git a/examples/weather_report/Cargo.toml b/examples/weather_report/Cargo.toml
index 7b0e51fd..866ba166 100644
--- a/examples/weather_report/Cargo.toml
+++ b/examples/weather_report/Cargo.toml
@@ -16,7 +16,7 @@ chrono = "0.4.11"
 reqwest = "0.10.6"
 wasm-bindgen-futures = "0.4.1"
 json= "*"
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 gloo = "0.2.1"
 
 [dependencies.web-sys]
diff --git a/examples/webaudio/Cargo.toml b/examples/webaudio/Cargo.toml
index bdf13c47..22ca56c6 100644
--- a/examples/webaudio/Cargo.toml
+++ b/examples/webaudio/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/webgl/Cargo.toml b/examples/webgl/Cargo.toml
index 88b8e034..0309676a 100644
--- a/examples/webgl/Cargo.toml
+++ b/examples/webgl/Cargo.toml
@@ -9,8 +9,8 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-js-sys = "0.3.65"
-wasm-bindgen = "0.2.88"
+js-sys = "0.3.66"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/webrtc_datachannel/Cargo.toml b/examples/webrtc_datachannel/Cargo.toml
index c93c04ab..3f691bcc 100644
--- a/examples/webrtc_datachannel/Cargo.toml
+++ b/examples/webrtc_datachannel/Cargo.toml
@@ -9,9 +9,9 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 js-sys = "0.3"
-wasm-bindgen-futures = "0.4.38"
+wasm-bindgen-futures = "0.4.39"
 
 [dependencies.web-sys]
 version = "0.3.22"
diff --git a/examples/websockets/Cargo.toml b/examples/websockets/Cargo.toml
index 79e9d59c..ba7b1469 100644
--- a/examples/websockets/Cargo.toml
+++ b/examples/websockets/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 js-sys = "0.3"
 
 [dependencies.web-sys]
diff --git a/examples/webxr/Cargo.toml b/examples/webxr/Cargo.toml
index fe427999..37e89f39 100644
--- a/examples/webxr/Cargo.toml
+++ b/examples/webxr/Cargo.toml
@@ -10,9 +10,9 @@ crate-type = ["cdylib"]
 
 [dependencies]
 futures = "0.3.4"
-js-sys = "0.3.65"
-wasm-bindgen = "0.2.88"
-wasm-bindgen-futures = "0.4.38"
+js-sys = "0.3.66"
+wasm-bindgen = "0.2.89"
+wasm-bindgen-futures = "0.4.39"
 
 [dependencies.web-sys]
 version = "0.3.37"
diff --git a/examples/without-a-bundler/Cargo.toml b/examples/without-a-bundler/Cargo.toml
index dd7bb9ac..389d9467 100644
--- a/examples/without-a-bundler/Cargo.toml
+++ b/examples/without-a-bundler/Cargo.toml
@@ -9,7 +9,7 @@ rust-version = "1.57"
 crate-type = ["cdylib"]
 
 [dependencies]
-wasm-bindgen = "0.2.88"
+wasm-bindgen = "0.2.89"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/guide/src/contributing/index.md b/guide/src/contributing/index.md
index 00a195ac..34b5214e 100644
--- a/guide/src/contributing/index.md
+++ b/guide/src/contributing/index.md
@@ -23,4 +23,4 @@ development. You may want to browse the [unpublished guide documentation] for
 
 ## Code Formatting
 
-Although formatting rules are not mandatory, it is encouraged to run `cargo run` (`rustfmt`) with its default rules within a PR to maintain a more organized code base. If necessary, a PR with a single commit that formats the entire project is also welcome.
\ No newline at end of file
+Although formatting rules are not mandatory, it is encouraged to run `cargo fmt` (`rustfmt`) with its default rules within a PR to maintain a more organized code base. If necessary, a PR with a single commit that formats the entire project is also welcome.
diff --git a/src/convert/impls.rs b/src/convert/impls.rs
index 8c0c3c01..8f1e3798 100644
--- a/src/convert/impls.rs
+++ b/src/convert/impls.rs
@@ -2,13 +2,13 @@ use core::char;
 use core::mem::{self, ManuallyDrop};
 
 use crate::convert::traits::{WasmAbi, WasmPrimitive};
+use crate::convert::TryFromJsValue;
 use crate::convert::{FromWasmAbi, IntoWasmAbi, LongRefFromWasmAbi, RefFromWasmAbi};
 use crate::convert::{OptionFromWasmAbi, OptionIntoWasmAbi, ReturnWasmAbi};
 use crate::{Clamped, JsError, JsValue, UnwrapThrowExt};
 
 if_std! {
     use std::boxed::Box;
-    use std::convert::{TryFrom, TryInto};
     use std::fmt::Debug;
     use std::vec::Vec;
 }
@@ -415,7 +415,7 @@ if_std! {
         js_vals.into_abi()
     }
 
-    pub unsafe fn js_value_vector_from_abi<T: TryFrom<JsValue>>(js: <Box<[JsValue]> as FromWasmAbi>::Abi) -> Box<[T]> where T::Error: Debug {
+    pub unsafe fn js_value_vector_from_abi<T: TryFromJsValue>(js: <Box<[JsValue]> as FromWasmAbi>::Abi) -> Box<[T]> where T::Error: Debug {
         let js_vals = <Vec<JsValue> as FromWasmAbi>::from_abi(js);
 
         let mut result = Vec::with_capacity(js_vals.len());
@@ -430,7 +430,7 @@ if_std! {
             // we're talking about, it can only see functions that actually make it to the
             // final wasm binary (i.e., not inlined functions). All of those internal
             // iterator functions get inlined in release mode, and so they don't show up.
-            result.push(value.try_into().expect_throw("array contains a value of the wrong type"));
+            result.push(T::try_from_js_value(value).expect_throw("array contains a value of the wrong type"));
         }
         result.into_boxed_slice()
     }
diff --git a/src/convert/traits.rs b/src/convert/traits.rs
index fd06c3ad..a32598ab 100644
--- a/src/convert/traits.rs
+++ b/src/convert/traits.rs
@@ -2,6 +2,7 @@ use core::borrow::Borrow;
 use core::ops::{Deref, DerefMut};
 
 use crate::describe::*;
+use crate::JsValue;
 
 /// A trait for anything that can be converted into a type that can cross the
 /// wasm ABI directly, eg `u32` or `f64`.
@@ -249,3 +250,18 @@ impl<T: WasmAbi> WasmRet<T> {
         T::join(self.prim1, self.prim2, self.prim3, self.prim4)
     }
 }
+
+/// [`TryFromJsValue`] is a trait for converting a JavaScript value ([`JsValue`])
+/// into a Rust type. It is used by the [`wasm_bindgen`](wasm_bindgen_macro::wasm_bindgen)
+/// proc-macro to allow conversion to user types.
+///
+/// Types implementing this trait must specify their conversion logic from
+/// [`JsValue`] to the Rust type, handling any potential errors that may occur
+/// during the conversion process.
+pub trait TryFromJsValue: Sized {
+    /// The type returned in the event of a conversion error.
+    type Error;
+
+    /// Performs the conversion.
+    fn try_from_js_value(value: JsValue) -> Result<Self, Self::Error>;
+}
diff --git a/src/lib.rs b/src/lib.rs
index 059e68e3..f38d6a3e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -18,7 +18,7 @@ use core::ops::{
 };
 use core::u32;
 
-use crate::convert::{FromWasmAbi, WasmRet, WasmSlice};
+use crate::convert::{FromWasmAbi, TryFromJsValue, WasmRet, WasmSlice};
 
 macro_rules! if_std {
     ($($i:item)*) => ($(
@@ -815,6 +815,17 @@ if_std! {
             }
         }
     }
+
+    impl TryFromJsValue for String {
+        type Error = JsValue;
+
+        fn try_from_js_value(value: JsValue) -> Result<Self, Self::Error> {
+            match value.as_string() {
+                Some(s) => Ok(s),
+                None => Err(value),
+            }
+        }
+    }
 }
 
 impl From<bool> for JsValue {


Test patch:
diff --git a/crates/cli/src/bin/wasm-bindgen-test-runner/server.rs b/crates/cli/src/bin/wasm-bindgen-test-runner/server.rs
index 289a2225..6cb0210c 100644
--- a/crates/cli/src/bin/wasm-bindgen-test-runner/server.rs
+++ b/crates/cli/src/bin/wasm-bindgen-test-runner/server.rs
@@ -106,7 +106,7 @@ pub fn spawn(
         ));
 
         let worker_js_path = tmpdir.join("worker.js");
-        fs::write(&worker_js_path, worker_script).context("failed to write JS file")?;
+        fs::write(worker_js_path, worker_script).context("failed to write JS file")?;
 
         js_to_execute.push_str(&format!(
             r#"
diff --git a/crates/test-macro/Cargo.toml b/crates/test-macro/Cargo.toml
index c417774e..325e0a20 100644
--- a/crates/test-macro/Cargo.toml
+++ b/crates/test-macro/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-test-macro"
-version = "0.3.38"
+version = "0.3.39"
 authors = ["The wasm-bindgen Developers"]
 description = "Internal testing macro for wasm-bindgen"
 license = "MIT OR Apache-2.0"
diff --git a/crates/test/Cargo.toml b/crates/test/Cargo.toml
index 82cd237c..2c10cc87 100644
--- a/crates/test/Cargo.toml
+++ b/crates/test/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-test"
-version = "0.3.38"
+version = "0.3.39"
 authors = ["The wasm-bindgen Developers"]
 description = "Internal testing crate for wasm-bindgen"
 license = "MIT OR Apache-2.0"
@@ -10,11 +10,11 @@ rust-version = "1.57"
 
 [dependencies]
 console_error_panic_hook = '0.1'
-js-sys = { path = '../js-sys', version = '0.3.65' }
+js-sys = { path = '../js-sys', version = '0.3.66' }
 scoped-tls = "1.0"
-wasm-bindgen = { path = '../..', version = '0.2.88' }
-wasm-bindgen-futures = { path = '../futures', version = '0.4.38' }
-wasm-bindgen-test-macro = { path = '../test-macro', version = '=0.3.38' }
+wasm-bindgen = { path = '../..', version = '0.2.89' }
+wasm-bindgen-futures = { path = '../futures', version = '0.4.39' }
+wasm-bindgen-test-macro = { path = '../test-macro', version = '=0.3.39' }
 gg-alloc = { version = "1.0", optional = true }
 
 [lib]
diff --git a/crates/typescript-tests/Cargo.toml b/crates/typescript-tests/Cargo.toml
index 96030d8e..92465c4b 100644
--- a/crates/typescript-tests/Cargo.toml
+++ b/crates/typescript-tests/Cargo.toml
@@ -10,6 +10,8 @@ wasm-bindgen = { path = '../..' }
 wasm-bindgen-futures = { path = '../futures' }
 web-sys = { path = '../web-sys', features = [ 'HtmlElement', 'Node', 'Document' ] }
 js-sys = { path = '../js-sys' }
+serde = { version = "1.0", features = ["derive"] }
+serde-wasm-bindgen = "0.6"
 
 [lib]
 crate-type = ['cdylib']
diff --git a/crates/typescript-tests/jest.config.cjs b/crates/typescript-tests/jest.config.cjs
new file mode 100644
index 00000000..c63e1456
--- /dev/null
+++ b/crates/typescript-tests/jest.config.cjs
@@ -0,0 +1,17 @@
+/** @type {import('ts-jest').JestConfigWithTsJest} */
+module.exports = {
+  preset: "ts-jest/presets/default-esm",
+  testEnvironment: 'node',
+  extensionsToTreatAsEsm: [".ts"],
+  verbose: true,
+  // TODO: match all test files
+  testMatch: ['**/src/simple_struct.ts', '**/src/typescript_type.ts'],
+  injectGlobals: false,
+  globals: {
+    'ts-jest':
+    {
+      useESM: true,
+      isolatedModules: true
+    }
+  }
+};
diff --git a/crates/typescript-tests/no_modules.tsconfig.json b/crates/typescript-tests/no_modules.tsconfig.json
index e3688b7d..9e2cc53e 100644
--- a/crates/typescript-tests/no_modules.tsconfig.json
+++ b/crates/typescript-tests/no_modules.tsconfig.json
@@ -4,6 +4,7 @@
         "noImplicitAny": true,
         "sourceMap": true,
         "outDir": "dist_no_modules",
+        "moduleResolution":"node"
     },
     "include": [
         "pkg/no_modules/*.d.ts",
diff --git a/crates/typescript-tests/package.json b/crates/typescript-tests/package.json
index a1fb1297..017eca09 100644
--- a/crates/typescript-tests/package.json
+++ b/crates/typescript-tests/package.json
@@ -1,8 +1,12 @@
 {
   "scripts": {
-    "tsc": "tsc"
+    "tsc": "tsc",
+    "test": "NODE_OPTIONS=--experimental-vm-modules jest --config ./jest.config.cjs"
   },
   "devDependencies": {
-    "typescript": "^3.3.3333"
-  }
+    "@types/jest": "^29.5.8",
+    "ts-jest": "^29.1.1",
+    "typescript": "^5.2.2"
+  },
+  "type": "module"
 }
diff --git a/crates/typescript-tests/run.sh b/crates/typescript-tests/run.sh
index f971f251..5a3605e8 100755
--- a/crates/typescript-tests/run.sh
+++ b/crates/typescript-tests/run.sh
@@ -57,3 +57,5 @@ cd ..
 
 # Then try to build the typescript in the src_no_modules folder against the pkg/no_modules build.
 npm run tsc -- -p no_modules.tsconfig.json
+
+npm test
diff --git a/crates/typescript-tests/src/simple_struct.ts b/crates/typescript-tests/src/simple_struct.ts
index 4927cd1a..d7a4c9de 100644
--- a/crates/typescript-tests/src/simple_struct.ts
+++ b/crates/typescript-tests/src/simple_struct.ts
@@ -1,9 +1,20 @@
-import * as wbg from '../pkg/typescript_tests';
+import * as wbg from "../pkg/typescript_tests";
+import { expect, jest, test } from "@jest/globals";
 
-const a = new wbg.A();
-wbg.A.other();
-a.foo();
-a.free();
-const b: boolean = a.ret_bool()
-a.take_bool(b);
-a.take_many(b, 1, 2);
+test("member function (void) -> void", () => {
+  const a = new wbg.A();
+  wbg.A.other();
+  a.foo();
+  a.free();
+  expect(() => {
+    a.ret_bool();
+  }).toThrow(/null pointer passed to rust/);
+});
+
+test("function with parameters", () => {
+  const a = new wbg.A();
+  const b: boolean = a.ret_bool();
+  expect(b).toStrictEqual(true);
+  a.take_bool(b);
+  a.take_many(b, 1, 2);
+});
diff --git a/crates/typescript-tests/src/typescript_type.rs b/crates/typescript-tests/src/typescript_type.rs
index 5bd7dc54..9ddc9d86 100644
--- a/crates/typescript-tests/src/typescript_type.rs
+++ b/crates/typescript-tests/src/typescript_type.rs
@@ -1,3 +1,4 @@
+use serde::{Deserialize, Serialize};
 use wasm_bindgen::prelude::*;
 
 #[wasm_bindgen(typescript_custom_section)]
@@ -16,7 +17,7 @@ extern "C" {
 }
 
 #[wasm_bindgen]
-#[derive(Default)]
+#[derive(Default, Serialize, Deserialize)]
 pub struct TextStyle {
     pub bold: bool,
     pub italic: bool,
@@ -26,13 +27,12 @@ pub struct TextStyle {
 #[wasm_bindgen]
 impl TextStyle {
     #[wasm_bindgen(constructor)]
-    pub fn new(_i: ITextStyle) -> TextStyle {
-        // parse JsValue
-        TextStyle::default()
+    pub fn new(i: ITextStyle) -> TextStyle {
+        let js_value: JsValue = i.into();
+        serde_wasm_bindgen::from_value(js_value).unwrap()
     }
 
-    pub fn optional_new(_i: Option<ITextStyle>) -> TextStyle {
-        // parse JsValue
-        TextStyle::default()
+    pub fn optional_new(i: Option<ITextStyle>) -> TextStyle {
+        i.map(Self::new).unwrap_or_default()
     }
 }
diff --git a/crates/typescript-tests/src/typescript_type.ts b/crates/typescript-tests/src/typescript_type.ts
index a05ada63..9d9bb033 100644
--- a/crates/typescript-tests/src/typescript_type.ts
+++ b/crates/typescript-tests/src/typescript_type.ts
@@ -1,9 +1,30 @@
-import * as wbg from '../pkg/typescript_tests';
+import * as wbg from "../pkg/typescript_tests";
+import { expect, jest, test } from "@jest/globals";
 
-const style: wbg.TextStyle = new wbg.TextStyle({
-  bold: true,
-  italic: true,
-  size: 42,
+test("constructor", () => {
+  const style: wbg.TextStyle = new wbg.TextStyle({
+    bold: true,
+    italic: false,
+    size: 42,
+  });
+
+  expect(style.bold).toStrictEqual(true);
+  expect(style.italic).toStrictEqual(false);
+  expect(style.size).toStrictEqual(42);
 });
 
-const optional_style: wbg.TextStyle = wbg.TextStyle.optional_new();
+test("optional parameter constructor", () => {
+  const default_constructed: wbg.TextStyle = wbg.TextStyle.optional_new();
+  expect(default_constructed.bold).toStrictEqual(false);
+  expect(default_constructed.italic).toStrictEqual(false);
+  expect(default_constructed.size).toStrictEqual(0);
+
+  const optional_style: wbg.TextStyle = wbg.TextStyle.optional_new({
+    italic: true,
+    bold: false,
+    size: 0,
+  });
+  expect(optional_style.bold).toStrictEqual(false);
+  expect(optional_style.italic).toStrictEqual(true);
+  expect(optional_style.size).toStrictEqual(0);
+});
diff --git a/tests/wasm/classes.js b/tests/wasm/classes.js
index 8e503c65..49bd4472 100644
--- a/tests/wasm/classes.js
+++ b/tests/wasm/classes.js
@@ -241,3 +241,10 @@ exports.js_test_inspectable_classes_can_override_generated_methods = () => {
     assert.strictEqual(overridden_inspectable.toString(), 'string was overwritten');
     overridden_inspectable.free();
 };
+
+exports.js_test_class_defined_in_macro = () => {
+    const macroClass = new wasm.InsideMacro();
+    assert.strictEqual(macroClass.a, 3);
+    macroClass.a = 5;
+    assert.strictEqual(macroClass.a, 5);
+};
diff --git a/tests/wasm/classes.rs b/tests/wasm/classes.rs
index 9321ff92..6058c0a5 100644
--- a/tests/wasm/classes.rs
+++ b/tests/wasm/classes.rs
@@ -34,6 +34,7 @@ extern "C" {
     fn js_test_option_classes();
     fn js_test_inspectable_classes();
     fn js_test_inspectable_classes_can_override_generated_methods();
+    fn js_test_class_defined_in_macro();
 }
 
 #[wasm_bindgen_test]
@@ -608,3 +609,27 @@ impl OverriddenInspectable {
         String::from("string was overwritten")
     }
 }
+
+macro_rules! make_struct {
+    ($field:ident) => {
+        #[wasm_bindgen]
+        pub struct InsideMacro {
+            pub $field: u32,
+        }
+    };
+}
+
+make_struct!(a);
+
+#[wasm_bindgen]
+impl InsideMacro {
+    #[wasm_bindgen(constructor)]
+    pub fn new() -> Self {
+        Self { a: 3 }
+    }
+}
+
+#[wasm_bindgen_test]
+fn class_defined_in_macro() {
+    js_test_class_defined_in_macro();
+}