if let Some(pos) = tags.iter().rev().position(|(t, _)| *t == tag_name) {
// Because this is from a `rev` iterator, the position is reversed as well!
let pos = tags.len() - 1 - pos;
+ // If the tag is nested inside a "<script>", not warning should be emitted.
+ let should_not_warn =
+ tags.iter().take(pos + 1).any(|(at, _)| at == "script" || at == "style");
for (last_tag_name, last_tag_span) in tags.drain(pos + 1..) {
- if ALLOWED_UNCLOSED.iter().any(|&at| at == &last_tag_name) {
+ if should_not_warn || ALLOWED_UNCLOSED.iter().any(|&at| at == &last_tag_name) {
continue;
}
// `tags` is used as a queue, meaning that everything after `pos` is included inside it.
/// <h3>
//~^ ERROR unclosed HTML tag `h3`
pub fn c() {}
+
+// Unclosed tags shouldn't warn if they are nested inside a <script> elem.
+/// <script>
+/// <h3><div>
+/// </script>
+/// <script>
+/// <div>
+/// <p>
+/// </div>
+/// </script>
+pub fn d() {}
+
+// Unclosed tags shouldn't warn if they are nested inside a <style> elem.
+/// <style>
+/// <h3><div>
+/// </style>
+/// <style>
+/// <div>
+/// <p>
+/// </div>
+/// </style>
+pub fn e() {}