Interfejs WebUSB API udostępnia w internecie niestandardowe urządzenia zgodne z uniwersalną magistralą szeregową (USB). Na tej stronie opisujemy aspekty interfejsu API, które są charakterystyczne dla rozszerzeń. Szczegółowe informacje o WebUSB API znajdziesz w dokumentacji MDN.
Dostępność w rozszerzeniach
Chrome w wersji 118 lub nowszej.
Uprawnienia
Nie są wymagane żadne uprawnienia pliku manifestu, ale WebUSB wywołuje proces uzyskiwania zgody użytkownika w przeglądarce.
Plik manifestu
Ten interfejs API nie wymaga kluczy manifestu.
Konteksty pomocnicze
Tego interfejsu API można używać w niemal każdym kontekście. Metody WebUSB.requestDevice() nie można używać w procesach roboczych usług rozszerzeń. Więcej informacji na ten temat można znaleźć w następnej sekcji.
Gdy ten interfejs API jest używany w skrypcie service worker rozszerzenia, sesja połączenia z urządzeniami utrzymuje skrypt service worker przy życiu.
Różnice między rozszerzeniami do Chrome
Chociaż interfejs WebUSB jest dostępny dla skryptów service worker rozszerzeń, funkcja WebUSB.requestDevice(), która zwraca obietnicę, która jest realizowana z instancją USBDevice, nie może być wywoływana w skrypcie service worker rozszerzenia. Aby to obejść, wywołaj requestDevice() ze strony rozszerzenia innej niż skrypt service worker rozszerzenia i wyślij wiadomość do skryptu service worker rozszerzenia.
Poniższy kod jest zgodny z typowym wzorcem, ponieważ wywołuje funkcję requestDevice() w ramach procesu uzyskiwania uprawnień, który wymaga gestu użytkownika. Gdy urządzenie zostanie przejęte, wysyła wiadomość do skryptu service worker, który może następnie pobrać urządzenie za pomocą funkcji getDevices().
popup.js:
myButton.addEventListener("click", async () => {
await navigator.usb.requestDevice({
filters: [{ vendorId: 0x1234, productId: 0x5678 }],
});
chrome.runtime.sendMessage("newDevice");
});
service-worker.js
chrome.runtime.onMessage.addListener(async (message) => {
if (message === "newDevice") {
const devices = await navigator.usb.getDevices();
for (const device of devices) {
// open device connection.
await device.open();
}
}
});