Repository: rustwasm/wasm-bindgen
Pull request #3765 (2024-01-06 10:10:31)

Add step to update CHANGELOG in publishing.md


Patch:
diff --git a/.gitignore b/.gitignore
index 749720c7..8cdf73b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ yarn.lock
 /publish
 /publish.exe
 .vscode
+webdriver.json
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3501362f..73ba0b93 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,36 @@
 # `wasm-bindgen` Change Log
 --------------------------------------------------------------------------------
 
-## [Unreleased](https://github.com/rustwasm/wasm-bindgen/compare/0.2.89...main)
+## Unreleased
+
+### Added
+
+* Add unstable bindings for the FileSystemAccess API
+  [#3810](https://github.com/rustwasm/wasm-bindgen/pull/3810)
+
+* Added support for running tests in shared and service workers with ``wasm_bindgen_test_configure!` `run_in_shared_worker` and `run_in_service_worker`.
+  [#3804](https://github.com/rustwasm/wasm-bindgen/pull/3804)
+
+* Accept the `--skip` flag with `wasm-bindgen-test-runner`.
+  [#3803](https://github.com/rustwasm/wasm-bindgen/pull/3803)
+
+* Introduce environment variable `WASM_BINDGEN_TEST_NO_ORIGIN_ISOLATION` to disable origin isolation for `wasm-bindgen-test-runner`.
+  [#3807](https://github.com/rustwasm/wasm-bindgen/pull/3807)
+
+### Changed
+
+* Stabilize `ClipboardEvent`.
+  [#3791](https://github.com/rustwasm/wasm-bindgen/pull/3791)
+
+* Use immutable buffers in `SubtleCrypto` methods.
+  [#3797](https://github.com/rustwasm/wasm-bindgen/pull/3797)
+
+* Deprecate `wasm_bindgen_test_configure!`s `run_in_worker` in favor of `run_in_dedicated_worker`.
+  [#3804](https://github.com/rustwasm/wasm-bindgen/pull/3804)
+
+## [0.2.90](https://github.com/rustwasm/wasm-bindgen/compare/0.2.89...0.2.90)
+
+Released 2024-01-06
 
 ### Fixed
 
diff --git a/Cargo.toml b/Cargo.toml
index ac65e7d8..b1faa4e8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen"
-version = "0.2.89"
+version = "0.2.90"
 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.89" }
+wasm-bindgen-macro = { path = "crates/macro", version = "=0.2.90" }
 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.66' }
-wasm-bindgen-test = { path = 'crates/test', version = '=0.3.39' }
-wasm-bindgen-futures = { path = 'crates/futures', version = '=0.4.39' }
+js-sys = { path = 'crates/js-sys', version = '0.3.67' }
+wasm-bindgen-test = { path = 'crates/test', version = '=0.3.40' }
+wasm-bindgen-futures = { path = 'crates/futures', version = '=0.4.40' }
 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 70aeffae..8be4e953 100644
--- a/crates/backend/Cargo.toml
+++ b/crates/backend/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-backend"
-version = "0.2.89"
+version = "0.2.90"
 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.89" }
+wasm-bindgen-shared = { path = "../shared", version = "=0.2.90" }
diff --git a/crates/cli-support/Cargo.toml b/crates/cli-support/Cargo.toml
index 641a8a0e..0dae8e03 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.89"
+version = "0.2.90"
 authors = ["The wasm-bindgen Developers"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/cli-support"
@@ -14,16 +14,16 @@ rust-version = "1.57"
 
 [dependencies]
 anyhow = "1.0"
-base64 = "0.9"
+base64 = "0.21"
 log = "0.4"
 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.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' }
+wasm-bindgen-externref-xform = { path = '../externref-xform', version = '=0.2.90' }
+wasm-bindgen-multi-value-xform = { path = '../multi-value-xform', version = '=0.2.90' }
+wasm-bindgen-shared = { path = "../shared", version = '=0.2.90' }
+wasm-bindgen-threads-xform = { path = '../threads-xform', version = '=0.2.90' }
+wasm-bindgen-wasm-conventions = { path = '../wasm-conventions', version = '=0.2.90' }
+wasm-bindgen-wasm-interpreter = { path = "../wasm-interpreter", version = '=0.2.90' }
 unicode-ident = "1.0.5"
diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs
index 7a4ffbfd..ee1c4790 100644
--- a/crates/cli-support/src/js/mod.rs
+++ b/crates/cli-support/src/js/mod.rs
@@ -1147,7 +1147,7 @@ impl<'a> Context<'a> {
         self.global(
             "
             function _assertNum(n) {
-                if (typeof(n) !== 'number') throw new Error('expected a number argument');
+                if (typeof(n) !== 'number') throw new Error(`expected a number argument, found ${typeof(n)}`);
             }
             ",
         );
@@ -1160,7 +1160,7 @@ impl<'a> Context<'a> {
         self.global(
             "
             function _assertBigInt(n) {
-                if (typeof(n) !== 'bigint') throw new Error('expected a bigint argument');
+                if (typeof(n) !== 'bigint') throw new Error(`expected a bigint argument, found ${typeof(n)}`);
             }
             ",
         );
@@ -1174,7 +1174,7 @@ impl<'a> Context<'a> {
             "
             function _assertBoolean(n) {
                 if (typeof(n) !== 'boolean') {
-                    throw new Error('expected a boolean argument');
+                    throw new Error(`expected a boolean argument, found ${typeof(n)}`);
                 }
             }
             ",
@@ -1193,7 +1193,7 @@ impl<'a> Context<'a> {
 
         let debug = if self.config.debug {
             "
-                if (typeof(arg) !== 'string') throw new Error('expected a string argument');
+                if (typeof(arg) !== 'string') throw new Error(`expected a string argument, found ${typeof(arg)}`);
             "
         } else {
             ""
diff --git a/crates/cli-support/src/wasm2es6js.rs b/crates/cli-support/src/wasm2es6js.rs
index 981dce62..77a51d8b 100644
--- a/crates/cli-support/src/wasm2es6js.rs
+++ b/crates/cli-support/src/wasm2es6js.rs
@@ -1,4 +1,5 @@
 use anyhow::{bail, Error};
+use base64::{prelude::BASE64_STANDARD, Engine as _};
 use std::collections::HashSet;
 use std::fmt::Write;
 use walrus::Module;
@@ -241,7 +242,7 @@ impl Output {
                         bytes = Buffer.from(base64, 'base64');
                     }}
                     ",
-                    base64 = base64::encode(&wasm)
+                    base64 = BASE64_STANDARD.encode(&wasm)
                 ),
                 inst,
             )
diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml
index b0ab4f99..e7d09100 100644
--- a/crates/cli/Cargo.toml
+++ b/crates/cli/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-cli"
-version = "0.2.89"
+version = "0.2.90"
 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.89" }
-wasm-bindgen-shared = { path = "../shared", version = "=0.2.89" }
+wasm-bindgen-cli-support = { path = "../cli-support", version = "=0.2.90" }
+wasm-bindgen-shared = { path = "../shared", version = "=0.2.90" }
 
 [dev-dependencies]
 assert_cmd = "1.0"
diff --git a/crates/externref-xform/Cargo.toml b/crates/externref-xform/Cargo.toml
index 8618390b..d1082290 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.89"
+version = "0.2.90"
 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 96a05031..f5462b2a 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.39"
+version = "0.4.40"
 edition = "2018"
 rust-version = "1.57"
 
 [dependencies]
 cfg-if = "1.0.0"
-js-sys = { path = "../js-sys", version = '0.3.66' }
-wasm-bindgen = { path = "../..", version = '0.2.89' }
+js-sys = { path = "../js-sys", version = '0.3.67' }
+wasm-bindgen = { path = "../..", version = '0.2.90' }
 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.39' }
+wasm-bindgen-test = { path = '../test', version = '0.3.40' }
 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 a08acf0d..80a940af 100644
--- a/crates/js-sys/Cargo.toml
+++ b/crates/js-sys/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "js-sys"
-version = "0.3.66"
+version = "0.3.67"
 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.89" }
+wasm-bindgen = { path = "../..", version = "0.2.90" }
 
 [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
-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"] }
+wasm-bindgen-test = { path = '../test', version = '=0.3.40' }
+wasm-bindgen-futures = { path = '../futures', version = '0.4.40' }
+web-sys = { path = "../web-sys", version = "0.3.67", features = ["Headers", "Response", "ResponseInit"] }
diff --git a/crates/macro-support/Cargo.toml b/crates/macro-support/Cargo.toml
index 5cfbab72..1ba1c871 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.89"
+version = "0.2.90"
 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.89" }
-wasm-bindgen-shared = { path = "../shared", version = "=0.2.89" }
+wasm-bindgen-backend = { path = "../backend", version = "=0.2.90" }
+wasm-bindgen-shared = { path = "../shared", version = "=0.2.90" }
diff --git a/crates/macro/Cargo.toml b/crates/macro/Cargo.toml
index 563c8774..ae7a3044 100644
--- a/crates/macro/Cargo.toml
+++ b/crates/macro/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-macro"
-version = "0.2.89"
+version = "0.2.90"
 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.89" }
+wasm-bindgen-macro-support = { path = "../macro-support", version = "=0.2.90" }
 quote = "1.0"
 
 [dev-dependencies]
 trybuild = "1.0"
-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"] }
+wasm-bindgen = { path = "../..", version = "0.2.90" }
+wasm-bindgen-futures = { path = "../futures", version = "0.4.40" }
+web-sys = { path = "../web-sys", version = "0.3.67", features = ["Worker"] }
diff --git a/crates/multi-value-xform/Cargo.toml b/crates/multi-value-xform/Cargo.toml
index f185a54b..a03bf6f5 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.89"
+version = "0.2.90"
 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 bae3d5ca..eb2ab22c 100644
--- a/crates/shared/Cargo.toml
+++ b/crates/shared/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-shared"
-version = "0.2.89"
+version = "0.2.90"
 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 d26205e9..220e8022 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.89"
+version = "0.2.90"
 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.89" }
+wasm-bindgen-wasm-conventions = { path = "../wasm-conventions", version = "=0.2.90" }
 
 [dev-dependencies]
 rayon = "1.0"
diff --git a/crates/wasm-conventions/Cargo.toml b/crates/wasm-conventions/Cargo.toml
index 634b5285..234d499f 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.89"
+version = "0.2.90"
 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 324b7c2b..94d33d3b 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.89"
+version = "0.2.90"
 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.89" }
+wasm-bindgen-wasm-conventions = { path = "../wasm-conventions", version = "0.2.90" }
 
 [dev-dependencies]
 tempfile = "3"
diff --git a/crates/web-sys/Cargo.toml b/crates/web-sys/Cargo.toml
index 919ea47c..55dfc9fc 100644
--- a/crates/web-sys/Cargo.toml
+++ b/crates/web-sys/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "web-sys"
-version = "0.3.66"
+version = "0.3.67"
 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.89" }
-js-sys = { path = '../js-sys', version = '0.3.66' }
+wasm-bindgen = { path = "../..", version = "0.2.90" }
+js-sys = { path = '../js-sys', version = '0.3.67' }
 
 [target.'cfg(target_arch = "wasm32")'.dev-dependencies]
-wasm-bindgen-test = { path = '../test', version = '0.3.39' }
-wasm-bindgen-futures = { path = '../futures', version = '0.4.39' }
+wasm-bindgen-test = { path = '../test', version = '0.3.40' }
+wasm-bindgen-futures = { path = '../futures', version = '0.4.40' }
 
 # This list is auto-generated by the wasm-bindgen-webidl program
 [features]
@@ -289,6 +289,7 @@ DeviceRotationRateInit = []
 DhKeyDeriveParams = []
 DirectionSetting = []
 Directory = []
+DirectoryPickerOptions = []
 DisplayMediaStreamConstraints = []
 DisplayNameOptions = []
 DisplayNameResult = []
@@ -384,6 +385,8 @@ FetchState = []
 File = ["Blob"]
 FileCallback = []
 FileList = []
+FilePickerAcceptType = []
+FilePickerOptions = []
 FilePropertyBag = []
 FileReader = ["EventTarget"]
 FileReaderSync = []
@@ -402,6 +405,9 @@ FileSystemGetDirectoryOptions = []
 FileSystemGetFileOptions = []
 FileSystemHandle = []
 FileSystemHandleKind = []
+FileSystemHandlePermissionDescriptor = []
+FileSystemPermissionDescriptor = []
+FileSystemPermissionMode = []
 FileSystemReadWriteOptions = []
 FileSystemRemoveOptions = []
 FileSystemSyncAccessHandle = []
@@ -895,6 +901,7 @@ OfflineAudioContextOptions = []
 OfflineResourceList = ["EventTarget"]
 OffscreenCanvas = ["EventTarget"]
 OffscreenCanvasRenderingContext2d = []
+OpenFilePickerOptions = []
 OpenWindowEventDetail = []
 OptionalEffectTiming = []
 OrientationLockType = []
@@ -1135,6 +1142,7 @@ RtcdtmfToneChangeEvent = ["Event"]
 RtcdtmfToneChangeEventInit = []
 RtcrtpContributingSourceStats = []
 RtcrtpStreamStats = []
+SaveFilePickerOptions = []
 Scheduler = []
 SchedulerPostTaskOptions = []
 Scheduling = []
@@ -1541,6 +1549,7 @@ WebglDepthTexture = []
 WebglDrawBuffers = []
 WebglLoseContext = []
 WebglMultiDraw = []
+WellKnownDirectory = []
 WgslLanguageFeatures = []
 WheelEvent = ["Event", "MouseEvent", "UiEvent"]
 WheelEventInit = []
diff --git a/crates/web-sys/src/features/gen_ClipboardEvent.rs b/crates/web-sys/src/features/gen_ClipboardEvent.rs
index 18b46f63..f779c28e 100644
--- a/crates/web-sys/src/features/gen_ClipboardEvent.rs
+++ b/crates/web-sys/src/features/gen_ClipboardEvent.rs
@@ -2,7 +2,6 @@
 #![allow(clippy::all)]
 use super::*;
 use wasm_bindgen::prelude::*;
-#[cfg(web_sys_unstable_apis)]
 #[wasm_bindgen]
 extern "C" {
     # [wasm_bindgen (extends = Event , extends = :: js_sys :: Object , js_name = ClipboardEvent , typescript_type = "ClipboardEvent")]
@@ -12,11 +11,7 @@ extern "C" {
     #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent)"]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEvent`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub type ClipboardEvent;
-    #[cfg(web_sys_unstable_apis)]
     #[cfg(feature = "DataTransfer")]
     # [wasm_bindgen (structural , method , getter , js_class = "ClipboardEvent" , js_name = clipboardData)]
     #[doc = "Getter for the `clipboardData` field of this object."]
@@ -24,22 +19,14 @@ extern "C" {
     #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/clipboardData)"]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEvent`, `DataTransfer`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn clipboard_data(this: &ClipboardEvent) -> Option<DataTransfer>;
-    #[cfg(web_sys_unstable_apis)]
     #[wasm_bindgen(catch, constructor, js_class = "ClipboardEvent")]
     #[doc = "The `new ClipboardEvent(..)` constructor, creating a new instance of `ClipboardEvent`."]
     #[doc = ""]
     #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/ClipboardEvent)"]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEvent`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn new(type_: &str) -> Result<ClipboardEvent, JsValue>;
-    #[cfg(web_sys_unstable_apis)]
     #[cfg(feature = "ClipboardEventInit")]
     #[wasm_bindgen(catch, constructor, js_class = "ClipboardEvent")]
     #[doc = "The `new ClipboardEvent(..)` constructor, creating a new instance of `ClipboardEvent`."]
@@ -47,9 +34,6 @@ extern "C" {
     #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/ClipboardEvent)"]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEvent`, `ClipboardEventInit`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn new_with_event_init_dict(
         type_: &str,
         event_init_dict: &ClipboardEventInit,
diff --git a/crates/web-sys/src/features/gen_ClipboardEventInit.rs b/crates/web-sys/src/features/gen_ClipboardEventInit.rs
index 6bb0d8ab..6f0cb3ac 100644
--- a/crates/web-sys/src/features/gen_ClipboardEventInit.rs
+++ b/crates/web-sys/src/features/gen_ClipboardEventInit.rs
@@ -2,7 +2,6 @@
 #![allow(clippy::all)]
 use super::*;
 use wasm_bindgen::prelude::*;
-#[cfg(web_sys_unstable_apis)]
 #[wasm_bindgen]
 extern "C" {
     # [wasm_bindgen (extends = :: js_sys :: Object , js_name = ClipboardEventInit)]
@@ -10,31 +9,20 @@ extern "C" {
     #[doc = "The `ClipboardEventInit` dictionary."]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEventInit`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub type ClipboardEventInit;
 }
-#[cfg(web_sys_unstable_apis)]
 impl ClipboardEventInit {
     #[doc = "Construct a new `ClipboardEventInit`."]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEventInit`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn new() -> Self {
         #[allow(unused_mut)]
         let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
         ret
     }
-    #[cfg(web_sys_unstable_apis)]
     #[doc = "Change the `bubbles` field of this object."]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEventInit`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn bubbles(&mut self, val: bool) -> &mut Self {
         use wasm_bindgen::JsValue;
         let r = ::js_sys::Reflect::set(
@@ -49,13 +37,9 @@ impl ClipboardEventInit {
         let _ = r;
         self
     }
-    #[cfg(web_sys_unstable_apis)]
     #[doc = "Change the `cancelable` field of this object."]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEventInit`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn cancelable(&mut self, val: bool) -> &mut Self {
         use wasm_bindgen::JsValue;
         let r = ::js_sys::Reflect::set(
@@ -70,13 +54,9 @@ impl ClipboardEventInit {
         let _ = r;
         self
     }
-    #[cfg(web_sys_unstable_apis)]
     #[doc = "Change the `composed` field of this object."]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEventInit`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn composed(&mut self, val: bool) -> &mut Self {
         use wasm_bindgen::JsValue;
         let r = ::js_sys::Reflect::set(
@@ -91,14 +71,10 @@ impl ClipboardEventInit {
         let _ = r;
         self
     }
-    #[cfg(web_sys_unstable_apis)]
     #[cfg(feature = "DataTransfer")]
     #[doc = "Change the `clipboardData` field of this object."]
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ClipboardEventInit`, `DataTransfer`*"]
-    #[doc = ""]
-    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
-    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
     pub fn clipboard_data(&mut self, val: Option<&DataTransfer>) -> &mut Self {
         use wasm_bindgen::JsValue;
         let r = ::js_sys::Reflect::set(
@@ -114,7 +90,6 @@ impl ClipboardEventInit {
         self
     }
 }
-#[cfg(web_sys_unstable_apis)]
 impl Default for ClipboardEventInit {
     fn default() -> Self {
         Self::new()
diff --git a/crates/web-sys/src/features/gen_DataTransferItem.rs b/crates/web-sys/src/features/gen_DataTransferItem.rs
index 4dec7731..98f4e8db 100644
--- a/crates/web-sys/src/features/gen_DataTransferItem.rs
+++ b/crates/web-sys/src/features/gen_DataTransferItem.rs
@@ -34,6 +34,17 @@ extern "C" {
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `DataTransferItem`, `File`*"]
     pub fn get_as_file(this: &DataTransferItem) -> Result<Option<File>, JsValue>;
+    #[cfg(web_sys_unstable_apis)]
+    # [wasm_bindgen (method , structural , js_class = "DataTransferItem" , js_name = getAsFileSystemHandle)]
+    #[doc = "The `getAsFileSystemHandle()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/getAsFileSystemHandle)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `DataTransferItem`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn get_as_file_system_handle(this: &DataTransferItem) -> ::js_sys::Promise;
     # [wasm_bindgen (catch , method , structural , js_class = "DataTransferItem" , js_name = getAsString)]
     #[doc = "The `getAsString()` method."]
     #[doc = ""]
diff --git a/crates/web-sys/src/features/gen_DirectoryPickerOptions.rs b/crates/web-sys/src/features/gen_DirectoryPickerOptions.rs
new file mode 100644
index 00000000..a7886ebc
--- /dev/null
+++ b/crates/web-sys/src/features/gen_DirectoryPickerOptions.rs
@@ -0,0 +1,93 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = DirectoryPickerOptions)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `DirectoryPickerOptions` dictionary."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `DirectoryPickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub type DirectoryPickerOptions;
+}
+#[cfg(web_sys_unstable_apis)]
+impl DirectoryPickerOptions {
+    #[doc = "Construct a new `DirectoryPickerOptions`."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `DirectoryPickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn new() -> Self {
+        #[allow(unused_mut)]
+        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
+        ret
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `id` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `DirectoryPickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn id(&mut self, val: &str) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("id"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "FileSystemPermissionMode")]
+    #[doc = "Change the `mode` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `DirectoryPickerOptions`, `FileSystemPermissionMode`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn mode(&mut self, val: FileSystemPermissionMode) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("mode"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `startIn` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `DirectoryPickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn start_in(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("startIn"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+}
+#[cfg(web_sys_unstable_apis)]
+impl Default for DirectoryPickerOptions {
+    fn default() -> Self {
+        Self::new()
+    }
+}
diff --git a/crates/web-sys/src/features/gen_FilePickerAcceptType.rs b/crates/web-sys/src/features/gen_FilePickerAcceptType.rs
new file mode 100644
index 00000000..cd2e41ab
--- /dev/null
+++ b/crates/web-sys/src/features/gen_FilePickerAcceptType.rs
@@ -0,0 +1,58 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = FilePickerAcceptType)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `FilePickerAcceptType` dictionary."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerAcceptType`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub type FilePickerAcceptType;
+}
+#[cfg(web_sys_unstable_apis)]
+impl FilePickerAcceptType {
+    #[doc = "Construct a new `FilePickerAcceptType`."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerAcceptType`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn new() -> Self {
+        #[allow(unused_mut)]
+        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
+        ret
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `description` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerAcceptType`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn description(&mut self, val: &str) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("description"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+}
+#[cfg(web_sys_unstable_apis)]
+impl Default for FilePickerAcceptType {
+    fn default() -> Self {
+        Self::new()
+    }
+}
diff --git a/crates/web-sys/src/features/gen_FilePickerOptions.rs b/crates/web-sys/src/features/gen_FilePickerOptions.rs
new file mode 100644
index 00000000..1548a514
--- /dev/null
+++ b/crates/web-sys/src/features/gen_FilePickerOptions.rs
@@ -0,0 +1,113 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = FilePickerOptions)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `FilePickerOptions` dictionary."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub type FilePickerOptions;
+}
+#[cfg(web_sys_unstable_apis)]
+impl FilePickerOptions {
+    #[doc = "Construct a new `FilePickerOptions`."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn new() -> Self {
+        #[allow(unused_mut)]
+        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
+        ret
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `excludeAcceptAllOption` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn exclude_accept_all_option(&mut self, val: bool) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("excludeAcceptAllOption"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `id` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn id(&mut self, val: &str) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("id"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `startIn` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn start_in(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("startIn"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `types` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn types(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("types"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+}
+#[cfg(web_sys_unstable_apis)]
+impl Default for FilePickerOptions {
+    fn default() -> Self {
+        Self::new()
+    }
+}
diff --git a/crates/web-sys/src/features/gen_FileSystemHandle.rs b/crates/web-sys/src/features/gen_FileSystemHandle.rs
index 6a019fe6..b29a9d2e 100644
--- a/crates/web-sys/src/features/gen_FileSystemHandle.rs
+++ b/crates/web-sys/src/features/gen_FileSystemHandle.rs
@@ -34,4 +34,56 @@ extern "C" {
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `FileSystemHandle`*"]
     pub fn is_same_entry(this: &FileSystemHandle, other: &FileSystemHandle) -> ::js_sys::Promise;
+    #[cfg(web_sys_unstable_apis)]
+    # [wasm_bindgen (method , structural , js_class = "FileSystemHandle" , js_name = queryPermission)]
+    #[doc = "The `queryPermission()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle/queryPermission)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandle`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn query_permission(this: &FileSystemHandle) -> ::js_sys::Promise;
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "FileSystemHandlePermissionDescriptor")]
+    # [wasm_bindgen (method , structural , js_class = "FileSystemHandle" , js_name = queryPermission)]
+    #[doc = "The `queryPermission()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle/queryPermission)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandle`, `FileSystemHandlePermissionDescriptor`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn query_permission_with_descriptor(
+        this: &FileSystemHandle,
+        descriptor: &FileSystemHandlePermissionDescriptor,
+    ) -> ::js_sys::Promise;
+    #[cfg(web_sys_unstable_apis)]
+    # [wasm_bindgen (method , structural , js_class = "FileSystemHandle" , js_name = requestPermission)]
+    #[doc = "The `requestPermission()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle/requestPermission)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandle`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn request_permission(this: &FileSystemHandle) -> ::js_sys::Promise;
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "FileSystemHandlePermissionDescriptor")]
+    # [wasm_bindgen (method , structural , js_class = "FileSystemHandle" , js_name = requestPermission)]
+    #[doc = "The `requestPermission()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle/requestPermission)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandle`, `FileSystemHandlePermissionDescriptor`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn request_permission_with_descriptor(
+        this: &FileSystemHandle,
+        descriptor: &FileSystemHandlePermissionDescriptor,
+    ) -> ::js_sys::Promise;
 }
diff --git a/crates/web-sys/src/features/gen_FileSystemHandlePermissionDescriptor.rs b/crates/web-sys/src/features/gen_FileSystemHandlePermissionDescriptor.rs
new file mode 100644
index 00000000..00f6d96f
--- /dev/null
+++ b/crates/web-sys/src/features/gen_FileSystemHandlePermissionDescriptor.rs
@@ -0,0 +1,55 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = FileSystemHandlePermissionDescriptor)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `FileSystemHandlePermissionDescriptor` dictionary."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandlePermissionDescriptor`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub type FileSystemHandlePermissionDescriptor;
+}
+#[cfg(web_sys_unstable_apis)]
+impl FileSystemHandlePermissionDescriptor {
+    #[doc = "Construct a new `FileSystemHandlePermissionDescriptor`."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandlePermissionDescriptor`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn new() -> Self {
+        #[allow(unused_mut)]
+        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
+        ret
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "FileSystemPermissionMode")]
+    #[doc = "Change the `mode` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandlePermissionDescriptor`, `FileSystemPermissionMode`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn mode(&mut self, val: FileSystemPermissionMode) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("mode"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+}
+#[cfg(web_sys_unstable_apis)]
+impl Default for FileSystemHandlePermissionDescriptor {
+    fn default() -> Self {
+        Self::new()
+    }
+}
diff --git a/crates/web-sys/src/features/gen_FileSystemPermissionDescriptor.rs b/crates/web-sys/src/features/gen_FileSystemPermissionDescriptor.rs
new file mode 100644
index 00000000..b4a2a512
--- /dev/null
+++ b/crates/web-sys/src/features/gen_FileSystemPermissionDescriptor.rs
@@ -0,0 +1,89 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = FileSystemPermissionDescriptor)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `FileSystemPermissionDescriptor` dictionary."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemPermissionDescriptor`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub type FileSystemPermissionDescriptor;
+}
+#[cfg(web_sys_unstable_apis)]
+impl FileSystemPermissionDescriptor {
+    #[cfg(all(feature = "FileSystemHandle", feature = "PermissionName",))]
+    #[doc = "Construct a new `FileSystemPermissionDescriptor`."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandle`, `FileSystemPermissionDescriptor`, `PermissionName`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn new(name: PermissionName, handle: &FileSystemHandle) -> Self {
+        #[allow(unused_mut)]
+        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
+        ret.name(name);
+        ret.handle(handle);
+        ret
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "PermissionName")]
+    #[doc = "Change the `name` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemPermissionDescriptor`, `PermissionName`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn name(&mut self, val: PermissionName) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("name"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "FileSystemHandle")]
+    #[doc = "Change the `handle` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemHandle`, `FileSystemPermissionDescriptor`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn handle(&mut self, val: &FileSystemHandle) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r =
+            ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("handle"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "FileSystemPermissionMode")]
+    #[doc = "Change the `mode` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `FileSystemPermissionDescriptor`, `FileSystemPermissionMode`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn mode(&mut self, val: FileSystemPermissionMode) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("mode"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+}
diff --git a/crates/web-sys/src/features/gen_FileSystemPermissionMode.rs b/crates/web-sys/src/features/gen_FileSystemPermissionMode.rs
new file mode 100644
index 00000000..11636456
--- /dev/null
+++ b/crates/web-sys/src/features/gen_FileSystemPermissionMode.rs
@@ -0,0 +1,16 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+#[doc = "The `FileSystemPermissionMode` enum."]
+#[doc = ""]
+#[doc = "*This API requires the following crate features to be activated: `FileSystemPermissionMode`*"]
+#[doc = ""]
+#[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+#[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum FileSystemPermissionMode {
+    Read = "read",
+    Readwrite = "readwrite",
+}
diff --git a/crates/web-sys/src/features/gen_OpenFilePickerOptions.rs b/crates/web-sys/src/features/gen_OpenFilePickerOptions.rs
new file mode 100644
index 00000000..7662f05b
--- /dev/null
+++ b/crates/web-sys/src/features/gen_OpenFilePickerOptions.rs
@@ -0,0 +1,134 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = OpenFilePickerOptions)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `OpenFilePickerOptions` dictionary."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub type OpenFilePickerOptions;
+}
+#[cfg(web_sys_unstable_apis)]
+impl OpenFilePickerOptions {
+    #[doc = "Construct a new `OpenFilePickerOptions`."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn new() -> Self {
+        #[allow(unused_mut)]
+        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
+        ret
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `excludeAcceptAllOption` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn exclude_accept_all_option(&mut self, val: bool) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("excludeAcceptAllOption"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `id` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn id(&mut self, val: &str) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("id"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `startIn` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn start_in(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("startIn"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `types` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn types(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("types"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `multiple` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn multiple(&mut self, val: bool) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("multiple"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+}
+#[cfg(web_sys_unstable_apis)]
+impl Default for OpenFilePickerOptions {
+    fn default() -> Self {
+        Self::new()
+    }
+}
diff --git a/crates/web-sys/src/features/gen_SaveFilePickerOptions.rs b/crates/web-sys/src/features/gen_SaveFilePickerOptions.rs
new file mode 100644
index 00000000..46530763
--- /dev/null
+++ b/crates/web-sys/src/features/gen_SaveFilePickerOptions.rs
@@ -0,0 +1,134 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use super::*;
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+extern "C" {
+    # [wasm_bindgen (extends = :: js_sys :: Object , js_name = SaveFilePickerOptions)]
+    #[derive(Debug, Clone, PartialEq, Eq)]
+    #[doc = "The `SaveFilePickerOptions` dictionary."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub type SaveFilePickerOptions;
+}
+#[cfg(web_sys_unstable_apis)]
+impl SaveFilePickerOptions {
+    #[doc = "Construct a new `SaveFilePickerOptions`."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn new() -> Self {
+        #[allow(unused_mut)]
+        let mut ret: Self = ::wasm_bindgen::JsCast::unchecked_into(::js_sys::Object::new());
+        ret
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `excludeAcceptAllOption` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn exclude_accept_all_option(&mut self, val: bool) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("excludeAcceptAllOption"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `id` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn id(&mut self, val: &str) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("id"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `startIn` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn start_in(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("startIn"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `types` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn types(&mut self, val: &::wasm_bindgen::JsValue) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(self.as_ref(), &JsValue::from("types"), &JsValue::from(val));
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+    #[cfg(web_sys_unstable_apis)]
+    #[doc = "Change the `suggestedName` field of this object."]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn suggested_name(&mut self, val: Option<&str>) -> &mut Self {
+        use wasm_bindgen::JsValue;
+        let r = ::js_sys::Reflect::set(
+            self.as_ref(),
+            &JsValue::from("suggestedName"),
+            &JsValue::from(val),
+        );
+        debug_assert!(
+            r.is_ok(),
+            "setting properties should never fail on our dictionary objects"
+        );
+        let _ = r;
+        self
+    }
+}
+#[cfg(web_sys_unstable_apis)]
+impl Default for SaveFilePickerOptions {
+    fn default() -> Self {
+        Self::new()
+    }
+}
diff --git a/crates/web-sys/src/features/gen_SubtleCrypto.rs b/crates/web-sys/src/features/gen_SubtleCrypto.rs
index d4fcdebc..b32159f5 100644
--- a/crates/web-sys/src/features/gen_SubtleCrypto.rs
+++ b/crates/web-sys/src/features/gen_SubtleCrypto.rs
@@ -49,7 +49,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &::js_sys::Object,
         key: &CryptoKey,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = decrypt)]
@@ -62,7 +62,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &str,
         key: &CryptoKey,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = deriveBits)]
@@ -181,7 +181,7 @@ extern "C" {
     pub fn digest_with_object_and_u8_array(
         this: &SubtleCrypto,
         algorithm: &::js_sys::Object,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = digest)]
     #[doc = "The `digest()` method."]
@@ -192,7 +192,7 @@ extern "C" {
     pub fn digest_with_str_and_u8_array(
         this: &SubtleCrypto,
         algorithm: &str,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = encrypt)]
@@ -231,7 +231,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &::js_sys::Object,
         key: &CryptoKey,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = encrypt)]
@@ -244,7 +244,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &str,
         key: &CryptoKey,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = exportKey)]
@@ -347,7 +347,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &::js_sys::Object,
         key: &CryptoKey,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = sign)]
