Skip to content

Commit a13f11a

Browse files
authored
Merge pull request #3628 from meganrogge/merogge/marker-clear
2 parents a63890e + 494aef1 commit a13f11a

File tree

5 files changed

+41
-1
lines changed

5 files changed

+41
-1
lines changed

src/browser/Terminal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,6 +1293,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
12931293
// Don't clear if it's already clear
12941294
return;
12951295
}
1296+
this.buffer.clearMarkers();
12961297
this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);
12971298
this.buffer.lines.length = 1;
12981299
this.buffer.ydisp = 0;

src/browser/TestUtils.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,9 @@ export class MockBuffer implements IBuffer {
254254
public getWhitespaceCell(attr?: IAttributeData): ICellData {
255255
throw new Error('Method not implemented.');
256256
}
257+
public clearMarkers(): void {
258+
throw new Error('Method not implemented.');
259+
}
257260
}
258261

259262
export class MockRenderer implements IRenderer {

src/common/buffer/Buffer.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export class Buffer implements IBuffer {
4343
private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);
4444
private _cols: number;
4545
private _rows: number;
46+
private _isClearing: boolean = false;
4647

4748
constructor(
4849
private _hasScrollback: boolean,
@@ -584,6 +585,15 @@ export class Buffer implements IBuffer {
584585
return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;
585586
}
586587

588+
public clearMarkers(): void {
589+
this._isClearing = true;
590+
for (const marker of this.markers) {
591+
marker.dispose();
592+
}
593+
this.markers = [];
594+
this._isClearing = false;
595+
}
596+
587597
public addMarker(y: number): Marker {
588598
const marker = new Marker(y);
589599
this.markers.push(marker);
@@ -615,7 +625,9 @@ export class Buffer implements IBuffer {
615625
}
616626

617627
private _removeMarker(marker: Marker): void {
618-
this.markers.splice(this.markers.indexOf(marker), 1);
628+
if (!this._isClearing) {
629+
this.markers.splice(this.markers.indexOf(marker), 1);
630+
}
619631
}
620632

621633
public iterator(trimRight: boolean, startIndex?: number, endIndex?: number, startOverscan?: number, endOverscan?: number): IBufferStringIterator {

src/common/buffer/Types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export interface IBuffer {
4545
getNullCell(attr?: IAttributeData): ICellData;
4646
getWhitespaceCell(attr?: IAttributeData): ICellData;
4747
addMarker(y: number): IMarker;
48+
clearMarkers(): void;
4849
}
4950

5051
export interface IBufferSet extends IDisposable {

test/api/Terminal.api.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,29 @@ describe('API Integration Tests', function(): void {
559559
assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).getCell(2).getChars()`), '');
560560
assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).getCell(2).getWidth()`), 0);
561561
});
562+
563+
it('clearMarkers', async () => {
564+
await openTerminal(page, { cols: 5 });
565+
await page.evaluate(`
566+
window.disposeStack = [];
567+
`);
568+
await writeSync(page, '\\n\\n\\n\\n');
569+
await writeSync(page, '\\n\\n\\n\\n');
570+
await writeSync(page, '\\n\\n\\n\\n');
571+
await writeSync(page, '\\n\\n\\n\\n');
572+
await page.evaluate(`window.term.addMarker(1)`);
573+
await page.evaluate(`window.term.addMarker(2)`);
574+
await page.evaluate(`window.term.scrollLines(10)`);
575+
await page.evaluate(`window.term.addMarker(3)`);
576+
await page.evaluate(`window.term.addMarker(4)`);
577+
await page.evaluate(`
578+
for (let i = 0; i < window.term.markers.length; ++i) {
579+
const marker = window.term.markers[i];
580+
marker.onDispose(() => window.disposeStack.push(marker));
581+
}`);
582+
await page.evaluate(`window.term.clear()`);
583+
assert.equal(await page.evaluate(`window.disposeStack.length`), 4);
584+
});
562585
});
563586

564587
it('active, normal, alternate', async () => {

0 commit comments

Comments
 (0)