| class SelectionTestUtils { |
| static getSelectionRangeArray(selection) { |
| const ranges = []; |
| for (let i = 0; i < selection.rangeCount; i++) { |
| ranges.push(selection.getRangeAt(i)); |
| } |
| return ranges; |
| } |
| |
| static getRangeArrayDescription(arrayOfRanges) { |
| if (arrayOfRanges === null) { |
| return "null"; |
| } |
| if (arrayOfRanges === undefined) { |
| return "undefined"; |
| } |
| if (!Array.isArray(arrayOfRanges)) { |
| return "Unknown Object"; |
| } |
| if (arrayOfRanges.length === 0) { |
| return "[]"; |
| } |
| let result = ""; |
| for (let range of arrayOfRanges) { |
| if (result === "") { |
| result = "["; |
| } else { |
| result += ","; |
| } |
| result += `{${SelectionTestUtils.getRangeDescription(range)}}`; |
| } |
| result += "]"; |
| return result; |
| } |
| |
| static getNodeDescription(node) { |
| if (!node) { |
| return "null"; |
| } |
| switch (node.nodeType) { |
| case Node.TEXT_NODE: |
| case Node.COMMENT_NODE: |
| case Node.CDATA_SECTION_NODE: |
| return `${node.nodeName} "${node.data.replaceAll("\n", "\\\\n")}"`; |
| case Node.ELEMENT_NODE: |
| return `<${node.nodeName.toLowerCase()}${ |
| node.hasAttribute("id") ? ` id="${node.getAttribute("id")}"` : "" |
| }${ |
| node.hasAttribute("class") ? ` class="${node.getAttribute("class")}"` : "" |
| }${ |
| node.hasAttribute("contenteditable") |
| ? ` contenteditable="${node.getAttribute("contenteditable")}"` |
| : "" |
| }${ |
| node.inert ? ` inert` : "" |
| }${ |
| node.hidden ? ` hidden` : "" |
| }${ |
| node.readonly ? ` readonly` : "" |
| }${ |
| node.disabled ? ` disabled` : "" |
| }>`; |
| default: |
| return `${node.nodeName}`; |
| } |
| } |
| |
| static getRangeDescription(range) { |
| if (range === null) { |
| return "null"; |
| } |
| if (range === undefined) { |
| return "undefined"; |
| } |
| return range.startContainer == range.endContainer && |
| range.startOffset == range.endOffset |
| ? `(${SelectionTestUtils.getNodeDescription(range.startContainer)}, ${range.startOffset})` |
| : `(${SelectionTestUtils.getNodeDescription(range.startContainer)}, ${ |
| range.startOffset |
| }) - (${SelectionTestUtils.getNodeDescription(range.endContainer)}, ${range.endOffset})`; |
| } |
| } |