@@ -360,7 +360,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &str,
         key: &CryptoKey,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = unwrapKey)]
@@ -389,7 +389,7 @@ extern "C" {
     pub fn unwrap_key_with_u8_array_and_object_and_object(
         this: &SubtleCrypto,
         format: &str,
-        wrapped_key: &mut [u8],
+        wrapped_key: &[u8],
         unwrapping_key: &CryptoKey,
         unwrap_algorithm: &::js_sys::Object,
         unwrapped_key_algorithm: &::js_sys::Object,
@@ -423,7 +423,7 @@ extern "C" {
     pub fn unwrap_key_with_u8_array_and_str_and_object(
         this: &SubtleCrypto,
         format: &str,
-        wrapped_key: &mut [u8],
+        wrapped_key: &[u8],
         unwrapping_key: &CryptoKey,
         unwrap_algorithm: &str,
         unwrapped_key_algorithm: &::js_sys::Object,
@@ -457,7 +457,7 @@ extern "C" {
     pub fn unwrap_key_with_u8_array_and_object_and_str(
         this: &SubtleCrypto,
         format: &str,
-        wrapped_key: &mut [u8],
+        wrapped_key: &[u8],
         unwrapping_key: &CryptoKey,
         unwrap_algorithm: &::js_sys::Object,
         unwrapped_key_algorithm: &str,
@@ -491,7 +491,7 @@ extern "C" {
     pub fn unwrap_key_with_u8_array_and_str_and_str(
         this: &SubtleCrypto,
         format: &str,
-        wrapped_key: &mut [u8],
+        wrapped_key: &[u8],
         unwrapping_key: &CryptoKey,
         unwrap_algorithm: &str,
         unwrapped_key_algorithm: &str,
@@ -537,7 +537,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &::js_sys::Object,
         key: &CryptoKey,
-        signature: &mut [u8],
+        signature: &[u8],
         data: &::js_sys::Object,
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
@@ -551,7 +551,7 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &str,
         key: &CryptoKey,
-        signature: &mut [u8],
+        signature: &[u8],
         data: &::js_sys::Object,
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
@@ -566,7 +566,7 @@ extern "C" {
         algorithm: &::js_sys::Object,
         key: &CryptoKey,
         signature: &::js_sys::Object,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = verify)]
@@ -580,7 +580,7 @@ extern "C" {
         algorithm: &str,
         key: &CryptoKey,
         signature: &::js_sys::Object,
-        data: &mut [u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = verify)]
@@ -593,8 +593,8 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &::js_sys::Object,
         key: &CryptoKey,
-        signature: &mut [u8],
-        data: &mut [u8],
+        signature: &[u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = verify)]
@@ -607,8 +607,8 @@ extern "C" {
         this: &SubtleCrypto,
         algorithm: &str,
         key: &CryptoKey,
-        signature: &mut [u8],
-        data: &mut [u8],
+        signature: &[u8],
+        data: &[u8],
     ) -> Result<::js_sys::Promise, JsValue>;
     #[cfg(feature = "CryptoKey")]
     # [wasm_bindgen (catch , method , structural , js_class = "SubtleCrypto" , js_name = wrapKey)]
diff --git a/crates/web-sys/src/features/gen_WellKnownDirectory.rs b/crates/web-sys/src/features/gen_WellKnownDirectory.rs
new file mode 100644
index 00000000..a99a8059
--- /dev/null
+++ b/crates/web-sys/src/features/gen_WellKnownDirectory.rs
@@ -0,0 +1,20 @@
+#![allow(unused_imports)]
+#![allow(clippy::all)]
+use wasm_bindgen::prelude::*;
+#[cfg(web_sys_unstable_apis)]
+#[wasm_bindgen]
+#[doc = "The `WellKnownDirectory` enum."]
+#[doc = ""]
+#[doc = "*This API requires the following crate features to be activated: `WellKnownDirectory`*"]
+#[doc = ""]
+#[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+#[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum WellKnownDirectory {
+    Desktop = "desktop",
+    Documents = "documents",
+    Downloads = "downloads",
+    Music = "music",
+    Pictures = "pictures",
+    Videos = "videos",
+}
diff --git a/crates/web-sys/src/features/gen_Window.rs b/crates/web-sys/src/features/gen_Window.rs
index e7540b80..9d4d0835 100644
--- a/crates/web-sys/src/features/gen_Window.rs
+++ b/crates/web-sys/src/features/gen_Window.rs
@@ -2301,6 +2301,84 @@ extern "C" {
     #[doc = ""]
     #[doc = "*This API requires the following crate features to be activated: `ScrollToOptions`, `Window`*"]
     pub fn scroll_to_with_scroll_to_options(this: &Window, options: &ScrollToOptions);
+    #[cfg(web_sys_unstable_apis)]
+    # [wasm_bindgen (catch , method , structural , js_class = "Window" , js_name = showDirectoryPicker)]
+    #[doc = "The `showDirectoryPicker()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/showDirectoryPicker)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `Window`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn show_directory_picker(this: &Window) -> Result<::js_sys::Promise, JsValue>;
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "DirectoryPickerOptions")]
+    # [wasm_bindgen (catch , method , structural , js_class = "Window" , js_name = showDirectoryPicker)]
+    #[doc = "The `showDirectoryPicker()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/showDirectoryPicker)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `DirectoryPickerOptions`, `Window`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn show_directory_picker_with_options(
+        this: &Window,
+        options: &DirectoryPickerOptions,
+    ) -> Result<::js_sys::Promise, JsValue>;
+    #[cfg(web_sys_unstable_apis)]
+    # [wasm_bindgen (catch , method , structural , js_class = "Window" , js_name = showOpenFilePicker)]
+    #[doc = "The `showOpenFilePicker()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/showOpenFilePicker)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `Window`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn show_open_file_picker(this: &Window) -> Result<::js_sys::Promise, JsValue>;
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "OpenFilePickerOptions")]
+    # [wasm_bindgen (catch , method , structural , js_class = "Window" , js_name = showOpenFilePicker)]
+    #[doc = "The `showOpenFilePicker()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/showOpenFilePicker)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `OpenFilePickerOptions`, `Window`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn show_open_file_picker_with_options(
+        this: &Window,
+        options: &OpenFilePickerOptions,
+    ) -> Result<::js_sys::Promise, JsValue>;
+    #[cfg(web_sys_unstable_apis)]
+    # [wasm_bindgen (catch , method , structural , js_class = "Window" , js_name = showSaveFilePicker)]
+    #[doc = "The `showSaveFilePicker()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/showSaveFilePicker)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `Window`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn show_save_file_picker(this: &Window) -> Result<::js_sys::Promise, JsValue>;
+    #[cfg(web_sys_unstable_apis)]
+    #[cfg(feature = "SaveFilePickerOptions")]
+    # [wasm_bindgen (catch , method , structural , js_class = "Window" , js_name = showSaveFilePicker)]
+    #[doc = "The `showSaveFilePicker()` method."]
+    #[doc = ""]
+    #[doc = "[MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/showSaveFilePicker)"]
+    #[doc = ""]
+    #[doc = "*This API requires the following crate features to be activated: `SaveFilePickerOptions`, `Window`*"]
+    #[doc = ""]
+    #[doc = "*This API is unstable and requires `--cfg=web_sys_unstable_apis` to be activated, as"]
+    #[doc = "[described in the `wasm-bindgen` guide](https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html)*"]
+    pub fn show_save_file_picker_with_options(
+        this: &Window,
+        options: &SaveFilePickerOptions,
+    ) -> Result<::js_sys::Promise, JsValue>;
     # [wasm_bindgen (catch , method , structural , js_class = "Window" , js_name = stop)]
     #[doc = "The `stop()` method."]
     #[doc = ""]
