<!DOCTYPE HTML>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>One resource when reusing data</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
async_test(t => {
  var img_entries = 0;
  var observed = 0;
  var img_url = "resources/blue.png";
  var observer = new PerformanceObserver(
    function (entryList, obs) {
      var entries = entryList.getEntriesByType("resource");
      for (var i = 0; i < entries.length; ++i) {
        // Ignore any entries for the test harness files if present.
        if (/testharness(report)?\.js/.test(entries[i].name)) {
          continue;
        }

        ++observed;
        if (entries[i].name.indexOf(img_url) != -1)
            ++img_entries;
      }
    });
  observer.observe({entryTypes: ["resource"]});
  window.onload = function() {
    // A timeout is needed as PerformanceObserver is not guaranteed to run before onload triggered.
    t.step_timeout(function() {
        assert_equals(observed, 1);
        assert_equals(img_entries, 1);
        t.done();
    }, 0);
  };
  // Images are added dynamically to make sure the observer is registered before their download finishes.
  var img1 = document.createElement("img");
  img1.src = img_url;
  document.body.appendChild(img1);
  var img2 = document.createElement("img");
  img2.src = img_url;
  document.body.appendChild(img2);
}, "A single resource used in two elements produces a single entry.");
</script>
<h1>One resource when reusing data</h1>
<p>
If the user agent is to reuse the data from another existing or completed fetch initiated from the current document, abort the remaining steps.
</p>
<div id="log"></div>
</body>

