Skip to content

Commit

Permalink
fix(viewport): preempt potential panics when calculating visible lines
Browse files Browse the repository at this point in the history
  • Loading branch information
meowgorithm committed Sep 2, 2024
1 parent 3eaf8da commit 1315e74
Showing 1 changed file with 15 additions and 5 deletions.
20 changes: 15 additions & 5 deletions viewport/viewport.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,17 @@ func (m Model) maxYOffset() int {
// visibleLines returns the lines that should currently be visible in the
// viewport.
func (m Model) visibleLines() (lines []string) {
if len(m.lines) > 0 {
top := max(0, m.YOffset)
bottom := clamp(m.YOffset+m.Height, top, len(m.lines))
lines = m.lines[top:bottom]
if len(m.lines) == 0 {
return nil
}
top := max(0, m.YOffset)
bottom := min(m.YOffset+m.Height, len(m.lines))
if top >= bottom {
// Return early, otherwise we'll panic with a slice out of bounds
// error.
return nil
}
return lines
return m.lines[top:bottom]
}

// scrollArea returns the scrollable boundaries for high performance rendering.
Expand Down Expand Up @@ -233,6 +238,11 @@ func (m *Model) GotoTop() (lines []string) {

// GotoBottom sets the viewport to the bottom position.
func (m *Model) GotoBottom() (lines []string) {
if len(m.lines) == 0 {
// If there are no lines, we can't go to the bottom...because we're
// already there.
return nil
}
m.SetYOffset(m.maxYOffset())
return m.visibleLines()
}
Expand Down

0 comments on commit 1315e74

Please sign in to comment.