<!DOCTYPE html>
<meta name="timeout" content="long">
<!-- user agents are not required to support open features other than `noopener`
     and on some platforms position and size features don't make sense -->
<meta name="flags" content="may">
<title>Window Management test: Fullscreen Companion Window</title>
<link rel="help" href="https://w3c.github.io/window-management/">
Tests use of multi-screen details to enter fullscreen and open a 'companion'
popup window in the same user activation.<br>
The host device must have 2+ screens to yield meaningful results.<br><br>
<button id="closeButton" onclick="closePopups">Close popups</button><br>
<input id="autoClose" type="checkbox" checked=true>Auto-close popups</input>
<ul id="list"></ul>
<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/helpers.js"></script>
<script>
'use strict';

let popups = [];
function closePopups() {
  popups.forEach(p => p.close());
  popups = [];
}

promise_test(async setUpTest => {
  await setUpWindowManagement(setUpTest);
  const screens = window.screenDetails.screens;
  const originalScreen = window.screenDetails.currentScreen;
  for (const [i, screenA] of screens.entries()) {
    const screenB = screens[(i + 1) % screens.length];
    let name = `Fullscreen on '${screenA.label}'; popup on '${screenB.label}'`;
    promise_test(async test => {
      await buttonClick(test, name);
      await document.documentElement.requestFullscreen({ screen: screenA });
      await assertWindowOnScreen(window, screenA);
      // Expect the popup to open if multiple screens are available.
      const assertPlacement = screens.length > 1;
      const popup = await openPopupOnScreen(screenB, assertPlacement);
      if (!!popup)
        popups.push(popup);
      // Exit fullscreen; `window` should move back to `originalScreen`.
      await buttonClick(test, `Exit fullscreen`);
      await document.exitFullscreen();
      await assertWindowOnScreen(window, originalScreen);
      assert_false(!!document.fullscreenElement);
      if (autoClose.checked)
        closePopups();
    }, name);
  }
}, 'Enter fullscreen and open a popup from one transient activation.');
</script>
