Je extensie aanpassen voor Googlebook OS

Googlebook OS is een besturingssysteem voor Googlebook-apparaten, gebaseerd op de Android-technologiestack en gekoppeld aan desktopfuncties van ChromeOS. Google Boeken ondersteunt hetzelfde WebExtensions-platform als op Windows, macOS en ChromeOS, maar er zijn enkele verschillen in de manier waarop ze daar worden uitgevoerd.

  • Platformdetectie is zelden nodig, maar bestaande controles kunnen onterecht worden geactiveerd omdat extensie-API's android rapporteren terwijl de user-agent ChromeOS rapporteert.
  • Native berichten zijn nog niet beschikbaar, maar we werken eraan. Verwacht dat het berichten naar een geïnstalleerde Android-app routeert in plaats van naar een uitvoerbaar desktopbestand.
  • Sneltoetsen gebruiken Linux-toetsbindingen in plaats van chromeos-items.
  • SharedArrayBuffer vereist dat je je aanmeldt voor cross-origin-isolatie en moet worden uitgevoerd op een extensiepagina of in een document buiten het scherm in plaats van in een service worker.
  • API's die alleen voor ChromeOS zijn, worden niet ondersteund op Googlebook OS, ook al rapporteert de user-agent Chrome OS. Extensies die deze rechten declareren, worden nog steeds geïnstalleerd, maar de API-naamruimten zijn undefined tijdens runtime.
  • browser.system.storage wordt niet ondersteund op Googlebook OS, dus de API-naamruimte is undefined tijdens runtime.

Platformdetectie

De meeste extensies hoeven Googlebook OS niet te detecteren. Volg de best practices voor webontwikkeling, zoals functiedetectie en responsief ontwerp, in plaats van te checken op welk besturingssysteem de browser wordt uitgevoerd.

Als je extensie het besturingssysteem al checkt, retourneren extensie-API's en de user-agent verschillende platforms op Googlebook OS.

  • chrome.runtime.getPlatformInfo().osretourneert'android'. Als je extensie code deelt met mobiele browsers en ervan uitgaat dat 'android' een telefoon betekent, krijgen Googlebook-gebruikers je mobiele UI op een laptop.
  • navigator.userAgent bevat CrOS. Voor de algemene pagina-indeling werkt een Chromebook goed. navigator.userAgentData.platform retourneert 'Android' en als je extensie de user-agent checkt om hints voor ChromeOS-sneltoetsen te tonen (zoals de toets Search) of om API's aan te roepen die alleen voor ChromeOS zijn, mislukken die checks op een Googlebook.

In de volgende tabel worden deze signalen op verschillende platforms vergeleken.

Signaal Googlebook OS Android-telefoon 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

navigator.userAgent retourneert daarentegen een identieke beperkte user-agenttekenreeks op zowel Googlebook OS als ChromeOS, omdat beide platforms de bevroren X11; CrOS x86_64 14541.0.0-platformtoken rapporteren.

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

Net als bij alle webontwikkeling kan platformdetectie onbetrouwbaar zijn. Gebruik deze functie dus alleen als je geen functiedetectie kunt gebruiken om rechtstreeks te testen wat je nodig hebt. Als je Googlebook OS moet onderscheiden van zowel een Android-telefoon als een Chromebook, kan dat door runtime.getPlatformInfo() te combineren met de hint mobile van 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
  };
}

Hoewel deze specifieke combinatie van tekenreeksvergelijkingen op het moment van de productlancering uniek verwijst naar Googlebook OS-apparaten, is dat misschien niet altijd het geval. Naarmate er in de loop van de tijd meer apparaten in verschillende vormfactoren worden verstuurd, kan het gebeuren dat sommige Googlebook OS-apparaten niet overeenkomen met die detectie.

Ga naar Googlebooks identificeren voor meer informatie over hoe je Googlebooks op webpagina's of op de server detecteert met clienthints.

Systeemeigen berichten

Systeemeigen berichten zijn nog niet beschikbaar in Googlebook OS, maar we werken eraan. Verwacht dat de browser extensies heeft die communiceren met geïnstalleerde Android-apps in plaats van lokale desktop-uitvoerbare bestanden. Op dit moment worden extensies die het recht nativeMessaging declareren nog steeds geïnstalleerd en uitgevoerd op Googlebook OS, maar mislukken verbindingspogingen. Zorg dat je extensie verbindingsfouten goed afhandelt en terugvalt op een webgebaseerde workflow als de systeemeigen host niet beschikbaar is. Volg probleem 555299632 voor updates.

Sneltoetsen

commands-sneltoetsen volgen dezelfde regels als Chrome op Linux. Chrome leest de linux-vermelding van suggested_key in Googlebook OS, dus sneltoetsen die zijn gedefinieerd onder chromeos, zijn niet van toepassing. Search toetscombinaties werken ook niet, omdat er geen zoektoets is op Googlebook OS-apparaten.

SharedArrayBuffer

Op Windows, macOS, Linux en ChromeOS kunnen extensies SharedArrayBufferautomatisch gebruiken in elke context. In Googlebook OS moeten extensies expliciet toestemming geven voor cross-origin-isolatie in manifest.json om SharedArrayBuffer te kunnen gebruiken.

Als je je aanmeldt voor cross-origin-isolatie, wordt SharedArrayBuffer aangezet in extensiedocumenten, zoals pop-ups, optiepagina's en documenten buiten het scherm. Maar het zet SharedArrayBuffer niet aan in service workers voor extensies, omdat Chrome nog geen isolatie tussen oorsprongen ondersteunt voor service workers (issue 40150182). Als je achtergrondlogica afhankelijk is van SharedArrayBuffer (bijvoorbeeld om WebAssembly met threads uit te voeren), voer je die code uit in een document buiten het scherm in plaats van in je service worker.

API's die alleen voor ChromeOS zijn

API's die in de API-referentie voor Chrome-extensies zijn gemarkeerd als Alleen ChromeOS (zoals documentScan, fileSystemProvider, vpnProvider en printing), worden niet ondersteund in Googlebook OS, ook al bevat navigator.userAgent CrOS. Extensies die deze rechten definiëren, worden nog steeds geïnstalleerd en uitgevoerd, maar de API-naamruimten worden undefined tijdens runtime. Controleer of er een API-naamruimte bestaat voordat je deze aanroept in plaats van te vertrouwen op detectie van de user-agent.

browser.system.storage

De browser.system.storage-API wordt niet ondersteund op Googlebook OS. Extensies die het recht system.storage in manifest.json declareren, worden nog steeds geïnstalleerd en uitgevoerd, maar de naamruimte is undefined tijdens runtime. Check of de API is gedefinieerd voordat je getInfo() of ejectDevice() aanroept of opslaglisteners registreert.