<!DOCTYPE html>
<html>
<head>
<title>window.performance.now in shared workers</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
async_test(function(t) {
    const worker = new SharedWorker('support/WorkerSendingPerformanceNow.js');
    worker.port.onmessage = t.step_func(event => {
        const results = event.data;
        assert_equals(results.length, 4);
        assert_equals(results[0], 'undefined',
          'workerStart not defined on the Worker object');
        assert_equals(results[1], 'object', 'self.performance is defined');
        assert_equals(results[2], 'function', 'self.performance.now is defined');
        assert_greater_than(results[3], 0, 'Time in the worker should be positive');
        assert_greater_than(window.performance.now(), results[3], 'Time in the worker should be before the current time in the main document');
        setupIframe();
    });
    window.iframeStartTime = 0;
    window.test_iframe = function(event) {
        const workerTime = event.data[3];
        assert_greater_than(workerTime, window.iframeStartTime,
            'Time since origin time should be greater in the shared worker than the iframe');
        t.done();
    }
    function setupIframe() {
        const iframe = document.createElement('iframe');
        document.body.appendChild(iframe);
        const script = iframe.contentWindow.document.createElement('script');
        script.innerHTML =
            'window.top.iframeStartTime = window.performance.now();' +
            'const worker = new SharedWorker("support/WorkerSendingPerformanceNow.js");' +
            'worker.port.onmessage = function(event) {' +
            '    window.top.test_iframe(event);' +
            '};' +
            'worker.port.postMessage("");';
        iframe.contentWindow.document.body.appendChild(script);
    }
    worker.port.postMessage('');
}, 'performance.now() exists in shared workers and reports reasonable times');
</script>
</body>
</html>
