1
0
mirror of https://github.com/golang/go synced 2024-11-24 22:57:57 -07:00

exp/html: check the context node for consistency when parsing fragments.

R=rsc
CC=golang-dev
https://golang.org/cl/6303053
This commit is contained in:
Nigel Tao 2012-06-08 13:55:15 +10:00
parent 072e36d5ef
commit 6c204982e0
2 changed files with 24 additions and 0 deletions

View File

@ -5,7 +5,9 @@
package html
import (
"errors"
a "exp/html/atom"
"fmt"
"io"
"strings"
)
@ -2013,6 +2015,15 @@ func ParseFragment(r io.Reader, context *Node) ([]*Node, error) {
}
if context != nil {
if context.Type != ElementNode {
return nil, errors.New("html: ParseFragment of non-element Node")
}
// The next check isn't just context.DataAtom.String() == context.Data because
// it is valid to pass an element whose tag isn't a known atom. For example,
// DataAtom == 0 and Data = "tagfromthefuture" is perfectly consistent.
if context.DataAtom != a.Lookup([]byte(context.Data)) {
return nil, fmt.Errorf("html: inconsistent Node: DataAtom=%q, Data=%q", context.DataAtom, context.Data)
}
switch context.DataAtom {
case a.Iframe, a.Noembed, a.Noframes, a.Noscript, a.Plaintext, a.Script, a.Style, a.Title, a.Textarea, a.Xmp:
p.tokenizer.rawTag = context.DataAtom.String()

View File

@ -391,6 +391,19 @@ var renderTestBlacklist = map[string]bool{
`<table><plaintext><td>`: true,
}
func TestNodeConsistency(t *testing.T) {
// inconsistentNode is a Node whose DataAtom and Data do not agree.
inconsistentNode := &Node{
Type: ElementNode,
DataAtom: atom.Frameset,
Data: "table",
}
_, err := ParseFragment(strings.NewReader("<p>hello</p>"), inconsistentNode)
if err == nil {
t.Errorf("got nil error, want non-nil")
}
}
func BenchmarkParser(b *testing.B) {
buf, err := ioutil.ReadFile("testdata/go1.html")
if err != nil {