Commit 82e22725 authored by Andrew Balholm's avatar Andrew Balholm Committed by Nigel Tao

exp/html: detect "integration points" in SVG and MathML content

Detect HTML integration points and MathML text integration points.
At these points, process tokens as HTML, not as foreign content.

Pass 33 more tests.

R=nigeltao
CC=golang-dev
https://golang.org/cl/6249044
parent 04f3cf0f
...@@ -37,8 +37,16 @@ func htmlIntegrationPoint(n *Node) bool { ...@@ -37,8 +37,16 @@ func htmlIntegrationPoint(n *Node) bool {
} }
switch n.Namespace { switch n.Namespace {
case "math": case "math":
// TODO: annotation-xml elements whose start tags have "text/html" or if n.Data == "annotation-xml" {
// "application/xhtml+xml" encodings. for _, a := range n.Attr {
if a.Key == "encoding" {
val := strings.ToLower(a.Val)
if val == "text/html" || val == "application/xhtml+xml" {
return true
}
}
}
}
case "svg": case "svg":
switch n.Data { switch n.Data {
case "desc", "foreignObject", "title": case "desc", "foreignObject", "title":
...@@ -48,6 +56,17 @@ func htmlIntegrationPoint(n *Node) bool { ...@@ -48,6 +56,17 @@ func htmlIntegrationPoint(n *Node) bool {
return false return false
} }
func mathMLTextIntegrationPoint(n *Node) bool {
if n.Namespace != "math" {
return false
}
switch n.Data {
case "mi", "mo", "mn", "ms", "mtext":
return true
}
return false
}
// Section 12.2.5.5. // Section 12.2.5.5.
var breakout = map[string]bool{ var breakout = map[string]bool{
"b": true, "b": true,
......
...@@ -1859,8 +1859,23 @@ func (p *parser) inForeignContent() bool { ...@@ -1859,8 +1859,23 @@ func (p *parser) inForeignContent() bool {
if n.Namespace == "" { if n.Namespace == "" {
return false return false
} }
// TODO: MathML, HTML integration points. if mathMLTextIntegrationPoint(n) {
// TODO: MathML's annotation-xml combining with SVG's svg. if p.tok.Type == StartTagToken && p.tok.Data != "mglyph" && p.tok.Data != "malignmark" {
return false
}
if p.tok.Type == TextToken {
return false
}
}
if n.Namespace == "math" && n.Data == "annotation-xml" && p.tok.Type == StartTagToken && p.tok.Data == "svg" {
return false
}
if htmlIntegrationPoint(n) && (p.tok.Type == StartTagToken || p.tok.Type == TextToken) {
return false
}
if p.tok.Type == ErrorToken {
return false
}
return true return true
} }
......
PASS "<input type=\"hidden\"><frameset>" PASS "<input type=\"hidden\"><frameset>"
PASS "<!DOCTYPE html><table><caption><svg>foo</table>bar" PASS "<!DOCTYPE html><table><caption><svg>foo</table>bar"
FAIL "<table><tr><td><svg><desc><td></desc><circle>" PASS "<table><tr><td><svg><desc><td></desc><circle>"
...@@ -11,7 +11,7 @@ FAIL "<plaintext>\x00filler\x00text\x00" ...@@ -11,7 +11,7 @@ FAIL "<plaintext>\x00filler\x00text\x00"
FAIL "<svg><![CDATA[\x00filler\x00text\x00]]>" FAIL "<svg><![CDATA[\x00filler\x00text\x00]]>"
FAIL "<body><!\x00>" FAIL "<body><!\x00>"
FAIL "<body><!\x00filler\x00text>" FAIL "<body><!\x00filler\x00text>"
FAIL "<body><svg><foreignObject>\x00filler\x00text" PASS "<body><svg><foreignObject>\x00filler\x00text"
FAIL "<svg>\x00filler\x00text" FAIL "<svg>\x00filler\x00text"
FAIL "<svg>\x00<frameset>" FAIL "<svg>\x00<frameset>"
FAIL "<svg>\x00 <frameset>" FAIL "<svg>\x00 <frameset>"
...@@ -24,10 +24,10 @@ PASS "<svg><p><frameset>" ...@@ -24,10 +24,10 @@ PASS "<svg><p><frameset>"
FAIL "<!DOCTYPE html><pre>\r\n\r\nA</pre>" FAIL "<!DOCTYPE html><pre>\r\n\r\nA</pre>"
FAIL "<!DOCTYPE html><pre>\r\rA</pre>" FAIL "<!DOCTYPE html><pre>\r\rA</pre>"
PASS "<!DOCTYPE html><pre>\rA</pre>" PASS "<!DOCTYPE html><pre>\rA</pre>"
FAIL "<!DOCTYPE html><table><tr><td><math><mtext>\x00a" PASS "<!DOCTYPE html><table><tr><td><math><mtext>\x00a"
FAIL "<!DOCTYPE html><table><tr><td><svg><foreignObject>\x00a" PASS "<!DOCTYPE html><table><tr><td><svg><foreignObject>\x00a"
FAIL "<!DOCTYPE html><math><mi>a\x00b" PASS "<!DOCTYPE html><math><mi>a\x00b"
FAIL "<!DOCTYPE html><math><mo>a\x00b" PASS "<!DOCTYPE html><math><mo>a\x00b"
FAIL "<!DOCTYPE html><math><mn>a\x00b" PASS "<!DOCTYPE html><math><mn>a\x00b"
FAIL "<!DOCTYPE html><math><ms>a\x00b" PASS "<!DOCTYPE html><math><ms>a\x00b"
FAIL "<!DOCTYPE html><math><mtext>a\x00b" PASS "<!DOCTYPE html><math><mtext>a\x00b"
...@@ -14,4 +14,4 @@ PASS "<table><tr><caption>" ...@@ -14,4 +14,4 @@ PASS "<table><tr><caption>"
PASS "<table><tr></body></caption></col></colgroup></html></td></th><td>foo" PASS "<table><tr></body></caption></col></colgroup></html></td></th><td>foo"
PASS "<table><td><tr>" PASS "<table><td><tr>"
PASS "<table><td><button><td>" PASS "<table><td><button><td>"
FAIL "<table><tr><td><svg><desc><td>" PASS "<table><tr><td><svg><desc><td>"
...@@ -35,8 +35,8 @@ PASS "<!DOCTYPE html><svg><desc><svg><ul>a" ...@@ -35,8 +35,8 @@ PASS "<!DOCTYPE html><svg><desc><svg><ul>a"
PASS "<!DOCTYPE html><p><svg><desc><p>" PASS "<!DOCTYPE html><p><svg><desc><p>"
FAIL "<!DOCTYPE html><p><svg><title><p>" FAIL "<!DOCTYPE html><p><svg><title><p>"
PASS "<div><svg><path><foreignObject><p></foreignObject><p>" PASS "<div><svg><path><foreignObject><p></foreignObject><p>"
FAIL "<math><mi><div><object><div><span></span></div></object></div></mi><mi>" PASS "<math><mi><div><object><div><span></span></div></object></div></mi><mi>"
FAIL "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>" PASS "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>"
PASS "<svg><script></script><path>" PASS "<svg><script></script><path>"
PASS "<table><svg></svg><tr>" PASS "<table><svg></svg><tr>"
PASS "<math><mi><mglyph>" PASS "<math><mi><mglyph>"
...@@ -49,6 +49,6 @@ PASS "<math><ms><mglyph>" ...@@ -49,6 +49,6 @@ PASS "<math><ms><mglyph>"
PASS "<math><ms><malignmark>" PASS "<math><ms><malignmark>"
PASS "<math><mtext><mglyph>" PASS "<math><mtext><mglyph>"
PASS "<math><mtext><malignmark>" PASS "<math><mtext><malignmark>"
FAIL "<math><annotation-xml><svg></svg></annotation-xml><mi>" PASS "<math><annotation-xml><svg></svg></annotation-xml><mi>"
FAIL "<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi>" PASS "<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi>"
FAIL "<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi>" PASS "<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi>"
FAIL "<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar" PASS "<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar"
FAIL "<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar" PASS "<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar"
...@@ -28,11 +28,11 @@ PASS "<!doctype html><table> b <!--foo-->" ...@@ -28,11 +28,11 @@ PASS "<!doctype html><table> b <!--foo-->"
PASS "<!doctype html><select><option><option>" PASS "<!doctype html><select><option><option>"
PASS "<!doctype html><select><option></optgroup>" PASS "<!doctype html><select><option></optgroup>"
PASS "<!doctype html><select><option></optgroup>" PASS "<!doctype html><select><option></optgroup>"
FAIL "<!doctype html><p><math><mi><p><h1>" PASS "<!doctype html><p><math><mi><p><h1>"
FAIL "<!doctype html><p><math><mo><p><h1>" PASS "<!doctype html><p><math><mo><p><h1>"
FAIL "<!doctype html><p><math><mn><p><h1>" PASS "<!doctype html><p><math><mn><p><h1>"
FAIL "<!doctype html><p><math><ms><p><h1>" PASS "<!doctype html><p><math><ms><p><h1>"
FAIL "<!doctype html><p><math><mtext><p><h1>" PASS "<!doctype html><p><math><mtext><p><h1>"
PASS "<!doctype html><frameset></noframes>" PASS "<!doctype html><frameset></noframes>"
FAIL "<!doctype html><html c=d><body></html><html a=b>" FAIL "<!doctype html><html c=d><body></html><html a=b>"
FAIL "<!doctype html><html c=d><frameset></frameset></html><html a=b>" FAIL "<!doctype html><html c=d><frameset></frameset></html><html a=b>"
...@@ -80,7 +80,7 @@ PASS "<html> a <frameset></frameset>" ...@@ -80,7 +80,7 @@ PASS "<html> a <frameset></frameset>"
PASS "<!doctype html><div><frameset>" PASS "<!doctype html><div><frameset>"
PASS "<!doctype html><div><body><frameset>" PASS "<!doctype html><div><body><frameset>"
PASS "<!doctype html><p><math></p>a" PASS "<!doctype html><p><math></p>a"
FAIL "<!doctype html><p><math><mn><span></p>a" PASS "<!doctype html><p><math><mn><span></p>a"
PASS "<!doctype html><math></html>" PASS "<!doctype html><math></html>"
PASS "<!doctype html><meta charset=\"ascii\">" PASS "<!doctype html><meta charset=\"ascii\">"
FAIL "<!doctype html><meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\">" FAIL "<!doctype html><meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\">"
......
...@@ -32,8 +32,8 @@ PASS "<option><span><option>" ...@@ -32,8 +32,8 @@ PASS "<option><span><option>"
PASS "<option><option>" PASS "<option><option>"
PASS "<math><annotation-xml><div>" PASS "<math><annotation-xml><div>"
PASS "<math><annotation-xml encoding=\"application/svg+xml\"><div>" PASS "<math><annotation-xml encoding=\"application/svg+xml\"><div>"
FAIL "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>" PASS "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>"
FAIL "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>" PASS "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>"
FAIL "<math><annotation-xml encoding=\"text/html\"><div>" PASS "<math><annotation-xml encoding=\"text/html\"><div>"
FAIL "<math><annotation-xml encoding=\"Text/htmL\"><div>" PASS "<math><annotation-xml encoding=\"Text/htmL\"><div>"
PASS "<math><annotation-xml encoding=\" text/html \"><div>" PASS "<math><annotation-xml encoding=\" text/html \"><div>"
...@@ -8,8 +8,8 @@ PASS "<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr>" ...@@ -8,8 +8,8 @@ PASS "<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr>"
PASS "<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2" PASS "<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2"
PASS "<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i>" PASS "<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i>"
FAIL "<p><code x</code></p>" FAIL "<p><code x</code></p>"
FAIL "<!DOCTYPE html><svg><foreignObject><p><i></p>a" PASS "<!DOCTYPE html><svg><foreignObject><p><i></p>a"
FAIL "<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a" PASS "<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a"
FAIL "<!DOCTYPE html><math><mtext><p><i></p>a" PASS "<!DOCTYPE html><math><mtext><p><i></p>a"
FAIL "<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a" PASS "<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a"
PASS "<!DOCTYPE html><body><div><!/div>a" PASS "<!DOCTYPE html><body><div><!/div>a"
PASS "<!DOCTYPE html><math></math>" PASS "<!DOCTYPE html><math></math>"
PASS "<!DOCTYPE html><body><math></math>" PASS "<!DOCTYPE html><body><math></math>"
PASS "<!DOCTYPE html><math><mi>" PASS "<!DOCTYPE html><math><mi>"
FAIL "<!DOCTYPE html><math><annotation-xml><svg><u>" PASS "<!DOCTYPE html><math><annotation-xml><svg><u>"
PASS "<!DOCTYPE html><body><select><math></math></select>" PASS "<!DOCTYPE html><body><select><math></math></select>"
PASS "<!DOCTYPE html><body><select><option><math></math></option></select>" PASS "<!DOCTYPE html><body><select><option><math></math></option></select>"
PASS "<!DOCTYPE html><body><table><math></math></table>" PASS "<!DOCTYPE html><body><table><math></math></table>"
......
...@@ -42,7 +42,7 @@ FAIL "<svg><title><svg><div>" ...@@ -42,7 +42,7 @@ FAIL "<svg><title><svg><div>"
PASS "<img <=\"\" FAIL>" PASS "<img <=\"\" FAIL>"
FAIL "<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>" FAIL "<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>"
PASS "<svg><em><desc></em>" PASS "<svg><em><desc></em>"
FAIL "<table><tr><td><svg><desc><td></desc><circle>" PASS "<table><tr><td><svg><desc><td></desc><circle>"
PASS "<svg><tfoot></mi><td>" PASS "<svg><tfoot></mi><td>"
PASS "<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>" PASS "<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>"
PASS "<!doctype html><input type=\"hidden\"><frameset>" PASS "<!doctype html><input type=\"hidden\"><frameset>"
......
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