stdweb/webapi/html_elements/
template.rs

1use webcore::value::Reference;
2use webcore::try_from::TryInto;
3use webapi::event_target::{IEventTarget, EventTarget};
4use webapi::node::{INode, Node};
5use webapi::element::{IElement, Element};
6use webapi::html_element::{IHtmlElement, HtmlElement};
7use webapi::document_fragment::DocumentFragment;
8
9/// The HTML `<template>` element represents a mechanism for holding client-side content
10/// that is not to be rendered when a page is loaded but may subsequently be instantiated
11/// during runtime using JavaScript.
12///
13/// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template)
14// https://html.spec.whatwg.org/multipage/scripting.html#the-template-element
15#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
16#[reference(instance_of = "HTMLTemplateElement")]
17#[reference(subclass_of(EventTarget, Node, Element, HtmlElement))]
18pub struct TemplateElement( Reference );
19
20impl IEventTarget for TemplateElement {}
21impl INode for TemplateElement {}
22impl IElement for TemplateElement {}
23impl IHtmlElement for TemplateElement {}
24
25impl TemplateElement {
26    /// The content of the current template
27    ///
28    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement/content)
29    // https://html.spec.whatwg.org/multipage/scripting.html#the-template-element:documentfragment
30    #[inline]
31    pub fn content ( &self ) -> DocumentFragment {
32        js! (
33            return @{self}.content;
34        ).try_into().unwrap()
35    }
36}
37
38#[cfg(all(test, feature = "web_test"))]
39mod tests {
40    use super::*;
41    use webapi::html_element::HtmlElement;
42    use webapi::node::{Node, INode, CloneKind};
43
44    #[test]
45    fn test_template_content_with_clone_node() {
46        let tpl: TemplateElement = Node::from_html("<template><span>aaabbbcccddd</span></template>")
47            .unwrap()
48            .try_into()
49            .unwrap();
50
51        let n = tpl.content().clone_node(CloneKind::Deep).unwrap();
52        let child_nodes = n.child_nodes();
53        assert_eq!(child_nodes.len(), 1);
54
55        let span_element: HtmlElement = child_nodes.iter().next().unwrap().try_into().unwrap();
56
57        assert_eq!(span_element.node_name(), "SPAN");
58        assert_eq!(js!( return @{span_element}.innerHTML; ), "aaabbbcccddd");
59    }
60}