mirror of
https://github.com/golang/go
synced 2024-11-25 01:37: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:
parent
072e36d5ef
commit
6c204982e0
@ -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()
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user