<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>window.performance User Timing clearMeasures() 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-clearmeasures"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="resources/webperftestharness.js"></script>

    <script type="text/javascript">
        // test measures
        var measureName1 = "measure1";
        var measureName2 = "measure2";
        var measureName3 = "measureUndefined";
        var measureTestDelay = 200;
        var measureEntryNames;
        var entries;

        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 measures using the test delay
                setTimeout(measure_test_cb, measureTestDelay);
            }
        }

        function measure_test_cb()
        {
            // create the test measures; only create "measure1" and "measure2", "measureUndefined" is a non-existent
            // measure; give "measure1" a startMark of "navigationStart" and "measure2" a startMark of
            // "responseEnd", this way, "measure1" always come first in a PerformanceEntryList returned from a
            // Performance Timeline accessor
            window.performance.measure(measureName1, "navigationStart");
            window.performance.measure(measureName2, "responseEnd");

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

            // clear non-existent measure
            window.performance.clearMeasures(measureName3);

            // test that "measure1" still exists
            entries = window.performance.getEntriesByName(measureName1);
            test_true(entries[0].name == measureName1,
                      "After a call to window.performance.clearMeasures(\"" + measureName3 + "\"), where \"" + measureName3 +
                      "\" is a non-existent measure, window.performance.getEntriesByName(\"" + measureName1 + "\") " +
                      "returns an object containing the \"" + measureName1 + "\" measure.");

            // test that "measure2" still exists
            entries = window.performance.getEntriesByName(measureName2);
            test_true(entries[0].name == measureName2,
                      "After a call to window.performance.clearMeasures(\"" + measureName3 + "\"), where \"" + measureName3 +
                      "\" is a non-existent measure, window.performance.getEntriesByName(\"" + measureName2 + "\") " +
                      "returns an object containing the \"" + measureName2 + "\" measure.");

            // clear existent measure
            window.performance.clearMeasures(measureName1);

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

            // test that "measure2" still exists
            entries = window.performance.getEntriesByName(measureName2);
            test_true(entries[0].name == measureName2,
                      "After a call to window.performance.clearMeasures(\"" + measureName1 + "\"), " +
                      "window.performance.getEntriesByName(\"" + measureName2 + "\") returns an object containing the " +
                      "\"" + measureName2 + "\" measure.");

            // clear all measures
            window.performance.clearMeasures();

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

            done();
        }
    </script>
    </head>
    <body onload="onload_test();">
        <h1>Description</h1>
        <p>This test validates that the performance.clearMeasures() method is working properly. This test creates the
           following measures to test this method:
            <ul>
                <li>"measure1"</li>
                <li>"measure2"</li>
            </ul>
           After creating each measure, performance.clearMeasures() is called three times. First, it is provided with a
           name of "measureUndefined", a non-existent measure, which shouldn't change the state of the Performance
           Timeline. Next, it is provided with a name of "measure2", after which, this measure should no longer be
           present in the Performance Timeline. Finally, performance.clearMeasures() is called without any name
           provided. After this call, no measures 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>
