@@ -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+
12311279fn 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