<!doctype html>
<html>
<head>
<title>CSS subresources of a clean stylesheet should populate resource timing entries</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<link href='/security/resources/loading-subresources.css' rel='stylesheet' type='text/css'>
</head>
<body>
<div id="mydiv" style="font: 12px 'ahem'">Test</div>
<script>
if (window.internals) {
    internals.clearMemoryCache();
    internals.invalidateFontCache();
}
const waitOnLoad = new Promise((resolve) => {
    window.onload = resolve;
})

function waitFor(delay)
{
    return new Promise(resolve => setTimeout(resolve, delay));
}

document.fonts.ready.then(async () => {
    await waitOnLoad;
    let hasImport = false;
    let hasImage = false;
    let hasCursor = false;
    let hasFont = false;
    let counter = 0;
    while (++counter < 20) {
        const entries = performance.getEntries();
        if (!hasImport)
            hasImport = entries.some(entry => entry.name.includes('imported-loading-subresources.css'));
        if (!hasImage)
            hasImage = entries.some(entry => entry.name.includes('abe-allow-star.py?image'));
        if (!hasCursor)
            hasCursor = entries.some(entry => entry.name.includes('abe-allow-star.py?cursor'));
        if (!hasFont)
            hasFont = entries.some(entry => entry.name.includes('Ahem.woff'));
        if (hasImport && hasImage && hasFont && hasCursor)
            break;
        await waitFor(50);
    }
    mydiv.innerHTML = "";
    assert_true(hasImport, "import");
    assert_true(hasImage, "image");
    assert_true(hasCursor, "cursor");
    assert_true(hasFont, "font");
    done();
})
</script>
</body>
</html>
