~adnano/astronaut

67db38133299daa6cab02a4590875056bb3951a1 — Adnan Maolood a month ago 417eb03
tab: Prevent duplicate history entries

Resolves #55
1 files changed, 26 insertions(+), 11 deletions(-)

M tab.go
M tab.go => tab.go +26 -11
@@ 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()