Skip to content

Commit 5c0e664

Browse files
ensure show() hide() show() hide() emits two didHide events. Fixes microsoft#135747
1 parent c0d3263 commit 5c0e664

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

extensions/vscode-api-tests/src/singlefolder-tests/quickInput.test.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as assert from 'assert';
7-
import { commands, window } from 'vscode';
7+
import { commands, Disposable, QuickPick, QuickPickItem, window } from 'vscode';
88
import { assertNoRpc, closeAllEditors } from '../utils';
99

1010
interface QuickPickExpected {
@@ -204,6 +204,50 @@ suite('vscode API - quick input', function () {
204204
quickPick.hide();
205205
quickPick.dispose();
206206
});
207+
208+
test('createQuickPick, hide and hide', function (_done) {
209+
let done = (err?: any) => {
210+
done = () => { };
211+
_done(err);
212+
};
213+
214+
let hidden = false;
215+
const quickPick = window.createQuickPick();
216+
quickPick.onDidHide(() => {
217+
if (hidden) {
218+
done(new Error('Already hidden'));
219+
} else {
220+
hidden = true;
221+
setTimeout(done, 0);
222+
}
223+
});
224+
quickPick.show();
225+
quickPick.hide();
226+
quickPick.hide();
227+
});
228+
229+
test('createQuickPick, hide show hide', async function () {
230+
async function waitForHide(quickPick: QuickPick<QuickPickItem>) {
231+
let disposable: Disposable | undefined;
232+
try {
233+
await Promise.race([
234+
new Promise(resolve => disposable = quickPick.onDidHide(() => resolve(true))),
235+
new Promise((_, reject) => setTimeout(() => reject(), 4000))
236+
]);
237+
} finally {
238+
disposable?.dispose();
239+
}
240+
}
241+
242+
const quickPick = window.createQuickPick();
243+
quickPick.show();
244+
const promise = waitForHide(quickPick);
245+
quickPick.hide();
246+
quickPick.show();
247+
await promise;
248+
quickPick.hide();
249+
await waitForHide(quickPick);
250+
});
207251
});
208252

209253
function createQuickPick(expected: QuickPickExpected, done: (err?: any) => void, record = false) {

src/vs/workbench/api/common/extHostQuickOpen.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,15 @@ export function createExtHostQuickOpen(mainContext: IMainContext, workspace: IEx
420420

421421
_fireDidHide() {
422422
if (this._expectingHide) {
423-
this._expectingHide = false;
423+
// if this._visible is true, it means that .show() was called between
424+
// .hide() and .onDidHide. To ensure the correct number of onDidHide events
425+
// are emitted, we set this._expectingOnDidHide to this value so that
426+
// the next time .hide() is called, we can emit the event again.
427+
// Example:
428+
// .show() -> .hide() -> .show() -> .hide() should emit 2 onDidHide events.
429+
// .show() -> .hide() -> .hide() should emit 1 onDidHide event.
430+
// Fixes #135747
431+
this._expectingHide = this._visible;
424432
this._onDidHideEmitter.fire();
425433
}
426434
}

0 commit comments

Comments
 (0)