| <!doctype html> |
| <meta charset=utf-8> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| #css-generated-text::before { |
| content: 'This is some text generated via css'; |
| font-size: 12px; |
| } |
| |
| #css-generated-text-attr::before { |
| content: attr(data-text); |
| font-size: 12px; |
| } |
| |
| #css-generated-text-inline-elem::before { |
| content: 'This is some more text generated via css that should be displayed via a span tag'; |
| font-size: 12px; |
| } |
| </style> |
| <body> |
| <script> |
| setup({"hide_test_state": true}); |
| const checkText = (entry, expectedSize, expectedID, beforeRender) => { |
| assert_equals(entry.entryType, 'largest-contentful-paint', |
| 'Entry should be of type largest-contentful-paint'); |
| assert_greater_than_equal(entry.renderTime, beforeRender, |
| 'Render time should be greater than time just before rendering'); |
| assert_greater_than_equal(performance.now(), entry.renderTime, |
| 'renderTime should be less than current time'); |
| assert_approx_equals(entry.startTime, entry.renderTime, 0.001, |
| 'startTime should be equal to renderTime to the precision of 1 millisecond.'); |
| assert_equals(entry.duration, 0, 'duration should be 0'); |
| assert_greater_than_equal(entry.size, expectedSize, |
| 'Size should match expected size'); |
| assert_equals(entry.loadTime, 0, 'loadTime should be zero'); |
| assert_equals(entry.id, expectedID, 'ID should match expected ID'); |
| assert_equals(entry.url, '', 'URL should be empty'); |
| assert_equals(entry.element, document.getElementById(expectedID), |
| 'Entry element is expected element'); |
| } |
| |
| const runTest = (element, testName) => { |
| const elementId = element.id; |
| // The element should be atleast 12px in width |
| // and 100px across based on font size and text length. |
| const elemSizeLowerBound = 1200; |
| promise_test(t => { |
| return new Promise((resolve, reject) => { |
| assert_implements(window.LargestContentfulPaint, |
| "LargestContentfulPaint is not implemented"); |
| const observer = new PerformanceObserver(resolve); |
| observer.observe({ type: 'largest-contentful-paint' }); |
| beforeRender = performance.now(); |
| document.body.appendChild(element); |
| |
| step_timeout(() => { |
| reject(new Error('timeout, LCP candidate not detected')); |
| }, 1000) |
| }).then(entryList => { |
| assert_equals(entryList.getEntries().length, 1); |
| const entry = entryList.getEntries()[0]; |
| checkText(entry, elemSizeLowerBound, elementId, beforeRender); |
| }); |
| }, testName); |
| } |
| |
| const cssGeneratedTextElem = document.createElement('p'); |
| cssGeneratedTextElem.id = 'css-generated-text'; |
| runTest(cssGeneratedTextElem, |
| "CSS generated text is observable as a LargestContentfulPaint candidate"); |
| |
| const cssGeneratedTextAttrElem = document.createElement('p'); |
| cssGeneratedTextAttrElem.id = 'css-generated-text-attr'; |
| cssGeneratedTextAttrElem.setAttribute('data-text', |
| 'This is some text generated using content:attr() via css'); |
| runTest(cssGeneratedTextAttrElem, |
| "Text generated with CSS using content:attr() is observable as a LargestContentfulPaint candidate"); |
| |
| const cssGeneratedTextAttrInlineElemBlockWrapper = document.createElement('div'); |
| cssGeneratedTextAttrInlineElemBlockWrapper.id = 'css-generated-text-inline-elem-block-wrapper'; |
| const cssGeneratedTextInlineElem = document.createElement('span'); |
| cssGeneratedTextInlineElem.id = 'css-generated-text-inline-elem'; |
| cssGeneratedTextAttrInlineElemBlockWrapper.appendChild(cssGeneratedTextInlineElem); |
| runTest(cssGeneratedTextAttrInlineElemBlockWrapper, |
| "CSS generated text on a inline element is observable as a LargestContentfulPaint candidate"); |
| </script> |
| </body> |