diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | src/emitter.rs | 2 | ||||
-rw-r--r-- | src/tokenizer.rs | 2 | ||||
-rw-r--r-- | tests/test_spans.rs | 15 |
4 files changed, 17 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 259447b..8579e4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ * Fixed attribute value spans being wrong for values containing character references. +* Fixed most error spans mistakenly being empty. + * Fixed some error spans being off-by-one (`eof-*`). diff --git a/src/emitter.rs b/src/emitter.rs index a014025..d28b11b 100644 --- a/src/emitter.rs +++ b/src/emitter.rs @@ -339,7 +339,7 @@ impl<O: Offset> Emitter<O> for DefaultEmitter<O> { *self_closing = true; } Token::EndTag(_) => { - self.emit_error(Error::EndTagWithTrailingSolidus, offset - 1..offset - 1); + self.emit_error(Error::EndTagWithTrailingSolidus, offset - 1..offset); } _ => { debug_assert!(false); diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 6cf930f..871074e 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -185,7 +185,7 @@ impl<R: Reader + Position<O>, O: Offset, E: Emitter<O>> Tokenizer<R, O, E> { | Error::EofInDoctype | Error::EofInScriptHtmlCommentLikeText | Error::EofInTag => self.reader.position()..self.reader.position(), - _ => self.reader.position() - 1..self.reader.position() - 1, + _ => self.reader.position() - 1..self.reader.position(), }; self.emitter.emit_error(error, span); } diff --git a/tests/test_spans.rs b/tests/test_spans.rs index e839f53..28342ea 100644 --- a/tests/test_spans.rs +++ b/tests/test_spans.rs @@ -213,9 +213,20 @@ fn doctype_id_spans() { fn annotate_errors(html: &'static str) -> String { let mut labels = Vec::new(); for token in tokenizer(html) { - if let Token::Error { error, span } = token { - labels.push((span, error.code())); + let Token::Error { error, span } = token else { + continue; + }; + + if span.start == span.end { + if span.start != html.len() { + panic!("empty error spans are only allowed at the very end of the source (for eof errors)"); + } + } else { + assert!(span.start < span.end); + assert!(span.end <= html.len()); } + + labels.push((span, error.code())); } annotate(html, labels) } |