Commit 7f3e109d authored by Volker Dobler's avatar Volker Dobler Committed by Russ Cox

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
parent d81147b6
......@@ -659,9 +659,14 @@ func (p *Parser) RawToken() (Token, os.Error) {
return nil, p.err
}
if b != '=' {
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 {
......@@ -669,7 +674,7 @@ func (p *Parser) RawToken() (Token, os.Error) {
}
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)
......
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