fix(js): parse fragments in their insertion context
This commit is contained in:
1 parent
35fa61032b
commit
a2fd4d1735
5 files changed
+60
-47
No files matched your search
@@ -391,7 +391,16 @@ fn op_dom_inner(state: &OpState, cmd: String, arg1: String, arg2: String) -> Str
|
||||
dom.detach(child);
|
||||
}
|
||||
if !arg2.is_empty() {
|
||||
let fragment = obscura_dom::parse_fragment(&arg2);
|
||||
let context_name = dom
|
||||
.with_node(target, |node| match &node.data {
|
||||
NodeData::Element { name, .. } => Some(name.clone()),
|
||||
_ => None,
|
||||
})
|
||||
.flatten();
|
||||
let fragment = match context_name {
|
||||
Some(name) => obscura_dom::parse_fragment_with_context(&arg2, name),
|
||||
None => obscura_dom::parse_fragment(&arg2),
|
||||
};
|
||||
let import_root = fragment.find_body_or_root();
|
||||
dom.import_children_from(target, &fragment, import_root);
|
||||
}
|
||||
|
||||
@@ -1346,6 +1346,32 @@ mod tests {
|
||||
assert_eq!(out, serde_json::json!("SyntaxError"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn insert_adjacent_html_keeps_leading_comments_in_table_contexts() {
|
||||
let mut rt = setup_runtime(
|
||||
r#"<html><body><table><tbody id="tb"><tr id="row"></tr></tbody></table></body></html>"#,
|
||||
);
|
||||
let out = rt
|
||||
.evaluate(
|
||||
"(function(){var tb=document.getElementById('tb');tb.insertAdjacentHTML('beforeend','<!--m--><tr><td>v</td></tr>');var row=document.getElementById('row');row.insertAdjacentHTML('beforeend','<!--n--><td>x</td>');return Array.from(tb.childNodes).map(function(n){return n.nodeName}).join('|')+';'+Array.from(row.childNodes).map(function(n){return n.nodeName}).join('|');})()",
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(out, serde_json::json!("TR|#comment|TR;#comment|TD"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn insert_adjacent_html_uses_the_insertion_element_as_context() {
|
||||
let mut rt = setup_runtime(
|
||||
r#"<html><body><div id="d"></div><table id="table"><tbody id="tb"></tbody></table></body></html>"#,
|
||||
);
|
||||
let out = rt
|
||||
.evaluate(
|
||||
"(function(){var d=document.getElementById('d');d.insertAdjacentHTML('beforeend','<tr><td>v</td></tr>');var table=document.getElementById('table');table.insertAdjacentHTML('beforeend','<tr><td>x</td></tr>');var tb=document.getElementById('tb');tb.insertAdjacentHTML('beforeend','<tr><td>y</td></tr>tail');return d.firstChild.nodeName+':'+d.textContent+';'+table.lastElementChild.tagName+';'+Array.from(tb.childNodes).map(function(n){return n.nodeName+(n.data?':'+n.data:'')}).join('|');})()",
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(out, serde_json::json!("#text:v;TBODY;TR|#text:tail"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_document_title() {
|
||||
let mut rt = setup_runtime("<html><head><title>Test</title></head><body></body></html>");
|
||||
|
||||
Reference in new issue
Block a user