Dialog-collision crash fix, FlaUI e2e suite, branded splash (beta.10) #29

Merged
KofTwentyTwo merged 1 commits from dev into main 2026-07-04 23:03:49 +00:00
KofTwentyTwo commented 2026-07-04 22:56:58 +00:00 (Migrated from github.com)

What

  • Fixes a process-killing crash (issue class behind every UI-test failure and reproducible by real users): a second ContentDialog.ShowAsync() while one is open throws COMException 0x80000019; escaping an async void handler it took the whole app down as a stowed exception (0xc000027b in Microsoft.UI.Xaml.dll). All nine dialog sites now open through a single DialogGuard chokepoint that no-ops while a dialog is up, and App gains a last-resort UnhandledException net that logs to the activity log and keeps running.
  • Adds gclo.UiTests: FlaUI/UIA end-to-end tests driving the real gclo.exe against an isolated GCLO_DATA_DIR (new GcloPaths seam). Eight token-free tests: launch, navigation pane, connect card, Settings/About/wizard dialog round-trips, offline token input, and a regression test that reproduces the dialog collision. New non-required CI job runs them on a hosted runner (self-contained Windows App SDK build).
  • Adds the branded startup splash as an in-window overlay (brand gradient, wordmark, version + git hash, indeterminate strip, 800 ms hold + fade). Deliberately not a second Window: closing a window while UIA/assistive tech queries it is the crash class we just escaped.

Evidence

  • Root cause extracted from the WER minidump via dotnet-dump (pe on the unhandled exception showed the full managed stack: ShowAsync → ShowAccountWizardAsync → WorkspaceNav_SelectionChanged).
  • Regression test failed against the unfixed build (fresh crash dump on demand), passes after the fix.
  • Local gates: solution builds with -warnaserror (0 warnings), 201 unit tests, 8/8 UI tests, dotnet format clean.

🤖 Generated with Claude Code

## What - **Fixes a process-killing crash** (issue class behind every UI-test failure and reproducible by real users): a second `ContentDialog.ShowAsync()` while one is open throws `COMException 0x80000019`; escaping an `async void` handler it took the whole app down as a stowed exception (`0xc000027b` in Microsoft.UI.Xaml.dll). All nine dialog sites now open through a single `DialogGuard` chokepoint that no-ops while a dialog is up, and `App` gains a last-resort `UnhandledException` net that logs to the activity log and keeps running. - **Adds `gclo.UiTests`**: FlaUI/UIA end-to-end tests driving the real `gclo.exe` against an isolated `GCLO_DATA_DIR` (new `GcloPaths` seam). Eight token-free tests: launch, navigation pane, connect card, Settings/About/wizard dialog round-trips, offline token input, and a regression test that reproduces the dialog collision. New non-required CI job runs them on a hosted runner (self-contained Windows App SDK build). - **Adds the branded startup splash** as an in-window overlay (brand gradient, wordmark, version + git hash, indeterminate strip, 800 ms hold + fade). Deliberately not a second `Window`: closing a window while UIA/assistive tech queries it is the crash class we just escaped. ## Evidence - Root cause extracted from the WER minidump via `dotnet-dump` (`pe` on the unhandled exception showed the full managed stack: `ShowAsync` → `ShowAccountWizardAsync` → `WorkspaceNav_SelectionChanged`). - Regression test failed against the unfixed build (fresh crash dump on demand), passes after the fix. - Local gates: solution builds with `-warnaserror` (0 warnings), 201 unit tests, 8/8 UI tests, `dotnet format` clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.