- PVSM.RU - https://www.pvsm.ru -
Статья, перевод которой мы сегодня публикуем, посвящена новому API Idle Detection. Этот API уведомляет разработчиков при бездействии пользователя, указывая на то, что пользователь не работает с клавиатурой, мышью, экраном. API сообщает об активации хранителя экрана, о блокировке экрана, о переходе пользователя на другой экран. Разработчик при этом может настроить пороговые уровни показателей активности пользователя, достижение которых вызывает срабатывание API.
Вот примеры проектов, в которых может быть использован новый API:
Шаг | Состояние |
1. Создание пояснений к API | Завершено [2] |
2. Создание черновика спецификации | Не начат |
3. Сбор отзывов и доработка проекта | Выполняется [3] |
4. Испытания по схеме Origin Trial | Выполняется [4] |
5. Запуск | Не начат |
Для того чтобы поэкспериментировать с API Idle Detection, обойдясь при этом без токена Origin Trial, нужно включить флаг #experimental-web-platform-features
в chrome://flags
.
API Idle Detection доступен в Chrome 84 по схеме Origin Trial. Ожидается, что эта фаза завершится с выходом Chrome 87.
Программа Origin Trial позволяет разработчикам пользоваться новыми возможностями Chrome и делиться с веб-сообществом отзывами об удобстве, практичности и эффективности этих возможностей. Здесь [5] можно найти подробности об этой программе. Подписаться на участие в программе можно на странице регистрации [6].
Для проверки поддержки API Idle Detection можете воспользоваться следующим кодом:
if ('IdleDetector' in window) {
// API Idle Detector поддерживается
}
API исходит из предположения о наличии некоего уровня взаимодействия между пользователем, пользовательским агентом (речь идёт о браузере) и операционной системой используемого устройства. Это взаимодействие оценивается с точки зрения двух показателей:
active
или idle
. Соответствующее значение зависит от того, взаимодействовал ли пользователь с браузером в течение некоего периода времени.locked
или unlocked
. Это значение зависит от имеющихся в системе средств блокировки экрана (вроде хранителя экрана), которые не дают пользователю взаимодействовать с браузером.
Различение состояний active
и idle
требует использования эвристических алгоритмов, которые могут различаться для разных пользователей, браузеров, операционных систем. Кроме того, в работе API должно применяться некое рационально обусловленное пороговое значение (мы поговорим об этом ниже, в разделе, посвящённом безопасности и разрешениям).
Модель намеренно не стремится к формальному различению видов взаимодействия пользователя с конкретным содержимым (то есть, с веб-страницей, использующей этот API, открытой во вкладке), с браузером в целом, с операционной системой. За это отвечает браузер.
Первый шаг при работе с API Idle Detection заключается в проверке того, имеется ли у страницы разрешение notifications
. Если такого разрешения нет — его нужно запросить [7] у пользователя.
// Проверка наличия разрешения 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 [8]), позволяющее отключить наблюдение за активностью пользователя.
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() [9] объекта AbortController [10].
controller.abort();
console.log('IdleDetector is stopped.');
Увидеть API Idle Detection в действии можно, взглянув на демонстрационный пример Ephemeral Canvas [11]. Здесь пользователь может нарисовать что-нибудь на странице. Страница очищается после того, как не было зафиксировано активности пользователя в течение 60 секунд. Такое приложение, например, могло бы быть запущено на терминале в универмаге. Оно могло бы быть предназначено для того, чтобы чем-то занять детей, позволив им порисовать на экране всякие закорючки.
Демонстрация использования API Idle Detection
Некоторые компоненты API Idle Detection могут быть заменены полифиллами и библиотеками для обнаружения бездействия пользователя, вроде idle.ts [12], но эти подходы ограничены рамками веб-проектов, которые их реализуют. Например, подобная библиотека, используемая в веб-приложении, нуждается в выполнении затратных операций по наблюдению за событиями ввода или по отслеживанию изменения видимости страницы. Возможности библиотек сильно ограничены ещё и тем, что они не в состоянии узнать о том, когда пользователь ничего не делает за пределами страниц, использующих эти библиотеки. Например — тогда, когда пользователь находится на другой вкладке браузера, или тогда, когда он попросту вышел из своей учётной записи на компьютере.
Команда разработчиков Chrome спроектировала и реализовала API Idle Detection, ориентируясь на базовые принципы, определённые в этом [13] документе. Сюда входят принципы, дающие пользователю возможность управлять возможностями браузеров, а также принципы, обеспечивающие прозрачность и эргономичность технологий. Возможность использования данного API контролируется разрешением notifications [14]. Приложение, для того чтобы оно могло бы пользоваться этим API, должно выполняться в контексте безопасности верхнего уровня [15]. Мы использовали именно это разрешение из-за того, что оно соответствует известным нам нуждам пользователей, но мы готовы, в будущем, это расширить. Если это не соответствует вашему сценарию использования данного API — ждём [3] ваших отзывов.
Мы всегда стремимся к тому, чтобы не позволить злоумышленникам пользоваться возможностями новых API в их целях. Например, веб-сайты, с виду независимые, могут контролироваться одним лицом, получая сведения о бездействии пользователя и сопоставляя собранные данные для идентификации уникальных пользователей на разных сайтах. Для того чтобы помешать подобным атакам, API Idle Detection ограничивает детализацию событий, связанных с обнаружением бездействия пользователя. Кроме того, на уровне пользовательского агента, данные, выдаваемые этим API, могут быть особым образом обработаны. Например, мы планируем сделать это в Chrome для того чтобы помешать выполнению соответствующих атак. Кроме того, в ходе анализа угроз мы решили ограничить возможность применения данного API с помощью разрешения notifications
. Благодаря этому на пути злоумышленников возведены достаточно высокие барьеры, которые способны помешать им в использовании основных возможностей API. Речь идёт об отправке уведомлений и о выявлении бездействия пользователя.
Команда разработчиков Chrome будет рада узнать о вашем опыте использования API Idle Detection.
Есть ли в этом API что-то такое, что работает не так, как ожидается? Может, в нём не хватает чего-то такого, что нужно вам для реализации вашей идеи? Откройте новую задачу в трекере проекта [16] или прокомментируйте существующую задачу.
Нашли ошибку в реализации Chrome? А может, оказалось, что реализация отличается от спецификации? Сделайте запись об ошибке на new.crbug.com [17]. Постарайтесь включить как можно больше деталей в своё сообщение, добавьте в него простую инструкцию о том, как воспроизвести ошибку, и укажите, что проблема имеет отношение к Blink>Input
. Для демонстрации ошибок очень хорошо подходит Glitch [18].
Планируете пользоваться API Idle Detection? Если так — расскажите об этом. Такие рассказы помогают команде разработчиков Chrome расставлять приоритеты. Эти рассказы показывают создателям других браузеров важность поддержки новых возможностей. Если хотите — поделитесь своими планами использования нового API здесь [19], или отправьте твит @ChromiumDev [20] с тегом #idledetection
и расскажите нам о том, где и как вы пользуетесь новым API Idle Detection.
Планируете ли вы пользоваться API Idle Detection?
Автор: ru_vds
Источник [21]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/353626
Ссылки в тексте:
[1] Image: https://habr.com/ru/company/ruvds/blog/504616/
[2] Завершено: https://github.com/samuelgoto/idle-detection/blob/master/README.md
[3] Выполняется: https://web.dev/idle-detection/#feedback
[4] Выполняется: https://developers.chrome.com/origintrials/#/view_trial/551690954352885761
[5] Здесь: https://github.com/GoogleChrome/OriginTrials/blob/gh-pages/developer-guide.md
[6] странице регистрации: https://developers.chrome.com/origintrials/#/trials/active
[7] запросить: https://developers.google.com/web/fundamentals/push-notifications/subscribing-a-user#requesting_permission
[8] AbortSignal: https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal
[9] abort(): https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
[10] AbortController: https://developer.mozilla.org/en-US/docs/Web/API/AbortController
[11] Ephemeral Canvas: https://idle-detection.glitch.me/
[12] idle.ts: https://github.com/dropbox/idle.ts
[13] этом: https://chromium.googlesource.com/chromium/src/+/lkgr/docs/security/permissions-for-powerful-web-platform-features.md
[14] notifications: https://w3c.github.io/permissions/#notifications
[15] верхнего уровня: https://www.w3.org/TR/secure-contexts/#examples-top-level
[16] трекере проекта: https://github.com/samuelgoto/idle-detection/issues
[17] new.crbug.com: https://new.crbug.com/
[18] Glitch: https://glitch.com/
[19] здесь: https://discourse.wicg.io/t/idle-detection-api/2959
[20] @ChromiumDev: https://twitter.com/ChromiumDev
[21] Источник: https://habr.com/ru/post/504616/?utm_source=habrahabr&utm_medium=rss&utm_campaign=504616
Нажмите здесь для печати.