diff --git a/Cargo.lock b/Cargo.lock index 691707c5..459f07dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1251,7 +1251,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "gpui_util", "indexmap", @@ -1768,7 +1768,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "proc-macro2", "quote", @@ -2665,7 +2665,7 @@ dependencies = [ [[package]] name = "gpui" version = "0.2.2" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "accesskit", "anyhow", @@ -2750,7 +2750,7 @@ dependencies = [ [[package]] name = "gpui_apple" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "block", @@ -2773,7 +2773,7 @@ dependencies = [ [[package]] name = "gpui_linux" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "accesskit", "accesskit_unix", @@ -2819,7 +2819,7 @@ dependencies = [ [[package]] name = "gpui_macos" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "accesskit", "accesskit_macos", @@ -2865,7 +2865,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2876,7 +2876,7 @@ dependencies = [ [[package]] name = "gpui_platform" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "console_error_panic_hook", "gpui", @@ -2889,7 +2889,7 @@ dependencies = [ [[package]] name = "gpui_shared_string" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "schemars", "serde", @@ -2899,7 +2899,7 @@ dependencies = [ [[package]] name = "gpui_tokio" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "gpui", @@ -2910,7 +2910,7 @@ dependencies = [ [[package]] name = "gpui_util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "log", @@ -2920,7 +2920,7 @@ dependencies = [ [[package]] name = "gpui_web" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "console_error_panic_hook", @@ -2944,7 +2944,7 @@ dependencies = [ [[package]] name = "gpui_wgpu" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "bytemuck", @@ -2970,7 +2970,7 @@ dependencies = [ [[package]] name = "gpui_windows" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "accesskit", "accesskit_windows", @@ -3148,9 +3148,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" [[package]] name = "hex" @@ -3245,7 +3245,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "async-compression", @@ -3265,7 +3265,7 @@ dependencies = [ [[package]] name = "http_client_tls" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "log", "rustls", @@ -3949,9 +3949,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" +checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" dependencies = [ "lyon_path", "num-traits", @@ -3980,9 +3980,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" +checksum = "dabea159dc6eea9171a541b458134b70ca95e3162d068132b2b3b9bc01aad06e" dependencies = [ "float_next_after", "lyon_path", @@ -4044,7 +4044,7 @@ dependencies = [ [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "bindgen", @@ -4600,6 +4600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.13.1", + "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -4970,7 +4971,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perf" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "collections", "serde", @@ -5742,7 +5743,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "derive_refineable", ] @@ -5824,7 +5825,7 @@ dependencies = [ [[package]] name = "reqwest_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "bytes", @@ -6125,7 +6126,7 @@ dependencies = [ [[package]] name = "scheduler" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "async-task", "backtrace", @@ -6719,7 +6720,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "heapless 0.9.3", "log", @@ -7758,7 +7759,7 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "util_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "perf", "quote", @@ -7797,9 +7798,9 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.14.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d4788a546b899f8656382fe210e0c478fe3d2dcd6263d50cb6cc268240de6c" +checksum = "068e763e8279de7ab94b6afebded2cb701678af094feb1c12ccb061b4783c1be" dependencies = [ "value-bag-serde1", "value-bag-sval2", @@ -9433,7 +9434,7 @@ checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" [[package]] name = "zlog" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "anyhow", "chrono", @@ -9450,7 +9451,7 @@ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "ztracing" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" dependencies = [ "tracing", "tracing-subscriber", @@ -9461,7 +9462,7 @@ dependencies = [ [[package]] name = "ztracing_macro" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#bce0c5785bfd9172c939aca4083fd70bc4930927" +source = "git+https://github.com/zed-industries/zed#ce48461eaadd16c65c31f835511ab96bd3b6e746" [[package]] name = "zune-core" diff --git a/crates/person/src/person.rs b/crates/person/src/person.rs index 0a872aa7..cb93d18b 100644 --- a/crates/person/src/person.rs +++ b/crates/person/src/person.rs @@ -105,20 +105,6 @@ impl Person { /// Get profile avatar pub fn avatar(&self) -> SharedString { - // On web, the browser blocks cross-origin image fetches unless the - // picture host sends CORS headers, so remote avatars can never load - // there. Each doomed fetch still triggers a full-window repaint when - // it fails, which is very costly on wasm's single main thread when a - // list renders many avatars at once. Fall back to the bundled avatar - // for remote pictures on web. - #[cfg(target_arch = "wasm32")] - if let Some(picture) = self.metadata.picture.as_ref() - && !picture.is_empty() - && url::Url::parse(picture).is_ok_and(|url| matches!(url.scheme(), "http" | "https")) - { - return "brand/avatar.png".into(); - } - self.metadata .picture .as_ref() diff --git a/web/Cargo.toml b/web/Cargo.toml index f63bed84..9d79bd89 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -32,7 +32,7 @@ console_log = "1.0" wasm-bindgen = "0.2" wasm-bindgen-futures = "0.4" js-sys = "0.3" -web-sys = { version = "0.3", features = ["Window", "Performance"] } +web-sys = { version = "0.3", features = ["Window", "Performance", "Location"] } universal-time = { git = "https://github.com/shadowylab/universal-time" } [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/web/rust-toolchain.toml b/web/rust-toolchain.toml index 5fe1a593..86e8f38a 100644 --- a/web/rust-toolchain.toml +++ b/web/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] channel = "nightly" -components = ["rustfmt", "clippy"] +components = ["rustfmt", "clippy", "rust-src"] targets = ["wasm32-unknown-unknown"] diff --git a/web/script/build-wasm.sh b/web/script/build-wasm.sh index 220b8bf8..db954625 100755 --- a/web/script/build-wasm.sh +++ b/web/script/build-wasm.sh @@ -36,10 +36,13 @@ if [[ "$(uname)" == "Darwin" ]]; then fi # Step 1: Build WASM +# +# Target features and link args (atomics, shared memory, TLS exports) come +# from `web/.cargo/config.toml`, which also enables `-Z build-std` so std is +# rebuilt with atomics support. echo -e "${GREEN}Step 1: Building WASM...${NC}" cd "$PROJECT_ROOT" export CARGO_TARGET_DIR="$PROJECT_ROOT/target" -RUSTFLAGS='-C target-feature=+bulk-memory -C link-arg=--max-memory=4294967296' \ cargo build --target wasm32-unknown-unknown $RELEASE_FLAG # Determine the build directory diff --git a/web/src/lib.rs b/web/src/lib.rs index 38182977..5f890977 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -31,6 +31,30 @@ impl MonotonicClock for CustomTimeProvider { define_time_provider!(CustomTimeProvider); +/// Returns the preferred WebGPU/WebGL backend, selected with +/// `?backend=webgpu` / `?backend=webgl` in the page URL. +#[cfg(target_family = "wasm")] +fn requested_backend() -> gpui_platform::WebBackendPreference { + let search = web_sys::window() + .and_then(|window| window.location().search().ok()) + .unwrap_or_default(); + if search + .trim_start_matches('?') + .split('&') + .any(|parameter| parameter == "backend=webgpu") + { + gpui_platform::WebBackendPreference::WebGpu + } else if search + .trim_start_matches('?') + .split('&') + .any(|parameter| parameter == "backend=webgl") + { + gpui_platform::WebBackendPreference::WebGl + } else { + gpui_platform::WebBackendPreference::Auto + } +} + thread_local! { static APPLICATION: RefCell> = const { RefCell::new(None) }; } @@ -96,7 +120,10 @@ pub async fn run() -> Result<(), JsValue> { // immediately instead of waiting for a repaint. assets.preload().await; - gpui_platform::single_threaded_web().with_assets(assets) + // Multithreaded web: background work (image decoding, network + // fetches, CPU-heavy tasks) runs on real worker threads instead of + // the main thread, so the UI stays responsive. + gpui_platform::application_with_web_backend(requested_backend()).with_assets(assets) }; let launch = move |cx: &mut App| {