Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/test/browser/window.test.ts
4778 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 { IRegisteredCodeWindow } from '../../../base/browser/dom.js';
8
import { CodeWindow, mainWindow } from '../../../base/browser/window.js';
9
import { DisposableStore } from '../../../base/common/lifecycle.js';
10
import { runWithFakedTimers } from '../../../base/test/common/timeTravelScheduler.js';
11
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../base/test/common/utils.js';
12
import { BaseWindow } from '../../browser/window.js';
13
import { TestContextMenuService, TestEnvironmentService, TestHostService, TestLayoutService } from './workbenchTestServices.js';
14
15
suite('Window', () => {
16
17
ensureNoDisposablesAreLeakedInTestSuite();
18
19
class TestWindow extends BaseWindow {
20
21
constructor(window: CodeWindow, dom: { getWindowsCount: () => number; getWindows: () => Iterable<IRegisteredCodeWindow> }) {
22
super(window, dom, new TestHostService(), TestEnvironmentService, new TestContextMenuService(), new TestLayoutService());
23
}
24
25
protected override enableWindowFocusOnElementFocus(): void { }
26
}
27
28
test('multi window aware setTimeout()', async function () {
29
return runWithFakedTimers({ useFakeTimers: true }, async () => {
30
const disposables = new DisposableStore();
31
32
let windows: IRegisteredCodeWindow[] = [];
33
const dom = {
34
getWindowsCount: () => windows.length,
35
getWindows: () => windows
36
};
37
38
const setTimeoutCalls: number[] = [];
39
const clearTimeoutCalls: number[] = [];
40
41
function createWindow(id: number, slow?: boolean) {
42
// eslint-disable-next-line local/code-no-any-casts
43
const res = {
44
setTimeout: function (callback: Function, delay: number, ...args: any[]): number {
45
setTimeoutCalls.push(id);
46
47
return mainWindow.setTimeout(() => callback(id), slow ? delay * 2 : delay, ...args);
48
},
49
clearTimeout: function (timeoutId: number): void {
50
clearTimeoutCalls.push(id);
51
52
return mainWindow.clearTimeout(timeoutId);
53
}
54
} as any;
55
56
disposables.add(new TestWindow(res, dom));
57
58
return res;
59
}
60
61
const window1 = createWindow(1);
62
windows = [{ window: window1, disposables }];
63
64
// Window Count: 1
65
66
let called = false;
67
await new Promise<void>((resolve, reject) => {
68
window1.setTimeout(() => {
69
if (!called) {
70
called = true;
71
resolve();
72
} else {
73
reject(new Error('timeout called twice'));
74
}
75
}, 1);
76
});
77
78
assert.strictEqual(called, true);
79
assert.deepStrictEqual(setTimeoutCalls, [1]);
80
assert.deepStrictEqual(clearTimeoutCalls, []);
81
called = false;
82
setTimeoutCalls.length = 0;
83
clearTimeoutCalls.length = 0;
84
85
await new Promise<void>((resolve, reject) => {
86
window1.setTimeout(() => {
87
if (!called) {
88
called = true;
89
resolve();
90
} else {
91
reject(new Error('timeout called twice'));
92
}
93
}, 0);
94
});
95
96
assert.strictEqual(called, true);
97
assert.deepStrictEqual(setTimeoutCalls, [1]);
98
assert.deepStrictEqual(clearTimeoutCalls, []);
99
called = false;
100
setTimeoutCalls.length = 0;
101
clearTimeoutCalls.length = 0;
102
103
// Window Count: 3
104
105
let window2 = createWindow(2);
106
const window3 = createWindow(3);
107
windows = [
108
{ window: window2, disposables },
109
{ window: window1, disposables },
110
{ window: window3, disposables }
111
];
112
113
await new Promise<void>((resolve, reject) => {
114
window1.setTimeout(() => {
115
if (!called) {
116
called = true;
117
resolve();
118
} else {
119
reject(new Error('timeout called twice'));
120
}
121
}, 1);
122
});
123
124
assert.strictEqual(called, true);
125
assert.deepStrictEqual(setTimeoutCalls, [2, 1, 3]);
126
assert.deepStrictEqual(clearTimeoutCalls, [2, 1, 3]);
127
called = false;
128
setTimeoutCalls.length = 0;
129
clearTimeoutCalls.length = 0;
130
131
// Window Count: 2 (1 fast, 1 slow)
132
133
window2 = createWindow(2, true);
134
windows = [
135
{ window: window2, disposables },
136
{ window: window1, disposables },
137
];
138
139
await new Promise<void>((resolve, reject) => {
140
window1.setTimeout((windowId: number) => {
141
if (!called && windowId === 1) {
142
called = true;
143
resolve();
144
} else if (called) {
145
reject(new Error('timeout called twice'));
146
} else {
147
reject(new Error('timeout called for wrong window'));
148
}
149
}, 1);
150
});
151
152
assert.strictEqual(called, true);
153
assert.deepStrictEqual(setTimeoutCalls, [2, 1]);
154
assert.deepStrictEqual(clearTimeoutCalls, [2, 1]);
155
called = false;
156
setTimeoutCalls.length = 0;
157
clearTimeoutCalls.length = 0;
158
159
disposables.dispose();
160
});
161
});
162
});
163
164