<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>XMLHttpRequest: responseText decoding</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
      function create_html(content) {
        return "<!doctype html><meta charset=windows-1252><x>" + content + "</x>";
      }
      function create_encoded_html(encoded_content) {
        return encodeURIComponent("<!doctype html><meta charset=windows-1252><x>") + encoded_content + encodeURIComponent("<\/x>");
      }
      function create_xml(content) {
        return "<?xml version='1.0' encoding='windows-1252'?><x>" + content + "</x>";
      }
      function create_encoded_xml(encoded_content) {
        return encodeURIComponent("<?xml version='1.0' encoding='windows-1252'?><x>") + encoded_content + encodeURIComponent("<\/x>");
      }
      function request(type, input, output, responseType) {
        async_test((test) => {
          const client = new XMLHttpRequest();
          if (responseType !== undefined) {
            client.responseType = responseType;
          }
          client.open("GET", "resources/status.py?content=" + input + "&type=" + encodeURIComponent(type), true);
          client.onload = test.step_func_done(() => {
            assert_equals(client.responseText, output);
          })
          client.send(null);
        }, document.title + " (" + type + " " + input + " " + (responseType ? " " + responseType : "empty") + ")");
      }

      const encoded_content = "%e6%a9%9f";
      const decoded_as_windows_1252 = "\u00e6\u00a9\u0178";
      const decoded_as_utf_8 = "\u6a5f";
      const encoded_xml = create_encoded_xml(encoded_content);
      const encoded_html = create_encoded_html(encoded_content);
      const xml_decoded_as_windows_1252 = create_xml(decoded_as_windows_1252);
      const xml_decoded_as_utf_8 = create_xml(decoded_as_utf_8);
      const html_decoded_as_windows_1252 = create_html(decoded_as_windows_1252);
      const html_decoded_as_utf_8 = create_html(decoded_as_utf_8);

      // "default" response type
      // An XML-ish response is sniffed.
      request("application/xml", encoded_xml, xml_decoded_as_windows_1252);
      // An HTML-ish response isn't sniffed.
      request("text/html", encoded_html, html_decoded_as_utf_8);
      request("application/xml;charset=utf-8", encoded_xml, xml_decoded_as_utf_8);
      request("application/xml;charset=windows-1252", encoded_xml, xml_decoded_as_windows_1252);
      request("text/html;charset=utf-8", encoded_html, html_decoded_as_utf_8);
      request("text/html;charset=windows-1252", encoded_html, html_decoded_as_windows_1252);
      request("text/plain;charset=windows-1252", "%FF", "\u00FF");
      request("text/plain", "%FF", "\uFFFD");
      request("text/plain", "%FE%FF", "");
      request("text/plain", "%FE%FF%FE%FF", "\uFEFF");
      request("text/plain", "%EF%BB%BF", "");
      request("text/plain", "%EF%BB%BF%EF%BB%BF", "\uFEFF");
      request("text/plain", "%C2", "\uFFFD");
      request("text/xml", "%FE%FF", "");
      request("text/xml", "%FE%FF%FE%FF", "\uFEFF");
      request("text/xml", "%EF%BB%BF", "");
      request("text/xml", "%EF%BB%BF%EF%BB%BF", "\uFEFF");
      request("text/plain", "%E3%81%B2", "\u3072");

      // "text" response type
      // An XML-ish response isn't sniffed.
      request("application/xml", encoded_xml, xml_decoded_as_utf_8, "text");
      // An HTML-ish response isn't sniffed.
      request("text/html", encoded_html, html_decoded_as_utf_8, "text");
      request("application/xml;charset=utf-8", encoded_xml, xml_decoded_as_utf_8, "text");
      request("application/xml;charset=windows-1252", encoded_xml, xml_decoded_as_windows_1252, "text");
      request("text/html;charset=utf-8", encoded_html, html_decoded_as_utf_8, "text");
      request("text/html;charset=windows-1252", encoded_html, html_decoded_as_windows_1252, "text");
      request("text/plain;charset=windows-1252", "%FF", "\u00FF", "text");
      request("text/plain", "%FF", "\uFFFD", "text");
      request("text/plain", "%FE%FF", "", "text");
      request("text/plain", "%FE%FF%FE%FF", "\uFEFF", "text");
      request("text/plain", "%EF%BB%BF", "", "text");
      request("text/plain", "%EF%BB%BF%EF%BB%BF", "\uFEFF", "text");
      request("text/plain", "%C2", "\uFFFD", "text");
      request("text/xml", "%FE%FF", "", "text");
      request("text/xml", "%FE%FF%FE%FF", "\uFEFF", "text");
      request("text/xml", "%EF%BB%BF", "", "text");
      request("text/xml", "%EF%BB%BF%EF%BB%BF", "\uFEFF", "text");
      request("text/plain", "%E3%81%B2", "\u3072", "text");
    </script>
  </body>
</html>
