Skip to content

Comments

Fix scroll position loss on expanded/collapsed mode switch#134

Open
PureWeen wants to merge 1 commit intomainfrom
fix/when-i-switch-between-expanded-and-colla-20260217-1748
Open

Fix scroll position loss on expanded/collapsed mode switch#134
PureWeen wants to merge 1 commit intomainfrom
fix/when-i-switch-between-expanded-and-colla-20260217-1748

Conversation

@PureWeen
Copy link
Owner

Summary

This PR fixes two bugs:

Bug 1: Scroll position resets when switching modes

When switching between expanded (single session view) and collapsed (grid view) modes, the scroll position would reset to bottom instead of being preserved.

Root cause: Both \ExpandSession()\ and \CollapseExpanded()\ unconditionally set _needsScrollToBottom = true, which forced all .messages\ containers to scroll to bottom.

Fix:

  • Added \saveScrollPositions\ and
    estoreScrollPositions\ JavaScript functions
  • Added _needsScrollRestore\ flag to distinguish mode switches from scroll-to-bottom scenarios
  • Modified \ExpandSession(), \CollapseExpanded(), \JsExpandSession(), and \JsCollapseToGrid()\ to save scroll positions before switching and restore them after

Bug 2: SemaphoreSlim disposed exception (crash log)

\
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Threading.SemaphoreSlim'.
at System.Threading.SemaphoreSlim.Release()
at WsBridgeServer.Broadcast()
\\

Root cause: In \Broadcast(), there was a race condition where the semaphore \sendLock\ could be disposed by a concurrent cleanup while \Task.Run\ was still using it.

Fix: Added try-catch blocks around \WaitAsync()\ and \Release()\ calls to gracefully handle \ObjectDisposedException.

Changes

  • \PolyPilot/wwwroot/index.html: Added scroll position save/restore functions
  • \PolyPilot/Components/Pages/Dashboard.razor: Added _needsScrollRestore\ flag and modified mode switch methods
  • \PolyPilot/Services/WsBridgeServer.cs: Fixed SemaphoreSlim race condition in \Broadcast()\
  • \PolyPilot.Tests/WsBridgeServerConcurrencyTests.cs: Added unit tests for SemaphoreSlim disposal pattern
  • \PolyPilot.Tests/Scenarios/mode-switch-scenarios.json: Added UI scenario test for scroll preservation

Testing

  • Build verified on Windows (
    et10.0-windows10.0.19041.0)
  • Unit tests added for SemaphoreSlim concurrency patterns

- Save scroll positions before mode switch and restore them after
- Add saveScrollPositions/restoreScrollPositions JS functions
- Replace _needsScrollToBottom with _needsScrollRestore for mode switches
- Fix WsBridgeServer SemaphoreSlim race condition in Broadcast()
- Handle ObjectDisposedException when semaphore disposed during async send
- Add unit tests for SemaphoreSlim concurrency patterns
- Add UI scenario test for scroll position preservation

Fixes: scroll position resets when switching between expanded and grid view
Fixes: unobserved exception 'Cannot access disposed SemaphoreSlim' in crash log

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant