diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index 753e4d586e0..855408ad6b1 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -407,6 +407,46 @@ suite('vscode API - window', () => { await commands.executeCommand('workbench.action.closeActiveEditor'); await commands.executeCommand('workbench.action.closeActiveEditor'); + assert.ok(!window.activeTab); + }); + + test('Tabs - Move Tab', async () => { + const [docA, docB, docC] = await Promise.all([ + workspace.openTextDocument(await createRandomFile()), + workspace.openTextDocument(await createRandomFile()), + workspace.openTextDocument(await createRandomFile()), + ]); + await window.showTextDocument(docA, { viewColumn: ViewColumn.One, preview: false }); + await window.showTextDocument(docB, { viewColumn: ViewColumn.One, preview: false }); + await window.showTextDocument(docC, { viewColumn: ViewColumn.Two, preview: false }); + + let tabs = window.tabs; + assert.strictEqual(tabs.length, 3); + + // Move the first tab of Group 1 to be the first tab of Group 2 + await tabs[0].move(0, ViewColumn.Two); + assert.strictEqual(tabs.length, 3); + tabs = window.tabs; + // Tabs should now be B -> A -> C + assert.strictEqual(tabs[0].resource?.toString(), docB.uri.toString()); + + await tabs[2].move(0, ViewColumn.Two); + assert.strictEqual(tabs.length, 3); + tabs = window.tabs; + // Tabs should now be B -> C -> A + assert.strictEqual(tabs[1].resource?.toString(), docC.uri.toString()); + + await tabs[1].move(0, ViewColumn.Three); + assert.strictEqual(tabs.length, 3); + tabs = window.tabs; + // Tabs should now be B -> A -> C With C in a new group + assert.strictEqual(tabs[2].resource?.toString(), docC.uri.toString()); + assert.strictEqual(tabs[2].viewColumn, ViewColumn.Three); + + await commands.executeCommand('workbench.action.closeActiveEditor'); + await commands.executeCommand('workbench.action.closeActiveEditor'); + await commands.executeCommand('workbench.action.closeActiveEditor'); + assert.ok(!window.activeTab); }); diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 13e5798df88..0da2d74d66b 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2293,7 +2293,7 @@ declare module 'vscode' { * @param index The index to move the tab to * @param viewColumn The column to move the tab into */ - move(index: number, viewColumn: ViewColumn): void; + move(index: number, viewColumn: ViewColumn): Thenable; } export namespace window { diff --git a/src/vs/workbench/api/common/extHostEditorTabs.ts b/src/vs/workbench/api/common/extHostEditorTabs.ts index 201c39f9891..7e7b79c8b29 100644 --- a/src/vs/workbench/api/common/extHostEditorTabs.ts +++ b/src/vs/workbench/api/common/extHostEditorTabs.ts @@ -20,7 +20,7 @@ export interface IEditorTab { viewId?: string; isActive: boolean; additionalResourcesAndViewIds: { resource?: vscode.Uri, viewId?: string }[]; - move(index: number, viewColumn: ViewColumn): void; + move(index: number, viewColumn: ViewColumn): Promise; } export interface IExtHostEditorTabs extends IExtHostEditorTabsShape { @@ -72,7 +72,11 @@ export class ExtHostEditorTabs implements IExtHostEditorTabs { additionalResourcesAndViewIds: dto.additionalResourcesAndViewIds.map(({ resource, viewId }) => ({ resource: URI.revive(resource), viewId })), viewId: dto.editorId, isActive: dto.isActive, - move: (index: number, viewColumn: ViewColumn) => this._proxy.$moveTab(dto, index, typeConverters.ViewColumn.from(viewColumn)), + move: async (index: number, viewColumn: ViewColumn) => { + this._proxy.$moveTab(dto, index, typeConverters.ViewColumn.from(viewColumn)); + await Event.toPromise(this._onDidChangeTabs.event); + return; + }, }); }); this._tabs = this._tabs.sort((t1, t2) => {