{"ScriptPreparationCode":null,"TestCases":[{"Name":"ScrollListener","Code":"const rootDiv = document.getElementById(\u0027root-div\u0027);\r\nlet pending = nodes.map(n =\u003E ({ model: n }));\r\n\r\nconst scrollHandler = () =\u003E {\r\n const scrollTop = rootDiv.scrollTop;\r\n const viewportBottom = scrollTop \u002B rootDiv.clientHeight;\r\n const margin = rootDiv.clientHeight;\r\n\r\n pending = pending.filter(({ model }) =\u003E {\r\n const scaledY = model.getStartingY() * SCREEN_RATIO;\r\n const scaledRadius = model.getRadius() * SCREEN_RATIO;\r\n if (scaledY \u002B scaledRadius \u003E= scrollTop - margin\r\n \u0026\u0026 scaledY - scaledRadius \u003C= viewportBottom \u002B margin) {\r\n hydrate(model);\r\n return false;\r\n }\r\n return true;\r\n });\r\n};\r\n\r\nrootDiv.addEventListener(\u0027scroll\u0027, scrollHandler, { passive: true });\r\n\r\nfor (const scrollTop of SCROLL_STEPS) {\r\n rootDiv.scrollTop = scrollTop;\r\n rootDiv.dispatchEvent(new Event(\u0027scroll\u0027));\r\n}\r\n\r\nrootDiv.removeEventListener(\u0027scroll\u0027, scrollHandler);","IsDeferred":false},{"Name":"IntersectionObserver","Code":"const rootDiv = document.getElementById(\u0027root-div\u0027);\r\n\r\nconst observer = new IntersectionObserver((entries) =\u003E {\r\n entries.forEach(entry =\u003E {\r\n if (entry.isIntersecting) {\r\n hydrate(entry.target);\r\n observer.unobserve(entry.target);\r\n }\r\n });\r\n}, { root: rootDiv });\r\n\r\nelements.forEach(el =\u003E observer.observe(el));\r\n\r\nfor (const scrollTop of SCROLL_STEPS) {\r\n rootDiv.scrollTop = scrollTop;\r\n void rootDiv.getBoundingClientRect();\r\n}\r\n\r\nobserver.disconnect();","IsDeferred":false}]}