Skip to content

Commit 3265b4f

Browse files
cloneNode
1 parent 0f0b9af commit 3265b4f

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/features/js_fetch/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//! runtime agnostic fetch implementation
1+
//! fetch implementation
22
33
use crate::features::js_fetch::spec::{do_fetch, FetchInit};
44
use quickjs_runtime::builder::QuickJsRuntimeBuilder;

src/modules/htmldom/mod.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,10 +1224,58 @@ fn init_node_proxy(realm: &QuickJsRealmAdapter) -> Result<QuickJsValueAdapter, J
12241224
Ok(node) => register_node(realm, node),
12251225
Err(e) => Err(e),
12261226
}
1227+
})
1228+
.method("cloneNode", |_rt, realm, instance_id, args| {
1229+
let deep = args.len() >= 1 && args[0].is_bool() && args[0].to_bool();
1230+
1231+
with_node(instance_id, |node| {
1232+
let cloned = clone_node(node, deep);
1233+
register_node(realm, cloned)
1234+
})
12271235
});
1236+
12281237
realm.install_proxy(proxy, true)
12291238
}
12301239

1240+
fn clone_node(node: &NodeRef, deep: bool) -> NodeRef {
1241+
match node.data() {
1242+
NodeData::Element(elem) => {
1243+
// Clone element data
1244+
let new_node = NodeRef::new_element(
1245+
elem.name.clone(),
1246+
elem.attributes
1247+
.borrow()
1248+
.map
1249+
.iter()
1250+
.map(|(k, v)| (k.clone(), v.clone())),
1251+
);
1252+
1253+
if deep {
1254+
// Recursively clone children if deep clone is requested
1255+
let mut child = node.first_child();
1256+
while let Some(child_node) = child {
1257+
new_node.append(clone_node(&child_node, true));
1258+
child = child_node.next_sibling();
1259+
}
1260+
}
1261+
new_node
1262+
}
1263+
NodeData::Text(text) => NodeRef::new_text(text.borrow().clone()),
1264+
NodeData::Comment(comment) => NodeRef::new_comment(comment.borrow().clone()),
1265+
NodeData::ProcessingInstruction(pi) => {
1266+
let (target, data) = &*pi.borrow();
1267+
NodeRef::new_processing_instruction(target.clone(), data.clone())
1268+
}
1269+
NodeData::Doctype(doctype) => NodeRef::new_doctype(
1270+
doctype.name.clone(),
1271+
doctype.public_id.clone(),
1272+
doctype.system_id.clone(),
1273+
),
1274+
NodeData::Document(_) => NodeRef::new_document(),
1275+
NodeData::DocumentFragment => NodeRef::new(NodeData::DocumentFragment),
1276+
}
1277+
}
1278+
12311279
fn get_num_attr(node: &NodeRef, attr_name: &str, default_value: i32) -> Result<i32, JsError> {
12321280
let mut cur_node = node.clone();
12331281

0 commit comments

Comments
 (0)