Skip to content

Commit 97445de

Browse files
committed
nil check
1 parent 5aed57b commit 97445de

2 files changed

Lines changed: 33 additions & 4 deletions

File tree

ui/jsvar.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"html/template"
77
"io"
8+
"reflect"
89
"regexp"
910
"strconv"
1011
"strings"
@@ -212,6 +213,14 @@ func NewJsVar[T any](l sync.Locker, v *T) *JsVar[T] {
212213
return &JsVar[T]{RWLocker: rwlocker{l}, Ptr: v}
213214
}
214215

216+
func isNilUI(ui core.UI) (yes bool) {
217+
if yes = (ui == nil); !yes {
218+
rv := reflect.ValueOf(ui)
219+
yes = rv.Kind() == reflect.Pointer && rv.IsNil()
220+
}
221+
return
222+
}
223+
215224
// JsVar binds a JsVar[T] to a named Javascript variable.
216225
//
217226
// You can also pass a JsVarMaker instead of a JsVar[T].
@@ -223,10 +232,12 @@ func (rqw RequestWriter) JsVar(jsvarname string, jsvar any, params ...any) (err
223232
if err == nil {
224233
err = ErrJsVarArgumentType
225234
if ui, ok := jsvar.(core.UI); ok {
226-
var newparams []any
227-
newparams = append(newparams, jsvarname)
228-
newparams = append(newparams, params...)
229-
err = rqw.UI(ui, newparams...)
235+
if !isNilUI(ui) {
236+
var newparams []any
237+
newparams = append(newparams, jsvarname)
238+
newparams = append(newparams, params...)
239+
err = rqw.UI(ui, newparams...)
240+
}
230241
}
231242
}
232243
}

ui/jsvar_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,24 @@ func TestJsVar_PathHooksAndRequestWriter(t *testing.T) {
191191
}
192192
}
193193

194+
func TestRequestWriterJsVarTypedNilDoesNotPanic(t *testing.T) {
195+
_, rq := newRequest(t)
196+
var sb bytes.Buffer
197+
rw := RequestWriter{Request: rq, Writer: &sb}
198+
199+
var nilJsVar *JsVar[int]
200+
201+
defer func() {
202+
if r := recover(); r != nil {
203+
t.Fatalf("JsVar should reject typed nil values with an error, got panic: %v", r)
204+
}
205+
}()
206+
207+
if err := rw.JsVar("typednil", nilJsVar); err == nil {
208+
t.Fatal("expected error for typed nil JsVar")
209+
}
210+
}
211+
194212
func TestJsVar_RenderParamValidation(t *testing.T) {
195213
_, rq := newRequest(t)
196214

0 commit comments

Comments
 (0)