blob: 21cd633ced97dbf6c75eae10bfd97a2942e4bd5a [file] [log] [blame]
let appendScript = (src, resolve) => {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = src;
script.onload = resolve;
document.body.appendChild(script);
}
let xhrScript = src => {
var xhr = new XMLHttpRequest();
xhr.open("GET", src, false);
xhr.send(null);
}
// This script relies on resources/resource-loaders.js. Include it before in order for the below
// methods to work properly.
// The resources used to trigger new entries.
const scriptResources = [
'resources/empty.js',
'resources/empty_script.js',
'resources/empty.js?id'
];
const waitForNextTask = () => {
return new Promise(resolve => {
step_timeout(resolve, 0);
});
};
const clearBufferAndSetSize = size => {
performance.clearResourceTimings();
performance.setResourceTimingBufferSize(size);
}
let waitUntilConditionIsMet = cond => {
return new Promise(resolve => {
let checkCondition = function() {
if (cond.apply(null)) {
resolve();
} else {
step_timeout(checkCondition.bind(null,cond), 0);
}
}
step_timeout(checkCondition.bind(null, cond), 0);
});
}
let waitForEventToFire = () => {
return new Promise(resolve => {
let waitForIt = function() {
if (eventFired) {
eventFired = false;
resolve();
} else {
step_timeout(waitForIt, 0);
}
}
step_timeout(waitForIt, 0);
});
};
const forceBufferFullEvent = async () => {
clearBufferAndSetSize(1);
return new Promise(async resolve => {
performance.addEventListener('resourcetimingbufferfull', resolve);
// Load 2 resources to ensure onresourcetimingbufferfull is fired.
// Load them in order in order to get the entries in that order!
await load.script(scriptResources[0]);
await load.script(scriptResources[1]);
});
};
const fillUpTheBufferWithSingleResource = async (src = scriptResources[0]) => {
clearBufferAndSetSize(1);
await load.script(src);
};
const fillUpTheBufferWithTwoResources = async () => {
clearBufferAndSetSize(2);
// Load them in order in order to get the entries in that order!
await load.script(scriptResources[0]);
await load.script(scriptResources[1]);
};
const addAssertUnreachedBufferFull = t => {
performance.addEventListener('resourcetimingbufferfull', t.step_func(() => {
assert_unreached("resourcetimingbufferfull should not fire")
}));
};
const checkEntries = numEntries => {
const entries = performance.getEntriesByType('resource');
assert_equals(entries.length, numEntries,
'Number of entries does not match the expected value.');
assert_true(entries[0].name.includes(scriptResources[0]),
scriptResources[0] + " is in the entries buffer");
if (entries.length > 1) {
assert_true(entries[1].name.includes(scriptResources[1]),
scriptResources[1] + " is in the entries buffer");
}
if (entries.length > 2) {
assert_true(entries[2].name.includes(scriptResources[2]),
scriptResources[2] + " is in the entries buffer");
}
}
const bufferFullFirePromise = new Promise(resolve => {
performance.addEventListener('resourcetimingbufferfull', async () => {
// Wait for the next task just to ensure that all bufferfull events have fired, and to ensure
// that the secondary buffer is copied (as this is an event, there may be microtask checkpoints
// right after running an event handler).
await waitForNextTask();
resolve();
});
});