[bug] Tauri panics when trying to close windows more than once
samkearney opened this issue · 1 comments
Describe the bug
After a webview window is closed, it remains available from the set returned from app.webview_windows() for some time. If the code then attempts to close the window again after enumerating it, it can sometimes lead to a panic. This bug is very timing-dependent, so the reproducer I have created closes windows over and over again in a tight loop - but it leads to a very reliable reproduction of the issue.
Reproduction
https://github.com/samkearney/tauri-close-windows-crash-reproducer
Build, run and click the big "reproduce issue" button. I only tested this on Windows 10.
Expected behavior
If Tauri lets the application code hold references to windows after they have been closed or while they are closing, I would expect future attempts to close (or do any operation with) those windows to yield an error result, but not a panic inside of Tauri.
Full tauri info
output
> tauri-repro@0.1.0 tauri
> tauri info
[✔] Environment
- OS: Windows 10.0.19045 x86_64 (X64)
✔ WebView2: 129.0.2792.52
✔ MSVC:
- Visual Studio Professional 2019
- Visual Studio Professional 2022
✔ rustc: 1.81.0 (eeb90cda1 2024-09-04)
✔ cargo: 1.81.0 (2dbb1af80 2024-08-20)
✔ rustup: 1.27.1 (54dd3d00f 2024-04-24)
✔ Rust toolchain: stable-x86_64-pc-windows-msvc (default)
- node: 18.18.0
- npm: 9.8.1
[-] Packages
- tauri 🦀: 2.0.0-rc.15
- tauri-build 🦀: 2.0.0-rc.12
- wry 🦀: 0.43.1
- tao 🦀: 0.30.2
- tauri-cli 🦀: 2.0.0-rc.4
- @tauri-apps/api : 2.0.0-rc.5
- @tauri-apps/cli : 2.0.0-rc.16
[-] Plugins
- tauri-plugin-shell 🦀: 2.0.0-rc.3
- @tauri-apps/plugin-shell : 2.0.0-rc.1
[-] App
- build-type: bundle
- CSP: unset
- frontendDist: ../dist
- devUrl: http://localhost:1420/
- framework: React
- bundler: Vite
Stack trace
thread 'tokio-runtime-worker' panicked at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tauri-2.0.0-rc.15\src\webview\mod.rs:984:8:
could not locate webview parent window
stack backtrace:
0: std::panicking::begin_panic_handler
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\std\src\panicking.rs:665
1: core::panicking::panic_fmt
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\core\src\panicking.rs:74
2: core::panicking::panic_display
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\core\src\panicking.rs:264
3: core::option::expect_failed
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library\core\src\option.rs:2030
4: enum2$<core::option::Option<tauri::window::Window<tauri_runtime_wry::Wry<enum2$<tauri::EventLoopMessage> > > > >::expect<tauri::window::Window<tauri_runtime_wry::Wry<enum2$<tauri::EventLoopMessage> > > >
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\core\src\option.rs:933
5: tauri::webview::Webview<tauri_runtime_wry::Wry<enum2$<tauri::EventLoopMessage> > >::window<tauri_runtime_wry::Wry<enum2$<tauri::EventLoopMessage> > >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tauri-2.0.0-rc.15\src\webview\mod.rs:981
6: tauri::webview::webview_window::WebviewWindow<tauri_runtime_wry::Wry<enum2$<tauri::EventLoopMessage> > >::destroy<tauri_runtime_wry::Wry<enum2$<tauri::EventLoopMessage> > >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tauri-2.0.0-rc.15\src\webview\webview_window.rs:1373
7: tauri_repro_lib::run::closure$0::async_block$0
at .\src\lib.rs:62
8: tokio::runtime::task::core::impl$6::poll::closure$0<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\core.rs:331
9: tokio::loom::std::unsafe_cell::UnsafeCell<enum2$<tokio::runtime::task::core::Stage<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0> > > >::with_mut
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\loom\std\unsafe_cell.rs:16
10: tokio::runtime::task::core::Core<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >::poll<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,al
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\core.rs:320
11: tokio::runtime::task::harness::poll_future::closure$0<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:500
12: core::panic::unwind_safe::impl$25::call_once<enum2$<core::task::poll::Poll<tuple$<> > >,tokio::runtime::task::harness::poll_future::closure_env$0<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_t
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\core\src\panic\unwind_safe.rs:272
13: std::panicking::try::do_call<core::panic::unwind_safe::AssertUnwindSafe<tokio::runtime::task::harness::poll_future::closure_env$0<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::H
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\panicking.rs:557
14: std::panic::catch_unwind<core::panic::unwind_safe::AssertUnwindSafe<tokio::runtime::task::harness::cancel_task::closure_env$0<core::pin::Pin<alloc::boxed::Box<enum2$<tauri::ipc::impl$20::respond_async_serialized::async_block_env$0<tauri_runtime_wry::Wry<en
15: std::panicking::try
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\panicking.rs:521
16: std::panic::catch_unwind<core::panic::unwind_safe::AssertUnwindSafe<tokio::runtime::task::harness::poll_future::closure_env$0<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handl
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\panic.rs:350
17: tokio::runtime::task::harness::poll_future<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:488
18: tokio::runtime::task::harness::Harness<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >::poll_inner<enum2$<tauri_repro_lib::run::closure$0::async_blo
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:209
19: tokio::runtime::task::harness::Harness<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >::poll<enum2$<tauri_repro_lib::run::closure$0::async_block_env
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:154
20: tokio::runtime::task::raw::poll<enum2$<tauri_repro_lib::run::closure$0::async_block_env$0>,alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\raw.rs:271
21: tokio::runtime::task::raw::RawTask::poll
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\raw.rs:201
22: tokio::runtime::task::LocalNotified<alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >::run<alloc::sync::Arc<tokio::runtime::scheduler::multi_thread::handle::Handle,alloc::alloc::Global> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\mod.rs:436
23: tokio::runtime::scheduler::multi_thread::worker::impl$1::run_task::closure$0
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\scheduler\multi_thread\worker.rs:598
24: tokio::runtime::coop::with_budget
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\coop.rs:107
25: tokio::runtime::coop::budget
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\coop.rs:73
26: tokio::runtime::scheduler::multi_thread::worker::Context::run_task
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\scheduler\multi_thread\worker.rs:597
27: tokio::runtime::scheduler::multi_thread::worker::Context::run
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\scheduler\multi_thread\worker.rs:548
28: tokio::runtime::scheduler::multi_thread::worker::run::closure$0::closure$0
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\scheduler\multi_thread\worker.rs:513
29: tokio::runtime::context::scoped::Scoped<enum2$<tokio::runtime::scheduler::Context> >::set<enum2$<tokio::runtime::scheduler::Context>,tokio::runtime::scheduler::multi_thread::worker::run::closure$0::closure_env$0,tuple$<> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\context\scoped.rs:40
30: tokio::runtime::context::set_scheduler::closure$0<tuple$<>,tokio::runtime::scheduler::multi_thread::worker::run::closure$0::closure_env$0>
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\context.rs:180
31: std::thread::local::LocalKey<tokio::runtime::context::Context>::try_with<tokio::runtime::context::Context,tokio::runtime::context::set_scheduler::closure_env$0<tuple$<>,tokio::runtime::scheduler::multi_thread::worker::run::closure$0::closure_env$0>,tuple$<
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\thread\local.rs:283
32: std::thread::local::LocalKey<tokio::runtime::context::Context>::with<tokio::runtime::context::Context,tokio::runtime::context::set_scheduler::closure_env$0<tuple$<>,tokio::runtime::scheduler::multi_thread::worker::run::closure$0::closure_env$0>,tuple$<> >
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\thread\local.rs:260
33: tokio::runtime::context::set_scheduler<tuple$<>,tokio::runtime::scheduler::multi_thread::worker::run::closure$0::closure_env$0>
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\context.rs:180
34: tokio::runtime::scheduler::multi_thread::worker::run::closure$0
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\scheduler\multi_thread\worker.rs:508
35: tokio::runtime::context::runtime::enter_runtime<tokio::runtime::scheduler::multi_thread::worker::run::closure_env$0,tuple$<> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\context\runtime.rs:65
36: tokio::runtime::scheduler::multi_thread::worker::run
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\scheduler\multi_thread\worker.rs:500
37: tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure$0
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\scheduler\multi_thread\worker.rs:466
38: tokio::runtime::blocking::task::impl$2::poll<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0,tuple$<> >
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\blocking\task.rs:42
39: tokio::runtime::task::core::impl$6::poll::closure$0<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio::runtime::blocking::schedule::BlockingSchedule>
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\core.rs:331
40: tokio::loom::std::unsafe_cell::UnsafeCell<enum2$<tokio::runtime::task::core::Stage<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0> > > >::with_mut
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\loom\std\unsafe_cell.rs:16
41: tokio::runtime::task::core::Core<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio::runtime::blocking::schedule::BlockingSchedule>::poll<tokio::runtime::blocking::task::Blocki
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\core.rs:320
42: tokio::runtime::task::harness::poll_future::closure$0<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio::runtime::blocking::schedule::BlockingSchedule>
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:500
43: core::panic::unwind_safe::impl$25::call_once<enum2$<core::task::poll::Poll<tuple$<> > >,tokio::runtime::task::harness::poll_future::closure_env$0<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\core\src\panic\unwind_safe.rs:272
44: std::panicking::try::do_call<core::panic::unwind_safe::AssertUnwindSafe<tokio::runtime::task::harness::poll_future::closure_env$0<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,t
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\panicking.rs:557
45: tokio::runtime::builder::Builder::build_threaded_runtime
46: std::panicking::try
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\panicking.rs:521
47: std::panic::catch_unwind<core::panic::unwind_safe::AssertUnwindSafe<tokio::runtime::task::harness::poll_future::closure_env$0<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\std\src\panic.rs:350
48: tokio::runtime::task::harness::poll_future<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio::runtime::blocking::schedule::BlockingSchedule>
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:488
49: tokio::runtime::task::harness::Harness<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio::runtime::blocking::schedule::BlockingSchedule>::poll_inner<tokio::runtime::blocking::
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:209
50: tokio::runtime::task::harness::Harness<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio::runtime::blocking::schedule::BlockingSchedule>::poll<tokio::runtime::blocking::task::
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\harness.rs:154
51: tokio::runtime::task::raw::poll<tokio::runtime::blocking::task::BlockingTask<tokio::runtime::scheduler::multi_thread::worker::impl$0::launch::closure_env$0>,tokio::runtime::blocking::schedule::BlockingSchedule>
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\raw.rs:271
52: tokio::runtime::task::raw::RawTask::poll
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\raw.rs:201
53: tokio::runtime::task::UnownedTask<tokio::runtime::blocking::schedule::BlockingSchedule>::run<tokio::runtime::blocking::schedule::BlockingSchedule>
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\task\mod.rs:473
54: tokio::runtime::blocking::pool::Task::run
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\blocking\pool.rs:160
55: tokio::runtime::blocking::pool::Inner::run
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\blocking\pool.rs:518
56: tokio::runtime::blocking::pool::impl$6::spawn_thread::closure$0
at C:\Users\samuel.kearney\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tokio-1.40.0\src\runtime\blocking\pool.rs:476
57: core::hint::black_box
at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c\library\core\src\hint.rs:389
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
Additional context
No response
@amrbashir @lucasfernog You guys are awesome. Thanks!