@@ -1224,10 +1224,58 @@ fn init_node_proxy(realm: &QuickJsRealmAdapter) -> Result<QuickJsValueAdapter, J
1224
1224
Ok ( node) => register_node ( realm, node) ,
1225
1225
Err ( e) => Err ( e) ,
1226
1226
}
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
+ } )
1227
1235
} ) ;
1236
+
1228
1237
realm. install_proxy ( proxy, true )
1229
1238
}
1230
1239
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
+
1231
1279
fn get_num_attr ( node : & NodeRef , attr_name : & str , default_value : i32 ) -> Result < i32 , JsError > {
1232
1280
let mut cur_node = node. clone ( ) ;
1233
1281
0 commit comments