happy-dom 5.3.3 → 6.0.0

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.

Files changed (144) hide show
  1. package/.eslintrc.js +2 -2
  2. package/lib/base64/Base64.d.ts +23 -0
  3. package/lib/base64/Base64.js +89 -0
  4. package/lib/base64/Base64.js.map +1 -0
  5. package/lib/config/ElementTag.d.ts +2 -1
  6. package/lib/config/ElementTag.js +2 -1
  7. package/lib/config/ElementTag.js.map +1 -1
  8. package/lib/config/NonImplemenetedElementClasses.js +0 -1
  9. package/lib/config/NonImplemenetedElementClasses.js.map +1 -1
  10. package/lib/dom-implementation/DOMImplementation.d.ts +7 -1
  11. package/lib/dom-implementation/DOMImplementation.js +10 -2
  12. package/lib/dom-implementation/DOMImplementation.js.map +1 -1
  13. package/lib/dom-parser/DOMParser.d.ts +9 -4
  14. package/lib/dom-parser/DOMParser.js +13 -2
  15. package/lib/dom-parser/DOMParser.js.map +1 -1
  16. package/lib/exception/DOMExceptionNameEnum.d.ts +5 -1
  17. package/lib/exception/DOMExceptionNameEnum.js +4 -0
  18. package/lib/exception/DOMExceptionNameEnum.js.map +1 -1
  19. package/lib/fetch/Request.d.ts +8 -0
  20. package/lib/fetch/Request.js +15 -6
  21. package/lib/fetch/Request.js.map +1 -1
  22. package/lib/fetch/Response.d.ts +5 -0
  23. package/lib/fetch/Response.js +12 -6
  24. package/lib/fetch/Response.js.map +1 -1
  25. package/lib/file/FileReader.d.ts +7 -2
  26. package/lib/file/FileReader.js +9 -3
  27. package/lib/file/FileReader.js.map +1 -1
  28. package/lib/index.d.ts +4 -1
  29. package/lib/index.js +5 -1
  30. package/lib/index.js.map +1 -1
  31. package/lib/location/URL.js +1 -1
  32. package/lib/location/URL.js.map +1 -1
  33. package/lib/nodes/comment/Comment.d.ts +1 -1
  34. package/lib/nodes/document/Document.d.ts +18 -15
  35. package/lib/nodes/document/Document.js +36 -33
  36. package/lib/nodes/document/Document.js.map +1 -1
  37. package/lib/nodes/document/IDocument.d.ts +7 -0
  38. package/lib/nodes/document-fragment/DocumentFragment.d.ts +1 -1
  39. package/lib/nodes/document-type/DocumentType.d.ts +1 -1
  40. package/lib/nodes/element/DOMRectListFactory.d.ts +23 -0
  41. package/lib/nodes/element/DOMRectListFactory.js +33 -0
  42. package/lib/nodes/element/DOMRectListFactory.js.map +1 -0
  43. package/lib/nodes/element/Element.d.ts +6 -5
  44. package/lib/nodes/element/Element.js +9 -11
  45. package/lib/nodes/element/Element.js.map +1 -1
  46. package/lib/nodes/element/IDOMRectList.d.ts +11 -0
  47. package/lib/nodes/element/IDOMRectList.js +3 -0
  48. package/lib/nodes/element/IDOMRectList.js.map +1 -0
  49. package/lib/nodes/element/IElement.d.ts +5 -4
  50. package/lib/nodes/html-dialog-element/HTMLDialogElement.d.ts +31 -0
  51. package/lib/nodes/html-dialog-element/HTMLDialogElement.js +51 -0
  52. package/lib/nodes/html-dialog-element/HTMLDialogElement.js.map +1 -0
  53. package/lib/nodes/html-dialog-element/IHTMLDialogElement.d.ts +25 -0
  54. package/lib/nodes/html-dialog-element/IHTMLDialogElement.js +3 -0
  55. package/lib/nodes/html-dialog-element/IHTMLDialogElement.js.map +1 -0
  56. package/lib/nodes/html-template-element/HTMLTemplateElement.d.ts +1 -10
  57. package/lib/nodes/html-template-element/HTMLTemplateElement.js +2 -15
  58. package/lib/nodes/html-template-element/HTMLTemplateElement.js.map +1 -1
  59. package/lib/nodes/node/INode.d.ts +8 -6
  60. package/lib/nodes/node/Node.d.ts +20 -17
  61. package/lib/nodes/node/Node.js +19 -15
  62. package/lib/nodes/node/Node.js.map +1 -1
  63. package/lib/nodes/node/NodeTypeEnum.d.ts +10 -0
  64. package/lib/nodes/node/NodeTypeEnum.js +14 -0
  65. package/lib/nodes/node/NodeTypeEnum.js.map +1 -0
  66. package/lib/nodes/node/NodeUtility.d.ts +59 -0
  67. package/lib/nodes/node/NodeUtility.js +123 -0
  68. package/lib/nodes/node/NodeUtility.js.map +1 -0
  69. package/lib/nodes/text/IText.d.ts +9 -0
  70. package/lib/nodes/text/Text.d.ts +10 -1
  71. package/lib/nodes/text/Text.js +24 -0
  72. package/lib/nodes/text/Text.js.map +1 -1
  73. package/lib/range/IRangeBoundaryPoint.d.ts +8 -0
  74. package/lib/range/IRangeBoundaryPoint.js +3 -0
  75. package/lib/range/IRangeBoundaryPoint.js.map +1 -0
  76. package/lib/range/Range.d.ts +249 -0
  77. package/lib/range/Range.js +820 -0
  78. package/lib/range/Range.js.map +1 -0
  79. package/lib/range/RangeHowEnum.d.ts +7 -0
  80. package/lib/range/RangeHowEnum.js +11 -0
  81. package/lib/range/RangeHowEnum.js.map +1 -0
  82. package/lib/range/RangeUtility.d.ts +46 -0
  83. package/lib/range/RangeUtility.js +92 -0
  84. package/lib/range/RangeUtility.js.map +1 -0
  85. package/lib/selection/Selection.d.ts +167 -44
  86. package/lib/selection/Selection.js +369 -58
  87. package/lib/selection/Selection.js.map +1 -1
  88. package/lib/selection/SelectionDirectionEnum.d.ts +6 -0
  89. package/lib/selection/SelectionDirectionEnum.js +10 -0
  90. package/lib/selection/SelectionDirectionEnum.js.map +1 -0
  91. package/lib/window/IWindow.d.ts +22 -0
  92. package/lib/window/Window.d.ts +25 -9
  93. package/lib/window/Window.js +85 -35
  94. package/lib/window/Window.js.map +1 -1
  95. package/lib/xml-parser/XMLParser.d.ts +2 -2
  96. package/lib/xml-parser/XMLParser.js +5 -3
  97. package/lib/xml-parser/XMLParser.js.map +1 -1
  98. package/lib/xml-serializer/XMLSerializer.js +4 -1
  99. package/lib/xml-serializer/XMLSerializer.js.map +1 -1
  100. package/package.json +2 -2
  101. package/src/base64/Base64.ts +97 -0
  102. package/src/config/ElementTag.ts +2 -1
  103. package/src/config/NonImplemenetedElementClasses.ts +0 -1
  104. package/src/dom-implementation/DOMImplementation.ts +13 -2
  105. package/src/dom-parser/DOMParser.ts +20 -7
  106. package/src/exception/DOMExceptionNameEnum.ts +5 -1
  107. package/src/fetch/Request.ts +16 -6
  108. package/src/fetch/Response.ts +13 -6
  109. package/src/file/FileReader.ts +14 -4
  110. package/src/index.ts +7 -1
  111. package/src/location/URL.ts +1 -1
  112. package/src/nodes/document/Document.ts +47 -39
  113. package/src/nodes/document/IDocument.ts +8 -0
  114. package/src/nodes/element/DOMRectListFactory.ts +33 -0
  115. package/src/nodes/element/Element.ts +10 -11
  116. package/src/nodes/element/IDOMRectList.ts +11 -0
  117. package/src/nodes/element/IElement.ts +5 -4
  118. package/src/nodes/html-dialog-element/HTMLDialogElement.ts +47 -0
  119. package/src/nodes/html-dialog-element/IHTMLDialogElement.ts +29 -0
  120. package/src/nodes/html-template-element/HTMLTemplateElement.ts +3 -21
  121. package/src/nodes/node/INode.ts +8 -6
  122. package/src/nodes/node/Node.ts +24 -19
  123. package/src/nodes/node/NodeTypeEnum.ts +11 -0
  124. package/src/nodes/node/NodeUtility.ts +139 -0
  125. package/src/nodes/text/IText.ts +10 -0
  126. package/src/nodes/text/Text.ts +33 -0
  127. package/src/range/IRangeBoundaryPoint.ts +9 -0
  128. package/src/range/Range.ts +1057 -0
  129. package/src/range/RangeHowEnum.ts +8 -0
  130. package/src/range/RangeUtility.ts +114 -0
  131. package/src/selection/Selection.ts +444 -60
  132. package/src/selection/SelectionDirectionEnum.ts +7 -0
  133. package/src/window/IWindow.ts +24 -0
  134. package/src/window/Window.ts +104 -32
  135. package/src/xml-parser/XMLParser.ts +15 -7
  136. package/src/xml-serializer/XMLSerializer.ts +6 -1
  137. package/lib/nodes/element/Range.d.ts +0 -167
  138. package/lib/nodes/element/Range.js +0 -215
  139. package/lib/nodes/element/Range.js.map +0 -1
  140. package/lib/window/WindowBase64.d.ts +0 -19
  141. package/lib/window/WindowBase64.js +0 -88
  142. package/lib/window/WindowBase64.js.map +0 -1
  143. package/src/nodes/element/Range.ts +0 -237
  144. package/src/window/WindowBase64.ts +0 -95
