<!DOCTYPE HTML>
<html>
<head>
  <title>Test for delivering reports</title>
</head>
<body>

<script type="application/javascript">

function ok(a, msg) {
  parent.postMessage({type: "test", check: !!a, msg }, "*");
}

function is(a, b, msg) {
  ok(a === b, msg);
}

function finish() {
  parent.postMessage({type: "finish" }, "*");
}

function checkReport() {
  return new Promise(resolve => {
    let id = setInterval(_ => {
      fetch("delivering.sjs?task=check&min=3")
      .then(r => r.text())
      .then(text => {
        if (text) {
          resolve(JSON.parse(text));
          clearInterval(id);
        }
      });
    }, 1000);
  });
}

function runTests(extraParams = "") {
  // Call a deprecating operation.
  for (let i = 0; i < 100; ++i) {
    new TestingDeprecatedInterface();
  }
  ok(true, "Created a deprecated interface");

  // Check if the report has been received.
  return checkReport()
  .then(reports => {
    is(reports.length, 3, "We have 1 report");

    let report = reports[0];
    is(report.contentType, "application/reports+json", "Correct mime-type");
    is(report.origin, "https://example.org", "Origin correctly set");
    is(report.url, "https://example.org/tests/dom/reporting/tests/delivering.sjs" + extraParams, "URL is correctly set");
    ok(!!report.body, "We have a report.body");
    ok(report.body.age > 0, "Age is correctly set");
    is(report.body.url, window.location.href, "URL is correctly set");
    is(report.body.user_agent, navigator.userAgent, "User-agent matches");
    ok(report.body.type, "deprecation", "Type is fine.");
    ok(!!report.body.body, "We have the real report.body");
    is(report.body.body.id, "DeprecatedTestingInterface", "Correct report.body.id");
    is(report.body.body.message, "TestingDeprecatedInterface is a testing-only interface and this is its testing deprecation message.", "We have a report.body.message");
    is(report.body.body.sourceFile, "https://example.org/tests/dom/reporting/tests/iframe_delivering.html", "report.body.sourceFile");
    is(report.body.body.lineNumber, 40, "report.body.lineNumber");
    is(report.body.body.columnNumber, 4, "report.body.columnNumber");
  });
}

// Let's register a group + endpoint
fetch("delivering.sjs?task=header")
.then(r => r.text())
.then(text => {
  is(text, "OK", "Report-to header sent");
})
.then(_ => {
  return runTests();
})

// Let's register a group + endpoint from a worker
.then(_ => {
  return new Promise(resolve => {
    let w = new Worker("worker_delivering.js");
    w.onmessage = e => resolve();
  });
})
.then(_ => {
  return runTests("&worker=true");
})

.then(finish);

</script>
</body>
</html>
