diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index a4507e4baa29a5d5f3cba5b4c48de635612e98a6..53dc47f82e128b1f11e530e1c362cfc403127d03 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -898,6 +898,9 @@ export class TextModel extends Disposable implements model.ITextModel { * @param strict Do NOT allow a position inside a high-low surrogate pair */ private _isValidPosition(lineNumber: number, column: number, strict: boolean): boolean { + if (isNaN(lineNumber)) { + return false; + } if (lineNumber < 1) { return false; @@ -908,6 +911,10 @@ export class TextModel extends Disposable implements model.ITextModel { return false; } + if (isNaN(column)) { + return false; + } + if (column < 1) { return false; } @@ -933,8 +940,8 @@ export class TextModel extends Disposable implements model.ITextModel { * @param strict Do NOT allow a position inside a high-low surrogate pair */ private _validatePosition(_lineNumber: number, _column: number, strict: boolean): Position { - const lineNumber = Math.floor(typeof _lineNumber === 'number' ? _lineNumber : 1); - const column = Math.floor(typeof _column === 'number' ? _column : 1); + const lineNumber = Math.floor((typeof _lineNumber === 'number' && !isNaN(_lineNumber)) ? _lineNumber : 1); + const column = Math.floor((typeof _column === 'number' && !isNaN(_column)) ? _column : 1); const lineCount = this._buffer.getLineCount(); if (lineNumber < 1) { diff --git a/src/vs/editor/test/common/model/textModel.test.ts b/src/vs/editor/test/common/model/textModel.test.ts index f507199793a2127658ce52fd4699df1db7bdfa46..d4506ec14e00f98a69c4fb5d4e94878f20f22488 100644 --- a/src/vs/editor/test/common/model/textModel.test.ts +++ b/src/vs/editor/test/common/model/textModel.test.ts @@ -620,6 +620,18 @@ suite('Editor Model - TextModel', () => { }); + test('validatePosition handle NaN.', () => { + + let m = TextModel.createFromString('line one\nline two'); + + assert.deepEqual(m.validatePosition(new Position(NaN, 1)), new Position(1, 1)); + assert.deepEqual(m.validatePosition(new Position(1, NaN)), new Position(1, 1)); + + assert.deepEqual(m.validatePosition(new Position(NaN, NaN)), new Position(1, 1)); + assert.deepEqual(m.validatePosition(new Position(2, NaN)), new Position(2, 1)); + assert.deepEqual(m.validatePosition(new Position(NaN, 3)), new Position(1, 3)); + }); + test('validateRange around high-low surrogate pairs 1', () => { let m = TextModel.createFromString('a📚b'); @@ -829,6 +841,12 @@ suite('Editor Model - TextModel', () => { assert.equal(model.getLineLastNonWhitespaceColumn(11), 0, '11'); assert.equal(model.getLineLastNonWhitespaceColumn(12), 0, '12'); }); + + test('#50471. getValueInRange with invalid range', () => { + let m = TextModel.createFromString('My First Line\r\nMy Second Line\r\nMy Third Line'); + assert.equal(m.getValueInRange(new Range(1, NaN, 1, 3)), 'My'); + assert.equal(m.getValueInRange(new Range(NaN, NaN, NaN, NaN)), ''); + }); }); suite('TextModel.mightContainRTL', () => {