@@ 259,6 259,8 @@ func (t *Tab) Back() bool {
if t.Busy() {
return false
}
+ t.mu.Lock()
+ defer t.mu.Unlock()
t.saveScroll()
if t.page > 0 {
t.page--
@@ 273,6 275,8 @@ func (t *Tab) Forward() bool {
if t.Busy() {
return false
}
+ t.mu.Lock()
+ defer t.mu.Unlock()
t.saveScroll()
if t.page < len(t.pages)-1 {
t.page++
@@ 332,7 336,7 @@ func (t *Tab) doContext(req *gemini.Request) context.Context {
req.Certificate = &cert
}
- t.newPage(req)
+ t.newPage()
return ctx
}
@@ 413,6 417,7 @@ func (t *Tab) do(ctx context.Context, req *gemini.Request, via []*gemini.Request
return nil
case gemini.StatusSuccess:
+ t.removeDuplicatePage()
t.buf.Reset()
resp.Body = &teeReader{resp.Body, &t.buf}
return t.handle(req, resp)
@@ 605,23 610,33 @@ func (t *Tab) shouldPromptRedirect(req *gemini.Request, via *gemini.Request) boo
return external || nonGemini
}
-func (t *Tab) newPage(req *gemini.Request) {
+func (t *Tab) newPage() {
+ t.mu.Lock()
+ defer t.mu.Unlock()
if len(t.pages) != 0 {
- if req.URL.String() == t.pages[t.page].URL {
- // Reset page style
- t.pages[t.page].Style = tcell.StyleDefault
- return
- }
- if t.page != len(t.pages)-1 {
+ t.page++
+ if t.page != len(t.pages) {
// Truncate history going forward
- t.pages = t.pages[:t.page+1]
+ t.pages = t.pages[:t.page]
}
- t.page++
}
-
t.pages = append(t.pages, Page{})
}
+func (t *Tab) removeDuplicatePage() {
+ t.mu.Lock()
+ defer t.mu.Unlock()
+ if len(t.pages) < 2 {
+ return
+ }
+ i, j := len(t.pages)-1, len(t.pages)-2
+ if t.pages[i].URL == t.pages[j].URL {
+ t.pages[j] = t.pages[i]
+ t.pages = t.pages[:i]
+ t.page--
+ }
+}
+
func (t *Tab) handle(req *gemini.Request, resp *gemini.Response) error {
defer resp.Body.Close()