| <!DOCTYPE html> |
| <title>Regression test to ensure detaching a ScrollTimeline shouldn't crash</title> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| |
| <script src="resources/animation-worklet-tests.js"></script> |
| |
| <style> |
| #scroller { |
| overflow: auto; |
| height: 100px; |
| width: 100px; |
| } |
| |
| #contents { |
| height: 1000px; |
| width: 100%; |
| } |
| </style> |
| |
| <script id="simple_animate" type="text/worklet"> |
| registerAnimator("test_animator", class { |
| animate(currentTime, effect) {} |
| }); |
| </script> |
| |
| <div id="box"></div> |
| <div id="scroller"> |
| <div id="contents"></div> |
| </div> |
| |
| <script> |
| // This is a regression test for the crash seen when http://crrev.com/ddd9f0ee |
| // landed. The root of the crash was assuming a WeakMember from a static object |
| // would still be alive during a USING_PRE_FINALIZER method, which is not true. |
| async_test(t => { |
| runInAnimationWorklet( |
| document.getElementById('simple_animate').textContent |
| ).then(_ => { |
| const box = document.getElementById('box'); |
| const effect = new KeyframeEffect(box, null); |
| |
| let scroller = document.getElementById('scroller'); |
| let timeline = new ScrollTimeline({ |
| scrollSource: scroller, |
| timeRange: 1000, |
| orientation: 'block' |
| }); |
| // Creating the animation will cause the scroller to be registered as being |
| // used in an attached ScrollTimeline. |
| let animation = new WorkletAnimation('test_animator', effect, timeline, {}); |
| |
| // Now free up everything at once. |
| scroller.remove(); |
| animation.cancel(); |
| scroller = undefined; |
| timeline = undefined; |
| animation = undefined; |
| |
| requestAnimationFrame(t.step_func_done(() => { |
| // Force GC - this shouldn't crash. |
| gc(); |
| })); |
| }); |
| }, 'Disposing of an attached ScrollTimeline should not crash'); |
| </script> |