Adapter votre extension pour Googlebook OS

Googlebook OS est un système d'exploitation pour les appareils Googlebook, basé sur la pile technologique Android et associé aux bases de bureau de ChromeOS. Google Livres est compatible avec la même plate-forme WebExtensions que Windows, macOS et ChromeOS, mais il existe quelques différences dans la façon dont elles s'exécutent.

  • La détection de la plate-forme est rarement nécessaire, mais les vérifications existantes peuvent échouer, car les API d'extension signalent android alors que l'agent utilisateur signale ChromeOS.
  • La messagerie native n'est pas encore disponible, mais nous y travaillons. Il devrait router les messages vers une application Android installée plutôt que vers un exécutable de bureau.
  • Les raccourcis clavier utilisent des combinaisons de touches Linux plutôt que des entrées chromeos.
  • SharedArrayBuffer nécessite l'activation de l'isolation multi-origine et doit s'exécuter dans une page d'extension ou un document hors écran plutôt que dans un service worker.
  • Les API ChromeOS uniquement ne sont pas compatibles avec Googlebook OS, même si l'agent utilisateur indique Chrome OS. Les extensions qui déclarent ces autorisations s'installent toujours, mais les espaces de noms d'API sont undefined au moment de l'exécution.
  • browser.system.storage n'est pas compatible avec Googlebook OS. L'espace de noms de l'API est donc undefined lors de l'exécution.

Détection de la plate-forme

La plupart des extensions n'ont pas besoin de détecter Googlebook OS. Suivez les bonnes pratiques standards de développement Web, comme la détection de fonctionnalités et la conception responsive, plutôt que de vérifier l'OS sur lequel le navigateur s'exécute.

Si votre extension vérifie déjà le système d'exploitation, les API d'extension et l'agent utilisateur renvoient différentes plates-formes sur Googlebook OS.

  • chrome.runtime.getPlatformInfo().os renvoie 'android'. Si votre extension partage du code avec les navigateurs mobiles et suppose que 'android' signifie un téléphone, les utilisateurs de Googlebook verront votre UI mobile sur un ordinateur portable.
  • navigator.userAgent contient CrOS. Pour la mise en page générale, il est préférable d'utiliser un Chromebook. Toutefois, navigator.userAgentData.platform renvoie 'Android'. Si votre extension vérifie l'user-agent pour afficher des conseils sur les raccourcis clavier ChromeOS (comme la touche Search) ou pour appeler des API ChromeOS uniquement, ces vérifications ne fonctionneront pas sur un Googlebook.

Le tableau suivant compare ces signaux sur les différentes plates-formes.

Signal Googlebook OS Téléphone Android Chromebook Windows, macOS, Linux
runtime.getPlatformInfo().os android android cros mac, win, linux
navigator.userAgentData.platform Android Android Chrome OS Windows, macOS, Linux
navigator.userAgentData.mobile false true false false

En revanche, navigator.userAgent renvoie une chaîne user-agent réduite identique sur Googlebook OS et ChromeOS, car les deux plates-formes signalent le jeton de plate-forme figé X11; CrOS x86_64 14541.0.0.

// 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

Comme pour tout développement Web, la détection de plate-forme peut être peu fiable. Par conséquent, ne l'utilisez que lorsque vous ne pouvez pas utiliser la détection de fonctionnalité pour tester directement ce dont vous avez besoin. Si vous devez distinguer Googlebook OS d'un téléphone Android et d'un Chromebook, vous pouvez le faire en combinant runtime.getPlatformInfo() avec l'indication mobile de 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
  };
}

Bien que cette combinaison particulière de comparaisons de chaînes pointe de manière unique vers les appareils Googlebook OS au moment du lancement du produit, cela ne sera pas toujours le cas. Au fil du temps, de plus en plus d'appareils seront expédiés dans différents formats. Il est possible que certains appareils Googlebook OS ne correspondent pas à cette détection.

Pour détecter Google Livres à partir de pages Web ou sur le serveur à l'aide d'indices client, consultez Identifier Google Livres.

Messagerie native

La messagerie native n'est pas encore disponible sur Googlebook OS, mais nous y travaillons. Il devrait comporter des extensions communiquant avec les applications Android installées plutôt qu'avec des exécutables de bureau locaux. Pour le moment, les extensions qui déclarent l'autorisation nativeMessaging s'installent et s'exécutent toujours sur Googlebook OS, mais les tentatives de connexion échouent. Assurez-vous que votre extension gère les échecs de connexion de manière fluide et qu'elle revient à un workflow Web lorsque l'hôte natif n'est pas disponible. Pour en savoir plus, consultez le problème 555299632.

Raccourcis clavier

Les raccourcis commands suivent les mêmes règles que Chrome sur Linux. Chrome lit l'entrée linux de suggested_key sur Googlebook OS. Les raccourcis définis sous chromeos ne s'appliquent donc pas. Les combinaisons de touches Search ne fonctionnent pas non plus, car il n'y a pas de touche "Rechercher" sur les appareils Googlebook OS.

SharedArrayBuffer

Sous Windows, macOS, Linux et ChromeOS, les extensions peuvent utiliser SharedArrayBuffer automatiquement dans n'importe quel contexte. Sur Googlebook OS, les extensions doivent activer explicitement l'isolation multi-origine dans manifest.json pour utiliser SharedArrayBuffer.

L'activation de l'isolation multi-origine permet d'utiliser SharedArrayBuffer dans les documents d'extension tels que les pop-ups, les pages d'options et les documents hors écran. Toutefois, il n'active pas SharedArrayBuffer dans les service workers d'extension, car Chrome ne prend pas encore en charge l'isolation multi-origine pour les service workers (problème 40150182). Si votre logique d'arrière-plan repose sur SharedArrayBuffer (par exemple, pour exécuter WebAssembly multithread), exécutez ce code dans un document hors écran plutôt que dans votre service worker.

API ChromeOS uniquement

Les API marquées ChromeOS uniquement dans la documentation de référence de l'API Chrome Extensions (comme documentScan, fileSystemProvider, vpnProvider et printing) ne sont pas compatibles avec Googlebook OS, même si navigator.userAgent inclut CrOS. Les extensions qui déclarent ces autorisations s'installent et s'exécutent toujours, mais les espaces de noms d'API sont undefined au moment de l'exécution. Vérifiez qu'un espace de noms d'API existe avant de l'appeler, plutôt que de vous fier à la détection de l'agent utilisateur.

browser.system.storage

L'API browser.system.storage n'est pas compatible avec Googlebook OS. Les extensions qui déclarent l'autorisation system.storage dans manifest.json s'installent et s'exécutent toujours, mais l'espace de noms est undefined au moment de l'exécution. Vérifiez si l'API est définie avant d'appeler getInfo(), ejectDevice() ou d'enregistrer des écouteurs de stockage.