happy-dom 5.3.2 → 5.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of happy-dom might be problematic. Click here for more details.
- package/lib/nodes/html-template-element/HTMLTemplateElement.d.ts +29 -38
- package/lib/nodes/html-template-element/HTMLTemplateElement.js +51 -42
- package/lib/nodes/html-template-element/HTMLTemplateElement.js.map +1 -1
- package/package.json +2 -2
- package/src/nodes/html-template-element/HTMLTemplateElement.ts +58 -42
@@ -10,72 +10,63 @@ import IHTMLTemplateElement from './IHTMLTemplateElement';
|
|
10
10
|
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement.
|
11
11
|
*/
|
12
12
|
export default class HTMLTemplateElement extends HTMLElement implements IHTMLTemplateElement {
|
13
|
-
|
13
|
+
readonly content: IDocumentFragment;
|
14
14
|
/**
|
15
|
-
*
|
16
|
-
|
17
|
-
|
15
|
+
* @override
|
16
|
+
*/
|
17
|
+
get innerHTML(): string;
|
18
|
+
/**
|
19
|
+
* @override
|
18
20
|
*/
|
19
|
-
|
21
|
+
set innerHTML(html: string);
|
20
22
|
/**
|
21
|
-
*
|
22
|
-
|
23
|
-
|
23
|
+
* @override
|
24
|
+
*/
|
25
|
+
get outerHTML(): string;
|
26
|
+
/**
|
27
|
+
* @override
|
28
|
+
*/
|
29
|
+
set outerHTML(_html: string);
|
30
|
+
/**
|
31
|
+
* @override
|
24
32
|
*/
|
25
33
|
get previousSibling(): INode;
|
26
34
|
/**
|
27
|
-
*
|
28
|
-
*
|
29
|
-
* @returns Node.
|
35
|
+
* @override
|
30
36
|
*/
|
31
37
|
get nextSibling(): INode;
|
32
38
|
/**
|
33
|
-
*
|
34
|
-
*
|
35
|
-
* @returns Node.
|
39
|
+
* @override
|
36
40
|
*/
|
37
41
|
get firstChild(): INode;
|
38
42
|
/**
|
39
|
-
*
|
40
|
-
*
|
41
|
-
* @returns Node.
|
43
|
+
* @override
|
42
44
|
*/
|
43
45
|
get lastChild(): INode;
|
44
46
|
/**
|
45
|
-
*
|
46
|
-
|
47
|
-
|
48
|
-
|
47
|
+
* @override
|
48
|
+
*/
|
49
|
+
getInnerHTML(options?: {
|
50
|
+
includeShadowRoots?: boolean;
|
51
|
+
}): string;
|
52
|
+
/**
|
53
|
+
* @override
|
49
54
|
*/
|
50
55
|
appendChild(node: INode): INode;
|
51
56
|
/**
|
52
|
-
*
|
53
|
-
*
|
54
|
-
* @param node Node to remove.
|
57
|
+
* @override
|
55
58
|
*/
|
56
59
|
removeChild(node: Node): INode;
|
57
60
|
/**
|
58
|
-
*
|
59
|
-
*
|
60
|
-
* @param newNode Node to insert.
|
61
|
-
* @param referenceNode Node to insert before.
|
62
|
-
* @returns Inserted node.
|
61
|
+
* @override
|
63
62
|
*/
|
64
63
|
insertBefore(newNode: INode, referenceNode: INode): INode;
|
65
64
|
/**
|
66
|
-
*
|
67
|
-
*
|
68
|
-
* @param newChild New child.
|
69
|
-
* @param oldChild Old child.
|
70
|
-
* @returns Replaced node.
|
65
|
+
* @override
|
71
66
|
*/
|
72
67
|
replaceChild(newChild: INode, oldChild: INode): INode;
|
73
68
|
/**
|
74
|
-
* Clones a node.
|
75
|
-
*
|
76
69
|
* @override
|
77
|
-
* @param [deep=false] "true" to clone deep.
|
78
|
-
* @returns Cloned node.
|
79
70
|
*/
|
80
71
|
cloneNode(deep?: boolean): IHTMLTemplateElement;
|
81
72
|
}
|
@@ -4,6 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const HTMLElement_1 = __importDefault(require("../html-element/HTMLElement"));
|
7
|
+
const XMLParser_1 = __importDefault(require("../../xml-parser/XMLParser"));
|
8
|
+
const XMLSerializer_1 = __importDefault(require("../../xml-serializer/XMLSerializer"));
|
9
|
+
const DOMException_1 = __importDefault(require("../../exception/DOMException"));
|
7
10
|
/**
|
8
11
|
* HTML Template Element.
|
9
12
|
*
|
@@ -13,97 +16,103 @@ const HTMLElement_1 = __importDefault(require("../html-element/HTMLElement"));
|
|
13
16
|
class HTMLTemplateElement extends HTMLElement_1.default {
|
14
17
|
constructor() {
|
15
18
|
super(...arguments);
|
16
|
-
this.
|
19
|
+
this.content = this.ownerDocument.createDocumentFragment();
|
17
20
|
}
|
18
21
|
/**
|
19
|
-
*
|
20
|
-
*
|
21
|
-
* @returns Content.
|
22
|
+
* @override
|
22
23
|
*/
|
23
|
-
get
|
24
|
-
|
25
|
-
|
24
|
+
get innerHTML() {
|
25
|
+
return this.getInnerHTML();
|
26
|
+
}
|
27
|
+
/**
|
28
|
+
* @override
|
29
|
+
*/
|
30
|
+
set innerHTML(html) {
|
31
|
+
for (const child of this.content.childNodes.slice()) {
|
32
|
+
this.content.removeChild(child);
|
33
|
+
}
|
34
|
+
for (const node of XMLParser_1.default.parse(this.ownerDocument, html).childNodes.slice()) {
|
35
|
+
this.content.appendChild(node);
|
26
36
|
}
|
27
|
-
return this._contentElement;
|
28
37
|
}
|
29
38
|
/**
|
30
|
-
*
|
31
|
-
|
32
|
-
|
39
|
+
* @override
|
40
|
+
*/
|
41
|
+
get outerHTML() {
|
42
|
+
return new XMLSerializer_1.default().serializeToString(this.content);
|
43
|
+
}
|
44
|
+
/**
|
45
|
+
* @override
|
46
|
+
*/
|
47
|
+
set outerHTML(_html) {
|
48
|
+
throw new DOMException_1.default(`Failed to set the 'outerHTML' property on 'Element': This element has no parent node.`);
|
49
|
+
}
|
50
|
+
/**
|
51
|
+
* @override
|
33
52
|
*/
|
34
53
|
get previousSibling() {
|
35
54
|
return this.content.previousSibling;
|
36
55
|
}
|
37
56
|
/**
|
38
|
-
*
|
39
|
-
*
|
40
|
-
* @returns Node.
|
57
|
+
* @override
|
41
58
|
*/
|
42
59
|
get nextSibling() {
|
43
60
|
return this.content.nextSibling;
|
44
61
|
}
|
45
62
|
/**
|
46
|
-
*
|
47
|
-
*
|
48
|
-
* @returns Node.
|
63
|
+
* @override
|
49
64
|
*/
|
50
65
|
get firstChild() {
|
51
66
|
return this.content.firstChild;
|
52
67
|
}
|
53
68
|
/**
|
54
|
-
*
|
55
|
-
*
|
56
|
-
* @returns Node.
|
69
|
+
* @override
|
57
70
|
*/
|
58
71
|
get lastChild() {
|
59
72
|
return this.content.lastChild;
|
60
73
|
}
|
61
74
|
/**
|
62
|
-
*
|
63
|
-
|
64
|
-
|
65
|
-
|
75
|
+
* @override
|
76
|
+
*/
|
77
|
+
getInnerHTML(options) {
|
78
|
+
const xmlSerializer = new XMLSerializer_1.default();
|
79
|
+
let xml = '';
|
80
|
+
for (const node of this.content.childNodes) {
|
81
|
+
xml += xmlSerializer.serializeToString(node, options);
|
82
|
+
}
|
83
|
+
return xml;
|
84
|
+
}
|
85
|
+
/**
|
86
|
+
* @override
|
66
87
|
*/
|
67
88
|
appendChild(node) {
|
68
89
|
return this.content.appendChild(node);
|
69
90
|
}
|
70
91
|
/**
|
71
|
-
*
|
72
|
-
*
|
73
|
-
* @param node Node to remove.
|
92
|
+
* @override
|
74
93
|
*/
|
75
94
|
removeChild(node) {
|
76
95
|
return this.content.removeChild(node);
|
77
96
|
}
|
78
97
|
/**
|
79
|
-
*
|
80
|
-
*
|
81
|
-
* @param newNode Node to insert.
|
82
|
-
* @param referenceNode Node to insert before.
|
83
|
-
* @returns Inserted node.
|
98
|
+
* @override
|
84
99
|
*/
|
85
100
|
insertBefore(newNode, referenceNode) {
|
86
101
|
return this.content.insertBefore(newNode, referenceNode);
|
87
102
|
}
|
88
103
|
/**
|
89
|
-
*
|
90
|
-
*
|
91
|
-
* @param newChild New child.
|
92
|
-
* @param oldChild Old child.
|
93
|
-
* @returns Replaced node.
|
104
|
+
* @override
|
94
105
|
*/
|
95
106
|
replaceChild(newChild, oldChild) {
|
96
107
|
return this.content.replaceChild(newChild, oldChild);
|
97
108
|
}
|
98
109
|
/**
|
99
|
-
* Clones a node.
|
100
|
-
*
|
101
110
|
* @override
|
102
|
-
* @param [deep=false] "true" to clone deep.
|
103
|
-
* @returns Cloned node.
|
104
111
|
*/
|
105
112
|
cloneNode(deep = false) {
|
106
|
-
|
113
|
+
const clone = super.cloneNode(deep);
|
114
|
+
clone.content = this.content.cloneNode(deep);
|
115
|
+
return clone;
|
107
116
|
}
|
108
117
|
}
|
109
118
|
exports.default = HTMLTemplateElement;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"HTMLTemplateElement.js","sourceRoot":"","sources":["../../../src/nodes/html-template-element/HTMLTemplateElement.ts"],"names":[],"mappings":";;;;;AACA,8EAAsD;
|
1
|
+
{"version":3,"file":"HTMLTemplateElement.js","sourceRoot":"","sources":["../../../src/nodes/html-template-element/HTMLTemplateElement.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "happy-dom",
|
3
|
-
"version": "5.3.
|
3
|
+
"version": "5.3.3",
|
4
4
|
"license": "MIT",
|
5
5
|
"homepage": "https://github.com/capricorn86/happy-dom",
|
6
6
|
"repository": "https://github.com/capricorn86/happy-dom",
|
@@ -75,5 +75,5 @@
|
|
75
75
|
"ts-jest": "^27.1.3",
|
76
76
|
"typescript": "^4.6.2"
|
77
77
|
},
|
78
|
-
"gitHead": "
|
78
|
+
"gitHead": "ad2ade26fca99042d6b7ea5bcd6a6bf31b66e8ea"
|
79
79
|
}
|
@@ -3,6 +3,9 @@ import HTMLElement from '../html-element/HTMLElement';
|
|
3
3
|
import IDocumentFragment from '../document-fragment/IDocumentFragment';
|
4
4
|
import INode from '../node/INode';
|
5
5
|
import IHTMLTemplateElement from './IHTMLTemplateElement';
|
6
|
+
import XMLParser from '../../xml-parser/XMLParser';
|
7
|
+
import XMLSerializer from '../../xml-serializer/XMLSerializer';
|
8
|
+
import DOMException from '../../exception/DOMException';
|
6
9
|
|
7
10
|
/**
|
8
11
|
* HTML Template Element.
|
@@ -11,105 +14,118 @@ import IHTMLTemplateElement from './IHTMLTemplateElement';
|
|
11
14
|
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement.
|
12
15
|
*/
|
13
16
|
export default class HTMLTemplateElement extends HTMLElement implements IHTMLTemplateElement {
|
14
|
-
|
17
|
+
public readonly content: IDocumentFragment = this.ownerDocument.createDocumentFragment();
|
15
18
|
|
16
19
|
/**
|
17
|
-
*
|
18
|
-
|
19
|
-
|
20
|
+
* @override
|
21
|
+
*/
|
22
|
+
public get innerHTML(): string {
|
23
|
+
return this.getInnerHTML();
|
24
|
+
}
|
25
|
+
|
26
|
+
/**
|
27
|
+
* @override
|
20
28
|
*/
|
21
|
-
public
|
22
|
-
|
23
|
-
this.
|
29
|
+
public set innerHTML(html: string) {
|
30
|
+
for (const child of this.content.childNodes.slice()) {
|
31
|
+
this.content.removeChild(child);
|
32
|
+
}
|
33
|
+
|
34
|
+
for (const node of XMLParser.parse(this.ownerDocument, html).childNodes.slice()) {
|
35
|
+
this.content.appendChild(node);
|
24
36
|
}
|
25
|
-
return this._contentElement;
|
26
37
|
}
|
27
38
|
|
28
39
|
/**
|
29
|
-
*
|
30
|
-
|
31
|
-
|
40
|
+
* @override
|
41
|
+
*/
|
42
|
+
public get outerHTML(): string {
|
43
|
+
return new XMLSerializer().serializeToString(this.content);
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* @override
|
48
|
+
*/
|
49
|
+
public set outerHTML(_html: string) {
|
50
|
+
throw new DOMException(
|
51
|
+
`Failed to set the 'outerHTML' property on 'Element': This element has no parent node.`
|
52
|
+
);
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* @override
|
32
57
|
*/
|
33
58
|
public get previousSibling(): INode {
|
34
59
|
return this.content.previousSibling;
|
35
60
|
}
|
36
61
|
|
37
62
|
/**
|
38
|
-
*
|
39
|
-
*
|
40
|
-
* @returns Node.
|
63
|
+
* @override
|
41
64
|
*/
|
42
65
|
public get nextSibling(): INode {
|
43
66
|
return this.content.nextSibling;
|
44
67
|
}
|
45
68
|
|
46
69
|
/**
|
47
|
-
*
|
48
|
-
*
|
49
|
-
* @returns Node.
|
70
|
+
* @override
|
50
71
|
*/
|
51
72
|
public get firstChild(): INode {
|
52
73
|
return this.content.firstChild;
|
53
74
|
}
|
54
75
|
|
55
76
|
/**
|
56
|
-
*
|
57
|
-
*
|
58
|
-
* @returns Node.
|
77
|
+
* @override
|
59
78
|
*/
|
60
79
|
public get lastChild(): INode {
|
61
80
|
return this.content.lastChild;
|
62
81
|
}
|
63
82
|
|
64
83
|
/**
|
65
|
-
*
|
66
|
-
|
67
|
-
|
68
|
-
|
84
|
+
* @override
|
85
|
+
*/
|
86
|
+
public getInnerHTML(options?: { includeShadowRoots?: boolean }): string {
|
87
|
+
const xmlSerializer = new XMLSerializer();
|
88
|
+
let xml = '';
|
89
|
+
for (const node of this.content.childNodes) {
|
90
|
+
xml += xmlSerializer.serializeToString(node, options);
|
91
|
+
}
|
92
|
+
return xml;
|
93
|
+
}
|
94
|
+
|
95
|
+
/**
|
96
|
+
* @override
|
69
97
|
*/
|
70
98
|
public appendChild(node: INode): INode {
|
71
99
|
return this.content.appendChild(node);
|
72
100
|
}
|
73
101
|
|
74
102
|
/**
|
75
|
-
*
|
76
|
-
*
|
77
|
-
* @param node Node to remove.
|
103
|
+
* @override
|
78
104
|
*/
|
79
105
|
public removeChild(node: Node): INode {
|
80
106
|
return this.content.removeChild(node);
|
81
107
|
}
|
82
108
|
|
83
109
|
/**
|
84
|
-
*
|
85
|
-
*
|
86
|
-
* @param newNode Node to insert.
|
87
|
-
* @param referenceNode Node to insert before.
|
88
|
-
* @returns Inserted node.
|
110
|
+
* @override
|
89
111
|
*/
|
90
112
|
public insertBefore(newNode: INode, referenceNode: INode): INode {
|
91
113
|
return this.content.insertBefore(newNode, referenceNode);
|
92
114
|
}
|
93
115
|
|
94
116
|
/**
|
95
|
-
*
|
96
|
-
*
|
97
|
-
* @param newChild New child.
|
98
|
-
* @param oldChild Old child.
|
99
|
-
* @returns Replaced node.
|
117
|
+
* @override
|
100
118
|
*/
|
101
119
|
public replaceChild(newChild: INode, oldChild: INode): INode {
|
102
120
|
return this.content.replaceChild(newChild, oldChild);
|
103
121
|
}
|
104
122
|
|
105
123
|
/**
|
106
|
-
* Clones a node.
|
107
|
-
*
|
108
124
|
* @override
|
109
|
-
* @param [deep=false] "true" to clone deep.
|
110
|
-
* @returns Cloned node.
|
111
125
|
*/
|
112
126
|
public cloneNode(deep = false): IHTMLTemplateElement {
|
113
|
-
|
127
|
+
const clone = <IHTMLTemplateElement>super.cloneNode(deep);
|
128
|
+
(<IDocumentFragment>clone.content) = this.content.cloneNode(deep);
|
129
|
+
return clone;
|
114
130
|
}
|
115
131
|
}
|