<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Element Timing: src change triggers new entry</title>

<body>
  <style>
    body {
      margin: 0;
    }

  </style>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script src="resources/element-timing-helpers.js"></script>
  <img elementtiming='my_image' id='my_id' />
  <script>
    setup({"hide_test_state": true});

    const performanceEntryPromise = (pathname) => {
      return new Promise(resolve => {
        new PerformanceObserver((entryList, observer) => {
          assert_equals(entryList.getEntries().length, 1);
          if (entryList.getEntries()[0].url == pathname) {
            observer.disconnect();
            resolve(entryList.getEntries()[0]);
          }
        }).observe({ type: 'element' });
      });
    }

    promise_test(async (t) => {
      assert_implements(window.PerformanceElementTiming, "PerformanceElementTiming is not implemented");

      // Take beforeRender timestamp.
      const beforeRender1 = performance.now();

      const img = document.getElementById('my_id');

      const url1 = 'resources/square100.png';

      const pathname1 = (new URL(url1, document.location)).href

      // Register performance observer.
      const promise1 = performanceEntryPromise(pathname1);

      //Load image
      await new Promise(resolve => {
        img.addEventListener('load', resolve);
        img.src = url1;
      });

      // Get element entry.
      const entry1 = await promise1;

      // Check entry.
      checkElement(entry1, pathname1, 'my_image', 'my_id', beforeRender1, img);
      checkRect(entry1, [0, 100, 0, 100]);
      checkNaturalSize(entry1, 100, 100);

      // Take beforeRender timestamp before changing image src.
      const beforeRender2 = performance.now();

      // Set the src to trigger another entry.
      const url2 = '/images/black-rectangle.png';

      const pathname2 = (new URL(url2, document.location)).href;

      const promise2 = performanceEntryPromise(pathname2);

      //Load image with changed src.
      await new Promise(resolve => {
        img.addEventListener('load', resolve);
        img.src = url2;
      });

      // Get the corresponding element entry.
      const entry2 = await promise2;

      // Check entry.
      checkElement(entry2, pathname2, 'my_image', 'my_id', beforeRender2, img);
      checkRect(entry2, [0, 100, 0, 50]);
      checkNaturalSize(entry2, 100, 50);
    }, 'Element Timing: changing src causes a new entry to be dispatched.')
  </script>

</body>
