Commit 29844db
committed
Fix viewport blanking after large programmatic scroll (setFrameSize re-entrance)
When `relocateViewport(to: docStart)` calls `setFrameSize(width, lineHeight)`
from a scrolled-down position, AppKit must synchronously retract the clip
view to fit the new bounds. That fires `prepareContent` from inside
`super.setFrameSize`, which calls `updateContentSizeIfNeeded` and re-enters
`setFrameSize` with the full document height. The recursive call correctly
resizes `contentView`. When control returns to the outer call, `newSize`
is still the original (small) value, and `contentView.frame.size = newSize`
stomps the recursive call's result.
End state: textView at full height, contentView and contentViewportView at
one-line height, fragment views past line 1 clipped. Manifests as
Cmd-End → Cmd-Home blanking the editor on a multi-screen word-wrapped
document. Resizing the window or toggling word-wrap restores rendering
because both go through a fresh non-re-entrant `setFrameSize`.
Fix: after `super.setFrameSize`, read `frame.size` (which reflects any
recursive resize) rather than the stale `newSize` parameter. When no
re-entrance occurred, `frame.size == newSize`, so the common path is
unchanged.1 parent c36bf60 commit 29844db
1 file changed
Lines changed: 9 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1465 | 1465 | | |
1466 | 1466 | | |
1467 | 1467 | | |
| 1468 | + | |
| 1469 | + | |
| 1470 | + | |
| 1471 | + | |
| 1472 | + | |
| 1473 | + | |
| 1474 | + | |
1468 | 1475 | | |
1469 | 1476 | | |
1470 | | - | |
| 1477 | + | |
1471 | 1478 | | |
1472 | | - | |
| 1479 | + | |
1473 | 1480 | | |
1474 | 1481 | | |
1475 | 1482 | | |
| |||
0 commit comments