mirror of
https://github.com/golang/go
synced 2024-11-19 16:54:44 -07:00
xml: allow attributes without value in non-strict mode.
Attributes without value are commen in html and the xml parser will accept them in non-strict mode and use the attribute name as value. Thus parsing <p nowrap> as <p norwar="nowrap">. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/4601053
This commit is contained in:
parent
d81147b617
commit
7f3e109d2f
@ -659,17 +659,22 @@ func (p *Parser) RawToken() (Token, os.Error) {
|
||||
return nil, p.err
|
||||
}
|
||||
if b != '=' {
|
||||
p.err = p.syntaxError("attribute name without = in element")
|
||||
return nil, p.err
|
||||
if p.Strict {
|
||||
p.err = p.syntaxError("attribute name without = in element")
|
||||
return nil, p.err
|
||||
} else {
|
||||
p.ungetc(b)
|
||||
a.Value = a.Name.Local
|
||||
}
|
||||
} else {
|
||||
p.space()
|
||||
data := p.attrval()
|
||||
if data == nil {
|
||||
return nil, p.err
|
||||
}
|
||||
a.Value = string(data)
|
||||
}
|
||||
p.space()
|
||||
data := p.attrval()
|
||||
if data == nil {
|
||||
return nil, p.err
|
||||
}
|
||||
a.Value = string(data)
|
||||
}
|
||||
|
||||
if empty {
|
||||
p.needClose = true
|
||||
p.toClose = name
|
||||
|
@ -445,6 +445,33 @@ func TestUnquotedAttrs(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestValuelessAttrs(t *testing.T) {
|
||||
tests := [][3]string{
|
||||
{"<p nowrap>", "p", "nowrap"},
|
||||
{"<p nowrap >", "p", "nowrap"},
|
||||
{"<input checked/>", "input", "checked"},
|
||||
{"<input checked />", "input", "checked"},
|
||||
}
|
||||
for _, test := range tests {
|
||||
p := NewParser(StringReader(test[0]))
|
||||
p.Strict = false
|
||||
token, err := p.Token()
|
||||
if _, ok := err.(*SyntaxError); ok {
|
||||
t.Errorf("Unexpected error: %v", err)
|
||||
}
|
||||
if token.(StartElement).Name.Local != test[1] {
|
||||
t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local)
|
||||
}
|
||||
attr := token.(StartElement).Attr[0]
|
||||
if attr.Value != test[2] {
|
||||
t.Errorf("Unexpected attribute value: %v", attr.Value)
|
||||
}
|
||||
if attr.Name.Local != test[2] {
|
||||
t.Errorf("Unexpected attribute name: %v", attr.Name.Local)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCopyTokenCharData(t *testing.T) {
|
||||
data := []byte("same data")
|
||||
var tok1 Token = CharData(data)
|
||||
|
Loading…
Reference in New Issue
Block a user