<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>exception test of performance.mark and performance.measure</title>
        <link rel="author" title="Intel" href="http://www.intel.com/" />
        <link rel="help" href="http://www.w3.org/TR/user-timing/#extensions-performance-interface"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="resources/webperftestharness.js"></script>
        <script>
        setup({explicit_done: true});
        test_namespace();

        function onload_test() {
            if (window.performance !== undefined && window.performance.mark !== undefined)
            {
                try
                {
                    window.performance.mark();
                    test_true(false, "window.performance.mark() threw an exception when invoke without a parameter.");
                }
                catch(e)
                {
                    test_true(true, "window.performance.mark() threw an exception when invoke without a parameter.");

                    test_equals(e.name,
                                "TypeError",
                                "window.performance.mark() threw a TYPE_ERR exception when invoke without a parameter.");
                }
            }
            else
            {
                    test_true(false, "window.performance.mark() interface is not supported!");
            }

            if (window.performance !== undefined && window.performance.measure !== undefined)
            {
                try
                {
                    window.performance.measure();
                    test_true(false, "window.performance.measure() threw an exception when invoke without a parameter.");
                }
                catch(e)
                {
                    test_true(true, "window.performance.measure() threw an exception when invoke without a parameter.");

                    test_equals(e.name,
                                "TypeError",
                                "window.performance.measure() threw a TYPE_ERR exception when invoke without a parameter.");
                }
            }
            else
            {
                    test_true(false, "window.performance.measure() interface is not supported!");
            }

            done();
        }
        </script>
    </head>
    <body onload="onload_test();">
        <h1>Description</h1>
        <p>This test validates exception scenarios of invoking mark() and measure() without parameter.</p>
        <div id="log"></div>
    </body>
</html>
