Skip to content

Commit e0edacb

Browse files
authored
Allow embedders to intercept trustedTypes.createPolicy calls (microsoft#184136)
Allow embedders to intercept trustedTypes.createPolicy calls (microsoft#184100)
1 parent b465f0b commit e0edacb

File tree

14 files changed

+136
-59
lines changed

14 files changed

+136
-59
lines changed

build/monaco/monaco.d.ts.recipe

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,32 @@ declare namespace monaco {
1414
export type Thenable<T> = PromiseLike<T>;
1515

1616
export interface Environment {
17+
/**
18+
* Define a global `monaco` symbol.
19+
* This is true by default in AMD and false by default in ESM.
20+
*/
1721
globalAPI?: boolean;
22+
/**
23+
* The base url where the editor sources are found (which contains the vs folder)
24+
*/
1825
baseUrl?: string;
26+
/**
27+
* A web worker factory.
28+
* NOTE: If `getWorker` is defined, `getWorkerUrl` is not invoked.
29+
*/
1930
getWorker?(workerId: string, label: string): Promise<Worker> | Worker;
31+
/**
32+
* Return the location for web worker scripts.
33+
* NOTE: If `getWorker` is defined, `getWorkerUrl` is not invoked.
34+
*/
2035
getWorkerUrl?(workerId: string, label: string): string;
36+
/**
37+
* Create a trust types policy (same API as window.trustedTypes.createPolicy)
38+
*/
39+
createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
40+
policyName: string,
41+
policyOptions?: Options,
42+
): undefined | Pick<TrustedTypePolicy<Options>, 'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>>;
2143
}
2244

2345
export interface IDisposable {

src/tsec.exemptions.json

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,9 @@
1010
"vs/workbench/services/keybinding/test/node/keyboardMapperTestUtils.ts"
1111
],
1212
"ban-trustedtypes-createpolicy": [
13-
"vs/base/browser/dom.ts",
14-
"vs/base/browser/markdownRenderer.ts",
15-
"vs/base/browser/defaultWorkerFactory.ts",
13+
"vs/base/browser/trustedTypes.ts",
1614
"vs/base/worker/workerMain.ts",
17-
"vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts",
18-
"vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.ts",
19-
"vs/editor/browser/view/domLineBreaksComputer.ts",
20-
"vs/editor/browser/view/viewLayer.ts",
21-
"vs/editor/browser/widget/diffEditorWidget.ts",
22-
"vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts",
23-
"vs/editor/browser/widget/diffReview.ts",
24-
"vs/editor/standalone/browser/colorizer.ts",
25-
"vs/workbench/api/worker/extHostExtensionService.ts",
26-
"vs/workbench/contrib/notebook/browser/view/cellParts/cellDragRenderer.ts",
27-
"vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts",
28-
"vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts"
15+
"vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts"
2916
],
3017
"ban-worker-calls": [
3118
"vs/base/browser/defaultWorkerFactory.ts",

src/vs/base/browser/defaultWorkerFactory.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { createTrustedTypesPolicy } from 'vs/base/browser/trustedTypes';
67
import { COI } from 'vs/base/common/network';
78
import { IWorker, IWorkerCallback, IWorkerFactory, logOnceWebWorkerWarning } from 'vs/base/common/worker/simpleWorker';
89

9-
const ttPolicy = window.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });
10+
const ttPolicy = createTrustedTypesPolicy('defaultWorkerFactory', { createScriptURL: value => value });
1011

1112
export function createBlobWorker(blobUrl: string, options?: WorkerOptions): Worker {
1213
if (!blobUrl.startsWith('blob:')) {

src/vs/base/browser/trustedTypes.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { onUnexpectedError } from 'vs/base/common/errors';
7+
8+
export function createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
9+
policyName: string,
10+
policyOptions?: Options,
11+
): undefined | Pick<TrustedTypePolicy<Options>, 'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>> {
12+
13+
interface IMonacoEnvironment {
14+
createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
15+
policyName: string,
16+
policyOptions?: Options,
17+
): undefined | Pick<TrustedTypePolicy<Options>, 'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>>;
18+
}
19+
const monacoEnvironment: IMonacoEnvironment | undefined = (globalThis as any).MonacoEnvironment;
20+
21+
if (monacoEnvironment?.createTrustedTypesPolicy) {
22+
try {
23+
return monacoEnvironment.createTrustedTypesPolicy(policyName, policyOptions);
24+
} catch (err) {
25+
onUnexpectedError(err);
26+
return undefined;
27+
}
28+
}
29+
try {
30+
return window.trustedTypes?.createPolicy(policyName, policyOptions);
31+
} catch (err) {
32+
onUnexpectedError(err);
33+
return undefined;
34+
}
35+
}

