Как адаптировать расширение для Googlebook OS

Googlebook OS – это операционная система для устройств Googlebook, созданная на основе стека технологий Android и дополненная функциями ChromeOS. Googlebook поддерживает ту же платформу WebExtensions, что и Windows, macOS и ChromeOS, но есть некоторые различия в том, как они работают.

  • Определение платформы требуется редко, но существующие проверки могут работать неправильно, поскольку API расширения сообщают android, а агент пользователя – ChromeOS.
  • Нативные сообщения пока недоступны, но мы работаем над этим. Ожидается, что сообщения будут перенаправляться в установленное приложение Android, а не в исполняемый файл на компьютере.
  • Быстрые клавиши используют сочетания клавиш Linux, а не записи chromeos.
  • Для использования SharedArrayBuffer требуется включить изоляцию от междоменных источников. Кроме того, этот объект должен выполняться на странице расширения или в невидимом документе, а не в service worker.
  • API, предназначенные только для ChromeOS, не поддерживаются в Googlebook OS, даже если в агенте пользователя указано Chrome OS. Расширения, в которых указаны эти разрешения, по-прежнему устанавливаются, но пространства имен API во время выполнения имеют значение undefined.
  • browser.system.storage не поддерживается в Googlebook OS, поэтому во время выполнения пространство имен API – undefined.

Обнаружение платформы

Большинству расширений не нужно определять Googlebook OS. Следуйте стандартным рекомендациям по веб-разработке, например используйте обнаружение функций и адаптивный дизайн, а не проверяйте, какая операционная система используется в браузере.

Если ваше расширение уже проверяет операционную систему, то API расширений и агент пользователя возвращают разные платформы в ОС Googlebook.

  • chrome.runtime.getPlatformInfo().os возвращает 'android'. Если ваше расширение использует код, который также применяется в мобильных браузерах, и предполагает, что 'android' означает телефон, пользователи Chromebook будут видеть мобильный интерфейс на ноутбуке.
  • navigator.userAgent содержит CrOS. Для общего макета страницы хорошо подходит Chromebook. Однако navigator.userAgentData.platform возвращает 'Android', и если ваше расширение проверяет агент пользователя, чтобы показывать подсказки о сочетаниях клавиш ChromeOS (например, клавиши Search) или вызывать API, доступные только в ChromeOS, эти проверки будут выполняться неправильно на устройстве 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, поскольку обе платформы сообщают замороженный токен платформы 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 из подсказок клиента User-Agent.

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, но мы работаем над этим. Ожидайте, что расширения будут взаимодействовать с установленными приложениями Android, а не с локальными исполняемыми файлами. В настоящее время расширения, в которых заявлено разрешение nativeMessaging, по-прежнему устанавливаются и запускаются в ОС Googlebook, но попытки подключения завершаются неудачей. Убедитесь, что расширение корректно обрабатывает сбои подключения и переходит на веб-интерфейс, когда нативный хост недоступен. Следите за новостями в этой задаче.

Быстрые клавиши

Сочетания клавиш commands работают так же, как в Chrome на Linux. Chrome считывает запись linux из suggested_key в Googlebook OS, поэтому сочетания клавиш, заданные в разделе chromeos, не применяются. Сочетания клавиш с клавишей Search также не работают, поскольку на устройствах с ОС Googlebook нет клавиши "Поиск".

SharedArrayBuffer

В Windows, macOS, Linux и ChromeOS расширения могут использовать SharedArrayBufferавтоматически в любом контексте. В ОС Googlebook, чтобы использовать SharedArrayBuffer, расширения должны явно включить изоляцию от междоменных источников в manifest.json.

Включив изоляцию от междоменных источников, вы сможете использовать объект SharedArrayBuffer в документах расширения, таких как всплывающие окна, страницы настроек и невидимые документы. Однако он не включает SharedArrayBuffer в скриптах service worker расширений, поскольку Chrome пока не поддерживает изоляцию между источниками для скриптов service worker (проблема 40150182). Если фоновая логика опирается на SharedArrayBuffer (например, для запуска многопоточного WebAssembly), выполняйте код в документе вне экрана, а не в service worker.

API, доступные только в ChromeOS

API, помеченные как Только ChromeOS в документации по API расширений Chrome (например, documentScan, fileSystemProvider, vpnProvider и printing), не поддерживаются в Googlebook OS, даже если navigator.userAgent включает CrOS. Расширения, в которых указаны эти разрешения, по-прежнему устанавливаются и запускаются, но пространства имен API во время выполнения undefined. Перед вызовом убедитесь, что пространство имен API существует, а не полагайтесь на обнаружение агента пользователя.

browser.system.storage

browser.system.storage API не поддерживается в Googlebook OS. Расширения, в manifest.jsonманифесте которых указано разрешение system.storage, по-прежнему устанавливаются и запускаются, но во время выполнения пространство имен undefined. Проверьте, определен ли API, прежде чем вызывать getInfo(), ejectDevice() или регистрировать прослушиватели хранилища.