@@ -267,6 +267,24 @@ enum ChangeDiscriminant {
267267 /// dropString(id);
268268 /// ```
269269 DropString = 15,
270+
271+ /// Immediates: `(pointer, length)`
272+ ///
273+ /// Stack: `[...] -> [... Node]`
274+ ///
275+ /// ```text
276+ /// stack.push(createElement(String(pointer, length))
277+ /// ```
278+ CreateElementNS = 16,
279+
280+ /// Immediates: `(pointer, length)`
281+ ///
282+ /// Stack: `[...] -> [... Node]`
283+ ///
284+ /// ```text
285+ /// stack.push(createElement(String(pointer, length))
286+ /// ```
287+ SetAttributeNS = 17,
270288}
271289
272290// Allocation utilities to ensure that we only allocation sequences of `u32`s
@@ -361,6 +379,14 @@ impl ChangeList {
361379 self.op2(ChangeDiscriminant::SetAttribute, name_id, value_id);
362380 }
363381
382+ pub(crate) fn emit_set_attribute_ns(&mut self, name: &str, value: &str, ns: &str) {
383+ debug!("emit_set_attribute_ns({:?}, {:?})", name, value, ns);
384+ let ns_id = self.ensure_string(ns);
385+ let name_id = self.ensure_string(name);
386+ let value_id = self.ensure_string(value);
387+ self.op3(ChangeDiscriminant::SetAttributeNS, name_id, value_id, ns_id);
388+ }
389+
364390 pub(crate) fn emit_remove_attribute(&mut self, name: &str) {
365391 debug!("emit_remove_attribute({:?})", name);
366392 let name_id = self.ensure_string(name);
@@ -402,6 +428,13 @@ impl ChangeList {
402428 self.op1(ChangeDiscriminant::CreateElement, tag_name_id);
403429 }
404430
431+ pub(crate) fn emit_create_element_ns(&mut self, tag_name: &str, ns: &str) {
432+ debug!("emit_create_element_ns({:?}, {:?})", tag_name, ns);
433+ let tag_name_id = self.ensure_string(tag_name);
434+ let ns_id = self.ensure_string(ns);
435+ self.op2(ChangeDiscriminant::CreateElementNS, tag_name_id, ns_id);
436+ }
437+
405438 pub(crate) fn emit_new_event_listener(&mut self, listener: &Listener) {
406439 debug!("emit_new_event_listener({:?})", listener);
407440 let (a, b) = listener.get_callback_parts();