Erweiterung für Googlebook OS anpassen

Googlebook OS ist ein Betriebssystem für Googlebook-Geräte, das auf dem Android-Technologie-Stack basiert und mit Desktop-Grundlagen von ChromeOS kombiniert wird. Googlebooks unterstützen dieselbe WebExtensions-Plattform wie Windows, macOS und ChromeOS, es gibt jedoch einige Unterschiede bei der Ausführung.

  • Plattformerfassung ist selten erforderlich, aber vorhandene Prüfungen können fehlschlagen, weil Erweiterungs-APIs android melden, während der User-Agent ChromeOS meldet.
  • Native Messaging ist noch nicht verfügbar, aber wir arbeiten daran. Es ist zu erwarten, dass Nachrichten an eine installierte Android-App und nicht an eine ausführbare Datei für den Desktop weitergeleitet werden.
  • Tastenkombinationen verwenden Linux-Tastenbelegungen anstelle von chromeos-Einträgen.
  • Für SharedArrayBuffer ist die Aktivierung der ursprungsübergreifenden Isolation erforderlich. Außerdem muss der Dienst auf einer Erweiterungsseite oder in einem Offscreen-Dokument und nicht in einem Service Worker ausgeführt werden.
  • ChromeOS-only APIs werden in Googlebook OS nicht unterstützt, obwohl der User-Agent Chrome OS meldet. Erweiterungen, die diese Berechtigungen deklarieren, werden weiterhin installiert, aber die API-Namespaces sind zur Laufzeit undefined.
  • browser.system.storage wird in ChromeOS nicht unterstützt, daher ist der API-Namespace zur Laufzeit undefined.

Plattformerfassung

Die meisten Erweiterungen müssen Googlebook OS nicht erkennen. Halten Sie sich an die Best Practices für die Webentwicklung, z. B. die Funktionserkennung und das responsive Design, anstatt zu prüfen, auf welchem Betriebssystem der Browser ausgeführt wird.

Wenn Ihre Erweiterung das Betriebssystem bereits prüft, geben Erweiterungs-APIs und der User-Agent unterschiedliche Plattformen für Googlebook OS zurück.

  • chrome.runtime.getPlatformInfo().os gibt 'android' zurück. Wenn Ihre Erweiterung Code mit mobilen Browsern teilt und davon ausgeht, dass 'android' ein Smartphone ist, wird Googlebook-Nutzern die mobile Benutzeroberfläche auf einem Laptop angezeigt.
  • navigator.userAgent enthält CrOS. Für das allgemeine Seitenlayout eignet sich ein Chromebook gut. navigator.userAgentData.platform gibt jedoch 'Android' zurück. Wenn Ihre Erweiterung den User-Agent prüft, um ChromeOS-Tastenkombinationen (z. B. die Search-Taste) anzuzeigen oder nur in ChromeOS verfügbare APIs aufzurufen, schlagen diese Prüfungen auf einem Googlebook fehl.

In der folgenden Tabelle werden diese Signale plattformübergreifend verglichen.

Signal Googlebook OS Android-Smartphone 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

Im Gegensatz dazu gibt navigator.userAgent sowohl unter Googlebook OS als auch unter ChromeOS einen identischen reduzierten User-Agent-String zurück, da auf beiden Plattformen das eingefrorene X11; CrOS x86_64 14541.0.0-Plattformtoken gemeldet wird.

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

Wie bei der gesamten Webentwicklung kann die Plattformerkennung unzuverlässig sein. Verwenden Sie sie daher nur, wenn Sie die benötigten Funktionen nicht direkt testen können. Wenn Sie Googlebook OS unterscheiden müssen, ist dies durch die Kombination von runtime.getPlatformInfo() mit dem mobile-Hinweis aus User-Agent Client Hints möglich.

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

