Skip to content

Commit 3a49a29

Browse files
committed
Fix chat sanitizer replace with plaintext logic
1 parent 8e83fb3 commit 3a49a29

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

src/vs/base/browser/markdownRenderer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,15 +546,19 @@ function getSanitizerOptions(isTrusted: boolean | MarkdownStringTrustedOptions,
546546
}
547547
},
548548
uponSanitizeElement: (element, e) => {
549+
let wantsReplaceWithPlaintext = false;
549550
if (e.tagName === 'input') {
550551
if (element.attributes.getNamedItem('type')?.value === 'checkbox') {
551552
element.setAttribute('disabled', '');
552-
} else if (!options.replaceWithPlaintext) {
553+
} else if (options.replaceWithPlaintext) {
554+
wantsReplaceWithPlaintext = true;
555+
} else {
553556
element.remove();
557+
return;
554558
}
555559
}
556560

557-
if (options.replaceWithPlaintext && !e.allowedTags[e.tagName] && e.tagName !== 'body') {
561+
if (options.replaceWithPlaintext && (wantsReplaceWithPlaintext || (!e.allowedTags[e.tagName] && e.tagName !== 'body'))) {
558562
if (element.parentElement) {
559563
let startTagText: string;
560564
let endTagText: string | undefined;

src/vs/base/test/browser/markdownRenderer.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,17 @@ suite('MarkdownRenderer', () => {
346346
const result = store.add(renderMarkdown(mds)).element;
347347
assert.strictEqual(result.innerHTML, `<img src="vscode-file://vscode-app/images/cat.gif">`);
348348
});
349+
350+
test('Should only allow checkbox inputs', () => {
351+
const mds = new MarkdownString(
352+
'text: <input type="text">\ncheckbox:<input type="checkbox">',
353+
{ supportHtml: true });
354+
355+
const result = store.add(renderMarkdown(mds)).element;
356+
357+
// Inputs should always be disabled too
358+
assert.strictEqual(result.innerHTML, `<p>text: \ncheckbox:<input type="checkbox" disabled=""></p>`);
359+
});
349360
});
350361

351362
suite('fillInIncompleteTokens', () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div class="rendered-markdown"><p>&lt;area&gt;</p><hr><br><input type="checkbox" disabled=""><p></p></div>

src/vs/workbench/contrib/chat/test/browser/chatMarkdownRenderer.test.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,18 @@ suite('ChatMarkdownRenderer', () => {
7979
});
8080

8181
test('self-closing elements', async () => {
82-
const md = new MarkdownString('<area><hr><br><input type="text" value="test">');
83-
md.supportHtml = true;
84-
const result = store.add(testRenderer.render(md));
85-
await assertSnapshot(result.element.outerHTML);
82+
{
83+
const md = new MarkdownString('<area><hr><br><input type="text" value="test">');
84+
md.supportHtml = true;
85+
const result = store.add(testRenderer.render(md));
86+
await assertSnapshot(result.element.outerHTML);
87+
}
88+
{
89+
const md = new MarkdownString('<area><hr><br><input type="checkbox">');
90+
md.supportHtml = true;
91+
const result = store.add(testRenderer.render(md));
92+
await assertSnapshot(result.element.outerHTML);
93+
}
8694
});
8795

8896
test('html comments', async () => {

0 commit comments

Comments
 (0)