]> Cypherpunks repositories - gostls13.git/commitdiff
exp/html: fix foster-parenting when elements are implicitly closed
authorAndrew Balholm <andybalholm@gmail.com>
Mon, 6 Aug 2012 23:35:09 +0000 (09:35 +1000)
committerNigel Tao <nigeltao@golang.org>
Mon, 6 Aug 2012 23:35:09 +0000 (09:35 +1000)
When an element (like <nobr> or <p>) was implicitly closed by another
start tag, it would keep foster parenting from working because
the check for what was on top of the stack of open elements was
in the wrong place.

Move the check to addChild.

Pass 2 additional tests.

R=nigeltao
CC=golang-dev
https://golang.org/cl/6460045

src/pkg/exp/html/parse.go
src/pkg/exp/html/parse_test.go
src/pkg/exp/html/testlogs/tests26.dat.log
src/pkg/exp/html/testlogs/tricky01.dat.log

index afdfc9989c4b64ffd0c4bbc68b08170c2f63dd6a..6b1f40cb8ea463ee4ef67b33cdd85f054cc51626 100644 (file)
@@ -208,7 +208,15 @@ loop:
 // addChild adds a child node n to the top element, and pushes n onto the stack
 // of open elements if it is an element node.
 func (p *parser) addChild(n *Node) {
+       fp := false
        if p.fosterParenting {
+               switch p.top().DataAtom {
+               case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+                       fp = true
+               }
+       }
+
+       if fp {
                p.fosterParent(n)
        } else {
                p.top().Add(n)
@@ -222,7 +230,6 @@ func (p *parser) addChild(n *Node) {
 // fosterParent adds a child node according to the foster parenting rules.
 // Section 12.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-- {
@@ -1308,11 +1315,8 @@ func inTableIM(p *parser) bool {
                return true
        }
 
-       switch p.top().DataAtom {
-       case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
-               p.fosterParenting = true
-               defer func() { p.fosterParenting = false }()
-       }
+       p.fosterParenting = true
+       defer func() { p.fosterParenting = false }()
 
        return inBodyIM(p)
 }
index e3c69b6f5ba64bf5c61d261ccf2e7baf92c80135..e159b492f538f352d8aeb2b7e5addcfac0dbb62f 100644 (file)
@@ -389,6 +389,8 @@ var renderTestBlacklist = map[string]bool{
        `<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe`: true,
        `<a><table><a></table><p><a><div><a>`:                                     true,
        `<a><table><td><a><table></table><a></tr><a></table><a>`:                  true,
+       // A similar reparenting situation involving <nobr>:
+       `<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3`: true,
        // A <plaintext> element is reparented, putting it before a table.
        // A <plaintext> element can't have anything after it in HTML.
        `<table><plaintext><td>`: true,
index fa97b44cd1471dfeabc887cf41e431b07781d157..8f4d545abbd65167c48fd0dbde5c889a8de3e6c6 100644 (file)
@@ -1,6 +1,6 @@
 PASS "<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a>"
 PASS "<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3"
-FAIL "<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3"
+PASS "<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3"
 PASS "<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3"
 PASS "<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3"
 PASS "<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3"
index fb0390f818171c87f43aa725e62501584fdd5d91..4d4cd0de939256e79bb281f710d56e5527e90971 100644 (file)
@@ -4,6 +4,6 @@ PASS "<html><body>\n<p><font size=\"7\">First paragraph.</p>\n<p>Second paragrap
 PASS "<html>\n<dl>\n<dt><b>Boo\n<dd>Goo?\n</dl>\n</html>"
 PASS "<html><body>\n<label><a><div>Hello<div>World</div></a></label>  \n</body></html>"
 PASS "<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table>"
-FAIL "<table><tr><p><a><p>You should see this text."
+PASS "<table><tr><p><a><p>You should see this text."
 PASS "<TABLE>\n<TR>\n<CENTER><CENTER><TD></TD></TR><TR>\n<FONT>\n<TABLE><tr></tr></TABLE>\n</P>\n<a></font><font></a>\nThis page contains an insanely badly-nested tag sequence."
 PASS "<html>\n<body>\n<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>\n</body>\n</html>"