Adapta tu extensión para el SO de Googlebook

El SO de Googlebook es un sistema operativo para dispositivos Googlebook, creado con la pila tecnológica de Android y combinado con los fundamentos de escritorio de ChromeOS. Las Googlebooks admiten la misma plataforma de WebExtensions que existe en Windows, macOS y ChromeOS, pero hay algunas diferencias en la forma en que se ejecutan allí.

  • La detección de la plataforma rara vez es necesaria, pero las verificaciones existentes pueden fallar porque las APIs de extensión informan android mientras que el agente de usuario informa ChromeOS.
  • La mensajería nativa aún no está disponible, pero se está trabajando en ella. Se espera que enrute los mensajes a una app para Android instalada en lugar de a un ejecutable de escritorio.
  • Las combinaciones de teclas usan vinculaciones de teclas de Linux en lugar de entradas de chromeos.
  • SharedArrayBuffer requiere habilitar el aislamiento de origen cruzado y debe ejecutarse en una página de extensión o en un documento fuera de pantalla, en lugar de en un service worker.
  • Las APIs exclusivas de ChromeOS no son compatibles con el SO de Googlebook, aunque el agente de usuario informe Chrome OS. Las extensiones que declaran estos permisos aún se instalan, pero los espacios de nombres de la API son undefined en el tiempo de ejecución.
  • browser.system.storage no se admite en el SO de Googlebook, por lo que el espacio de nombres de la API es undefined en el tiempo de ejecución.

Detección de plataformas

La mayoría de las extensiones no necesitan detectar Googlebook OS. Sigue las prácticas recomendadas estándar de desarrollo web, como la detección de funciones y el diseño adaptable, en lugar de verificar en qué sistema operativo se ejecuta el navegador.

Si tu extensión ya verifica el sistema operativo, las APIs de extensiones y el agente de usuario devuelven diferentes plataformas en el SO de Googlebook.

  • chrome.runtime.getPlatformInfo().os muestra 'android'. Si tu extensión comparte código con navegadores para dispositivos móviles y supone que 'android' significa un teléfono, los usuarios de Googlebook verán tu IU para dispositivos móviles en una laptop.
  • navigator.userAgent contiene CrOS. Para el diseño general de la página, un Chromebook es una buena opción. Sin embargo, navigator.userAgentData.platform devuelve 'Android', y si tu extensión verifica el agente de usuario para mostrar sugerencias de combinaciones de teclas de ChromeOS (como la tecla Search) o para llamar a APIs exclusivas de ChromeOS, esas verificaciones se activarán de forma incorrecta en un Googlebook.

En la siguiente tabla, se comparan estos indicadores en las diferentes plataformas.

Indicador SO de Googlebook Teléfono Android Chromebook Windows, macOS y 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 cambio, navigator.userAgent devuelve una cadena de usuario-agente reducida idéntica en el SO de Googlebook y en ChromeOS, ya que ambas plataformas informan el token de plataforma X11; CrOS x86_64 14541.0.0 inmovilizado.

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

Al igual que con todo el desarrollo web, la detección de plataformas puede no ser confiable, por lo que solo debes usarla cuando no puedas usar la detección de funciones para probar directamente lo que necesitas. Si necesitas distinguir Googlebook OS de un teléfono Android y una Chromebook, puedes hacerlo combinando runtime.getPlatformInfo() con la sugerencia 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
  };
}

Si bien esta combinación particular de comparaciones de cadenas apunta de forma única a los dispositivos con SO de Googlebook en el momento del lanzamiento del producto, es posible que no siempre sea así. A medida que se envíen más dispositivos con el tiempo, en una multitud de factores de forma, es posible que llegue un momento en que algunos dispositivos con Googlebook OS no coincidan con esa detección.

Para detectar Googlebooks en páginas web o en el servidor con sugerencias del cliente, consulta Cómo identificar Googlebooks.

Mensajería nativa

La mensajería nativa aún no está disponible en Googlebook OS, pero se está trabajando en ella. Se espera que tenga extensiones que se comuniquen con apps para Android instaladas en lugar de ejecutables locales para computadoras. Por el momento, las extensiones que declaran el permiso nativeMessaging se siguen instalando y ejecutando en el SO de Googlebook, pero los intentos de conexión fallan. Asegúrate de que tu extensión controle los errores de conexión de forma correcta y vuelva a un flujo de trabajo basado en la Web cuando el host nativo no esté disponible. Sigue el error 555299632 para obtener actualizaciones.

Combinaciones de teclas

Las combinaciones de teclas de commands siguen las mismas reglas que Chrome en Linux. Chrome lee la entrada linux de suggested_key en Googlebook OS, por lo que no se aplican los atajos definidos en chromeos. Las combinaciones de teclas Search tampoco funcionan, ya que no hay una tecla "Buscar" en los dispositivos con SO de Googlebook.

SharedArrayBuffer

En Windows, macOS, Linux y ChromeOS, las extensiones pueden usar SharedArrayBuffer automáticamente en cualquier contexto. En Googlebook OS, las extensiones deben habilitar explícitamente el aislamiento de origen cruzado en manifest.json para usar SharedArrayBuffer.

Habilitar el aislamiento de origen cruzado permite SharedArrayBuffer en documentos de extensión, como ventanas emergentes, páginas de opciones y documentos fuera de pantalla. Sin embargo, no habilita SharedArrayBuffer en los service workers de extensiones, ya que Chrome aún no admite el aislamiento de origen cruzado para los service workers (problema 40150182). Si tu lógica en segundo plano depende de SharedArrayBuffer (por ejemplo, para ejecutar WebAssembly con subprocesos), ejecuta ese código en un documento fuera de pantalla en lugar de en tu service worker.

APIs exclusivas de ChromeOS

Las APIs marcadas como solo para ChromeOS en la referencia de la API de extensiones de Chrome (como documentScan, fileSystemProvider, vpnProvider y printing) no son compatibles con el SO de Googlebook, aunque navigator.userAgent incluye CrOS. Las extensiones que declaran estos permisos se siguen instalando y ejecutando, pero los espacios de nombres de la API son undefined en el tiempo de ejecución. Verifica que exista un espacio de nombres de la API antes de llamarlo, en lugar de depender de la detección del agente de usuario.

browser.system.storage

La API de browser.system.storage no es compatible con el SO de Googlebook. Las extensiones que declaran el permiso system.storage en manifest.json se siguen instalando y ejecutando, pero el espacio de nombres es undefined en el tiempo de ejecución. Verifica si la API está definida antes de llamar a getInfo(), ejectDevice() o registrar los observadores de almacenamiento.