<!DOCTYPE html>
<html>
<head>
  <script>
    function loadFrames() {
      window.A = document.getElementById('A').contentWindow;
      window.B = document.getElementById('B').contentWindow;
      window.C = document.getElementById('C').contentWindow;
      window.D = document.getElementById('D').contentWindow;

      var path = location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/frame.html';
      A.location = 'frame.html';
      B.location = '//{{domains[www2]}}:' + location.port + path;
      C.location = '//{{domains[www2]}}:' + location.port + path;
      D.location = '//{{domains[www1]}}:' + location.port + path;

      var loadCount = 0;
      function frameLoaded() {
        if (++loadCount == 4)
          go();
      }
      Array.forEach(document.getElementsByTagName('iframe'), function(ifr) { ifr.onload = frameLoaded; });
    }


    var results = [];
    function assert(cond, msg) {
      results.push({pass: !!cond, message: msg});
    }

    function go() {
      window.onmessage = function() {
        assert(B.checkWindowReferences(), "B's Window references are still self-consistent after document.domain");
        for (var i = 0; i < window.length; ++i) {
          assert(window[i] === B.windowReferences[i],
                 "Window reference " + i + " consistent between globals after document.domain");
          assert(window[i].location === B.locationReferences[i],
                 "Location reference " + i + " consistent between globals after document.domain");
        }
        opener.postMessage(results, '*');
      };
      A.document.domain = A.document.domain;
      document.domain = document.domain;
      B.postMessage('', '*');
    }

  </script>
</head>
<body onload="loadFrames()">
  <iframe id="A"></iframe>
  <iframe id="B"></iframe>
  <iframe id="C"></iframe>
  <iframe id="D"></iframe>
</body>
</html>
