Better impl Display for Node, fix test

This commit is contained in:
Tyler Hallada 2020-04-22 14:32:15 -04:00
parent c9c89f3622
commit 87c1832896
2 changed files with 64 additions and 11 deletions

View File

@ -220,6 +220,27 @@ impl<'arena> fmt::Display for Node<'arena> {
} }
} }
impl<'arena> fmt::Display for NodeData<'arena> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
NodeData::Document => write!(f, "Document"),
NodeData::Doctype { name, .. } => write!(f, "Doctype: {}", name),
NodeData::Text { contents } => write!(
f,
"Text: {}...",
&contents.borrow().chars().take(10).collect::<String>()
),
NodeData::ProcessingInstruction { .. } => write!(f, "ProcessingInstruction: ..."),
NodeData::Comment { contents } => write!(
f,
"Comment: {}...",
&contents.chars().take(10).collect::<String>()
),
NodeData::Element { ref name, .. } => write!(f, "Element: {}", &name.local),
}
}
}
fn write_node<'arena>( fn write_node<'arena>(
node: &Node<'arena>, node: &Node<'arena>,
indent: usize, indent: usize,
@ -227,16 +248,44 @@ fn write_node<'arena>(
) -> fmt::Result { ) -> fmt::Result {
let indent_str = " ".repeat(indent); let indent_str = " ".repeat(indent);
writeln!(f, "{}Node {{", &indent_str)?; writeln!(f, "{}Node {{", &indent_str)?;
writeln!(f, "{} data: {:?}", &indent_str, node.data)?; writeln!(f, "{} data: {}", &indent_str, node.data)?;
let mut child = node.first_child.get();
if child.is_some() { if let Some(parent) = node.parent.get() {
writeln!(f, "{} children: [", &indent_str)?; writeln!(f, "{} parent: ", &indent_str)?;
while let Some(next_child) = child { write_linked_node(parent, indent + 2, f)?;
write_node(next_child, indent + 2, f)?;
child = next_child.next_sibling.get();
}
writeln!(f, "{} ]", &indent_str)?;
} }
if let Some(next_sibling) = node.next_sibling.get() {
writeln!(f, "{} next_sibling: ", &indent_str)?;
write_linked_node(next_sibling, indent + 2, f)?;
}
if let Some(previous_sibling) = node.previous_sibling.get() {
writeln!(f, "{} previous_sibling: ", &indent_str)?;
write_linked_node(previous_sibling, indent + 2, f)?;
}
if let Some(first_child) = node.first_child.get() {
writeln!(f, "{} first_child: ", &indent_str)?;
write_linked_node(first_child, indent + 2, f)?;
}
if let Some(last_child) = node.last_child.get() {
writeln!(f, "{} last_child: ", &indent_str)?;
write_linked_node(last_child, indent + 2, f)?;
}
writeln!(f, "{}}}", &indent_str)
}
fn write_linked_node<'arena>(
node: &Node<'arena>,
indent: usize,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
let indent_str = " ".repeat(indent);
writeln!(f, "{}Node {{", &indent_str)?;
writeln!(f, "{} data: {}", &indent_str, node.data)?;
writeln!(f, "{}}}", &indent_str) writeln!(f, "{}}}", &indent_str)
} }

View File

@ -97,13 +97,18 @@ impl<'arena> Sanitizer<'arena> {
if self.should_unwrap_node(node) { if self.should_unwrap_node(node) {
let sibling = node.next_sibling.get(); let sibling = node.next_sibling.get();
println!("unwrapping node");
if self.should_remove_contents_when_unwrapped(node) { if self.should_remove_contents_when_unwrapped(node) {
println!("detaching node");
node.detach(); node.detach();
println!("post-detach: {}", &node);
} else if let Some(unwrapped_node) = node.unwrap() { } else if let Some(unwrapped_node) = node.unwrap() {
println!("traversing unwrapped node");
self.traverse(unwrapped_node); self.traverse(unwrapped_node);
} }
if let Some(sibling) = sibling { if let Some(sibling) = sibling {
println!("traversing sibling");
self.traverse(sibling); self.traverse(sibling);
} }
@ -316,7 +321,6 @@ mod test {
assert_eq!(str::from_utf8(&output).unwrap(), "<html><div></div></html>"); assert_eq!(str::from_utf8(&output).unwrap(), "<html><div></div></html>");
} }
// FIXME: this is failing, need to fix the traversal & detach algorithm
#[test] #[test]
fn remove_script_elements_and_content_in_separate_sub_trees() { fn remove_script_elements_and_content_in_separate_sub_trees() {
let mut disallow_script_config = EMPTY_CONFIG.clone(); let mut disallow_script_config = EMPTY_CONFIG.clone();
@ -328,7 +332,7 @@ mod test {
.insert(local_name!("script")); .insert(local_name!("script"));
let sanitizer = Sanitizer::new(&disallow_script_config, vec![]); let sanitizer = Sanitizer::new(&disallow_script_config, vec![]);
let mut mock_data = MockRead::new( let mut mock_data = MockRead::new(
"<div><script>alert('haX0rz')</script><div><div><script>two</script></div>", "<div><script>alert('haX0rz')</script></div><div><script>two</script></div>",
); );
let mut output = vec![]; let mut output = vec![];
sanitizer sanitizer