Googlebook OS 向けに拡張機能を適応させる

Googlebook OS は、Android 技術スタックをベースに構築され、ChromeOS のデスクトップ基盤と組み合わされた、Googlebook デバイス用のオペレーティング システムです。Googlebooks は、Windows、macOS、ChromeOS に存在する WebExtensions プラットフォームと同じものをサポートしていますが、実行方法にはいくつかの違いがあります。

  • プラットフォームの検出はほとんど必要ありませんが、拡張機能 API が android を報告し、ユーザー エージェントが ChromeOS を報告するため、既存のチェックが誤って発火する可能性があります。
  • ネイティブ メッセージングはまだ利用できませんが、現在開発中です。メッセージは、デスクトップ実行可能ファイルではなく、インストールされた Android アプリにルーティングされることが想定されます。
  • キーボード ショートカットは、chromeos エントリではなく Linux キーバインディングを使用します。
  • SharedArrayBuffer では、クロスオリジン分離を有効にする必要があります。また、Service Worker ではなく、拡張機能ページまたはオフスクリーン ドキュメントで実行する必要があります。
  • ユーザー エージェントが Chrome OS を報告していても、Googlebook OS では ChromeOS 専用の API はサポートされていません。これらの権限を宣言する拡張機能は引き続きインストールされますが、API 名前空間は実行時に undefined になります。
  • Googlebook OS では browser.system.storage はサポートされていないため、実行時の API 名前空間は undefined です。

プラットフォームの検出

ほとんどの拡張機能では、Googlebook OS を検出する必要はありません。ブラウザが実行されているオペレーティング システムを確認するのではなく、機能検出やレスポンシブ デザインなどのウェブ開発の標準的なベスト プラクティスに従います。

拡張機能ですでにオペレーティング システムを確認している場合、Googlebook OS では拡張機能 API とユーザー エージェントから異なるプラットフォームが返されます。

  • 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 の両方で navigator.userAgent は同じ削減されたユーザー エージェント文字列を返します。これは、両方のプラットフォームがフリーズされた 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

すべてのウェブ開発と同様に、プラットフォーム検出は信頼性が低い可能性があるため、必要なものを直接テストするために機能検出を使用できない場合にのみ使用してください。Googlebook OS を Android スマートフォンと Chromebook の両方と区別する必要がある場合は、runtime.getPlatformInfo() と ユーザー エージェント クライアント ヒントの 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 にインストールされて実行されますが、接続の試行は失敗します。拡張機能が接続エラーを適切に処理し、ネイティブ ホストが利用できない場合はウェブベースのワークフローにフォールバックするようにしてください。更新情報については、問題 555299632 をご覧ください。

キーボード ショートカット

commands ショートカットは、Linux 版 Chrome と同じルールに従います。Googlebook OS では、Chrome は suggested_key の linux エントリを読み取るため、chromeos で定義されたショートカットは適用されません。Googlebook OS デバイスには「検索」キーがないため、Search キーの組み合わせも機能しません。

SharedArrayBuffer

Windows、macOS、Linux、ChromeOS では、拡張機能は任意のコンテキストで SharedArrayBuffer を自動的に使用できます。Googlebook OS では、拡張機能で SharedArrayBuffer を使用するには、manifest.json でクロスオリジン分離を明示的に有効にする必要があります。

クロスオリジン分離を有効にすると、ポップアップ、オプション ページ、オフスクリーン ドキュメントなどの拡張機能ドキュメントで SharedArrayBuffer が有効になります。ただし、Chrome は Service Worker のクロスオリジン分離をまだサポートしていないため(問題 40150182)、拡張機能 Service Worker で SharedArrayBuffer は有効になりません。バックグラウンド ロジックが SharedArrayBuffer に依存している場合(たとえば、スレッド化された WebAssembly を実行する場合)、そのコードは Service Worker ではなく画面外ドキュメントで実行します。

ChromeOS 専用 API

Chrome 拡張機能 API リファレンスで ChromeOS のみとマークされている API(documentScan、fileSystemProvider、vpnProvider、printing など)は、navigator.userAgent に CrOS が含まれていても、Googlebook OS ではサポートされていません。これらの権限を宣言する拡張機能はインストールされて実行されますが、API 名前空間は実行時に undefined になります。ユーザー エージェントの検出に依存するのではなく、API 名前空間が存在することを確認してから呼び出すようにしてください。

browser.system.storage

browser.system.storage API は Googlebook OS ではサポートされていません。manifest.json で system.storage 権限を宣言する拡張機能は、引き続きインストールされて実行されますが、実行時の名前空間は undefined です。getInfo()、ejectDevice() を呼び出す前、またはストレージ リスナーを登録する前に、API が定義されているかどうかを確認します。