Commit 6c204982 authored by Nigel Tao's avatar Nigel Tao

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

R=rsc
CC=golang-dev
https://golang.org/cl/6303053
parent 072e36d5
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
package html package html
import ( import (
"errors"
a "exp/html/atom" a "exp/html/atom"
"fmt"
"io" "io"
"strings" "strings"
) )
...@@ -2013,6 +2015,15 @@ func ParseFragment(r io.Reader, context *Node) ([]*Node, error) { ...@@ -2013,6 +2015,15 @@ func ParseFragment(r io.Reader, context *Node) ([]*Node, error) {
} }
if context != nil { 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 { switch context.DataAtom {
case a.Iframe, a.Noembed, a.Noframes, a.Noscript, a.Plaintext, a.Script, a.Style, a.Title, a.Textarea, a.Xmp: 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() p.tokenizer.rawTag = context.DataAtom.String()
......
...@@ -391,6 +391,19 @@ var renderTestBlacklist = map[string]bool{ ...@@ -391,6 +391,19 @@ var renderTestBlacklist = map[string]bool{
`<table><plaintext><td>`: true, `<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) { func BenchmarkParser(b *testing.B) {
buf, err := ioutil.ReadFile("testdata/go1.html") buf, err := ioutil.ReadFile("testdata/go1.html")
if err != nil { if err != nil {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment