Skip to content

Commit

Permalink
Queue initial term data events for ext host delayed init
Browse files Browse the repository at this point in the history
Fixes #103697
  • Loading branch information
Tyriar committed Aug 13, 2020
1 parent 1a4999b commit f542cd1
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
4 changes: 4 additions & 0 deletions src/vs/workbench/api/browser/mainThreadTerminalService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
this._dataEventTracker = this._instantiationService.createInstance(TerminalDataEventTracker, (id, data) => {
this._onTerminalData(id, data);
});
// Send initial events if they exist
this._terminalService.terminalInstances.forEach(t => {
t.initialDataEvents?.forEach(d => this._onTerminalData(t.id, d));
});
}
}

Expand Down
8 changes: 8 additions & 0 deletions src/vs/workbench/contrib/terminal/browser/terminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,14 @@ export interface ITerminalInstance {

readonly areLinksReady: boolean;

/**
* Returns an array of data events that have fired within the first 10 seconds. If this is
* called 10 seconds after the terminal has existed the result will be undefined. This is useful
* when objects that depend on the data events have delayed initialization, like extension
* hosts.
*/
readonly initialDataEvents: string[] | undefined;

/** A promise that resolves when the terminal's pty/process have been created. */
processReady: Promise<void>;

Expand Down
25 changes: 21 additions & 4 deletions src/vs/workbench/contrib/terminal/browser/terminalInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
private _titleReadyPromise: Promise<string>;
private _titleReadyComplete: ((title: string) => any) | undefined;
private _areLinksReady: boolean = false;
private _initialDataEvents: string[] | undefined = [];

private _messageTitleDisposable: IDisposable | undefined;

Expand Down Expand Up @@ -131,6 +132,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
// TODO: Should this be an event as it can fire twice?
public get processReady(): Promise<void> { return this._processManager.ptyProcessReady; }
public get areLinksReady(): boolean { return this._areLinksReady; }
public get initialDataEvents(): string[] | undefined { return this._initialDataEvents; }
public get exitCode(): number | undefined { return this._exitCode; }
public get title(): string { return this._title; }
public get hadFocusOnExit(): boolean { return this._hadFocusOnExit; }
Expand Down Expand Up @@ -231,6 +233,20 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
this.updateAccessibilitySupport();
}
}));

// Clear out initial data events after 10 seconds, hopefully extension hosts are up and
// running at that point.
let initialDataEventsTimeout: NodeJS.Timeout | undefined = setTimeout(() => {
initialDataEventsTimeout = undefined;
this._initialDataEvents = undefined;
}, 10000);
this._register({
dispose: () => {
if (initialDataEventsTimeout) {
clearTimeout(initialDataEventsTimeout);
}
}
});
}

public addDisposable(disposable: IDisposable): void {
Expand Down Expand Up @@ -862,11 +878,12 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {

protected _createProcessManager(): void {
this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._id, this._configHelper);
this._processManager.onProcessReady(() => {
this._onProcessIdReady.fire(this);
});
this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this));
this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode));
this._processManager.onProcessData(data => this._onData.fire(data));
this._processManager.onProcessData(data => {
this._initialDataEvents?.push(data);
this._onData.fire(data);
});
this._processManager.onProcessOverrideDimensions(e => this.setDimensions(e));
this._processManager.onProcessResolvedShellLaunchConfig(e => this._setResolvedShellLaunchConfig(e));
this._processManager.onEnvironmentVariableInfoChanged(e => this._onEnvironmentVariableInfoChanged(e));
Expand Down

0 comments on commit f542cd1

Please sign in to comment.