reduce BufferApiView object creation times

This commit is contained in:
javacs3
2020-03-22 12:13:53 +08:00
parent 44ff7b0f5f
commit c2df14cfa0
2 changed files with 53 additions and 7 deletions
+21 -7
View File
@@ -195,6 +195,12 @@ export class Terminal implements ITerminalApi {
class BufferApiView implements IBufferApi {
constructor(private _buffer: IBuffer, private _buffers: IBufferSet) { }
init(buffer: IBuffer, buffers: IBufferSet): BufferApiView {
this._buffer = buffer;
this._buffers = buffers;
return this;
}
public get type(): 'normal' | 'alternate' {
if (this._buffers.normal === this._buffer) { return 'normal'; }
else if (this._buffers.alt === this._buffer) { return 'alternate'; }
@@ -216,17 +222,25 @@ class BufferApiView implements IBufferApi {
}
class BufferNamespaceApi implements IBufferNamespaceApi {
constructor(private _buffers: IBufferSet) { }
private _normal: BufferApiView;
private _alternate: BufferApiView;
public get alternate(): IBufferApi { return new BufferApiView(this._buffers.alt, this._buffers); }
public get active(): IBufferApi { return new BufferApiView(this._buffers.active, this._buffers); }
public get normal(): IBufferApi { return new BufferApiView(this._buffers.normal, this._buffers); }
constructor(private _buffers: IBufferSet) {
this._normal = new BufferApiView(this._buffers.normal, this._buffers);
this._alternate = new BufferApiView(this._buffers.alt, this._buffers);
}
public get active(): IBufferApi {
if (this._buffers.active === this._buffers.normal) { return this.normal; }
else if (this._buffers.active === this._buffers.alt) { return this.alternate; }
throw new Error('Active Buffer is neither normal nor alternate');
}
public get normal(): IBufferApi { return this._normal.init(this._buffers.normal, this._buffers); }
public get alternate(): IBufferApi { return this._alternate.init(this._buffers.alt, this._buffers); }
public get onBufferChange(): IEvent<IBufferApi> {
return (listener: (buffer: IBufferApi, unused: void) => any): IDisposable => {
return this._buffers.onBufferActivate((arg1: { activeBuffer: IBuffer, inactiveBuffer: IBuffer }) => {
listener(new BufferApiView(arg1.activeBuffer, this._buffers));
});
return this._buffers.onBufferActivate(() => listener(this.active));
};
}
}
+32
View File
@@ -509,6 +509,38 @@ describe('API Integration Tests', function(): void {
assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).getCell(2).getWidth()`), 0);
});
});
it('active, normal, alternate', async () => {
await openTerminal(page, { cols: 5 });
assert.equal(await page.evaluate(`window.term.buffer.active.type`), 'normal');
assert.equal(await page.evaluate(`window.term.buffer.normal.type`), 'normal');
assert.equal(await page.evaluate(`window.term.buffer.alternate.type`), 'alternate');
await writeSync(page, 'norm ');
assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), 'norm ');
assert.equal(await page.evaluate(`window.term.buffer.normal.getLine(0).translateToString()`), 'norm ');
assert.equal(await page.evaluate(`window.term.buffer.alternate.getLine(0)`), undefined);
await writeSync(page, '\\x1b[?47h\\r'); // use alternate screen buffer
assert.equal(await page.evaluate(`window.term.buffer.active.type`), 'alternate');
assert.equal(await page.evaluate(`window.term.buffer.normal.type`), 'normal');
assert.equal(await page.evaluate(`window.term.buffer.alternate.type`), 'alternate');
assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), ' ');
await writeSync(page, 'alt ');
assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), 'alt ');
assert.equal(await page.evaluate(`window.term.buffer.normal.getLine(0).translateToString()`), 'norm ');
assert.equal(await page.evaluate(`window.term.buffer.alternate.getLine(0).translateToString()`), 'alt ');
await writeSync(page, '\\x1b[?47l\\r'); // use normal screen buffer
assert.equal(await page.evaluate(`window.term.buffer.active.type`), 'normal');
assert.equal(await page.evaluate(`window.term.buffer.normal.type`), 'normal');
assert.equal(await page.evaluate(`window.term.buffer.alternate.type`), 'alternate');
assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), 'norm ');
assert.equal(await page.evaluate(`window.term.buffer.normal.getLine(0).translateToString()`), 'norm ');
assert.equal(await page.evaluate(`window.term.buffer.alternate.getLine(0)`), undefined);
})
});
it('dispose', async () => {