Index: third_party/WebKit/LayoutTests/intersection-observer/timestamp.html |
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html b/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html |
index 8d061a94337a050d3f07bf4cb2d395a763fedb7a..6667f546c4831a54e5ff91d1175d3e569f3541c7 100644 |
--- a/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html |
+++ b/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html |
@@ -1,79 +1,98 @@ |
<!DOCTYPE html> |
-<script src="../resources/js-test.js"></script> |
-<script src="../resources/intersection-observer-helper-functions.js"></script> |
-<div id="beforeFrame" style="width:100%; height:700px;"></div> |
-<div id="afterFrame" style="width:100%; height:700px;"></div> |
+<script src="../resources/testharness.js"></script> |
+<script src="../resources/testharnessreport.js"></script> |
+<script src="./resources/intersection-observer-test-utils.js"></script> |
+ |
+<style> |
+pre, #log { |
+ position: absolute; |
+ top: 0; |
+ left: 200px; |
+} |
+.spacer { |
+ height: 700px; |
+} |
+ |
+</style> |
+<div id="leading-space" class="spacer"></div> |
+<div id="trailing-space" class="spacer"></div> |
<script> |
-description("Test that intersection observer time is relative to time in the callback context."); |
+// Pick this number to be comfortably greater than the length of two frames at 60Hz. |
+var timeSkew = 40; |
+ |
var topWindowEntries = []; |
var iframeWindowEntries = []; |
-var topWindowObserver; |
-var iframeWindowObserver; |
var targetIframe; |
-var iframeScroller; |
-var topWindowTime; |
-var iframeWindowTime; |
-var timestampTolerance = 24; |
+var topWindowTimeBeforeNotification; |
+var iframeWindowTimeBeforeNotification; |
-function step0() { |
- // Test results are only significant if there's a sufficient gap between |
- // top window time and iframe window time. |
- topWindowTime = performance.now(); |
- iframeWindowTime = targetIframe.contentWindow.performance.now(); |
- shouldBeGreaterThan("topWindowTime - iframeWindowTime", "2.5 * timestampTolerance"); |
+async_test(function(t) { |
+ assert_equals(window.innerWidth, 800, "Window must be 800 pixels wide."); |
+ assert_equals(window.innerHeight, 600, "Window must be 600 pixels high."); |
- shouldBeEqualToNumber("topWindowEntries.length", 0); |
- shouldBeEqualToNumber("iframeWindowEntries.length", 0); |
- document.scrollingElement.scrollTop = 200; |
- iframeScroller.scrollTop = 250; |
- waitForNotification(step1); |
-} |
+ setTimeout(function() { |
+ targetIframe = document.createElement("iframe"); |
+ assert_true(!!targetIframe, "iframe exists"); |
+ targetIframe.src = "resources/timestamp-subframe.html"; |
+ var trailingSpace = document.getElementById("trailing-space"); |
+ assert_true(!!trailingSpace, "trailing-space exists"); |
+ trailingSpace.parentNode.insertBefore(targetIframe, trailingSpace); |
+ targetIframe.onload = function() { |
+ var target = targetIframe.contentDocument.getElementById("target"); |
+ var iframeScroller = targetIframe.contentDocument.scrollingElement; |
-function step1() { |
- topWindowTime = performance.now(); |
- iframeWindowTime = targetIframe.contentWindow.performance.now(); |
- shouldBeEqualToNumber("topWindowEntries.length", 1); |
- if (topWindowEntries.length) |
- shouldBeCloseTo("topWindowEntries[0].time", "topWindowTime", timestampTolerance); |
+ // Observer created here, callback created in iframe context. Timestamps should be |
+ // from this window. |
+ var observer = new IntersectionObserver( |
+ targetIframe.contentDocument.createObserverCallback(topWindowEntries), {}); |
+ assert_true(!!observer, "Observer exists"); |
+ observer.observe(target); |
- shouldBeEqualToNumber("iframeWindowEntries.length", 1); |
- if (iframeWindowEntries.length) { |
- shouldBeCloseTo("iframeWindowEntries[0].time", "iframeWindowTime", timestampTolerance); |
- } |
- waitForNotification(finishJSTest); |
- document.scrollingElement.scrollTop = 0; |
+ // Callback created here, observer created in iframe. Timestamps should be |
+ // from iframe window. |
+ observer = targetIframe.contentDocument.createObserver(function(newEntries) { |
+ iframeWindowEntries = iframeWindowEntries.concat(newEntries); |
+ }); |
+ observer.observe(target); |
+ runTestCycle(step1, "First rAF after iframe is loaded."); |
+ t.done(); |
+ }; |
+ }, timeSkew); |
+}, "Check that timestamps correspond to the to execution context that created the observer."); |
+ |
+function step1() { |
+ document.scrollingElement.scrollTop = 200; |
+ targetIframe.contentDocument.scrollingElement.scrollTop = 250; |
+ topWindowTimeBeforeNotification = performance.now(); |
+ iframeWindowTimeBeforeNotification = targetIframe.contentWindow.performance.now(); |
+ runTestCycle(step2, "Generate notifications."); |
+ assert_equals(topWindowEntries.length, 0, "No notifications to top window observer."); |
+ assert_equals(iframeWindowEntries.length, 0, "No notifications to iframe observer."); |
} |
-function runTest() { |
- var target = targetIframe.contentDocument.getElementById("target"); |
- iframeScroller = targetIframe.contentDocument.scrollingElement; |
+function step2() { |
+ document.scrollingElement.scrollTop = 0; |
+ var topWindowTimeAfterNotification = performance.now(); |
+ var iframeWindowTimeAfterNotification = targetIframe.contentWindow.performance.now(); |
- // Observer created here, callback created in iframe context. Timestamps should be |
- // from this window. |
- topWindowObserver = new IntersectionObserver(targetIframe.contentDocument.createObserverCallback(topWindowEntries), {}); |
- topWindowObserver.observe(target); |
+ // Test results are only significant if there's a gap between |
+ // top window time and iframe window time. |
+ assert_greater_than(topWindowTimeBeforeNotification, iframeWindowTimeAfterNotification, |
+ "Time ranges for top and iframe windows are disjoint."); |
- // Callback created here, observer created in iframe. Timestamps should be |
- // from iframe window. |
- iframeWindowObserver = targetIframe.contentDocument.createObserver(function(newEntries) { |
- for (var i = 0; i < newEntries.length; i++) |
- iframeWindowEntries.push(newEntries[i]); |
- }); |
- iframeWindowObserver.observe(target); |
+ assert_equals(topWindowEntries.length, 1, "Top window observer has one notification."); |
+ assert_between_inclusive( |
+ topWindowEntries[0].time, |
+ topWindowTimeBeforeNotification, |
+ topWindowTimeAfterNotification, |
+ "Notification to top window observer is within the expected range."); |
- waitForNotification(step0); |
+ assert_equals(iframeWindowEntries.length, 1, "Iframe observer has one notification."); |
+ assert_between_inclusive( |
+ iframeWindowEntries[0].time, |
+ iframeWindowTimeBeforeNotification, |
+ iframeWindowTimeAfterNotification, |
+ "Notification to iframe observer is within the expected range."); |
} |
- |
-onload = function() { |
- setTimeout(function() { |
- targetIframe = document.createElement("iframe"); |
- targetIframe.src = "../resources/intersection-observer-timestamp-subframe.html"; |
- targetIframe.style = "height: 100px; overflow-y: scroll"; |
- var afterFrame = document.getElementById("afterFrame"); |
- afterFrame.parentNode.insertBefore(targetIframe, afterFrame); |
- targetIframe.onload = runTest; |
- }, 2.5 * timestampTolerance); |
-}; |
- |
</script> |