| <!DOCTYPE html> |
| <title>Test request Picture-in-Picture</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| <script src="resources/picture-in-picture-helpers.js"></script> |
| <body></body> |
| <script> |
| promise_test(async t => { |
| const video = await loadVideo(); |
| return requestPictureInPictureWithTrustedClick(video); |
| }, 'request Picture-in-Picture resolves on user click'); |
| |
| promise_test(t => { |
| const video = document.createElement('video'); |
| return promise_rejects(t, 'InvalidStateError', |
| requestPictureInPictureWithTrustedClick(video)); |
| }, 'request Picture-in-Picture requires loaded metadata for the video element'); |
| |
| promise_test(async t => { |
| const video = document.createElement('video'); |
| await new Promise(resolve => { |
| video.src = '/media/sound_5.oga'; |
| video.onloadeddata = resolve; |
| }).then(() => { |
| return promise_rejects(t, 'InvalidStateError', |
| requestPictureInPictureWithTrustedClick(video)); |
| }) |
| }, 'request Picture-in-Picture requires video track for the video element'); |
| |
| promise_test(async t => { |
| const video = await loadVideo(); |
| return promise_rejects(t, 'NotAllowedError', video.requestPictureInPicture()); |
| }, 'request Picture-in-Picture requires a user gesture'); |
| |
| promise_test(async t => { |
| const video1 = await loadVideo(); |
| const video2 = await loadVideo(); |
| return callWithTrustedClick(() => { |
| const first = video1.requestPictureInPicture(); |
| const second = video2.requestPictureInPicture(); |
| return Promise.all([ |
| first, |
| promise_rejects(t, 'NotAllowedError', second) |
| ]); |
| }); |
| }, 'request Picture-in-Picture consumes user gesture'); |
| </script> |