<!DOCTYPE html>
<meta charset="utf-8">
<title>Service Worker: XHR responseURL uses the response url</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
const scope = 'resources/xhr-iframe.html';
const script = 'resources/xhr-response-url-worker.js';
let iframe;

function build_url(options) {
  const url = new URL('test', window.location);
  const opts = options ? options : {};
  if (opts.respondWith)
    url.searchParams.set('respondWith', opts.respondWith);
  if (opts.url)
    url.searchParams.set('url', opts.url.href);
  return url.href;
}

promise_test(async (t) => {
  const registration =
      await service_worker_unregister_and_register(t, script, scope);
  await wait_for_state(t, registration.installing, 'activated');
  iframe = await with_iframe(scope);
}, 'global setup');

// Test that XMLHttpRequest.responseURL uses the response URL from the service
// worker.
promise_test(async (t) => {
  // Build a URL that tells the service worker to respondWith(fetch(|target|)).
  const target = new URL('resources/dummy.txt', window.location);
  const url = build_url({
    respondWith: 'fetch',
    url: target
  });

  // Perform the XHR.
  const xhr = await iframe.contentWindow.xhr(url);
  assert_equals(xhr.responseURL, target.href, 'responseURL');
}, 'XHR responseURL should be the response URL');

// Same as above with a generated response.
promise_test(async (t) => {
  // Build a URL that tells the service worker to respondWith(new Response()).
  const url = build_url({respondWith: 'string'});

  // Perform the XHR.
  const xhr = await iframe.contentWindow.xhr(url);
  assert_equals(xhr.responseURL, url, 'responseURL');
}, 'XHR responseURL should be the response URL (generated response)');

// Test that XMLHttpRequest.responseXML is a Document whose URL is the
// response URL from the service worker.
promise_test(async (t) => {
  // Build a URL that tells the service worker to respondWith(fetch(|target|)).
  const target = new URL('resources/blank.html', window.location);
  const url = build_url({
    respondWith: 'fetch',
    url: target
  });

  // Perform the XHR.
  const xhr = await iframe.contentWindow.xhr(url, {responseType: 'document'});
  assert_equals(xhr.responseURL, target.href, 'responseURL');

  // The document's URL uses the response URL:
  // "Set |document|’s URL to |response|’s url."
  // https://xhr.spec.whatwg.org/#document-response
  assert_equals(xhr.responseXML.URL, target.href, 'responseXML.URL');

  // The document's base URL falls back to the document URL:
  // https://html.spec.whatwg.org/multipage/urls-and-fetching.html#document-base-url
  assert_equals(xhr.responseXML.baseURI, target.href, 'responseXML.baseURI');
}, 'XHR Document should use the response URL');

// Same as above with a generated response from the service worker.
promise_test(async (t) => {
  // Build a URL that tells the service worker to
  // respondWith(new Response()) with a document response.
  const url = build_url({respondWith: 'document'});

  // Perform the XHR.
  const xhr = await iframe.contentWindow.xhr(url, {responseType: 'document'});
  assert_equals(xhr.responseURL, url, 'responseURL');

  // The document's URL uses the response URL, which is the request URL:
  // "Set |document|’s URL to |response|’s url."
  // https://xhr.spec.whatwg.org/#document-response
  assert_equals(xhr.responseXML.URL, url, 'responseXML.URL');

  // The document's base URL falls back to the document URL:
  // https://html.spec.whatwg.org/multipage/urls-and-fetching.html#document-base-url
  assert_equals(xhr.responseXML.baseURI, url, 'responseXML.baseURI');
}, 'XHR Document should use the response URL (generated response)');

promise_test(async (t) => {
  if (iframe)
    iframe.remove();
  await service_worker_unregister(t, scope);
}, 'global cleanup');
</script>
