Adaptar sua extensão para o sistema operacional Googlebook

O Googlebook OS é um sistema operacional para dispositivos Googlebook, criado com base na pilha de tecnologia Android e combinado com os fundamentos de computador do ChromeOS. O Google Livros é compatível com a mesma plataforma WebExtensions que existe no Windows, macOS e ChromeOS, mas há algumas diferenças na forma como eles são executados nesses sistemas.

  • A detecção de plataforma raramente é necessária, mas as verificações atuais podem ser acionadas incorretamente porque as APIs de extensão informam android, enquanto o user agent informa ChromeOS.
  • A mensagens nativas ainda não está disponível, mas estamos trabalhando nisso. Ele vai encaminhar mensagens para um app Android instalado em vez de um executável de computador.
  • Os atalhos do teclado usam vinculações de teclas do Linux em vez de entradas chromeos.
  • O SharedArrayBuffer exige a ativação do isolamento entre origens e precisa ser executado em uma página de extensão ou um documento fora da tela, em vez de um service worker.
  • As APIs exclusivas do ChromeOS não são compatíveis com o Googlebook OS, mesmo que o user agent informe Chrome OS. As extensões que declaram essas permissões ainda são instaladas, mas os namespaces da API são undefined no tempo de execução.
  • browser.system.storage não é compatível com o Googlebook OS. Portanto, o namespace da API é undefined no tempo de execução.

Detecção de plataforma

A maioria das extensões não precisa detectar o Googlebook OS. Siga as práticas recomendadas padrão de desenvolvimento da Web, como detecção de recursos e design responsivo, em vez de verificar em qual sistema operacional o navegador está sendo executado.

Se a extensão já verificar o sistema operacional, as APIs de extensão e o user agent retornarem plataformas diferentes no Googlebook OS.

  • chrome.runtime.getPlatformInfo().os retorna 'android'. Se a extensão compartilhar código com navegadores para dispositivos móveis e presumir que 'android' significa um smartphone, os usuários do Google Livros vão receber a interface para dispositivos móveis em um laptop.
  • navigator.userAgent contém CrOS. Para layout de página geral, um Chromebook é uma boa opção. No entanto, navigator.userAgentData.platform retorna 'Android', e se a extensão verificar o user agent para mostrar dicas de atalho do teclado do ChromeOS (como a tecla Search) ou para chamar APIs somente do ChromeOS, essas verificações vão falhar em um Googlebook.

A tabela a seguir compara esses indicadores em diferentes plataformas.

Indicador Googlebook OS Smartphone 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

Por outro lado, navigator.userAgent retorna uma string de user agent reduzida idêntica no Googlebook OS e no ChromeOS, porque ambas as plataformas informam o token de plataforma X11; CrOS x86_64 14541.0.0 congelado.

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

Como em todo desenvolvimento da Web, a detecção de plataforma pode não ser confiável. Portanto, use-a apenas quando não for possível usar a detecção de recursos para testar diretamente o que você precisa. Se você precisar distinguir o Googlebook OS de um smartphone Android e de um Chromebook, combine runtime.getPlatformInfo() com a dica mobile de Dicas de cliente do User-Agent.

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
  };
}

Embora essa combinação específica de comparações de strings aponte exclusivamente para dispositivos Googlebook OS no momento do lançamento do produto, isso nem sempre será o caso. À medida que mais dispositivos forem enviados ao longo do tempo, em uma infinidade de formatos, pode chegar um momento em que alguns dispositivos Googlebook OS não correspondam a essa detecção.

Para detectar o Google Livros em páginas da Web ou no servidor usando dicas de cliente, consulte Identificar o Google Livros.

Mensagens nativas

As mensagens nativas ainda não estão disponíveis no Googlebook OS, mas estamos trabalhando nisso. As extensões se comunicam com apps Android instalados, e não com executáveis locais de computador. Por enquanto, as extensões que declaram a permissão nativeMessaging ainda são instaladas e executadas no Googlebook OS, mas as tentativas de conexão falham. Verifique se a extensão processa falhas de conexão de maneira adequada e volta a um fluxo de trabalho baseado na Web quando o host nativo não está disponível. Siga o problema 555299632 para receber atualizações.

Atalhos do teclado

Os atalhos do commands seguem as mesmas regras do Chrome no Linux. O Chrome lê a entrada linux de suggested_key no Googlebook OS. Portanto, os atalhos definidos em chromeos não se aplicam. As combinações de teclas Search também não funcionam, já que não há uma tecla "Pesquisar" nos dispositivos Googlebook OS.

SharedArrayBuffer

No Windows, macOS, Linux e ChromeOS, as extensões podem usar SharedArrayBuffer automaticamente em qualquer contexto. No Googlebook OS, as extensões precisam ativar explicitamente o isolamento de origem cruzada em manifest.json para usar SharedArrayBuffer.

Ao ativar o isolamento entre origens, o SharedArrayBuffer é ativado em documentos de extensão, como pop-ups, páginas de opções e documentos em segundo plano. No entanto, ela não ativa o SharedArrayBuffer em service workers de extensão, porque o Chrome ainda não oferece suporte ao isolamento entre origens para service workers (problema 40150182). Se a lógica em segundo plano depender de SharedArrayBuffer (por exemplo, para executar WebAssembly com linhas de execução), execute esse código em um documento fora da tela em vez do service worker.

APIs somente do ChromeOS

As APIs marcadas como Somente ChromeOS na referência da API Chrome Extensions (como documentScan, fileSystemProvider, vpnProvider e printing) não são compatíveis com o Googlebook OS, mesmo que navigator.userAgent inclua CrOS. As extensões que declaram essas permissões ainda são instaladas e executadas, mas os namespaces da API são undefined durante a execução. Verifique se um namespace de API existe antes de chamá-lo, em vez de depender da detecção do user agent.

browser.system.storage

A API browser.system.storage não é compatível com o Googlebook OS. As extensões que declaram a permissão system.storage em manifest.json ainda são instaladas e executadas, mas o namespace é undefined no tempo de execução. Verifique se a API está definida antes de chamar getInfo(), ejectDevice() ou registrar listeners de armazenamento.