haikuwebkit/LayoutTests/animations/leak-document-with-css-anim...

49 lines
1.2 KiB
HTML
Raw Permalink Normal View History

[Web Animations] Turn Web Animations with CSS integration on https://bugs.webkit.org/show_bug.cgi?id=184819 <rdar://problem/39597337> Reviewed by Dean Jackson. LayoutTests/imported/mozilla: * css-animations/test_animation-cancel.html: * css-animations/test_animation-computed-timing.html: * css-animations/test_animation-currenttime.html: * css-animations/test_animation-finish.html: * css-animations/test_animation-finished.html: * css-animations/test_animation-id.html: * css-animations/test_animation-pausing.html: * css-animations/test_animation-playstate.html: * css-animations/test_animation-ready.html: * css-animations/test_animation-reverse.html: * css-animations/test_animation-starttime.html: * css-animations/test_animations-dynamic-changes.html: * css-animations/test_cssanimation-animationname.html: * css-animations/test_document-get-animations.html: * css-animations/test_effect-target.html: * css-animations/test_element-get-animations.html: * css-animations/test_event-dispatch.html: * css-animations/test_event-order.html: * css-animations/test_keyframeeffect-getkeyframes.html: * css-animations/test_pseudoElement-get-animations.html: * css-animations/test_setting-effect.html: * css-transitions/test_animation-cancel.html: * css-transitions/test_animation-computed-timing.html: * css-transitions/test_animation-currenttime.html: * css-transitions/test_animation-finished.html: * css-transitions/test_animation-pausing.html: * css-transitions/test_animation-ready.html: * css-transitions/test_animation-starttime.html: * css-transitions/test_csstransition-transitionproperty.html: * css-transitions/test_document-get-animations.html: * css-transitions/test_effect-target.html: * css-transitions/test_element-get-animations.html: * css-transitions/test_event-dispatch.html: * css-transitions/test_keyframeeffect-getkeyframes.html: * css-transitions/test_pseudoElement-get-animations.html: * css-transitions/test_setting-effect.html: LayoutTests/imported/w3c: * web-platform-tests/css-timing-1/frames-timing-functions-output.html: * web-platform-tests/css/css-logical/animation-003.tentative.html: * web-platform-tests/css/css-scoping/keyframes-001.html: * web-platform-tests/web-animations/animation-model/keyframe-effects/effect-value-context.html: * web-platform-tests/web-animations/interfaces/Animatable/animate.html: * web-platform-tests/web-animations/timing-model/animations/current-time.html: Source/WebCore: * page/RuntimeEnabledFeatures.h: Source/WebKit: * Shared/WebPreferences.yaml: Source/WebKitLegacy/mac: * WebView/WebPreferences.mm: (+[WebPreferences initialize]): Source/WebKitLegacy/win: * WebPreferences.cpp: (WebPreferences::initializeDefaultSettings): Tools: * DumpRenderTree/TestOptions.h: LayoutTests: * TestExpectations: * animations/3d/matrix-transform-type-animation.html: * animations/3d/replace-filling-transform.html: * animations/3d/transform-origin-vs-functions.html: * animations/3d/transform-perspective.html: * animations/additive-transform-animations.html: * animations/animation-border-overflow.html: * animations/animation-callback-timestamp.html: * animations/animation-controller-drt-api.html: * animations/animation-direction-alternate-reverse-expected.txt: * animations/animation-direction-alternate-reverse.html: * animations/animation-direction-reverse-fill-mode-hardware.html: * animations/animation-direction-reverse-hardware-opacity.html: * animations/animation-direction-reverse-hardware.html: * animations/animation-direction-reverse-non-hardware.html: * animations/animation-direction-reverse-timing-functions-hardware.html: * animations/animation-direction-reverse-timing-functions.html: * animations/animation-direction.html: * animations/animation-followed-by-transition.html: * animations/animation-hit-test-transform.html: * animations/animation-hit-test.html: * animations/animation-internals-api-expected.txt: Removed. * animations/animation-internals-api-multiple-keyframes-expected.txt: Removed. * animations/animation-internals-api-multiple-keyframes.html: Removed. * animations/animation-internals-api.html: Removed. * animations/animation-offscreen-to-onscreen.html: * animations/animation-playstate-paused-style-resolution.html: * animations/big-rotation-expected.txt: * animations/big-rotation.html: * animations/change-completed-animation-transform.html: * animations/change-keyframes.html: * animations/combo-transform-rotate+scale.html: * animations/cross-fade-background-image.html: * animations/cross-fade-border-image-source.html: * animations/cross-fade-list-style-image.html: * animations/cross-fade-webkit-mask-box-image.html: * animations/duplicate-keys-expected.html: * animations/duplicate-keys.html: * animations/duplicated-keyframes-name.html: * animations/fill-forwards-end-state.html: * animations/fill-mode-forwards-zero-duration-expected.txt: * animations/fill-mode-forwards-zero-duration.html: * animations/fill-mode-removed.html: * animations/font-variations/font-stretch.html: * animations/font-variations/font-style.html: * animations/font-variations/font-variation-settings-order.html: * animations/font-variations/font-variation-settings-unlike.html: * animations/font-variations/font-variation-settings.html: * animations/font-variations/font-weight.html: * animations/generic-from-to.html: * animations/import.html: * animations/keyframe-multiple-timing-functions-transform.html: * animations/keyframe-timing-functions-transform.html: * animations/keyframe-timing-functions.html: * animations/keyframe-timing-functions2.html: * animations/keyframes-comma-separated.html: * animations/keyframes-dynamic.html: * animations/keyframes-infinite-iterations.html: * animations/keyframes-invalid-keys.html: * animations/keyframes-out-of-order.html: * animations/keyframes.html: * animations/leak-document-with-css-animation.html: * animations/lineheight-animation.html: * animations/longhand-timing-function.html: * animations/matrix-anim.html: * animations/missing-from-to-transforms.html: * animations/missing-from-to.html: * animations/missing-keyframe-properties-repeating.html: * animations/missing-keyframe-properties-timing-function.html: * animations/missing-keyframe-properties.html: * animations/missing-values-first-keyframe.html: * animations/missing-values-last-keyframe.html: * animations/multiple-animations-timing-function.html: * animations/multiple-animations.html: * animations/multiple-keyframes.html: * animations/negative-delay.html: * animations/pause-crash.html: * animations/play-state-start-paused.html: * animations/resources/animation-leak-iframe.html: * animations/simultaneous-start-left.html: * animations/simultaneous-start-transform.html: * animations/spring-function.html: * animations/stacking-context-unchanged-while-running.html: * animations/stop-animation-on-suspend.html: * animations/suspend-resume-animation-events.html: * animations/timing-functions.html: * animations/transition-and-animation-1.html: * animations/transition-and-animation-2.html: * animations/transition-and-animation-3.html: * animations/trigger-container-scroll-boundaries.html: * animations/trigger-container-scroll-empty.html: * animations/trigger-container-scroll-simple.html: * animations/unanimated-style.html: * animations/unprefixed-keyframes.html: * animations/width-using-ems.html: * compositing/animation/animated-composited-inside-hidden.html: * compositing/animation/computed-style-during-delay.html: * compositing/animation/layer-for-filling-animation.html: * compositing/backing/backface-visibility-flip.html: * compositing/backing/transform-transition-from-outside-view.html: * compositing/contents-scale/animating.html: * compositing/layer-creation/animation-overlap-with-children.html: * compositing/layer-creation/mismatched-rotated-transform-animation-overlap.html: * compositing/layer-creation/mismatched-rotated-transform-transition-overlap.html: * compositing/layer-creation/mismatched-transform-transition-overlap.html: * compositing/layer-creation/multiple-keyframes-animation-overlap.html: * compositing/layer-creation/overlap-animation-clipping.html: * compositing/layer-creation/overlap-animation-container.html: * compositing/layer-creation/overlap-animation.html: * compositing/layer-creation/scale-rotation-animation-overlap.html: * compositing/layer-creation/scale-rotation-transition-overlap.html: * compositing/layer-creation/translate-animation-overlap.html: * compositing/layer-creation/translate-scale-animation-overlap.html: * compositing/layer-creation/translate-scale-transition-overlap.html: * compositing/layer-creation/translate-transition-overlap.html: * compositing/overflow/overflow-positioning.html: * compositing/reflections/animation-inside-reflection.html: * compositing/reflections/nested-reflection-animated.html: * compositing/reflections/nested-reflection-transition.html: * compositing/scrolling/touch-scroll-to-clip.html: * compositing/transitions/scale-transition-no-start.html: * compositing/transitions/singular-scale-transition.html: * compositing/visible-rect/animated-from-none.html: * compositing/visible-rect/animated.html: * css3/calc/transitions-dependent.html: * css3/calc/transitions.html: * css3/filters/backdrop/animation.html: * css3/filters/composited-during-animation.html: * css3/filters/filter-animation-from-none-hw.html: * css3/filters/filter-animation-from-none-multi-hw.html: * css3/filters/filter-animation-from-none-multi.html: * css3/filters/filter-animation-from-none.html: * css3/filters/filter-animation-hw.html: * css3/filters/filter-animation-multi-hw.html: * css3/filters/filter-animation-multi.html: * css3/filters/filter-animation.html: * css3/masking/clip-path-animation.html: * fast/animation/css-animation-resuming-when-visible-with-style-change.html: * fast/animation/css-animation-resuming-when-visible-with-style-change2.html: * fast/animation/css-animation-resuming-when-visible.html: * fast/animation/css-animation-throttling-lowPowerMode.html: * fast/animation/height-auto-transition-computed-value.html: * fast/css-generated-content/pseudo-animation.html: * fast/css-generated-content/pseudo-transition.html: * fast/filter-image/filter-image-animation.html: * fast/shapes/shape-outside-floats/shape-outside-animation.html: * fast/shapes/shape-outside-floats/shape-outside-shape-image-threshold-animation.html: * fast/shapes/shape-outside-floats/shape-outside-shape-margin-animation.html: * http/wpt/css/css-animations/start-animation-001.html: * imported/blink/transitions/transition-not-interpolable.html: * imported/blink/transitions/unprefixed-transform.html: * platform/ios/TestExpectations: * platform/win/TestExpectations: * transitions/remove-transition-style.html: * transitions/transition-drt-api-delay-expected.txt: Removed. * transitions/transition-drt-api-delay.html: Removed. * transitions/transition-drt-api-expected.txt: Removed. * transitions/transition-drt-api.html: Removed. * transitions/zero-duration-with-non-zero-delay-end.html: Canonical link: https://commits.webkit.org/204981@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@236541 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-09-27 09:49:52 +00:00
<!DOCTYPE html>
[Web Animations] WebAnimation objects never get destroyed https://bugs.webkit.org/show_bug.cgi?id=185917 <rdar://problem/39539371> Reviewed by Dean Jackson and Antti Koivisto. Source/WebCore: The AnimationTimeline class keeps references to WebAnimation objects organized in various ways. First, there are three main maps across which all animations are stored, one for non-subclass WebAnimation objects (m_elementToAnimationsMap), one for CSSSAnimation objects (m_elementToCSSAnimationsMap) and one for CSSTranstion objects (m_elementToCSSTransitionsMap). On top of that, we also keep a map to access CSSAnimation objects for a given element by CSS animation name (m_elementToCSSAnimationByName) and another map to access CSSTransition objects for a given element by CSS property (m_elementToCSSTransitionByCSSPropertyID). None of the RefPtr<WebAnimation> stored in these maps would get cleared when the document would get torn down, which would also prevent the AnimationTimeline (and its DocumentTimeline subclass) from being destroyed. We now ensure that element and document tear-down correctly removes animations and clears those maps, which in turn allows the DocumentTimeline to be destroyed, fixing the significant memory leak introduced by Web Animations so far. Finally, we change the collection type for those maps to be ListHashRef instead of Vector to guarantee we only add an animation once per collection due to changes in how setEffect() and setTimeline() operate. Test: animations/leak-document-with-css-animation.html * animation/AnimationTimeline.cpp: (WebCore::AnimationTimeline::~AnimationTimeline): There is no need to clear those tables as they'll need to be empty for the AnimationTimeline to even be destroyed. (WebCore::AnimationTimeline::relevantMapForAnimation): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::animationWasAddedToElement): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::animationWasRemovedFromElement): When an animation is removed from an element, ensure that references to this animation stored in the m_elementToCSSAnimationByName and m_elementToCSSTransitionByCSSPropertyID maps are cleared. (WebCore::AnimationTimeline::animationsForElement const): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::removeAnimationsForElement): Instead of just calling cancel() on all known declarative animations (this method used to be called cancelDeclarativeAnimationsForElement()), we now set the effect of known animations, declarative or not, for the provided element which will in turn call animationWasRemovedFromElement() and remove the animation from all maps that might keep a reference to it. (WebCore::AnimationTimeline::updateCSSTransitionsForElement): Replace call to removeDeclarativeAnimation() with a simple call to removeAnimation() which will remove references for this animation from the relevant maps. (WebCore::AnimationTimeline::cancelOrRemoveDeclarativeAnimation): Ditto. (WebCore::AnimationTimeline::cancelDeclarativeAnimationsForElement): Deleted. (WebCore::AnimationTimeline::removeDeclarativeAnimation): Deleted. * animation/AnimationTimeline.h: (WebCore::AnimationTimeline::elementToAnimationsMap): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::elementToCSSAnimationsMap): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::elementToCSSTransitionsMap): Change to use ListHashRef instead of Vector. * animation/WebAnimation.cpp: (WebCore::WebAnimation::setEffect): In the case of a declarative animation, we don't want to remove the animation from the relevant maps because while the effect was set via the API, the element still has a transition or animation set up and we must not break the timeline-to-animation relationship. (WebCore::WebAnimation::setEffectInternal): Factor parts of setEffect() out into a new method that can be called from AnimationTimeline::removeAnimationsForElement() to reset the m_effect member and correctly call animationWasRemovedFromElement() without all the Web Animations machinery of setEffect(), which is a public API that has unwanted side effects (such as rejecting promises). (WebCore::WebAnimation::setTimeline): In the case of a declarative animation, we don't want to remove the animation from the relevant maps because, while the timeline was set via the API, the element still has a transition or animation set up and we must not break the relationship. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::~DocumentTimeline): (WebCore::DocumentTimeline::detachFromDocument): Close the GenericTaskQueues when detaching from the document as it's too late to perform this work in the destructor. We also cancel the schedule timer which we had forgotten to do before. * animation/WebAnimation.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): * dom/Element.cpp: (WebCore::Element::removedFromAncestor): * dom/PseudoElement.cpp: (WebCore::PseudoElement::clearHostElement): * rendering/updating/RenderTreeUpdater.cpp: (WebCore::RenderTreeUpdater::tearDownRenderers): LayoutTests: Add a new test that would fail before this fix since the Document would leak. We also remove a homegrown test that was not correct and is no longer relevant thanks to the tests under imported/mozilla. * animations/leak-document-with-css-animation-expected.txt: Added. * animations/leak-document-with-css-animation.html: Added. * animations/resources/animation-leak-iframe.html: Added. * platform/win/TestExpectations: * webanimations/css-transitions-expected.txt: Removed. * webanimations/css-transitions.html: Removed. Canonical link: https://commits.webkit.org/201413@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@232185 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-05-25 13:45:15 +00:00
<html>
<body onload="runTest()">
<script src="../resources/js-test-pre.js"></script>
<script>
description("This test asserts that Document doesn't leak when a CSS Animation is created.");
if (window.internals)
jsTestIsAsync = true;
gc();
var numberOfLiveDocumentsAfterIframeLoaded = 0;
function runTest() {
if (!window.internals)
return;
var frame = document.body.appendChild(document.createElement("iframe"));
frame.onload = function() {
if (frame.src === 'about:blank')
return true;
gc();
setTimeout(function () {
numberOfLiveDocumentsAfterIframeLoaded = internals.numberOfLiveDocuments();
debug("The iframe has finished loading.");
frame.remove();
frame = null;
gc();
setTimeout(function () {
debug("The iframe has been destroyed.");
shouldBe("internals.numberOfLiveDocuments()", "numberOfLiveDocumentsAfterIframeLoaded - 1");
debug("");
finishJSTest();
});
[Web Animations] WebAnimation objects never get destroyed https://bugs.webkit.org/show_bug.cgi?id=185917 <rdar://problem/39539371> Reviewed by Dean Jackson and Antti Koivisto. Source/WebCore: The AnimationTimeline class keeps references to WebAnimation objects organized in various ways. First, there are three main maps across which all animations are stored, one for non-subclass WebAnimation objects (m_elementToAnimationsMap), one for CSSSAnimation objects (m_elementToCSSAnimationsMap) and one for CSSTranstion objects (m_elementToCSSTransitionsMap). On top of that, we also keep a map to access CSSAnimation objects for a given element by CSS animation name (m_elementToCSSAnimationByName) and another map to access CSSTransition objects for a given element by CSS property (m_elementToCSSTransitionByCSSPropertyID). None of the RefPtr<WebAnimation> stored in these maps would get cleared when the document would get torn down, which would also prevent the AnimationTimeline (and its DocumentTimeline subclass) from being destroyed. We now ensure that element and document tear-down correctly removes animations and clears those maps, which in turn allows the DocumentTimeline to be destroyed, fixing the significant memory leak introduced by Web Animations so far. Finally, we change the collection type for those maps to be ListHashRef instead of Vector to guarantee we only add an animation once per collection due to changes in how setEffect() and setTimeline() operate. Test: animations/leak-document-with-css-animation.html * animation/AnimationTimeline.cpp: (WebCore::AnimationTimeline::~AnimationTimeline): There is no need to clear those tables as they'll need to be empty for the AnimationTimeline to even be destroyed. (WebCore::AnimationTimeline::relevantMapForAnimation): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::animationWasAddedToElement): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::animationWasRemovedFromElement): When an animation is removed from an element, ensure that references to this animation stored in the m_elementToCSSAnimationByName and m_elementToCSSTransitionByCSSPropertyID maps are cleared. (WebCore::AnimationTimeline::animationsForElement const): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::removeAnimationsForElement): Instead of just calling cancel() on all known declarative animations (this method used to be called cancelDeclarativeAnimationsForElement()), we now set the effect of known animations, declarative or not, for the provided element which will in turn call animationWasRemovedFromElement() and remove the animation from all maps that might keep a reference to it. (WebCore::AnimationTimeline::updateCSSTransitionsForElement): Replace call to removeDeclarativeAnimation() with a simple call to removeAnimation() which will remove references for this animation from the relevant maps. (WebCore::AnimationTimeline::cancelOrRemoveDeclarativeAnimation): Ditto. (WebCore::AnimationTimeline::cancelDeclarativeAnimationsForElement): Deleted. (WebCore::AnimationTimeline::removeDeclarativeAnimation): Deleted. * animation/AnimationTimeline.h: (WebCore::AnimationTimeline::elementToAnimationsMap): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::elementToCSSAnimationsMap): Change to use ListHashRef instead of Vector. (WebCore::AnimationTimeline::elementToCSSTransitionsMap): Change to use ListHashRef instead of Vector. * animation/WebAnimation.cpp: (WebCore::WebAnimation::setEffect): In the case of a declarative animation, we don't want to remove the animation from the relevant maps because while the effect was set via the API, the element still has a transition or animation set up and we must not break the timeline-to-animation relationship. (WebCore::WebAnimation::setEffectInternal): Factor parts of setEffect() out into a new method that can be called from AnimationTimeline::removeAnimationsForElement() to reset the m_effect member and correctly call animationWasRemovedFromElement() without all the Web Animations machinery of setEffect(), which is a public API that has unwanted side effects (such as rejecting promises). (WebCore::WebAnimation::setTimeline): In the case of a declarative animation, we don't want to remove the animation from the relevant maps because, while the timeline was set via the API, the element still has a transition or animation set up and we must not break the relationship. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::~DocumentTimeline): (WebCore::DocumentTimeline::detachFromDocument): Close the GenericTaskQueues when detaching from the document as it's too late to perform this work in the destructor. We also cancel the schedule timer which we had forgotten to do before. * animation/WebAnimation.h: * dom/Document.cpp: (WebCore::Document::prepareForDestruction): * dom/Element.cpp: (WebCore::Element::removedFromAncestor): * dom/PseudoElement.cpp: (WebCore::PseudoElement::clearHostElement): * rendering/updating/RenderTreeUpdater.cpp: (WebCore::RenderTreeUpdater::tearDownRenderers): LayoutTests: Add a new test that would fail before this fix since the Document would leak. We also remove a homegrown test that was not correct and is no longer relevant thanks to the tests under imported/mozilla. * animations/leak-document-with-css-animation-expected.txt: Added. * animations/leak-document-with-css-animation.html: Added. * animations/resources/animation-leak-iframe.html: Added. * platform/win/TestExpectations: * webanimations/css-transitions-expected.txt: Removed. * webanimations/css-transitions.html: Removed. Canonical link: https://commits.webkit.org/201413@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@232185 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-05-25 13:45:15 +00:00
});
}
frame.src = 'resources/animation-leak-iframe.html';
}
</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>