<html>
<head>
  <title>initial title</title>
  <script>
    var popup, popup2, popup3, popup4;

    // window.open, window.close should be synchronous
    function test1() {
      console.log("test1");
      popup = window.open('title1.html', 'name');
      popup.close();

      popup = window.open('title2.html', 'name', 'width=200,height=200');
      popup.close();
    }

    // Try opening/closing a few windows.
    function test2() {
      console.log("test2");
      openPopups();
      closePopups();
    }

    function test3() {
      console.log("test3");
      openPopups();
      setTimeout(closePopups, 0);
      setTimeout(test4, 1);
    }

    function test4() {
      console.log("test4");
      openPopups();
      setTimeout(closePopupsAndDone, 250);
    }

    function openPopups() {
      console.log("openPopups");
      popup = window.open('title1.html', 'name');
      popup2 = window.open('title1.html', 'name2');
      popup3 = window.open('title1.html', 'name3');
      popup4 = window.open('title1.html', 'name4');
    }

    function closePopups() {
      console.log("closePopups");
      popup.close();
      popup2.close();
      popup3.close();
      popup4.close();
    }

    function closePopupsAndDone() {
      console.log("closePopupsAndDone");
      closePopups();
      document.location = 'title2.html'
    }

    function startTheTest() {
      console.log("startTheTest");
      test1();
      test2();
      test3();
    }
  </script>
</head>
<body onload="startTheTest()">
</body>
</html>
