From 67db38133299daa6cab02a4590875056bb3951a1 Mon Sep 17 00:00:00 2001 From: Adnan Maolood Date: Wed, 22 Sep 2021 13:14:39 -0400 Subject: [PATCH] tab: Prevent duplicate history entries Resolves #55 --- tab.go | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/tab.go b/tab.go index 58f99fe..70c8b47 100644 --- a/tab.go +++ b/tab.go @@ -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() -- 2.38.5