Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/test/browser/extHostDocumentContentProvider.test.ts
3296 views
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 assert from 'assert';
7
import { URI, UriComponents } from '../../../../base/common/uri.js';
8
import { ExtHostDocumentsAndEditors } from '../../common/extHostDocumentsAndEditors.js';
9
import { SingleProxyRPCProtocol } from '../common/testRPCProtocol.js';
10
import { NullLogService } from '../../../../platform/log/common/log.js';
11
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
12
import { ExtHostDocumentContentProvider } from '../../common/extHostDocumentContentProviders.js';
13
import { Emitter } from '../../../../base/common/event.js';
14
import { MainThreadDocumentContentProvidersShape } from '../../common/extHost.protocol.js';
15
import { timeout } from '../../../../base/common/async.js';
16
import { runWithFakedTimers } from '../../../../base/test/common/timeTravelScheduler.js';
17
18
suite('ExtHostDocumentContentProvider', () => {
19
20
ensureNoDisposablesAreLeakedInTestSuite();
21
22
const resource = URI.parse('foo:bar');
23
let documentContentProvider: ExtHostDocumentContentProvider;
24
let mainThreadContentProvider: MainThreadDocumentContentProvidersShape;
25
const changes: [uri: UriComponents, value: string][] = [];
26
27
setup(() => {
28
29
changes.length = 0;
30
31
mainThreadContentProvider = new class implements MainThreadDocumentContentProvidersShape {
32
$registerTextContentProvider(handle: number, scheme: string): void {
33
34
}
35
$unregisterTextContentProvider(handle: number): void {
36
37
}
38
async $onVirtualDocumentChange(uri: UriComponents, value: string): Promise<void> {
39
await timeout(10);
40
changes.push([uri, value]);
41
}
42
dispose(): void {
43
throw new Error('Method not implemented.');
44
}
45
};
46
47
const ehContext = SingleProxyRPCProtocol(mainThreadContentProvider);
48
const documentsAndEditors = new ExtHostDocumentsAndEditors(ehContext, new NullLogService());
49
documentsAndEditors.$acceptDocumentsAndEditorsDelta({
50
addedDocuments: [{
51
isDirty: false,
52
languageId: 'foo',
53
uri: resource,
54
versionId: 1,
55
lines: ['foo'],
56
EOL: '\n',
57
encoding: 'utf8'
58
}]
59
});
60
documentContentProvider = new ExtHostDocumentContentProvider(ehContext, documentsAndEditors, new NullLogService());
61
});
62
63
test('TextDocumentContentProvider drops onDidChange events when they happen quickly #179711', async () => {
64
await runWithFakedTimers({}, async function () {
65
66
const emitter = new Emitter<URI>();
67
const contents = ['X', 'Y'];
68
let counter = 0;
69
70
let stack = 0;
71
72
const d = documentContentProvider.registerTextDocumentContentProvider(resource.scheme, {
73
onDidChange: emitter.event,
74
async provideTextDocumentContent(_uri) {
75
assert.strictEqual(stack, 0);
76
stack++;
77
try {
78
await timeout(0);
79
return contents[counter++ % contents.length];
80
} finally {
81
stack--;
82
}
83
}
84
});
85
86
emitter.fire(resource);
87
emitter.fire(resource);
88
89
await timeout(100);
90
91
assert.strictEqual(changes.length, 2);
92
assert.strictEqual(changes[0][1], 'X');
93
assert.strictEqual(changes[1][1], 'Y');
94
95
d.dispose();
96
});
97
});
98
99
100
});
101
102