Adattare l'estensione per Googlebook OS

Googlebook OS è un sistema operativo per i dispositivi Googlebook, basato sullo stack tecnologico di Android e abbinato alle basi del desktop di ChromeOS. Googlebooks supporta la stessa piattaforma WebExtensions disponibile su Windows, macOS e ChromeOS, ma il funzionamento è leggermente diverso.

  • Il rilevamento della piattaforma è raramente necessario, ma i controlli esistenti possono non funzionare correttamente perché le API delle estensioni segnalano android mentre lo user agent segnala ChromeOS.
  • La messaggistica nativa non è ancora disponibile, ma è in fase di sviluppo. Prevedi che i messaggi vengano indirizzati a un'app per Android installata anziché a un eseguibile desktop.
  • Le scorciatoie da tastiera utilizzano le combinazioni di tasti di Linux anziché le voci chromeos.
  • SharedArrayBuffer richiede l'attivazione dell'isolamento multiorigine e deve essere eseguito in una pagina di estensione o in un documento offscreen anziché in un service worker.
  • Le API solo per ChromeOS non sono supportate su Googlebook OS, anche se lo user agent segnala Chrome OS. Le estensioni che dichiarano queste autorizzazioni vengono comunque installate, ma gli spazi dei nomi API sono undefined in fase di runtime.
  • browser.system.storage non è supportato su Googlebook OS, quindi lo spazio dei nomi API è undefined in fase di runtime.

Rilevamento della piattaforma

La maggior parte delle estensioni non ha bisogno di rilevare Googlebook OS. Segui le best practice standard per lo sviluppo web, come il rilevamento delle funzionalità e il design responsivo, anziché controllare il sistema operativo su cui viene eseguito il browser.

Se la tua estensione controlla già il sistema operativo, le API delle estensioni e l'agente utente restituiscono piattaforme diverse su Googlebook OS.

  • chrome.runtime.getPlatformInfo().os restituisce 'android'. Se la tua estensione condivide il codice con i browser mobile e presuppone che 'android' indichi un telefono, gli utenti di Googlebook visualizzeranno la tua UI mobile su un laptop.
  • navigator.userAgent contiene CrOS. Per il layout generale della pagina, è consigliabile utilizzare un Chromebook. Tuttavia, navigator.userAgentData.platform restituisce 'Android' e se la tua estensione controlla lo user agent per mostrare i suggerimenti per le scorciatoie da tastiera di ChromeOS (come il tasto Search) o per chiamare API solo di ChromeOS, questi controlli non funzioneranno su un Googlebook.

La tabella seguente confronta questi indicatori tra le piattaforme.

Indicatore Googlebook OS Smartphone Android Chromebook Windows, macOS, Linux
runtime.getPlatformInfo().os android android cros mac, win e linux
navigator.userAgentData.platform Android Android Chrome OS Windows, macOS e Linux
navigator.userAgentData.mobile false true false false

Al contrario, navigator.userAgent restituisce una stringa user-agent ridotta identica sia su Googlebook OS sia su ChromeOS, perché entrambe le piattaforme segnalano il token della piattaforma X11; CrOS x86_64 14541.0.0 bloccato.

// Googlebook OS
Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36
// ChromeOS
Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36

Come per tutto lo sviluppo web, il rilevamento della piattaforma può essere inaffidabile, quindi utilizzalo solo quando non puoi utilizzare il rilevamento delle funzionalità per testare direttamente ciò di cui hai bisogno. Se devi distinguere Googlebook OS da uno smartphone Android e da Chromebook, puoi farlo combinando runtime.getPlatformInfo() con il suggerimento mobile di User-Agent Client Hints.

async function getPlatform() {
  const { os, arch } = await chrome.runtime.getPlatformInfo();
  // userAgentData is undefined in browsers that don't implement User-Agent
  // Client Hints, so read mobile defensively.
  const mobile = navigator.userAgentData?.mobile;
  return {
    os,
    arch,
    isGooglebook: os === 'android' && mobile === false,
    isPhone: os === 'android' && mobile !== false
  };
}

Sebbene questa particolare combinazione di confronti di stringhe punti in modo univoco ai dispositivi Googlebook OS al momento del lancio del prodotto, potrebbe non essere sempre così. Con l'aumentare del numero di dispositivi spediti nel tempo, in una moltitudine di fattori di forma, potrebbe arrivare un momento in cui alcuni dispositivi Googlebook OS non corrispondono a questo rilevamento.

Per rilevare Googlebooks dalle pagine web o sul server utilizzando i suggerimenti client, consulta Identificare Googlebooks.

Messaggistica nativa

La messaggistica nativa non è ancora disponibile su Googlebook OS, ma ci stiamo lavorando. Prevedi che abbia estensioni che comunicano con le app Android installate anziché con gli eseguibili locali del desktop. Per il momento, le estensioni che dichiarano l'autorizzazione nativeMessaging vengono comunque installate ed eseguite su Googlebook OS, ma i tentativi di connessione non vanno a buon fine. Assicurati che l'estensione gestisca correttamente gli errori di connessione e che torni a un flusso di lavoro basato sul web quando l'host nativo non è disponibile. Segui il problema 555299632 per ricevere aggiornamenti.

Scorciatoie da tastiera

Le scorciatoie commands seguono le stesse regole di Chrome su Linux. Chrome legge la voce linux di suggested_key su Googlebook OS, quindi le scorciatoie definite in chromeos non sono applicabili. Anche le combinazioni di tasti Search non funzionano, in quanto non è presente un tasto "Cerca" sui dispositivi con Googlebook OS.

SharedArrayBuffer

Su Windows, macOS, Linux e ChromeOS, le estensioni possono utilizzare SharedArrayBuffer automaticamente in qualsiasi contesto. Su Googlebook OS, le estensioni devono attivare esplicitamente l'isolamento multiorigine in manifest.json per utilizzare SharedArrayBuffer.

L'attivazione dell'isolamento multiorigine abilita SharedArrayBuffer nei documenti delle estensioni, come popup, pagine delle opzioni e documenti offscreen. Tuttavia, non attiva SharedArrayBuffer nei service worker delle estensioni, perché Chrome non supporta ancora l'isolamento cross-origin per i service worker (problema 40150182). Se la logica in background si basa su SharedArrayBuffer (ad esempio, per eseguire WebAssembly multithread), esegui il codice in un documento offscreen anziché nel service worker.

API solo per ChromeOS

Le API contrassegnate come Solo ChromeOS nel riferimento API delle estensioni di Chrome (ad esempio documentScan, fileSystemProvider, vpnProvider e printing) non sono supportate su Googlebook OS, anche se navigator.userAgent include CrOS. Le estensioni che dichiarano queste autorizzazioni vengono comunque installate ed eseguite, ma gli spazi dei nomi API sono undefined in fase di runtime. Verifica che esista uno spazio dei nomi API prima di chiamarlo, anziché fare affidamento al rilevamento dello user agent.

browser.system.storage

L'API browser.system.storage non è supportata su Googlebook OS. Le estensioni che dichiarano l'autorizzazione system.storage in manifest.json vengono comunque installate ed eseguite, ma lo spazio dei nomi è undefined in fase di runtime. Controlla se l'API è definita prima di chiamare getInfo(), ejectDevice() o registrare i listener di archiviazione.