| All of the IntersectionObserver tests feature the following idiom: |
| |
| <script> |
| var observer = new IntersectionObserver(...) |
| function test_function() { |
| var entries = observer.takeRecords(); |
| // Verify entries |
| } |
| onload = function() { |
| observer.observe(target); |
| requestAnimationFrame(() => { |
| setTimeout(() => { |
| setTimeout(test_function); |
| }); |
| }); |
| } |
| |
| Here's the chain of events: |
| |
| - onload |
| - observer.observe() |
| - RAF handler is registered |
| - BeginFrame |
| - RAF handler runs |
| - First setTimeout is registered |
| - UpdateAllLifecyclePhases |
| - IntersectionObserver generates notifications |
| - First setTimeout runs |
| - Second setTimeout is regsitered |
| - Notifications that haven't be taken via takeRecords are delivered |
| - Second setTimeout runs and queues another RAF handler |
| - BeginFrame |
| - RAF handler runs |
| - RAF handler verifies observer notifications via takeRecords or |
| does the setTimeout dance to respond after they've been delivered. |