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,17 +659,22 @@ func (p *Parser) RawToken() (Token, os.Error) { ...@@ -659,17 +659,22 @@ func (p *Parser) RawToken() (Token, os.Error) {
return nil, p.err return nil, p.err
} }
if b != '=' { if b != '=' {
p.err = p.syntaxError("attribute name without = in element") if p.Strict {
return nil, p.err p.err = p.syntaxError("attribute name without = in element")
} return nil, p.err
p.space() } else {
data := p.attrval() p.ungetc(b)
if data == nil { a.Value = a.Name.Local
return nil, p.err }
} else {
p.space()
data := p.attrval()
if data == nil {
return nil, p.err
}
a.Value = string(data)
} }
a.Value = string(data)
} }
if empty { if empty {
p.needClose = true p.needClose = true
p.toClose = name p.toClose = name
......
...@@ -445,6 +445,33 @@ func TestUnquotedAttrs(t *testing.T) { ...@@ -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) { func TestCopyTokenCharData(t *testing.T) {
data := []byte("same data") data := []byte("same data")
var tok1 Token = CharData(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