From 9db3f78c392643769fd46fc7900a6deb1fd2692f Mon Sep 17 00:00:00 2001 From: Andrew Balholm Date: Tue, 1 Nov 2011 11:42:54 +1100 Subject: [PATCH] html: process tags; foster parent at most one node per token Correctly close table cell when is read. Because of reconstructing the active formatting elements, more than one node may be created when reading a single token. If both nodes are foster parented, they will be siblings, but the first node should be the parent of the second. Pass tests1.dat, test 77: ababrx
aoe | | | | | href="blah" | "aba" | | href="foo" | "br" | | href="foo" | "x" | | | |
| | href="foo" | "aoe" R=nigeltao CC=golang-dev https://golang.org/cl/5305074 --- src/pkg/html/parse.go | 8 +++++++- src/pkg/html/parse_test.go | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/pkg/html/parse.go b/src/pkg/html/parse.go index 49c7a65babf..2538ea98115 100644 --- a/src/pkg/html/parse.go +++ b/src/pkg/html/parse.go @@ -126,6 +126,7 @@ func (p *parser) addChild(n *Node) { // fosterParent adds a child node according to the foster parenting rules. // Section 11.2.5.3, "foster parenting". func (p *parser) fosterParent(n *Node) { + p.fosterParenting = false var table, parent *Node var i int for i = len(p.oe) - 1; i >= 0; i-- { @@ -986,7 +987,12 @@ func inCellIM(p *parser) (insertionMode, bool) { case EndTagToken: switch p.tok.Data { case "td", "th": - // TODO. + if !p.popUntil(tableScopeStopTags, p.tok.Data) { + // Ignore the token. + return inCellIM, true + } + p.clearActiveFormattingElements() + return inRowIM, true case "body", "caption", "col", "colgroup", "html": // TODO. case "table", "tbody", "tfoot", "thead", "tr": diff --git a/src/pkg/html/parse_test.go b/src/pkg/html/parse_test.go index 861070d103d..caf3c92bc75 100644 --- a/src/pkg/html/parse_test.go +++ b/src/pkg/html/parse_test.go @@ -132,7 +132,7 @@ func TestParser(t *testing.T) { rc := make(chan io.Reader) go readDat(filename, rc) // TODO(nigeltao): Process all test cases, not just a subset. - for i := 0; i < 77; i++ { + for i := 0; i < 78; i++ { // Parse the #data section. b, err := ioutil.ReadAll(<-rc) if err != nil { @@ -161,8 +161,8 @@ func TestParser(t *testing.T) { continue } // Check that rendering and re-parsing results in an identical tree. - if filename == "tests1.dat" && i == 30 { - // Test 30 in tests1.dat is such messed-up markup that a correct parse + if filename == "tests1.dat" && (i == 30 || i == 77) { + // Some tests in tests1.dat have such messed-up markup that a correct parse // results in a non-conforming tree (one element nested inside another). // Therefore when it is rendered and re-parsed, it isn't the same. // So we skip rendering on that test.