| <!DOCTYPE html><!-- webkit-test-runner [ ResizeObserverEnabled=true ] --> |
| <html> |
| <body> |
| <pre id="log">This tests observing an element with an ResizeObserver and removing the element from the document while it is queued for delivery. |
| |
| </pre> |
| <script src="../resources/gc.js"></script> |
| <script> |
| |
| let initialNodeCount; |
| function runTest() |
| { |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| const promises = []; |
| for (let i = 0; i < 5; ++i) |
| promises.push(createResizeObserver()); |
| |
| Promise.all(promises).then(() => { |
| log.textContent += '\nDone\n'; |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| }); |
| } |
| |
| function createResizeObserver() |
| { |
| let element = document.createElement('div'); |
| element.style.width = '100px'; |
| element.style.height = '100px'; |
| |
| let anotherElement = document.createElement('div'); |
| |
| let stopped = false; |
| let testing = false; |
| let resizeObservers = []; |
| |
| function helper(observer) { |
| if (!testing) |
| return; |
| if (stopped) { |
| log.textContent += observer.alive ? 'PASS - ResizeObserver wrapper is alive\n' : 'FAIL - ResizeObserver wrapper is dead\n'; |
| return; |
| } |
| stopped = true; |
| for (const observer of resizeObservers) |
| observer.unobserve(element); |
| resizeObservers = []; |
| element.remove(); |
| element = null; |
| } |
| |
| (() => { |
| for (let i = 0; i < 5; ++i) { |
| const observer = new ResizeObserver(function () { |
| helper(this); |
| gc(); |
| }); |
| observer.alive = true; |
| observer.observe(element); |
| observer.observe(anotherElement); |
| resizeObservers.push(observer); |
| } |
| })(); |
| |
| document.body.appendChild(element); |
| |
| return new Promise((resolve) => { |
| requestAnimationFrame(() => { |
| setTimeout(() => { |
| testing = true; |
| element.style.width = '200px'; |
| requestAnimationFrame(() => { |
| setTimeout(resolve, 0); |
| }); |
| }, 0); |
| }); |
| }); |
| } |
| |
| onload = runTest; |
| |
| </script> |
| </body> |
| </html> |