diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index d6154ba645d82d0b2c62411b6a98aa4b8e9ba078..d36d3cca24e6b1402fdf105719d00148e1e5d4ac 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -7,6 +7,8 @@ */ const resourceRoot = '/vscode-resource'; +const resolveTimeout = 30000; + /** * @template T * @typedef {{ @@ -36,6 +38,7 @@ class RequestStore { /** * @param {string} webviewId * @param {string} path + * @returns {Promise} */ create(webviewId, path) { const existing = this.get(webviewId, path); @@ -44,7 +47,17 @@ class RequestStore { } let resolve; const promise = new Promise(r => resolve = r); - this.map.set(this._key(webviewId, path), { resolve, promise }); + const entry = { resolve, promise }; + this.map.set(this._key(webviewId, path), entry); + + const dispose = () => { + clearTimeout(timeout); + const existing = this.get(webviewId, path); + if (existing === entry) { + return this.map.delete(this._key(webviewId, path)); + } + }; + const timeout = setTimeout(dispose, resolveTimeout); return promise; } @@ -91,7 +104,6 @@ const notFoundResponse = new Response('Not Found', { status: 404, }); - self.addEventListener('message', (event) => { switch (event.data.channel) { case 'did-load-resource':