ref: 2e8eb15b7f930db7469914a1ce70bdec608a9349
parent: ac32db32e14093022a4e363f808659191ce43cca
author: Philip Silva <philip.silva@protonmail.com>
date: Sat Jan 30 22:57:44 EST 2021
More gracefully continue when single scripts fail
--- a/browser/experimental.go
+++ b/browser/experimental.go
@@ -4,10 +4,9 @@
"fmt"
"image"
"github.com/psilva261/opossum/domino"
- "github.com/psilva261/opossum/nodes"
-
"9fans.net/go/draw"
"github.com/mjl-/duit"
+ "strings"
)
type AtomBox struct {
@@ -121,14 +120,16 @@
})
}
-func processJS2(d *domino.Domino, doc *nodes.Node, scripts []string) (resHtm string, err error) {
+func processJS2(d *domino.Domino, scripts []string) (resHtm string, err error) {
initialized := false
for _, script := range scripts {
- if _, err := d.Exec/*6*/(script, !initialized); err == nil {
- initialized = true
- } else {
+ if _, err := d.Exec/*6*/(script, !initialized); err != nil {
+ if strings.Contains(err.Error(), "halt at") {
+ return "", fmt.Errorf("execution halted: %w", err)
+ }
log.Errorf("exec <script>: %v", err)
}
+ initialized = true
}
resHtm, changed, err := d.TrackChanges()
--- a/browser/experimental_test.go
+++ b/browser/experimental_test.go
@@ -1,11 +1,63 @@
package browser
import (
+ "golang.org/x/net/html"
//"github.com/mjl-/duit"
+ "github.com/psilva261/opossum/domino"
+ "github.com/psilva261/opossum/logger"
+ "github.com/psilva261/opossum/nodes"
+ "github.com/psilva261/opossum/style"
+ "io/ioutil"
+ "strings"
"testing"
)
+func init() {
+ quiet := false
+ logger.Quiet = &quiet
+ f := false
+ domino.DebugDumpJS = &f
+ domino.SetLogger(&logger.Logger{})
+ logger.Init()
+ SetLogger(&logger.Logger{})
+ style.Init(nil, &logger.Logger{})
+}
+
func TestAtom(t *testing.T) {
//var ui duit.UI
//ui = &Atom{}
+}
+
+func TestProcessJS2SkipFailure(t *testing.T) {
+ h := `
+ <html>
+ <body>
+ <h1 id="title">Hello</h1>
+ </body>
+ </html>
+ `
+ buf := strings.NewReader(h)
+ doc, err := html.Parse(buf)
+ if err != nil { t.Fatalf(err.Error()) }
+ nt := nodes.NewNodeTree(doc, style.Map{}, make(map[*html.Node]style.Map), nil)
+ d := domino.NewDomino(h, nt)
+ d.Start()
+ jq, err := ioutil.ReadFile("../domino/jquery-3.5.1.js")
+ if err != nil {
+ t.Fatalf("%v", err)
+ }
+ scripts := []string{
+ string(jq),
+ `throw 'fail';`,
+ `throw 'fail';`,
+ `$('body').hide()`,
+ `throw 'fail';`,
+ }
+ h, err = processJS2(d, scripts)
+ if err != nil { t.Errorf(err.Error()) }
+ t.Logf("h = %+v", h)
+ if !strings.Contains(h, `<body style="display: none;">`) {
+ t.Fail()
+ }
+ d.Stop()
}
--- a/browser/website.go
+++ b/browser/website.go
@@ -90,7 +90,7 @@
log.Printf("css: unexpected %v", contentType)
}
}
- csss = append([]string{ /*string(revertCSS), */ style.AddOnCSS}, csss...)
+ csss = append([]string{style.AddOnCSS}, csss...)
doc, nodeMap := pass(w.html, csss...)
// 3rd pass is only needed initially to load the scripts and set the goja VM
@@ -122,7 +122,7 @@
}
w.d = domino.NewDomino(w.html, nt)
w.d.Start()
- jsProcessed, err := processJS2(w.d, nt, codes)
+ jsProcessed, err := processJS2(w.d, codes)
if err == nil {
if w.html != jsProcessed {
log.Infof("html changed")
--- a/domino/domino.go
+++ b/domino/domino.go
@@ -19,7 +19,7 @@
var DebugDumpJS *bool
var log *logger.Logger
-var timeout = 10*time.Second
+var timeout = 20*time.Second
func SetLogger(l *logger.Logger) {
log = l
@@ -26,7 +26,6 @@
}
type Domino struct {
- initialized bool
loop *eventloop.EventLoop
html string
nt *nodes.Node
@@ -102,9 +101,6 @@
}
func (d *Domino) Exec(script string, initial bool) (res string, err error) {
- if !initial && !d.initialized {
- initial = true
- }
script = strings.Replace(script, "const ", "var ", -1)
script = strings.Replace(script, "let ", "var ", -1)
script = strings.Replace(script, "<!--", "", -1)
@@ -237,10 +233,10 @@
if v != nil {
res = v.String()
}
- if err == nil { d.initialized=true }
goto cleanup
case er := <- errCh:
log.Infof("err")
+ <-time.After(10 * time.Millisecond)
err = fmt.Errorf("event loop: %w", er)
goto cleanup
case <-time.After(timeout):