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.

@@ -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
- private _contentElement;
13
+ readonly content: IDocumentFragment;
14
14
  /**
15
- * Returns the content.
16
- *
17
- * @returns Content.
15
+ * @override
16
+ */
17
+ get innerHTML(): string;
18
+ /**
19
+ * @override
18
20
  */
19
- get content(): IDocumentFragment;
21
+ set innerHTML(html: string);
20
22
  /**
21
- * Previous sibling.
22
- *
23
- * @returns Node.
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
- * Next sibling.
28
- *
29
- * @returns Node.
35
+ * @override
30
36
  */
31
37
  get nextSibling(): INode;
32
38
  /**
33
- * First child.
34
- *
35
- * @returns Node.
39
+ * @override
36
40
  */
37
41
  get firstChild(): INode;
38
42
  /**
39
- * Last child.
40
- *
41
- * @returns Node.
43
+ * @override
42
44
  */
43
45
  get lastChild(): INode;
44
46
  /**
45
- * Append a child node to childNodes.
46
- *
47
- * @param node Node to append.
48
- * @returns Appended node.
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
- * Remove Child element from childNodes array.
53
- *
54
- * @param node Node to remove.
57
+ * @override
55
58
  */
56
59
  removeChild(node: Node): INode;
57
60
  /**
58
- * Inserts a node before another.
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
- * Replaces a node with another.
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._contentElement = null;
19
+ this.content = this.ownerDocument.createDocumentFragment();
17
20
  }
18
21
  /**
19
- * Returns the content.
20
- *
21
- * @returns Content.
22
+ * @override
22
23
  */
23
- get content() {
24
- if (!this._contentElement) {
25
- this._contentElement = this.ownerDocument.createDocumentFragment();
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
- * Previous sibling.
31
- *
32
- * @returns Node.
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
- * Next sibling.
39
- *
40
- * @returns Node.
57
+ * @override
41
58
  */
42
59
  get nextSibling() {
43
60
  return this.content.nextSibling;
44
61
  }
45
62
  /**
46
- * First child.
47
- *
48
- * @returns Node.
63
+ * @override
49
64
  */
50
65
  get firstChild() {
51
66
  return this.content.firstChild;
52
67
  }
53
68
  /**
54
- * Last child.
55
- *
56
- * @returns Node.
69
+ * @override
57
70
  */
58
71
  get lastChild() {
59
72
  return this.content.lastChild;
60
73
  }
61
74
  /**
62
- * Append a child node to childNodes.
63
- *
64
- * @param node Node to append.
65
- * @returns Appended node.
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
- * Remove Child element from childNodes array.
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
- * Inserts a node before another.
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
- * Replaces a node with another.
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
- return super.cloneNode(deep);
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;AAKtD;;;;;GAKG;AACH,MAAqB,mBAAoB,SAAQ,qBAAW;IAA5D;;QACS,oBAAe,GAAsB,IAAI,CAAC;IAqGnD,CAAC;IAnGA;;;;OAIG;IACH,IAAW,OAAO;QACjB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;SACnE;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,IAAW,eAAe;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACI,WAAW,CAAC,IAAW;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,IAAU;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACI,YAAY,CAAC,OAAc,EAAE,aAAoB;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACI,YAAY,CAAC,QAAe,EAAE,QAAe;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;OAMG;IACI,SAAS,CAAC,IAAI,GAAG,KAAK;QAC5B,OAA6B,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;CACD;AAtGD,sCAsGC"}
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.2",
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": "e3b0edfbefbd65220f821b2e68d16970150391c6"
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
- private _contentElement: IDocumentFragment = null;
17
+ public readonly content: IDocumentFragment = this.ownerDocument.createDocumentFragment();
15
18
 
16
19
  /**
17
- * Returns the content.
18
- *
19
- * @returns Content.
20
+ * @override
21
+ */
22
+ public get innerHTML(): string {
23
+ return this.getInnerHTML();
24
+ }
25
+
26
+ /**
27
+ * @override
20
28
  */
21
- public get content(): IDocumentFragment {
22
- if (!this._contentElement) {
23
- this._contentElement = this.ownerDocument.createDocumentFragment();
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
- * Previous sibling.
30
- *
31
- * @returns Node.
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
- * Next sibling.
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
- * First child.
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
- * Last child.
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
- * Append a child node to childNodes.
66
- *
67
- * @param node Node to append.
68
- * @returns Appended node.
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
- * Remove Child element from childNodes array.
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
- * Inserts a node before another.
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
- * Replaces a node with another.
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
- return <IHTMLTemplateElement>super.cloneNode(deep);
127
+ const clone = <IHTMLTemplateElement>super.cloneNode(deep);
128
+ (<IDocumentFragment>clone.content) = this.content.cloneNode(deep);
129
+ return clone;
114
130
  }
115
131
  }