src/go/build/deps_test.go | 6 +++--- src/html/template/context.go | 14 ++++++++++++++ src/html/template/escape.go | 26 ++++++++++++++++++++++++++ src/html/template/escape_test.go | 47 ++++++++++++++++++++++++++++++++++++++++++++++- src/html/template/transition.go | 15 +++++++++++++++ diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 2f335068b8a62fea40cc699681d333c983ab243b..bea398fa9566e8928b58463bf2c1ffff6b34a696 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -245,14 +245,14 @@ net/url, text/template/parse < text/template < internal/lazytemplate; - encoding/json, html, text/template - < html/template; - # regexp FMT < regexp/syntax < regexp < internal/lazyregexp; + + encoding/json, html, text/template, regexp + < html/template; # suffix array encoding/binary, regexp diff --git a/src/html/template/context.go b/src/html/template/context.go index e07a0c4a027d06fd1ae74241fc50bd70a287dddc..7987713c65b614f209b1a0e36dcd65236c576676 100644 --- a/src/html/template/context.go +++ b/src/html/template/context.go @@ -174,6 +174,20 @@ } return false } +// isInScriptLiteral returns true if s is one of the literal states within a +// " instead of "/*" or "//" cs -= 1 } b.Write(s[written:cs]) + written = i1 + } + if isInScriptLiteral(c.state) && containsSpecialScriptTag(s[i:i1]) { + b.Write(s[written:i]) + b.Write(escapeSpecialScriptTags(s[i:i1])) written = i1 } if i == i1 && c.state == c1.state { diff --git a/src/html/template/escape_test.go b/src/html/template/escape_test.go index f60c875927011df9e94874565e360759c79c39f4..8a4f62e92fae73ddc753ea4b5e7c14d3af3748e1 100644 --- a/src/html/template/escape_test.go +++ b/src/html/template/escape_test.go @@ -514,6 +514,21 @@ "", "", }, { + "Special tags in `, + ``, + }, + { "CSS comments", "`, @@ -1533,8 +1548,38 @@ ` should not + // cause us to exit the JS state. `");`, - context{state: stateText}, + context{state: stateJS, element: elementScript}, + }, + { + ``, + context{state: stateJSDqStr, element: elementScript}, + }, + { + `