Add iframe loading=lazy data: and Blob URL WPTs

R=sclittle@chromium.org

Bug: 1047909
Change-Id: Ic5e1ef207e8483ae1a56a4ee090d7ad6317a3a3f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2303859
Commit-Queue: Dominic Farolino <dom@chromium.org>
Reviewed-by: Scott Little <sclittle@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789314}
diff --git a/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy.html b/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy.html
index 51b4426..336703e 100644
--- a/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy.html
+++ b/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy.html
@@ -11,12 +11,22 @@
 <script>
   const t_in_viewport =
     async_test('In-viewport iframes load eagerly');
-  const t_in_viewport_srcdoc=
-    async_test('In-viewport srcdoc iframes load eagerly');
   const t_below_viewport =
     async_test('Below-viewport iframes load lazily');
   const t_below_viewport_srcdoc =
     async_test('Below-viewport srcdoc iframes load lazily');
+  const t_below_viewport_data_url =
+    async_test('Below-viewport data: url iframes load lazily');
+  const t_below_viewport_blob_url =
+    async_test('Below-viewport blob url iframes load lazily');
+
+
+  document.addEventListener('DOMContentLoaded', e => {
+    const blob_url_iframe = document.querySelector('#below_viewport_blob_url');
+    const blob = new Blob(['<p>Blob subframe</p>'], {type: 'text/html'});
+    const url = URL.createObjectURL(blob);
+    blob_url_iframe.src = url;
+  });
 
   let has_window_loaded = false;
 
@@ -25,11 +35,6 @@
       "The in_viewport iframe should not block the load event");
   });
 
-  const in_viewport_srcdoc_iframe_onload = t_in_viewport_srcdoc.step_func_done(() => {
-    assert_false(has_window_loaded,
-      "The in_viewport srcdoc iframe should not block the load event");
-  });
-
   window.addEventListener("load", () => {
     has_window_loaded = true;
     document.getElementById("below_viewport_srcdoc").scrollIntoView();
@@ -41,6 +46,7 @@
                 "the below-viewport iframe loads");
   });
 
+  // Onload handlers for below-viewport srcdoc iframe.
   // Must make this accessible to the srcdoc iframe's body.
   window.below_viewport_srcdoc_iframe_subresource_onload = t_below_viewport_srcdoc.step_func(() => {
     assert_true(has_window_loaded,
@@ -53,16 +59,27 @@
                 "The window load event should have fired before " +
                 "the below-viewport srcdoc iframe loads");
   });
+
+  // Onload handler for below-viewport data url iframe.
+  const below_viewport_data_url_iframe_onload = t_below_viewport_data_url.step_func_done(() => {
+    assert_true(has_window_loaded,
+                "The window load event should have fired before " +
+                "the below-viewport data url iframe loads");
+  });
+
+  // Onload handler for below-viewport blob url iframe.
+  const below_viewport_blob_url_iframe_onload = t_below_viewport_blob_url.step_func_done(() => {
+    assert_true(has_window_loaded,
+                "The window load event should have fired before " +
+                "the below-viewport blob url iframe loads");
+  });
+
 </script>
 
 <body>
   <iframe id="in_viewport" src="resources/subframe.html?in-viewport"
           loading="lazy" width="200px" height="100px"
           onload="in_viewport_iframe_onload();"></iframe>
-  <iframe id="in_viewport_srcdoc"
-          srcdoc="<body><img src='/common/square.png?in-viewport'></body>"
-          loading="lazy" width="200px" height="100px"
-          onload="in_viewport_srcdoc_iframe_onload();"></iframe>
 
   <div style="height:2000vh;"></div>
   <iframe id="below_viewport" src="resources/subframe.html?below-viewport"
@@ -73,6 +90,15 @@
                   onload='parent.below_viewport_srcdoc_iframe_subresource_onload();'></body>"
           loading="lazy" width="200px" height="100px"
           onload="below_viewport_srcdoc_iframe_onload();"></iframe>
+  <iframe id="below_viewport_data_url"
+          src="data:text/html,<p>Subframe</p>"
+          loading="lazy" width="200px" height="100px"
+          onload="below_viewport_data_url_iframe_onload();"></iframe>
+  <!-- This iframe has its `src` set to a blob URL dynamically above -->
+  <iframe id="below_viewport_blob_url"
+          loading="lazy" width="200px" height="100px"
+          onload="below_viewport_blob_url_iframe_onload();"></iframe>
+
 
 
   <!-- This async script loads very slowly in order to ensure that, if the