From bacf8de72c2f52df28f44e5903fc89244a63be1d Mon Sep 17 00:00:00 2001 From: webdevtodayjason Date: Wed, 29 Apr 2026 18:56:00 -0500 Subject: [PATCH] Don't restore vertical-tabs panel when feature is disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Workspace::initial_vertical_tabs_panel_open` honored the persisted `window_snapshot.vertical_tabs_panel_open` value unconditionally when the feature was unusable in the current workspace. If a user previously had vertical tabs enabled and open, then later set `appearance.vertical_tabs.enabled = false`, restoring the workspace booted with `vertical_tabs_panel_open = true` while the panel itself never rendered (gated on `should_default_open`). The panel didn't render, but its `Dismiss` underlay did — and the underlay's `prevent_interaction_with_other_elements` swallowed every click while hover and keyboard input still worked, leaving the window visually responsive but functionally dead. The repeated `workspace_view:vertical_tabs_panel` position-cache warnings and `Dismiss underlay was clicked but no handler was set!` log lines came from this state. Fix: when `should_default_open` is false (feature flag off or vertical tabs disabled in settings), return `false` from `initial_vertical_tabs_panel_open` instead of falling through to the persisted snapshot. Adds a regression test covering the exact upgrade sequence in the report (snapshot panel-open while enabled → disable setting → restore → assert panel stays closed). Fixes #9505 --- app/src/workspace/view.rs | 7 ++++--- app/src/workspace/view_test.rs | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/app/src/workspace/view.rs b/app/src/workspace/view.rs index fefba56645..30140469fa 100644 --- a/app/src/workspace/view.rs +++ b/app/src/workspace/view.rs @@ -3734,9 +3734,10 @@ impl Workspace { NewWorkspaceSource::Restored { window_snapshot, .. } => { - if should_default_open - && *TabSettings::as_ref(ctx).show_vertical_tab_panel_in_restored_windows - { + if !should_default_open { + // Stale "panel open" snapshot would leave a click-eating dismiss underlay (#9505). + false + } else if *TabSettings::as_ref(ctx).show_vertical_tab_panel_in_restored_windows { true } else { window_snapshot.vertical_tabs_panel_open diff --git a/app/src/workspace/view_test.rs b/app/src/workspace/view_test.rs index d86ca4f45d..11150765eb 100644 --- a/app/src/workspace/view_test.rs +++ b/app/src/workspace/view_test.rs @@ -2392,6 +2392,41 @@ fn test_vertical_tabs_panel_restored_open_when_show_in_restored_windows_enabled( }); } +#[test] +fn test_vertical_tabs_panel_closed_when_disabled_even_if_persisted_open() { + // Regression for #9505: when `vertical_tabs_panel_open=true` is persisted + // and the user then disables vertical tabs, restoring the workspace must + // not honor the stale snapshot — otherwise a dismiss underlay paints over + // the window and silently swallows every click. + let _vertical_tabs_guard = FeatureFlag::VerticalTabs.override_enabled(true); + App::test((), |mut app| async move { + initialize_app(&mut app); + + // Snapshot the workspace with the panel open while vertical tabs are enabled. + app.update(|ctx| { + TabSettings::handle(ctx).update(ctx, |settings, ctx| { + report_if_error!(settings.use_vertical_tabs.set_value(true, ctx)); + }); + }); + let workspace = mock_workspace(&mut app); + let open_snapshot = workspace.update(&mut app, |workspace, ctx| { + workspace.vertical_tabs_panel_open = true; + workspace.snapshot(ctx.window_id(), false, ctx) + }); + + // Disable vertical tabs, then restore. The panel must stay closed. + app.update(|ctx| { + TabSettings::handle(ctx).update(ctx, |settings, ctx| { + report_if_error!(settings.use_vertical_tabs.set_value(false, ctx)); + }); + }); + let restored = restored_workspace(&mut app, open_snapshot); + restored.read(&app, |workspace, _| { + assert!(!workspace.vertical_tabs_panel_open); + }); + }); +} + #[test] fn test_vertical_tabs_panel_defaults_open_for_new_window_when_vertical_tabs_enabled() { let _vertical_tabs_guard = FeatureFlag::VerticalTabs.override_enabled(true);