{"record":{"id":"75162a688a92d7ee","repo":"lencx/ChatGPT","slug":"view-main-failed-to-get-webview-window","errorCode":null,"errorMessage":"[view:main] Failed to get webview window","messagePattern":"\\[view:main\\] Failed to get webview window","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src-tauri/src/core/setup.rs","lineNumber":190,"sourceCode":"                    if let Err(e) = view.set_position(position) {\n                        eprintln!(\"[view:position] Failed to set view position: {}\", e);\n                    }\n                    if let Err(e) = view.set_size(size) {\n                        eprintln!(\"[view:size] Failed to set view size: {}\", e);\n                    }\n                };\n\n            win.on_window_event(move |event| {\n                let conf = &AppConf::load(&handle).unwrap();\n                let ask_mode_height = if conf.ask_mode { ASK_HEIGHT } else { 0.0 };\n                let ask_height = (scale_factor * ask_mode_height).round() as u32;\n\n                if let WindowEvent::Resized(size) = event {\n                    let win = window_clone.lock().unwrap();\n\n                    let main_view = win\n                        .get_webview(\"main\")\n                        .expect(\"[view:main] Failed to get webview window\");\n                    let titlebar_view = win\n                        .get_webview(\"titlebar\")\n                        .expect(\"[view:titlebar] Failed to get webview window\");\n                    let ask_view = win\n                        .get_webview(\"ask\")\n                        .expect(\"[view:ask] Failed to get webview window\");\n\n                    #[cfg(target_os = \"macos\")]\n                    {\n                        set_view_properties(\n                            &main_view,\n                            LogicalPosition::new(0.0, TITLEBAR_HEIGHT),\n                            PhysicalSize::new(\n                                size.width,\n                                size.height - (titlebar_height + ask_height),\n                            ),\n                        );\n                        set_view_properties(","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/lencx/ChatGPT/blob/a6de9a8b61077fa63ad5c3ecbe2bc12e0cb4b4b9/src-tauri/src/core/setup.rs#L172-L208","documentation":"Panic from win.get_webview(\"main\") returning None inside the WindowEvent::Resized handler. get_webview(label) is a registry lookup on the Manager trait; it yields None when no webview with that label is currently attached to the window. The \"main\" webview is added later in setup via win.add_child(main_view, ...), so any Resized event delivered before that add_child completes — or after teardown removes the webview during window close — hits the .expect() and panics on the main thread.","triggerScenarios":"A Resized event arriving during startup before add_child(main_view) finishes (async spawn races the main-thread event loop; common on Linux where mapping a window emits Resized immediately); minimize/restore or close sequences where child webviews are destroyed before the window's event handler is disconnected; the add_child at setup.rs:130 failing (its own .unwrap()) so \"main\" was never registered.","commonSituations":"Window snapping/tiling on Linux (many Resized events at odd lifecycle moments); app shutdown with a resize in flight; CI/WM environments (i3, sway) that resize windows at map time; tauri v2 multi-webview API where child webviews drop before the parent window's handlers.","solutions":["Replace .expect() with if let Some/let-else and skip the relayout when the webview is not (yet/anymore) present","Register the on_window_event handler only after all three add_child calls succeed, reducing the startup window","Deregister the resize logic on WindowEvent::Destroyed, or check event discriminants before touching webviews","Log the miss at debug level to diagnose lifecycle races without panicking"],"exampleFix":"// before\nlet main_view = win\n    .get_webview(\"main\")\n    .expect(\"[view:main] Failed to get webview window\");\n\n// after\nlet Some(main_view) = win.get_webview(\"main\") else {\n    eprintln!(\"[view:main] webview not ready; skipping resize\");\n    return;\n};","handlingStrategy":"type-guard","validationCode":"// before registering the resize handler\nlet all_present = [\"main\", \"titlebar\", \"ask\"]\n    .iter()\n    .all(|label| win.get_webview(label).is_some());\nassert!(all_present, \"webviews must be attached before resize handling\");","typeGuard":"fn webviews_attached(win: &tauri::Window) -> bool {\n    [\"main\", \"titlebar\", \"ask\"].iter().all(|l| win.get_webview(l).is_some())\n}","tryCatchPattern":"let Some(main_view) = win.get_webview(\"main\") else {\n    eprintln!(\"[view:main] webview not ready; skipping resize\");\n    return;\n};","preventionTips":["Never .expect() registry lookups inside event handlers — labels come and go with lifecycle","Register on_window_event after all add_child calls succeed","Ignore resize work once Destroyed/CloseRequested begins teardown"],"tags":["tauri","webview","window-events","race-condition","lifecycle","panic"],"backgroundTag":null,"analyzedSha":"a6de9a8b61077fa63ad5c3ecbe2bc12e0cb4b4b9","analyzedAt":"2026-08-16T08:31:13.240Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}