<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<link rel="author" title="Intel" href="http://www.intel.com/" />
<link rel="help" href="http://www.w3.org/TR/resource-timing/#performanceresourcetiming"/>
<title>This test validates the functionality of onresourcetimingbufferfull in resource timing.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/buffer-full-utilities.js"></script>
</head>
<body>
<script>
const resource_timing_buffer_size = 2;
let bufferFullCount = 0;
let eventFired = false;
setup(() => {
    clearBufferAndSetSize(resource_timing_buffer_size);
    performance.addEventListener('resourcetimingbufferfull', e => {
        assert_equals(e.bubbles, false, "Event bubbles attribute is false");
        bufferFullCount++;
        eventFired = true;
    });
});

let overflowTheBuffer = () => {
    return new Promise(resolve => {
        // This resource overflows the entry buffer, and goes into the secondary buffer.
        appendScript('resources/empty_script.js', resolve);
    });
};

let testThatBufferContainsTheRightResources = () => {
    assert_equals(performance.getEntriesByType('resource').length, resource_timing_buffer_size, 'There should only be |bufferSize| resource entries.');
    assert_equals(bufferFullCount, 1, 'onresourcetimingbufferfull should have been invoked once.');
};

promise_test(async () => {
    await fillUpTheBufferWithTwoResources('resources/empty.js');
    await overflowTheBuffer();
    await waitForEventToFire();
    testThatBufferContainsTheRightResources();
}, "Test that a buffer full event does not bubble and that resourcetimingbufferfull is called only once per overflow");
</script>
</body>
</html>
