1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
content / test / data / media / picture_in_picture / one-video.html [blame]
<!DOCTYPE html>
<html>
<body>
<video src="../tulip2.webm" loop=true />
</body>
<script>
const video = document.querySelector('video');
function addPictureInPictureEventListeners() {
video.addEventListener('enterpictureinpicture', _ => {
document.title = 'enterpictureinpicture';
});
video.addEventListener('leavepictureinpicture', _ => {
document.title = 'leavepictureinpicture';
});
}
function addPlayEventListener() {
video.addEventListener('play', _ => {
document.title = 'play';
}, { once: true });
}
function addPauseEventListener() {
video.addEventListener('pause', _ => {
document.title = 'pause';
}, { once: true });
}
async function play() {
await video.play();
return true;
}
async function playToEnd() {
video.loop = false;
await video.play();
video.currentTime = video.duration;
await _waitForEnded();
return true;
}
function _waitForEnded() {
return new Promise(resolve => {
if (video.ended) {
resolve();
return;
}
video.addEventListener('ended', _ => {
resolve();
}, { once: true });
});
}
async function updateVideoSrcAndPlay() {
video.src = "../tulip2.webm";
await video.play();
return true;
}
async function resetVideo() {
video.src = "";
await _waitForEmptied();
return true;
}
function _waitForEmptied() {
return new Promise((resolve, _) => {
if (video.networkState == HTMLMediaElement.NETWORK_EMPTY) {
resolve();
return;
}
video.addEventListener('emptied', _ => {
resolve();
}, { once: true });
});
}
async function enterPictureInPicture() {
await _waitForMetadata();
await video.requestPictureInPicture();
return true;
}
function _waitForMetadata() {
return new Promise(resolve => {
if (video.readyState >= HTMLMediaElement.HAVE_METADATA) {
resolve();
return;
}
video.addEventListener('loadedmetadata', _ => {
resolve();
}, { once: true });
});
}
async function enterFullscreen() {
await video.requestFullscreen();
return true;
}
function setMediaSessionPlayActionHandler() {
navigator.mediaSession.setActionHandler("play", _ => {
video.play();
});
}
function setMediaSessionPauseActionHandler() {
navigator.mediaSession.setActionHandler("pause", _ => {
video.pause();
});
}
function setMediaSessionNextTrackActionHandler() {
navigator.mediaSession.setActionHandler("nexttrack", _ => {
// Simulates a playlist functionality (in this case the playlist has
// just one item).
video.src = "../tulip2.webm";
video.play();
});
}
</script>
</html>