diff --git a/package.json b/package.json index 51961a6..3d56607 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "slimdom", - "version": "2.0.0", + "version": "2.0.1", "description": "Fast, tiny DOM implementation in pure JS", "author": "Stef Busking", "license": "MIT", diff --git a/src/Range.ts b/src/Range.ts index 481f6e2..ab501d0 100644 --- a/src/Range.ts +++ b/src/Range.ts @@ -146,7 +146,7 @@ export default class Range { const rootOfRange = getRootOfRange(this); if ( rootOfNode !== rootOfRange || - compareBoundaryPointPositions(node, offset, this.endContainer, this.endOffset) === POSITION_BEFORE + compareBoundaryPointPositions(node, offset, this.startContainer, this.startOffset) === POSITION_BEFORE ) { this.startContainer = node; this.startOffset = offset; diff --git a/test/Range.tests.ts b/test/Range.tests.ts index 6d75b26..6c53611 100644 --- a/test/Range.tests.ts +++ b/test/Range.tests.ts @@ -34,6 +34,7 @@ describe('Range', () => { }); it('end after start is ok', () => { + // Move end forward range.setEnd(element, 1); chai.assert.equal(range.endContainer, element); chai.assert.equal(range.endOffset, 1); @@ -41,6 +42,15 @@ describe('Range', () => { chai.assert.equal(range.startOffset, 0); chai.assert.equal(range.collapsed, false); chai.assert.equal(range.commonAncestorContainer, document); + + // Move end back + range.setEnd(element, 0); + chai.assert.equal(range.endContainer, element); + chai.assert.equal(range.endOffset, 0); + chai.assert.equal(range.startContainer, document); + chai.assert.equal(range.startOffset, 0); + chai.assert.equal(range.collapsed, false); + chai.assert.equal(range.commonAncestorContainer, document); }); it('end before start moves start', () => { @@ -54,6 +64,28 @@ describe('Range', () => { chai.assert.equal(range.commonAncestorContainer, element); }); + it('start before end is ok', () => { + range.setEnd(document, 1); + + // Move start forward + range.setStart(element, 1); + chai.assert.equal(range.startContainer, element); + chai.assert.equal(range.startOffset, 1); + chai.assert.equal(range.endContainer, document); + chai.assert.equal(range.endOffset, 1); + chai.assert.equal(range.collapsed, false); + chai.assert.equal(range.commonAncestorContainer, document); + + // Move start back + range.setStart(element, 0); + chai.assert.equal(range.startContainer, element); + chai.assert.equal(range.startOffset, 0); + chai.assert.equal(range.endContainer, document); + chai.assert.equal(range.endOffset, 1); + chai.assert.equal(range.collapsed, false); + chai.assert.equal(range.commonAncestorContainer, document); + }); + it('throws if the container is a doctype', () => { const doctype = document.implementation.createDocumentType('html', '', ''); chai.assert.throws(() => range.setStart(doctype, 0), 'InvalidNodeTypeError');