diff --git a/src/pkg/html/parse.go b/src/pkg/html/parse.go index 276f0b7fbfa..fdd6f75aabd 100644 --- a/src/pkg/html/parse.go +++ b/src/pkg/html/parse.go @@ -7,6 +7,7 @@ package html import ( "io" "os" + "strings" ) // A parser implements the HTML5 parsing algorithm: @@ -430,6 +431,8 @@ func beforeHeadIM(p *parser) (insertionMode, bool) { return inHeadIM, !implied } +const whitespace = " \t\r\n\f" + // Section 11.2.5.4.4. func inHeadIM(p *parser) (insertionMode, bool) { var ( @@ -437,7 +440,18 @@ func inHeadIM(p *parser) (insertionMode, bool) { implied bool ) switch p.tok.Type { - case ErrorToken, TextToken: + case ErrorToken: + implied = true + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) < len(p.tok.Data) { + // Add the initial whitespace to the current node. + p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) + if s == "" { + return inHeadIM, true + } + p.tok.Data = s + } implied = true case StartTagToken: switch p.tok.Data { @@ -469,7 +483,7 @@ func inHeadIM(p *parser) (insertionMode, bool) { } return afterHeadIM, !implied } - return inHeadIM, !implied + return inHeadIM, true } // Section 11.2.5.4.6. diff --git a/src/pkg/html/parse_test.go b/src/pkg/html/parse_test.go index 86f1298d5ee..ae4ecd6658a 100644 --- a/src/pkg/html/parse_test.go +++ b/src/pkg/html/parse_test.go @@ -132,7 +132,7 @@ func TestParser(t *testing.T) { rc := make(chan io.Reader) go readDat(filename, rc) // TODO(nigeltao): Process all test cases, not just a subset. - for i := 0; i < 50; i++ { + for i := 0; i < 55; i++ { // Parse the #data section. b, err := ioutil.ReadAll(<-rc) if err != nil {