针对 Googlebook OS 调整扩展程序

Googlebook OS 是一种适用于 Googlebook 设备的操作系统,基于 Android 技术栈构建,并与 ChromeOS 的桌面基础架构配对。 Googlebooks 支持与 Windows、macOS 和 ChromeOS 上相同的 WebExtensions 平台,但它们在这些平台上的运行方式存在一些差异。

  • 平台检测很少需要,但现有检查可能会误触发,因为扩展程序 API 会报告 android,而用户代理会报告 ChromeOS。
  • 原生消息传递功能尚未推出,但我们正在努力开发。预计它会将消息路由到已安装的 Android 应用,而不是桌面可执行文件。
  • 键盘快捷键使用 Linux 键绑定,而不是 chromeos 条目。
  • SharedArrayBuffer 需要选择启用跨源隔离,并且必须在扩展程序页面或屏幕外文档中运行,而不是在 Service Worker 中运行。
  • 仅限 ChromeOS 的 API 在 Googlebook OS 上不受支持,即使用户代理报告 Chrome OS 也是如此。声明这些权限的扩展程序仍会安装,但 API 命名空间在运行时会变为 undefined。
  • Googlebook OS 不支持 browser.system.storage,因此 API 命名空间在运行时为 undefined。

平台检测

大多数扩展程序不需要检测 Googlebook OS。遵循标准的 Web 开发最佳实践,例如功能检测和自适应设计,而不是检查浏览器在哪个操作系统上运行。

如果您的扩展程序已检查操作系统,则扩展程序 API 和用户代理会在 Googlebook OS 上返回不同的平台。

  • chrome.runtime.getPlatformInfo().os 会返回 'android'。如果您的扩展程序与移动浏览器共享代码,并假设 'android' 表示手机,那么 Chromebook 用户会在笔记本电脑上看到您的移动界面。
  • navigator.userAgent 包含 CrOS。对于一般网页布局,Chromebook 也能很好地胜任。不过,navigator.userAgentData.platform 会返回 'Android',如果您的扩展程序检查用户代理以显示 ChromeOS 键盘快捷键提示(例如 Search 键)或调用仅限 ChromeOS 的 API,那么这些检查会在 Googlebook 上错误触发。

下表比较了各个平台上的这些信号。

信号 Googlebook OS 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

相比之下,navigator.userAgent 在 Googlebook OS 和 ChromeOS 上返回的精简版 User-Agent 字符串是相同的,因为这两个平台都会报告冻结的 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

与所有 Web 开发一样,平台检测可能不可靠,因此只有在无法使用功能检测直接测试所需内容时,才使用平台检测。如果您需要区分 Googlebook OS 与 Android 手机和 Chromebook,可以结合使用 runtime.getPlatformInfo() 与 User-Agent 客户端提示中的 mobile 提示。

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

虽然在产品发布时,这种特定的字符串比较组合确实能唯一地指向 Googlebook OS 设备,但情况可能并非总是如此。随着时间的推移,越来越多的设备开始出货,这些设备采用多种多样的规格,因此可能会出现一些 Googlebook OS 设备不符合该检测条件的情况。

如需了解如何使用客户端提示从网页或服务器中检测 Google 图书,请参阅识别 Google 图书。

原生消息传递

Googlebook OS 尚不支持原生消息传递,但我们正在努力开发中。预计它会具有与已安装的 Android 应用而非本地桌面可执行文件通信的扩展程序。目前,声明了 nativeMessaging 权限的扩展程序仍可在 Googlebook OS 上安装和运行,但连接尝试会失败。确保您的扩展程序能够妥善处理连接失败问题,并在原生主机不可用时回退到基于 Web 的工作流。请关注问题 555299632,及时了解最新动态。

键盘快捷键

commands 快捷键遵循与 Linux 版 Chrome 相同的规则。Chrome 会读取 Googlebook OS 上 suggested_key 的 linux 条目,因此 chromeos 下定义的快捷方式不适用。Search 键组合也不起作用,因为 Googlebook OS 设备上没有“搜索”键。

SharedArrayBuffer

在 Windows、macOS、Linux 和 ChromeOS 上,扩展程序可以在任何上下文中使用 SharedArrayBuffer 自动完成功能。在 Googlebook OS 上,扩展程序必须在 manifest.json 中明确选择启用跨源隔离,才能使用 SharedArrayBuffer。

选择启用跨源隔离功能后,扩展程序文档(例如弹出式窗口、选项页面和离屏文档)中会启用 SharedArrayBuffer。不过,它不会在扩展程序 Service Worker 中启用 SharedArrayBuffer,因为 Chrome 尚不支持 Service Worker 的跨源隔离(问题 40150182)。如果您的后台逻辑依赖于 SharedArrayBuffer(例如,运行线程化的 WebAssembly),请在屏幕外文档中运行该代码,而不是在 Service Worker 中运行。

仅限 ChromeOS 的 API

Chrome 扩展程序 API 参考文档中标记为 ChromeOS 专用的 API(例如 documentScan、fileSystemProvider、vpnProvider 和 printing)在 Googlebook OS 上不受支持,即使 navigator.userAgent 包含 CrOS 也是如此。声明这些权限的扩展程序仍会安装并运行,但 API 命名空间在运行时会变为 undefined。在调用 API 命名空间之前,请先检查该命名空间是否存在,而不是依赖于 User-Agent 检测。

browser.system.storage

Googlebook OS 不支持 browser.system.storage API。在 manifest.json 中声明 system.storage 权限的扩展程序仍会安装并运行,但命名空间在运行时为 undefined。在调用 getInfo()、ejectDevice() 或注册存储监听器之前,检查 API 是否已定义。