Chromium Code Reviews| 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 |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e681f423905aa83467d6fc0c4d6ca3d06a09dd0f |
| --- /dev/null |
| +++ b/third_party/WebKit/LayoutTests/intersection-observer/timestamp.html |
| @@ -0,0 +1,81 @@ |
| +<!DOCTYPE html> |
| +<script src="../resources/js-test.js"></script> |
| +<script src="helper-functions.js"></script> |
| +<div id="beforeFrame" style="width:100%; height:700px;"></div> |
| +<div id="afterFrame" style="width:100%; height:700px;"></div> |
| + |
| +<script> |
| +description("Test that intersection observer time is relative to time in the callback context."); |
| +var topWindowEntries = []; |
| +var iframeWindowEntries = []; |
| +var targetIframe; |
| +var iframeScroller; |
| +var topWindowTime; |
| +var iframeWindowTime; |
| +var timestampTolerance = 24; // 1.5 times frame duration. |
| + |
| +function step0() { |
| + setTimeout(function() { |
|
ojan
2016/02/03 01:46:28
Why do you need the setTimeout?
szager1
2016/02/03 01:54:45
The setTimeout's are to allow the IO notifications
|
| + // 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 * timestampTolerance"); |
| + |
| + shouldBeEqualToNumber("topWindowEntries.length", 0); |
| + shouldBeEqualToNumber("iframeWindowEntries.length", 0); |
| + document.scrollingElement.scrollTop = 200; |
| + iframeScroller.scrollTop = 250; |
| + requestAnimationFrame(step1); |
| + }); |
| +} |
| + |
| +function step1() { |
| + setTimeout(function() { |
|
ojan
2016/02/03 01:46:28
Ditto.
|
| + topWindowTime = performance.now(); |
| + iframeWindowTime = targetIframe.contentWindow.performance.now(); |
| + shouldBeEqualToNumber("topWindowEntries.length", 1); |
| + if (topWindowEntries.length) { |
| + shouldBeCloseTo("topWindowEntries[0].time", "topWindowTime", timestampTolerance); |
| + } |
| + shouldBeEqualToNumber("iframeWindowEntries.length", 1); |
| + if (iframeWindowEntries.length) { |
| + shouldBeCloseTo("iframeWindowEntries[0].time", "iframeWindowTime", timestampTolerance); |
| + } |
| + finishTest(); |
| + document.scrollingElement.scrollTop = 0; |
| + }); |
| +} |
| + |
| +function runTest() { |
| + var target = targetIframe.contentDocument.getElementById("target"); |
| + iframeScroller = targetIframe.contentDocument.scrollingElement; |
| + |
| + // Observer created here, callback created in iframe context. Timestamps should be |
| + // from this window. |
| + var observer = new IntersectionObserver(targetIframe.contentDocument.createObserverCallback(topWindowEntries), {}); |
| + observer.observe(target); |
| + |
| + // Callback created here, observer created in iframe. Timestamps should be |
| + // from iframe window. |
| + observer = targetIframe.contentDocument.createObserver(function(newEntries) { |
| + for (var i = 0; i < newEntries.length; i++) |
| + iframeWindowEntries.push(newEntries[i]); |
| + }); |
| + observer.observe(target); |
| + |
| + step0(); |
| +} |
| + |
| +window.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; |
| + }, 100); |
| +}; |
| + |
| +</script> |