container-timing-helpers.js (1800B)
1 function checkContainerEntry(entry, identifier, last_element_id, beforeRender) { 2 assert_equals(entry.entryType, 'container'); 3 assert_equals(entry.name, 'container-paints'); 4 assert_equals(entry.identifier, identifier, 'identifier does not match'); 5 if (last_element_id != null) { 6 assert_equals(entry.lastPaintedElement.id, last_element_id); 7 } 8 9 assert_equals(entry.duration, 0, 'duration should be 0'); 10 assert_greater_than_equal( 11 entry.firstRenderTime, beforeRender, 12 'firstRenderTime greater than beforeRender'); 13 assert_greater_than_equal( 14 entry.startTime, entry.firstRenderTime, 15 'startTime greater than beforeRender'); 16 assert_greater_than_equal( 17 performance.now(), entry.startTime, 'startTime bound by now()') 18 19 // PaintTimingMixin 20 if ("presentationTime" in entry && entry.presentationTime !== null) { 21 assert_greater_than(entry.presentationTime, entry.paintTime); 22 assert_equals(entry.presentationTime, entry.startTime); 23 } else { 24 assert_equals(entry.startTime, entry.paintTime); 25 } 26 } 27 28 function checkContainerSize(entry, size) { 29 assert_equals(entry.size, size); 30 } 31 32 function onElementTimingEvent(func) { 33 const finish_observer = new PerformanceObserver((entryList) => { 34 finish_observer.disconnect(); 35 requestAnimationFrame(() => { func(); }); 36 }); 37 finish_observer.observe({ entryTypes: ['element'] }); 38 } 39 40 function finishOnElementTiming(t) { 41 onElementTimingEvent(() => { t.done(); }); 42 } 43 44 function addPaintingElementTimingAfterDoubleRAF(parent) { 45 requestAnimationFrame(() => requestAnimationFrame(() => { 46 const finish_img = document.createElement('img'); 47 finish_img.src = '/container-timing/resources/square100.png'; 48 finish_img.setAttribute('elementtiming', ''); 49 parent.appendChild(finish_img); 50 })); 51 }