Usa WebUSB

L'API WebUSB espone al web dispositivi compatibili con Universal Serial Bus (USB) non standard. In questa pagina vengono descritti gli aspetti dell'API specifici delle estensioni. Per informazioni dettagliate sull'API WebUSB, consulta la pagina MDN.

Disponibilità nelle estensioni

Chrome 118 o versioni successive.

Autorizzazioni

Non sono richieste autorizzazioni per il file manifest; tuttavia, WebUSB attiva il flusso di autorizzazioni utente del browser.

Manifest

Non sono necessarie chiavi manifest per questa API.

Contesti di supporto

Questa API può essere utilizzata in quasi tutti i contesti. Il metodo WebUSB.requestDevice() non può essere utilizzato nei service worker dell'estensione. Consulta la sezione seguente per ulteriori dettagli.

Quando questa API viene utilizzata in un service worker di estensione, la sessione di connessione dei dispositivi mantiene attivo il service worker.

Differenze nelle estensioni di Chrome

Sebbene WebUSB sia disponibile per i service worker dell'estensione, WebUSB.requestDevice(), che restituisce una promessa che si risolve con un'istanza USBDevice, non può essere chiamato in un service worker dell'estensione. Per risolvere il problema, chiama requestDevice() da una pagina dell'estensione diversa dal service worker dell'estensione e invia un messaggio al service worker dell'estensione.

Il codice seguente segue un pattern tipico chiamando requestDevice() nell'ambito di un flusso di autorizzazioni che richiede un gesto dell'utente. Quando il dispositivo viene acquisito, invia un messaggio al service worker, che può quindi recuperare il dispositivo utilizzando 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();
    }
  }
});