<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>functionality test of window.performance.clearMarks</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="/common/performance-timeline-utils.js"></script>
<script src="resources/webperftestharness.js"></script>
<script src="resources/webperftestharnessextension.js"></script>
<script>
setup({ explicit_done: true });

function onload_test()
{
    const entrylist_checker = new performance_entrylist_checker('mark');
    const string_mark_names = mark_names.map(function (x) { return String(x)});
    mark_names.forEach(function(name) {
        performance.mark(name);
    });

    for (let i = 0; i < mark_names.length; ++i)
    {
        performance.clearMarks(mark_names[i]);
        const retained_entries = performance.getEntriesByType('mark');
        const non_retained_entries = performance.getEntriesByName(mark_names[i], 'mark');
        entrylist_checker.entrylist_check(retained_entries, mark_names.length - i - 1, string_mark_names,
            'First loop: checking entries after removing "' + mark_names[i] + '". ');
        test_equals(non_retained_entries.length, 0,
            'First loop: marks that we cleared for "' + mark_names[i] + '" should not exist anymore.');
    }

    mark_names.forEach(function(name) {
        performance.mark(name);
    });
    performance.clearMarks();
    test_equals(performance.getEntriesByType('mark').length, 0, 'No marks should exist after we clear all.');

    // Following cases test clear existed mark name that is tied for two times.
    mark_names.forEach(function(name) {
        performance.mark(name);
    });
    mark_names.forEach(function(name) {
        performance.mark(name);
    });

    for (let i = 0; i < mark_names.length; ++i)
    {
        performance.clearMarks(mark_names[i]);
        const retained_entries = performance.getEntriesByType('mark');
        const non_retained_entries = performance.getEntriesByName(mark_names[i], 'mark');
        entrylist_checker.entrylist_check(retained_entries, (mark_names.length - i - 1) * 2, string_mark_names,
            'Second loop: checking entries after removing "' + mark_names[i] + '". ');
        test_equals(non_retained_entries.length, 0,
            'Second loop: marks that we cleared for "' + mark_names[i] + '" should not exist anymore.');
    }

    // Following cases test clear functionality when mark names are tied for two times.
    mark_names.forEach(function(name) {
        performance.mark(name);
    });
    mark_names.forEach(function(name) {
        performance.mark(name);
    });
    var entry_number_before_useless_clear = performance.getEntriesByType('Mark').length;
    performance.clearMarks('NonExist');
    var entry_number_after_useless_clear = performance.getEntriesByType('Mark').length;
    test_equals(entry_number_before_useless_clear, entry_number_after_useless_clear, 'Nothing should happen if we clear a non-exist mark.');

    performance.clearMarks();
    test_equals(performance.getEntriesByType('mark').length, 0, 'No marks should exist when we clear all.');

    done();
}
</script>
</head>
<body onload=onload_test()>
    <h1>Description</h1>
    <p>This test validates functionality of the interface window.performance.clearMarks.</p>
    <div id="log"></div>
</body>
</html>
