Статья, перевод которой мы сегодня публикуем, посвящена новому API Idle Detection. Этот API уведомляет разработчиков при бездействии пользователя, указывая на то, что пользователь не работает с клавиатурой, мышью, экраном. API сообщает об активации хранителя экрана, о блокировке экрана, о переходе пользователя на другой экран. Разработчик при этом может настроить пороговые уровни показателей активности пользователя, достижение которых вызывает срабатывание API.
Рекомендованные способы использования API Idle Detection
Вот примеры проектов, в которых может быть использован новый API:
- Приложения-чаты или сайты социальных сетей могут использовать этот API для того чтобы сообщать пользователям о том, доступны ли в настоящее время те, с кем они общаются.
- Общедоступные приложения, работающие на информационных стендах, например — в музеях, могут воспользоваться этим API для перехода на «домашний» экран в ситуации, когда с информационным стендом никто не работает.
- Приложения, которые выполняют ресурсоёмкие вычисления, например — выводящие некие диаграммы, могут ограничить вычисления в то время, когда пользователь не взаимодействует с устройством.
Текущий ход работ
Шаг | Состояние |
1. Создание пояснений к API | Завершено |
2. Создание черновика спецификации | Не начат |
3. Сбор отзывов и доработка проекта | Выполняется |
4. Испытания по схеме Origin Trial | Выполняется |
5. Запуск | Не начат |
Использование API Idle Detection
▍Включение через флаги Chrome
Для того чтобы поэкспериментировать с API Idle Detection, обойдясь при этом без токена Origin Trial, нужно включить флаг #experimental-web-platform-features
в chrome://flags
.
▍Включение поддержки во время действия программы Origin Trial
API Idle Detection доступен в Chrome 84 по схеме Origin Trial. Ожидается, что эта фаза завершится с выходом Chrome 87.
Программа Origin Trial позволяет разработчикам пользоваться новыми возможностями Chrome и делиться с веб-сообществом отзывами об удобстве, практичности и эффективности этих возможностей. Здесь можно найти подробности об этой программе. Подписаться на участие в программе можно на странице регистрации.
▍Регистрация в программе Origin Trial
- Запросите токен для интересующей вас возможности.
- Добавьте токен на страницы экспериментального проекта. Существует 2 способа это сделать:
- Добавьте <meta>-тег origin-trial в заголовок каждой страницы. Например, это может выглядеть так: <meta http-equiv=«origin-trial» content=«TOKEN_GOES_HERE»>.
- Если у вас есть доступ к настройкам сервера — может добавить токен с использованием HTTP-заголовка Origin-Trial. В результате в заголовке ответа должно появиться нечто, подобное следующему: Origin-Trial: TOKEN_GOES_HERE.
▍Проверка возможности использования API
Для проверки поддержки API Idle Detection можете воспользоваться следующим кодом:
if ('IdleDetector' in window) {
// API Idle Detector поддерживается
}
Концепции, лежащие в основе API Idle Detection
API исходит из предположения о наличии некоего уровня взаимодействия между пользователем, пользовательским агентом (речь идёт о браузере) и операционной системой используемого устройства. Это взаимодействие оценивается с точки зрения двух показателей:
- Состояние пользователя:
active
илиidle
. Соответствующее значение зависит от того, взаимодействовал ли пользователь с браузером в течение некоего периода времени. - Состояние экрана:
locked
илиunlocked
. Это значение зависит от имеющихся в системе средств блокировки экрана (вроде хранителя экрана), которые не дают пользователю взаимодействовать с браузером.
Различение состояний active
и idle
требует использования эвристических алгоритмов, которые могут различаться для разных пользователей, браузеров, операционных систем. Кроме того, в работе API должно применяться некое рационально обусловленное пороговое значение (мы поговорим об этом ниже, в разделе, посвящённом безопасности и разрешениям).
Модель намеренно не стремится к формальному различению видов взаимодействия пользователя с конкретным содержимым (то есть, с веб-страницей, использующей этот API, открытой во вкладке), с браузером в целом, с операционной системой. За это отвечает браузер.
Использование API Idle Detection
Первый шаг при работе с API Idle Detection заключается в проверке того, имеется ли у страницы разрешение notifications
. Если такого разрешения нет — его нужно запросить у пользователя.
// Проверка наличия разрешения notifications.
const hasPermission = await navigator.permissions.query({name: 'notifications'});
if (hasPermission.state !== 'granted') {
// Сначала нужно запросить разрешение.
return console.log('Notifications permission not granted.');
}
Второй шаг заключается в создании экземпляра IdleDetector
. Минимальное значение параметра threshold
, задающего пороговое значение времени бездействия пользователя, равняется 60000 мс (1 минута). Запустить систему обнаружения бездействия пользователя можно, вызвав метод start()
объекта IdleDetector
. Этот метод принимает объект с параметрами, в котором содержится значение threshold
в миллисекундах и необязательное значение signal
(объект AbortSignal), позволяющее отключить наблюдение за активностью пользователя.
try {
const controller = new AbortController();
const signal = controller.signal;
const idleDetector = new IdleDetector();
idleDetector.addEventListener('change', () => {
const userState = idleDetector.userState;
const screenState = idleDetector.screenState;
console.log(`Idle change: ${userState}, ${screenState}.`);
});
await idleDetector.start({
threshold: 60000,
signal,
});
console.log('IdleDetector is active.');
} catch (err) {
// Обработка ошибок инициализации, вроде отсутствия разрешения,
// выполнения за пределами фрейма верхнего уровня и других.
console.error(err.name, err.message);
}
Отключить обнаружение неактивности пользователя можно, вызвав метод abort() объекта AbortController.
controller.abort();
console.log('IdleDetector is stopped.');
Пример
Увидеть API Idle Detection в действии можно, взглянув на демонстрационный пример Ephemeral Canvas. Здесь пользователь может нарисовать что-нибудь на странице. Страница очищается после того, как не было зафиксировано активности пользователя в течение 60 секунд. Такое приложение, например, могло бы быть запущено на терминале в универмаге. Оно могло бы быть предназначено для того, чтобы чем-то занять детей, позволив им порисовать на экране всякие закорючки.
Демонстрация использования API Idle Detection
Полифилл
Некоторые компоненты API Idle Detection могут быть заменены полифиллами и библиотеками для обнаружения бездействия пользователя, вроде idle.ts, но эти подходы ограничены рамками веб-проектов, которые их реализуют. Например, подобная библиотека, используемая в веб-приложении, нуждается в выполнении затратных операций по наблюдению за событиями ввода или по отслеживанию изменения видимости страницы. Возможности библиотек сильно ограничены ещё и тем, что они не в состоянии узнать о том, когда пользователь ничего не делает за пределами страниц, использующих эти библиотеки. Например — тогда, когда пользователь находится на другой вкладке браузера, или тогда, когда он попросту вышел из своей учётной записи на компьютере.
Безопасность и разрешения
Команда разработчиков Chrome спроектировала и реализовала API Idle Detection, ориентируясь на базовые принципы, определённые в этом документе. Сюда входят принципы, дающие пользователю возможность управлять возможностями браузеров, а также принципы, обеспечивающие прозрачность и эргономичность технологий. Возможность использования данного API контролируется разрешением notifications. Приложение, для того чтобы оно могло бы пользоваться этим API, должно выполняться в контексте безопасности верхнего уровня. Мы использовали именно это разрешение из-за того, что оно соответствует известным нам нуждам пользователей, но мы готовы, в будущем, это расширить. Если это не соответствует вашему сценарию использования данного API — ждём ваших отзывов.
Конфиденциальность и средства, позволяющие пользователю управлять API Idle Detection
Мы всегда стремимся к тому, чтобы не позволить злоумышленникам пользоваться возможностями новых API в их целях. Например, веб-сайты, с виду независимые, могут контролироваться одним лицом, получая сведения о бездействии пользователя и сопоставляя собранные данные для идентификации уникальных пользователей на разных сайтах. Для того чтобы помешать подобным атакам, API Idle Detection ограничивает детализацию событий, связанных с обнаружением бездействия пользователя. Кроме того, на уровне пользовательского агента, данные, выдаваемые этим API, могут быть особым образом обработаны. Например, мы планируем сделать это в Chrome для того чтобы помешать выполнению соответствующих атак. Кроме того, в ходе анализа угроз мы решили ограничить возможность применения данного API с помощью разрешения notifications
. Благодаря этому на пути злоумышленников возведены достаточно высокие барьеры, которые способны помешать им в использовании основных возможностей API. Речь идёт об отправке уведомлений и о выявлении бездействия пользователя.
Обратная связь
Команда разработчиков Chrome будет рада узнать о вашем опыте использования API Idle Detection.
▍Поделитесь с нами своими идеями об устройстве API
Есть ли в этом API что-то такое, что работает не так, как ожидается? Может, в нём не хватает чего-то такого, что нужно вам для реализации вашей идеи? Откройте новую задачу в трекере проекта или прокомментируйте существующую задачу.
▍Сообщите о проблеме с реализацией
Нашли ошибку в реализации Chrome? А может, оказалось, что реализация отличается от спецификации? Сделайте запись об ошибке на new.crbug.com. Постарайтесь включить как можно больше деталей в своё сообщение, добавьте в него простую инструкцию о том, как воспроизвести ошибку, и укажите, что проблема имеет отношение к Blink>Input
. Для демонстрации ошибок очень хорошо подходит Glitch.
▍Поддержите нас
Планируете пользоваться API Idle Detection? Если так — расскажите об этом. Такие рассказы помогают команде разработчиков Chrome расставлять приоритеты. Эти рассказы показывают создателям других браузеров важность поддержки новых возможностей. Если хотите — поделитесь своими планами использования нового API здесь, или отправьте твит @ChromiumDev с тегом #idledetection
и расскажите нам о том, где и как вы пользуетесь новым API Idle Detection.
Планируете ли вы пользоваться API Idle Detection?
Автор: ru_vds