<!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>
