<!DOCTYPE html>
<title>Test disable Picture-in-Picture</title>
<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>
test(t => {
  const video = document.createElement('video');
  assert_false(video.disablePictureInPicture); // default value

  video.setAttribute('disablepictureinpicture', 'foo');
  assert_true(video.disablePictureInPicture);

  video.removeAttribute('disablepictureinpicture');
  assert_false(video.disablePictureInPicture);

  video.disablePictureInPicture = true;
  assert_equals(video.getAttribute('disablepictureinpicture'), '');

  video.disablePictureInPicture = false;
  assert_equals(video.getAttribute('disablepictureinpicture'), null);
}, 'Test disablePictureInPicture IDL attribute');

promise_test(async t => {
  const video = await loadVideo();
  video.disablePictureInPicture = true;
  return promise_rejects_dom(t, 'InvalidStateError',
      requestPictureInPictureWithTrustedClick(video));
}, 'Request Picture-in-Picture rejects if disablePictureInPicture is true');

promise_test(async t => {
  const video = await loadVideo();
  await test_driver.bless('request Picture-in-Picture');
  const promise = video.requestPictureInPicture();
  video.disablePictureInPicture = true;
  await promise_rejects_dom(t, 'InvalidStateError', promise);
  assert_equals(document.pictureInPictureElement, null);
}, 'Request Picture-in-Picture rejects if disablePictureInPicture becomes ' +
   'true before promise resolves.');

promise_test(async t => {
  const video = await loadVideo();
  return requestPictureInPictureWithTrustedClick(video)
  .then(() => {
    video.disablePictureInPicture = true;
    video.addEventListener('leavepictureinpicture', t.step_func(() => {
      assert_equals(document.pictureInPictureElement, null);
    }));
  });
}, 'pictureInPictureElement is unset if disablePictureInPicture becomes true');

promise_test(async t => {
  const video = await loadVideo();
  return requestPictureInPictureWithTrustedClick(video)
  .then(() => {
    video.disablePictureInPicture = false;
    assert_equals(document.pictureInPictureElement, video);
  });
}, 'pictureInPictureElement is unchanged if disablePictureInPicture becomes false');

promise_test(async t => {
  const video = await loadVideo();
  return requestPictureInPictureWithTrustedClick(video)
  .then(() => {
    document.createElement('video').disablePictureInPicture = true;
    assert_equals(document.pictureInPictureElement, video);
  });
}, 'pictureInPictureElement is unchanged if disablePictureInPicture becomes ' +
   'true for another video');
</script>