src/vs/editor/browser/view/domLineBreaksComputer.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { WrappingIndent } from 'vs/editor/common/config/editorOptions';
7-
import { FontInfo } from 'vs/editor/common/config/fontInfo';
8-
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
6+
import { createTrustedTypesPolicy } from 'vs/base/browser/trustedTypes';
97
import { CharCode } from 'vs/base/common/charCode';
108
import * as strings from 'vs/base/common/strings';
119
import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo';
12-
import { LineInjectedText } from 'vs/editor/common/textModelEvents';
10+
import { WrappingIndent } from 'vs/editor/common/config/editorOptions';
11+
import { FontInfo } from 'vs/editor/common/config/fontInfo';
12+
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
1313
import { InjectedTextOptions } from 'vs/editor/common/model';
1414
import { ILineBreaksComputer, ILineBreaksComputerFactory, ModelLineProjectionData } from 'vs/editor/common/modelLineProjectionData';
15+
import { LineInjectedText } from 'vs/editor/common/textModelEvents';
1516

16-
const ttPolicy = window.trustedTypes?.createPolicy('domLineBreaksComputer', { createHTML: value => value });
17+
const ttPolicy = createTrustedTypesPolicy('domLineBreaksComputer', { createHTML: value => value });
1718

1819
export class DOMLineBreaksComputerFactory implements ILineBreaksComputerFactory {
1920

src/vs/editor/browser/view/viewLayer.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
7+
import { createTrustedTypesPolicy } from 'vs/base/browser/trustedTypes';
8+
import { BugIndicatingError } from 'vs/base/common/errors';
9+
import { EditorOption } from 'vs/editor/common/config/editorOptions';
710
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
811
import * as viewEvents from 'vs/editor/common/viewEvents';
912
import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData';
10-
import { EditorOption } from 'vs/editor/common/config/editorOptions';
11-
import { BugIndicatingError } from 'vs/base/common/errors';
1213

1314
/**
1415
* Represents a visible line
@@ -371,7 +372,7 @@ interface IRendererContext<T extends IVisibleLine> {
371372

372373
class ViewLayerRenderer<T extends IVisibleLine> {
373374

374-
private static _ttPolicy = window.trustedTypes?.createPolicy('editorViewLayer', { createHTML: value => value });
375+
private static _ttPolicy = createTrustedTypesPolicy('editorViewLayer', { createHTML: value => value });
375376

376377
readonly domNode: HTMLElement;
377378
readonly host: IVisibleLinesHost<T>;

src/vs/editor/browser/widget/diffEditorWidget.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import * as dom from 'vs/base/browser/dom';
77
import { createFastDomNode, FastDomNode } from 'vs/base/browser/fastDomNode';
88
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
9+
import { createTrustedTypesPolicy } from 'vs/base/browser/trustedTypes';
910
import { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from 'vs/base/browser/ui/mouseCursor/mouseCursor';
1011
import { IBoundarySashes, ISashEvent, IVerticalSashLayoutProvider, Orientation, Sash, SashState } from 'vs/base/browser/ui/sash/sash';
1112
import * as assert from 'vs/base/common/assert';
@@ -14,7 +15,9 @@ import { Codicon } from 'vs/base/common/codicons';
1415
import { Color } from 'vs/base/common/color';
1516
import { onUnexpectedError } from 'vs/base/common/errors';
1617
import { Emitter, Event } from 'vs/base/common/event';
18+
import { MarkdownString } from 'vs/base/common/htmlContent';
1719
import { Disposable } from 'vs/base/common/lifecycle';
20+
import { ThemeIcon } from 'vs/base/common/themables';
1821
import { Constants } from 'vs/base/common/uint';
1922
import { URI } from 'vs/base/common/uri';
2023
import 'vs/css!./media/diffEditor';
@@ -26,10 +29,11 @@ import { EditorExtensionsRegistry, IDiffEditorContributionDescription } from 'vs
2629
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
2730
import { StableEditorScrollState } from 'vs/editor/browser/stableEditorScroll';
2831
import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget';
32+
import { DiffNavigator } from 'vs/editor/browser/widget/diffNavigator';
2933
import { DiffReview } from 'vs/editor/browser/widget/diffReview';
3034
import { IDiffLinesChange, InlineDiffMargin } from 'vs/editor/browser/widget/inlineDiffMargin';
3135
import { WorkerBasedDocumentDiffProvider } from 'vs/editor/browser/widget/workerBasedDocumentDiffProvider';
32-
import { boolean as validateBooleanOption, clampedInt, EditorFontLigatures, EditorLayoutInfo, EditorOption, EditorOptions, IDiffEditorOptions, stringSet as validateStringSetOption, ValidDiffEditorBaseOptions, clampedFloat } from 'vs/editor/common/config/editorOptions';
36+
import { clampedFloat, clampedInt, EditorFontLigatures, EditorLayoutInfo, EditorOption, EditorOptions, IDiffEditorOptions, boolean as validateBooleanOption, stringSet as validateStringSetOption, ValidDiffEditorBaseOptions } from 'vs/editor/common/config/editorOptions';
3337
import { FontInfo } from 'vs/editor/common/config/fontInfo';
3438
import { IDimension } from 'vs/editor/common/core/dimension';
3539
import { IPosition, Position } from 'vs/editor/common/core/position';
@@ -38,6 +42,7 @@ import { ISelection, Selection } from 'vs/editor/common/core/selection';
3842
import { StringBuilder } from 'vs/editor/common/core/stringBuilder';
3943
import { IChange, ICharChange, IDiffComputationResult, ILineChange } from 'vs/editor/common/diff/smartLinesDiffComputer';
4044
import * as editorCommon from 'vs/editor/common/editorCommon';
45+
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
4146
import { IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel } from 'vs/editor/common/model';
4247
import { ModelDecorationOptions } from 'vs/editor/common/model/textModel';
4348
import { ILineBreaksComputer } from 'vs/editor/common/modelLineProjectionData';
@@ -57,10 +62,6 @@ import { IEditorProgressService, IProgressRunner } from 'vs/platform/progress/co
5762
import { defaultInsertColor, defaultRemoveColor, diffDiagonalFill, diffInserted, diffOverviewRulerInserted, diffOverviewRulerRemoved, diffRemoved } from 'vs/platform/theme/common/colorRegistry';
5863
import { registerIcon } from 'vs/platform/theme/common/iconRegistry';
5964
import { getThemeTypeSelector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService';
60-
import { ThemeIcon } from 'vs/base/common/themables';
61-
import { MarkdownString } from 'vs/base/common/htmlContent';
62-
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
63-
import { DiffNavigator } from 'vs/editor/browser/widget/diffNavigator';
6465

6566
export interface IDiffCodeEditorWidgetOptions {
6667
originalEditor?: ICodeEditorWidgetOptions;
@@ -173,7 +174,7 @@ let DIFF_EDITOR_ID = 0;
173174

174175
const diffInsertIcon = registerIcon('diff-insert', Codicon.add, nls.localize('diffInsertIcon', 'Line decoration for inserts in the diff editor.'));
175176
const diffRemoveIcon = registerIcon('diff-remove', Codicon.remove, nls.localize('diffRemoveIcon', 'Line decoration for removals in the diff editor.'));
176-
const ttPolicy = window.trustedTypes?.createPolicy('diffEditorWidget', { createHTML: value => value });
177+
const ttPolicy = createTrustedTypesPolicy('diffEditorWidget', { createHTML: value => value });
177178

178179
const ariaNavigationTip = nls.localize('diff-aria-navigation-tip', ' use Shift + F7 to navigate changes');
179180

src/vs/editor/browser/widget/diffReview.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,39 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import 'vs/css!./media/diffReview';
7-
import * as nls from 'vs/nls';
86
import * as dom from 'vs/base/browser/dom';
97
import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode';
8+
import { createTrustedTypesPolicy } from 'vs/base/browser/trustedTypes';
109
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
1110
import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
1211
import { Action } from 'vs/base/common/actions';
12+
import { Codicon } from 'vs/base/common/codicons';
1313
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
1414
import { Disposable } from 'vs/base/common/lifecycle';
15+
import { ThemeIcon } from 'vs/base/common/themables';
16+
import { Constants } from 'vs/base/common/uint';
17+
import 'vs/css!./media/diffReview';
1518
import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo';
1619
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1720
import { EditorAction, ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions';
1821
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
1922
import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget';
20-
import { IComputedEditorOptions, EditorOption, EditorFontLigatures } from 'vs/editor/common/config/editorOptions';
21-
import { LineTokens } from 'vs/editor/common/tokens/lineTokens';
23+
import { EditorFontLigatures, EditorOption, IComputedEditorOptions } from 'vs/editor/common/config/editorOptions';
2224
import { Position } from 'vs/editor/common/core/position';
25+
import { ILineChange } from 'vs/editor/common/diff/smartLinesDiffComputer';
2326
import { ScrollType } from 'vs/editor/common/editorCommon';
27+
import { ILanguageIdCodec } from 'vs/editor/common/languages';
28+
import { ILanguageService } from 'vs/editor/common/languages/language';
2429
import { ITextModel, TextModelResolvedOptions } from 'vs/editor/common/model';
30+
import { LineTokens } from 'vs/editor/common/tokens/lineTokens';
2531
import { RenderLineInput, renderViewLine2 as renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer';
2632
import { ViewLineRenderingData } from 'vs/editor/common/viewModel';
33+
import * as nls from 'vs/nls';
34+
import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService';
35+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
2736
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
2837
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
29-
import { ThemeIcon } from 'vs/base/common/themables';
30-
import { Constants } from 'vs/base/common/uint';
31-
import { Codicon } from 'vs/base/common/codicons';
3238
import { registerIcon } from 'vs/platform/theme/common/iconRegistry';
33-
import { ILanguageService } from 'vs/editor/common/languages/language';
34-
import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService';
35-
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
36-
import { ILineChange } from 'vs/editor/common/diff/smartLinesDiffComputer';
37-
import { ILanguageIdCodec } from 'vs/editor/common/languages';
3839

3940
const DIFF_LINES_PADDING = 3;
4041

@@ -87,7 +88,7 @@ const diffReviewCloseIcon = registerIcon('diff-review-close', Codicon.close, nls
8788

8889
export class DiffReview extends Disposable {
8990

90-
private static _ttPolicy = window.trustedTypes?.createPolicy('diffReview', { createHTML: value => value });
91+
private static _ttPolicy = createTrustedTypesPolicy('diffReview', { createHTML: value => value });
9192

9293
private readonly _diffEditor: DiffEditorWidget;
9394
private _isVisible: boolean;

src/vs/editor/contrib/inlineCompletions/browser/ghostTextWidget.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { createTrustedTypesPolicy } from 'vs/base/browser/trustedTypes';
67
import { Event } from 'vs/base/common/event';
78
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
89
import { IObservable, autorun, derived, observableFromEvent, observableSignalFromEvent, observableValue } from 'vs/base/common/observable';
@@ -321,4 +322,4 @@ function renderLines(domNode: HTMLElement, tabSize: number, lines: LineData[], o
321322
domNode.innerHTML = trustedhtml as string;
322323
}
323324

324-
const ttPolicy = window.trustedTypes?.createPolicy('editorGhostText', { createHTML: value => value });
325+
const ttPolicy = createTrustedTypesPolicy('editorGhostText', { createHTML: value => value });

src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { MarkdownRenderOptions, MarkedOptions, renderMarkdown } from 'vs/base/browser/markdownRenderer';
7+
import { createTrustedTypesPolicy } from 'vs/base/browser/trustedTypes';
78
import { onUnexpectedError } from 'vs/base/common/errors';
89
import { Emitter } from 'vs/base/common/event';
910
import { IMarkdownString, MarkdownStringTrustedOptions } from 'vs/base/common/htmlContent';
@@ -33,7 +34,7 @@ export interface IMarkdownRendererOptions {
3334
*/
3435
export class MarkdownRenderer {
3536

36-
private static _ttpTokenizer = window.trustedTypes?.createPolicy('tokenizeToString', {
37+
private static _ttpTokenizer = createTrustedTypesPolicy('tokenizeToString', {
3738
createHTML(html: string) {
3839
return html;
3940
}

0 commit comments

Comments
 (0)