<!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 (!has_required_interfaces())
            {
                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>
