Use trustedTypes
where using new Worker()
(#108400)
This commit is contained in:
parent
f9d6df8ea1
commit
90724cd823
3 changed files with 12 additions and 4 deletions
|
@ -6,6 +6,8 @@
|
|||
import { globals } from 'vs/base/common/platform';
|
||||
import { IWorker, IWorkerCallback, IWorkerFactory, logOnceWebWorkerWarning } from 'vs/base/common/worker/simpleWorker';
|
||||
|
||||
const ttPolicy = window.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });
|
||||
|
||||
function getWorker(workerId: string, label: string): Worker | Promise<Worker> {
|
||||
// Option for hosts to overwrite the worker script (used in the standalone editor)
|
||||
if (globals.MonacoEnvironment) {
|
||||
|
@ -13,7 +15,8 @@ function getWorker(workerId: string, label: string): Worker | Promise<Worker> {
|
|||
return globals.MonacoEnvironment.getWorker(workerId, label);
|
||||
}
|
||||
if (typeof globals.MonacoEnvironment.getWorkerUrl === 'function') {
|
||||
return new Worker(globals.MonacoEnvironment.getWorkerUrl(workerId, label));
|
||||
const wokerUrl = <string>globals.MonacoEnvironment.getWorkerUrl(workerId, label);
|
||||
return new Worker(ttPolicy ? ttPolicy.createScriptURL(wokerUrl) as unknown as string : wokerUrl, { name: label });
|
||||
}
|
||||
}
|
||||
// ESM-comment-begin
|
||||
|
@ -21,7 +24,7 @@ function getWorker(workerId: string, label: string): Worker | Promise<Worker> {
|
|||
// check if the JS lives on a different origin
|
||||
const workerMain = require.toUrl('./' + workerId); // explicitly using require.toUrl(), see https://github.com/microsoft/vscode/issues/107440#issuecomment-698982321
|
||||
const workerUrl = getWorkerBootstrapUrl(workerMain, label);
|
||||
return new Worker(workerUrl, { name: label });
|
||||
return new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrl) as unknown as string : workerUrl, { name: label });
|
||||
}
|
||||
// ESM-comment-end
|
||||
throw new Error(`You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker`);
|
||||
|
|
|
@ -40,6 +40,8 @@ export interface IWebWorkerExtensionHostDataProvider {
|
|||
getInitData(): Promise<IWebWorkerExtensionHostInitData>;
|
||||
}
|
||||
|
||||
const ttPolicy = window.trustedTypes?.createPolicy('webWorkerExtensionHost', { createScriptURL: value => value });
|
||||
|
||||
export class WebWorkerExtensionHost extends Disposable implements IExtensionHost {
|
||||
|
||||
public readonly kind = ExtensionHostKind.LocalWebWorker;
|
||||
|
@ -217,7 +219,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
|
|||
const emitter = new Emitter<VSBuffer>();
|
||||
|
||||
const url = getWorkerBootstrapUrl(FileAccess.asBrowserUri('../worker/extensionHostWorkerMain.js', require).toString(true), 'WorkerExtensionHost');
|
||||
const worker = new Worker(url, { name: 'WorkerExtensionHost' });
|
||||
const worker = new Worker(ttPolicy ? ttPolicy.createScriptURL(url) as unknown as string : url, { name: 'WorkerExtensionHost' });
|
||||
|
||||
const barrier = new Barrier();
|
||||
let port!: MessagePort;
|
||||
|
|
|
@ -46,13 +46,16 @@ self.addEventListener = () => console.trace(`'addEventListener' has been blocked
|
|||
(<any>self)['webkitResolveLocalFileSystemURL'] = undefined;
|
||||
|
||||
if ((<any>self).Worker) {
|
||||
const ttPolicy = (<any>self).trustedTypes?.createPolicy('extensionHostWorker', { createScriptURL: (value: string) => value });
|
||||
|
||||
// make sure new Worker(...) always uses data:
|
||||
const _Worker = (<any>self).Worker;
|
||||
Worker = <any>function (stringUrl: string | URL, options?: WorkerOptions) {
|
||||
const js = `importScripts('${stringUrl}');`;
|
||||
options = options || {};
|
||||
options.name = options.name || path.basename(stringUrl.toString());
|
||||
return new _Worker(`data:text/javascript;charset=utf-8,${encodeURIComponent(js)}`, options);
|
||||
const url = `data:text/javascript;charset=utf-8,${encodeURIComponent(js)}`;
|
||||
return new _Worker(ttPolicy ? ttPolicy.createScriptURL(url) : url, options);
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue