<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Navigation Timing 2 WPT</title>
        <link rel="author" title="Google" href="http://www.google.com/" />
        <link rel="help" href="http://www.w3.org/TR/navigation-timing-2/#sec-PerformanceNavigationTiming"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="/common/get-host-info.sub.js"></script>
    </head>
    <body>
        <h1>Description</h1>
        <p>This test validates that nav timing 2 instance can be accessed by three different accessors once available: window.performance.getEntries()/getEntriesByType("navigation")/getEntriesByName("document")</p>

        <script>
        var host_info = get_host_info();
        var expectedUrl = "http://" + host_info.ORIGINAL_HOST + ":" +
            host_info.HTTP_PORT + "/navigation-timing/nav2_test_instance_accessors.html";
        var navTiming2Attributes = [
            'connectEnd',
            'connectStart',
            'decodedBodySize',
            'domComplete',
            'domContentLoadedEventEnd',
            'domContentLoadedEventStart',
            'domInteractive',
            'domainLookupEnd',
            'domainLookupStart',
            'duration',
            'encodedBodySize',
            'entryType',
            'fetchStart',
            'initiatorType',
            'loadEventEnd',
            'loadEventStart',
            'name',
            'redirectCount',
            'redirectEnd',
            'redirectStart',
            'requestStart',
            'responseEnd',
            'responseStart',
            'secureConnectionStart',
            'transferSize',
            'type',
            'unloadEventEnd',
            'unloadEventStart',
            'workerStart'
        ];

        async_test(function (t) {
            var observer = new PerformanceObserver(
                t.step_func(function (entryList) {
                    var instance1 = performance.getEntries()[0];
                    var instance2 = performance.getEntriesByType("navigation")[0];
                    var instance3 = performance.getEntriesByName(expectedUrl)[0];

                    assert_equals(performance.getEntriesByType("navigation").length, 1, "Expected there is only one navigation timing instance.");
                    assert_equals(performance.getEntriesByName(expectedUrl).length, 1, "Expected there is only one navigation timing instance.");

                    for (var i = 0; i < navTiming2Attributes.length; i++) {
                        assert_equals(instance1[navTiming2Attributes[i]], instance2[navTiming2Attributes[i]]);
                    }

                    for (var i = 0; i < navTiming2Attributes.length; i++) {
                        assert_equals(instance1[navTiming2Attributes[i]], instance3[navTiming2Attributes[i]]);
                    }
                    observer.disconnect();
                    t.done();
                })
            );
            observer.observe({entryTypes: ["navigation"]});

        }, "Performance navigation timing entries are accessible through three different accessors.");
        </script>
    </body>
</html>
