42 lines
1.4 KiB
Go
42 lines
1.4 KiB
Go
//go:build js && wasm
|
|
|
|
package wasmruntime
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"kjol/wasmruntime/vdom"
|
|
)
|
|
|
|
// Floating.Panel and Modal both declare their initial inline style in the style
|
|
// ATTRIBUTE, then overwrite top/left/opacity imperatively with SetStyle. That only
|
|
// works because the reconciler skips setAttribute when the declared value has not
|
|
// changed. If that ever stops being true, every floating panel silently snaps back
|
|
// to visibility:hidden at 0,0 on the next re-render. Pin it.
|
|
func TestImperativeStylesSurviveReRender(t *testing.T) {
|
|
root := document.Call("createElement", "div")
|
|
panel := vdom.NewRef()
|
|
|
|
const declared = "position:fixed;top:0;left:0;visibility:hidden"
|
|
a := vdom.El("div", vdom.WithRef(panel), vdom.Attr("style", declared), vdom.Text("one"))
|
|
patchChildren(root, nil, one(a))
|
|
|
|
// Position it, the way Reposition does.
|
|
SetStyle(panel, "top", "120px")
|
|
SetStyle(panel, "left", "40px")
|
|
SetStyle(panel, "visibility", "visible")
|
|
|
|
// A re-render with the SAME declared style but different content.
|
|
b := vdom.El("div", vdom.WithRef(panel), vdom.Attr("style", declared), vdom.Text("two"))
|
|
patchChildren(root, one(a), one(b))
|
|
|
|
got := root.Get("innerHTML").String()
|
|
if !strings.Contains(got, "two") {
|
|
t.Fatalf("content did not update: %s", got)
|
|
}
|
|
if !strings.Contains(got, "top: 120px") || !strings.Contains(got, "visibility: visible") {
|
|
t.Errorf("imperative position was clobbered by the re-render:\n%s", got)
|
|
}
|
|
}
|