Title: [235923] trunk/LayoutTests/imported/w3c
Revision
235923
Author
[email protected]
Date
2018-09-11 17:17:24 -0700 (Tue, 11 Sep 2018)

Log Message

[IntersectionObserver] Update WPTs to the latest upstream version
https://bugs.webkit.org/show_bug.cgi?id=189515

Reviewed by Youenn Fablet.

* web-platform-tests/intersection-observer/initial-observation-with-threshold-expected.txt: Added.
* web-platform-tests/intersection-observer/initial-observation-with-threshold.html: Added.
* web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js:
(waitForNotification):
* web-platform-tests/intersection-observer/w3c-import.log:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (235922 => 235923)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2018-09-11 23:41:49 UTC (rev 235922)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2018-09-12 00:17:24 UTC (rev 235923)
@@ -1,3 +1,16 @@
+2018-09-11  Ali Juma  <[email protected]>
+
+        [IntersectionObserver] Update WPTs to the latest upstream version
+        https://bugs.webkit.org/show_bug.cgi?id=189515
+
+        Reviewed by Youenn Fablet.
+
+        * web-platform-tests/intersection-observer/initial-observation-with-threshold-expected.txt: Added.
+        * web-platform-tests/intersection-observer/initial-observation-with-threshold.html: Added.
+        * web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js:
+        (waitForNotification):
+        * web-platform-tests/intersection-observer/w3c-import.log:
+
 2018-09-11  Youenn Fablet  <[email protected]>
 
         Remove MediaDevices NoInterfaceObject

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/initial-observation-with-threshold-expected.txt (0 => 235923)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/initial-observation-with-threshold-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/initial-observation-with-threshold-expected.txt	2018-09-12 00:17:24 UTC (rev 235923)
@@ -0,0 +1,5 @@
+
+PASS First observation with a threshold. 
+FAIL First rAF assert_equals: entries[0].isIntersecting expected false but got true
+PASS root.scrollTop = 20 
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/initial-observation-with-threshold.html (0 => 235923)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/initial-observation-with-threshold.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/initial-observation-with-threshold.html	2018-09-12 00:17:24 UTC (rev 235923)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<script src=""
+<script src=""
+<script src=""
+
+<style>
+pre, #log {
+  position: absolute;
+  top: 0;
+  left: 200px;
+}
+.spacer {
+  height: calc(100vh + 100px);
+}
+#root {
+  display: inline-block;
+  overflow-y: scroll;
+  height: 240px;
+  border: 3px solid black;
+}
+#target {
+  width: 100px;
+  height: 100px;
+  margin: 200px 0 0 0;
+  background-color: green;
+}
+</style>
+
+<div id="root">
+  <div id="target"></div>
+</div>
+
+<script>
+var entries = [];
+var root, target;
+
+runTestCycle(function() {
+  target = document.getElementById("target");
+  assert_true(!!target, "target exists");
+  root = document.getElementById("root");
+  assert_true(!!root, "root exists");
+  var observer = new IntersectionObserver(function(changes) {
+    entries = entries.concat(changes)
+  }, { root: root, threshold: [0.5] });
+  observer.observe(target);
+  entries = entries.concat(observer.takeRecords());
+  assert_equals(entries.length, 0, "No initial notifications.");
+  runTestCycle(step0, "First rAF");
+}, "First observation with a threshold.");
+
+function step0() {
+  root.scrollTop = 20;
+  runTestCycle(step1, "root.scrollTop = 20");
+  checkLastEntry(entries, 0, [ 11, 111, 211, 311, 11, 111, 211, 251, 11, 111, 11, 251, false]);
+}
+
+function step1() {
+  checkLastEntry(entries, 1, [ 11, 111, 191, 291, 11, 111, 191, 251, 11, 111, 11, 251, true]);
+}
+</script>

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js (235922 => 235923)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js	2018-09-11 23:41:49 UTC (rev 235922)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js	2018-09-12 00:17:24 UTC (rev 235923)
@@ -6,23 +6,73 @@
 //   - Modify DOM in a way that should trigger an IntersectionObserver callback.
 // - BeginFrame
 //   - requestAnimationFrame handler runs