@@ -0,0 +1,29 @@
1
+ import IHTMLElement from '../html-element/IHTMLElement';
2
+
3
+ /**
4
+ * HTML Dialog Element.
5
+ *
6
+ * Reference:
7
+ * https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement.
8
+ */
9
+ export default interface IHTMLDialogElement extends IHTMLElement {
10
+ open: boolean;
11
+ returnValue: string;
12
+
13
+ /**
14
+ * Closes the dialog.
15
+ *
16
+ * @param [returnValue] ReturnValue.
17
+ */
18
+ close(returnValue?: string): void;
19
+
20
+ /**
21
+ * Shows the modal.
22
+ */
23
+ showModal(): void;
24
+
25
+ /**
26
+ * Shows the dialog.
27
+ */
28
+ show(): void;
29
+ }
@@ -1,11 +1,9 @@
1
- import Node from '../node/Node';
2
1
  import HTMLElement from '../html-element/HTMLElement';
3
2
  import IDocumentFragment from '../document-fragment/IDocumentFragment';
4
3
  import INode from '../node/INode';
5
4
  import IHTMLTemplateElement from './IHTMLTemplateElement';
6
5
  import XMLParser from '../../xml-parser/XMLParser';
7
6
  import XMLSerializer from '../../xml-serializer/XMLSerializer';
