<!DOCTYPE html>
<title>Clicking on the overflow closed captions button shows the closed captions menu.</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="media-controls.js"></script>
<script src="overflow-menu.js"></script>

<!--Padding ensures the overflow menu is visible for the tests. -->
<body style="padding-top: 200px; padding-left: 100px">
<video controls></video>
<script>
async_test(function(t) {
  // Set up video
  var video = document.querySelector("video");
  video.src = "content/test.ogv";
  video.setAttribute("width", "60");
  video.setAttribute("height", "100");
  // Add captions
  var track = video.addTextTrack("captions");

  video.onloadeddata = t.step_func_done(function() {
    var overflowList = getOverflowList(video);
    var overflowMenu = getOverflowMenuButton(video);

    // Get the menu that displays the list of text tracks
   var captionsList = mediaControlsElement(internals.shadowRoot(video).firstChild, "-internal-media-controls-text-track-list");

    // Initially the list should not be visible
    assert_equals(getComputedStyle(captionsList).display, "none");

    // Click on the overflow menu button
    var coords = elementCoordinates(overflowMenu);
    clickAtCoordinates(coords[0], coords[1]);

    // Click on the closed captions button
    var coords = elementCoordinates(overflowList.children[OverflowMenuButtons.CLOSED_CAPTIONS]);
    clickAtCoordinates(coords[0], coords[1]);

    // Click on anywhere outside the closed captions list will close the list
    var coords = coordinatesOutsideElement(captionsList);
    clickAtCoordinates(coords[0], coords[1]);
    assert_equals(getComputedStyle(captionsList).display, "none");
  });
});
</script>
</body>
