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

    <script type="text/javascript">
        // test marks
        var markName1 = "mark1";
        var markName2 = "mark2";
        var markName3 = "markUndefined";
        var markTestDelay = 200;
        var entries;
        var pass;

        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
            {
                // create a mark using the test delay; the mark's value should be equivalent to the loadEventStart
                // navigation timing attribute plus the test delay
                setTimeout(mark_test_cb, markTestDelay);
            }
        }

        function mark_test_cb()
        {
            // create the test marks; only create "mark1" and "mark2", "markUndefined" is a non-existent mark
            window.performance.mark(markName1);
            window.performance.mark(markName2);

            // test that two marks have been created
            entries = window.performance.getEntriesByType("mark");
            test_equals(entries.length, 2, "Two marks have been created for this test.");

            // clear non-existent mark
            window.performance.clearMarks(markName3);

            // test that "mark1" still exists
            entries = window.performance.getEntriesByName(markName1);
            test_true(entries[0].name == markName1,
                      "After a call to window.performance.clearMarks(\"" + markName3 + "\"), where \"" + markName3 +
                      "\" is a non-existent mark, window.performance.getEntriesByName(\"" + markName1 + "\") " +
                      "returns an object containing the \"" + markName1 + "\" mark.");

            // test that "mark2" still exists
            entries = window.performance.getEntriesByName(markName2);
            test_true(entries[0].name == markName2,
                      "After a call to window.performance.clearMarks(\"" + markName3 + "\"), where \"" + markName3 +
                      "\" is a non-existent mark, window.performance.getEntriesByName(\"" + markName2 + "\") " +
                      "returns an object containing the \"" + markName2 + "\" mark.");

            // clear existent mark
            window.performance.clearMarks(markName1);

            // test that "mark1" was cleared
            entries = window.performance.getEntriesByName(markName1);
            pass = true;
            for (var i in entries)
            {
                pass = false;
            }
            test_true(pass,
                      "After a call to window.performance.clearMarks(\"" + markName1 + "\"), " +
                      "window.performance.getEntriesByName(\"" + markName1 + "\") returns an empty object.");

            // test that "mark2" still exists
            entries = window.performance.getEntriesByName(markName2);
            test_true(entries[0].name == markName2,
                      "After a call to window.performance.clearMarks(\"" + markName1 + "\"), " +
                      "window.performance.getEntriesByName(\"" + markName2 + "\") returns an object containing the " +
                      "\"" + markName2 + "\" mark.");

            // clear all marks
            window.performance.clearMarks();

            // test that all marks were cleared
            entries = window.performance.getEntriesByType("mark");
            pass = true;
            for (var i in entries)
            {
                pass = false;
            }
            test_true(pass,
                      "After a call to window.performance.clearMarks(), " +
                      "window.performance.getEntriesByType(\"mark\") returns an empty object.");

            done();
        }
    </script>
    </head>
    <body onload="onload_test();">
        <h1>Description</h1>
        <p>This test validates that the performance.clearMarks() method is working properly. This test creates the
           following marks to test this method:
            <ul>
                <li>"mark1"</li>
                <li>"mark2"</li>
            </ul>
           After creating each mark, performance.clearMarks() is called three times. First, it is provided with a name
           of "markUndefined", a non-existent mark, which shouldn't change the state of the Performance Timeline. Next,
           it is provided with a name of "mark2", after which, this mark should no longer be present in the Performance
           Timeline. Finally, performance.clearMarks() is called without any name provided. After this call, no marks
           should be present in the Performance Timeline. The state of the Performance Timeline is tested with the
           performance.getEntriesByType() and performance.getEntries() methods.
        </p>

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