javascript

Скриншаринг в Chrome – готовимся к getDisplayMedia

  • среда, 27 июня 2018 г. в 00:16:51
https://habr.com/company/Voximplant/blog/415201/
  • JavaScript
  • Google Chrome
  • API
  • Блог компании Voximplant



Chrome Web Store принял решение запретить inline-установку расширений для Chrome. Это напрямую касается WebRTC-приложений, так как сейчас для скриншаринга в Chrome нужно расширение. Придет ли getDisplayMedia API на помощь?

Скриншаринг в Chrome


Когда эта фича появилась в Chrome 33, для ее работы требовалось расширение – чтобы решить проблемы безопасности. Такой способ лучше предыдущего, когда скриншаринг прятали под флаг, из-за чего сайты просили пользователей активировать этот флаг… Что приводило к публичным сообщениям о безопасности.

Chrome не сильно изменился с 2013 года. Требования расширения добавило трудностей в процесс шаринга, но спасибо inline-установке, которая упрощала жизнь:

  • пользователь клацает по кнопке, чтобы начать скриншаринг;
  • веб-приложение определяет, что используется Chrome и что нужное расширение не установлено;
  • веб-приложение запускает inline-установку, успешно резолвит коллбэк;
  • в Chrome всплывает окно выбора, чем именно пользователь хочет поделиться.

Подробности реализации можно посмотреть здесь.

Окно выбора – ключевой элемент здесь. Достаточно ли безопасно использовать его без сети Web Store?


В этом случае шаринг вкладки особенно озадачивает, потому как это нарушает принцип песочницы для “cross-origin” сценариев.

Скриншаринг в Firefox


У Firefox другой подход – белый список сайтов, кому разрешено использовать API. Для попадания в этот список сайт должен сделать запрос в Mozilla и показать, что на нем есть Условия использования сайта (terms of service) и Политика конфиденциальности (privacy policy). Вы можете изменять белый список с помощью расширения. Необходимость такого списка отпала с выходом Firefox 52, когда любому подтвержденному источнику разрешили использовать скриншаринг. Тут все еще не используется новое getDisplayMedia API, про которое мы скоро расскажем, но реализация почти такая же: