<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>contentEncoding in resource timing</title>
  <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
  <link rel="help" href="https://www.w3.org/TR/resource-timing-2/#sec-performanceresourcetiming" />
  <script src="/common/get-host-info.sub.js"></script>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script src="resources/entry-invariants.js"></script>
  <script src="resources/resource-loaders.js"></script>
  <script>

    const { ORIGIN, REMOTE_ORIGIN } = get_host_info();

    const run_same_origin_test = (path, contentEncoding) => {
      const url = new URL(path, ORIGIN);
      attribute_test(
        fetch, url,
        entry => {
          assert_equals(entry.contentEncoding, contentEncoding,
            `run_same_origin_test failed, unexpected contentEncoding value.`);
        });
    }

    run_same_origin_test("/resource-timing/resources/compressed-data.py?content_encoding=dcb", "dcb");
    run_same_origin_test("/resource-timing/resources/compressed-data.py?content_encoding=dcz", "dcz");
    run_same_origin_test("/resource-timing/resources/gzip_xml.py", "gzip");
    run_same_origin_test("/resource-timing/resources/foo.text.br", "br");
    run_same_origin_test("/resource-timing/resources/foo.text.gz", "gzip");
    run_same_origin_test("/resource-timing/resources/foo.text.zst", "zstd");
    run_same_origin_test("/resource-timing/resources/compressed-js.py?content_encoding=deflate", "deflate");
    run_same_origin_test("/resource-timing/resources/compressed-js.py?content_encoding=gzip", "gzip");
    // Unrecognized content encoding value should be transformed to "unknown".
    run_same_origin_test("/resource-timing/resources/compressed-js.py?content_encoding=unrecognizedname", "unknown");
    // "identity" is not allowed in response header and should be transformed to "unknown".
    run_same_origin_test("/resource-timing/resources/compressed-js.py?content_encoding=identity", "unknown");
    // Mult-encodinging and formatting tests.
    run_same_origin_test("/resource-timing/resources/content-encoding-headers.py?content_encoding=gzip, deflate,Apple", "multiple");
    run_same_origin_test("/resource-timing/resources/content-encoding-headers.py?content_encoding=gzip, ", "multiple");
    run_same_origin_test("/resource-timing/resources/content-encoding-headers.py?content_encoding=gZip ", "gzip");
    // Empty value test.
    run_same_origin_test("/resource-timing/resources/content-encoding-headers.py?content_encoding=", "");

    const run_cross_origin_test = (path) => {
      const url = new URL(path, REMOTE_ORIGIN);
      attribute_test(
        load.xhr_async, url,
        entry => {
          assert_equals(entry.contentEncoding, "",
            `run_cross_origin_test failed, contentEncoding should be empty.`);
        });
    }

    run_cross_origin_test("/resource-timing/resources/compressed-data.py?content_encoding=dcb");
    run_cross_origin_test("/resource-timing/resources/gzip_xml.py");
    run_cross_origin_test("/resource-timing/resources/compressed-data.py?content_encoding=dcz");
    run_cross_origin_test("/resource-timing/resources/foo.text.br");
    run_cross_origin_test("/resource-timing/resources/foo.text.gz");
    run_cross_origin_test("/resource-timing/resources/foo.text.zst");
    run_cross_origin_test("/resource-timing/resources/compressed-js.py?content_encoding=deflate");
    run_cross_origin_test("/resource-timing/resources/compressed-js.py?content_encoding=gzip");

    const run_cross_origin_allowed_test = (path, contentEncoding) => {
      const url = new URL(path, REMOTE_ORIGIN);
      url.searchParams.set("allow_origin", ORIGIN);
      attribute_test(
        load.xhr_async, url,
        entry => {
          assert_equals(entry.contentEncoding, contentEncoding,
            `run_cross_origin_allowed_test failed, unexpected contentEncoding value.`);
        });
    }

    run_cross_origin_allowed_test("/resource-timing/resources/compressed-data.py?content_encoding=dcb", "dcb");
    run_cross_origin_allowed_test("/resource-timing/resources/compressed-data.py?content_encoding=dcz", "dcz");
    run_cross_origin_allowed_test("/resource-timing/resources/gzip_xml.py", "gzip");
    run_cross_origin_allowed_test("/resource-timing/resources/compressed-js.py?content_encoding=deflate", "deflate");
    run_cross_origin_allowed_test("/resource-timing/resources/compressed-js.py?content_encoding=gzip", "gzip");

    // Content-Encoding for iframes is empty when cross origin redirects are present.
    const multiRedirect = new URL(`${ORIGIN}/resource-timing/resources/multi_redirect.py`);
    multiRedirect.searchParams.append("page_origin", ORIGIN);
    multiRedirect.searchParams.append("cross_origin", REMOTE_ORIGIN);
    multiRedirect.searchParams.append("final_resource", "/resource-timing/resources/compressed-js.py?content_encoding=gzip");
    attribute_test(load.iframe, multiRedirect, (entry) => {
      assert_equals(entry.contentEncoding, "",
        `content-encoding should be empty for iframes having cross origin redirects`);
    });


    // Content-Encoding for iframes is exposed for same origin redirects.
    const redirectCORS = new URL(`${ORIGIN}/resource-timing/resources/redirect-cors.py`);
    const dest = `${ORIGIN}/resource-timing/resources/compressed-js.py?content_encoding=gzip`;
    redirectCORS.searchParams.append("location", dest)
    attribute_test(load.iframe, redirectCORS, (entry) => {
      assert_equals(entry.contentEncoding, "gzip",
        `content-encoding should be exposed for iframes having only same origin redirects`);
    });

  </script>
</head>

<body>
  <h1>
    Description</h1>
  <p>
    This test validates contentEncoding in resource timing.</p>
</body>

</html>
