html: Add missing condition to 'in cell' insertion mode, required by spec

In section 12.2.6.4.15 of the spec, there is a condition that the current node is a td or th element, which is not implemented. This can lead to a panic when the open elements stack is popped whilst empty, as outlined in golang/go#30600. This commit implements that check.

Fixes golang/go#30600

Change-Id: I4837815e2edce21b58a985a100d93d146bf71e24
GitHub-Last-Rev: 79084c5a8481cd2cf8e4df632ffa358c1e41335b
GitHub-Pull-Request: golang/net#41
Reviewed-on: https://go-review.googlesource.com/c/net/+/172377
Reviewed-by: Kunpei Sakai <namusyaka@gmail.com>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
Run-TryBot: Kunpei Sakai <namusyaka@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/html/parse.go b/html/parse.go
index 2aaf2ff..e0bfc1f 100644
--- a/html/parse.go
+++ b/html/parse.go
@@ -1744,8 +1744,9 @@
 				return true
 			}
 			// Close the cell and reprocess.
-			p.popUntil(tableScope, a.Td, a.Th)
-			p.clearActiveFormattingElements()
+			if p.popUntil(tableScope, a.Td, a.Th) {
+				p.clearActiveFormattingElements()
+			}
 			p.im = inRowIM
 			return false
 		}
diff --git a/html/testdata/go/issue_30600_parse_panics_in_cell_mode.dat b/html/testdata/go/issue_30600_parse_panics_in_cell_mode.dat
new file mode 100644
index 0000000..741f4b1
--- /dev/null
+++ b/html/testdata/go/issue_30600_parse_panics_in_cell_mode.dat
@@ -0,0 +1,12 @@
+#data
+<table><math><th><mo><select></table>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math th>
+|         <math mo>
+|           <select>
+|     <table>
diff --git a/html/testdata/go/issue_30961_error_nested_unknown_tag_types.dat b/html/testdata/go/issue_30961_error_nested_unknown_tag_types.dat
new file mode 100644
index 0000000..e314964
--- /dev/null
+++ b/html/testdata/go/issue_30961_error_nested_unknown_tag_types.dat
@@ -0,0 +1,11 @@
+#data
+<html><head></head><body><tag1><tag2 /><p></p></tag1><div></div></body></html>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <tag1>
+|       <tag2>
+|         <p>
+|     <div>
diff --git a/html/testdata/go/template.dat b/html/testdata/go/template.dat
index 4619337..ceaf022 100644
--- a/html/testdata/go/template.dat
+++ b/html/testdata/go/template.dat
@@ -60,15 +60,3 @@
 |       <math template>
 |         <math mn>
 |           <b>
-
-#data
-<html><head></head><body><tag1><tag2 /><p></p></tag1><div></div></body></html>
-#errors
-#document
-| <html>
-|   <head>
-|   <body>
-|     <tag1>
-|       <tag2>
-|         <p>
-|     <div>