]> Cypherpunks repositories - gostls13.git/commitdiff
html/template: export the parse.Tree for the escaped template
authorRob Pike <r@golang.org>
Wed, 4 Sep 2013 22:23:11 +0000 (08:23 +1000)
committerRob Pike <r@golang.org>
Wed, 4 Sep 2013 22:23:11 +0000 (08:23 +1000)
The underlying parse tree is visible in text/template, so it should be visible here.
Done by copying the underlying *parse.Tree up to the top level of the struct, and then making sure it's kept up to date.
Fixes #6318.

R=mikesamuel
CC=golang-dev
https://golang.org/cl/13479044

src/pkg/html/template/escape.go
src/pkg/html/template/escape_test.go
src/pkg/html/template/template.go

index f2a4c8acaafd3f4ce3caad79c996c76ced9ddb12..9ae9749db0c408220e83ee45cfd70e24fd872dd9 100644 (file)
@@ -35,11 +35,13 @@ func escapeTemplates(tmpl *Template, names ...string) error {
                        for _, name := range names {
                                if t := tmpl.set[name]; t != nil {
                                        t.text.Tree = nil
+                                       t.Tree = nil
                                }
                        }
                        return err
                }
                tmpl.escaped = true
+               tmpl.Tree = tmpl.text.Tree
        }
        e.commit()
        return nil
index 4c349d96182a1144f60d0b6fd1df74169878c8a9..befdb215bedd0bd13728e049effe5a67de91980e 100644 (file)
@@ -673,6 +673,10 @@ func TestEscape(t *testing.T) {
                        t.Errorf("%s: escaped output for pointer: want\n\t%q\ngot\n\t%q", test.name, w, g)
                        continue
                }
+               if tmpl.Tree != tmpl.text.Tree {
+                       t.Errorf("%s: tree mismatch", test.name)
+                       continue
+               }
        }
 }
 
index e183898d50f150d8a0f1a064d6975711d59cc9f4..5862f01f45e374562c6f0e95db9b67568d87d6c4 100644 (file)
@@ -21,7 +21,9 @@ type Template struct {
        // We could embed the text/template field, but it's safer not to because
        // we need to keep our version of the name space and the underlying
        // template's in sync.
-       text       *template.Template
+       text *template.Template
+       // The underlying template's parse tree, updated to be HTML-safe.
+       Tree       *parse.Tree
        *nameSpace // common to all associated templates
 }
 
@@ -149,6 +151,7 @@ func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error
        ret := &Template{
                false,
                text,
+               text.Tree,
                t.nameSpace,
        }
        t.set[name] = ret
@@ -176,6 +179,7 @@ func (t *Template) Clone() (*Template, error) {
        ret := &Template{
                false,
                textClone,
+               textClone.Tree,
                &nameSpace{
                        set: make(map[string]*Template),
                },
@@ -195,6 +199,7 @@ func (t *Template) Clone() (*Template, error) {
                ret.set[name] = &Template{
                        false,
                        x,
+                       x.Tree,
                        ret.nameSpace,
                }
        }
@@ -206,6 +211,7 @@ func New(name string) *Template {
        tmpl := &Template{
                false,
                template.New(name),
+               nil,
                &nameSpace{
                        set: make(map[string]*Template),
                },
@@ -228,6 +234,7 @@ func (t *Template) new(name string) *Template {
        tmpl := &Template{
                false,
                t.text.New(name),
+               nil,
                t.nameSpace,
        }
        tmpl.set[name] = tmpl