diff --git a/crates/web-sys/src/features/mod.rs b/crates/web-sys/src/features/mod.rs
index cc817704..c3bb7d92 100644
--- a/crates/web-sys/src/features/mod.rs
+++ b/crates/web-sys/src/features/mod.rs
@@ -1804,6 +1804,13 @@ mod gen_Directory;
 #[allow(unused_imports)]
 pub use gen_Directory::*;
 
+#[cfg(feature = "DirectoryPickerOptions")]
+#[allow(non_snake_case)]
+mod gen_DirectoryPickerOptions;
+#[cfg(feature = "DirectoryPickerOptions")]
+#[allow(unused_imports)]
+pub use gen_DirectoryPickerOptions::*;
+
 #[cfg(feature = "DisplayMediaStreamConstraints")]
 #[allow(non_snake_case)]
 mod gen_DisplayMediaStreamConstraints;
@@ -2469,6 +2476,20 @@ mod gen_FileList;
 #[allow(unused_imports)]
 pub use gen_FileList::*;
 
+#[cfg(feature = "FilePickerAcceptType")]
+#[allow(non_snake_case)]
+mod gen_FilePickerAcceptType;
+#[cfg(feature = "FilePickerAcceptType")]
+#[allow(unused_imports)]
+pub use gen_FilePickerAcceptType::*;
+
+#[cfg(feature = "FilePickerOptions")]
+#[allow(non_snake_case)]
+mod gen_FilePickerOptions;
+#[cfg(feature = "FilePickerOptions")]
+#[allow(unused_imports)]
+pub use gen_FilePickerOptions::*;
+
 #[cfg(feature = "FilePropertyBag")]
 #[allow(non_snake_case)]
 mod gen_FilePropertyBag;
