| <!DOCTYPE html> |
| <!-- |
| | This test checks that the observer objects get updated when the elements |
| | themselves move around. |
| | The color of the target element is blue if there is an intersection and |
| | green if there is not. In this test, the initial observation turns the |
| | target blue, but when the target moves above the root, it turns green. |
| | https://www.w3.org/TR/intersection-observer/ |
| --> |
| <html> |
| <head> |
| <style> |
| div { |
| position: absolute; |
| } |
| #root { |
| margin: 100px; |
| background-color: red; |
| width: 250px; |
| height: 150px; |
| } |
| #target { |
| width: 150px; |
| height: 50px; |
| top: 50px; |
| left: 50px; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="root"> |
| <div id="target"></div> |
| </div> |
| |
| <script> |
| if (window.testRunner) { |
| window.testRunner.waitUntilDone(); |
| } |
| |
| window.addEventListener("load", function() { |
| var rootElement = document.querySelector('#root'); |
| var targetElement = document.querySelector('#target'); |
| |
| function handleIntersect(entries, observer) { |
| entries.forEach(function(entry) { |
| if (entry.isIntersecting) { |
| entry.target.style.backgroundColor = "blue"; |
| } else { |
| entry.target.style.backgroundColor = "green"; |
| } |
| }); |
| if (window.testRunner) { |
| window.testRunner.DoNonMeasuredLayout(); |
| } |
| } |
| |
| var options = { |
| root: rootElement, |
| rootMargin: "0px", |
| }; |
| |
| var observer = new IntersectionObserver(handleIntersect, options); |
| observer.observe(targetElement); |
| |
| if (window.testRunner) { |
| window.testRunner.DoNonMeasuredLayout(); |
| } |
| |
| // Without waiting for requestAnimationFrame, only the movement is observed. |
| requestAnimationFrame(() => { |
| window.setTimeout(() => { |
| // Move the target element so that it is clearly no longer |
| // intersecting. An intersection observer update should be |
| // triggered and the callback should run. |
| targetElement.style.top = "-60px"; |
| |
| if (window.testRunner) { |
| window.testRunner.DoNonMeasuredLayout(); |
| window.setTimeout(function() { window.testRunner.notifyDone(); }, 0); |
| } |
| |
| }, 0); |
| }); |
| |
| // Fail after 3 seconds if requestAnimationFrame never triggered. |
| window.setTimeout(function() { |
| window.testRunner.notifyDone(); |
| }, 3000); |
| }); |
| </script> |
| |
| </body> |
| </html> |