Title: [222847] trunk/Source/WebCore
Revision
222847
Author
[email protected]
Date
2017-10-04 07:37:19 -0700 (Wed, 04 Oct 2017)

Log Message

RenderFragmentContainerRange should not hold raw pointers.
https://bugs.webkit.org/show_bug.cgi?id=177854
<rdar://problem/34805954>

Reviewed by Antti Koivisto.

m_startFragment and m_endFragment object's lifetimes are not tied to the lifetime of
RenderFragmentContainerRange.

Covered by existing tests.

* rendering/RenderFragmentedFlow.cpp:
(WebCore::RenderFragmentedFlow::setFragmentRangeForBox):
* rendering/RenderFragmentedFlow.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (222846 => 222847)


--- trunk/Source/WebCore/ChangeLog	2017-10-04 14:24:41 UTC (rev 222846)
+++ trunk/Source/WebCore/ChangeLog	2017-10-04 14:37:19 UTC (rev 222847)
@@ -1,5 +1,22 @@
 2017-10-04  Zalan Bujtas  <[email protected]>
 
+        RenderFragmentContainerRange should not hold raw pointers.
+        https://bugs.webkit.org/show_bug.cgi?id=177854
+        <rdar://problem/34805954>
+
+        Reviewed by Antti Koivisto.
+
+        m_startFragment and m_endFragment object's lifetimes are not tied to the lifetime of
+        RenderFragmentContainerRange.
+
+        Covered by existing tests.
+
+        * rendering/RenderFragmentedFlow.cpp:
+        (WebCore::RenderFragmentedFlow::setFragmentRangeForBox):
+        * rendering/RenderFragmentedFlow.h:
+
+2017-10-04  Zalan Bujtas  <[email protected]>
+
         RenderMultiColumnSpannerPlaceholder should not hold raw pointers.
         https://bugs.webkit.org/show_bug.cgi?id=177840
         <rdar://problem/34800109>

Modified: trunk/Source/WebCore/rendering/RenderFragmentedFlow.cpp (222846 => 222847)


--- trunk/Source/WebCore/rendering/RenderFragmentedFlow.cpp	2017-10-04 14:24:41 UTC (rev 222846)
+++ trunk/Source/WebCore/rendering/RenderFragmentedFlow.cpp	2017-10-04 14:37:19 UTC (rev 222847)
@@ -564,20 +564,15 @@
 {
     ASSERT(hasFragments());
     ASSERT(startFragment && endFragment && startFragment->fragmentedFlow() == this && endFragment->fragmentedFlow() == this);
-
-    auto it = m_fragmentRangeMap.find(&box);
-    if (it == m_fragmentRangeMap.end()) {
-        m_fragmentRangeMap.set(&box, RenderFragmentContainerRange(startFragment, endFragment));
+    auto result = m_fragmentRangeMap.set(&box, RenderFragmentContainerRange(startFragment, endFragment));
+    if (result.isNewEntry)
         return;
-    }
 
     // If nothing changed, just bail.
-    RenderFragmentContainerRange& range = it->value;
+    auto& range = result.iterator->value;
     if (range.startFragment() == startFragment && range.endFragment() == endFragment)
         return;
-
     clearRenderBoxFragmentInfoAndCustomStyle(box, startFragment, endFragment, range.startFragment(), range.endFragment());
-    range.setRange(startFragment, endFragment);
 }
 
 bool RenderFragmentedFlow::hasCachedFragmentRangeForBox(const RenderBox& box) const

Modified: trunk/Source/WebCore/rendering/RenderFragmentedFlow.h (222846 => 222847)


--- trunk/Source/WebCore/rendering/RenderFragmentedFlow.h	2017-10-04 14:24:41 UTC (rev 222846)
+++ trunk/Source/WebCore/rendering/RenderFragmentedFlow.h	2017-10-04 14:37:19 UTC (rev 222847)
@@ -31,6 +31,7 @@
 
 #include "LayerFragment.h"
 #include "RenderBlockFlow.h"
+#include "RenderFragmentContainer.h"
 #include <wtf/ListHashSet.h>
 
 namespace WebCore {
@@ -214,11 +215,7 @@
 
     class RenderFragmentContainerRange {
     public:
-        RenderFragmentContainerRange()
-        {
-            setRange(nullptr, nullptr);
-        }
-
+        RenderFragmentContainerRange() = default;
         RenderFragmentContainerRange(RenderFragmentContainer* start, RenderFragmentContainer* end)
         {
             setRange(start, end);
@@ -226,19 +223,19 @@
         
         void setRange(RenderFragmentContainer* start, RenderFragmentContainer* end)
         {
-            m_startFragment = start;
-            m_endFragment = end;
+            m_startFragment = makeWeakPtr(start);
+            m_endFragment = makeWeakPtr(end);
             m_rangeInvalidated = true;
         }
 
-        RenderFragmentContainer* startFragment() const { return m_startFragment; }
-        RenderFragmentContainer* endFragment() const { return m_endFragment; }
+        RenderFragmentContainer* startFragment() const { return m_startFragment.get(); }
+        RenderFragmentContainer* endFragment() const { return m_endFragment.get(); }
         bool rangeInvalidated() const { return m_rangeInvalidated; }
         void clearRangeInvalidated() { m_rangeInvalidated = false; }
 
     private:
-        RenderFragmentContainer* m_startFragment;
-        RenderFragmentContainer* m_endFragment;
+        WeakPtr<RenderFragmentContainer> m_startFragment;
+        WeakPtr<RenderFragmentContainer> m_endFragment;
         bool m_rangeInvalidated;
     };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to