Serenity Operating System
at master 63 lines 2.0 kB view raw
1/* 2 * Copyright (c) 2020, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibWeb/Bindings/MainThreadVM.h> 8#include <LibWeb/DOM/Document.h> 9#include <LibWeb/HTML/HTMLTemplateElement.h> 10 11namespace Web::HTML { 12 13HTMLTemplateElement::HTMLTemplateElement(DOM::Document& document, DOM::QualifiedName qualified_name) 14 : HTMLElement(document, move(qualified_name)) 15{ 16} 17 18HTMLTemplateElement::~HTMLTemplateElement() = default; 19 20JS::ThrowCompletionOr<void> HTMLTemplateElement::initialize(JS::Realm& realm) 21{ 22 MUST_OR_THROW_OOM(Base::initialize(realm)); 23 set_prototype(&Bindings::ensure_web_prototype<Bindings::HTMLTemplateElementPrototype>(realm, "HTMLTemplateElement")); 24 25 m_content = MUST_OR_THROW_OOM(heap().allocate<DOM::DocumentFragment>(realm, m_document->appropriate_template_contents_owner_document())); 26 m_content->set_host(this); 27 28 return {}; 29} 30 31void HTMLTemplateElement::visit_edges(Cell::Visitor& visitor) 32{ 33 Base::visit_edges(visitor); 34 visitor.visit(m_content.ptr()); 35} 36 37// https://html.spec.whatwg.org/multipage/scripting.html#the-template-element:concept-node-adopt-ext 38void HTMLTemplateElement::adopted_from(DOM::Document&) 39{ 40 // 1. Let doc be node's node document's appropriate template contents owner document. 41 auto doc = document().appropriate_template_contents_owner_document(); 42 43 // 2. Adopt node's template contents (a DocumentFragment object) into doc. 44 doc->adopt_node(content()); 45} 46 47// https://html.spec.whatwg.org/multipage/scripting.html#the-template-element:concept-node-clone-ext 48void HTMLTemplateElement::cloned(Node& copy, bool clone_children) 49{ 50 if (!clone_children) 51 return; 52 53 auto& template_clone = verify_cast<HTMLTemplateElement>(copy); 54 55 content()->for_each_child([&](auto& child) { 56 auto cloned_child = child.clone_node(&template_clone.content()->document(), true); 57 58 // FIXME: Should this use TreeNode::append_child instead? 59 MUST(template_clone.content()->append_child(cloned_child)); 60 }); 61} 62 63}