<script src="/common/get-host-info.sub.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/test-helpers.sub.js?pipe=sub"></script>
<script>
var host_info = get_host_info();

function get_boundary(headers) {
  var reg = new RegExp('multipart\/form-data; boundary=(.*)');
  for (var i = 0; i < headers.length; ++i) {
    if (headers[i][0] != 'content-type') {
      continue;
    }
    var regResult = reg.exec(headers[i][1]);
    if (!regResult) {
      continue;
    }
    return regResult[1];
  }
  return '';
}

function xhr_send(url_base, method, data, with_credentials) {
  return new Promise(function(resolve, reject) {
      var xhr = new XMLHttpRequest();
      xhr.onload = function() {
        resolve(JSON.parse(xhr.response));
      };
      xhr.onerror = function() {
        reject('XHR should succeed.');
      };
      xhr.responseType = 'text';
      if (with_credentials) {
        xhr.withCredentials = true;
      }
      xhr.open(method, url_base + '/dummy?test', true);
      xhr.send(data);
    });
}

function get_sorted_header_name_list(headers) {
  var header_names = [];
  var idx, name;

  for (idx = 0; idx < headers.length; ++idx) {
    name = headers[idx][0];
    // The `Accept-Language` header is optional; its presence should not
    // influence test results.
    //
    // > 4. If request’s header list does not contain `Accept-Language`, user
    // >    agents should append `Accept-Language`/an appropriate value to
    // >    request's header list.
    //
    // https://fetch.spec.whatwg.org/#fetching
    if (name === 'accept-language') {
      continue;
    }

    header_names.push(name);
  }
  header_names.sort();
  return header_names;
}

function get_header_test() {
  return xhr_send(host_info['HTTPS_ORIGIN'], 'GET', '', false)
    .then(function(response) {
        assert_array_equals(
          get_sorted_header_name_list(response.headers),
          ["accept"],
          'event.request has the expected headers for same-origin GET.');
      });
}

function post_header_test() {
  return xhr_send(host_info['HTTPS_ORIGIN'], 'POST', '', false)
    .then(function(response) {
        assert_array_equals(
          get_sorted_header_name_list(response.headers),
          ["accept", "content-type"],
          'event.request has the expected headers for same-origin POST.');
      });
}

function cross_origin_get_header_test() {
  return xhr_send(host_info['HTTPS_REMOTE_ORIGIN'], 'GET', '', false)
    .then(function(response) {
        assert_array_equals(
          get_sorted_header_name_list(response.headers),
          ["accept"],
          'event.request has the expected headers for cross-origin GET.');
      });
}

function cross_origin_post_header_test() {
  return xhr_send(host_info['HTTPS_REMOTE_ORIGIN'], 'POST', '', false)
    .then(function(response) {
        assert_array_equals(
          get_sorted_header_name_list(response.headers),
          ["accept", "content-type"],
          'event.request has the expected headers for cross-origin POST.');
      });
}

function string_test() {
  return xhr_send(host_info['HTTPS_ORIGIN'], 'POST', 'test string', false)
    .then(function(response) {
        assert_equals(response.method, 'POST');
        assert_equals(response.body, 'test string');
      });
}

function blob_test() {
  return xhr_send(host_info['HTTPS_ORIGIN'], 'POST', new Blob(['test blob']),
                  false)
    .then(function(response) {
        assert_equals(response.method, 'POST');
        assert_equals(response.body, 'test blob');
      });
}

function custom_method_test() {
  return xhr_send(host_info['HTTPS_ORIGIN'], 'XXX', 'test string xxx', false)
    .then(function(response) {
        assert_equals(response.method, 'XXX');
        assert_equals(response.body, 'test string xxx');
      });
}

function options_method_test() {
  return xhr_send(host_info['HTTPS_ORIGIN'], 'OPTIONS', 'test string xxx', false)
    .then(function(response) {
        assert_equals(response.method, 'OPTIONS');
        assert_equals(response.body, 'test string xxx');
      });
}

function form_data_test() {
    var formData = new FormData();
    formData.append('sample string', '1234567890');
    formData.append('sample blob', new Blob(['blob content']));
    formData.append('sample file', new File(['file content'], 'file.dat'));
    return xhr_send(host_info['HTTPS_ORIGIN'], 'POST', formData, false)
    .then(function(response) {
        assert_equals(response.method, 'POST');
        var boundary = get_boundary(response.headers);
        var expected_body =
          '--' + boundary + '\r\n' +
          'Content-Disposition: form-data; name="sample string"\r\n' +
          '\r\n' +
          '1234567890\r\n' +
          '--' + boundary + '\r\n' +
          'Content-Disposition: form-data; name="sample blob"; ' +
          'filename="blob"\r\n' +
          'Content-Type: application/octet-stream\r\n' +
          '\r\n' +
          'blob content\r\n' +
          '--' + boundary + '\r\n' +
          'Content-Disposition: form-data; name="sample file"; ' +
          'filename="file.dat"\r\n' +
          'Content-Type: application/octet-stream\r\n' +
          '\r\n' +
          'file content\r\n' +
          '--' + boundary + '--\r\n';
        assert_true(response.body === expected_body, "form data response content is as expected");
      });
}

function mode_credentials_test() {
  return xhr_send(host_info['HTTPS_ORIGIN'], 'GET', '', false)
    .then(function(response){
        assert_equals(response.mode, 'cors');
        assert_equals(response.credentials, 'same-origin');
        return xhr_send(host_info['HTTPS_ORIGIN'], 'GET', '', true);
      })
    .then(function(response){
        assert_equals(response.mode, 'cors');
        assert_equals(response.credentials, 'include');
        return xhr_send(host_info['HTTPS_REMOTE_ORIGIN'], 'GET', '', false);
      })
    .then(function(response){
        assert_equals(response.mode, 'cors');
        assert_equals(response.credentials, 'same-origin');
        return xhr_send(host_info['HTTPS_REMOTE_ORIGIN'], 'GET', '', true);
      })
    .then(function(response){
        assert_equals(response.mode, 'cors');
        assert_equals(response.credentials, 'include');
      });
}

function data_url_test() {
  return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.onload = function() {
          resolve(xhr.response);
        };
        xhr.onerror = function() {
          reject('XHR should succeed.');
        };
        xhr.responseType = 'text';
        xhr.open('GET', 'data:text/html,Foobar', true);
        xhr.send();
      })
    .then(function(data) {
        assert_equals(data, 'Foobar');
      });
}
</script>
