調整擴充功能,使其適用於 Googlebook OS

Googlebook OS 是 Googlebook 裝置的作業系統,以 Android 技術堆疊為基礎,並搭配 ChromeOS 的電腦基礎架構。Google 圖書支援與 Windows、macOS 和 ChromeOS 相同的 WebExtensions 平台,但執行方式有些差異。

  • 平台偵測很少需要,但現有的檢查可能會誤判,因為擴充功能 API 會回報 android,而使用者代理程式會回報 ChromeOS。
  • 原生訊息功能尚未推出,但我們正在努力開發中。預期系統會將訊息傳送至已安裝的 Android 應用程式,而非桌面可執行檔。
  • 鍵盤快速鍵會使用 Linux 鍵盤繫結,而非 chromeos 項目。
  • SharedArrayBuffer 需要選擇啟用跨來源隔離功能,且必須在擴充功能頁面或螢幕外文件中執行,而非在 Service Worker 中執行。
  • Googlebook OS 不支援僅適用於 ChromeOS 的 API,即使使用者代理程式會回報 Chrome OS 也是如此。宣告這些權限的擴充功能仍會安裝,但 API 命名空間在執行階段會是 undefined。
  • Googlebook OS 不支援 browser.system.storage,因此 API 命名空間在執行階段為 undefined。

平台偵測

大多數擴充功能不需要偵測 Googlebook OS。請遵循標準網頁開發最佳做法,例如功能偵測和回應式設計,而非檢查瀏覽器執行的作業系統。

如果擴充功能已檢查作業系統,擴充功能 API 和使用者代理程式會在 Googlebook OS 上傳回不同平台。

  • chrome.runtime.getPlatformInfo().os 會傳回 'android'。如果擴充功能與行動瀏覽器共用程式碼,並假設 'android' 代表手機,Googlebook 使用者就會在筆電上看到行動版 UI。
  • 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

相較之下,Googlebook OS 和 ChromeOS 都會回報凍結的 X11; CrOS x86_64 14541.0.0 平台權杖,因此 navigator.userAgent 會在這兩個平台傳回相同的精簡版使用者代理程式字串。

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

與所有網頁開發作業一樣,平台偵測可能不可靠,因此只有在無法使用功能偵測直接測試所需項目時,才使用平台偵測。如果需要區分 Googlebook OS 與 Android 手機和 Chromebook,可以結合 runtime.getPlatformInfo() 與 User-Agent Client Hints 的 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 裝置不符合該偵測結果。

如要使用用戶端提示偵測網頁或伺服器上的 Googlebook,請參閱「識別 Googlebook」。

原生訊息傳遞

Googlebook OS 目前尚未支援原生訊息功能,但我們正努力開發中。預期擴充功能會與已安裝的 Android 應用程式通訊,而不是本機電腦可執行檔。目前,聲明 nativeMessaging 權限的擴充功能仍可在 Googlebook OS 上安裝及執行,但連線嘗試會失敗。請確保擴充功能能妥善處理連線失敗問題,並在原生主機無法使用時,改用以網路為基礎的工作流程。請追蹤問題 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 的跨來源隔離 (issue 40150182)。如果背景邏輯依賴 SharedArrayBuffer (例如執行執行緒 WebAssembly),請在螢幕外文件 (而非 Service Worker) 中執行該程式碼。

僅適用於 ChromeOS 的 API

Chrome 擴充功能 API 參考資料中標示為「僅限 ChromeOS」的 API (例如 documentScan、fileSystemProvider、vpnProvider 和 printing) 不支援 Googlebook OS,即使 navigator.userAgent 包含 CrOS 也是如此。宣告這些權限的擴充功能仍可安裝及執行,但 API 命名空間會在執行階段遭到 undefined。請先檢查 API 命名空間是否存在,再呼叫該命名空間,而不是依賴使用者代理程式偵測。

browser.system.storage

Googlebook OS 不支援 browser.system.storage API。在 manifest.json 中宣告 system.storage 權限的擴充功能仍會安裝及執行,但命名空間在執行階段為 undefined。在呼叫 getInfo()、ejectDevice() 或註冊儲存空間監聽器之前,請先檢查是否已定義 API。