diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts index d211db9565b..1139fa54636 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts @@ -307,6 +307,38 @@ suite('Webview tests', () => { assert.strictEqual((await response).value, false); } }); + + test('webviews should have real view column after they are created, #56097', async () => { + const webview = _register(vscode.window.createWebviewPanel(webviewId, 'title', { viewColumn: vscode.ViewColumn.Active }, { enableScripts: true })); + + // Since we used a symbolic column, we don't know what view column the webview will actually show in at first + assert.strictEqual(webview.viewColumn, undefined); + + let changed = false; + const viewStateChanged = new Promise((resolve) => { + webview.onDidChangeViewState(e => { + if (changed) { + throw new Error('Only expected a single view state change'); + } + changed = true; + resolve(e); + }, undefined, disposables); + }); + + assert.strictEqual((await viewStateChanged).webviewPanel.viewColumn, vscode.ViewColumn.One); + + const firstResponse = getMesssage(webview); + webview.webview.html = createHtmlDocumentWithBody(/*html*/` + `); + + webview.webview.postMessage({ value: 1 }); + await firstResponse; + assert.strictEqual(webview.viewColumn, vscode.ViewColumn.One); + + }); }); function createHtmlDocumentWithBody(body: string): string { diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 808d6adffef..a39904bd0ff 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -171,8 +171,13 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { return this._options; } - get viewColumn(): vscode.ViewColumn { + get viewColumn(): vscode.ViewColumn | undefined { this.assertNotDisposed(); + if (this._viewColumn < 0) { + // We are using a symbolic view column + // Return undefined instead to indicate that the real view column is currently unknown but will be resolved. + return undefined; + } return this._viewColumn; }