// html is allowed since it is the last command in the pipeline, but urlquery is not.
`predefined escaper "urlquery" disallowed in template`,
},
- // {
- // "<script>var tmpl = `asd {{.}}`;</script>",
- // `{{.}} appears in a JS template literal`,
- // },
- // {
- // "<script>var v = `${function(){return `{{.V}}+1`}()}`;</script>",
- // `{{.V}} appears in a JS template literal`,
- // },
- // {
- // "<script>var a = `asd ${function(){b = {1:2}; return`{{.}}`}}`</script>",
- // `{{.}} appears in a JS template literal`,
- // },
- // {
- // "<script>var tmpl = `${return `{{.}}`}`;</script>",
- // `{{.}} appears in a JS template literal`,
- // },
- // {
- // "<script>var tmpl = `${return {`{{.}}`}`;</script>",
- // `{{.}} appears in a JS template literal`,
- // },
}
for _, test := range tests {
buf := new(bytes.Buffer)
"<script>var foo = `x` + \"${",
context{state: stateJSDqStr, element: elementScript},
},
+ {
+ "<script>function f() { var a = `${}`; }",
+ context{state: stateJS, element: elementScript},
+ },
+ {
+ "<script>{`${}`}",
+ context{state: stateJS, element: elementScript},
+ },
+ {
+ "<script>`${ function f() { return `${1}` }() }`",
+ context{state: stateJS, element: elementScript, jsCtx: jsCtxDivOp},
+ },
+ {
+ "<script>function f() {`${ function f() { `${1}` } }`}",
+ context{state: stateJS, element: elementScript, jsCtx: jsCtxDivOp},
+ },
+ {
+ "<script>`${ { `` }`",
+ context{state: stateJS, element: elementScript},
+ },
+ {
+ "<script>`${ { }`",
+ context{state: stateJSTmplLit, element: elementScript},
+ },
}
for _, test := range tests {
c.state, i = stateJSLineCmt, i+1
}
case '{':
+ // We only care about tracking brace depth if we are inside of a
+ // template literal.
+ if c.jsTmplExprDepth == 0 {
+ return c, i + 1
+ }
c.jsBraceDepth++
case '}':
if c.jsTmplExprDepth == 0 {
}
func tJSTmpl(c context, s []byte) (context, int) {
+ c.jsBraceDepth = 0
var k int
for {
i := k + bytes.IndexAny(s[k:], "`\\$")
case '$':
if len(s) >= i+2 && s[i+1] == '{' {
c.jsTmplExprDepth++
+ c.jsBraceDepth = 0
c.state = stateJS
return c, i + 2
}