<!DOCTYPE html>
<title>Test for Picture-In-Picture and Shadow DOM</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>
<script src="../shadow-dom/resources/shadow-dom.js"></script>
<style>
  #host2 { color: rgb(0, 0, 254); }
  #host2:picture-in-picture { color: rgb(0, 0, 255); }
</style>
<body>
<div id='host'>
  <template data-mode='open' id='root'>
    <slot></slot>
  </template>
  <div id='host2'>
    <template data-mode='open' id='root2'>
      <style>
        #host3 { color: rgb(0, 0, 127); }
        #host3:picture-in-picture { color: rgb(0, 0, 128); }
      </style>
      <div id='host3'>
        <template data-mode='open' id='root3'>
          <style>
            video { color: rgb(0, 254, 0); }
            video:picture-in-picture { color: rgb(0, 255, 0); }
          </style>
          <video id='video'></video>
          <div id='host4'>
            <template data-mode='open' id='root4'>
              <div></div>
            </template>
          </div>
        </template>
      </div>
      <div id='host5'>
        <template data-mode='open' id='root5'>
          <div></div>
        </template>
      </div>
    </template>
  </div>
</div>
</body>
<script>
promise_test(async t => {
  const ids = createTestTree(host);
  document.body.appendChild(ids.host);

  assert_equals(document.pictureInPictureElement, null);
  assert_equals(ids.root.pictureInPictureElement, null);
  assert_equals(ids.root2.pictureInPictureElement, null);
  assert_equals(ids.root3.pictureInPictureElement, null);
  assert_equals(ids.root4.pictureInPictureElement, null);
  assert_equals(ids.root5.pictureInPictureElement, null);

  assert_equals(getComputedStyle(ids.video).color, 'rgb(0, 254, 0)');
  assert_equals(getComputedStyle(ids.host3).color, 'rgb(0, 0, 127)');
  assert_equals(getComputedStyle(ids.host2).color, 'rgb(0, 0, 254)');

  await new Promise(resolve => {
    ids.video.src = getVideoURI('/media/movie_5');
    ids.video.onloadeddata = resolve;
  })
  .then(() => requestPictureInPictureWithTrustedClick(ids.video))
  .then(() => {
    assert_equals(document.pictureInPictureElement, ids.host2);
    assert_equals(ids.root.pictureInPictureElement, null);
    assert_equals(ids.root2.pictureInPictureElement, ids.host3);
    assert_equals(ids.root3.pictureInPictureElement, ids.video);
    assert_equals(ids.root4.pictureInPictureElement, null);
    assert_equals(ids.root5.pictureInPictureElement, null);

    assert_equals(getComputedStyle(ids.video).color, 'rgb(0, 255, 0)');
    assert_equals(getComputedStyle(ids.host3).color, 'rgb(0, 0, 127)');
    assert_equals(getComputedStyle(ids.host2).color, 'rgb(0, 0, 254)');
  })
  .then(() => document.exitPictureInPicture())
  .then(() => {
    assert_equals(getComputedStyle(ids.video).color, 'rgb(0, 254, 0)');
    assert_equals(getComputedStyle(ids.host3).color, 'rgb(0, 0, 127)');
    assert_equals(getComputedStyle(ids.host2).color, 'rgb(0, 0, 254)');
  });
});
</script>
