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 是否已定义。