You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Consolidates the QuickFiler review residuals filed as #793 (from the #791 Cancel-teardown review) and #808 (from the #796 drop-down review). They share the teardown path: #808's lead finding is that the new AC2 self-inflicted-deactivation guard in QfcFormController.ParkFocusAndCancelSelectors also gates the #791 Cancel teardown caller, where its predicate has no meaning, so the teardown's synchronous selector-cancel stage is skipped whenever a popup is open; #793 is two residual teardown defects in the same controllers, a disposed shared CancellationTokenSource that later sharers still Cancel(), and a ribbon-release callback invoked without a finally. The remaining #808 items (commit-pending latch never cleared on consumption, stale FinishClose comment, dead SearchOwnsDropDownDismissal accessor, untested AC2 producer) sit in the same files.
(Bug: quickfiler-dropdown-796-post-merge-review-residuals #808 CR-3) Open the folder drop-down on any item, then trigger Cancel. The park-focus teardown stage (QfcFormController.EventHandlers.cs ~line 144) calls ParkFocusAndCancelSelectors, whose guard (QfcFormController.Deactivate.cs ~line 118) treats the open popup as a self-inflicted deactivation and skips every selector cancel; the popup is closed only later by ItemViewer.ResetBreadcrumb through a posted, fire-and-forget reset.
(Bug: quickfiler-teardown-disposed-tokensource-and-unprotected-release-link #793 N1) QfcHomeController.Cleanup() disposes _tokenSource without nulling it; QfcDatamodel.Cleanup() and QuiesceLoaderAsync() call _tokenSource?.Cancel() on the shared source, which throws ObjectDisposedException once reached after disposal.
(Bug: quickfiler-dropdown-796-post-merge-review-residuals #808 CR-2) Open the popup, commit a selection (sets IsCommitPending), then cause the next open to throw before ShowPopup; RestoreAfterOpenFailure (BreadcrumbDropDownHost.cs ~line 455) calls FinishClose(Uncommitted) and the stale latch suppresses the cancel, leaving a selector session open with no popup.
Expected Behavior
The AC2 guard applies only to the Form.Deactivate caller; the Cancel teardown's park-focus stage cancels every open selector synchronously, preserving the Bug: quickfiler-high-confidence-cancel-teardown-and-deadline-defects #791 ordering guarantee and the class-level invariant that no breadcrumb popup may survive teardown (WinForms modal menu mode would keep redirecting keyboard messages to it).
Disposing the shared token source cannot make a later Cancel() throw; the ribbon release callback runs under finally exactly once regardless of which stage threw.
The commit-pending latch lives for exactly one popup lifetime on every path.
Comments match the gate placement; no dead accessor; the AC2 producer has an automated test.
Actual Behavior
As in the reproduction steps. All are latent today: #808 CR-3 is mitigated later in teardown by the reset chain (weakened ordering, not lost responsibility); #793 N1 is unreachable only because RibbonController never calls QfcHomeController.Cleanup() directly; #793 N2 needs a throwing viewer dispose.
Medium: #808 CR-3 was rated Major/latent by its reviewer because it touches the #677 keyboard-lock class, and #793 breaks the single-release-callback invariant #791 established once any caller reaches the unguarded paths.
Summary
Consolidates the QuickFiler review residuals filed as #793 (from the #791 Cancel-teardown review) and #808 (from the #796 drop-down review). They share the teardown path: #808's lead finding is that the new AC2 self-inflicted-deactivation guard in
QfcFormController.ParkFocusAndCancelSelectorsalso gates the #791 Cancel teardown caller, where its predicate has no meaning, so the teardown's synchronous selector-cancel stage is skipped whenever a popup is open; #793 is two residual teardown defects in the same controllers, a disposed sharedCancellationTokenSourcethat later sharers stillCancel(), and a ribbon-release callback invoked without afinally. The remaining #808 items (commit-pending latch never cleared on consumption, staleFinishClosecomment, deadSearchOwnsDropDownDismissalaccessor, untested AC2 producer) sit in the same files.Environment
mainat04a54e68(PR fix(796): keep the QuickFiler folder drop-down open and commit row selection before cancel #807 merge commit)evidence/other/Steps to Reproduce
park-focusteardown stage (QfcFormController.EventHandlers.cs~line 144) callsParkFocusAndCancelSelectors, whose guard (QfcFormController.Deactivate.cs~line 118) treats the open popup as a self-inflicted deactivation and skips every selector cancel; the popup is closed only later byItemViewer.ResetBreadcrumbthrough a posted, fire-and-forget reset.QfcHomeController.Cleanup()disposes_tokenSourcewithout nulling it;QfcDatamodel.Cleanup()andQuiesceLoaderAsync()call_tokenSource?.Cancel()on the shared source, which throwsObjectDisposedExceptiononce reached after disposal.QfcFormController.Cleanup()(SetupDisposal.cs~line 259) invokes_parentCleanup?.Invoke()as its last statement with nofinally; a throw from the viewer dispose at ~line 251 skips the ribbon release callback.IsCommitPending), then cause the next open to throw beforeShowPopup;RestoreAfterOpenFailure(BreadcrumbDropDownHost.cs~line 455) callsFinishClose(Uncommitted)and the stale latch suppresses the cancel, leaving a selector session open with no popup.Expected Behavior
Form.Deactivatecaller; the Cancel teardown'spark-focusstage cancels every open selector synchronously, preserving the Bug: quickfiler-high-confidence-cancel-teardown-and-deadline-defects #791 ordering guarantee and the class-level invariant that no breadcrumb popup may survive teardown (WinForms modal menu mode would keep redirecting keyboard messages to it).Cancel()throw; the ribbon release callback runs underfinallyexactly once regardless of which stage threw.Actual Behavior
As in the reproduction steps. All are latent today: #808 CR-3 is mitigated later in teardown by the reset chain (weakened ordering, not lost responsibility); #793 N1 is unreachable only because
RibbonControllernever callsQfcHomeController.Cleanup()directly; #793 N2 needs a throwing viewer dispose.Logs / Screenshots
docs/features/active/2026-09-06-quickfiler-high-confidence-cancel-teardown-and-deadline-defects-791/code-review.2026-09-06T15-31.md(N1, N2);docs/features/active/2026-09-06-quickfiler-folder-dropdown-closes-on-open-and-click-does-not-select-796/code-review.2026-09-07T17-05.md(CR-1, CR-2, CR-3, CR-4, CR-7).Impact / Severity
Medium: #808 CR-3 was rated Major/latent by its reviewer because it touches the #677 keyboard-lock class, and #793 breaks the single-release-callback invariant #791 established once any caller reaches the unguarded paths.
Source
From: docs/features/potential/2026-09-07-quickfiler-teardown-and-dropdown-residuals-793-808.md