]> Cypherpunks repositories - gostls13.git/commitdiff
exp/html: adjust parseForeignContent to match spec
authorAndrew Balholm <andybalholm@gmail.com>
Fri, 25 May 2012 00:03:59 +0000 (10:03 +1000)
committerNigel Tao <nigeltao@golang.org>
Fri, 25 May 2012 00:03:59 +0000 (10:03 +1000)
Remove redundant checks for integration points.

Ignore null bytes in text.

Don't break out of foreign content for a <font> tag unless it
has a color, face, or size attribute.

Check for MathML text integration points when breaking out of
foreign content.

Pass two new tests.

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

src/pkg/exp/html/foreign.go
src/pkg/exp/html/parse.go
src/pkg/exp/html/testlogs/plain-text-unsafe.dat.log

index 89eef3dcb568e5fc845d971b27eb73f3c7cb230d..d3b3844099bf151b97131dde31a161b7de630053 100644 (file)
@@ -82,7 +82,6 @@ var breakout = map[string]bool{
        "dt":         true,
        "em":         true,
        "embed":      true,
-       "font":       true,
        "h1":         true,
        "h2":         true,
        "h3":         true,
index 1544bee26d512eeebdf96532497b7600ca5e33fd..fe5f295b7626c2160720d7b715c602a457f63d8f 100644 (file)
@@ -1785,12 +1785,7 @@ func afterAfterFramesetIM(p *parser) bool {
 func parseForeignContent(p *parser) bool {
        switch p.tok.Type {
        case TextToken:
-               // TODO: HTML integration points.
-               if p.top().Namespace == "" {
-                       inBodyIM(p)
-                       p.resetInsertionMode()
-                       return true
-               }
+               p.tok.Data = strings.Replace(p.tok.Data, "\x00", "", -1)
                if p.framesetOK {
                        p.framesetOK = strings.TrimLeft(p.tok.Data, whitespace) == ""
                }
@@ -1801,15 +1796,21 @@ func parseForeignContent(p *parser) bool {
                        Data: p.tok.Data,
                })
        case StartTagToken:
-               if htmlIntegrationPoint(p.top()) {
-                       inBodyIM(p)
-                       p.resetInsertionMode()
-                       return true
+               b := breakout[p.tok.Data]
+               if p.tok.Data == "font" {
+               loop:
+                       for _, attr := range p.tok.Attr {
+                               switch attr.Key {
+                               case "color", "face", "size":
+                                       b = true
+                                       break loop
+                               }
+                       }
                }
-               if breakout[p.tok.Data] {
+               if b {
                        for i := len(p.oe) - 1; i >= 0; i-- {
-                               // TODO: MathML integration points.
-                               if p.oe[i].Namespace == "" || htmlIntegrationPoint(p.oe[i]) {
+                               n := p.oe[i]
+                               if n.Namespace == "" || htmlIntegrationPoint(n) || mathMLTextIntegrationPoint(n) {
                                        p.oe = p.oe[:i+1]
                                        break
                                }
@@ -1833,6 +1834,10 @@ func parseForeignContent(p *parser) bool {
                namespace := p.top().Namespace
                p.addElement(p.tok.Data, p.tok.Attr)
                p.top().Namespace = namespace
+               if p.hasSelfClosingToken {
+                       p.oe.pop()
+                       p.acknowledgeSelfClosingTag()
+               }
        case EndTagToken:
                for i := len(p.oe) - 1; i >= 0; i-- {
                        if p.oe[i].Namespace == "" {
index 41b003e6899fd8493fe2fd33277b739c5761c532..acf1780cf2bee5e4db3e06152c279fe77fd1b15c 100644 (file)
@@ -16,8 +16,8 @@ FAIL "<svg>\x00filler\x00text"
 FAIL "<svg>\x00<frameset>"
 FAIL "<svg>\x00 <frameset>"
 FAIL "<svg>\x00a<frameset>"
-FAIL "<svg>\x00</svg><frameset>"
-FAIL "<svg>\x00 </svg><frameset>"
+PASS "<svg>\x00</svg><frameset>"
+PASS "<svg>\x00 </svg><frameset>"
 FAIL "<svg>\x00a</svg><frameset>"
 PASS "<svg><path></path></svg><frameset>"
 PASS "<svg><p><frameset>"