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