<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>window.performance User Timing mark() method is throwing the proper exceptions</title>
        <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
        <link rel="help" href="http://www.w3.org/TR/user-timing/#dom-performance-mark"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="resources/webperftestharness.js"></script>

    <script type="text/javascript">
        // navigation timing attributes
        var timingAttributes = [
            'connectEnd',
            'connectStart',
            'domComplete',
            'domContentLoadedEventEnd',
            'domContentLoadedEventStart',
            'domInteractive',
            'domLoading',
            'domainLookupEnd',
            'domainLookupStart',
            'fetchStart',
            'loadEventEnd',
            'loadEventStart',
            'navigationStart',
            'redirectEnd',
            'redirectStart',
            'requestStart',
            'responseEnd',
            'responseStart',
            'unloadEventEnd',
            'unloadEventStart'
        ];

        // test data
        var markExceptionThrown = false;

        setup({explicit_done: true});

        test_namespace();

        function onload_test()
        {
            // test for existance of User Timing and Performance Timeline interface
            if (window.performance.mark == undefined ||
                window.performance.clearMarks == undefined ||
                window.performance.measure == undefined ||
                window.performance.clearMeasures == undefined ||
                window.performance.getEntriesByName == undefined ||
                window.performance.getEntriesByType == undefined ||
                window.performance.getEntries == undefined)
            {
                test_true(false,
                          "The User Timing and Performance Timeline interfaces, which are required for this test, " +
                          "are defined.");

                done();
            }
            else
            {
                test_mark_exceptions();
            }
        }

        function test_mark_exceptions()
        {
            // loop through mark scenarios
            for (var i in timingAttributes)
            {
                try
                {
                    // create the mark
                    window.performance.mark(timingAttributes[i]);

                    test_true(false,
                              "window.performance.mark(\"" + timingAttributes[i] + "\") threw an exception.");
                }
                catch(e)
                {
                    test_true(true,
                              "window.performance.mark(\"" + timingAttributes[i] + "\") threw an exception.");

                    // confirm that a SYNTAX_ERR exception is thrown and not any other exception
                    test_equals(e.code,
                                e.SYNTAX_ERR,
                                "window.performance.mark(\"" + timingAttributes[i] + "\") threw a SYNTAX_ERR " +
                                "exception.");
                }
            }

            done();
        }
    </script>
    </head>
    <body onload="onload_test();">
        <h1>Description</h1>
        <p>This test validates that the performance.mark() method throws a SYNTAX_ERR exception whenever a navigation
           timing attribute is provided for the name parameter.
        </p>

        <div id="log"></div>
    </body>
</html>
