frame-timing.js (2753B)
1 function test_frame_timing_before_load_event(type) { 2 promise_test(async t => { 3 const {document, performance} = type === 'frame' ? window.parent : window; 4 const delay = 500; 5 const frame = document.createElement(type); 6 t.add_cleanup(() => frame.remove()); 7 await new Promise(resolve => { 8 frame.addEventListener('load', resolve); 9 frame.src = `/resource-timing/resources/iframe-with-delay.sub.html?delay=${delay}`; 10 (type === 'frame' ? document.querySelector('frameset') : document.body).appendChild(frame); 11 }); 12 13 const entries = performance.getEntriesByName(frame.src); 14 const navigationEntry = frame.contentWindow.performance.getEntriesByType('navigation')[0]; 15 assert_equals(entries.length, 1); 16 assert_equals(entries[0].initiatorType, type); 17 assert_greater_than(performance.now(), entries[0].responseEnd + delay); 18 const domContentLoadedEventAbsoluteTime = 19 navigationEntry.domContentLoadedEventStart + 20 frame.contentWindow.performance.timeOrigin; 21 const frameResponseEndAbsoluteTime = entries[0].responseEnd + performance.timeOrigin; 22 assert_greater_than(domContentLoadedEventAbsoluteTime, frameResponseEndAbsoluteTime); 23 }, `A ${type} should report its RT entry when the response is done and before it is completely loaded`); 24 } 25 26 27 function test_frame_timing_change_src(type, 28 origin1 = document.origin, 29 origin2 = document.origin, 30 tao = false, label = '') { 31 const uid = token(); 32 promise_test(async t => { 33 const {document, performance} = type === 'frame' ? window.parent : window; 34 const frame = document.createElement(type); 35 t.add_cleanup(() => frame.remove()); 36 function createURL(origin) { 37 const url = new URL(`${origin}/resource-timing/resources/green.html`, location.href); 38 url.searchParams.set("uid", uid); 39 if (tao) 40 url.searchParams.set("pipe", "header(Timing-Allow-Origin, *)"); 41 return url.toString(); 42 } 43 44 await new Promise(resolve => { 45 const done = () => { 46 resolve(); 47 frame.removeEventListener('load', done); 48 } 49 frame.addEventListener('load', done); 50 frame.src = createURL(origin1); 51 const root = type === 'frame' ? document.querySelector('frameset') : document.body; 52 root.appendChild(frame); 53 }); 54 55 await new Promise(resolve => { 56 frame.addEventListener('load', resolve); 57 frame.src = createURL(origin2); 58 }); 59 60 const entries = performance.getEntries().filter(e => e.name.includes(uid)); 61 assert_equals(entries.length, 2); 62 }, label || `A ${type} should report separate RT entries if its src changed from the outside`); 63 }