<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
function resourceUrl(path) {
    return "https://{{host}}:{{ports[https][0]}}" + base_path() + path;
}

function crossOriginUrl(path) {
    return "https://{{hosts[alt][]}}:{{ports[https][0]}}" + base_path() + path;
}

function verify(options) {
    const url = options.mode === 'cross-origin' ? crossOriginUrl(options.resource)
                                      : resourceUrl(options.resource);
    const entryList = options.performance.getEntriesByName(url, 'resource');
    if (options.should_no_performance_entry) {
        // The performance timeline may not have an entry for a resource
        // which failed to load.
        assert_equals(entryList.length, 0, options.description);
        return;
    }
    assert_equals(entryList.length, 1, options.description);
    const entry = entryList[0];
    assert_equals(entry.entryType, 'resource', options.description);
    assert_greater_than(entry.workerStart, 0, options.description);
    assert_greater_than_equal(entry.workerStart, entry.startTime, options.description);
    assert_less_than_equal(entry.workerStart, entry.fetchStart, options.description);
    if (options.mode === 'cross-origin') {
      assert_equals(entry.responseStart, 0, options.description);
      assert_greater_than_equal(entry.responseEnd, entry.fetchStart, options.description);
    } else {
      assert_greater_than_equal(entry.responseStart, entry.fetchStart, options.description);
      assert_greater_than_equal(entry.responseEnd, entry.responseStart, options.description);
    }
    assert_greater_than(entry.responseEnd, entry.fetchStart, options.description);
    assert_greater_than(entry.duration, 0, options.description);
    if (options.resource.indexOf('redirect.py') != -1) {
        assert_less_than_equal(entry.workerStart, entry.redirectStart,
                               options.description);
    } else {
        assert_equals(entry.redirectStart, 0, options.description);
    }
}

promise_test(function(t) {
    const worker_url = 'resources/resource-timing-worker.js';
    const scope = 'resources/resource-timing-iframe.sub.html';
    let registration;

    return service_worker_unregister_and_register(t, worker_url, scope)
      .then(function(r) {
          registration = r;
          return wait_for_state(t, r.installing, 'activated');
        })
      .then(function() {
          return with_iframe(scope);
        })
      .then(function(frame) {
          const performance = frame.contentWindow.performance;
          verify({
              performance: performance,
              resource: 'resources/dummy.js',
              mode: 'same-origin',
              description: 'Generated response',
          });
          verify({
              performance: performance,
              resource: 'resources/empty.js',
              mode: 'same-origin',
              description: 'Network fallback',
          });
          verify({
              performance: performance,
              resource: 'resources/redirect.py?Redirect=empty.js',
              mode: 'same-origin',
              description: 'Redirect',
          });
          verify({
              performance: performance,
              resource: 'resources/square.png',
              mode: 'same-origin',
              description: 'Network fallback image',
          });
          // Test that worker start is available on cross-origin no-cors
          // subresources.
          verify({
              performance: performance,
              resource: 'resources/square.png',
              mode: 'cross-origin',
              description: 'Network fallback cross-origin image',
          });

          // Tests for resouces which failed to load.
          verify({
              performance: performance,
              resource: 'resources/missing.jpg',
              mode: 'same-origin',
              description: 'Network fallback load failure',
              should_no_performance_entry: true,
          });
          verify({
              performance: performance,
              resource: 'resources/missing.jpg',
              mode: 'cross-origin',
              description: 'Network fallback cross-origin load failure',
              should_no_performance_entry: true,
          });
          // Tests for respondWith(fetch()).
          verify({
              performance: performance,
              resource: 'resources/missing.jpg?SWRespondsWithFetch',
              mode: 'same-origin',
              description: 'Resource in iframe, nonexistent but responded with fetch to another.',
          });
          verify({
              performance: performance,
              resource: 'resources/dummy.txt?SWFetched',
              mode: 'same-origin',
              description: 'Resource fetched as response from missing.jpg?SWRespondsWithFetch.',
              should_no_performance_entry: true,
          });
          // Test for a normal resource that is unaffected by the Service Worker.
          verify({
              performance: performance,
              resource: 'resources/empty-worker.js',
              mode: 'same-origin',
              description: 'Resource untouched by the Service Worker.',
          });

          frame.remove();
          return registration.unregister();
      });
}, 'Controlled resource loads');

test(() => {
    const url = resourceUrl('resources/test-helpers.sub.js');
    const entry = window.performance.getEntriesByName(url, 'resource')[0];
    assert_equals(entry.workerStart, 0, 'Non-controlled');
}, 'Non-controlled resource loads');

</script>
