]> Cypherpunks repositories - gostls13.git/commitdiff
exp/html: don't treat SVG <title> like HTML <title>
authorAndrew Balholm <andybalholm@gmail.com>
Sun, 5 Aug 2012 12:32:35 +0000 (22:32 +1000)
committerNigel Tao <nigeltao@golang.org>
Sun, 5 Aug 2012 12:32:35 +0000 (22:32 +1000)
The content of an HTML <title> element is RCDATA, but the content of an SVG
<title> element is parsed as tags. Now the parser doesn't go into RCDATA
mode in foreign content.

Pass 4 additional tests.

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

src/pkg/exp/html/parse.go
src/pkg/exp/html/render.go
src/pkg/exp/html/testlogs/tests10.dat.log
src/pkg/exp/html/testlogs/webkit01.dat.log

index 38e61677e36e4e697f2f221702a16b2e1505cd3e..afdfc9989c4b64ffd0c4bbc68b08170c2f63dd6a 100644 (file)
@@ -1902,6 +1902,11 @@ func parseForeignContent(p *parser) bool {
                namespace := p.top().Namespace
                p.addElement()
                p.top().Namespace = namespace
+               if namespace != "" {
+                       // Don't let the tokenizer go into raw text mode in foreign content
+                       // (e.g. in an SVG <title> tag).
+                       p.tokenizer.rawTag = ""
+               }
                if p.hasSelfClosingToken {
                        p.oe.pop()
                        p.acknowledgeSelfClosingTag()
index 07859faa7dd833df71f5410bdf67e044ec3aa437..de9706528f9de78b0ffb0b1ff37f9fae65a87d90 100644 (file)
@@ -209,7 +209,7 @@ func render1(w writer, n *Node) error {
                }
        case "textarea", "title":
                for _, c := range n.Child {
-                       if c.Type != TextNode {
+                       if c.Type != TextNode && n.Namespace == "" {
                                return fmt.Errorf("html: RCDATA element <%s> has non-text child node", n.Data)
                        }
                        if err := render1(w, c); err != nil {
index edf75d689abc6dc09041e7f9e51573e5a0323cec..bf9434b2574ba5852c9e206841c67607a5748656 100644 (file)
@@ -33,7 +33,7 @@ PASS "<div><svg><path><foreignObject><p></div>a"
 PASS "<!DOCTYPE html><svg><desc><div><svg><ul>a"
 PASS "<!DOCTYPE html><svg><desc><svg><ul>a"
 PASS "<!DOCTYPE html><p><svg><desc><p>"
-FAIL "<!DOCTYPE html><p><svg><title><p>"
+PASS "<!DOCTYPE html><p><svg><title><p>"
 PASS "<div><svg><path><foreignObject><p></foreignObject><p>"
 PASS "<math><mi><div><object><div><span></span></div></object></div></mi><mi>"
 PASS "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>"
index 08ee7c2763a76c17ae3f701ac3f042004a68a8e3..635cc8e180b476d24b51eea8401b6e2dd021d78f 100644 (file)
@@ -36,9 +36,9 @@ PASS "<kbd><table></kbd><col><select><tr></table><div>"
 PASS "<a><li><style></style><title></title></a>"
 PASS "<font></p><p><meta><title></title></font>"
 PASS "<a><center><title></title><a>"
-FAIL "<svg><title><div>"
-FAIL "<svg><title><rect><div>"
-FAIL "<svg><title><svg><div>"
+PASS "<svg><title><div>"
+PASS "<svg><title><rect><div>"
+PASS "<svg><title><svg><div>"
 PASS "<img <=\"\" FAIL>"
 FAIL "<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>"
 PASS "<svg><em><desc></em>"