Skip to content

Commit 1bcf66b

Browse files
Dispatch afterrequestdevice in error cases too. (#63)
1 parent a22f619 commit 1bcf66b

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

lib/usb.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,23 @@ describe("MicrobitWebUSBConnection (WebUSB unsupported)", () => {
3030
const microbit = createWebUSBConnection();
3131
expect(microbit.status).toBe(ConnectionStatus.NOT_SUPPORTED);
3232
});
33+
it("still triggers afterrequestdevice if requestDevice throws", async () => {
34+
(global as any).navigator = {
35+
usb: {
36+
requestDevice: () => {
37+
throw new Error();
38+
},
39+
},
40+
};
41+
const microbit = createWebUSBConnection();
42+
expect(microbit.status).toBe(ConnectionStatus.NO_AUTHORIZED_DEVICE);
43+
const afterRequestDevice = vi.fn();
44+
microbit.addEventListener("afterrequestdevice", afterRequestDevice);
45+
46+
await expect(() => microbit.connect()).rejects.toThrow();
47+
48+
expect(afterRequestDevice.mock.calls.length).toEqual(1);
49+
});
3350
});
3451

3552
describeDeviceOnly("MicrobitWebUSBConnection (WebUSB supported)", () => {

lib/usb.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -550,11 +550,14 @@ class MicrobitWebUSBConnectionImpl
550550

551551
private async chooseDevice(): Promise<USBDevice> {
552552
this.dispatchTypedEvent("beforerequestdevice", new BeforeRequestDevice());
553-
this.device = await navigator.usb.requestDevice({
554-
exclusionFilters: this.exclusionFilters,
555-
filters: defaultFilters,
556-
});
557-
this.dispatchTypedEvent("afterrequestdevice", new AfterRequestDevice());
553+
try {
554+
this.device = await navigator.usb.requestDevice({
555+
exclusionFilters: this.exclusionFilters,
556+
filters: defaultFilters,
557+
});
558+
} finally {
559+
this.dispatchTypedEvent("afterrequestdevice", new AfterRequestDevice());
560+
}
558561
return this.device;
559562
}
560563

0 commit comments

Comments
 (0)