<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>SendBeacon cross origin with an ArrayBuffer / ArrayBufferView payload should not do a CORS preflight</title>
    <script src=/resources/testharness.js></script>
    <script src=/resources/testharnessreport.js></script>
  </head>
  <body>
    <script src="/common/utils.js"></script>
    <script src="/common/get-host-info.sub.js"></script>
    <script>
var RESOURCES_DIR = "/WebKit/beacon/resources/";

function pollResult(test, id) {
  var checkUrl = RESOURCES_DIR + "beacon-preflight.py?cmd=get&id=" + id;

  return new Promise(resolve => {
    step_timeout(test.step_func(() => {
      fetch(checkUrl).then(response => {
        response.json().then(body => {
          resolve(body);
        });
      });
    }), 1000);
  });
}

function testCORSPreflightSuccess(what) {
  var testBase = get_host_info().HTTP_REMOTE_ORIGIN + RESOURCES_DIR;
  var id = self.token();
  var testUrl = testBase + "beacon-preflight.py?allowCors=1&cmd=put&id=" + id;

  promise_test(function(test) {
    assert_true(navigator.sendBeacon(testUrl, what), "SendBeacon Succeeded");
    return pollResult(test, id) .then(result => {
      assert_equals(result['preflight'], 0, "Did not receive CORS preflight")
      assert_equals(result['beacon'], 1, "Received beacon")
    });
  }, "Should send beacon with no CORS preflight");
}

function stringToArrayBufferView(input) {
  var buffer = new ArrayBuffer(input.length * 2);
  var view = new Uint16Array(buffer);

  // dumbly copy over the bytes
  for (var i = 0, len = input.length; i < len; i++) {
    view[i] = input.charCodeAt(i);
  }
  return view;
}

testCORSPreflightSuccess(stringToArrayBufferView("123"));
    </script>
  </body>
</html>
