Adopt ensureNoDisposablesAreLeakedInTestSuite (#193736)

For #190503
This commit is contained in:
Matt Bierner
2023-09-21 15:09:19 -07:00
committed by GitHub
parent 31067371f2
commit e2bd761d52

View File

@@ -10,6 +10,7 @@ import { marked } from 'vs/base/common/marked/marked';
import { parse } from 'vs/base/common/marshalling'; import { parse } from 'vs/base/common/marshalling';
import { isWeb } from 'vs/base/common/platform'; import { isWeb } from 'vs/base/common/platform';
import { URI } from 'vs/base/common/uri'; import { URI } from 'vs/base/common/uri';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
function strToNode(str: string): HTMLElement { function strToNode(str: string): HTMLElement {
return new DOMParser().parseFromString(str, 'text/html').body.firstChild as HTMLElement; return new DOMParser().parseFromString(str, 'text/html').body.firstChild as HTMLElement;
@@ -23,10 +24,13 @@ function assertNodeEquals(actualNode: HTMLElement, expectedHtml: string) {
} }
suite('MarkdownRenderer', () => { suite('MarkdownRenderer', () => {
const store = ensureNoDisposablesAreLeakedInTestSuite();
suite('Sanitization', () => { suite('Sanitization', () => {
test('Should not render images with unknown schemes', () => { test('Should not render images with unknown schemes', () => {
const markdown = { value: `![image](no-such://example.com/cat.gif)` }; const markdown = { value: `![image](no-such://example.com/cat.gif)` };
const result: HTMLElement = renderMarkdown(markdown).element; const result: HTMLElement = store.add(renderMarkdown(markdown)).element;
assert.strictEqual(result.innerHTML, '<p><img alt="image"></p>'); assert.strictEqual(result.innerHTML, '<p><img alt="image"></p>');
}); });
}); });
@@ -34,28 +38,28 @@ suite('MarkdownRenderer', () => {
suite('Images', () => { suite('Images', () => {
test('image rendering conforms to default', () => { test('image rendering conforms to default', () => {
const markdown = { value: `![image](http://example.com/cat.gif 'caption')` }; const markdown = { value: `![image](http://example.com/cat.gif 'caption')` };
const result: HTMLElement = renderMarkdown(markdown).element; const result: HTMLElement = store.add(renderMarkdown(markdown)).element;
assertNodeEquals(result, '<div><p><img title="caption" alt="image" src="http://example.com/cat.gif"></p></div>'); assertNodeEquals(result, '<div><p><img title="caption" alt="image" src="http://example.com/cat.gif"></p></div>');
}); });
test('image rendering conforms to default without title', () => { test('image rendering conforms to default without title', () => {
const markdown = { value: `![image](http://example.com/cat.gif)` }; const markdown = { value: `![image](http://example.com/cat.gif)` };
const result: HTMLElement = renderMarkdown(markdown).element; const result: HTMLElement = store.add(renderMarkdown(markdown)).element;
assertNodeEquals(result, '<div><p><img alt="image" src="http://example.com/cat.gif"></p></div>'); assertNodeEquals(result, '<div><p><img alt="image" src="http://example.com/cat.gif"></p></div>');
}); });
test('image width from title params', () => { test('image width from title params', () => {
const result: HTMLElement = renderMarkdown({ value: `![image](http://example.com/cat.gif|width=100px 'caption')` }).element; const result: HTMLElement = store.add(renderMarkdown({ value: `![image](http://example.com/cat.gif|width=100px 'caption')` })).element;
assertNodeEquals(result, `<div><p><img width="100" title="caption" alt="image" src="http://example.com/cat.gif"></p></div>`); assertNodeEquals(result, `<div><p><img width="100" title="caption" alt="image" src="http://example.com/cat.gif"></p></div>`);
}); });
test('image height from title params', () => { test('image height from title params', () => {
const result: HTMLElement = renderMarkdown({ value: `![image](http://example.com/cat.gif|height=100 'caption')` }).element; const result: HTMLElement = store.add(renderMarkdown({ value: `![image](http://example.com/cat.gif|height=100 'caption')` })).element;
assertNodeEquals(result, `<div><p><img height="100" title="caption" alt="image" src="http://example.com/cat.gif"></p></div>`); assertNodeEquals(result, `<div><p><img height="100" title="caption" alt="image" src="http://example.com/cat.gif"></p></div>`);
}); });
test('image width and height from title params', () => { test('image width and height from title params', () => {
const result: HTMLElement = renderMarkdown({ value: `![image](http://example.com/cat.gif|height=200,width=100 'caption')` }).element; const result: HTMLElement = store.add(renderMarkdown({ value: `![image](http://example.com/cat.gif|height=200,width=100 'caption')` })).element;
assertNodeEquals(result, `<div><p><img height="200" width="100" title="caption" alt="image" src="http://example.com/cat.gif"></p></div>`); assertNodeEquals(result, `<div><p><img height="200" width="100" title="caption" alt="image" src="http://example.com/cat.gif"></p></div>`);
}); });
@@ -63,7 +67,7 @@ suite('MarkdownRenderer', () => {
if (isWeb) { if (isWeb) {
return; return;
} }
const result: HTMLElement = renderMarkdown({ value: `![image](file:///images/cat.gif)` }).element; const result: HTMLElement = store.add(renderMarkdown({ value: `![image](file:///images/cat.gif)` })).element;
assertNodeEquals(result, '<div><p><img src="vscode-file://vscode-app/images/cat.gif" alt="image"></p></div>'); assertNodeEquals(result, '<div><p><img src="vscode-file://vscode-app/images/cat.gif" alt="image"></p></div>');
}); });
}); });
@@ -78,10 +82,10 @@ suite('MarkdownRenderer', () => {
test('asyncRenderCallback should be invoked for code blocks', () => { test('asyncRenderCallback should be invoked for code blocks', () => {
const markdown = { value: '```js\n1 + 1;\n```' }; const markdown = { value: '```js\n1 + 1;\n```' };
return new Promise<void>(resolve => { return new Promise<void>(resolve => {
renderMarkdown(markdown, { store.add(renderMarkdown(markdown, {
asyncRenderCallback: resolve, asyncRenderCallback: resolve,
codeBlockRenderer: simpleCodeBlockRenderer codeBlockRenderer: simpleCodeBlockRenderer
}); }));
}); });
}); });
@@ -120,12 +124,12 @@ suite('MarkdownRenderer', () => {
test('Code blocks should use leading language id (#157793)', async () => { test('Code blocks should use leading language id (#157793)', async () => {
const markdown = { value: '```js some other stuff\n1 + 1;\n```' }; const markdown = { value: '```js some other stuff\n1 + 1;\n```' };
const lang = await new Promise<string>(resolve => { const lang = await new Promise<string>(resolve => {
renderMarkdown(markdown, { store.add(renderMarkdown(markdown, {
codeBlockRenderer: async (lang, value) => { codeBlockRenderer: async (lang, value) => {
resolve(lang); resolve(lang);
return simpleCodeBlockRenderer(lang, value); return simpleCodeBlockRenderer(lang, value);
} }
}); }));
}); });
assert.strictEqual(lang, 'js'); assert.strictEqual(lang, 'js');
}); });
@@ -137,7 +141,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportThemeIcons: true }); const mds = new MarkdownString(undefined, { supportThemeIcons: true });
mds.appendText('$(zap) $(not a theme icon) $(add)'); mds.appendText('$(zap) $(not a theme icon) $(add)');
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>$(zap)&nbsp;$(not&nbsp;a&nbsp;theme&nbsp;icon)&nbsp;$(add)</p>`); assert.strictEqual(result.innerHTML, `<p>$(zap)&nbsp;$(not&nbsp;a&nbsp;theme&nbsp;icon)&nbsp;$(add)</p>`);
}); });
@@ -145,7 +149,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportThemeIcons: true }); const mds = new MarkdownString(undefined, { supportThemeIcons: true });
mds.appendMarkdown('$(zap) $(not a theme icon) $(add)'); mds.appendMarkdown('$(zap) $(not a theme icon) $(add)');
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p><span class="codicon codicon-zap"></span> $(not a theme icon) <span class="codicon codicon-add"></span></p>`); assert.strictEqual(result.innerHTML, `<p><span class="codicon codicon-zap"></span> $(not a theme icon) <span class="codicon codicon-add"></span></p>`);
}); });
@@ -153,7 +157,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportThemeIcons: true }); const mds = new MarkdownString(undefined, { supportThemeIcons: true });
mds.appendMarkdown('\\$(zap) $(not a theme icon) $(add)'); mds.appendMarkdown('\\$(zap) $(not a theme icon) $(add)');
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>$(zap) $(not a theme icon) <span class="codicon codicon-add"></span></p>`); assert.strictEqual(result.innerHTML, `<p>$(zap) $(not a theme icon) <span class="codicon codicon-add"></span></p>`);
}); });
@@ -161,7 +165,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportThemeIcons: true }); const mds = new MarkdownString(undefined, { supportThemeIcons: true });
mds.appendMarkdown(`[$(zap)-link](#link)`); mds.appendMarkdown(`[$(zap)-link](#link)`);
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p><a data-href="#link" href="" title="#link"><span class="codicon codicon-zap"></span>-link</a></p>`); assert.strictEqual(result.innerHTML, `<p><a data-href="#link" href="" title="#link"><span class="codicon codicon-zap"></span>-link</a></p>`);
}); });
@@ -172,7 +176,7 @@ suite('MarkdownRenderer', () => {
|--------|----------------------| |--------|----------------------|
| $(zap) | [$(zap)-link](#link) |`); | $(zap) | [$(zap)-link](#link) |`);
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<table> assert.strictEqual(result.innerHTML, `<table>
<thead> <thead>
<tr> <tr>
@@ -192,7 +196,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportThemeIcons: true, supportHtml: true }); const mds = new MarkdownString(undefined, { supportThemeIcons: true, supportHtml: true });
mds.appendMarkdown(`<a>$(sync)</a>`); mds.appendMarkdown(`<a>$(sync)</a>`);
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p><span class="codicon codicon-sync"></span></p>`); assert.strictEqual(result.innerHTML, `<p><span class="codicon codicon-sync"></span></p>`);
}); });
}); });
@@ -203,7 +207,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportThemeIcons: false }); const mds = new MarkdownString(undefined, { supportThemeIcons: false });
mds.appendText('$(zap) $(not a theme icon) $(add)'); mds.appendText('$(zap) $(not a theme icon) $(add)');
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>$(zap)&nbsp;$(not&nbsp;a&nbsp;theme&nbsp;icon)&nbsp;$(add)</p>`); assert.strictEqual(result.innerHTML, `<p>$(zap)&nbsp;$(not&nbsp;a&nbsp;theme&nbsp;icon)&nbsp;$(add)</p>`);
}); });
@@ -211,7 +215,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportThemeIcons: false }); const mds = new MarkdownString(undefined, { supportThemeIcons: false });
mds.appendMarkdown('\\$(zap) $(not a theme icon) $(add)'); mds.appendMarkdown('\\$(zap) $(not a theme icon) $(add)');
const result: HTMLElement = renderMarkdown(mds).element; const result: HTMLElement = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>$(zap) $(not a theme icon) $(add)</p>`); assert.strictEqual(result.innerHTML, `<p>$(zap) $(not a theme icon) $(add)</p>`);
}); });
}); });
@@ -219,7 +223,7 @@ suite('MarkdownRenderer', () => {
test('npm Hover Run Script not working #90855', function () { test('npm Hover Run Script not working #90855', function () {
const md: IMarkdownString = JSON.parse('{"value":"[Run Script](command:npm.runScriptFromHover?%7B%22documentUri%22%3A%7B%22%24mid%22%3A1%2C%22fsPath%22%3A%22c%3A%5C%5CUsers%5C%5Cjrieken%5C%5CCode%5C%5C_sample%5C%5Cfoo%5C%5Cpackage.json%22%2C%22_sep%22%3A1%2C%22external%22%3A%22file%3A%2F%2F%2Fc%253A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22path%22%3A%22%2Fc%3A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22scheme%22%3A%22file%22%7D%2C%22script%22%3A%22echo%22%7D \\"Run the script as a task\\")","supportThemeIcons":false,"isTrusted":true,"uris":{"__uri_e49443":{"$mid":1,"fsPath":"c:\\\\Users\\\\jrieken\\\\Code\\\\_sample\\\\foo\\\\package.json","_sep":1,"external":"file:///c%3A/Users/jrieken/Code/_sample/foo/package.json","path":"/c:/Users/jrieken/Code/_sample/foo/package.json","scheme":"file"},"command:npm.runScriptFromHover?%7B%22documentUri%22%3A%7B%22%24mid%22%3A1%2C%22fsPath%22%3A%22c%3A%5C%5CUsers%5C%5Cjrieken%5C%5CCode%5C%5C_sample%5C%5Cfoo%5C%5Cpackage.json%22%2C%22_sep%22%3A1%2C%22external%22%3A%22file%3A%2F%2F%2Fc%253A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22path%22%3A%22%2Fc%3A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22scheme%22%3A%22file%22%7D%2C%22script%22%3A%22echo%22%7D":{"$mid":1,"path":"npm.runScriptFromHover","scheme":"command","query":"{\\"documentUri\\":\\"__uri_e49443\\",\\"script\\":\\"echo\\"}"}}}'); const md: IMarkdownString = JSON.parse('{"value":"[Run Script](command:npm.runScriptFromHover?%7B%22documentUri%22%3A%7B%22%24mid%22%3A1%2C%22fsPath%22%3A%22c%3A%5C%5CUsers%5C%5Cjrieken%5C%5CCode%5C%5C_sample%5C%5Cfoo%5C%5Cpackage.json%22%2C%22_sep%22%3A1%2C%22external%22%3A%22file%3A%2F%2F%2Fc%253A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22path%22%3A%22%2Fc%3A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22scheme%22%3A%22file%22%7D%2C%22script%22%3A%22echo%22%7D \\"Run the script as a task\\")","supportThemeIcons":false,"isTrusted":true,"uris":{"__uri_e49443":{"$mid":1,"fsPath":"c:\\\\Users\\\\jrieken\\\\Code\\\\_sample\\\\foo\\\\package.json","_sep":1,"external":"file:///c%3A/Users/jrieken/Code/_sample/foo/package.json","path":"/c:/Users/jrieken/Code/_sample/foo/package.json","scheme":"file"},"command:npm.runScriptFromHover?%7B%22documentUri%22%3A%7B%22%24mid%22%3A1%2C%22fsPath%22%3A%22c%3A%5C%5CUsers%5C%5Cjrieken%5C%5CCode%5C%5C_sample%5C%5Cfoo%5C%5Cpackage.json%22%2C%22_sep%22%3A1%2C%22external%22%3A%22file%3A%2F%2F%2Fc%253A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22path%22%3A%22%2Fc%3A%2FUsers%2Fjrieken%2FCode%2F_sample%2Ffoo%2Fpackage.json%22%2C%22scheme%22%3A%22file%22%7D%2C%22script%22%3A%22echo%22%7D":{"$mid":1,"path":"npm.runScriptFromHover","scheme":"command","query":"{\\"documentUri\\":\\"__uri_e49443\\",\\"script\\":\\"echo\\"}"}}}');
const element = renderMarkdown(md).element; const element = store.add(renderMarkdown(md)).element;
const anchor = element.querySelector('a')!; const anchor = element.querySelector('a')!;
assert.ok(anchor); assert.ok(anchor);
@@ -238,7 +242,7 @@ suite('MarkdownRenderer', () => {
supportHtml: true supportHtml: true
}); });
const result: HTMLElement = renderMarkdown(md).element; const result: HTMLElement = store.add(renderMarkdown(md)).element;
assert.strictEqual(result.innerHTML, `<p>command1 command2</p>`); assert.strictEqual(result.innerHTML, `<p>command1 command2</p>`);
}); });
@@ -248,7 +252,7 @@ suite('MarkdownRenderer', () => {
supportHtml: true, supportHtml: true,
}); });
const result: HTMLElement = renderMarkdown(md).element; const result: HTMLElement = store.add(renderMarkdown(md)).element;
assert.strictEqual(result.innerHTML, `<p><a data-href="command:doFoo" href="" title="command:doFoo">command1</a> <a data-href="command:doFoo" href="">command2</a></p>`); assert.strictEqual(result.innerHTML, `<p><a data-href="command:doFoo" href="" title="command:doFoo">command1</a> <a data-href="command:doFoo" href="">command2</a></p>`);
}); });
@@ -274,7 +278,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, {}); const mds = new MarkdownString(undefined, {});
mds.appendMarkdown('a<b>b</b>c'); mds.appendMarkdown('a<b>b</b>c');
const result = renderMarkdown(mds).element; const result = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>abc</p>`); assert.strictEqual(result.innerHTML, `<p>abc</p>`);
}); });
@@ -282,7 +286,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportHtml: true }); const mds = new MarkdownString(undefined, { supportHtml: true });
mds.appendMarkdown('a<b>b</b>c'); mds.appendMarkdown('a<b>b</b>c');
const result = renderMarkdown(mds).element; const result = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>a<b>b</b>c</p>`); assert.strictEqual(result.innerHTML, `<p>a<b>b</b>c</p>`);
}); });
@@ -290,7 +294,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportHtml: true }); const mds = new MarkdownString(undefined, { supportHtml: true });
mds.appendMarkdown('a<b onclick="alert(1)">b</b><script>alert(2)</script>c'); mds.appendMarkdown('a<b onclick="alert(1)">b</b><script>alert(2)</script>c');
const result = renderMarkdown(mds).element; const result = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>a<b>b</b>c</p>`); assert.strictEqual(result.innerHTML, `<p>a<b>b</b>c</p>`);
}); });
@@ -298,7 +302,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportHtml: true }); const mds = new MarkdownString(undefined, { supportHtml: true });
mds.appendText('a<b>b</b>c'); mds.appendText('a<b>b</b>c');
const result = renderMarkdown(mds).element; const result = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<p>a&lt;b&gt;b&lt;/b&gt;c</p>`); assert.strictEqual(result.innerHTML, `<p>a&lt;b&gt;b&lt;/b&gt;c</p>`);
}); });
@@ -310,7 +314,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportHtml: true }); const mds = new MarkdownString(undefined, { supportHtml: true });
mds.appendMarkdown(`<img src="http://example.com/cat.gif">`); mds.appendMarkdown(`<img src="http://example.com/cat.gif">`);
const result = renderMarkdown(mds).element; const result = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<img src="http://example.com/cat.gif">`); assert.strictEqual(result.innerHTML, `<img src="http://example.com/cat.gif">`);
}); });
@@ -322,7 +326,7 @@ suite('MarkdownRenderer', () => {
const mds = new MarkdownString(undefined, { supportHtml: true }); const mds = new MarkdownString(undefined, { supportHtml: true });
mds.appendMarkdown(`<img src="file:///images/cat.gif">`); mds.appendMarkdown(`<img src="file:///images/cat.gif">`);
const result = renderMarkdown(mds).element; const result = store.add(renderMarkdown(mds)).element;
assert.strictEqual(result.innerHTML, `<img src="vscode-file://vscode-app/images/cat.gif">`); assert.strictEqual(result.innerHTML, `<img src="vscode-file://vscode-app/images/cat.gif">`);
}); });
}); });