Title: [257455] releases/WebKitGTK/webkit-2.28/Source/WebCore
Revision
257455
Author
[email protected]
Date
2020-02-26 02:58:08 -0800 (Wed, 26 Feb 2020)

Log Message

Merge r257235 - Document / DOMWindow objects get leaked on CNN.com due to CSSTransitions
https://bugs.webkit.org/show_bug.cgi?id=208145

Reviewed by Antoine Quint.

Break reference cycles using WeakPtr so that CSSTransitions can no longer cause whole document / DOM trees to
get leaked.

* animation/DocumentTimeline.cpp:
(WebCore::DocumentTimeline::DocumentTimeline):
* animation/DocumentTimeline.h:
* animation/KeyframeEffect.cpp:
(WebCore::KeyframeEffect::KeyframeEffect):
(WebCore::KeyframeEffect::setTarget):
* animation/KeyframeEffect.h:

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog (257454 => 257455)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog	2020-02-26 10:58:03 UTC (rev 257454)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/ChangeLog	2020-02-26 10:58:08 UTC (rev 257455)
@@ -1,3 +1,21 @@
+2020-02-24  Chris Dumez  <[email protected]>
+
+        Document / DOMWindow objects get leaked on CNN.com due to CSSTransitions
+        https://bugs.webkit.org/show_bug.cgi?id=208145
+
+        Reviewed by Antoine Quint.
+
+        Break reference cycles using WeakPtr so that CSSTransitions can no longer cause whole document / DOM trees to
+        get leaked.
+
+        * animation/DocumentTimeline.cpp:
+        (WebCore::DocumentTimeline::DocumentTimeline):
+        * animation/DocumentTimeline.h:
+        * animation/KeyframeEffect.cpp:
+        (WebCore::KeyframeEffect::KeyframeEffect):
+        (WebCore::KeyframeEffect::setTarget):
+        * animation/KeyframeEffect.h:
+
 2020-02-24  Antoine Quint  <[email protected]>
 
         RenderLayerBacking::notifyAnimationStarted calls directly into the old animation controller

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/DocumentTimeline.cpp (257454 => 257455)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/DocumentTimeline.cpp	2020-02-26 10:58:03 UTC (rev 257454)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/DocumentTimeline.cpp	2020-02-26 10:58:08 UTC (rev 257455)
@@ -64,15 +64,13 @@
 DocumentTimeline::DocumentTimeline(Document& document, Seconds originTime)
     : AnimationTimeline()
     , m_tickScheduleTimer(*this, &DocumentTimeline::scheduleAnimationResolution)
-    , m_document(&document)
+    , m_document(makeWeakPtr(document))
     , m_originTime(originTime)
 {
-    if (m_document) {
-        m_document->addTimeline(*this);
-        if (auto* page = m_document->page()) {
-            if (page->settings().hiddenPageCSSAnimationSuspensionEnabled() && !page->isVisible())
-                suspendAnimations();
-        }
+    document.addTimeline(*this);
+    if (auto* page = document.page()) {
+        if (page->settings().hiddenPageCSSAnimationSuspensionEnabled() && !page->isVisible())
+            suspendAnimations();
     }
 }
 

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/DocumentTimeline.h (257454 => 257455)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/DocumentTimeline.h	2020-02-26 10:58:03 UTC (rev 257454)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/DocumentTimeline.h	2020-02-26 10:58:08 UTC (rev 257455)
@@ -107,7 +107,7 @@
     HashSet<RefPtr<WebAnimation>> m_acceleratedAnimationsPendingRunningStateChange;
     HashSet<Element*> m_elementsWithRunningAcceleratedAnimations;
     Vector<Ref<AnimationEventBase>> m_pendingAnimationEvents;
-    RefPtr<Document> m_document;
+    WeakPtr<Document> m_document;
     Markable<Seconds, Seconds::MarkableTraits> m_cachedCurrentTime;
     Seconds m_originTime;
     unsigned m_numberOfAnimationTimelineInvalidationsForTesting { 0 };

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/KeyframeEffect.cpp (257454 => 257455)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/KeyframeEffect.cpp	2020-02-26 10:58:03 UTC (rev 257454)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/KeyframeEffect.cpp	2020-02-26 10:58:08 UTC (rev 257455)
@@ -521,7 +521,7 @@
 }
 
 KeyframeEffect::KeyframeEffect(Element* target)
-    : m_target(target)
+    : m_target(makeWeakPtr(target))
 {
 }
 
@@ -1065,10 +1065,10 @@
 
 void KeyframeEffect::setTarget(RefPtr<Element>&& newTarget)
 {
-    if (m_target == newTarget)
+    if (m_target.get() == newTarget.get())
         return;
 
-    auto previousTarget = std::exchange(m_target, WTFMove(newTarget));
+    auto previousTarget = std::exchange(m_target, makeWeakPtr(newTarget.get()));
 
     if (auto* effectAnimation = animation())
         effectAnimation->effectTargetDidChange(previousTarget.get(), m_target.get());

Modified: releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/KeyframeEffect.h (257454 => 257455)


--- releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/KeyframeEffect.h	2020-02-26 10:58:03 UTC (rev 257454)
+++ releases/WebKitGTK/webkit-2.28/Source/WebCore/animation/KeyframeEffect.h	2020-02-26 10:58:08 UTC (rev 257455)
@@ -191,7 +191,7 @@
     KeyframeList m_blendingKeyframes { emptyString() };
     Vector<ParsedKeyframe> m_parsedKeyframes;
     Vector<AcceleratedAction> m_pendingAcceleratedActions;
-    RefPtr<Element> m_target;
+    WeakPtr<Element> m_target;
 
     std::unique_ptr<const RenderStyle> m_unanimatedStyle;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to