<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/get-host-info.js"></script>
<script src="resources/test-helpers.js"></script>
<script>
function resourceUrl(path) {
    return get_host_info()['HTTP_ORIGIN'] + base_path() + path;
}

function verify(performance, resource, description) {
    var entry = performance.getEntriesByName(resourceUrl(resource))[0];
    assert_greater_than(entry.workerStart, 0, description);
    assert_greater_than_equal(entry.workerStart, entry.startTime, description);
    assert_less_than_equal(entry.workerStart, entry.fetchStart, description);
    if (resource.indexOf('redirect.php') != -1) {
        assert_less_than_equal(entry.workerStart, entry.redirectStart,
                               description);
    } else {
        assert_equals(entry.redirectStart, 0, description);
    }
}

async_test(function(t) {
    var worker_url = 'resources/resource-timing-worker.js';
    var scope = 'resources/resource-timing-iframe.html';
    var registration;

    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) {
          var performance = frame.contentWindow.performance;
          verify(performance, 'resources/dummy.js', 'Generated response');
          verify(performance, 'resources/empty.js', 'Network fallback');
          verify(performance, 'resources/redirect.php?Redirect=empty.js',
                 'Redirect');
          frame.remove();
          return registration.unregister();
        })
      .then(function() {
          t.done();
        })
      .catch(unreached_rejection(t));
}, 'Controlled resource loads');

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

</script>
