Назад в Центр знаний
Платформа

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

Действие пользователя запрашивает детали экрана, выбирает ограниченную цель, проверяет размещение или сохраняет резерв одного экрана.

Запросить детали на границе действия

Спецификация 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 из видимого действия, считайте детали временным снимком, ограничивайте и проверяйте размещение и сохраняйте путь одного экрана. Храните короткие итоги, отделённые от идентичности, места и калибровки. Повторяйте fixture после изменений и начинайте с первого видимого перехода.

#Window Management API#Несколько Экранов#Размещение Окна#Приватность Веба

Эта статья входит в руководство: Поверхности веб-платформы: карта проверки

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.