@@ -138,7 +138,7 @@ impl Vdom {
138138 container.set_inner_html("");
139139
140140 // Create a dummy `<div/>` in our container.
141− let current_root = Node::element(&dom_buffers[0], "div", [], [], []);
141+ let current_root = Node::element(&dom_buffers[0], "div", [], [], [], None);
142142 let current_root = Some(unsafe { extend_node_lifetime(current_root) });
143143 let window = web_sys::window().expect("should have acess to the Window");
144144 let document = window
@@ -287,43 +287,32 @@ impl VdomInnerExclusive {
287287 self.change_list.emit_set_text(new_text);
288288 }
289289 }
290− (&Node::Text(_), Node::Element(_))
291− | (&Node::Text(_), Node::NamespacedElement(_, _)) => {
290+ (&Node::Text(_), Node::Element(_)) => {
292291 debug!(" replacing a text node with an element");
293292 self.create(registry, new);
294293 self.change_list.emit_replace_with();
295294 }
296− (&Node::Element(_), Node::Text(_))
297− | (&Node::NamespacedElement(_, _), Node::Text(_)) => {
295+ (&Node::Element(_), Node::Text(_)) => {
298296 debug!(" replacing an element with a text node");
299297 self.create(registry, new);
300298 self.change_list.emit_replace_with();
301299 }
302− (&Node::Element(ref new_element_node), Node::Element(ref old_element_node))
303− | (
304− &Node::NamespacedElement(_, ref new_element_node),
305− Node::Element(ref old_element_node),
306− )
307− | (
308− &Node::Element(ref new_element_node),
309− Node::NamespacedElement(_, ref old_element_node),
310− )
311− | (
312− &Node::NamespacedElement(_, ref new_element_node),
313− Node::NamespacedElement(_, ref old_element_node),
314− ) => {
315− let ElementNode {
300+ (
301+ &Node::Element(ElementNode {
316302 tag_name: new_tag_name,
317303 listeners: new_listeners,
318304 attributes: new_attributes,
319305 children: new_children,
320− } = new_element_node;
321− let ElementNode {
306+ namespace: _,
307+ }),
308+ Node::Element(ElementNode {
322309 tag_name: old_tag_name,
323310 listeners: old_listeners,
324311 attributes: old_attributes,
325312 children: old_children,
326− } = old_element_node;
313+ namespace: _,
314+ }),
315+ ) => {
327316 debug!(" updating an element");
328317 if new_tag_name != old_tag_name {
329318 debug!(" different tag names; creating new element and replacing old element");
@@ -475,32 +464,13 @@ impl VdomInnerExclusive {
475464 listeners,
476465 attributes,
477466 children,
467+ namespace,
478468 }) => {
479− self.change_list.emit_create_element(tag_name);
480− for l in listeners {
481− unsafe {
482− registry.add(l);
483− }
484− self.change_list.emit_new_event_listener(l);
469+ if let Some(namespace) = namespace {
470+ self.change_list.emit_create_element_ns(tag_name, namespace);
471+ } else {
472+ self.change_list.emit_create_element(tag_name);
485473 }
486− for attr in attributes {
487− self.change_list.emit_set_attribute(&attr.name, &attr.value);
488− }
489− for child in children {
490− self.create(registry, child.clone());
491− self.change_list.emit_append_child();
492− }
493− }
494− Node::NamespacedElement(
495− namepsace,
496− ElementNode {
497− tag_name,
498− listeners,
499− attributes,
500− children,
501− },
502− ) => {
503− self.change_list.emit_create_element_ns(tag_name, namepsace);
504474 for l in listeners {
505475 unsafe {
506476 registry.add(l);
@@ -508,7 +478,7 @@ impl VdomInnerExclusive {
508478 self.change_list.emit_new_event_listener(l);
509479 }
510480 for attr in attributes {
511− if attr.name == "xmlns" {
481+ if namespace.is_none() || attr.name == "xmlns" {
512482 self.change_list.emit_set_attribute(&attr.name, &attr.value);
513483 } else {
514484 self.change_list