Window Management API: границы нескольких экранов
Используйте Window Management с явным разрешением, активацией, изменениями топологии и безопасным резервом одного экрана.
BotBrowser Team
Нужна структурированная документация по теме Платформа?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Window Management API позволяет приложению видеть несколько доступных экранов и выбрать положение после разрешения браузера. Это не инвентарь мониторов и не сигнал местоположения. Геометрия меняется при подключении, удалении, блокировке, масштабировании или перенастройке, а система может скорректировать позицию. Управляемый контекст BotBrowser может выполнить разрешённую страницу, запросить доступ из объявленного действия и записать видимый результат, когда runtime раскрывает API; BotBrowser не создаёт второй физический экран, не выдаёт разрешение вне браузерного потока, не гарантирует системное размещение и не определяет местоположение по геометрии. См. свойства экрана и viewport и Screen Orientation API.
TL;DR
- Проверьте
getScreenDetails()и запросите доступ из видимого действия в безопасном контексте. - Считайте
ScreenDetails.screens,currentScreenи события временным снимком топологии. - Ограничьте координаты и размеры доступной областью, затем проверьте итоговое окно.
- Сохраняйте рабочий путь одного экрана при отсутствии разрешения, поддержки или топологии.
- Не превращайте количество и расположение экранов в идентичность человека, устройства или места.
Contents
- Запросить детали на границе действия
- Моделировать топологию и размещение как изменяемое состояние
- Отделить геометрию от приватности и доступности
- Проверить размещение ограниченным fixture
- Практический итог
Запросить детали на границе действия
Спецификация Window Management определяет Window.getScreenDetails() и ScreenDetails. Справочник MDN Window Management API описывает поверхность и доступность. Проверяйте метод, безопасный контекст и запрашивайте window-management только для видимой функции.
Рекомендации Chrome Window Management показывают необязательный поток. Разрешение может быть отклонено или заблокировано политикой. Опыт одного окна должен оставаться полным. Запрашивайте из кнопки или команды клавиатуры, объясняющей действие, а не при загрузке.
const topologyState = {
phase: 'idle',
outcome: 'unavailable',
screenCount: 0,
sequence: 0,
};
screenCount является локальным входом решения, а не атрибутом профиля. sequence отбрасывает старый результат после изменения. Не храните имена устройств, историю координат и список экранов рядом с аккаунтом. Элементу нужны доступное имя, клавиатура, фокус и путь одного окна.
Моделировать топологию и размещение как изменяемое состояние
ScreenDetails.screens является снимком, а currentScreen обозначает экран текущего окна. Набор меняется при подключении, удалении, разрешении и масштабе. Каждое событие требует обновления и не гарантирует старую позицию. Выберите свежую цель, рассчитайте область и проверьте результат.
Размещение является запросом. window.open() может блокироваться, ограничивать размеры или корректироваться менеджером окон. Используйте явную политику:
| Итог | Действие | Видимый контракт | Восстановление |
|---|---|---|---|
| API или разрешение недоступны | Остаться в текущем окне | Содержимое полностью доступно | Повторить только новым действием |
| Один текущий экран | Использовать его область | Объяснить отсутствие второго окна | Сохранить простой путь |
| Несколько экранов и свежие детали | Выбрать ограниченную цель | Сообщить панель | Проверить и обновить |
| Цель исчезла | Оставить текущее окно | Не двигать содержимое неожиданно | Выбрать по свежим данным |
| Popup отклонён | Сохранить задачу видимой | Объяснить отказ | Продолжить в странице |
Ограничивайте availLeft, availTop, availWidth и availHeight, оставляя поля и минимальный размер. Количество экранов не является идентичностью: два экрана бывают виртуальными, удалёнными или вспомогательными. Sequence запроса не позволяет изменению топологии закрыть исходное окно.
Отделить геометрию от приватности и доступности
Редкое сочетание областей и масштаба может участвовать в отпечатке. Держите геометрию в памяти, сводите к placed, single-screen или fallback и удаляйте снимок. Для поддержки используйте one-screen и topology-changed, а не имена, полные координаты и историю.
Размещение не является калибровкой. CSS, zoom, отношение пикселей и масштабирование меняют вид. Второму окну нужны заголовок, фокус, клавиатура и возврат. iframe получает только нужный результат после проверки origin. BotBrowser сравнивает разрешённые видимые результаты, но не создаёт экран или разрешение и не определяет местоположение.
Проверить размещение ограниченным fixture
Используйте синтетическую страницу с кнопкой, панелью и короткой записью. Запрашивайте детали из действия, выбирайте свежую цель, ограничивайте область и оставляйте исходную страницу рабочей.
const record = { phase: 'idle', outcome: 'unavailable', screenCount: 0, sequence: 0 };
let details;
async function openWorkspace() {
record.sequence += 1;
record.phase = 'pending';
try {
if (!window.isSecureContext || !('getScreenDetails' in window)) {
record.outcome = 'unavailable';
return showInPageWorkspace();
}
details = await window.getScreenDetails();
const screens = [...details.screens];
record.screenCount = screens.length;
const target = screens.find(screen => screen !== details.currentScreen) ?? details.currentScreen;
if (!target) return showInPageWorkspace('no-screen');
const width = Math.max(640, Math.min(960, target.availWidth));
const height = Math.max(480, Math.min(720, target.availHeight));
const child = window.open(
'/workspace',
'workspace',
`left=${target.availLeft},top=${target.availTop},width=${width},height=${height}`
);
record.outcome = child ? 'requested' : 'popup-blocked';
} catch (error) {
record.outcome = error?.name === 'NotAllowedError' ? 'permission-denied' : 'rejected';
} finally {
record.phase = 'idle';
}
}
| Случай | Ожидаемый итог | Что подтверждает | Что не подтверждает |
|---|---|---|---|
| Нет API, контекста или разрешения | unavailable или permission-denied | Проверку и резерв | Отсутствие физического экрана |
| Один экран | Результат одного окна | Рабочий простой путь | Отсутствие виртуального экрана |
| Свежие данные нескольких экранов | requested с ограниченной геометрией | Выбор и пределы | Точную позицию ОС |
| Топология изменилась до открытия | topology-changed, страница сохранена | Безопасность старых данных | Причину изменения |
| Popup отклонён | popup-blocked или rejected | Видимую обратимую ошибку | Дефект браузера |
Записывайте синтетические browserVersion, runtimePath, screenClass, outcome, geometryBounded, fixtureId и sequence. Повторяйте после изменения браузера, экрана, разрешения или размещения и сравнивайте первое изменившееся поле.
Public sources
- Window Management specification
- MDN: Window Management API
- Chrome for Developers: Window Management
- BotBrowser: Advanced features
Практический итог
Запрашивайте Window Management из видимого действия, считайте детали временным снимком, ограничивайте и проверяйте размещение и сохраняйте путь одного экрана. Храните короткие итоги, отделённые от идентичности, места и калибровки. Повторяйте fixture после изменений и начинайте с первого видимого перехода.
Эта статья входит в руководство: Поверхности веб-платформы: карта проверки
Похожие статьи
Presentation API: границы экрана и сессии
ПлатформаDocument Picture-in-Picture: границы разрешений и окон
ПлатформаEyeDropper API: активация и приватность цвета
ОтпечаткиОтпечаток экрана и окна: свойства отображения
ОтпечаткиСвойства экрана и viewport для адаптивного дизайна
ПлатформаScreen Wake Lock: жизненный цикл и границы приватности
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.