Режим картинка в картинке в Chrome 69

sf_y5jokh493wcz_zmnuczpft38.png


В версии 69 появилось расширение pictureInPicture, которое позволяет вывести видео поверх всех окон. Решил протестировать эту возможность и поделиться результатами.
Сразу нашел пример, но кнопка «картинка в картинке» для переключения в режим Picture-in-Picture (далее PiP) была недоступна, пошел проверять флаг chrome://flags/#enable-picture-in-picture, значение «Default», для этого флага, равносильно «Enabled», но все равно попробовал включить его вручную.

srlx8jvftq3e1eaz1ryy_34-trk.png

Не помогло, оказалось нужен еще один флаг chrome://flags/#enable-surfaces-for-videos, значение «Default» для него равносильно «Disabled».

erh03quifbs1fmvjqauyvqf_6_o.png

Включил и заработало. Так же пишут, что необходимо включение флага #enable-experimental-web-platform-features, но у меня заработало и без него.

roe9ffc30s-vdlrie9l_f5rql4g.png

Пример


Сделаем простой пример, тег , кнопка для включения/выключения режима PiP, обработка доступных событий PiP.



    Chrome 69


    
   
    


Проверяем доступность режима:

if (document.pictureInPictureEnabled){
    //Режим PiP доступен
}


Все просто, если свойство существует, оно возвращает true или false.

Делаем запрос на запуск режима:

button.addEventListener('click', () => {
    video.requestPictureInPicture()
        .then(() => { /**/ })
        .catch(() => { /**/ });
});


Если разрешение получено выполниться then иначе catch. Запрос точно будет отклонен, если не инициирован по событию пользователя.

После запуска document.pictureInPictureElement будет возвращать наш элемент

Для выхода из режима можно в окне PiP нажать крестик в правом верхнем углу.

Можно сделать выход програмно:

button.addEventListener('click', () => {
    if (document.pictureInPictureElement) {
        document.exitPictureInPicture()
            .then(() => { /**/ })
            .catch(() => { /**/ });
    }
});


После выхода из режима document.pictureInPictureElement снова будет возвращать null.

События PiP


Доступно два события, включение режима PiP и соответственно выключение:

video.addEventListener('enterpictureinpicture', () => {
    //режим включен
    button.textContent = 'Отключить PiP';
});
video.addEventListener('leavepictureinpicture', () => {
    //режим отключен
    button.textContent = 'Включить PiP';
});


Резюме


На данный момент, этот режим работает только с тегом , но возможно будет расширен.
Окно PiP появляется в правом нижнем углу, пока что мы не можем на это повлиять.
Режим PiP, несовместим с полноэкранным режимом, либо то либо другое, что вполне логично.
Одновременно может быть только одно окно PiP.

Вкладка, на которой пользователь включил режим PiP, отмечается значком (видно на КДПВ).

© Habrahabr.ru