Presentation API: границы экрана и сессии
Проектируйте Presentation API с доступностью экрана, активацией пользователя, переподключением, закрытием, ограниченными сообщениями и запасным режимом.
BotBrowser Team
Нужна структурированная документация по теме Платформа?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
BotBrowser может проверить разрешённый поток Presentation API, когда управляемый браузер предоставляет методы и объявленное действие запускает запрос. Он не создаёт физический экран или приёмник, не выбирает получателя и не доказывает доставку. Правильная граница описывается видимым состоянием: страница запрашивает, браузер выполняет посредничество, презентация может подключиться, а задача остаётся на странице при отказе.
TL;DR
Presentation API связывает управляющий контекст с экраном презентации, но не превращает экран в адресуемое страницей устройство. Проверьте PresentationRequest, наблюдайте PresentationAvailability как текущий сигнал и вызывайте start() из клика или клавиши. Состояния connected, closed, terminated, отклонённые promises и отсутствие экрана являются обычными результатами. Сохраняйте предпросмотр и управление в самой странице.
Спецификация W3C Presentation API описывает запуск, переподключение, доступность, события и сообщения. MDN отмечает ограниченную доступность. BotBrowser запишет состояния, которые показал браузер, но не докажет наличие физического экрана или просмотр человеком.
Содержание
- Доступность не является инвентарём
- Запускайте только с активацией пользователя
- Моделируйте полный жизненный цикл
- Ограниченные сообщения и запасной режим
- Таблица решений
- Проверяйте видимую границу с BotBrowser
- Итог
Доступность не является инвентарём
PresentationRequest содержит URL, которые агент пользователя может открыть на выбранном браузером приёмнике. PresentationAvailability сообщает лишь, считает ли агент совместимый экран доступным. Это не список телевизоров, проекторов или людей. availability.value === true может включить кнопку, но не называет устройство.
Выбор принадлежит браузеру. Не сохраняйте предполагаемое имя устройства и не перечисляйте приёмники. URL являются маршрутами приложения, а не адресами оборудования. Если конструктор отсутствует, политика запрещает API или доступность равна false, покажите ту же задачу внутри страницы. Материал о свойствах экрана и viewport отделяет геометрию от идентичности; Presentation API добавляет посредническую сессию, а не отпечаток экрана.
const presentation =
'PresentationRequest' in window ? new PresentationRequest(['/present/board', '/present/fallback']) : null;
let displayAvailable = false;
if (presentation) {
try {
const availability = await presentation.getAvailability();
displayAvailable = availability.value;
availability.onchange = () => {
displayAvailable = availability.value;
renderPresentationControl({ displayAvailable });
};
} catch {
renderPresentationControl({ displayAvailable: false });
}
}
Запускайте только с активацией пользователя
Вызывайте presentation.start() обработчиком кнопки или клавиши. Не запускайте API при загрузке, таймером или после сетевого ответа. Promise может быть отклонён из-за поддержки, активации, политики или выбора экрана. Транзитивная активация исчезает во время лишнего ожидания.
async function startPresentation() {
if (!presentation) return showInline('unsupported');
if (!displayAvailable) return showInline('unavailable');
setPresentationState('starting');
try {
const connection = await presentation.start();
attachConnection(connection);
setPresentationState(connection.state);
} catch (error) {
setPresentationState(classifyPresentationError(error));
showInline('fallback');
}
}
startButton.addEventListener('click', startPresentation);
Доступность является подсказкой до клика; результат start() определяет эту попытку. Состояние starting предотвращает двойные запросы, после результата можно предложить повтор. В Web Share API: границы разрешений и запасной режим описана такая же граница между возможностью, активацией и доставкой.
Моделируйте полный жизненный цикл
Соединение проходит через connecting, connected, closed и terminated. Обрабатывайте onconnect, onclose, onterminate и onmessage, освобождайте слушатели после закрытия. Переподключение является отдельным действием: идентификатор презентации непрозрачен, может истечь и не доказывает возврат того же физического экрана.
function attachConnection(connection) {
connection.onconnect = () => setPresentationState('connected');
connection.onclose = () => {
setPresentationState('closed');
showInline('fallback');
};
connection.onterminate = () => {
setPresentationState('terminated');
showInline('fallback');
};
connection.onmessage = event => acceptBoundedMessage(event.data);
}
Если доступность стала false, не объявляйте подключённую сессию закрытой до её события. После close или terminate не оставляйте текст «подключено». Страница сохраняет работу. Сравнение с окном другой природы приведено в Document Picture-in-Picture: границы разрешений и окон.
Ограниченные сообщения и запасной режим
Определите конверт с version, revision, списком типов и максимальным размером. Отклоняйте неизвестные типы и старые ревизии. Полученное сообщение является событием протокола, а не доказательством отрисовки или просмотра. Проверяйте маршрут и версию приёмника, экранируйте текст и закрывайте соединение при неизвестном протоколе.
const MAX_MESSAGE_BYTES = 16_384;
let revision = 0;
function makeMessage(type, content) {
const message = { version: 1, revision: ++revision, type, content };
const encoded = JSON.stringify(message);
if (new TextEncoder().encode(encoded).length > MAX_MESSAGE_BYTES) throw new Error('message-too-large');
return encoded;
}
Храните бизнес-модель в обычном состоянии страницы и формируйте из неё небольшое представление. После закрытия локальное редактирование продолжается; после переподключения отправляйте текущую ревизию. Ограниченный тайм-аут и одна попытка восстановления предотвращают бесконечные повторы.
Таблица решений
| Наблюдаемое состояние | Безопасное действие | Не утверждать |
|---|---|---|
Нет PresentationRequest | Показать локальное представление | Универсальную поддержку |
Доступность false | Оставить запасной режим | Что физических экранов нигде нет |
start() отклонён | Записать категорию ошибки | Что отказал названный прибор |
connected | Отправить ограниченную ревизию | Что отрисован каждый пиксель |
| Получено сообщение | Проверить конверт и ревизию | Что человек подтвердил его |
close или terminate | Освободить ресурсы и предложить повтор | Что экран всё ещё доступен |
| Переподключение отклонено | Удалить устаревший токен после лимита | Что восстановлен тот же экран |
Проверяйте видимую границу с BotBrowser
Управляемый контекст BotBrowser может нажать детерминированную кнопку и записать конструктор, доступность, переходы и видимость запасного режима. Результат unsupported, unavailable или start-rejected корректен, если страница остаётся рабочей. Документация расширенных возможностей BotBrowser не превращает тестовый процесс в физический приёмник.
{
"request": "PresentationRequest",
"availability": "unknown",
"states": ["starting", "fallback"],
"messagesAccepted": 0,
"fallbackVisible": true,
"delivery": "not-observed",
"physicalDisplay": "not-asserted"
}
Повторите fixture, меняя одну переменную: версию браузера, путь активации, доступность, сеть или идентификатор. Сравните первое различие и не превращайте локальный запуск в обещание для всех систем.
Итог
Страница владеет состоянием, а браузер посредничеством экрана. Проверяйте поддержку, запускайте видимым действием, ограничивайте сообщения и считайте закрытие, завершение и провал переподключения ожидаемыми состояниями. BotBrowser может повторить и сравнить этот видимый контракт в разрешённых контекстах; он не создаёт второй экран, не выбирает получателя и не гарантирует доставку.
Публичные источники
Дальше
Читайте Document Picture-in-Picture: границы разрешений и окон и Web Share API: границы разрешений и безопасный запасной режим.
Эта статья входит в руководство: Поверхности веб-платформы: карта проверки
Похожие статьи
Web MIDI API: разрешения и приватность устройств
ПлатформаWindow Management API: границы нескольких экранов
ПлатформаWeb Share API: границы разрешений и безопасные запасные варианты
ПлатформаDocument Picture-in-Picture: границы разрешений и окон
ПлатформаEyeDropper API: активация и приватность цвета
ПлатформаУправление цветом CSS и доступность отображения
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.