Skip to content

Commit 6f3598b

Browse files
authored
Ensure that the first line of markdown in a 'supportHtml' MarkdownString is parsed as markdown (microsoft#217641)
* Ensure that the first line of markdown in a 'supportHtml' MarkdownString is parsed as markdown Fix microsoft/vscode-copilot-release#1337 * Update tests
1 parent 1435b36 commit 6f3598b

8 files changed

+23
-5
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ export class ChatMarkdownRenderer extends MarkdownRenderer {
7373
...markdown,
7474

7575
// dompurify uses DOMParser, which strips leading comments. Wrapping it all in 'body' prevents this.
76-
value: `<body>${markdown.value}</body>`,
76+
// The \n\n prevents marked.js from parsing the body contents as just text in an 'html' token, instead of actual markdown.
77+
value: `<body>\n\n${markdown.value}</body>`,
7778
}
7879
: markdown;
7980
return super.render(mdWithBody, options, markedOptions);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div class="rendered-markdown">1&lt;canvas&gt;2&lt;details&gt;3&lt;/details&gt;&lt;/canvas&gt;4</div>
1+
<div class="rendered-markdown"><p>1&lt;canvas&gt;2&lt;/canvas&gt;</p>&lt;details&gt;3&lt;/details&gt;4<p></p></div>
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div class="rendered-markdown">1&lt;details id="id1" style="display: none"&gt;2&lt;details id="my id 2"&gt;3&lt;/details&gt;&lt;/details&gt;4</div>
1+
<div class="rendered-markdown"><p>1</p>&lt;details id="id1" style="display: none"&gt;2&lt;details id="my id 2"&gt;3&lt;/details&gt;&lt;/details&gt;4<p></p></div>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div class="rendered-markdown"><img src="http://allowed.com/image.jpg"> <div>&lt;img src="http://disallowed.com/image.jpg"&gt;</div></div>
1+
<div class="rendered-markdown"><p><img src="http://allowed.com/image.jpg"> </p><div>&lt;img src="http://disallowed.com/image.jpg"&gt;</div><p></p></div>
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<div class="rendered-markdown">&lt;area&gt;<hr><br>&lt;input type="text" value="test"&gt;</div>
1+
<div class="rendered-markdown"><p>&lt;area&gt;</p><hr><br>&lt;input type="text" value="test"&gt;<p></p></div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div class="rendered-markdown"><p><strong>hello</strong></p></div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<div class="rendered-markdown"><ol>
2+
<li><a data-href="https://example.com" href="" title="https://example.com" draggable="false"><em>hello</em></a> test <strong>text</strong></li>
3+
</ol>
4+
</div>

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ suite('ChatMarkdownRenderer', () => {
2727
await assertSnapshot(result.element.textContent);
2828
});
2929

30+
test('supportHtml with one-line markdown', async () => {
31+
const md = new MarkdownString('**hello**');
32+
md.supportHtml = true;
33+
const result = store.add(testRenderer.render(md));
34+
await assertSnapshot(result.element.outerHTML);
35+
36+
const md2 = new MarkdownString('1. [_hello_](https://example.com) test **text**');
37+
md2.supportHtml = true;
38+
const result2 = store.add(testRenderer.render(md2));
39+
await assertSnapshot(result2.element.outerHTML);
40+
});
41+
3042
test('invalid HTML', async () => {
3143
const md = new MarkdownString('1<canvas>2<details>3</details></canvas>4');
3244
md.supportHtml = true;

0 commit comments

Comments
 (0)