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.
- package/.eslintrc.js +2 -2
- package/lib/base64/Base64.d.ts +23 -0
- package/lib/base64/Base64.js +89 -0
- package/lib/base64/Base64.js.map +1 -0
- package/lib/config/ElementTag.d.ts +2 -1
- package/lib/config/ElementTag.js +2 -1
- package/lib/config/ElementTag.js.map +1 -1
- package/lib/config/NonImplemenetedElementClasses.js +0 -1
- package/lib/config/NonImplemenetedElementClasses.js.map +1 -1
- package/lib/dom-implementation/DOMImplementation.d.ts +7 -1
- package/lib/dom-implementation/DOMImplementation.js +10 -2
- package/lib/dom-implementation/DOMImplementation.js.map +1 -1
- package/lib/dom-parser/DOMParser.d.ts +9 -4
- package/lib/dom-parser/DOMParser.js +13 -2
- package/lib/dom-parser/DOMParser.js.map +1 -1
- package/lib/exception/DOMExceptionNameEnum.d.ts +5 -1
- package/lib/exception/DOMExceptionNameEnum.js +4 -0
- package/lib/exception/DOMExceptionNameEnum.js.map +1 -1
- package/lib/fetch/Request.d.ts +8 -0
- package/lib/fetch/Request.js +15 -6
- package/lib/fetch/Request.js.map +1 -1
- package/lib/fetch/Response.d.ts +5 -0
- package/lib/fetch/Response.js +12 -6
- package/lib/fetch/Response.js.map +1 -1
- package/lib/file/FileReader.d.ts +7 -2
- package/lib/file/FileReader.js +9 -3
- package/lib/file/FileReader.js.map +1 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/location/URL.js +1 -1
- package/lib/location/URL.js.map +1 -1
- package/lib/nodes/comment/Comment.d.ts +1 -1
- package/lib/nodes/document/Document.d.ts +18 -15
- package/lib/nodes/document/Document.js +36 -33
- package/lib/nodes/document/Document.js.map +1 -1
- package/lib/nodes/document/IDocument.d.ts +7 -0
- package/lib/nodes/document-fragment/DocumentFragment.d.ts +1 -1
- package/lib/nodes/document-type/DocumentType.d.ts +1 -1
- package/lib/nodes/element/DOMRectListFactory.d.ts +23 -0
- package/lib/nodes/element/DOMRectListFactory.js +33 -0
- package/lib/nodes/element/DOMRectListFactory.js.map +1 -0
- package/lib/nodes/element/Element.d.ts +6 -5
- package/lib/nodes/element/Element.js +9 -11
- package/lib/nodes/element/Element.js.map +1 -1
- package/lib/nodes/element/IDOMRectList.d.ts +11 -0
- package/lib/nodes/element/IDOMRectList.js +3 -0
- package/lib/nodes/element/IDOMRectList.js.map +1 -0
- package/lib/nodes/element/IElement.d.ts +5 -4
- package/lib/nodes/html-dialog-element/HTMLDialogElement.d.ts +31 -0
- package/lib/nodes/html-dialog-element/HTMLDialogElement.js +51 -0
- package/lib/nodes/html-dialog-element/HTMLDialogElement.js.map +1 -0
- package/lib/nodes/html-dialog-element/IHTMLDialogElement.d.ts +25 -0
- package/lib/nodes/html-dialog-element/IHTMLDialogElement.js +3 -0
- package/lib/nodes/html-dialog-element/IHTMLDialogElement.js.map +1 -0
- package/lib/nodes/html-template-element/HTMLTemplateElement.d.ts +1 -10
- package/lib/nodes/html-template-element/HTMLTemplateElement.js +2 -15
- package/lib/nodes/html-template-element/HTMLTemplateElement.js.map +1 -1
- package/lib/nodes/node/INode.d.ts +8 -6
- package/lib/nodes/node/Node.d.ts +20 -17
- package/lib/nodes/node/Node.js +19 -15
- package/lib/nodes/node/Node.js.map +1 -1
- package/lib/nodes/node/NodeTypeEnum.d.ts +10 -0
- package/lib/nodes/node/NodeTypeEnum.js +14 -0
- package/lib/nodes/node/NodeTypeEnum.js.map +1 -0
- package/lib/nodes/node/NodeUtility.d.ts +59 -0
- package/lib/nodes/node/NodeUtility.js +123 -0
- package/lib/nodes/node/NodeUtility.js.map +1 -0
- package/lib/nodes/text/IText.d.ts +9 -0
- package/lib/nodes/text/Text.d.ts +10 -1
- package/lib/nodes/text/Text.js +24 -0
- package/lib/nodes/text/Text.js.map +1 -1
- package/lib/range/IRangeBoundaryPoint.d.ts +8 -0
- package/lib/range/IRangeBoundaryPoint.js +3 -0
- package/lib/range/IRangeBoundaryPoint.js.map +1 -0
- package/lib/range/Range.d.ts +249 -0
- package/lib/range/Range.js +820 -0
- package/lib/range/Range.js.map +1 -0
- package/lib/range/RangeHowEnum.d.ts +7 -0
- package/lib/range/RangeHowEnum.js +11 -0
- package/lib/range/RangeHowEnum.js.map +1 -0
- package/lib/range/RangeUtility.d.ts +46 -0
- package/lib/range/RangeUtility.js +92 -0
- package/lib/range/RangeUtility.js.map +1 -0
- package/lib/selection/Selection.d.ts +167 -44
- package/lib/selection/Selection.js +369 -58
- package/lib/selection/Selection.js.map +1 -1
- package/lib/selection/SelectionDirectionEnum.d.ts +6 -0
- package/lib/selection/SelectionDirectionEnum.js +10 -0
- package/lib/selection/SelectionDirectionEnum.js.map +1 -0
- package/lib/window/IWindow.d.ts +22 -0
- package/lib/window/Window.d.ts +25 -9
- package/lib/window/Window.js +85 -35
- package/lib/window/Window.js.map +1 -1
- package/lib/xml-parser/XMLParser.d.ts +2 -2
- package/lib/xml-parser/XMLParser.js +5 -3
- package/lib/xml-parser/XMLParser.js.map +1 -1
- package/lib/xml-serializer/XMLSerializer.js +4 -1
- package/lib/xml-serializer/XMLSerializer.js.map +1 -1
- package/package.json +2 -2
- package/src/base64/Base64.ts +97 -0
- package/src/config/ElementTag.ts +2 -1
- package/src/config/NonImplemenetedElementClasses.ts +0 -1
- package/src/dom-implementation/DOMImplementation.ts +13 -2
- package/src/dom-parser/DOMParser.ts +20 -7
- package/src/exception/DOMExceptionNameEnum.ts +5 -1
- package/src/fetch/Request.ts +16 -6
- package/src/fetch/Response.ts +13 -6
- package/src/file/FileReader.ts +14 -4
- package/src/index.ts +7 -1
- package/src/location/URL.ts +1 -1
- package/src/nodes/document/Document.ts +47 -39
- package/src/nodes/document/IDocument.ts +8 -0
- package/src/nodes/element/DOMRectListFactory.ts +33 -0
- package/src/nodes/element/Element.ts +10 -11
- package/src/nodes/element/IDOMRectList.ts +11 -0
- package/src/nodes/element/IElement.ts +5 -4
- package/src/nodes/html-dialog-element/HTMLDialogElement.ts +47 -0
- package/src/nodes/html-dialog-element/IHTMLDialogElement.ts +29 -0
- package/src/nodes/html-template-element/HTMLTemplateElement.ts +3 -21
- package/src/nodes/node/INode.ts +8 -6
- package/src/nodes/node/Node.ts +24 -19
- package/src/nodes/node/NodeTypeEnum.ts +11 -0
- package/src/nodes/node/NodeUtility.ts +139 -0
- package/src/nodes/text/IText.ts +10 -0
- package/src/nodes/text/Text.ts +33 -0
- package/src/range/IRangeBoundaryPoint.ts +9 -0
- package/src/range/Range.ts +1057 -0
- package/src/range/RangeHowEnum.ts +8 -0
- package/src/range/RangeUtility.ts +114 -0
- package/src/selection/Selection.ts +444 -60
- package/src/selection/SelectionDirectionEnum.ts +7 -0
- package/src/window/IWindow.ts +24 -0
- package/src/window/Window.ts +104 -32
- package/src/xml-parser/XMLParser.ts +15 -7
- package/src/xml-serializer/XMLSerializer.ts +6 -1
- package/lib/nodes/element/Range.d.ts +0 -167
- package/lib/nodes/element/Range.js +0 -215
- package/lib/nodes/element/Range.js.map +0 -1
- package/lib/window/WindowBase64.d.ts +0 -19
- package/lib/window/WindowBase64.js +0 -88
- package/lib/window/WindowBase64.js.map +0 -1
- package/src/nodes/element/Range.ts +0 -237
- 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
|
41
|
+
return null;
|
60
42
|
}
|
61
43
|
|
62
44
|
/**
|
63
45
|
* @override
|
64
46
|
*/
|
65
47
|
public get nextSibling(): INode {
|
66
|
-
return
|
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:
|
87
|
+
public removeChild(node: INode): INode {
|
106
88
|
return this.content.removeChild(node);
|
107
89
|
}
|
108
90
|
|
package/src/nodes/node/INode.ts
CHANGED
@@ -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:
|
8
|
-
readonly TEXT_NODE:
|
9
|
-
readonly COMMENT_NODE:
|
10
|
-
readonly DOCUMENT_NODE:
|
11
|
-
readonly DOCUMENT_TYPE_NODE:
|
12
|
-
readonly DOCUMENT_FRAGMENT_NODE:
|
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;
|
package/src/nodes/node/Node.ts
CHANGED
@@ -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
|
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 =
|
20
|
-
public static readonly TEXT_NODE =
|
21
|
-
public static readonly COMMENT_NODE =
|
22
|
-
public static readonly DOCUMENT_NODE =
|
23
|
-
public static readonly DOCUMENT_TYPE_NODE =
|
24
|
-
public static readonly DOCUMENT_FRAGMENT_NODE =
|
25
|
-
public static
|
26
|
-
public readonly ELEMENT_NODE =
|
27
|
-
public readonly TEXT_NODE =
|
28
|
-
public readonly COMMENT_NODE =
|
29
|
-
public readonly DOCUMENT_NODE =
|
30
|
-
public readonly DOCUMENT_TYPE_NODE =
|
31
|
-
public readonly DOCUMENT_FRAGMENT_NODE =
|
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
|
-
|
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).
|
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:
|
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:
|
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,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
|
+
}
|
package/src/nodes/text/IText.ts
CHANGED
@@ -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
|
*
|
package/src/nodes/text/Text.ts
CHANGED
@@ -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
|
*
|