tauri-apps/tauri

[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!