-//     - First step_timeout()
+//     - Second requestAnimationFrame()
 //   - Style, layout, paint
 //   - IntersectionObserver generates new notifications
 //     - Posts a task to deliver notifications
-// - First step_timeout handler runs
-//   - Second step_timeout()
 // - Task to deliver IntersectionObserver notifications runs
 //   - IntersectionObserver callbacks run
-// - Second step_timeout handler runs
+// - Second requestAnimationFrameHandler runs
+//     - step_timeout()
+// - step_timeout handler runs
 //   - myTestFunction1()
 //     - [optional] waitForNotification(myTestFunction2)
 //       - requestAnimationFrame()
 //     - Verify newly-arrived IntersectionObserver notifications
 //     - [optional] Modify DOM to trigger new notifications
+//
+// Ideally, it should be sufficient to use requestAnimationFrame followed
+// by two step_timeouts, with the first step_timeout firing in between the
+// requestAnimationFrame handler and the task to deliver notifications.
+// However, the precise timing of requestAnimationFrame, the generation of
+// a new display frame (when IntersectionObserver notifications are
+// generated), and the delivery of these events varies between engines, making
+// this tricky to test in a non-flaky way.
+//
+// In particular, in WebKit, requestAnimationFrame and the generation of
+// a display frame are two separate tasks, so a step_timeout called within
+// requestAnimationFrame can fire before a display frame is generated.
+//
+// In Gecko, on the other hand, requestAnimationFrame and the generation of
+// a display frame are a single task, and IntersectionObserver notifications
+// are generated during this task. However, the task posted to deliver these
+// notifications can fire after the following requestAnimationFrame.
+//
+// This means that in general, by the time the second requestAnimationFrame
+// handler runs, we know that IntersectionObservations have been generated,
+// and that a task to deliver these notifications has been posted (though
+// possibly not yet delivered). Then, by the time the step_timeout() handler
+// runs, these notifications have been delivered.
+//
+// Since waitForNotification uses a double-rAF, it is now possible that
+// IntersectionObservers may have generated more notifications than what is
+// under test, but have not yet scheduled the new batch of notifications for
+// delivery. As a result, observer.takeRecords should NOT be used in tests:
+//
+// - myTestFunction0()
+//   - waitForNotification(myTestFunction1)
+//     - requestAnimationFrame()
+//   - Modify DOM in a way that should trigger an IntersectionObserver callback.
+// - BeginFrame
+//   - requestAnimationFrame handler runs
+//     - Second requestAnimationFrame()
+//   - Style, layout, paint
+//   - IntersectionObserver generates a batch of notifications
+//     - Posts a task to deliver notifications
+// - Task to deliver IntersectionObserver notifications runs
+//   - IntersectionObserver callbacks run
+// - BeginFrame
+//   - Second requestAnimationFrameHandler runs
+//     - step_timeout()
+//   - IntersectionObserver generates another batch of notifications
+//     - Post task to deliver notifications
+// - step_timeout handler runs
+//   - myTestFunction1()
+//     - At this point, observer.takeRecords will get the second batch of
+//       notifications.
 function waitForNotification(t, f) {
   requestAnimationFrame(function() {
-    t.step_timeout(function() { t.step_timeout(f); });
+    requestAnimationFrame(function() { t.step_timeout(f); });
   });
 }
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/w3c-import.log (235922 => 235923)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/w3c-import.log	2018-09-11 23:41:49 UTC (rev 235922)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/w3c-import.log	2018-09-12 00:17:24 UTC (rev 235923)
@@ -24,6 +24,7 @@
 /LayoutTests/imported/w3c/web-platform-tests/intersection-observer/edge-inclusive-intersection.html
 /LayoutTests/imported/w3c/web-platform-tests/intersection-observer/idlharness.window.js
 /LayoutTests/imported/w3c/web-platform-tests/intersection-observer/iframe-no-root.html
+/LayoutTests/imported/w3c/web-platform-tests/intersection-observer/initial-observation-with-threshold.html
 /LayoutTests/imported/w3c/web-platform-tests/intersection-observer/inline-client-rect.html
 /LayoutTests/imported/w3c/web-platform-tests/intersection-observer/isIntersecting-change-events.html
 /LayoutTests/imported/w3c/web-platform-tests/intersection-observer/multiple-targets.html
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to