diff --git a/html5ever/src/tree_builder/mod.rs b/html5ever/src/tree_builder/mod.rs index 2310251b..4627b956 100644 --- a/html5ever/src/tree_builder/mod.rs +++ b/html5ever/src/tree_builder/mod.rs @@ -1376,6 +1376,25 @@ where fn insert_phantom(&self, name: LocalName) -> Handle { self.insert_element(Push, ns!(html), name, vec![]) } + + fn insert_foreign_element( + &self, + tag: Tag, + ns: Namespace, + only_add_to_element_stack: bool, + ) -> Handle { + let adjusted_insertion_location = self.appropriate_place_for_insertion(None); + let qname = QualName::new(None, ns, tag.name); + let elem = create_element(&self.sink, qname.clone(), tag.attrs.clone()); + + if !only_add_to_element_stack { + self.insert_at(adjusted_insertion_location, AppendNode(elem.clone())); + } + + self.push(&elem); + + elem + } //ยง END fn should_attach_declarative_shadow(&self, tag: &Tag) -> bool { @@ -1416,9 +1435,14 @@ where is_shadow_root_mode && allow_declarative_shadow_roots && adjusted_current_node_not_topmost } - fn attach_declarative_shadow(&self, tag: &Tag) -> Result<(), String> { + fn attach_declarative_shadow( + &self, + tag: &Tag, + shadow_host: &Handle, + template: &Handle, + ) -> Result<(), String> { self.sink - .attach_declarative_shadow(self.open_elems.borrow().last().unwrap(), tag.attrs.clone()) + .attach_declarative_shadow(shadow_host, template, tag.attrs.clone()) } fn create_formatting_element_for(&self, tag: Tag) -> Handle { diff --git a/html5ever/src/tree_builder/rules.rs b/html5ever/src/tree_builder/rules.rs index f7a76bfd..6c6deacc 100644 --- a/html5ever/src/tree_builder/rules.rs +++ b/html5ever/src/tree_builder/rules.rs @@ -160,10 +160,12 @@ where self.template_modes.borrow_mut().push(InTemplate); if (self.should_attach_declarative_shadow(&tag)) { - if self.attach_declarative_shadow(&tag).is_err() { - // TODO: - // insert at the adjusted insertion location - // with the result of insert a foreign element for template tag + let shadow_host = self.open_elems.borrow().last().unwrap().clone(); + let template = self.insert_foreign_element(tag.clone(), ns!(html), true); + + if self.attach_declarative_shadow(&tag, &shadow_host, &template).is_err() { + let adjusted_insertion_location = self.appropriate_place_for_insertion(None); + self.insert_at(adjusted_insertion_location, AppendNode(template.clone())); } } else { self.insert_element_for(tag); diff --git a/markup5ever/interface/tree_builder.rs b/markup5ever/interface/tree_builder.rs index 139fb6c7..8083a727 100644 --- a/markup5ever/interface/tree_builder.rs +++ b/markup5ever/interface/tree_builder.rs @@ -269,6 +269,7 @@ pub trait TreeSink { fn attach_declarative_shadow( &self, _location: &Self::Handle, + _template: &Self::Handle, _attrs: Vec, ) -> Result<(), String> { Err(String::from(