8
- import DOMException from '../../exception/DOMException';
9
7
 
10
8
  /**
11
9
  * HTML Template Element.
@@ -36,34 +34,18 @@ export default class HTMLTemplateElement extends HTMLElement implements IHTMLTem
36
34
  }
37
35
  }
38
36
 
39
- /**
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
37
  /**
56
38
  * @override
57
39
  */
58
40
  public get previousSibling(): INode {
59
- return this.content.previousSibling;
41
+ return null;
60
42
  }
61
43
 
62
44
  /**
63
45
  * @override
64
46
  */
65
47
  public get nextSibling(): INode {
66
- return this.content.nextSibling;
48
+ return null;
67
49
  }
68
50
 
69
51
  /**
@@ -102,7 +84,7 @@ export default class HTMLTemplateElement extends HTMLElement implements IHTMLTem
102
84
  /**
103
85
  * @override
104
86
  */
105
- public removeChild(node: Node): INode {
87
+ public removeChild(node: INode): INode {
106
88
  return this.content.removeChild(node);
107
89
  }
108
90
 
@@ -2,14 +2,16 @@ import IEventTarget from '../../event/IEventTarget';
2
2
  import IDocument from '../document/IDocument';
3
3
  import IElement from '../element/IElement';
4
4
  import INodeList from './INodeList';
5
+ import NodeTypeEnum from './NodeTypeEnum';
5
6
 
6
7
  export default interface INode extends IEventTarget {
7
- readonly ELEMENT_NODE: number;
8
- readonly TEXT_NODE: number;
9
- readonly COMMENT_NODE: number;
10
- readonly DOCUMENT_NODE: number;
11
- readonly DOCUMENT_TYPE_NODE: number;
12
- readonly DOCUMENT_FRAGMENT_NODE: number;
8
+ readonly ELEMENT_NODE: NodeTypeEnum;
9
+ readonly TEXT_NODE: NodeTypeEnum;
10
+ readonly COMMENT_NODE: NodeTypeEnum;
11
+ readonly DOCUMENT_NODE: NodeTypeEnum;
12
+ readonly DOCUMENT_TYPE_NODE: NodeTypeEnum;
13
+ readonly DOCUMENT_FRAGMENT_NODE: NodeTypeEnum;
14
+ readonly PROCESSING_INSTRUCTION_NODE: NodeTypeEnum;
13
15
  readonly ownerDocument: IDocument;
14
16
  readonly parentNode: INode;
15
17
  readonly parentElement: IElement;
@@ -1,7 +1,7 @@
1
1
  import EventTarget from '../../event/EventTarget';
2
2
  import MutationRecord from '../../mutation-observer/MutationRecord';
3
3
  import MutationTypeEnum from '../../mutation-observer/MutationTypeEnum';
4
- import MutationObserverListener from '../../mutation-observer/MutationListener';
4
+ import MutationListener from '../../mutation-observer/MutationListener';
5
5
  import Event from '../../event/Event';
6
6
  import INode from './INode';
7
7
  import DOMException from '../../exception/DOMException';
@@ -10,41 +10,46 @@ import IElement from '../element/IElement';
10
10
  import IHTMLBaseElement from '../html-base-element/IHTMLBaseElement';
11
11
  import INodeList from './INodeList';
12
12
  import NodeListFactory from './NodeListFactory';
13
+ import NodeTypeEnum from './NodeTypeEnum';
13
14
 
14
15
  /**
15
16
  * Node.
16
17
  */
17
18
  export default class Node extends EventTarget implements INode {
19
+ // Owner document is set when the Node is created by the Document
20
+ public static _ownerDocument: IDocument = null;
21
+
18
22
  // Public properties
19
- public static readonly ELEMENT_NODE = 1;
20
- public static readonly TEXT_NODE = 3;
21
- public static readonly COMMENT_NODE = 8;
22
- public static readonly DOCUMENT_NODE = 9;
23
- public static readonly DOCUMENT_TYPE_NODE = 10;
24
- public static readonly DOCUMENT_FRAGMENT_NODE = 11;
25
- public static ownerDocument: IDocument = null;
26
- public readonly ELEMENT_NODE = 1;
27
- public readonly TEXT_NODE = 3;
28
- public readonly COMMENT_NODE = 8;
29
- public readonly DOCUMENT_NODE = 9;
30
- public readonly DOCUMENT_TYPE_NODE = 10;
31
- public readonly DOCUMENT_FRAGMENT_NODE = 11;
23
+ public static readonly ELEMENT_NODE = NodeTypeEnum.elementNode;
24
+ public static readonly TEXT_NODE = NodeTypeEnum.textNode;
25
+ public static readonly COMMENT_NODE = NodeTypeEnum.commentNode;
26
+ public static readonly DOCUMENT_NODE = NodeTypeEnum.documentNode;
27
+ public static readonly DOCUMENT_TYPE_NODE = NodeTypeEnum.documentTypeNode;
28
+ public static readonly DOCUMENT_FRAGMENT_NODE = NodeTypeEnum.documentFragmentNode;
29
+ public static readonly PROCESSING_INSTRUCTION_NODE = NodeTypeEnum.processingInstructionNode;
30
+ public readonly ELEMENT_NODE = NodeTypeEnum.elementNode;
31
+ public readonly TEXT_NODE = NodeTypeEnum.textNode;
32
+ public readonly COMMENT_NODE = NodeTypeEnum.commentNode;
33
+ public readonly DOCUMENT_NODE = NodeTypeEnum.documentNode;
34
+ public readonly DOCUMENT_TYPE_NODE = NodeTypeEnum.documentTypeNode;
35
+ public readonly DOCUMENT_FRAGMENT_NODE = NodeTypeEnum.documentFragmentNode;
36
+ public readonly PROCESSING_INSTRUCTION_NODE = NodeTypeEnum.processingInstructionNode;
32
37
  public readonly ownerDocument: IDocument = null;
33
38
  public readonly parentNode: INode = null;
34
39
  public readonly nodeType: number;
35
40
  public readonly childNodes: INodeList<INode> = NodeListFactory.create();
36
41
  public readonly isConnected: boolean = false;
37
- public _rootNode: INode = null;
38
42
 
39
43
  // Custom Properties (not part of HTML standard)
40
- protected _observers: MutationObserverListener[] = [];
44
+ public _rootNode: INode = null;
45
+ public _observers: MutationListener[] = [];
41
46
 
42
47
  /**
43
48
  * Constructor.
44
49
  */
45
50
  constructor() {
46
51
  super();
47
- this.ownerDocument = (<typeof Node>this.constructor).ownerDocument;
52
+ this.ownerDocument = (<typeof Node>this.constructor)._ownerDocument;
48
53
  }
49
54
 
50
55
  /**
@@ -457,7 +462,7 @@ export default class Node extends EventTarget implements INode {
457
462
  *
458
463
  * @param listener Listener.
459
464
  */
460
- public _observe(listener: MutationObserverListener): void {
465
+ public _observe(listener: MutationListener): void {
461
466
  this._observers.push(listener);
462
467
  if (listener.options.subtree) {
463
468
  for (const node of this.childNodes) {
@@ -472,7 +477,7 @@ export default class Node extends EventTarget implements INode {
472
477
  *
473
478
  * @param listener Listener.
474
479
  */
475
- public _unobserve(listener: MutationObserverListener): void {
480
+ public _unobserve(listener: MutationListener): void {
476
481
  const index = this._observers.indexOf(listener);
477
482
  if (index !== -1) {
478
483
  this._observers.splice(index, 1);
@@ -0,0 +1,11 @@
1
+ enum NodeTypeEnum {
2
+ elementNode = 1,
3
+ textNode = 3,
4
+ commentNode = 8,
5
+ documentNode = 9,
6
+ documentTypeNode = 10,
7
+ documentFragmentNode = 11,
8
+ processingInstructionNode = 7
9
+ }
10
+
11
+ export default NodeTypeEnum;
@@ -0,0 +1,139 @@
1
+ import IText from '../text/IText';
2
+ import IComment from '../comment/IComment';
3
+ import INode from './INode';
4
+ import NodeTypeEnum from './NodeTypeEnum';
5
+
6
+ /**
7
+ * Node utility.
8
+ */
9
+ export default class NodeUtility {
10
+ /**
11
+ * Returns boolean indicating if nodeB is an inclusive ancestor of nodeA.
12
+ *
13
+ * Based on:
14
+ * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/helpers/node.js
15
+ *
16
+ * @see https://dom.spec.whatwg.org/#concept-tree-inclusive-ancestor
17
+ * @param ancestorNode Ancestor node.
18
+ * @param referenceNode Reference node.
19
+ * @returns "true" if following.
20
+ */
21
+ public static isInclusiveAncestor(ancestorNode: INode, referenceNode: INode): boolean {
22
+ let parent: INode = referenceNode;
23
+ while (parent) {
24
+ if (ancestorNode === parent) {
25
+ return true;
26
+ }
27
+ parent = parent.parentNode;
28
+ }
29
+ return false;
30
+ }
31
+
32
+ /**
33
+ * Returns boolean indicating if nodeB is following nodeA in the document tree.
34
+ *
35
+ * Based on:
36
+ * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/helpers/node.js
37
+ *
38
+ * @see https://dom.spec.whatwg.org/#concept-tree-following
39
+ * @param nodeA Node A.
40
+ * @param nodeB Node B.
41
+ * @returns "true" if following.
42
+ */
43
+ public static isFollowing(nodeA: INode, nodeB: INode): boolean {
44
+ if (nodeA === nodeB) {
45
+ return false;
46
+ }
47
+
48
+ let current: INode = nodeB;
49
+
50
+ while (current) {
51
+ current = this.following(current);
52
+
53
+ if (current === nodeA) {
54
+ return true;
55
+ }
56
+ }
57
+
58
+ return false;
59
+ }
60
+
61
+ /**
62
+ * Node length.
63
+ *
64
+ * Based on:
65
+ * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/helpers/node.js
66
+ *
67
+ * @see https://dom.spec.whatwg.org/#concept-node-length
68
+ * @param node Node.
69
+ * @returns Node length.
70
+ */
71
+ public static getNodeLength(node: INode): number {
72
+ switch (node.nodeType) {
73
+ case NodeTypeEnum.documentTypeNode:
74
+ return 0;
75
+
76
+ case NodeTypeEnum.textNode:
77
+ case NodeTypeEnum.processingInstructionNode:
78
+ case NodeTypeEnum.commentNode:
79
+ return (<IText | IComment>node).data.length;
80
+
81
+ default:
82
+ return node.childNodes.length;
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Returns boolean indicating if nodeB is following nodeA in the document tree.
88
+ *
89
+ * Based on:
90
+ * https://github.com/jsdom/js-symbol-tree/blob/master/lib/SymbolTree.js#L220
91
+ *
92
+ * @param node Node.
93
+ * @param [root] Root.
94
+ * @returns Following node.
95
+ */
96
+ public static following(node: INode, root?: INode): INode {
97
+ const firstChild = node.firstChild;
98
+
99
+ if (firstChild) {
100
+ return firstChild;
101
+ }
102
+
103
+ let current = node;
104
+
105
+ while (current) {
106
+ if (current === root) {
107
+ return null;
108
+ }
109
+
110
+ const nextSibling = current.nextSibling;
111
+
112
+ if (nextSibling) {
113
+ return nextSibling;
114
+ }
115
+
116
+ current = current.parentNode;
117
+ }
118
+
119
+ return null;
120
+ }
121
+
122
+ /**
123
+ * Returns the next sibling or parents sibling.
124
+ *
125
+ * @param node Node.
126
+ * @returns Next decentant node.
127
+ */
128
+ public static nextDecendantNode(node: INode): INode {
129
+ while (node && !node.nextSibling) {
130
+ node = node.parentNode;
131
+ }
132
+
133
+ if (!node) {
134
+ return null;
135
+ }
136
+
137
+ return node.nextSibling;
138
+ }
139
+ }
@@ -1,6 +1,16 @@
1
1
  import ICharacterData from '../character-data/ICharacterData';
2
2
 
3
3
  export default interface IText extends ICharacterData {
4
+ /**
5
+ * Breaks the Text node into two nodes at the specified offset, keeping both nodes in the tree as siblings.
6
+ *
7
+ * @see https://dom.spec.whatwg.org/#dom-text-splittext
8
+ * @see https://dom.spec.whatwg.org/#dom-text-splittext
9
+ * @param offset Offset.
10
+ * @returns New text node.
11
+ */
12
+ splitText(offset: number): IText;
13
+
4
14
  /**
5
15
  * Clones a node.
6
16
  *
@@ -1,6 +1,8 @@
1
1
  import Node from '../node/Node';
2
2
  import CharacterData from '../character-data/CharacterData';
3
3
  import IText from './IText';
4
+ import DOMException from '../../exception/DOMException';
5
+ import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum';
4
6
 
5
7
  /**
6
8
  * Text node.
@@ -17,6 +19,37 @@ export default class Text extends CharacterData implements IText {
17
19
  return '#text';
18
20
  }
19
21
 
22
+ /**
23
+ * Breaks the Text node into two nodes at the specified offset, keeping both nodes in the tree as siblings.
24
+ *
25
+ * @see https://dom.spec.whatwg.org/#dom-text-splittext
26
+ * @see https://dom.spec.whatwg.org/#dom-text-splittext
27
+ * @param offset Offset.
28
+ * @returns New text node.
29
+ */
30
+ public splitText(offset: number): IText {
31
+ const length = this._data.length;
32
+
33
+ if (offset > length) {
34
+ new DOMException(
35
+ 'The index is not in the allowed range.',
36
+ DOMExceptionNameEnum.indexSizeError
37
+ );
38
+ }
39
+
40
+ const count = length - offset;
41
+ const newData = this.substringData(offset, count);
42
+ const newNode = <IText>this.ownerDocument.createTextNode(newData);
43
+
44
+ if (this.parentNode !== null) {
45
+ this.parentNode.insertBefore(newNode, this.nextSibling);
46
+ }
47
+
48
+ this.replaceData(offset, count, '');
49
+
50
+ return newNode;
51
+ }
52
+
20
53
  /**
21
54
  * Converts to string.
22
55
  *
@@ -0,0 +1,9 @@
1
+ import INode from '../nodes/node/INode';
2
+
3
+ /**
4
+ * Range boundary point.
5
+ */
6
+ export default interface IRangeBoundaryPoint {
7
+ node: INode;
8
+ offset: number;
9
+ }