blob: 53099cadb254df0a4d087bc9dd75340b5ddb40fa [file] [log] [blame]
// The test functions called in the navigation-counter test. They rely on
// artifacts defined in
// '/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js'
// which should be included before this file to use these functions.
// This function is to obtain navigation ids of all performance entries to
// verify.
let testInitial = () => {
return window.performance.getEntries().map(e => e.navigationId);
}
let testMarkMeasure = (expectedNavigationId, markName, MeasureName) => {
const markName1 = 'test-mark';
const markName2 = 'test-mark' + expectedNavigationId;
const measureName = 'test-measure' + expectedNavigationId;
window.performance.mark(markName1);
window.performance.mark(markName2);
window.performance.measure(measureName, markName1, markName2);
return window.performance.getEntriesByName(markName2).concat(
window.performance.getEntriesByName(measureName)).map(e => e.navigationId);
}
let testResourceTiming = async (expectedNavigationId) => {
let navigationId = -1;
let p = new Promise(resolve => {
new PerformanceObserver((list) => {
const entry = list.getEntries().find(e => e.name.includes('json_resource') && e.navigationId == expectedNavigationId);
if (entry) {
navigationId = entry.navigationId;
resolve();
}
}).observe({ type: 'resource' });
});
const resp = await fetch('/performance-timeline/resources/json_resource.json');
await p;
return [navigationId];
}
let testElementTiming = async (expectedNavigationId) => {
let navigationId = -1;
let p = new Promise(resolve => {
new PerformanceObserver((list) => {
const entry = list.getEntries().find(e => e.entryType === 'element' && e.identifier === 'test-element-timing' + expectedNavigationId);
if (entry) {
navigationId = entry.navigationId;
resolve();
}
}).observe({ type: 'element' });
});
let el = document.createElement('p');
el.setAttribute('elementtiming', 'test-element-timing' + expectedNavigationId);
el.textContent = 'test element timing text';
document.body.appendChild(el);
await p;
return [navigationId];
}
let testLongTask = async () => {
let navigationIds = [];
let p = new Promise(resolve => {
new PerformanceObserver((list) => {
const entry = list.getEntries().find(e => e.entryType === 'longtask')
if (entry) {
navigationIds.push(entry.navigationId);
navigationIds = navigationIds.concat(
entry.attribution.map(a => a.navigationId));
resolve();
}
}).observe({ type: 'longtask' });
});
const script = document.createElement('script');
script.src = '/performance-timeline/resources/make_long_task.js';
document.body.appendChild(script);
await p;
document.body.removeChild(script);
return navigationIds;
}
const testFunctionMap = {
'mark_measure': testMarkMeasure,
'resource_timing': testResourceTiming,
'element_timing': testElementTiming,
'long_task_task_attribution': testLongTask,
};
function runNavigationIdTest(params, description) {
const defaultParams = {
openFunc: url => window.open(url, '_blank', 'noopener'),
scripts: [],
funcBeforeNavigation: () => { },
targetOrigin: originCrossSite,
navigationTimes: 4,
funcAfterAssertion: () => { },
} // Apply defaults.
params = { ...defaultParams, ...params };
promise_test(async t => {
const pageA = new RemoteContext(token());
const pageB = new RemoteContext(token());
const urlA = executorPath + pageA.context_id;
const urlB = params.targetOrigin + executorPath + pageB.context_id;
// Open url A.
params.openFunc(urlA);
await pageA.execute_script(waitForPageShow);
// Assert navigation id is 1 when the document is loaded first time.
let navigationIds = await pageA.execute_script(testInitial);
assert_true(
navigationIds.every(t => t === 1), 'All Navigation Ids should be 1.');
for (i = 1; i <= params.navigationTimes; i++) {
// Navigate away to url B and back.
await navigateAndThenBack(pageA, pageB, urlB);
// Assert navigation id increments when the document is load from bfcache.
navigationIds = await pageA.execute_script(
testFunctionMap[params.testName], [i + 1]);
assert_true(
navigationIds.every(t => t === (i + 1)),
params.testName + ' Navigation Id should all be ' + (i + 1) + '.');
}
}, description);
}