diff --git a/src/pkg/html/parse.go b/src/pkg/html/parse.go
index 5b91204240a..2c15d2d31e9 100644
--- a/src/pkg/html/parse.go
+++ b/src/pkg/html/parse.go
@@ -298,7 +298,7 @@ func (p *parser) resetInsertionMode() {
case "tbody", "thead", "tfoot":
p.im = inTableBodyIM
case "caption":
- // TODO: p.im = inCaptionIM
+ p.im = inCaptionIM
case "colgroup":
p.im = inColumnGroupIM
case "table":
@@ -887,6 +887,12 @@ func inTableIM(p *parser) bool {
// TODO.
case StartTagToken:
switch p.tok.Data {
+ case "caption":
+ p.clearStackToContext(tableScopeStopTags)
+ p.afe = append(p.afe, &scopeMarker)
+ p.addElement(p.tok.Data, p.tok.Attr)
+ p.im = inCaptionIM
+ return true
case "tbody", "tfoot", "thead":
p.clearStackToContext(tableScopeStopTags)
p.addElement(p.tok.Data, p.tok.Attr)
@@ -960,6 +966,46 @@ func (p *parser) clearStackToContext(stopTags []string) {
}
}
+// Section 11.2.5.4.11.
+func inCaptionIM(p *parser) bool {
+ switch p.tok.Type {
+ case StartTagToken:
+ switch p.tok.Data {
+ case "caption", "col", "colgroup", "tbody", "td", "tfoot", "thead", "tr":
+ if p.popUntil(tableScopeStopTags, "caption") {
+ p.clearActiveFormattingElements()
+ p.im = inTableIM
+ return false
+ } else {
+ // Ignore the token.
+ return true
+ }
+ }
+ case EndTagToken:
+ switch p.tok.Data {
+ case "caption":
+ if p.popUntil(tableScopeStopTags, "caption") {
+ p.clearActiveFormattingElements()
+ p.im = inTableIM
+ }
+ return true
+ case "table":
+ if p.popUntil(tableScopeStopTags, "caption") {
+ p.clearActiveFormattingElements()
+ p.im = inTableIM
+ return false
+ } else {
+ // Ignore the token.
+ return true
+ }
+ case "body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr":
+ // Ignore the token.
+ return true
+ }
+ }
+ return inBodyIM(p)
+}
+
// Section 11.2.5.4.12.
func inColumnGroupIM(p *parser) bool {
switch p.tok.Type {
diff --git a/src/pkg/html/parse_test.go b/src/pkg/html/parse_test.go
index 0fd2dc82b30..3837f34b191 100644
--- a/src/pkg/html/parse_test.go
+++ b/src/pkg/html/parse_test.go
@@ -134,7 +134,7 @@ func TestParser(t *testing.T) {
}{
// TODO(nigeltao): Process all the test cases from all the .dat files.
{"tests1.dat", -1},
- {"tests2.dat", 33},
+ {"tests2.dat", 34},
{"tests3.dat", 0},
}
for _, tf := range testFiles {