ref: 905263542c6f19b3d66f94e323995af7880c9355
parent: ccb87a870380861973edfe358e9df1b163a50eb6
author: Philip Silva <philip.silva@protonmail.com>
date: Fri Apr 2 11:59:22 EDT 2021
cache more than 1 website
--- 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/cache"
"github.com/psilva261/opossum/browser/history"
"github.com/psilva261/opossum/img"
"github.com/psilva261/opossum/logger"
@@ -59,10 +60,6 @@
var dui *duit.DUI
var colorCache = make(map[draw.Color]*draw.Image)
var imageCache = make(map[string]*draw.Image)
-var cache = make(map[string]struct {- opossum.ContentType
- buf []byte
-})
var log *logger.Logger
var scroller *Scroll
var display *draw.Display
@@ -1448,11 +1445,8 @@
}
func (b *Browser) render(buf []byte) {- log.Printf("Empty cache...")- cache = make(map[string]struct {- opossum.ContentType
- buf []byte
- })
+ log.Printf("Empty some cache...")+ cache.Tidy()
imageCache = make(map[string]*draw.Image)
b.Website.html = string(buf) // TODO: correctly interpret UTF8
@@ -1479,17 +1473,18 @@
}
func (b *Browser) Get(uri *url.URL) (buf []byte, contentType opossum.ContentType, err error) {- c, ok := cache[uri.String()]
+ c, ok := cache.Get(uri.String())
if ok { log.Printf("use %v from cache", uri) } else {- c.buf, c.ContentType, err = b.get(uri, false)
+ c.Addr = uri.String()
+ c.Buf, c.ContentType, err = b.get(uri, false)
if err == nil {- cache[uri.String()] = c
+ cache.Set(c)
}
}
- return c.buf, c.ContentType, err
+ return c.Buf, c.ContentType, err
}
func (b *Browser) statusBarMsg(msg string, emptyBody bool) {--- /dev/null
+++ b/browser/cache/cache.go
@@ -1,0 +1,53 @@
+package cache
+
+import (
+ "github.com/psilva261/opossum"
+ "sort"
+ "time"
+)
+
+var c = make(Items, 0, 100)
+
+type Items []*Item
+
+func (is Items) Len() int {+ return len(is)
+}
+
+func (is Items) Swap(i, j int) {+ is[i], is[j] = is[j], is[i]
+}
+
+func (is Items) Less(i, j int) bool {+ return is[i].Used.After(is[j].Used)
+}
+
+type Item struct {+ Addr string
+ opossum.ContentType
+ Buf []byte
+ Used time.Time
+}
+
+func Get(addr string) (i Item, ok bool) {+ for _, it := range c {+ if it.Addr == addr {+ it.Used = time.Now()
+ return *it, true
+ }
+ }
+ return
+}
+
+func Set(i Item) {+ i.Used = time.Now()
+ c = append(c, &i)
+}
+
+func Tidy() {+ if len(c) < 100 {+ return
+ }
+ sort.Stable(c)
+ c = c[0:50]
+}
--
⑨