Skip to content

Commit e3ca239

Browse files
authored
Improves monaco editor error message when loading a web worker failed (microsoft#287510)
1 parent 73d0c3f commit e3ca239

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/vs/editor/standalone/browser/services/standaloneWebWorkerService.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ export class StandaloneWebWorkerService extends WebWorkerService {
2222
return super._createWorker(descriptor);
2323
}
2424

25+
protected override _getWorkerLoadingFailedErrorMessage(descriptor: WebWorkerDescriptor): string | undefined {
26+
return `Failed to load worker script for label: ${descriptor.label}.
27+
Ensure your bundler properly bundles modules referenced by "new URL("...?esm", import.meta.url)".`;
28+
}
29+
2530
override getWorkerUrl(descriptor: WebWorkerDescriptor): string {
2631
const monacoEnvironment = getMonacoEnvironment();
2732
if (monacoEnvironment) {

src/vs/platform/webWorker/browser/webWorkerServiceImpl.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,15 @@ export class WebWorkerService implements IWebWorkerService {
3333
protected _createWorker(descriptor: WebWorkerDescriptor): Promise<Worker> {
3434
const workerRunnerUrl = this.getWorkerUrl(descriptor);
3535

36-
const workerUrlWithNls = getWorkerBootstrapUrl(descriptor.label, workerRunnerUrl);
36+
const workerUrlWithNls = getWorkerBootstrapUrl(descriptor.label, workerRunnerUrl, this._getWorkerLoadingFailedErrorMessage(descriptor));
3737
const worker = new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrlWithNls) as unknown as string : workerUrlWithNls, { name: descriptor.label, type: 'module' });
3838
return whenESMWorkerReady(worker);
3939
}
4040

41+
protected _getWorkerLoadingFailedErrorMessage(_descriptor: WebWorkerDescriptor): string | undefined {
42+
return undefined;
43+
}
44+
4145
getWorkerUrl(descriptor: WebWorkerDescriptor): string {
4246
if (!descriptor.esmModuleLocation) {
4347
throw new Error('Missing esmModuleLocation in WebWorkerDescriptor');
@@ -71,7 +75,7 @@ export function createBlobWorker(blobUrl: string, options?: WorkerOptions): Work
7175
return new Worker(ttPolicy ? ttPolicy.createScriptURL(blobUrl) as unknown as string : blobUrl, { ...options, type: 'module' });
7276
}
7377

74-
function getWorkerBootstrapUrl(label: string, workerScriptUrl: string): string {
78+
function getWorkerBootstrapUrl(label: string, workerScriptUrl: string, workerLoadingFailedErrorMessage: string | undefined): string {
7579
if (/^((http:)|(https:)|(file:))/.test(workerScriptUrl) && workerScriptUrl.substring(0, globalThis.origin.length) !== globalThis.origin) {
7680
// this is the cross-origin case
7781
// i.e. the webpage is running at a different origin than where the scripts are loaded from
@@ -101,7 +105,11 @@ function getWorkerBootstrapUrl(label: string, workerScriptUrl: string): string {
101105
`globalThis._VSCODE_FILE_ROOT = ${JSON.stringify(globalThis._VSCODE_FILE_ROOT)};`,
102106
`const ttPolicy = globalThis.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });`,
103107
`globalThis.workerttPolicy = ttPolicy;`,
108+
109+
workerLoadingFailedErrorMessage ? 'try {' : '',
104110
`await import(ttPolicy?.createScriptURL(${JSON.stringify(workerScriptUrl)}) ?? ${JSON.stringify(workerScriptUrl)});`,
111+
workerLoadingFailedErrorMessage ? `} catch (err) { console.error(${JSON.stringify(workerLoadingFailedErrorMessage)}, err); throw err; }` : '',
112+
105113
`globalThis.postMessage({ type: 'vscode-worker-ready' });`,
106114
`/*${label}*/`
107115
]).join('')], { type: 'application/javascript' });

0 commit comments

Comments
 (0)