Usa WebUSB

L'API WebUSB espone al web i dispositivi compatibili con Universal Serial Bus (USB) non standard. Questa pagina descrive aspetti dell'API specifici delle estensioni. Per informazioni complete sull'API WebUSB, consulta MDN.

Disponibilità nelle estensioni

Chrome 118 o versioni successive.

Autorizzazioni

Non sono necessarie autorizzazioni per i file manifest. tuttavia WebUSB attiva il flusso di autorizzazioni utente del browser.

Manifest

Per questa API non sono necessarie chiavi manifest.

Contesti di supporto

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

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

Differenze tra le estensioni di Chrome

Sebbene WebUSB sia disponibile per i service worker di estensione, WebUSB.requestDevice(), che restituisce una promessa che si risolve con un'istanza USBDevice, non può essere chiamato in un service worker di 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 seguente codice segue un pattern tipico chiamando requestDevice() nell'ambito di un flusso di autorizzazioni che richiede un gesto dell'utente. Una volta acquisito il dispositivo, invia un messaggio al service worker, che può quindi recuperarlo 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();
    }
  }
});