<!DOCTYPE html>
<title>Test leavepictureinpicture event</title>
<meta name="timeout" content="long">
<script src="/common/media.js"></script>
<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 => {
  let pictureInPictureWindow;
  const video = await loadVideo();

  video.addEventListener('enterpictureinpicture', t.step_func_done(event => {
    pictureInPictureWindow = event.pictureInPictureWindow;
  }));

  video.addEventListener('leavepictureinpicture', t.step_func_done(event => {
    assert_equals(pictureInPictureWindow, event.pictureInPictureWindow);

    assert_equals(event.target, video);
    assert_equals(event.bubbles, true);
    assert_equals(event.cancelable, false);
    assert_equals(event.composed, false);
    assert_equals(document.pictureInPictureElement, null);
  }));

  return requestPictureInPictureWithTrustedClick(video)
  .then(() => document.exitPictureInPicture());
}, 'leavepictureinpicture event is fired if document.exitPictureInPicture');

promise_test(async t => {
  let pictureInPictureWindow;
  const video = await loadVideo();

  video.addEventListener('enterpictureinpicture', t.step_func_done(event => {
    pictureInPictureWindow = event.pictureInPictureWindow;
  }));

  video.addEventListener('leavepictureinpicture', t.step_func_done(event => {
    assert_equals(pictureInPictureWindow, event.pictureInPictureWindow);
    assert_equals(event.target, video);
    assert_equals(event.bubbles, true);
    assert_equals(event.cancelable, false);
    assert_equals(event.composed, false);
    assert_equals(document.pictureInPictureElement, null);
  }));

  return requestPictureInPictureWithTrustedClick(video)
  .then(() => {
    video.disablePictureInPicture = true;
  });
}, 'leavepictureinpicture event is fired if video.disablePictureInPicture is set to true');
</script>
