<!doctype html>
<html>
<head>
<title>CSS subresources of a clean stylesheet should populate resource timing entries, but not for imported stylesheets</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<link href='http://localhost:8080/security/resources/loading-subresources.php' rel='stylesheet' type='text/css' crossorigin="anonymous">
</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.php?image'));
        if (!hasCursor)
            hasCursor = entries.some(entry => entry.name.includes('abe-allow-star.php?cursor'));
        if (!hasFont)
            hasFont = entries.some(entry => entry.name.includes('Ahem.woff'));
        if (hasImport && hasFont && hasCursor)
            break;
        await waitFor(50);
    }
    mydiv.innerHTML = "";
    assert_true(hasImport, "import");
    assert_false(hasImage, "image");
    assert_true(hasCursor, "cursor");
    assert_true(hasFont, "font");
    done();
})
</script>
</body>
</html>