@@ -2595,6 +2616,27 @@ mod gen_FileSystemHandleKind;
 #[allow(unused_imports)]
 pub use gen_FileSystemHandleKind::*;
 
+#[cfg(feature = "FileSystemHandlePermissionDescriptor")]
+#[allow(non_snake_case)]
+mod gen_FileSystemHandlePermissionDescriptor;
+#[cfg(feature = "FileSystemHandlePermissionDescriptor")]
+#[allow(unused_imports)]
+pub use gen_FileSystemHandlePermissionDescriptor::*;
+
+#[cfg(feature = "FileSystemPermissionDescriptor")]
+#[allow(non_snake_case)]
+mod gen_FileSystemPermissionDescriptor;
+#[cfg(feature = "FileSystemPermissionDescriptor")]
+#[allow(unused_imports)]
+pub use gen_FileSystemPermissionDescriptor::*;
+
+#[cfg(feature = "FileSystemPermissionMode")]
+#[allow(non_snake_case)]
+mod gen_FileSystemPermissionMode;
+#[cfg(feature = "FileSystemPermissionMode")]
+#[allow(unused_imports)]
+pub use gen_FileSystemPermissionMode::*;
+
 #[cfg(feature = "FileSystemReadWriteOptions")]
 #[allow(non_snake_case)]
 mod gen_FileSystemReadWriteOptions;
