Skip to content

Commit a1b5903

Browse files
authored
chore: dispose correctly in lineage panel (#4740)
1 parent 578d5ab commit a1b5903

File tree

1 file changed

+36
-26
lines changed

1 file changed

+36
-26
lines changed

vscode/extension/src/webviews/lineagePanel.ts

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,37 +16,42 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
1616

1717
private panel: WebviewView | undefined
1818
private lsp: LSPClient
19-
private _extensionUri: Uri
19+
private readonly extensionUri: Uri
20+
21+
private disposables: Disposable[] = []
2022

2123
public constructor(extensionUri: Uri, lsp: LSPClient) {
22-
this._extensionUri = extensionUri
24+
this.extensionUri = extensionUri
2325
this.lsp = lsp
2426

2527
if (this.panel) {
2628
this.panel.webview.html = this.getHTML(this.panel.webview)
2729
}
2830

29-
workspace.onDidSaveTextDocument(document => {
30-
this.panel?.webview.postMessage({
31-
key: 'vscode_send',
32-
payload: {
33-
key: 'savedFile',
34-
payload: { fileUri: document.uri.toString() },
35-
},
36-
})
37-
})
38-
39-
window.onDidChangeActiveTextEditor(editor => {
40-
if (editor) {
31+
this.disposables.push(
32+
workspace.onDidSaveTextDocument(document => {
4133
this.panel?.webview.postMessage({
4234
key: 'vscode_send',
4335
payload: {
44-
key: 'changeFocusOnFile',
45-
payload: { path: editor.document.uri.toString() },
36+
key: 'savedFile',
37+
payload: { fileUri: document.uri.toString() },
4638
},
4739
})
48-
}
49-
})
40+
}),
41+
)
42+
this.disposables.push(
43+
window.onDidChangeActiveTextEditor(editor => {
44+
if (editor) {
45+
this.panel?.webview.postMessage({
46+
key: 'vscode_send',
47+
payload: {
48+
key: 'changeFocusOnFile',
49+
payload: { path: editor.document.uri.toString() },
50+
},
51+
})
52+
}
53+
}),
54+
)
5055
}
5156

5257
public resolveWebviewView(webviewView: WebviewView) {
@@ -58,12 +63,12 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
5863
webviewView.webview.options = {
5964
// Allow scripts in the webview
6065
enableScripts: true,
61-
localResourceRoots: [this._extensionUri],
66+
localResourceRoots: [this.extensionUri],
6267
}
6368

6469
// Set content options for external URL access
6570
// Set up message listener for events from the iframe
66-
webviewView.webview.onDidReceiveMessage(
71+
const disposable = webviewView.webview.onDidReceiveMessage(
6772
async request => {
6873
if (!request) {
6974
return
@@ -99,7 +104,7 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
99104
result: response,
100105
},
101106
}
102-
webviewView.webview.postMessage(responseCallback)
107+
await webviewView.webview.postMessage(responseCallback)
103108
break
104109
}
105110
case 'get_active_file': {
@@ -113,7 +118,7 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
113118
},
114119
},
115120
}
116-
webviewView.webview.postMessage(responseCallback)
121+
await webviewView.webview.postMessage(responseCallback)
117122
break
118123
}
119124
default: {
@@ -132,21 +137,22 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
132137
undefined,
133138
[],
134139
)
140+
this.disposables.push(disposable)
135141
webviewView.webview.html = this.getHTML(webviewView.webview)
136142
}
137143

138144
private getHTML(panel: Webview) {
139145
const cssUri = panel.asWebviewUri(
140-
Uri.joinPath(this._extensionUri, 'src_react', 'assets', 'index.css'),
146+
Uri.joinPath(this.extensionUri, 'src_react', 'assets', 'index.css'),
141147
)
142148
const jsUri = panel.asWebviewUri(
143-
Uri.joinPath(this._extensionUri, 'src_react', 'assets', 'index.js'),
149+
Uri.joinPath(this.extensionUri, 'src_react', 'assets', 'index.js'),
144150
)
145151
const faviconUri = panel.asWebviewUri(
146-
Uri.joinPath(this._extensionUri, 'src_react', 'favicon.ico'),
152+
Uri.joinPath(this.extensionUri, 'src_react', 'favicon.ico'),
147153
)
148154
const logoUri = panel.asWebviewUri(
149-
Uri.joinPath(this._extensionUri, 'src_react', 'logo192.png'),
155+
Uri.joinPath(this.extensionUri, 'src_react', 'logo192.png'),
150156
)
151157

152158
// Handle query requests from the React app
@@ -179,5 +185,9 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
179185
// WebviewView doesn't have a dispose method
180186
// We can clear references
181187
this.panel = undefined
188+
this.disposables.forEach(disposable => {
189+
disposable.dispose()
190+
})
191+
this.disposables = []
182192
}
183193
}

0 commit comments

Comments
 (0)