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 {
}
switch n.Namespace {
case "math":
// TODO: annotation-xml elements whose start tags have "text/html" or
// "application/xhtml+xml" encodings.
if n.Data == "annotation-xml" {
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":
switch n.Data {
case "desc", "foreignObject", "title":
......@@ -48,6 +56,17 @@ func htmlIntegrationPoint(n *Node) bool {
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.
var breakout = map[string]bool{
"b": true,
......
......@@ -1859,8 +1859,23 @@ func (p *parser) inForeignContent() bool {
if n.Namespace == "" {
return false
}
// TODO: MathML, HTML integration points.
// TODO: MathML's annotation-xml combining with SVG's svg.
if mathMLTextIntegrationPoint(n) {
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
}
......
PASS "<input type=\"hidden\"><frameset>"
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"
FAIL "<svg><![CDATA[\x00filler\x00text\x00]]>"
FAIL "<body><!\x00>"
FAIL "<body><!\x00filler\x00text>"
FAIL "<body><svg><foreignObject>\x00filler\x00text"
PASS "<body><svg><foreignObject>\x00filler\x00text"
FAIL "<svg>\x00filler\x00text"
FAIL "<svg>\x00<frameset>"
FAIL "<svg>\x00 <frameset>"
......@@ -24,10 +24,10 @@ PASS "<svg><p><frameset>"
FAIL "<!DOCTYPE html><pre>\r\n\r\nA</pre>"
FAIL "<!DOCTYPE html><pre>\r\rA</pre>"
PASS "<!DOCTYPE html><pre>\rA</pre>"
FAIL "<!DOCTYPE html><table><tr><td><math><mtext>\x00a"
FAIL "<!DOCTYPE html><table><tr><td><svg><foreignObject>\x00a"
FAIL "<!DOCTYPE html><math><mi>a\x00b"
FAIL "<!DOCTYPE html><math><mo>a\x00b"
FAIL "<!DOCTYPE html><math><mn>a\x00b"
FAIL "<!DOCTYPE html><math><ms>a\x00b"
FAIL "<!DOCTYPE html><math><mtext>a\x00b"
PASS "<!DOCTYPE html><table><tr><td><math><mtext>\x00a"
PASS "<!DOCTYPE html><table><tr><td><svg><foreignObject>\x00a"
PASS "<!DOCTYPE html><math><mi>a\x00b"
PASS "<!DOCTYPE html><math><mo>a\x00b"
PASS "<!DOCTYPE html><math><mn>a\x00b"
PASS "<!DOCTYPE html><math><ms>a\x00b"
PASS "<!DOCTYPE html><math><mtext>a\x00b"
......@@ -14,4 +14,4 @@ PASS "<table><tr><caption>"
PASS "<table><tr></body></caption></col></colgroup></html></td></th><td>foo"
PASS "<table><td><tr>"
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"
PASS "<!DOCTYPE html><p><svg><desc><p>"
FAIL "<!DOCTYPE html><p><svg><title><p>"
PASS "<div><svg><path><foreignObject><p></foreignObject><p>"
FAIL "<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><div><object><div><span></span></div></object></div></mi><mi>"
PASS "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>"
PASS "<svg><script></script><path>"
PASS "<table><svg></svg><tr>"
PASS "<math><mi><mglyph>"
......@@ -49,6 +49,6 @@ PASS "<math><ms><mglyph>"
PASS "<math><ms><malignmark>"
PASS "<math><mtext><mglyph>"
PASS "<math><mtext><malignmark>"
FAIL "<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>"
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></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>"
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"
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><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>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-->"
PASS "<!doctype html><select><option><option>"
PASS "<!doctype html><select><option></optgroup>"
PASS "<!doctype html><select><option></optgroup>"
FAIL "<!doctype html><p><math><mi><p><h1>"
FAIL "<!doctype html><p><math><mo><p><h1>"
FAIL "<!doctype html><p><math><mn><p><h1>"
FAIL "<!doctype html><p><math><ms><p><h1>"
FAIL "<!doctype html><p><math><mtext><p><h1>"
PASS "<!doctype html><p><math><mi><p><h1>"
PASS "<!doctype html><p><math><mo><p><h1>"
PASS "<!doctype html><p><math><mn><p><h1>"
PASS "<!doctype html><p><math><ms><p><h1>"
PASS "<!doctype html><p><math><mtext><p><h1>"
PASS "<!doctype html><frameset></noframes>"
FAIL "<!doctype html><html c=d><body></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>"
PASS "<!doctype html><div><frameset>"
PASS "<!doctype html><div><body><frameset>"
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><meta charset=\"ascii\">"
FAIL "<!doctype html><meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\">"
......
......@@ -32,8 +32,8 @@ PASS "<option><span><option>"
PASS "<option><option>"
PASS "<math><annotation-xml><div>"
PASS "<math><annotation-xml encoding=\"application/svg+xml\"><div>"
FAIL "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>"
FAIL "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>"
FAIL "<math><annotation-xml encoding=\"text/html\"><div>"
FAIL "<math><annotation-xml encoding=\"Text/htmL\"><div>"
PASS "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>"
PASS "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><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>"
PASS "<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2"
PASS "<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i>"
FAIL "<p><code x</code></p>"
FAIL "<!DOCTYPE html><svg><foreignObject><p><i></p>a"
FAIL "<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a"
FAIL "<!DOCTYPE html><math><mtext><p><i></p>a"
FAIL "<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a"
PASS "<!DOCTYPE html><svg><foreignObject><p><i></p>a"
PASS "<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a"
PASS "<!DOCTYPE html><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><math></math>"
PASS "<!DOCTYPE html><body><math></math>"
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><option><math></math></option></select>"
PASS "<!DOCTYPE html><body><table><math></math></table>"
......
......@@ -42,7 +42,7 @@ FAIL "<svg><title><svg><div>"
PASS "<img <=\"\" FAIL>"
FAIL "<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>"
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 "<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>"
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