aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/html
diff options
context:
space:
mode:
authorAndrew Balholm <andybalholm@gmail.com>2011-12-24 11:07:14 +1100
committerNigel Tao <nigeltao@golang.org>2011-12-24 11:07:14 +1100
commitb28f017537df9c10e45c5474612082ed4bbfc8ef (patch)
tree2ade6e3a1c6a4a1fb17696a45631e18005005d7c /src/pkg/html
parentcadbd3ea4986a43eebb1be3cacdce346513d537f (diff)
downloadgo-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.go63
-rw-r--r--src/pkg/html/parse_test.go2
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)