@@ -6046,6 +6088,13 @@ mod gen_OffscreenCanvasRenderingContext2d;
 #[allow(unused_imports)]
 pub use gen_OffscreenCanvasRenderingContext2d::*;
 
+#[cfg(feature = "OpenFilePickerOptions")]
+#[allow(non_snake_case)]
+mod gen_OpenFilePickerOptions;
+#[cfg(feature = "OpenFilePickerOptions")]
+#[allow(unused_imports)]
+pub use gen_OpenFilePickerOptions::*;
+
 #[cfg(feature = "OpenWindowEventDetail")]
 #[allow(non_snake_case)]
 mod gen_OpenWindowEventDetail;
@@ -7726,6 +7775,13 @@ mod gen_RtcrtpStreamStats;
 #[allow(unused_imports)]
 pub use gen_RtcrtpStreamStats::*;
 
+#[cfg(feature = "SaveFilePickerOptions")]
+#[allow(non_snake_case)]
+mod gen_SaveFilePickerOptions;
+#[cfg(feature = "SaveFilePickerOptions")]
+#[allow(unused_imports)]
+pub use gen_SaveFilePickerOptions::*;
+
 #[cfg(feature = "Scheduler")]
 #[allow(non_snake_case)]
 mod gen_Scheduler;
@@ -10568,6 +10624,13 @@ mod gen_WebglMultiDraw;
 #[allow(unused_imports)]
 pub use gen_WebglMultiDraw::*;
 
+#[cfg(feature = "WellKnownDirectory")]
+#[allow(non_snake_case)]
+mod gen_WellKnownDirectory;
+#[cfg(feature = "WellKnownDirectory")]
+#[allow(unused_imports)]
+pub use gen_WellKnownDirectory::*;
+
 #[cfg(feature = "WgslLanguageFeatures")]
 #[allow(non_snake_case)]
 mod gen_WgslLanguageFeatures;
diff --git a/crates/web-sys/webidls/enabled/ClipboardEvent.webidl b/crates/web-sys/webidls/enabled/ClipboardEvent.webidl
new file mode 100644
index 00000000..51ceebfb
--- /dev/null
+++ b/crates/web-sys/webidls/enabled/ClipboardEvent.webidl
@@ -0,0 +1,18 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Clipboard API and events
+ * Editor’s Draft, 21 November 2023
+ *
+ * The origin of this IDL file is:
+ * https://w3c.github.io/clipboard-apis/#clipboard-event-interfaces
+ */
+
+dictionary ClipboardEventInit : EventInit {
+  DataTransfer? clipboardData = null;
+};
+
+[Exposed=Window]
+interface ClipboardEvent : Event {
+  constructor(DOMString type, optional ClipboardEventInit eventInitDict = {});
+  readonly attribute DataTransfer? clipboardData;
+};
diff --git a/crates/web-sys/webidls/enabled/FileSystemAccess.webidl b/crates/web-sys/webidls/enabled/FileSystemHandle.webidl
similarity index 100%
rename from crates/web-sys/webidls/enabled/FileSystemAccess.webidl
rename to crates/web-sys/webidls/enabled/FileSystemHandle.webidl
diff --git a/crates/web-sys/webidls/unstable/Clipboard.webidl b/crates/web-sys/webidls/unstable/Clipboard.webidl
index d1974f65..c32a6556 100644
--- a/crates/web-sys/webidls/unstable/Clipboard.webidl
+++ b/crates/web-sys/webidls/unstable/Clipboard.webidl
@@ -6,16 +6,6 @@
  * https://www.w3.org/TR/2021/WD-clipboard-apis-20210604/
  */
 
-dictionary ClipboardEventInit : EventInit {
-  DataTransfer? clipboardData = null;
-};
-
-[Exposed=Window]
-interface ClipboardEvent : Event {
-  constructor(DOMString type, optional ClipboardEventInit eventInitDict = {});
-  readonly attribute DataTransfer? clipboardData;
-};
-
 partial interface Navigator {
   [SecureContext, SameObject] readonly attribute Clipboard? clipboard;
 };
diff --git a/crates/web-sys/webidls/unstable/FileSystemAccess.webidl b/crates/web-sys/webidls/unstable/FileSystemAccess.webidl
new file mode 100644
index 00000000..066dc3cd
--- /dev/null
+++ b/crates/web-sys/webidls/unstable/FileSystemAccess.webidl
@@ -0,0 +1,70 @@
+enum FileSystemPermissionMode {
+  "read",
+  "readwrite"
+};
+
+dictionary FileSystemPermissionDescriptor : PermissionDescriptor {
+  required FileSystemHandle handle;
+  FileSystemPermissionMode mode = "read";
+};
+
+dictionary FileSystemHandlePermissionDescriptor {
+  FileSystemPermissionMode mode = "read";
+};
+
+[Exposed=(Window,Worker), SecureContext, Serializable]
+partial interface FileSystemHandle {
+  Promise<PermissionState> queryPermission(optional FileSystemHandlePermissionDescriptor descriptor = {});
+  Promise<PermissionState> requestPermission(optional FileSystemHandlePermissionDescriptor descriptor = {});
+};
+
+enum WellKnownDirectory {
+  "desktop",
+  "documents",
+  "downloads",
+  "music",
+  "pictures",
+  "videos",
+};
+
+typedef (WellKnownDirectory or FileSystemHandle) StartInDirectory;
+
+dictionary FilePickerAcceptType {
+    USVString description = "";
+    record<USVString, (USVString or sequence<USVString>)> accept;
+};
+
+dictionary FilePickerOptions {
+    sequence<FilePickerAcceptType> types;
+    boolean excludeAcceptAllOption = false;
+    DOMString id;
+    StartInDirectory startIn;
+};
+
+dictionary OpenFilePickerOptions : FilePickerOptions {
+    boolean multiple = false;
+};
+
+dictionary SaveFilePickerOptions : FilePickerOptions {
+    USVString? suggestedName;
+};
+
+dictionary DirectoryPickerOptions {
+    DOMString id;
+    StartInDirectory startIn;
+    FileSystemPermissionMode mode = "read";
+};
+
+[SecureContext]
+partial interface Window {
+    [Throws]
+    Promise<sequence<FileSystemFileHandle>> showOpenFilePicker(optional OpenFilePickerOptions options = {});
+    [Throws]
+    Promise<FileSystemFileHandle> showSaveFilePicker(optional SaveFilePickerOptions options = {});
+    [Throws]
+    Promise<FileSystemDirectoryHandle> showDirectoryPicker(optional DirectoryPickerOptions options = {});
+};
+
+partial interface DataTransferItem {
+    Promise<FileSystemHandle?> getAsFileSystemHandle();
+};
diff --git a/crates/webidl/Cargo.toml b/crates/webidl/Cargo.toml
index b4cfae77..b5183178 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.89", path = "../backend" }
+wasm-bindgen-backend = { version = "=0.2.90", path = "../backend" }
 weedle = { git = "https://github.com/rustwasm/weedle.git" }
 once_cell = "1.12"
 sourcefile = "0.1"
diff --git a/crates/webidl/src/constants.rs b/crates/webidl/src/constants.rs
index 0d68af02..56e13a8b 100644
--- a/crates/webidl/src/constants.rs
+++ b/crates/webidl/src/constants.rs
@@ -94,6 +94,13 @@ pub(crate) static IMMUTABLE_SLICE_WHITELIST: Lazy<BTreeSet<&'static str>> = Lazy
         "FontFace", // TODO: Add another type's functions here. Leave a comment header with the type name
         // FileSystemSyncAccessHandle and FileSystemWritableFileStream
         "write",
+        // SubtleCrypto
+        "encrypt",
+        "decrypt",
+        "digest",
+        "sign",
+        "unwrapKey",
+        "verify",
     ])
 });
 
