mirror of
https://github.com/golang/net.git
synced 2026-03-31 10:27:08 +09:00
html: update inSelectIM and inSelectInTableIM for the latest spec
Fixes golang/go#27842 Change-Id: I06eb3c0c18be3566bd30a29fca5f3f7e6791d2cc Reviewed-on: https://go-review.googlesource.com/c/137275 Run-TryBot: Kunpei Sakai <namusyaka@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Nigel Tao <nigeltao@golang.org>
This commit is contained in:
@@ -1719,8 +1719,12 @@ func inSelectIM(p *parser) bool {
|
||||
}
|
||||
p.addElement()
|
||||
case a.Select:
|
||||
p.tok.Type = EndTagToken
|
||||
return false
|
||||
if p.popUntil(selectScope, a.Select) {
|
||||
p.resetInsertionMode()
|
||||
} else {
|
||||
// Ignore the token.
|
||||
return true
|
||||
}
|
||||
case a.Input, a.Keygen, a.Textarea:
|
||||
if p.elementInScope(selectScope, a.Select) {
|
||||
p.parseImpliedToken(EndTagToken, a.Select, a.Select.String())
|
||||
@@ -1750,6 +1754,9 @@ func inSelectIM(p *parser) bool {
|
||||
case a.Select:
|
||||
if p.popUntil(selectScope, a.Select) {
|
||||
p.resetInsertionMode()
|
||||
} else {
|
||||
// Ignore the token.
|
||||
return true
|
||||
}
|
||||
case a.Template:
|
||||
return inHeadIM(p)
|
||||
@@ -1775,13 +1782,22 @@ func inSelectInTableIM(p *parser) bool {
|
||||
case StartTagToken, EndTagToken:
|
||||
switch p.tok.DataAtom {
|
||||
case a.Caption, a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr, a.Td, a.Th:
|
||||
if p.tok.Type == StartTagToken || p.elementInScope(tableScope, p.tok.DataAtom) {
|
||||
p.parseImpliedToken(EndTagToken, a.Select, a.Select.String())
|
||||
return false
|
||||
} else {
|
||||
if p.tok.Type == EndTagToken && !p.elementInScope(tableScope, p.tok.DataAtom) {
|
||||
// Ignore the token.
|
||||
return true
|
||||
}
|
||||
// This is like p.popUntil(selectScope, a.Select), but it also
|
||||
// matches <math select>, not just <select>. Matching the MathML
|
||||
// tag is arguably incorrect (conceptually), but it mimics what
|
||||
// Chromium does.
|
||||
for i := len(p.oe) - 1; i >= 0; i-- {
|
||||
if n := p.oe[i]; n.DataAtom == a.Select {
|
||||
p.oe = p.oe[:i]
|
||||
break
|
||||
}
|
||||
}
|
||||
p.resetInsertionMode()
|
||||
return false
|
||||
}
|
||||
}
|
||||
return inSelectIM(p)
|
||||
|
||||
@@ -367,7 +367,8 @@ var renderTestBlacklist = map[string]bool{
|
||||
`<script><!--<script </s`: true,
|
||||
// Reconstructing the active formatting elements results in a <plaintext>
|
||||
// element that contains an <a> element.
|
||||
`<!doctype html><p><a><plaintext>b`: true,
|
||||
`<!doctype html><p><a><plaintext>b`: true,
|
||||
`<table><math><select><mi><select></table>`: true,
|
||||
}
|
||||
|
||||
func TestNodeConsistency(t *testing.T) {
|
||||
|
||||
12
html/testdata/go/select.dat
vendored
Normal file
12
html/testdata/go/select.dat
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
#data
|
||||
<table><math><select><mi><select></table>
|
||||
#errors
|
||||
#document
|
||||
| <html>
|
||||
| <head>
|
||||
| <body>
|
||||
| <math math>
|
||||
| <math select>
|
||||
| <math mi>
|
||||
| <select>
|
||||
| <table>
|
||||
Reference in New Issue
Block a user