]> Cypherpunks repositories - gostls13.git/commitdiff
html: "in select in table" insertion mode.
authorAndrew Balholm <andybalholm@gmail.com>
Sat, 24 Dec 2011 00:07:14 +0000 (11:07 +1100)
committerNigel Tao <nigeltao@golang.org>
Sat, 24 Dec 2011 00:07:14 +0000 (11:07 +1100)
Pass tests10.dat, test 16:
<!DOCTYPE
html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux

| <!DOCTYPE html>
| <html>
|   <head>
|   <body>
|     <table>
|       <tbody>
|         <tr>
|           <td>
|             <select>
|               "foobarbaz"
|     <p>
|       "quux"

Also pass tests through test 21:
<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span>

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

src/pkg/html/parse.go
src/pkg/html/parse_test.go

index 6962e643932cae1a27a559697393ca33400de8fb..5b14d7131950554ab4cb08cafaf049d30623edec 100644 (file)
@@ -683,7 +683,6 @@ func inBodyIM(p *parser) bool {
                        p.reconstructActiveFormattingElements()
                        p.addElement(p.tok.Data, p.tok.Attr)
                        p.framesetOK = false
-                       // TODO: detect <select> inside a table.
                        p.im = inSelectIM
                        return true
                case "form":
@@ -1049,6 +1048,17 @@ func inTableIM(p *parser) bool {
                        p.addElement("colgroup", p.tok.Attr)
                        p.im = inColumnGroupIM
                        return false
+               case "select":
+                       p.reconstructActiveFormattingElements()
+                       switch p.top().Data {
+                       case "table", "tbody", "tfoot", "thead", "tr":
+                               p.fosterParenting = true
+                       }
+                       p.addElement(p.tok.Data, p.tok.Attr)
+                       p.fosterParenting = false
+                       p.framesetOK = false
+                       p.im = inSelectInTableIM
+                       return true
                default:
                        // TODO.
                }
@@ -1109,6 +1119,12 @@ func inCaptionIM(p *parser) bool {
                                // Ignore the token.
                                return true
                        }
+               case "select":
+                       p.reconstructActiveFormattingElements()
+                       p.addElement(p.tok.Data, p.tok.Attr)
+                       p.framesetOK = false
+                       p.im = inSelectInTableIM
+                       return true
                }
        case EndTagToken:
                switch p.tok.Data {
@@ -1311,6 +1327,12 @@ func inCellIM(p *parser) bool {
                case "caption", "col", "colgroup", "tbody", "td", "tfoot", "th", "thead", "tr":
                        // TODO: check for "td" or "th" in table scope.
                        closeTheCellAndReprocess = true
+               case "select":
+                       p.reconstructActiveFormattingElements()
+                       p.addElement(p.tok.Data, p.tok.Attr)
+                       p.framesetOK = false
+                       p.im = inSelectInTableIM
+                       return true
                }
        case EndTagToken:
                switch p.tok.Data {
@@ -1405,21 +1427,40 @@ func inSelectIM(p *parser) bool {
                })
        }
        if endSelect {
-               for i := len(p.oe) - 1; i >= 0; i-- {
-                       switch p.oe[i].Data {
-                       case "select":
-                               p.oe = p.oe[:i]
-                               p.resetInsertionMode()
-                               return true
-                       case "option", "optgroup":
-                               continue
-                       default:
+               p.endSelect()
+       }
+       return true
+}
+
+// Section 12.2.5.4.17.
+func inSelectInTableIM(p *parser) bool {
+       switch p.tok.Type {
+       case StartTagToken, EndTagToken:
+               switch p.tok.Data {
+               case "caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th":
+                       if p.tok.Type == StartTagToken || p.elementInScope(tableScopeStopTags, p.tok.Data) {
+                               p.endSelect()
+                               return false
+                       } else {
                                // Ignore the token.
                                return true
                        }
                }
        }
-       return true
+       return inSelectIM(p)
+}
+
+func (p *parser) endSelect() {
+       for i := len(p.oe) - 1; i >= 0; i-- {
+               switch p.oe[i].Data {
+               case "option", "optgroup":
+                       continue
+               case "select":
+                       p.oe = p.oe[:i]
+                       p.resetInsertionMode()
+               }
+               return
+       }
 }
 
 // Section 12.2.5.4.18.
index 015b5838f0b50b3a0e8f33e39c545dc68988a60c..46be9818930a44a8f7ccf5db28467f7c3217296e 100644 (file)
@@ -173,7 +173,7 @@ func TestParser(t *testing.T) {
                {"tests4.dat", -1},
                {"tests5.dat", -1},
                {"tests6.dat", 47},
-               {"tests10.dat", 16},
+               {"tests10.dat", 22},
        }
        for _, tf := range testFiles {
                f, err := os.Open("testdata/webkit/" + tf.filename)