diff --git a/examples/add/Cargo.toml b/examples/add/Cargo.toml
index 8b27a3db..41b63590 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/canvas/Cargo.toml b/examples/canvas/Cargo.toml
index e8e0a307..e1afecc8 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.66"
-wasm-bindgen = "0.2.89"
+js-sys = "0.3.67"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/char/Cargo.toml b/examples/char/Cargo.toml
index 74221088..6f61f63f 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/closures/Cargo.toml b/examples/closures/Cargo.toml
index 7b418767..6e37abd8 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.89"
-js-sys = "0.3.66"
+wasm-bindgen = "0.2.90"
+js-sys = "0.3.67"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/console_log/Cargo.toml b/examples/console_log/Cargo.toml
index ceafbfda..c1ee13c3 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.89"
-web-sys = { version = "0.3.66", features = ['console'] }
+wasm-bindgen = "0.2.90"
+web-sys = { version = "0.3.67", features = ['console'] }
diff --git a/examples/deno/Cargo.toml b/examples/deno/Cargo.toml
index 840129b0..37c91692 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/dom/Cargo.toml b/examples/dom/Cargo.toml
index 79390099..f559e374 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.89"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/duck-typed-interfaces/Cargo.toml b/examples/duck-typed-interfaces/Cargo.toml
index aa5433d9..9d58b57d 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/fetch/Cargo.toml b/examples/fetch/Cargo.toml
index 628945d9..f7ff31cf 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.89"
-js-sys = "0.3.66"
-wasm-bindgen-futures = "0.4.39"
+wasm-bindgen = "0.2.90"
+js-sys = "0.3.67"
+wasm-bindgen-futures = "0.4.40"
 
 [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 7ff7b14d..1a065849 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.89"
-js-sys = "0.3.66"
+wasm-bindgen = "0.2.90"
+js-sys = "0.3.67"
diff --git a/examples/hello_world/Cargo.toml b/examples/hello_world/Cargo.toml
index cfdf4ffc..64d83ba5 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/import_js/crate/Cargo.toml b/examples/import_js/crate/Cargo.toml
index a89b24fe..599ac181 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/julia_set/Cargo.toml b/examples/julia_set/Cargo.toml
index e178bec8..9a54e10e 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.89"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/paint/Cargo.toml b/examples/paint/Cargo.toml
index 5ad08214..1786bdaf 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.66"
-wasm-bindgen = "0.2.89"
+js-sys = "0.3.67"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/performance/Cargo.toml b/examples/performance/Cargo.toml
index d12f83e8..38c62cd0 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.89"
+wasm-bindgen = "0.2.90"
 humantime = "2"
 
 [dependencies.web-sys]
diff --git a/examples/raytrace-parallel/Cargo.toml b/examples/raytrace-parallel/Cargo.toml
index 916b96d1..2b8ff0b8 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.66"
+js-sys = "0.3.67"
 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.89"
-wasm-bindgen-futures = "0.4.39"
+wasm-bindgen = "0.2.90"
+wasm-bindgen-futures = "0.4.40"
 
 [dependencies.web-sys]
 version = "0.3.23"
diff --git a/examples/request-animation-frame/Cargo.toml b/examples/request-animation-frame/Cargo.toml
index 909c7b5c..f0455d24 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.89"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/synchronous-instantiation/Cargo.toml b/examples/synchronous-instantiation/Cargo.toml
index 9997b91e..db5a4a73 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/todomvc/Cargo.toml b/examples/todomvc/Cargo.toml
index 1d2bca91..ce7a6bd3 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.66"
-wasm-bindgen = "0.2.89"
+js-sys = "0.3.67"
+wasm-bindgen = "0.2.90"
 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 fcfc5823..d9575a9d 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.66"
-wasm-bindgen = "0.2.89"
-wasm-bindgen-futures = "0.4.39"
+js-sys = "0.3.67"
+wasm-bindgen = "0.2.90"
+wasm-bindgen-futures = "0.4.40"
 
 [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 e7910e09..efdab879 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.89"
-js-sys = "0.3.66"
-wasm-bindgen-futures = "0.4.39"
+wasm-bindgen = "0.2.90"
+js-sys = "0.3.67"
+wasm-bindgen-futures = "0.4.40"
diff --git a/examples/wasm-in-wasm/Cargo.toml b/examples/wasm-in-wasm/Cargo.toml
index 19e5c83b..13a307d5 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.89"
-js-sys = "0.3.66"
-wasm-bindgen-futures = "0.4.39"
+wasm-bindgen = "0.2.90"
+js-sys = "0.3.67"
+wasm-bindgen-futures = "0.4.40"
diff --git a/examples/wasm-in-web-worker/Cargo.toml b/examples/wasm-in-web-worker/Cargo.toml
index 367ce450..25769363 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.89"
+wasm-bindgen = "0.2.90"
 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 26681f6f..29e8eef3 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.89"
+wasm-bindgen = "0.2.90"
diff --git a/examples/weather_report/Cargo.toml b/examples/weather_report/Cargo.toml
index 866ba166..1e76e800 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.89"
+wasm-bindgen = "0.2.90"
 gloo = "0.2.1"
 
 [dependencies.web-sys]
diff --git a/examples/webaudio/Cargo.toml b/examples/webaudio/Cargo.toml
index 22ca56c6..03b440dc 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.89"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/webgl/Cargo.toml b/examples/webgl/Cargo.toml
index 0309676a..bab7b4cf 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.66"
-wasm-bindgen = "0.2.89"
+js-sys = "0.3.67"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/examples/webrtc_datachannel/Cargo.toml b/examples/webrtc_datachannel/Cargo.toml
index 3f691bcc..7f7fbca4 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.89"
+wasm-bindgen = "0.2.90"
 js-sys = "0.3"
-wasm-bindgen-futures = "0.4.39"
+wasm-bindgen-futures = "0.4.40"
 
 [dependencies.web-sys]
 version = "0.3.22"
diff --git a/examples/websockets/Cargo.toml b/examples/websockets/Cargo.toml
index ba7b1469..0cfd4214 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.89"
+wasm-bindgen = "0.2.90"
 js-sys = "0.3"
 
 [dependencies.web-sys]
diff --git a/examples/webxr/Cargo.toml b/examples/webxr/Cargo.toml
index 37e89f39..c934e4c8 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.66"
-wasm-bindgen = "0.2.89"
-wasm-bindgen-futures = "0.4.39"
+js-sys = "0.3.67"
+wasm-bindgen = "0.2.90"
+wasm-bindgen-futures = "0.4.40"
 
 [dependencies.web-sys]
 version = "0.3.37"
diff --git a/examples/without-a-bundler/Cargo.toml b/examples/without-a-bundler/Cargo.toml
index 389d9467..3d7a30ba 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.89"
+wasm-bindgen = "0.2.90"
 
 [dependencies.web-sys]
 version = "0.3.4"
diff --git a/guide/src/contributing/publishing.md b/guide/src/contributing/publishing.md
index 0eedb7d8..ca302dd0 100644
--- a/guide/src/contributing/publishing.md
+++ b/guide/src/contributing/publishing.md
@@ -13,9 +13,11 @@
    ./publish bump
    ```
 
-3. <input type="checkbox"/> Send a pull request for the version bump.
+3. <input type="checkbox"/> Update CHANGELOG.md to add the to-be-released version number, compare URL and release date. [See this example](https://github.com/rustwasm/wasm-bindgen/commit/0b5f0eec2f3d5e75a923fd67ef14b3b5cc855c80#diff-06572a96a58dc510037d5efa622f9bec8519bc1beab13c9f251e97e657a9d4ed)
 
-4. <input type="checkbox"/> After the pull request's CI is green and it has been
+4. <input type="checkbox"/> Send a pull request for the version bump.
+
+5. <input type="checkbox"/> After the pull request's CI is green and it has been
    merged, publish to cargo:
 
    ```
diff --git a/webdriver.json b/webdriver.json
deleted file mode 100644
index 84740385..00000000
--- a/webdriver.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "moz:firefoxOptions": {
-    "prefs": {
-        "dom.workers.modules.enabled": true
-    },
-    "args": []
-  }
-}


Test patch:
diff --git a/crates/cli/src/bin/wasm-bindgen-test-runner/main.rs b/crates/cli/src/bin/wasm-bindgen-test-runner/main.rs
index 79382fa2..88d5bc68 100644
--- a/crates/cli/src/bin/wasm-bindgen-test-runner/main.rs
+++ b/crates/cli/src/bin/wasm-bindgen-test-runner/main.rs
@@ -30,7 +30,29 @@ enum TestMode {
     Node,
     Deno,
     Browser { no_modules: bool },
-    Worker { no_modules: bool },
+    DedicatedWorker { no_modules: bool },
+    SharedWorker { no_modules: bool },
+    ServiceWorker { no_modules: bool },
+}
+
+impl TestMode {
+    fn is_worker(self) -> bool {
+        matches!(
+            self,
+            Self::DedicatedWorker { .. } | Self::SharedWorker { .. } | Self::ServiceWorker { .. }
+        )
+    }
+
+    fn no_modules(self) -> bool {
+        match self {
+            Self::Node => true,
+            Self::Deno => true,
+            Self::Browser { no_modules }
+            | Self::DedicatedWorker { no_modules }
+            | Self::SharedWorker { no_modules }
+            | Self::ServiceWorker { no_modules } => no_modules,
+        }
+    }
 }
 
 struct TmpDirDeleteGuard(PathBuf);
@@ -120,7 +142,13 @@ fn main() -> anyhow::Result<()> {
         Some(section) if section.data.contains(&0x01) => TestMode::Browser {
             no_modules: std::env::var("WASM_BINDGEN_USE_NO_MODULE").is_ok(),
         },
-        Some(section) if section.data.contains(&0x10) => TestMode::Worker {
+        Some(section) if section.data.contains(&0x02) => TestMode::DedicatedWorker {
+            no_modules: std::env::var("WASM_BINDGEN_USE_NO_MODULE").is_ok(),
+        },
+        Some(section) if section.data.contains(&0x03) => TestMode::SharedWorker {
+            no_modules: std::env::var("WASM_BINDGEN_USE_NO_MODULE").is_ok(),
+        },
+        Some(section) if section.data.contains(&0x04) => TestMode::ServiceWorker {
             no_modules: std::env::var("WASM_BINDGEN_USE_NO_MODULE").is_ok(),
         },
         Some(_) => bail!("invalid __wasm_bingen_test_unstable value"),
@@ -175,11 +203,15 @@ fn main() -> anyhow::Result<()> {
     match test_mode {
         TestMode::Node => b.nodejs(true)?,
         TestMode::Deno => b.deno(true)?,
-        TestMode::Browser { no_modules: false } | TestMode::Worker { no_modules: false } => {
-            b.web(true)?
-        }
-        TestMode::Browser { no_modules: true } | TestMode::Worker { no_modules: true } => {
-            b.no_modules(true)?
+        TestMode::Browser { .. }
+        | TestMode::DedicatedWorker { .. }
+        | TestMode::SharedWorker { .. }
+        | TestMode::ServiceWorker { .. } => {
+            if test_mode.no_modules() {
+                b.no_modules(true)?
+            } else {
+                b.web(true)?
+            }
         }
     };
 
@@ -200,7 +232,10 @@ fn main() -> anyhow::Result<()> {
     match test_mode {
         TestMode::Node => node::execute(module, &tmpdir, &args, &tests)?,
         TestMode::Deno => deno::execute(module, &tmpdir, &args, &tests)?,
-        TestMode::Browser { no_modules } | TestMode::Worker { no_modules } => {
+        TestMode::Browser { .. }
+        | TestMode::DedicatedWorker { .. }
+        | TestMode::SharedWorker { .. }
+        | TestMode::ServiceWorker { .. } => {
             let srv = server::spawn(
                 &if headless {
                     "127.0.0.1:0".parse().unwrap()
@@ -214,8 +249,8 @@ fn main() -> anyhow::Result<()> {
                 &tmpdir,
                 &args,
                 &tests,
-                no_modules,
-                matches!(test_mode, TestMode::Worker { no_modules: _ }),
+                test_mode,
+                std::env::var("WASM_BINDGEN_TEST_NO_ORIGIN_ISOLATION").is_err(),
             )
             .context("failed to spawn server")?;
             let addr = srv.server_addr();
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 6cb0210c..9c434a00 100644
--- a/crates/cli/src/bin/wasm-bindgen-test-runner/server.rs
+++ b/crates/cli/src/bin/wasm-bindgen-test-runner/server.rs
@@ -7,19 +7,21 @@ use std::path::Path;
 use anyhow::{anyhow, Context, Error};
 use rouille::{Request, Response, Server};
 
-pub fn spawn(
+use crate::TestMode;
+
+pub(crate) fn spawn(
     addr: &SocketAddr,
     headless: bool,
     module: &'static str,
     tmpdir: &Path,
     args: &[OsString],
     tests: &[String],
-    no_module: bool,
-    worker: bool,
+    test_mode: TestMode,
+    isolate_origin: bool,
 ) -> Result<Server<impl Fn(&Request) -> Response + Send + Sync>, Error> {
     let mut js_to_execute = String::new();
 
-    let wbg_import_script = if no_module {
+    let wbg_import_script = if test_mode.no_modules() {
         String::from(
             r#"
             let Context = wasm_bindgen.WasmBindgenTestContext;
@@ -48,8 +50,8 @@ pub fn spawn(
         )
     };
 
-    if worker {
-        let mut worker_script = if no_module {
+    if test_mode.is_worker() {
+        let mut worker_script = if test_mode.no_modules() {
             format!(r#"importScripts("{0}.js");"#, module)
         } else {
             String::new()
@@ -57,6 +59,25 @@ pub fn spawn(
 
         worker_script.push_str(&wbg_import_script);
 
+        match test_mode {
+            TestMode::DedicatedWorker { .. } => worker_script.push_str("const port = self\n"),
+            TestMode::SharedWorker { .. } => worker_script.push_str(
+                r#"
+                addEventListener('connect', (e) => {
+                    const port = e.ports[0]
+                "#,
+            ),
+            TestMode::ServiceWorker { .. } => worker_script.push_str(
+                r#"
+                addEventListener('install', (e) => skipWaiting());
+                addEventListener('activate', (e) => e.waitUntil(clients.claim()));
+                addEventListener('message', (e) => {
+                    const port = e.ports[0]
+                "#,
+            ),
+            _ => unreachable!(),
+        }
+
         worker_script.push_str(&format!(
             r#"
             const wrap = method => {{
@@ -65,7 +86,7 @@ pub fn spawn(
                     if (self[on_method]) {{
                         self[on_method](args);
                     }}
-                    postMessage(["__wbgtest_" + method, args]);
+                    port.postMessage(["__wbgtest_" + method, args]);
                 }};
             }};
 
@@ -73,7 +94,7 @@ pub fn spawn(
             self.__wbg_test_output = "";
             self.__wbg_test_output_writeln = function (line) {{
                 self.__wbg_test_output += line + "\n";
-                postMessage(["__wbgtest_output", self.__wbg_test_output]);
+                port.postMessage(["__wbgtest_output", self.__wbg_test_output]);
             }}
 
             wrap("debug");
@@ -97,7 +118,7 @@ pub fn spawn(
                 await cx.run(tests.map(s => wasm[s]));
             }}
 
-            onmessage = function(e) {{
+            port.onmessage = function(e) {{
                 let tests = e.data;
                 run_in_worker(tests);
             }}
@@ -105,7 +126,19 @@ pub fn spawn(
             module, args,
         ));
 
-        let worker_js_path = tmpdir.join("worker.js");
+        if matches!(
+            test_mode,
+            TestMode::SharedWorker { .. } | TestMode::ServiceWorker { .. }
+        ) {
+            worker_script.push_str("})");
+        }
+
+        let name = if matches!(test_mode, TestMode::ServiceWorker { .. }) {
+            "service.js"
+        } else {
+            "worker.js"
+        };
+        let worker_js_path = tmpdir.join(name);
         fs::write(worker_js_path, worker_script).context("failed to write JS file")?;
 
         js_to_execute.push_str(&format!(
@@ -114,9 +147,9 @@ pub fn spawn(
             // status text as at this point we should be asynchronously fetching the
             // wasm module.
             document.getElementById('output').textContent = "Loading wasm module...";
-            const worker = new Worker("worker.js", {{type: "{}"}});
+            {}
 
-            worker.addEventListener("message", function(e) {{
+            port.addEventListener("message", function(e) {{
                 // Checking the whether the message is from wasm_bindgen_test
                 if(
                     e.data &&
@@ -141,12 +174,54 @@ pub fn spawn(
             }});
 
             async function main(test) {{
-                worker.postMessage(test)
+                port.postMessage(test)
             }}
 
             const tests = [];
             "#,
-            if no_module { "classic" } else { "module" }
+            {
+                let module = if test_mode.no_modules() {
+                    "classic"
+                } else {
+                    "module"
+                };
+
+                match test_mode {
+                    TestMode::DedicatedWorker { .. } => {
+                        format!("const port = new Worker('worker.js', {{type: '{module}'}});\n")
+                    }
+                    TestMode::SharedWorker { .. } => {
+                        format!(
+                            r#"
+                            const worker = new SharedWorker("worker.js?random=" + crypto.randomUUID(), {{type: "{module}"}});
+                            const port = worker.port;
+                            port.start();
+                            "#
+                        )
+                    }
+                    TestMode::ServiceWorker { .. } => {
+                        format!(
+                            r#"
+                            const url = "service.js?random=" + crypto.randomUUID();
+                            await navigator.serviceWorker.register(url, {{type: "{module}"}});
+                            await new Promise((resolve) => {{
+                                navigator.serviceWorker.addEventListener('controllerchange', () => {{
+                                    if (navigator.serviceWorker.controller.scriptURL != location.href + url) {{
+                                        throw "`wasm-bindgen-test-runner` does not support running multiple service worker tests at the same time"
+                                    }}
+                                    resolve();
+                                }});
+                            }});
+                            const channel = new MessageChannel();
+                            navigator.serviceWorker.controller.postMessage(undefined, [channel.port2]);
+                            const port = channel.port1;
+                            port.start();
+                            "#
+                        )
+                    }
+                    _ => unreachable!(),
+                }
+            }
         ));
     } else {
         js_to_execute.push_str(&wbg_import_script);
@@ -203,7 +278,7 @@ pub fn spawn(
             } else {
                 include_str!("index.html")
             };
-            let s = if no_module {
+            let s = if !test_mode.is_worker() && test_mode.no_modules() {
                 s.replace(
                     "<!-- {IMPORT_SCRIPTS} -->",
                     &format!(
@@ -217,7 +292,14 @@ pub fn spawn(
                     "<script src='run.js' type=module></script>",
                 )
             };
-            return set_isolate_origin_headers(Response::from_data("text/html", s));
+
+            let mut response = Response::from_data("text/html", s);
+
+            if isolate_origin {
+                set_isolate_origin_headers(&mut response)
+            }
+
+            return response;
         }
 
         // Otherwise we need to find the asset here. It may either be in our
@@ -230,7 +312,10 @@ pub fn spawn(
         // Make sure browsers don't cache anything (Chrome appeared to with this
         // header?)
         response.headers.retain(|(k, _)| k != "Cache-Control");
-        set_isolate_origin_headers(response)
+        if isolate_origin {
+            set_isolate_origin_headers(&mut response)
+        }
+        response
     })
     .map_err(|e| anyhow!("{}", e))?;
     return Ok(srv);
@@ -272,7 +357,7 @@ pub fn spawn(
  * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy#certain_features_depend_on_cross-origin_isolation
  * https://security.googleblog.com/2018/07/mitigating-spectre-with-site-isolation.html
  */
-fn set_isolate_origin_headers(mut response: Response) -> Response {
+fn set_isolate_origin_headers(response: &mut Response) {
     response.headers.push((
         Cow::Borrowed("Cross-Origin-Opener-Policy"),
         Cow::Borrowed("same-origin"),
@@ -281,6 +366,4 @@ fn set_isolate_origin_headers(mut response: Response) -> Response {
         Cow::Borrowed("Cross-Origin-Embedder-Policy"),
         Cow::Borrowed("require-corp"),
     ));
-
-    response
 }
diff --git a/crates/test-macro/Cargo.toml b/crates/test-macro/Cargo.toml
index 325e0a20..0acca18e 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.39"
+version = "0.3.40"
 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 2c10cc87..51c1a59c 100644
--- a/crates/test/Cargo.toml
+++ b/crates/test/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "wasm-bindgen-test"
-version = "0.3.39"
+version = "0.3.40"
 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.66' }
+js-sys = { path = '../js-sys', version = '0.3.67' }
 scoped-tls = "1.0"
-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' }
+wasm-bindgen = { path = '../..', version = '0.2.90' }
+wasm-bindgen-futures = { path = '../futures', version = '0.4.40' }
+wasm-bindgen-test-macro = { path = '../test-macro', version = '=0.3.40' }
 gg-alloc = { version = "1.0", optional = true }
 
 [lib]
diff --git a/crates/test/src/lib.rs b/crates/test/src/lib.rs
index 72d3fc9d..6b4174b1 100644
--- a/crates/test/src/lib.rs
+++ b/crates/test/src/lib.rs
@@ -35,7 +35,11 @@ macro_rules! console_log {
 ///
 /// * `run_in_browser` - requires that this test is run in a browser rather than
 ///   node.js, which is the default for executing tests.
-/// * `run_in_worker` - requires that this test is run in a web worker rather than
+/// * `run_in_dedicated_worker` - requires that this test is run in a web worker rather than
+///   node.js, which is the default for executing tests.
+/// * `run_in_shared_worker` - requires that this test is run in a shared worker rather than
+///   node.js, which is the default for executing tests.
+/// * `run_in_service_worker` - requires that this test is run in a service worker rather than
 ///   node.js, which is the default for executing tests.
 ///
 /// This macro may be invoked at most one time per test suite (an entire binary
@@ -51,7 +55,25 @@ macro_rules! wasm_bindgen_test_configure {
     (run_in_worker $($others:tt)*) => (
         #[link_section = "__wasm_bindgen_test_unstable"]
         #[cfg(target_arch = "wasm32")]
-        pub static __WBG_TEST_RUN_IN_WORKER: [u8; 1] = [0x10];
+        pub static __WBG_TEST_RUN_IN_DEDICATED_WORKER: [u8; 1] = [0x02];
+        $crate::wasm_bindgen_test_configure!($($others)*);
+    );
+    (run_in_dedicated_worker $($others:tt)*) => (
+        #[link_section = "__wasm_bindgen_test_unstable"]
+        #[cfg(target_arch = "wasm32")]
+        pub static __WBG_TEST_RUN_IN_DEDICATED_WORKER: [u8; 1] = [0x02];
+        $crate::wasm_bindgen_test_configure!($($others)*);
+    );
+    (run_in_shared_worker $($others:tt)*) => (
+        #[link_section = "__wasm_bindgen_test_unstable"]
+        #[cfg(target_arch = "wasm32")]
+        pub static __WBG_TEST_RUN_IN_SHARED_WORKER: [u8; 1] = [0x03];
+        $crate::wasm_bindgen_test_configure!($($others)*);
+    );
+    (run_in_service_worker $($others:tt)*) => (
+        #[link_section = "__wasm_bindgen_test_unstable"]
+        #[cfg(target_arch = "wasm32")]
+        pub static __WBG_TEST_RUN_IN_SERVICE_WORKER: [u8; 1] = [0x04];
         $crate::wasm_bindgen_test_configure!($($others)*);
     );
     () => ()
diff --git a/crates/test/src/rt/detect.rs b/crates/test/src/rt/detect.rs
index 81cb1c70..235b14c6 100644
--- a/crates/test/src/rt/detect.rs
+++ b/crates/test/src/rt/detect.rs
@@ -24,7 +24,9 @@ pub fn detect() -> Runtime {
     // only be true in browsers.
     match js_sys::global().unchecked_into::<This>().self_() {
         Some(scope) => match scope.constructor().name().as_str() {
-            "DedicatedWorkerGlobalScope" | "SharedWorkerGlobalScope" => Runtime::Worker,
+            "DedicatedWorkerGlobalScope"
+            | "SharedWorkerGlobalScope"
+            | "ServiceWorkerGlobalScope" => Runtime::Worker,
             _ => Runtime::Browser,
         },
         None => Runtime::Node,
diff --git a/crates/test/src/rt/mod.rs b/crates/test/src/rt/mod.rs
index 0235ce82..c1be2904 100644
--- a/crates/test/src/rt/mod.rs
+++ b/crates/test/src/rt/mod.rs
@@ -130,9 +130,15 @@ struct State {
     /// Include ignored tests.
     include_ignored: Cell<bool>,
 
+    /// Tests to skip.
+    skip: RefCell<Vec<String>>,
+
     /// Counter of the number of tests that have succeeded.
     succeeded: Cell<usize>,
 
+    /// Counter of the number of tests that have been filtered
+    filtered: Cell<usize>,
+
     /// Counter of the number of tests that have been ignored
     ignored: Cell<usize>,
 
@@ -277,7 +283,9 @@ impl Context {
             state: Rc::new(State {
                 filter: Default::default(),
                 include_ignored: Default::default(),
+                skip: Default::default(),
                 failures: Default::default(),
+                filtered: Default::default(),
                 ignored: Default::default(),
                 remaining: Default::default(),
                 running: Default::default(),
@@ -289,20 +297,25 @@ impl Context {
 
     /// Inform this context about runtime arguments passed to the test
     /// harness.
-    ///
-    /// Eventually this will be used to support flags, but for now it's just
-    /// used to support test filters.
     pub fn args(&mut self, args: Vec<JsValue>) {
-        // Here we want to reject all flags like `--foo` or `-f` as we don't
-        // support anything, and also we only support at most one non-flag
-        // argument as a test filter.
-        //
-        // Everything else is rejected.
         let mut filter = self.state.filter.borrow_mut();
-        for arg in args {
+        let mut skip = self.state.skip.borrow_mut();
+
+        let mut args = args.into_iter();
+
+        while let Some(arg) = args.next() {
             let arg = arg.as_string().unwrap();
             if arg == "--include-ignored" {
                 self.state.include_ignored.set(true);
+            } else if arg == "--skip" {
+                skip.push(
+                    args.next()
+                        .expect("Argument to option 'skip' missing")
+                        .as_string()
+                        .unwrap(),
+                );
+            } else if let Some(arg) = arg.strip_prefix("--skip=") {
+                skip.push(arg.to_owned())
             } else if arg.starts_with('-') {
                 panic!("flag {} not supported", arg);
             } else if filter.is_some() {
@@ -482,8 +495,16 @@ impl Context {
         let filter = self.state.filter.borrow();
         if let Some(filter) = &*filter {
             if !name.contains(filter) {
-                let ignored = self.state.ignored.get();
-                self.state.ignored.set(ignored + 1);
+                let filtered = self.state.filtered.get();
+                self.state.filtered.set(filtered + 1);
+                return;
+            }
+        }
+
+        for skip in &*self.state.skip.borrow() {
+            if name.contains(skip) {
+                let filtered = self.state.filtered.get();
+                self.state.filtered.set(filtered + 1);
                 return;
             }
         }
@@ -628,11 +649,13 @@ impl State {
             "test result: {}. \
              {} passed; \
              {} failed; \
-             {} ignored\n",
+             {} ignored; \
+             {} filtered out\n",
             if failures.len() == 0 { "ok" } else { "FAILED" },
             self.succeeded.get(),
             failures.len(),
             self.ignored.get(),
+            self.filtered.get(),
         ));
     }
 
diff --git a/guide/src/wasm-bindgen-test/browsers.md b/guide/src/wasm-bindgen-test/browsers.md
index 1df038e3..5477e6b4 100644
--- a/guide/src/wasm-bindgen-test/browsers.md
+++ b/guide/src/wasm-bindgen-test/browsers.md
@@ -17,7 +17,12 @@ snippet.
 ```rust
 use wasm_bindgen_test::wasm_bindgen_test_configure;
 
-wasm_bindgen_test_configure!(run_in_worker);
+// Run in dedicated worker.
+wasm_bindgen_test_configure!(run_in_dedicated_worker);
+// Or run in shared worker.
+wasm_bindgen_test_configure!(run_in_shared_worker);
+// Or run in service worker.
+wasm_bindgen_test_configure!(run_in_service_worker);
 ```
 
 Note that although a particular test crate must target either headless browsers
@@ -27,9 +32,11 @@ project by using multiple test crates. For example:
 ```
 $MY_CRATE/
 `-- tests
-    |-- node.rs    # The tests in this suite use the default Node.js.
-    |-- worker.rs  # The tests in this suite are configured for workers.
-    `-- web.rs     # The tests in this suite are configured for browsers.
+    |-- node.rs              # The tests in this suite use the default Node.js.
+    |-- dedicated_worker.rs  # The tests in this suite are configured for dedicated workers.
+    |-- shared_worker.rs     # The tests in this suite are configured for shared workers.
+    |-- service_worker.rs    # The tests in this suite are configured for service workers.
+    `-- web.rs               # The tests in this suite are configured for browsers.
 ```
 
 ## Configuring Which Browser is Used
@@ -86,12 +93,6 @@ Full list supported capabilities can be found:
 
 Note that the `headless` argument is always enabled for both browsers.
 
-You have to enable the special preference `dom.workers.modules.enabled` for
-firefox when running the tests in Web Workers without using
-`WASM_BINDGEN_USE_NO_MODULE` variable. Because firefox supported
-ECMAScript modules in last release (2023-03-14) behind a special
-preference. 
-
 ### Debugging Headless Browser Tests
 
 Omitting the `--headless` flag will disable headless mode, and allow you to
diff --git a/tests/wasm/simple.js b/tests/wasm/simple.js
index cf53525e..bc3edce8 100644
--- a/tests/wasm/simple.js
+++ b/tests/wasm/simple.js
@@ -28,6 +28,11 @@ exports.test_wrong_types = function() {
     return;
   assert.throws(() => wasm.simple_int('a'), /expected a number argument/);
   assert.throws(() => wasm.simple_str(3), /expected a string argument/);
+  assert.throws(() => wasm.simple_bool('a'), /expected a boolean argument/);
+
+  assert.doesNotThrow(() => wasm.simple_int(1));
+  assert.doesNotThrow(() => wasm.simple_str('a'));
+  assert.doesNotThrow(() => wasm.simple_bool(true));
 };
 
 exports.test_other_exports_still_available = function() {
diff --git a/tests/wasm/simple.rs b/tests/wasm/simple.rs
index db653847..94cad579 100644
--- a/tests/wasm/simple.rs
+++ b/tests/wasm/simple.rs
@@ -101,6 +101,9 @@ fn wrong_types() {
 #[wasm_bindgen]
 pub fn simple_int(_a: u32) {}
 
+#[wasm_bindgen]
+pub fn simple_bool(_a: bool) {}
+
 #[wasm_bindgen]
 pub fn simple_str(_a: &str) {}
 
diff --git a/tests/worker/dedicated.rs b/tests/worker/dedicated.rs
new file mode 100644
index 00000000..f3038db8
--- /dev/null
+++ b/tests/worker/dedicated.rs
@@ -0,0 +1,18 @@
+#![cfg(target_arch = "wasm32")]
+
+extern crate js_sys;
+extern crate wasm_bindgen;
+extern crate wasm_bindgen_test;
+
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::wasm_bindgen_test_configure;
+
+wasm_bindgen_test_configure!(run_in_dedicated_worker);
+
+pub mod modules;
+
+// should not be executed
+#[wasm_bindgen(start)]
+fn start() {
+    panic!();
+}
diff --git a/tests/worker/service.rs b/tests/worker/service.rs
new file mode 100644
index 00000000..6ae7de33
--- /dev/null
+++ b/tests/worker/service.rs
@@ -0,0 +1,18 @@
+#![cfg(target_arch = "wasm32")]
+
+extern crate js_sys;
+extern crate wasm_bindgen;
+extern crate wasm_bindgen_test;
+
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::wasm_bindgen_test_configure;
+
+wasm_bindgen_test_configure!(run_in_service_worker);
+
+pub mod modules;
+
+// should not be executed
+#[wasm_bindgen(start)]
+fn start() {
+    panic!();
+}
diff --git a/tests/worker/main.rs b/tests/worker/shared.rs
similarity index 84%
rename from tests/worker/main.rs
rename to tests/worker/shared.rs
index 16f358c0..b13c8020 100644
--- a/tests/worker/main.rs
+++ b/tests/worker/shared.rs
@@ -7,7 +7,7 @@ extern crate wasm_bindgen_test;
 use wasm_bindgen::prelude::*;
 use wasm_bindgen_test::wasm_bindgen_test_configure;
 
-wasm_bindgen_test_configure!(run_in_worker);
+wasm_bindgen_test_configure!(run_in_shared_worker);
 
 pub mod modules;