Skip to content

Commit 2dfe1aa

Browse files
connor4312Tyriar
andauthored
debug: fix escape characters shown when hovering DOM element (microsoft#230176)
Merge pull request microsoft#229880 from microsoft/connor4312/issue229874 debug: fix escape characters shown when hovering DOM element Co-authored-by: Daniel Imms <[email protected]>
1 parent c66d4fc commit 2dfe1aa

File tree

3 files changed

+35
-13
lines changed

3 files changed

+35
-13
lines changed

src/vs/workbench/contrib/debug/browser/debugExpressionRenderer.ts

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,26 @@ const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024;
4949
const booleanRegex = /^(true|false)$/i;
5050
const stringRegex = /^(['"]).*\1$/;
5151

52+
const enum Cls {
53+
Value = 'value',
54+
Unavailable = 'unavailable',
55+
Error = 'error',
56+
Changed = 'changed',
57+
Boolean = 'boolean',
58+
String = 'string',
59+
Number = 'number',
60+
}
61+
62+
const allClasses: readonly Cls[] = Object.keys({
63+
[Cls.Value]: 0,
64+
[Cls.Unavailable]: 0,
65+
[Cls.Error]: 0,
66+
[Cls.Changed]: 0,
67+
[Cls.Boolean]: 0,
68+
[Cls.String]: 0,
69+
[Cls.Number]: 0,
70+
} satisfies { [key in Cls]: unknown }) as Cls[];
71+
5272
export class DebugExpressionRenderer {
5373
private displayType: IObservable<boolean>;
5474
private readonly linkDetector: LinkDetector;
@@ -110,29 +130,32 @@ export class DebugExpressionRenderer {
110130
let value = typeof expressionOrValue === 'string' ? expressionOrValue : expressionOrValue.value;
111131

112132
// remove stale classes
113-
container.className = 'value';
133+
for (const cls of allClasses) {
134+
container.classList.remove(cls);
135+
}
136+
container.classList.add(Cls.Value);
114137
// when resolving expressions we represent errors from the server as a variable with name === null.
115138
if (value === null || ((expressionOrValue instanceof Expression || expressionOrValue instanceof Variable || expressionOrValue instanceof ReplEvaluationResult) && !expressionOrValue.available)) {
116-
container.classList.add('unavailable');
139+
container.classList.add(Cls.Unavailable);
117140
if (value !== Expression.DEFAULT_VALUE) {
118-
container.classList.add('error');
141+
container.classList.add(Cls.Error);
119142
}
120143
} else {
121144
if (typeof expressionOrValue !== 'string' && options.showChanged && expressionOrValue.valueChanged && value !== Expression.DEFAULT_VALUE) {
122145
// value changed color has priority over other colors.
123-
container.className = 'value changed';
146+
container.classList.add(Cls.Changed);
124147
expressionOrValue.valueChanged = false;
125148
}
126149

127150
if (options.colorize && typeof expressionOrValue !== 'string') {
128151
if (expressionOrValue.type === 'number' || expressionOrValue.type === 'boolean' || expressionOrValue.type === 'string') {
129152
container.classList.add(expressionOrValue.type);
130153
} else if (!isNaN(+value)) {
131-
container.classList.add('number');
154+
container.classList.add(Cls.Number);
132155
} else if (booleanRegex.test(value)) {
133-
container.classList.add('boolean');
156+
container.classList.add(Cls.Boolean);
134157
} else if (stringRegex.test(value)) {
135-
container.classList.add('string');
158+
container.classList.add(Cls.String);
136159
}
137160
}
138161
}

src/vs/workbench/contrib/debug/browser/debugHover.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,7 @@ export class DebugHoverWidget implements IContentWidget {
321321
this.valueContainer.hidden = true;
322322

323323
this.expressionToRender = expression;
324-
this.complexValueTitle.textContent = expression.value;
325-
this.complexValueTitle.title = expression.value;
324+
store.add(this.expressionRenderer.renderValue(this.complexValueTitle, expression, { hover: false, session }));
326325
this.editor.layoutContentWidget(this);
327326
this.tree.scrollTop = 0;
328327
this.tree.scrollLeft = 0;

src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,26 +116,26 @@ suite('Debug - Base Debug View', () => {
116116
let container = $('.container');
117117
const store = disposables.add(new DisposableStore());
118118
store.add(renderer.renderValue(container, 'render \n me', {}));
119-
assert.strictEqual(container.className, 'value');
119+
assert.strictEqual(container.className, 'container value');
120120
assert.strictEqual(container.textContent, 'render \n me');
121121

122122
const expression = new Expression('console');
123123
expression.value = 'Object';
124124
container = $('.container');
125125
store.add(renderer.renderValue(container, expression, { colorize: true }));
126-
assert.strictEqual(container.className, 'value unavailable error');
126+
assert.strictEqual(container.className, 'container value unavailable error');
127127

128128
expression.available = true;
129129
expression.value = '"string value"';
130130
container = $('.container');
131131
store.add(renderer.renderValue(container, expression, { colorize: true }));
132-
assert.strictEqual(container.className, 'value string');
132+
assert.strictEqual(container.className, 'container value string');
133133
assert.strictEqual(container.textContent, '"string value"');
134134

135135
expression.type = 'boolean';
136136
container = $('.container');
137137
store.add(renderer.renderValue(container, expression, { colorize: true }));
138-
assert.strictEqual(container.className, 'value boolean');
138+
assert.strictEqual(container.className, 'container value boolean');
139139
assert.strictEqual(container.textContent, expression.value);
140140

141141
expression.value = 'this is a long string';

0 commit comments

Comments
 (0)