[IntersectionObserver] Upstream V2 tests to wpt

BUG=827639

Change-Id: I38fcdd0ae40cd3122541ffa8521d4ee30adffc22
Reviewed-on: https://chromium-review.googlesource.com/c/1447267
Reviewed-by: Chris Harrelson <chrishtr@chromium.org>
Reviewed-by: Philip Jägenstedt <foolip@chromium.org>
Commit-Queue: Stefan Zager <szager@chromium.org>
Cr-Commit-Position: refs/heads/master@{#631836}
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/resources/intersection-observer-test-utils.js b/third_party/blink/web_tests/external/wpt/intersection-observer/resources/intersection-observer-test-utils.js
index 8683c8b..44f794b 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/resources/intersection-observer-test-utils.js
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/resources/intersection-observer-test-utils.js
@@ -72,7 +72,15 @@
 //       notifications.
 function waitForNotification(t, f) {
   requestAnimationFrame(function() {
-    requestAnimationFrame(function() { t.step_timeout(f); });
+    requestAnimationFrame(function() { t.step_timeout(f, 0); });
+  });
+}
+
+// If you need to wait until the IntersectionObserver algorithm has a chance
+// to run, but don't need to wait for delivery of the notifications...
+function waitForFrame(t, f) {
+  requestAnimationFrame(function() {
+    t.step_timeout(f, 0);
   });
 }
 
@@ -85,9 +93,19 @@
 //
 // Following these rules will ensure that the test suite will not abort before
 // all test steps have run.
-function runTestCycle(f, description) {
+//
+// If the 'delay' parameter to the IntersectionObserver constructor is used,
+// tests will need to add the same delay to their runTestCycle invocations, to
+// wait for notifications to be generated and delivered.
+function runTestCycle(f, description, delay) {
   async_test(function(t) {
-    waitForNotification(t, t.step_func_done(f));
+    if (delay) {
+      step_timeout(() => {
+        waitForNotification(t, t.step_func_done(f));
+      }, delay);
+    } else {
+      waitForNotification(t, t.step_func_done(f));
+    }
   }, description);
 }
 
@@ -174,4 +192,4 @@
 function checkIsIntersecting(entries, i, expected) {
   assert_equals(entries[i].isIntersecting, expected,
     'entries[' + i + '].target.isIntersecting equals ' + expected);
-}
\ No newline at end of file
+}
diff --git a/third_party/blink/web_tests/http/tests/intersection-observer/resources/v2-subframe.html b/third_party/blink/web_tests/external/wpt/intersection-observer/resources/v2-subframe.html
similarity index 61%
rename from third_party/blink/web_tests/http/tests/intersection-observer/resources/v2-subframe.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/resources/v2-subframe.html
index 686ef0f..295bbf04 100644
--- a/third_party/blink/web_tests/http/tests/intersection-observer/resources/v2-subframe.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/resources/v2-subframe.html
@@ -1,23 +1,22 @@
 <!DOCTYPE html>
 <div id="target">target</div>
 <script>
+var delay = 100;
 var results = [];
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 function waitForNotification(f) {
-  requestAnimationFrame(function () {
-    setTimeout(function () {
-      setTimeout(f)
+  setTimeout(() => {
+    requestAnimationFrame(function () {
+      requestAnimationFrame(function () {
+        setTimeout(f)
+      })
     })
-  })
+  }, delay)
 }
 
 window.addEventListener("message", event => {
   waitForNotification(() => {
-    window.parent.postMessage(results.map(e => { return e.isVisible }), "*");
+    window.parent.postMessage(results.map(e => e.isVisible), "*");
     results = [];
   });
 });
@@ -26,7 +25,7 @@
   var target = document.getElementById("target");
   var observer = new IntersectionObserver(entries => {
     results = entries;
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(document.getElementById("target"));
   window.parent.postMessage("", "*");
 };
diff --git a/third_party/blink/web_tests/intersection-observer/v2/animated-occlusion.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/animated-occlusion.html
similarity index 71%
rename from third_party/blink/web_tests/intersection-observer/v2/animated-occlusion.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/animated-occlusion.html
index 2e076cf..c1eafb7 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/animated-occlusion.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/animated-occlusion.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -37,40 +37,36 @@
 <div id="occluder"></div>
 
 <script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+var delay = 100;
 var entries = [];
 var target;
 var occluder;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
-  assert_equals(window.innerWidth, 800, "Window must be 800 pixels wide.");
-  assert_equals(window.innerHeight, 600, "Window must be 600 pixels high.");
-
   target = document.getElementById("target");
   occluder = document.getElementById("occluder");
   assert_true(!!target, "target exists");
   assert_true(!!occluder, "occluder exists");
   var observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 in a single document using the implicit root, with an animated occluding element.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 in a single document using the implicit root, with an animated occluding element.", delay);
 
 function step0() {
   occluder.style.animation = "rotate .1s linear";
-  setTimeout(() => {
-    runTestCycle(step1, "occluder.style.animation = 'rotate .1s linear'");
+  step_timeout(() => {
+    runTestCycle(step1, "occluder.style.animation = 'rotate .1s linear'", delay);
   }, 50);
-  checkLastEntry(entries, 0, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, true]);
+  checkLastEntry(entries, 0, [0, 100, 0, 100, 0, 100, 0, 100, 0, vw, 0, vh, true, true]);
 }
 
 function step1() {
-  checkLastEntry(entries, 1, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, false]);
+  checkLastEntry(entries, 1, [0, 100, 0, 100, 0, 100, 0, 100, 0, vw, 0, vh, true, false]);
 }
 </script>
diff --git a/third_party/blink/web_tests/intersection-observer/v2/blur-filter.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/blur-filter.html
similarity index 79%
rename from third_party/blink/web_tests/intersection-observer/v2/blur-filter.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/blur-filter.html
index c4782eb..2f55066 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/blur-filter.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/blur-filter.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -30,14 +30,11 @@
 <div id="occluder"></div>
 
 <script>
+var delay = 100;
 var entries = [];
 var target;
 var occluder;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
   target = document.getElementById("target");
   occluder = document.getElementById("occluder");
@@ -45,17 +42,17 @@
   assert_true(!!occluder, "occluder exists");
   var observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.", delay);
 
 function step0() {
   // Occluding elements with opacity=0 should not affect target visibility.
   occluder.style.opacity = "0";
-  runTestCycle(step2, "occluder.style.opacity = 0");
+  runTestCycle(step2, "occluder.style.opacity = 0", delay);
 
   // First notification should report occlusion due to blur filter.
   checkLastEntry(entries, 0, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, false]);
diff --git a/third_party/blink/web_tests/intersection-observer/v2/box-shadow.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/box-shadow.html
similarity index 78%
rename from third_party/blink/web_tests/intersection-observer/v2/box-shadow.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/box-shadow.html
index 6a3c1e0..bcc6980 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/box-shadow.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/box-shadow.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -26,14 +26,11 @@
 <iframe id=target srcdoc="<!DOCTYPE html><div>Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.</div>"></iframe><div id=box-shadow></div>
 
 <script>
+var delay = 100;
 var entries = [];
 var target;
 var occluder;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
   target = document.getElementById("target");
   occluder = document.getElementById("box-shadow");
@@ -41,23 +38,23 @@
   assert_true(!!occluder, "occluder exists");
   let observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 observing an iframe element.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 observing an iframe element.", delay);
 
 function step0() {
   occluder.style.boxShadow = "none";
-  runTestCycle(step1, 'occluder.style.boxShadow = "none"');
+  runTestCycle(step1, 'occluder.style.boxShadow = "none"', delay);
   assert_equals(entries.length, 1, "Initial notification.");
   assert_equals(entries[0].isVisible, false, "Initially occluded.");
 }
 
 function step1() {
   occluder.style.boxShadow = "";
-  runTestCycle(step2, 'occluder.style.boxShadow = ""');
+  runTestCycle(step2, 'occluder.style.boxShadow = ""', delay);
   assert_equals(entries.length, 2, "Notification after removing box shadow.");
   assert_equals(entries[1].isVisible, true, "Visible when box shadow removed.");
 }
diff --git a/third_party/blink/web_tests/http/tests/intersection-observer/v2/cross-origin-effects.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-effects.sub.html
similarity index 79%
rename from third_party/blink/web_tests/http/tests/intersection-observer/v2/cross-origin-effects.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-effects.sub.html
index 546ec74..edb8f02 100644
--- a/third_party/blink/web_tests/http/tests/intersection-observer/v2/cross-origin-effects.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-effects.sub.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
 pre, #log {
@@ -11,16 +12,10 @@
 </style>
 
 <div id="container">
-  <iframe src="http://localhost:8080/intersection-observer/resources/v2-subframe.html"></iframe>
+  <iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/intersection-observer/resources/v2-subframe.html"></iframe>
 </div>
 
 <script>
-function waitForFrame(f) {
-  requestAnimationFrame(() => {
-    setTimeout(f)
-  })
-}
-
 async_test(function(t) {
   let container = document.getElementById("container");
   let iframe = document.querySelector("iframe");
@@ -57,7 +52,7 @@
   window.addEventListener("message", event => {
     if (steps.length) {
       t.step_func(steps.shift(), event);
-      waitForFrame(() => {
+      waitForFrame(t, () => {
         iframe.contentWindow.postMessage("", "*")
       });
     } else {
diff --git a/third_party/blink/web_tests/http/tests/intersection-observer/v2/cross-origin-occlusion.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-occlusion.sub.html
similarity index 79%
rename from third_party/blink/web_tests/http/tests/intersection-observer/v2/cross-origin-occlusion.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-occlusion.sub.html
index 1556ade4..6f9fa57 100644
--- a/third_party/blink/web_tests/http/tests/intersection-observer/v2/cross-origin-occlusion.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-occlusion.sub.html
@@ -1,6 +1,7 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
 pre, #log {
@@ -21,16 +22,10 @@
 }
 </style>
 
-<iframe src="http://localhost:8080/intersection-observer/resources/v2-subframe.html"></iframe>
+<iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/intersection-observer/resources/v2-subframe.html"></iframe>
 <div id="occluder"></div>
 
 <script>
-function waitForFrame(f) {
-  requestAnimationFrame(() => {
-    setTimeout(f)
-  })
-}
-
 async_test(function(t) {
   let iframe = document.querySelector("iframe");
   let occluder = document.getElementById("occluder");
@@ -61,7 +56,7 @@
   window.addEventListener("message", event => {
     if (steps.length) {
       t.step_func(steps.shift(), event);
-      waitForFrame(() => {
+      waitForFrame(t, () => {
         iframe.contentWindow.postMessage("", "*");
       });
     } else {
diff --git a/third_party/blink/web_tests/intersection-observer/v2/delay-test.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/delay-test.html
similarity index 92%
rename from third_party/blink/web_tests/intersection-observer/v2/delay-test.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/delay-test.html
index 52ab5b84..086301c4 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/delay-test.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/delay-test.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -43,16 +43,7 @@
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
   // The first notification should be sent without delay.
-  waitForNotification(t.step_func(step0));
-
-  function step0() {
-    assert_equals(entries.length, 1);
-    assert_true(entries[0].isVisible);
-    // This should trigger a notification on the next run.
-    occluder.style.marginTop = "-10px";
-    // Enter a rAF loop until the delay timer expires.
-    waitForDelay(false);
-  }
+  waitForNotification(t, t.step_func(step0));
 
   function waitForDelay(timerExpiredBeforeLastFrame) {
     requestAnimationFrame(t.step_func(() => {
@@ -71,5 +62,14 @@
     }));
   }
 
+  function step0() {
+    assert_equals(entries.length, 1);
+    assert_true(entries[0].isVisible);
+    // This should trigger a notification on the next run.
+    occluder.style.marginTop = "-10px";
+    // Enter a rAF loop until the delay timer expires.
+    waitForDelay(false);
+  }
+
 }, "'delay' parameter throttles frequency of notifications.");
 </script>
diff --git a/third_party/blink/web_tests/intersection-observer/v2/iframe-target.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/iframe-target.html
similarity index 73%
rename from third_party/blink/web_tests/intersection-observer/v2/iframe-target.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/iframe-target.html
index d7cbf27..3e53ee5 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/iframe-target.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/iframe-target.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -22,24 +22,21 @@
 <iframe srcdoc="<!DOCTYPE html><div>Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.</div>"></iframe>
 
 <script>
+var delay = 100;
 var entries = [];
 var target;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
   target = document.querySelector("iframe");
   assert_true(!!target, "target exists");
   var observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 observing an iframe element.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 observing an iframe element.", delay);
 
 function step0() {
   checkLastEntry(entries, 0, [0, 150, 0, 100, 0, 150, 0, 100, 0, 800, 0, 600, true, true]);
diff --git a/third_party/blink/web_tests/intersection-observer/v2/simple-effects.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-effects.html
similarity index 75%
rename from third_party/blink/web_tests/intersection-observer/v2/simple-effects.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-effects.html
index 913da21..2b7a83a9 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/simple-effects.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-effects.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -28,14 +28,11 @@
 </div>
 
 <script>
+var delay = 100;
 var entries = [];
 var target;
 var effects;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
   target = document.getElementById("target");
   effects = document.getElementById("effects");
@@ -43,28 +40,28 @@
   assert_true(!!effects, "effects exists");
   var observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 in a single document using the implicit root, with a non-zero opacity ancestor.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 in a single document using the implicit root, with a non-zero opacity ancestor.", delay);
 
 function step0() {
   effects.style.opacity = "0.99";
-  runTestCycle(step1, "effects.style.opacity = 0.99");
+  runTestCycle(step1, "effects.style.opacity = 0.99", delay);
   checkLastEntry(entries, 0, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, true]);
 }
 
 function step1() {
   effects.style.opacity = "1";
-  runTestCycle(step2, "effects.style.opacity = 1");
+  runTestCycle(step2, "effects.style.opacity = 1", delay);
   checkLastEntry(entries, 1, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, false]);
 }
 
 function step2() {
   effects.style.filter = "grayscale(50%)";
-  runTestCycle(step3, "effects.style.filter = grayscale(50%)");
+  runTestCycle(step3, "effects.style.filter = grayscale(50%)", delay);
   checkLastEntry(entries, 2, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, true]);
 }
 
diff --git a/third_party/blink/web_tests/intersection-observer/v2/simple-occlusion-svg-foreign-object.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
similarity index 78%
rename from third_party/blink/web_tests/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
index a13938a..fcdff67 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -32,14 +32,11 @@
 </svg>
 
 <script>
+var delay = 100;
 var entries = [];
 var target;
 var occluder;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
   target = document.getElementById("target");
   occluder = document.getElementById("occluder");
@@ -47,23 +44,23 @@
   assert_true(!!occluder, "occluder exists");
   var observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.", delay);
 
 function step0() {
   svg.style.marginTop = "-10px";
-  runTestCycle(step1, "svg.style.marginTop = '-10px'");
+  runTestCycle(step1, "svg.style.marginTop = '-10px'", delay);
   checkLastEntry(entries, 0, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, true]);
 }
 
 function step1() {
   // Occluding elements with opacity=0 should not affect target visibility.
   svg.style.opacity = "0";
-  runTestCycle(step2, "occluder.style.opacity = 0");
+  runTestCycle(step2, "occluder.style.opacity = 0", delay);
   checkLastEntry(entries, 1, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, false]);
 }
 
diff --git a/third_party/blink/web_tests/intersection-observer/v2/simple-occlusion.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion.html
similarity index 77%
rename from third_party/blink/web_tests/intersection-observer/v2/simple-occlusion.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion.html
index 16f2f22..ea1ee31 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/simple-occlusion.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -28,14 +28,11 @@
 <div id="occluder"></div>
 
 <script>
+var delay = 100;
 var entries = [];
 var target;
 var occluder;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
   target = document.getElementById("target");
   occluder = document.getElementById("occluder");
@@ -43,23 +40,23 @@
   assert_true(!!occluder, "occluder exists");
   var observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 in a single document using the implicit root, with an occluding element.", delay);
 
 function step0() {
   occluder.style.marginTop = "-10px";
-  runTestCycle(step1, "occluder.style.marginTop = '-10px'");
+  runTestCycle(step1, "occluder.style.marginTop = '-10px'", delay);
   checkLastEntry(entries, 0, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, true]);
 }
 
 function step1() {
   // Occluding elements with opacity=0 should not affect target visibility.
   occluder.style.opacity = "0";
-  runTestCycle(step2, "occluder.style.opacity = 0");
+  runTestCycle(step2, "occluder.style.opacity = 0", delay);
   checkLastEntry(entries, 1, [0, 100, 0, 100, 0, 100, 0, 100, 0, 800, 0, 600, true, false]);
 }
 
diff --git a/third_party/blink/web_tests/intersection-observer/v2/text-shadow.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/text-shadow.html
similarity index 79%
rename from third_party/blink/web_tests/intersection-observer/v2/text-shadow.html
rename to third_party/blink/web_tests/external/wpt/intersection-observer/v2/text-shadow.html
index 6a49ae3..c6445c5 100644
--- a/third_party/blink/web_tests/intersection-observer/v2/text-shadow.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/text-shadow.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
 
 <style>
@@ -29,14 +29,11 @@
 <iframe id=target srcdoc="<!DOCTYPE html><div>Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum.</div>"></iframe><div id=text-shadow>O</div>
 
 <script>
+var delay = 100;
 var entries = [];
 var target;
 var occluder;
 
-if (window.internals) {
-  internals.DisableIntersectionObserverThrottleDelay();
-}
-
 runTestCycle(function() {
   target = document.getElementById("target");
   occluder = document.getElementById("text-shadow");
@@ -44,23 +41,23 @@
   assert_true(!!occluder, "occluder exists");
   let observer = new IntersectionObserver(function(changes) {
     entries = entries.concat(changes)
-  }, {trackVisibility: true, delay: 100});
+  }, {trackVisibility: true, delay: delay});
   observer.observe(target);
   entries = entries.concat(observer.takeRecords());
   assert_equals(entries.length, 0, "No initial notifications.");
-  runTestCycle(step0, "First rAF.");
-}, "IntersectionObserverV2 observing an iframe element.");
+  runTestCycle(step0, "First rAF.", delay);
+}, "IntersectionObserverV2 observing an iframe element.", delay);
 
 function step0() {
   occluder.style.textShadow = "none";
-  runTestCycle(step1, 'occluder.style.textShadow = "none"');
+  runTestCycle(step1, 'occluder.style.textShadow = "none"', delay);
   assert_equals(entries.length, 1, "Initial notification.");
   assert_equals(entries[0].isVisible, false, "Initially occluded.");
 }
 
 function step1() {
   occluder.style.textShadow = "";
-  runTestCycle(step2, 'occluder.style.textShadow = ""');
+  runTestCycle(step2, 'occluder.style.textShadow = ""', delay);
   assert_equals(entries.length, 2, "Notification after removing text shadow.");
   assert_equals(entries[1].isVisible, true, "Visible when text shadow removed.");
 }
diff --git a/third_party/blink/web_tests/external/wpt/lint.whitelist b/third_party/blink/web_tests/external/wpt/lint.whitelist
index 64ff029..0d066ac 100644
--- a/third_party/blink/web_tests/external/wpt/lint.whitelist
+++ b/third_party/blink/web_tests/external/wpt/lint.whitelist
@@ -174,6 +174,7 @@
 SET TIMEOUT: html/webappapis/scripting/processing-model-2/*
 SET TIMEOUT: IndexedDB/*
 SET TIMEOUT: infrastructure/*
+SET TIMEOUT: intersection-observer/resources/v2-subframe.html
 SET TIMEOUT: intersection-observer/target-in-different-window.html
 SET TIMEOUT: media-source/mediasource-util.js
 SET TIMEOUT: media-source/URL-createObjectURL-revoke.html