shithub: mycel

Download patch

ref: ccb87a870380861973edfe358e9df1b163a50eb6
parent: 3d58c884fa97567ebb1b8b47bc8ceb8c75b2f680
author: Philip Silva <philip.silva@protonmail.com>
date: Fri Apr 2 10:20:14 EDT 2021

history remembers scroll position

diff: cannot open b/browser/history//null: file does not exist: 'b/browser/history//null'
--- a/browser/browser.go
+++ b/browser/browser.go
@@ -13,6 +13,7 @@
 	"net/http/cookiejar"
 	"net/url"
 	"github.com/psilva261/opossum"
+	"github.com/psilva261/opossum/browser/history"
 	"github.com/psilva261/opossum/img"
 	"github.com/psilva261/opossum/logger"
 	"github.com/psilva261/opossum/nodes"
@@ -1266,37 +1267,8 @@
 	}
 }
 
-type History struct {
-	urls []*url.URL
-}
-
-func (h History) URL() *url.URL {
-	return h.urls[len(h.urls)-1]
-}
-
-func (h *History) Push(u *url.URL) {
-	if len(h.urls) > 0 && h.urls[len(h.urls)-1].String() == u.String() {
-		return
-	}
-	h.urls = append(h.urls, u)
-}
-
-func (h *History) Back() {
-	if len(h.urls) > 1 {
-		h.urls = h.urls[:len(h.urls)-1]
-	}
-}
-
-func (h *History) String() string {
-	addrs := make([]string, len(h.urls))
-	for i, u := range h.urls {
-		addrs[i] = u.String()
-	}
-	return strings.Join(addrs, ", ")
-}
-
 type Browser struct {
-	History
+	history.History
 	dui       *duit.DUI
 	Website   *Website
 	StatusBar *duit.Label
@@ -1348,7 +1320,7 @@
 	if err != nil {
 		log.Fatalf("parse: %v", err)
 	}
-	b.History.Push(u)
+	b.History.Push(u, 0)
 
 	buf, _, err := b.get(u, true)
 	if err != nil {
@@ -1399,7 +1371,7 @@
 }
 
 func (b *Browser) Back() (e duit.Event) {
-	if len(b.History.urls) > 0 && !b.loading {
+	if !b.loading {
 		b.loading = true
 		b.History.Back()
 		b.LocationField.Text = b.History.URL().String()
@@ -1497,6 +1469,7 @@
 			}
 		})
 		PrintTree(b.Website.UI)
+		scroller.Offset = b.History.Scroll()
 		dui.MarkLayout(dui.Top.UI)
 		dui.MarkDraw(dui.Top.UI)
 		dui.Render()
@@ -1564,7 +1537,11 @@
 		buf = contentType.Utf8(buf)
 	}
 	if isNewOrigin {
-		b.History.Push(resp.Request.URL)
+		of := 0
+		if scroller != nil {
+			of = scroller.Offset
+		}
+		b.History.Push(resp.Request.URL, of)
 		log.Printf("b.History is now %s", b.History.String())
 		b.LocationField.Text = b.URL().String()
 	}
@@ -1587,7 +1564,7 @@
 		return nil, opossum.ContentType{}, fmt.Errorf("error loading %v: %w", uri, err)
 	}
 	defer resp.Body.Close()
-	b.History.Push(resp.Request.URL)
+	b.History.Push(resp.Request.URL, scroller.Offset)
 	buf, err = ioutil.ReadAll(resp.Body)
 	if err != nil {
 		return nil, opossum.ContentType{}, fmt.Errorf("error reading")
--- a/browser/browser_test.go
+++ b/browser/browser_test.go
@@ -127,7 +127,7 @@
 		if err != nil {
 			panic(err.Error())
 		}
-		b.History.Push(origin)
+		b.History.Push(origin, 0)
 		res, err := b.LinkedUrl(i.href)
 		if err != nil {
 			panic(err.Error())
@@ -171,7 +171,7 @@
 	if err != nil {
 		log.Fatalf("parse: %v", err)
 	}
-	b.History.Push(u)
+	b.History.Push(u, 0)
 	nt := nodes.NewNodeTree(body, style.Map{}, nodeMap, nil)
 	boxed := NodeToBox(0, b, nt)
 	numInputs := 0
@@ -201,7 +201,7 @@
 	if err != nil {
 		return nil, nil, fmt.Errorf("parse url: %w", err)
 	}
-	b.History.Push(u)
+	b.History.Push(u, 0)
 	nm, err := style.FetchNodeMap(doc, style.AddOnCSS, 1280)
 	if err != nil {
 		return nil, nil, fmt.Errorf("FetchNodeMap: %w", err)
@@ -387,27 +387,6 @@
 	el := NewTextArea(ta)
 	// Trigger key press to trigger call to changed
 	el.Key(nil, nil, 'a', draw.Mouse{}, image.Point{})
-}
-
-func TestHistoryNoDup(t *testing.T) {
-	h := History{}
-	uris := []string{
-		"https://example.com",
-		"https://example.com/a",
-		"https://example.com/a",
-		"https://example.com/b",
-		"https://example.com/b",
-	}
-	for _, uri := range uris {
-		u, err := url.Parse(uri)
-		if err != nil {
-			t.Error()
-		}
-		h.Push(u)
-	}
-	if len(h.urls) != 3 {
-		t.Error()
-	}
 }
 
 func TestNewPicture(t *testing.T) {
--- /dev/null
+++ b/browser/history/history.go
@@ -1,0 +1,52 @@
+package history
+
+import (
+	"net/url"
+	"strings"
+)
+
+type History struct {
+	items []Item
+}
+
+func (h History) URL() *url.URL {
+	return h.items[len(h.items)-1].URL
+}
+
+func (h *History) Push(u *url.URL, oldScroll int) {
+	if len(h.items) > 0 {
+		if h.items[len(h.items)-1].URL.String() == u.String() {
+			return
+		}
+		h.setScroll(oldScroll)
+	}
+	it := Item{u, 0}
+	h.items = append(h.items, it)
+}
+
+func (h *History) Back() {
+	if len(h.items) > 1 {
+		h.items = h.items[:len(h.items)-1]
+	}
+}
+
+func (h *History) String() string {
+	addrs := make([]string, len(h.items))
+	for i, it := range h.items {
+		addrs[i] = it.URL.String()
+	}
+	return strings.Join(addrs, ", ")
+}
+
+func (h *History) Scroll() int {
+	return h.items[len(h.items)-1].Scroll
+}
+
+func (h *History) setScroll(s int) {
+	h.items[len(h.items)-1].Scroll = s
+}
+
+type Item struct {
+	*url.URL
+	Scroll int
+}
--- /dev/null
+++ b/browser/history/history_test.go
@@ -1,0 +1,27 @@
+package history
+
+import (
+	"net/url"
+	"testing"
+)
+
+func TestNoDup(t *testing.T) {
+	h := History{}
+	uris := []string{
+		"https://example.com",
+		"https://example.com/a",
+		"https://example.com/a",
+		"https://example.com/b",
+		"https://example.com/b",
+	}
+	for _, uri := range uris {
+		u, err := url.Parse(uri)
+		if err != nil {
+			t.Error()
+		}
+		h.Push(u, 0)
+	}
+	if len(h.items) != 3 {
+		t.Error()
+	}
+}