diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index 0e945aa92b..6e06855a8a 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -1191,6 +1191,15 @@ export class Terminal extends CoreTerminal implements ITerminal { return false; } + + /** + * Input data to application side. + * The data is treated the same way as typed input at the terminal (will appear in the onData event). + */ + public input(data: string): void { + this.coreService.triggerDataEvent(data, true); + return this.write(data); + } /** * Resizes the terminal. diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index 59cc773a47..95f1fbacdc 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -72,6 +72,9 @@ export class MockTerminal implements ITerminal { public focus(): void { throw new Error('Method not implemented.'); } + public input(data: string): void { + throw new Error('Method not implemented.'); + } public resize(columns: number, rows: number): void { throw new Error('Method not implemented.'); } diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index ade46fa482..d8c8315d87 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -138,6 +138,9 @@ export class Terminal extends Disposable implements ITerminalApi { public focus(): void { this._core.focus(); } + public input(data: string): void { + this._core.input(data); + } public resize(columns: number, rows: number): void { this._verifyIntegers(columns, rows); this._core.resize(columns, rows); diff --git a/test/playwright/TestUtils.ts b/test/playwright/TestUtils.ts index 4d4112f07a..facbc881aa 100644 --- a/test/playwright/TestUtils.ts +++ b/test/playwright/TestUtils.ts @@ -216,6 +216,7 @@ export class TerminalProxy implements ITerminalProxyCustomMethods, PlaywrightApi return new Promise(r => term.writeln(typeof data === 'string' ? data : new Uint8Array(data), r)); }, [await this.getHandle(), typeof data === 'string' ? data : Array.from(data)] as const); } + public async input(data: string): Promise { return this.evaluate(([term]) => term.input(data)); } public async resize(cols: number, rows: number): Promise { return this._page.evaluate(([term, cols, rows]) => term.resize(cols, rows), [await this.getHandle(), cols, rows] as const); } public async registerMarker(y?: number | undefined): Promise { return this._page.evaluate(([term, y]) => term.registerMarker(y), [await this.getHandle(), y] as const); } public async registerDecoration(decorationOptions: IDecorationOptions): Promise { return this._page.evaluate(([term, decorationOptions]) => term.registerDecoration(decorationOptions), [await this.getHandle(), decorationOptions] as const); } diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index 39a9c91a52..9268063979 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -962,6 +962,12 @@ declare module '@xterm/xterm' { * Focus the terminal. */ focus(): void; + + /** + * Input data to application side. + * The data is treated the same way as typed input at the terminal (will appear in the onData event). + */ + input(data: string): void; /** * Resizes the terminal. It's best practice to debounce calls to resize,