<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link rel="help" href="https://w3c.github.io/resource-timing/#dom-performance-setresourcetimingbuffersize">
<title>This test validates that setResourceTimingBufferFull behaves appropriately when set to the current buffer level.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/buffer-full-utilities.js"></script>
</head>
<body>
<script>
let eventFired = false;
let loadRandomResource = () => {
    return fetch(window.location.href + "?" + Math.random());
}

setup(() => {
    // Get the browser into a consistent state.
    clearBufferAndSetSize(100);
});

let loadResourcesToFillFutureBuffer = () => {
    return new Promise(resolve => {
        // Gather up 3 Resource Entries to kick off the rest of test behavior.
        let resources = 0;
        let observer = new PerformanceObserver(function(list) {
            resources += list.getEntriesByType("resource").length;
            if (resources !== 3)
                return;
            observer.disconnect();
            resolve();
        });
        observer.observe({entryTypes: ["resource"]});
        for (let i = 0; i < 3; ++i)
            loadRandomResource();
    });
};

let setBufferFullEventAndBufferSize = () => {
    performance.setResourceTimingBufferSize(3);
    performance.onresourcetimingbufferfull = function() {
        eventFired = true;
        performance.clearResourceTimings();
    };
};

let clearAndAddAnotherEntryToBuffer = () => {
    return new Promise(resolve => {
        performance.clearResourceTimings();
        loadRandomResource().then(resolve);
    });
};

let testThatEntryWasAdded = () => {
    return new Promise((resolve, reject) => {
        let waitForIt = function() {
            if (performance.getEntriesByType("resource").length) {
                resolve();
            } else {
                reject("After buffer full, entry never added to primary");
            }
        }
        step_timeout(waitForIt, 250);
    });
};

promise_test(async () => {
    await loadResourcesToFillFutureBuffer();
    setBufferFullEventAndBufferSize();
    // Overflow the buffer.
    await loadRandomResource();
    await waitForEventToFire();
    await clearAndAddAnotherEntryToBuffer();
    // Since we have no strict guarantees when an entry will be added to the
    // buffer, waiting till next task to try to avoid flakiness.
    await waitForNextTask();
    await testThatEntryWasAdded();
}, "Test that entry was added to the buffer after a buffer full event");
</script>
