Skip to content

Commit 385da2e

Browse files
authored
Fix crash induced by webview disposal within tests (#1098)
Visualization panel tests caused a bug causing an extension host crash, when a webview was disposed two times. This change updates the code flow to prevent this.
1 parent 2a0e699 commit 385da2e

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

src/stepFunctions/commands/visualizeStateMachine/aslVisualization.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export class AslVisualization {
8686
// If documentUri being tracked is no longer found (due to file closure or rename), close the panel.
8787
this.disposables.push(
8888
vscode.workspace.onDidCloseTextDocument(documentWillSaveEvent => {
89-
if (!this.trackedDocumentDoesExist(documentUri)) {
89+
if (!this.trackedDocumentDoesExist(documentUri) && !this.isPanelDisposed) {
9090
panel.dispose()
9191
vscode.window.showInformationMessage(
9292
localize(
@@ -153,15 +153,24 @@ export class AslVisualization {
153153
)
154154

155155
// When the panel is closed, dispose of any disposables/remove subscriptions
156-
panel.onDidDispose(() => {
156+
const disposePanel = () => {
157+
if (this.isPanelDisposed) {
158+
return
159+
}
160+
this.isPanelDisposed = true
157161
debouncedUpdate.cancel()
158162
this.onVisualizationDisposeEmitter.fire()
159163
this.disposables.forEach(disposable => {
160164
disposable.dispose()
161165
})
162166
this.onVisualizationDisposeEmitter.dispose()
163-
this.isPanelDisposed = true
164-
})
167+
}
168+
169+
this.disposables.push(
170+
panel.onDidDispose(() => {
171+
disposePanel()
172+
})
173+
)
165174

166175
return panel
167176
}

src/test/stepFunctions/commands/visualizeStateMachine.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ describe('StepFunctions VisualizeStateMachine', async () => {
199199

200200
assert.deepStrictEqual(vis.documentUri, mockTextDocumentOne.uri)
201201
assert.strictEqual(vis.getIsPanelDisposed(), false)
202-
assert.strictEqual(vis.getDisposables().length, 4)
202+
assert.strictEqual(vis.getDisposables().length, 5)
203203

204204
let panel = vis.getPanel()
205205
assert.ok(panel)
@@ -303,10 +303,7 @@ describe('StepFunctions VisualizeStateMachine', async () => {
303303
assert.ok(managedVisualizations.get(mockTextDocumentTwo.uri.path))
304304
})
305305

306-
// TODO re-enable these tests once this race condition is resolved.
307-
// https://github.com/aws/aws-toolkit-vscode/issues/1071
308-
//
309-
it.skip('Test AslVisualizationManager managedVisualizations set removes visualization on visualization dispose, single vis', async () => {
306+
it('Test AslVisualizationManager managedVisualizations set removes visualization on visualization dispose, single vis', async () => {
310307
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)
311308

312309
// Preview Doc1
@@ -322,7 +319,7 @@ describe('StepFunctions VisualizeStateMachine', async () => {
322319
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)
323320
})
324321

325-
it.skip('Test AslVisualizationManager managedVisualizations set removes correct visualization on visualization dispose, multiple vis', async () => {
322+
it('Test AslVisualizationManager managedVisualizations set removes correct visualization on visualization dispose, multiple vis', async () => {
326323
assert.strictEqual(aslVisualizationManager.getManagedVisualizations().size, 0)
327324

328325
// Preview Doc1

0 commit comments

Comments
 (0)