<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>SendBeacon Content-Type header</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>
const RESOURCES_DIR = "/beacon/resources/";

function testContentTypeHeader(what, contentType, title) {
  function wait(ms) {
    return new Promise(resolve => step_timeout(resolve, ms));
  }
  promise_test(async t => {
    const id = self.token();
    const testUrl = new Request(RESOURCES_DIR + "content-type.py?cmd=put&id=" + id).url;
    assert_equals(performance.getEntriesByName(testUrl).length, 0);
    assert_true(navigator.sendBeacon(testUrl, what), "SendBeacon Succeeded");

    do {
      await wait(50);
    } while (performance.getEntriesByName(testUrl).length === 0);
    assert_equals(performance.getEntriesByName(testUrl).length, 1);
    const checkUrl = RESOURCES_DIR + "content-type.py?cmd=get&id=" + id;
    const response = await fetch(checkUrl);
    const text = await response.text();
    if (contentType === "multipart/form-data") {
      assert_true(text.startsWith(contentType), "Correct Content-Type header result");
    } else {
      assert_equals(text, contentType, "Correct Content-Type header result");
    }
  }, "Test content-type header for a body " + title);
}

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;
}

function stringToArrayBuffer(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 buffer;
}

function stringToBlob(input) {
  return new Blob([input], {type: "text/plain"});
}

function stringToFormData(input) {
  var formdata = new FormData();
  formdata.append(input, new Blob(['hi']));
  return formdata;
}

function stringToURLSearchParams(input)
{
  return new URLSearchParams(input);
}

testContentTypeHeader("hi!", "text/plain;charset=UTF-8", "string");
testContentTypeHeader(stringToArrayBufferView("123"), "", "ArrayBufferView");
testContentTypeHeader(stringToArrayBuffer("123"), "", "ArrayBuffer");
testContentTypeHeader(stringToBlob("123"), "text/plain", "Blob");
testContentTypeHeader(stringToFormData("qwerty"), "multipart/form-data", "FormData");
testContentTypeHeader(stringToURLSearchParams("key1=value1&key2=value2"), "application/x-www-form-urlencoded;charset=UTF-8", "URLSearchParams");
    </script>
  </body>
</html>
