Web Share API: границы разрешений и безопасные запасные варианты
Создавайте Web Share с проверкой возможностей, кратковременной активацией, валидацией, отменой и доступным запасным сценарием.
BotBrowser Team
Нужна структурированная документация по теме Платформа?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Web Share: передача управления браузером по инициативе пользователя. Страница предлагает заголовок, текст, URL или поддерживаемые файлы, а браузер после активации видимого элемента может открыть системную панель «Поделиться». Страница не выбирает получателя, не просматривает список получателей и не получает подтверждения доставки другим приложением. BotBrowser позволяет проверить интерфейс с учётом возможностей и запасные сценарии в контролируемых контекстах, но не может выбирать цель пользователя, управлять системной панелью или обходить посредничество браузера.
TL;DR (Кратко)
- Определяйте Web Share и сохраняйте копирование, скачивание или обычную ссылку.
- Вызывайте
navigator.share()только из осознанного действия пользователя с кратковременной активацией. - Проверяйте данные через
navigator.canShare(), но не считайте это доказательством доставки. - Обрабатывайте отмену и ошибки, не стирая задачу пользователя.
- Web Share не перечисляет получателей, не выдаёт разрешений и не устанавливает личность.
Содержание
- Возможность и активация
- Проверка данных и конфиденциальность
- Отмена и доступный запасной вариант
- Тестирование с BotBrowser
- Политика разрешений и встроенные контексты
- Часто задаваемые вопросы
- Итог
Возможность и активация
Спецификация Web Share W3C и руководство MDN описывают условную возможность. На доступность влияют защищённый контекст, политика браузера, текущий документ и интеграция с ОС. Проверяйте navigator.share в момент использования: наличие метода при загрузке не гарантирует, что позднее контекст, данные или активация подойдут.
Кратковременная активация быстро истекает. Вызывайте метод в обработчике клика или клавиатуры, не через таймер, ожидание сетевого запроса и не при загрузке. Видимое действие даёт человеку понятный результат и браузеру корректную цепочку активации. Дорогую подготовку выполняйте до клика, оставляя внутри обработчика только ограниченную синхронную проверку.
Граница активации не является разрешением. Выполненный промис сообщает лишь локальный результат передачи, доступный странице; он не доказывает показ нативной панели, выбор получателя или доставку. Отмена: обычный исход, сохраняйте страницу, заголовок, форму и инициировавший элемент.
Проверки должны описывать состояние продукта, а не личность браузера. «Поделиться доступно» включает контроль, «недоступно здесь» показывает копирование и скачивание. Не превращайте отсутствие метода, отклонённый промис или другой результат активации в классификацию пользователя или устройства.
Проверка данных и конфиденциальность
Данные включают title, text, url и поддерживаемые браузером файлы. Формируйте их из текущего видимого объекта, очищайте URL от токенов доступа и закрытых параметров, не добавляйте идентификаторы аккаунта или скрытые метаданные. MDN Navigator.share() описывает метод, а доступный navigator.canShare() проверяет принятие набора в текущем контексте.
canShare() проверяет возможность, не получателя: он не раскрывает приложения, контакт или завершение передачи. Неизвестные поля словаря игнорируются, а разные результаты нельзя использовать для отпечатка. Один набор может быть принят или отклонён из-за файлов, размера, политики и интеграции платформы.
Разделяйте авторизацию и передачу. Частный документ не становится публичным от одной кнопки: повторно проверьте право чтения до создания URL или экспорта, объясните срок действия ссылки, а получающий сервис аутентифицируйте независимо. Результат панели не является сигналом авторизации сервера.
Для аналитики записывайте только ограниченные события share-request-resolved, share-cancelled, share-rejected, copy-success, download-started. Не логируйте исходный текст, закрытые URL, файлы или имя получателя; задайте цель и срок удаления. Принципы конфиденциальности W3C поддерживают минимизацию.
Отмена и доступный запасной вариант
AbortError означает отмену человеком или отсутствие пригодной цели; это безопасный возврат к задаче, а не доказательство решения пользователя. Другие ошибки могут означать неверные данные, файл, политику или сбой платформы. Покажите краткий статус и оставьте копирование, скачивание и обычную ссылку; не перезагружайте страницу, не очищайте черновик и не повторяйте вызов в цикле.
Копируйте выбранный URL, скачивайте авторизованное представление или показывайте ссылку в документе. У каждого действия должны быть видимая подпись и путь с клавиатуры. При сбое буфера обмена оставьте URL выделяемым, при подготовке файла покажите прогресс и «Повторить»/«Отменить». Отсутствие панели не должно скрывать важное содержимое.
Используйте доступные имена, порядок фокуса и статус. После отмены возвращайте фокус к инициатору, если человек не переместил его в другое место, и сообщайте «Передача отменена» или «Ссылка готова», а не исключение или закрытый URL. Поддерживайте масштаб, контраст, клавиатуру и скринридер. Элемент только с иконкой требует доступного имени и подсказки; основному действию обычно полезны иконка и текст.
Во встроенных и автономных контекстах действует тот же договор. Встроенный компонент может меньше контролировать документ верхнего уровня и нуждаться в обычной ссылке или скачивании. Автономная страница всё ещё может копировать URL, а созданный экспорт может ждать локальной подготовки. Объясняйте, что остаётся локальным, а что покидает страницу, и не считайте панель верхнего уровня доступной внутри каждого фрейма.
Проверяйте длинные заголовки, нелатинские и двунаправленные тексты, переведённые статусы. Не используйте локаль браузера для выбора получателя или вывода местоположения. До активации держите объект видимым и сохраняйте его при отмене; эти правила не зависят от панели конкретной ОС.
Тестирование с BotBrowser
BotBrowser проверяет интерфейс с учётом возможностей и запасной вариант в контролируемых контекстах, но не выбирает цель, не управляет ОС и не обходит браузер. Фикстура может убрать navigator.share, отклонить AbortError или другую ошибку, вернуть разные canShare() и проверить копирование/скачивание; она не доказывает получателя или доставку.
Используйте синтетические заголовки, URL, файлы и действия. Записывайте сборку, тип контекста, защищённый контекст, путь активации, класс данных, результат промиса, видимый запасной вариант и ревизию; не записывайте аккаунты, закрытые URL, экспорты и списки получателей. Повторяйте при отсутствии метода/canShare, неверных данных, отмене и успешном запросе.
Успешный тест подтверждает лишь принятие запроса заявленным контекстом и сохранение запасного варианта. Он не подтверждает будущую системную панель или передачу другому приложению. Повторяйте после изменений браузера, ОС или данных, отделяя мониторинг от совместимости.
Практический договор принятия решений. До кнопки определите объект, поля, правило авторизации и запасной вариант. Публичная страница может передавать канонический URL. Частному рабочему пространству нужна короткоживущая ссылка с проверкой доступа или экспорт после подтверждения области. Это решения продукта; передача браузером не делает их автоматически безопасными.
Назначьте одного владельца подготовки представления. Если страница создаёт файл, укажите, когда он готов, остаётся ли локальным до начала передачи и как удаляется после отмены. При сбое оставьте исходную задачу читаемой и покажите повтор. Отключённая без объяснения кнопка не является запасным вариантом; действия «Подготовить скачивание» или «Копировать ссылку» дают альтернативу без предположения о системной панели.
Разделяйте состояние элемента управления и состояние результата. Элемент может быть доступен, недоступен, готовиться или временно блокироваться; результат может быть отменён, отклонён, скопирован, скачан или ожидать передачи браузеру. Выполненный промис не называйте «доставлено», поскольку страница не знает, что произошло после передачи запроса. После отмены верните элемент в обычное состояние, не оставляя ошибку на задаче.
Для каждого класса данных используйте один ограниченный путь. URL проверяйте сразу. Для файла вызывайте canShare() именно для файла и сохраняйте доступное скачивание. Текст проверяйте по длине и конфиденциальности. Если объект не проходит проверку, не изменяйте его снова ради принятия браузером; покажите выбранный запасной вариант и дайте человеку решить, копировать, скачать или продолжить без передачи.
Кнопка «Поделиться» не должна скрытно создавать связь аккаунтов. «Пригласить» требует серверной авторизации, подтверждения и аудита. «Копировать ссылку» остаётся локальным до вставки, «Скачать» создаёт локальный файл, а «Поделиться» просит браузер открыть выбранную передачу. Их можно сгруппировать визуально, но границы данных и смысл успеха различны.
Проверяйте ссылки до выхода со страницы: удаляйте токены и внутренние параметры, показывайте срок и аудиторию временной ссылки, а сервис пусть проверяет каждый запрос. Получающее приложение может сохранить или переслать ссылку, поэтому Web Share не заменяет обычный контроль доступа.
Текст статуса должен быть фактическим и обратимым. Не обещайте «Панель открыта»: разрешение промиса не всегда доказывает нативный показ. «Передача отменена» сообщает, что страница не изменилась. После «Копирование ссылки недоступно» должна следовать ссылка для выделения или скачивание. Не предполагайте наличие цели ОС, выбор контакта или принятие содержимого другим приложением.
Считайте различия браузеров ожидаемым входом. Один браузер может поддерживать URL, но не файлы, другой требовать более строгую активацию, а встроенный документ не иметь рабочей панели. В каждом состоянии сохраняйте основную задачу. Проверяйте видимые элементы, а не раскладку панели конкретного поставщика.
Проверяйте клавиатурную активацию, возврат к тому же элементу и выбор запасного варианта без указателя. Убедитесь, что статус для скринридера не объявляет закрытое содержимое, длинный локализованный заголовок не скрывает запасное действие, а принудительные цвета и крупный масштаб сохраняют границу между вариантами.
Проверка конфиденциальности должна выяснять, что приложение узнаёт о попытке. Обычно это только осознанный клик и ограниченный локальный результат, не список получателей, граф контактов, профиль ОС или подтверждение доставки. Если поле не улучшает конкретное решение, не собирайте его. Схема событий должна быть независимой от метаданных аккаунта, а краткосрочную диагностику удаляйте после завершения поддержки.
Фикстура совместимости должна проверить отсутствие метода, вызов вне обработчика клика, корректные данные, отмену, неподдерживаемый файл и ошибку, сохраняя документ и понятный следующий шаг. Она не должна притворяться автоматизацией получателя.
После добавления файлов, изменения ссылки, встраивания или политики запускайте фикстуру заново и сравнивайте видимые результаты с минимальной диагностикой. Старый успех не доказывает работу нового типа файла или контекста фрейма; сохраняйте запасной вариант до проверки обновлённого пути.
Проверяйте тип и размер файла до основного действия и объясняйте отказ. При временном файле задайте срок жизни приложения, освобождайте его после отмены или завершения и сохраняйте возможность создать заново. Не решайте отказ по размеру скрытой загрузкой или изменением аудитории.
Проверка защищённого контекста должна быть рядом с проверкой возможностей. HTTP, встроенный документ с ограничительной политикой и HTTPS верхнего уровня могут дать разные результаты при одной кнопке. Это состояния документа или браузера, а не выбор разрешения пользователя; основной запасной вариант должен оставаться тем же.
Тестируйте отмену до завершения подготовки, после открытия панели и после появления запасного варианта. Не оставляйте отключённый элемент, двойное скачивание или потерянное поле. Повторная активация должна начинать одну новую попытку со свежей проверкой, особенно на сенсорных устройствах.
Финальный статус держите локальным для действия. Он может обновить live region, кнопку или строку, но не аккаунт и не серверную запись «доставлено». Серверное приглашение выполняйте отдельной подтверждённой операцией со своим ответом и аудитом.
Политика разрешений и встроенные контексты
Доступность Web Share различается у документа верхнего уровня и iframe. Управляемая политикой возможность по умолчанию имеет список разрешённых источников self, поэтому одноимённому iframe может не требоваться делегирование. Междоменному iframe нужно явное делегирование, если его разрешает политика верхнего уровня. Минимальное встраивание может содержать allow="web-share", что участвует только в решении политики и не выбирает получателя.
<iframe src="https://share.example.test/panel" title="Share panel" allow="web-share"></iframe>
Политика ответа, атрибут iframe, защищённый контекст и браузер действуют совместно. Permissions-Policy: web-share=() отключает возможность и не переоткрывается allow. Метод может отсутствовать, canShare() отклонить данные, а navigator.share() дать NotAllowedError из-за политики, кратковременной активации или файла, заблокированного безопасностью. Не называйте каждую такую ошибку отказом пользователя; проверяйте контекст и сохраняйте запасной вариант. Делегированный и неделегированный iframe тестируйте отдельно.
Копируемая машина состояний передачи
Явно разделяйте возможность, активацию, отмену и параллельные запросы. Машина принадлежит странице, не имитирует нативную панель и не называет выполненный промис доставкой.
const shareState = { value: 'idle' };
async function runShare(data, render, fallback) {
if (shareState.value === 'sharing') return;
if (!window.isSecureContext || typeof navigator.share !== 'function') return fallback('unavailable');
if (navigator.canShare && !navigator.canShare(data)) return fallback('unsupported-data');
shareState.value = 'sharing';
render(shareState.value);
try {
await navigator.share(data);
shareState.value = 'complete';
} catch (error) {
shareState.value = error?.name === 'AbortError' ? 'cancelled' : 'failed';
fallback(shareState.value);
}
render(shareState.value);
}
Защита второго запроса: состояние приложения. InvalidStateError относится к полностью активному документу с уже выполняющимся запросом или к иному недействительному состоянию, тогда как NotAllowedError обычно связан с политикой, активацией или заблокированным файлом. Восстановите контроль и запасной вариант; время промиса и вид панели зависят от платформы. Сообщайте только локальный результат.
Таблица решений и ожидаемые результаты
| Условие | Решение страницы | Ожидаемый видимый результат |
|---|---|---|
| HTTPS верхнего уровня, метод есть, корректный URL, свежий клик | Вызвать share() один раз | Занято, затем завершено или отменено; запасной вариант сохраняется |
| HTTP или ограниченный встроенный контекст | Не вызывать | Объяснить недоступность, показать копирование/скачивание |
| Iframe без делегированной политики | Считать возможность недоступной | Тот же доступный запасной вариант без повторных запросов |
| Известные поля неверны/не поддерживаются | Не менять данные | Предложить поддерживаемую ссылку или скачивание |
NotAllowedError | Классифицировать политику, активацию или заблокированный файл | Восстановить контроль и статус запасного варианта |
InvalidStateError или параллельный запрос | Оставить одного владельца | Показать занятость/повтор без дубликатов |
Отмена или нет цели (AbortError) | Установить cancelled | Сохранить задачу, статус и вернуть idle |
Таблица: договор продукта, не обещание одной системной панели. Для частного ресурса повторите авторизацию до URL; для файла проверьте тип/размер и сохраните путь скачивания. Неизвестные поля словаря игнорируются, поэтому canShare() определяется известными полями. При недействительном поле сохраняйте исходную задачу и используйте запасной вариант.
Часто задаваемые вопросы
Даёт ли allow="web-share" разрешение на передачу?
Нет. Он делегирует возможность, управляемую политикой, если окружающая политика это разрешает. Всё ещё нужны активация пользователя, защищённый контекст, проверки данных, правила браузера и выбор ОС.
Доказывает ли resolved navigator.share() доставку?
Нет. Это только результат, видимый странице. Платформа может принять передачу без раскрытия получателя или завершённой доставки. Сохраняйте фактический статус и копирование/скачивание.
Почему две корректные кнопки могут дать NotAllowedError?
Различаются время активации, политика фрейма, защищённый контекст или заблокированный файл. Полностью активный документ с уже выполняющимся либо недействительным запросом даёт InvalidStateError; NotAllowedError чаще указывает на политику, активацию или файл. Записывайте контролируемый контекст и восстанавливайте доступный запасной вариант, не выдавая ошибку за сведения о личности или разрешении.
Итог
Web Share: инициированная пользователем передача с условной возможностью без гарантии получателя или доставки. Проверяйте возможность при использовании, сохраняйте кратковременную активацию, валидируйте данные, считайте отмену нормальной и делайте копирование, скачивание или ссылку полноценными запасными вариантами. BotBrowser делает контролируемые проверки повторяемыми, оставляя цель, посредничество браузера, авторизацию и конфиденциальность ответственным системам.
Связанные материалы
- Web Share API и передача по инициативе пользователя
- Отпечаток разрешений браузера
- Поддержка функций браузером и качество функции
Источники
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.