<!DOCTYPE html>
<html>
  <head>
        <meta charset="utf-8" >
        <title>window.performance.now across frames</title>
        <link rel="author" title="Google" href="http://www.google.com/">
        <link rel="help" href="http://www.w3.org/TR/hr-time/#sec-extenstions-performance-interface">

        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>

        <script type="text/javascript">
            setup({explicit_done: true});

            function start_test() {
              setTimeout(function() {
                var iframe = document.createElement('iframe');
                iframe.id = 'frameContext';
                iframe.onload = finish_test;
                iframe.src = "resources/now_frame.html";
                document.body.appendChild(iframe);
              }, 1000);
            }

            function finish_test() {
              var childWindow = document.getElementById('frameContext').contentWindow;

              // Verify a positive number is returned for both the frame and parent.
              test(function() { assert_true(window.performance.now() > 0); }, 'parent performance.now() > 0');
              test(function() { assert_true(childWindow.performance.now() > 0); }, 'child performance.now() > 0');

              // Verify that the test properly created the child at least a second after the parent.
              test(function () { assert_true(childWindow.performance.timing.navigationStart > (window.performance.timing.navigationStart + 1000)); },
                                'Child created at least 1 second after parent');

              test(function () {
                var parentNow = window.performance.now();
                var childNow = childWindow.performance.now();
                var childParentSkew = Math.abs(childNow - parentNow);
                assert_true(childParentSkew > 1000, 'Child and parent\'s now()s have different bases (skewed more than 1 second)');

                var childLoadTime = childWindow.performance.timing.loadEventStart - childWindow.performance.timing.navigationStart;
                assert_true(1000 > (childNow - childLoadTime), 'Child\'s now() is based on its document\'s navigationStart');
              }, 'Child and parent time bases are correct');

              done();
            }
        </script>

    </head>
    <body onload="start_test()">
        <h1>Description</h1>
        <p>This test validates the values of the window.performance.now() are based on the current document's navigationStart.</p>
        <div id="log"></div>
    </body>
</html>
