| <!DOCTYPE HTML> | 
 | <meta charset=utf-8> | 
 | <title>Element Timing: observe with empty elementtiming attribute</title> | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 | <script src="resources/element-timing-helpers.js"></script> | 
 | <script> | 
 | let beforeRender; | 
 | async_test(function (t) { | 
 |  assert_implements(window.PerformanceElementTiming, "PerformanceElementTiming is not implemented"); | 
 |  let observedImage = false; | 
 |  let observedText = false; | 
 |  const observer = new PerformanceObserver( | 
 |  t.step_func(function(entryList) { | 
 |  entryList.getEntries().forEach(entry => { | 
 |  if (entry.name === 'image-paint') { | 
 |  assert_false(observedImage, 'Image should only be observed once.'); | 
 |  const pathname = window.location.origin + '/element-timing/resources/square20.png'; | 
 |  checkElement(entry, pathname, '', 'square', beforeRender, | 
 |  document.getElementById('square')); | 
 |  checkNaturalSize(entry, 20, 20); | 
 |  observedImage = true; | 
 |  } else { | 
 |  assert_false(observedText, 'Text should only be observed once.'); | 
 |  checkTextElement(entry, '', 'text', beforeRender, document.getElementById('text')); | 
 |  observedText = true; | 
 |  } | 
 |  }); | 
 |  if (observedImage && observedText) | 
 |  t.done(); | 
 |  }) | 
 |  ); | 
 |  observer.observe({type: 'element', buffered: true}); | 
 |  beforeRender = performance.now(); | 
 | }, "Able to observe image and text with empty elementtiming attribute."); | 
 | </script> | 
 | <img id='square' src='resources/square20.png' elementtiming/> | 
 | <p id='text' elementtiming>Text!</p> |