| 
									
										
										
										
											2020-08-01 03:07:00 +01:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-04-28 22:46:44 +02:00
										 |  |  |  * Copyright (c) 2020, the SerenityOS developers. | 
					
						
							| 
									
										
										
										
											2020-08-01 03:07:00 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-04-22 01:24:48 -07:00
										 |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							| 
									
										
										
										
											2020-08-01 03:07:00 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  | #include <LibWeb/Bindings/MainThreadVM.h>
 | 
					
						
							| 
									
										
										
										
											2020-08-19 22:30:33 +01:00
										 |  |  | #include <LibWeb/DOM/Document.h>
 | 
					
						
							| 
									
										
										
										
											2020-08-01 03:07:00 +01:00
										 |  |  | #include <LibWeb/HTML/HTMLTemplateElement.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::HTML { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 21:00:52 +01:00
										 |  |  | HTMLTemplateElement::HTMLTemplateElement(DOM::Document& document, DOM::QualifiedName qualified_name) | 
					
						
							| 
									
										
										
										
											2021-02-07 11:20:15 +01:00
										 |  |  |     : HTMLElement(document, move(qualified_name)) | 
					
						
							| 
									
										
										
										
											2020-08-01 03:07:00 +01:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:21:51 -06:00
										 |  |  | HTMLTemplateElement::~HTMLTemplateElement() = default; | 
					
						
							| 
									
										
										
										
											2020-08-01 03:07:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-29 13:06:24 +02:00
										 |  |  | void HTMLTemplateElement::initialize(JS::Realm& realm) | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-10-29 13:06:24 +02:00
										 |  |  |     Base::initialize(realm); | 
					
						
							| 
									
										
										
										
											2023-01-10 06:28:20 -05:00
										 |  |  |     set_prototype(&Bindings::ensure_web_prototype<Bindings::HTMLTemplateElementPrototype>(realm, "HTMLTemplateElement")); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-29 13:06:24 +02:00
										 |  |  |     m_content = heap().allocate<DOM::DocumentFragment>(realm, m_document->appropriate_template_contents_owner_document()); | 
					
						
							|  |  |  |     m_content->set_host(this); | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-29 13:06:24 +02:00
										 |  |  | void HTMLTemplateElement::visit_edges(Cell::Visitor& visitor) | 
					
						
							| 
									
										
										
										
											2020-08-19 22:30:33 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-10-29 13:06:24 +02:00
										 |  |  |     Base::visit_edges(visitor); | 
					
						
							|  |  |  |     visitor.visit(m_content.ptr()); | 
					
						
							| 
									
										
										
										
											2020-08-19 22:30:33 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-05 05:40:47 +01:00
										 |  |  | // https://html.spec.whatwg.org/multipage/scripting.html#the-template-element:concept-node-adopt-ext
 | 
					
						
							|  |  |  | void HTMLTemplateElement::adopted_from(DOM::Document&) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-10-29 13:06:24 +02:00
										 |  |  |     // 1. Let doc be node's node document's appropriate template contents owner document.
 | 
					
						
							|  |  |  |     auto doc = document().appropriate_template_contents_owner_document(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 2. Adopt node's template contents (a DocumentFragment object) into doc.
 | 
					
						
							|  |  |  |     doc->adopt_node(content()); | 
					
						
							| 
									
										
										
										
											2021-07-05 05:40:47 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-05 05:40:07 +01:00
										 |  |  | // https://html.spec.whatwg.org/multipage/scripting.html#the-template-element:concept-node-clone-ext
 | 
					
						
							|  |  |  | void HTMLTemplateElement::cloned(Node& copy, bool clone_children) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!clone_children) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto& template_clone = verify_cast<HTMLTemplateElement>(copy); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     content()->for_each_child([&](auto& child) { | 
					
						
							|  |  |  |         auto cloned_child = child.clone_node(&template_clone.content()->document(), true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // FIXME: Should this use TreeNode::append_child instead?
 | 
					
						
							| 
									
										
										
										
											2022-10-30 17:50:04 +00:00
										 |  |  |         MUST(template_clone.content()->append_child(cloned_child)); | 
					
						
							| 
									
										
										
										
											2021-07-05 05:40:07 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-01 03:07:00 +01:00
										 |  |  | } |