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 31b6ea51048c0c77eddfbe8219185a69dc744264..bea5b22f5fcd88b47715a00e111c337a2b75694a 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts @@ -15,7 +15,7 @@ suite('Webview tests', () => { teardown(closeAllEditors); test('webview communication', async () => { - const webview = createMockWebviewWithBody(/*html*/` + const webview = createWebviewWithBody(/*html*/` `); - const messages = messageAwaiter(webview, 1); - webview.webview.postMessage({ value: 1 }); - const [response] = await messages; + const response = await sendRecieveMessage(webview, { value: 1 }); assert.strictEqual(response.value, 2); }); test('webview preserves state when switching visibility', async () => { - const webview = createMockWebviewWithBody(/*html*/ ` + const webview = createWebviewWithBody(/*html*/ ` `); - { - const messages = messageAwaiter(webview, 1); - webview.webview.postMessage({ type: 'add' }); - const [response] = await messages; - assert.strictEqual(response.value, 1); - } + const firstResponse = await sendRecieveMessage(webview, { type: 'add' }); + assert.strictEqual(firstResponse.value, 1); // Swap away from the webview const doc = await vscode.workspace.openTextDocument(join(vscode.workspace.rootPath || '', './simple.txt')); @@ -63,16 +57,49 @@ suite('Webview tests', () => { // And then back webview.reveal(vscode.ViewColumn.One); - { - const messages = messageAwaiter(webview, 1); - webview.webview.postMessage({ type: 'get' }); - const [response] = await messages; - assert.strictEqual(response.value, 1); - } + // We should still have old state + const secondResponse = await sendRecieveMessage(webview, { type: 'get' }); + assert.strictEqual(secondResponse.value, 1); + }); + + test('webview should keep dom state state when retainContextWhenHidden is set', async () => { + const webview = vscode.window.createWebviewPanel(webviewId, 'title', { viewColumn: vscode.ViewColumn.One }, { enableScripts: true, retainContextWhenHidden: true }); + webview.webview.html = createHtmlDocumentWithBody(/*html*/ ` + `); + + const firstResponse = await sendRecieveMessage(webview, { type: 'add' }); + assert.strictEqual(firstResponse.value, 1); + + // Swap away from the webview + const doc = await vscode.workspace.openTextDocument(join(vscode.workspace.rootPath || '', './simple.txt')); + await vscode.window.showTextDocument(doc); + + // And then back + webview.reveal(vscode.ViewColumn.One); + + // We should still have old state + const secondResponse = await sendRecieveMessage(webview, { type: 'get' }); + assert.strictEqual(secondResponse.value, 1); }); }); -function createMockWebviewWithBody(body: string) { +function createWebviewWithBody(body: string) { const webview = vscode.window.createWebviewPanel(webviewId, 'title', { viewColumn: vscode.ViewColumn.One }, { enableScripts: true }); webview.webview.html = createHtmlDocumentWithBody(body); return webview; @@ -94,14 +121,13 @@ function createHtmlDocumentWithBody(body: string): string { } -function messageAwaiter(webview: vscode.WebviewPanel, expected: number): Promise { - let received: any[] = []; - return new Promise(resolve => { - webview.webview.onDidReceiveMessage(message => { - received.push(message); - if (received.length >= expected) { - resolve(received); - } +function sendRecieveMessage(webview: vscode.WebviewPanel, message: any): Promise { + const p = new Promise(resolve => { + const sub = webview.webview.onDidReceiveMessage(message => { + sub.dispose(); + resolve(message); }); }); + webview.webview.postMessage(message); + return p; } \ No newline at end of file