From 32a936f46389aa10549d60bd7833e54b01685d09 Mon Sep 17 00:00:00 2001 From: Kunpei Sakai Date: Mon, 25 Jun 2018 01:29:30 +0900 Subject: [PATCH] html: don't ignore the token if the current node is form See: https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inbody Fixes golang/go#25703 Updates golang/go#23071 Change-Id: I09db4c2d07a242cb45c3e37b499c609809dd0b83 Reviewed-on: https://go-review.googlesource.com/120658 Run-TryBot: Kunpei Sakai TryBot-Result: Gobot Gobot Reviewed-by: Nigel Tao --- html/parse.go | 15 +++++++++----- html/parse_test.go | 38 ++++++++++++++++++----------------- html/testdata/go/template.dat | 13 ++++++++++++ 3 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 html/testdata/go/template.dat diff --git a/html/parse.go b/html/parse.go index d23e05e0..7e539b12 100644 --- a/html/parse.go +++ b/html/parse.go @@ -860,9 +860,13 @@ func inBodyIM(p *parser) bool { // The newline, if any, will be dealt with by the TextToken case. p.framesetOK = false case a.Form: - if p.oe.contains(a.Template) || p.form == nil { - p.popUntil(buttonScope, a.P) - p.addElement() + if p.form != nil && !p.oe.contains(a.Template) { + // Ignore the token + return true + } + p.popUntil(buttonScope, a.P) + p.addElement() + if !p.oe.contains(a.Template) { p.form = p.top() } case a.Li: @@ -1098,12 +1102,13 @@ func inBodyIM(p *parser) bool { p.popUntil(defaultScope, p.tok.DataAtom) case a.Form: if p.oe.contains(a.Template) { - if !p.oe.contains(a.Form) { + i := p.indexOfElementInScope(defaultScope, a.Form) + if i == -1 { // Ignore the token. return true } p.generateImpliedEndTags() - if p.tok.DataAtom == a.Form { + if p.oe[i].DataAtom != a.Form { // Ignore the token. return true } diff --git a/html/parse_test.go b/html/parse_test.go index 89d96426..0b72a12b 100644 --- a/html/parse_test.go +++ b/html/parse_test.go @@ -203,34 +203,36 @@ func dump(n *Node) (string, error) { return b.String(), nil } -const testDataDir = "testdata/webkit/" +var testDataDirs = []string{"testdata/webkit/", "testdata/go/"} func TestParser(t *testing.T) { - testFiles, err := filepath.Glob(testDataDir + "*.dat") - if err != nil { - t.Fatal(err) - } - for _, tf := range testFiles { - f, err := os.Open(tf) + for _, testDataDir := range testDataDirs { + testFiles, err := filepath.Glob(testDataDir + "*.dat") if err != nil { t.Fatal(err) } - defer f.Close() - r := bufio.NewReader(f) - - for i := 0; ; i++ { - text, want, context, err := readParseTest(r) - if err == io.EOF { - break - } + for _, tf := range testFiles { + f, err := os.Open(tf) if err != nil { t.Fatal(err) } + defer f.Close() + r := bufio.NewReader(f) - err = testParseCase(text, want, context) + for i := 0; ; i++ { + text, want, context, err := readParseTest(r) + if err == io.EOF { + break + } + if err != nil { + t.Fatal(err) + } - if err != nil { - t.Errorf("%s test #%d %q, %s", tf, i, text, err) + err = testParseCase(text, want, context) + + if err != nil { + t.Errorf("%s test #%d %q, %s", tf, i, text, err) + } } } } diff --git a/html/testdata/go/template.dat b/html/testdata/go/template.dat new file mode 100644 index 00000000..a0a525bc --- /dev/null +++ b/html/testdata/go/template.dat @@ -0,0 +1,13 @@ +#data + +#errors +#document +| +| +| +|