- Revision
- 252891
- Author
- [email protected]
- Date
- 2019-11-26 10:28:13 -0800 (Tue, 26 Nov 2019)
Log Message
Destroy linebox tree from ComplexLineLayout destructor
https://bugs.webkit.org/show_bug.cgi?id=204620
Reviewed by Zalan Bujtas.
Make linebox tree destuction simpler and more robust.
* rendering/ComplexLineLayout.cpp:
(WebCore::ComplexLineLayout::~ComplexLineLayout):
Destroy linebox tree.
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::deleteLines):
Always destroy the line layout.
(WebCore::RenderBlockFlow::layoutSimpleLines):
(WebCore::RenderBlockFlow::deleteLineBoxesBeforeSimpleLineLayout): Deleted.
No need for special path, ComplexLineLayout destruction takes care of this now.
* rendering/RenderBlockFlow.h:
* rendering/RenderLineBreak.cpp:
(WebCore::RenderLineBreak::deleteLineBoxesBeforeSimpleLineLayout): Deleted.
No need for special path, InlineBox destruction clears the pointers in associated RenderLineBreaks and RenderTexts.
* rendering/RenderLineBreak.h:
* rendering/RenderText.cpp:
(WebCore::RenderText::deleteLineBoxesBeforeSimpleLineLayout): Deleted.
* rendering/RenderText.h:
* rendering/RootInlineBox.cpp:
(WebCore::RootInlineBox::removeLineBoxFromRenderObject):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (252890 => 252891)
--- trunk/Source/WebCore/ChangeLog 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/ChangeLog 2019-11-26 18:28:13 UTC (rev 252891)
@@ -1,3 +1,40 @@
+2019-11-26 Antti Koivisto <[email protected]>
+
+ Destroy linebox tree from ComplexLineLayout destructor
+ https://bugs.webkit.org/show_bug.cgi?id=204620
+
+ Reviewed by Zalan Bujtas.
+
+ Make linebox tree destuction simpler and more robust.
+
+ * rendering/ComplexLineLayout.cpp:
+ (WebCore::ComplexLineLayout::~ComplexLineLayout):
+
+ Destroy linebox tree.
+
+ * rendering/RenderBlockFlow.cpp:
+ (WebCore::RenderBlockFlow::deleteLines):
+
+ Always destroy the line layout.
+
+ (WebCore::RenderBlockFlow::layoutSimpleLines):
+ (WebCore::RenderBlockFlow::deleteLineBoxesBeforeSimpleLineLayout): Deleted.
+
+ No need for special path, ComplexLineLayout destruction takes care of this now.
+
+ * rendering/RenderBlockFlow.h:
+ * rendering/RenderLineBreak.cpp:
+ (WebCore::RenderLineBreak::deleteLineBoxesBeforeSimpleLineLayout): Deleted.
+
+ No need for special path, InlineBox destruction clears the pointers in associated RenderLineBreaks and RenderTexts.
+
+ * rendering/RenderLineBreak.h:
+ * rendering/RenderText.cpp:
+ (WebCore::RenderText::deleteLineBoxesBeforeSimpleLineLayout): Deleted.
+ * rendering/RenderText.h:
+ * rendering/RootInlineBox.cpp:
+ (WebCore::RootInlineBox::removeLineBoxFromRenderObject):
+
2019-11-26 youenn fablet <[email protected]>
Update capturing document media state when entering b/f cache
Modified: trunk/Source/WebCore/rendering/ComplexLineLayout.cpp (252890 => 252891)
--- trunk/Source/WebCore/rendering/ComplexLineLayout.cpp 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/ComplexLineLayout.cpp 2019-11-26 18:28:13 UTC (rev 252891)
@@ -58,8 +58,14 @@
{
}
-ComplexLineLayout::~ComplexLineLayout() = default;
+ComplexLineLayout::~ComplexLineLayout()
+{
+ if (m_flow.containsFloats())
+ m_flow.floatingObjects()->clearLineBoxTreePointers();
+ lineBoxes().deleteLineBoxTree();
+};
+
static void determineDirectionality(TextDirection& dir, InlineIterator iter)
{
while (!iter.atEnd()) {
Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (252890 => 252891)
--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp 2019-11-26 18:28:13 UTC (rev 252891)
@@ -2103,14 +2103,8 @@
void RenderBlockFlow::deleteLines()
{
- if (containsFloats())
- m_floatingObjects->clearLineBoxTreePointers();
+ m_lineLayout = nullptr;
- if (complexLineLayout())
- complexLineLayout()->lineBoxes().deleteLineBoxTree();
- else
- m_lineLayout = nullptr;
-
RenderBlock::deleteLines();
}
@@ -2957,7 +2951,8 @@
return;
}
- complexLineLayout()->addOverflowFromInlineChildren();
+ if (complexLineLayout())
+ complexLineLayout()->addOverflowFromInlineChildren();
}
void RenderBlockFlow::adjustForBorderFit(LayoutUnit x, LayoutUnit& left, LayoutUnit& right) const
@@ -3626,10 +3621,9 @@
void RenderBlockFlow::layoutSimpleLines(bool relayoutChildren, LayoutUnit& repaintLogicalTop, LayoutUnit& repaintLogicalBottom)
{
bool needsLayout = selfNeedsLayout() || relayoutChildren || !simpleLineLayout();
- if (needsLayout) {
- deleteLineBoxesBeforeSimpleLineLayout();
+ if (needsLayout)
m_lineLayout = SimpleLineLayout::create(*this);
- }
+
auto& simpleLineLayout = *this->simpleLineLayout();
if (view().frameView().layoutContext().layoutState() && view().frameView().layoutContext().layoutState()->isPaginated()) {
@@ -3647,25 +3641,6 @@
setLogicalHeight(lineLayoutTop + lineLayoutHeight + borderAndPaddingAfter());
}
-void RenderBlockFlow::deleteLineBoxesBeforeSimpleLineLayout()
-{
- ASSERT(lineLayoutPath() == SimpleLinesPath);
-
- if (complexLineLayout())
- complexLineLayout()->lineBoxes().deleteLineBoxes();
-
- for (auto& renderer : childrenOfType<RenderObject>(*this)) {
- if (is<RenderText>(renderer))
- downcast<RenderText>(renderer).deleteLineBoxesBeforeSimpleLineLayout();
- else if (is<RenderLineBreak>(renderer))
- downcast<RenderLineBreak>(renderer).deleteLineBoxesBeforeSimpleLineLayout();
- else
- ASSERT_NOT_REACHED();
- }
-
- m_lineLayout = nullptr;
-}
-
void RenderBlockFlow::ensureLineBoxes()
{
if (!childrenInline())
Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.h (252890 => 252891)
--- trunk/Source/WebCore/rendering/RenderBlockFlow.h 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.h 2019-11-26 18:28:13 UTC (rev 252891)
@@ -358,7 +358,6 @@
const ComplexLineLayout* complexLineLayout() const;
ComplexLineLayout* complexLineLayout();
- void deleteLineBoxesBeforeSimpleLineLayout();
void ensureLineBoxes();
void generateLineBoxTree();
Modified: trunk/Source/WebCore/rendering/RenderLineBreak.cpp (252890 => 252891)
--- trunk/Source/WebCore/rendering/RenderLineBreak.cpp 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/RenderLineBreak.cpp 2019-11-26 18:28:13 UTC (rev 252891)
@@ -126,12 +126,6 @@
downcast<RenderBlockFlow>(*parent()).ensureLineBoxes();
}
-void RenderLineBreak::deleteLineBoxesBeforeSimpleLineLayout()
-{
- delete m_inlineBoxWrapper;
- m_inlineBoxWrapper = nullptr;
-}
-
int RenderLineBreak::caretMinOffset() const
{
return 0;
Modified: trunk/Source/WebCore/rendering/RenderLineBreak.h (252890 => 252891)
--- trunk/Source/WebCore/rendering/RenderLineBreak.h 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/RenderLineBreak.h 2019-11-26 18:28:13 UTC (rev 252891)
@@ -46,7 +46,6 @@
void deleteInlineBoxWrapper();
void replaceInlineBoxWrapper(InlineElementBox&);
void dirtyLineBoxes(bool fullLayout);
- void deleteLineBoxesBeforeSimpleLineLayout();
IntRect linesBoundingBox() const;
Modified: trunk/Source/WebCore/rendering/RenderText.cpp (252890 => 252891)
--- trunk/Source/WebCore/rendering/RenderText.cpp 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/RenderText.cpp 2019-11-26 18:28:13 UTC (rev 252891)
@@ -307,11 +307,6 @@
RenderObject::willBeDestroyed();
}
-void RenderText::deleteLineBoxesBeforeSimpleLineLayout()
-{
- m_lineBoxes.deleteAll();
-}
-
String RenderText::originalText() const
{
return m_originalTextDiffersFromRendered ? originalTextMap().get(this) : m_text;
Modified: trunk/Source/WebCore/rendering/RenderText.h (252890 => 252891)
--- trunk/Source/WebCore/rendering/RenderText.h 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/RenderText.h 2019-11-26 18:28:13 UTC (rev 252891)
@@ -164,7 +164,6 @@
#endif
void ensureLineBoxes();
- void deleteLineBoxesBeforeSimpleLineLayout();
const SimpleLineLayout::Layout* simpleLineLayout() const;
StringView stringView(unsigned start = 0, Optional<unsigned> stop = WTF::nullopt) const;
Modified: trunk/Source/WebCore/rendering/RootInlineBox.cpp (252890 => 252891)
--- trunk/Source/WebCore/rendering/RootInlineBox.cpp 2019-11-26 18:16:04 UTC (rev 252890)
+++ trunk/Source/WebCore/rendering/RootInlineBox.cpp 2019-11-26 18:28:13 UTC (rev 252891)
@@ -828,7 +828,9 @@
void RootInlineBox::removeLineBoxFromRenderObject()
{
- blockFlow().complexLineLayout()->lineBoxes().removeLineBox(this);
+ // Null if we are destroying ComplexLineLayout.
+ if (auto* complexLineLayout = blockFlow().complexLineLayout())
+ complexLineLayout->lineBoxes().removeLineBox(this);
}
void RootInlineBox::extractLineBoxFromRenderObject()