setup({"hide_test_state": true}); async_test(t => { assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported."); // First observer creates second in callback to ensure the entry has been dispatched by the time // the second observer begins observing. let entries_seen = 0; new PerformanceObserver(firstList => { entries_seen += firstList.getEntries().length; // Abort if we have not yet received both paint entries. if (entries_seen < 2) return; // Second observer requires 'buffered: true' to see the entries. let firstPaintSeen = false; let firstContentfulPaintSeen = false; new PerformanceObserver(list => { list.getEntries().forEach(t.step_func(entry => { assert_equals(entry.entryType, 'paint'); if (entry.name === 'first-paint') firstPaintSeen = true; else if (entry.name === 'first-contentful-paint') firstContentfulPaintSeen = true; else assert_unreached('The observer should only see first paint or first contentful paint!'); if (firstPaintSeen && firstContentfulPaintSeen) t.done(); })); }).observe({'type': 'paint', buffered: true}); }).observe({'entryTypes': ['paint']}); // Trigger the first paint entries const img = document.createElement("IMG"); img.src = "resources/circles.png"; document.body.appendChild(img); }, "PerformanceObserver with buffered flag sees previous paint entries.");