diff --git a/src/html/mod.rs b/src/html/mod.rs
index 125049c5..5252ada3 100644
--- a/src/html/mod.rs
+++ b/src/html/mod.rs
@@ -138,6 +138,19 @@ impl<'a, 'b> Iterator for Select<'a, 'b> {
}
}
+impl<'a, 'b> DoubleEndedIterator for Select<'a, 'b> {
+ fn next_back(&mut self) -> Option {
+ for node in self.inner.by_ref().rev() {
+ if let Some(element) = ElementRef::wrap(node) {
+ if element.parent().is_some() && self.selector.matches(&element) {
+ return Some(element);
+ }
+ }
+ }
+ None
+ }
+}
+
mod serializable;
mod tree_sink;
@@ -179,4 +192,16 @@ mod tests {
.unwrap();
assert_eq!(title.inner_html(), "abc");
}
+
+ #[test]
+ fn select_is_reversible() {
+ let html = Html::parse_document("element1
element2
element3
");
+ let selector = Selector::parse("p").unwrap();
+ let result: Vec<_> = html
+ .select(&selector)
+ .rev()
+ .map(|e| e.inner_html())
+ .collect();
+ assert_eq!(result, vec!["element3", "element2", "element1"]);
+ }
}