<!DOCTYPE html>
<html>
  <head>
    <title>Preflight request must not contain any cookie header</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/common/get-host-info.sub.js"></script>
  </head>
  <body>
    <script type="text/javascript">
    async_test((test) => {
      function setupCookie() {
        const xhr = new XMLHttpRequest;
        // Delete all preexisting cookies and set a cookie named "foo"
        xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
            "/XMLHttpRequest/resources/access-control-cookie.py?cookie_name=foo");
        xhr.withCredentials = true;
        xhr.send();
        xhr.onerror = test.unreached_func("Unexpected error.");
        xhr.onload = test.step_func(() => {
          assert_equals(xhr.status, 200);
          sendPreflightedRequest();
        });
      }

      function sendPreflightedRequest() {
        const xhr = new XMLHttpRequest;
        // Request to server-side file fails if cookie is included in preflight
        xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
          "/XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py");
        xhr.withCredentials = true;
        xhr.setRequestHeader("X-Proprietary-Header", "foo");
        xhr.onerror = test.unreached_func("Unexpected error.");
        xhr.onload = test.step_func(() => {
          assert_equals(xhr.status, 200);
          assert_equals(xhr.responseText, "COOKIE");
          cleanupCookies();
        });
        xhr.send();
      }

      function cleanupCookies() {
        const xhr = new XMLHttpRequest;
        // Delete all cookies
        xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
            "/XMLHttpRequest/resources/access-control-cookie.py");
        xhr.withCredentials = true;
        xhr.send();
        xhr.onerror = test.unreached_func("Unexpected error.");
        xhr.onload = test.step_func_done(() => {});
      }

      setupCookie();
    });
    </script>
  </body>
</html>
