You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.9 KiB
67 lines
1.9 KiB
"use strict";
|
|
|
|
const HTMLElementImpl = require("./HTMLElement-impl").implementation;
|
|
|
|
const Document = require("../generated/Document");
|
|
const DocumentFragment = require("../generated/DocumentFragment");
|
|
|
|
const { cloningSteps, domSymbolTree } = require("../helpers/internal-constants");
|
|
const { clone } = require("../node");
|
|
|
|
class HTMLTemplateElementImpl extends HTMLElementImpl {
|
|
constructor(args, privateData) {
|
|
super(args, privateData);
|
|
|
|
const doc = this._appropriateTemplateContentsOwnerDocument(this._ownerDocument);
|
|
this._templateContents = DocumentFragment.createImpl([], {
|
|
ownerDocument: doc,
|
|
host: this
|
|
});
|
|
}
|
|
|
|
// https://html.spec.whatwg.org/multipage/scripting.html#appropriate-template-contents-owner-document
|
|
_appropriateTemplateContentsOwnerDocument(doc) {
|
|
if (!doc._isInertTemplateDocument) {
|
|
if (doc._associatedInertTemplateDocument === undefined) {
|
|
const newDoc = Document.createImpl([], {
|
|
options: {
|
|
parsingMode: doc._parsingMode,
|
|
encoding: doc._encoding
|
|
}
|
|
});
|
|
newDoc._isInertTemplateDocument = true;
|
|
|
|
doc._associatedInertTemplateDocument = newDoc;
|
|
}
|
|
|
|
doc = doc._associatedInertTemplateDocument;
|
|
}
|
|
|
|
return doc;
|
|
}
|
|
|
|
// https://html.spec.whatwg.org/multipage/scripting.html#template-adopting-steps
|
|
_adoptingSteps() {
|
|
const doc = this._appropriateTemplateContentsOwnerDocument(this._ownerDocument);
|
|
doc._adoptNode(this._templateContents);
|
|
}
|
|
|
|
get content() {
|
|
return this._templateContents;
|
|
}
|
|
|
|
[cloningSteps](copy, node, document, cloneChildren) {
|
|
if (!cloneChildren) {
|
|
return;
|
|
}
|
|
|
|
for (const child of domSymbolTree.childrenIterator(node._templateContents)) {
|
|
const childCopy = clone(child, copy._templateContents._ownerDocument, true);
|
|
copy._templateContents.appendChild(childCopy);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
implementation: HTMLTemplateElementImpl
|
|
};
|
|
|