diff options
| author | Andrew Balholm <andybalholm@gmail.com> | 2011-12-24 11:07:14 +1100 |
|---|---|---|
| committer | Nigel Tao <nigeltao@golang.org> | 2011-12-24 11:07:14 +1100 |
| commit | b28f017537df9c10e45c5474612082ed4bbfc8ef (patch) | |
| tree | 2ade6e3a1c6a4a1fb17696a45631e18005005d7c /src/pkg/html | |
| parent | cadbd3ea4986a43eebb1be3cacdce346513d537f (diff) | |
| download | go-b28f017537df9c10e45c5474612082ed4bbfc8ef.tar.xz | |
html: "in select in table" insertion mode.
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
Diffstat (limited to 'src/pkg/html')
| -rw-r--r-- | src/pkg/html/parse.go | 63 | ||||
| -rw-r--r-- | src/pkg/html/parse_test.go | 2 |
2 files changed, 53 insertions, 12 deletions
diff --git a/src/pkg/html/parse.go b/src/pkg/html/parse.go index 6962e64393..5b14d71319 100644 --- a/src/pkg/html/parse.go +++ b/src/pkg/html/parse.go @@ -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. diff --git a/src/pkg/html/parse_test.go b/src/pkg/html/parse_test.go index 015b5838f0..46be981893 100644 --- a/src/pkg/html/parse_test.go +++ b/src/pkg/html/parse_test.go @@ -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) |