Diese spezielle Kombination von Stringvergleichen verweist zwar zum Zeitpunkt der Produkteinführung eindeutig auf Googlebook OS-Geräte, das ist aber nicht immer der Fall. Da im Laufe der Zeit immer mehr Geräte in einer Vielzahl von Formfaktoren ausgeliefert werden, kann es vorkommen, dass einige Googlebook OS-Geräte nicht mit dieser Erkennung übereinstimmen.

Informationen dazu, wie Sie Googlebooks auf Webseiten oder auf dem Server mithilfe von Client-Hinweisen erkennen, finden Sie unter Googlebooks identifizieren.

Natives Messaging

Native Messaging ist noch nicht für Googlebook OS verfügbar, aber wir arbeiten daran. Es wird erwartet, dass Erweiterungen mit installierten Android-Apps und nicht mit lokalen Desktop-Ausführungsdateien kommunizieren. Derzeit werden Erweiterungen, die die Berechtigung nativeMessaging deklarieren, weiterhin auf Googlebook OS installiert und ausgeführt, aber Verbindungsversuche schlagen fehl. Achten Sie darauf, dass Ihre Erweiterung Verbindungsfehler ordnungsgemäß verarbeitet und auf einen webbasierten Workflow zurückgreift, wenn der native Host nicht verfügbar ist. Folgen Sie Problem 555299632, um über Updates auf dem Laufenden zu bleiben.

Tastenkombinationen

Für commands-Tastenkombinationen gelten dieselben Regeln wie für Chrome unter Linux. Chrome liest den linux-Eintrag von suggested_key unter Googlebook OS. Daher gelten Tastenkombinationen, die unter chromeos definiert sind, nicht. Auch Search-Tastenkombinationen funktionieren nicht, da es auf Googlebook OS-Geräten keine „Such“-Taste gibt.

SharedArrayBuffer

Unter Windows, macOS, Linux und ChromeOS können Erweiterungen SharedArrayBufferautomatisch in jedem Kontext verwenden. Unter Googlebook OS müssen Erweiterungen explizit die ursprungsübergreifende Isolierung aktivieren in manifest.json, um SharedArrayBuffer zu verwenden.

Wenn Sie die ursprungsübergreifende Isolierung aktivieren, wird SharedArrayBuffer in Erweiterungsdokumenten wie Pop-ups, Optionsseiten und Offscreen-Dokumenten aktiviert. SharedArrayBuffer wird jedoch nicht in Erweiterungs-Service-Workern aktiviert, da Chrome die ursprungsübergreifende Isolation für Service-Worker noch nicht unterstützt (Problem 40150182). Wenn Ihre Hintergrundlogik auf SharedArrayBuffer basiert (z. B. zum Ausführen von WebAssembly mit Threads), führen Sie diesen Code in einem Offscreen-Dokument anstelle Ihres Service Workers aus.

Nur für ChromeOS verfügbare APIs

APIs, die in der Chrome-Erweiterungs-API-Referenz mit Nur ChromeOS gekennzeichnet sind (z. B. documentScan, fileSystemProvider, vpnProvider und printing), werden in Googlebook OS nicht unterstützt, obwohl navigator.userAgent CrOS enthält. Erweiterungen, für die diese Berechtigungen deklariert werden, werden weiterhin installiert und ausgeführt, aber die API-Namespaces sind zur Laufzeit undefined. Prüfen Sie, ob ein API-Namespace vorhanden ist, bevor Sie ihn aufrufen, anstatt sich auf die Erkennung des User-Agents zu verlassen.

browser.system.storage

Die browser.system.storage API wird auf Googlebook OS nicht unterstützt. Erweiterungen, die die Berechtigung system.storage in manifest.json deklarieren, werden weiterhin installiert und ausgeführt, aber der Namespace ist zur Laufzeit undefined. Prüfen Sie, ob die API definiert ist, bevor Sie getInfo() oder ejectDevice() aufrufen oder Speicher-Listener registrieren.