[IFC][Integration] LayoutIntegration::LineLayout should not expose InlineContent
https://bugs.webkit.org/show_bug.cgi?id=239059
Reviewed by Antti Koivisto.
Implement inkOverflowTop/inkOverflowBottom for inline iterator (LineBox) so that we can
keep InlineContent internal to LayoutIntegration::LineLayout.
* layout/integration/InlineIteratorLineBox.h:
(WebCore::InlineIterator::LineBox::inkOverflowTop const):
(WebCore::InlineIterator::LineBox::inkOverflowBottom const):
* layout/integration/InlineIteratorLineBoxLegacyPath.h:
(WebCore::InlineIterator::LineBoxIteratorLegacyPath::inkOverflowTop const):
(WebCore::InlineIterator::LineBoxIteratorLegacyPath::inkOverflowBottom const):
* layout/integration/InlineIteratorLineBoxModernPath.h:
(WebCore::InlineIterator::LineBoxIteratorModernPath::inkOverflowTop const):
(WebCore::InlineIterator::LineBoxIteratorModernPath::inkOverflowBottom const):
* layout/integration/LayoutIntegrationLineLayout.cpp:
(WebCore::LayoutIntegration::LineLayout::hasVisualOverflow const):
* layout/integration/LayoutIntegrationLineLayout.h:
(WebCore::LayoutIntegration::LineLayout::isPaginated const):
(WebCore::LayoutIntegration::LineLayout::inlineContent const): Deleted.
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::layoutModernLines):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@292752 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 325bfce..0774594 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,30 @@
+2022-04-11 Alan Bujtas <zalan@apple.com>
+
+ [IFC][Integration] LayoutIntegration::LineLayout should not expose InlineContent
+ https://bugs.webkit.org/show_bug.cgi?id=239059
+
+ Reviewed by Antti Koivisto.
+
+ Implement inkOverflowTop/inkOverflowBottom for inline iterator (LineBox) so that we can
+ keep InlineContent internal to LayoutIntegration::LineLayout.
+
+ * layout/integration/InlineIteratorLineBox.h:
+ (WebCore::InlineIterator::LineBox::inkOverflowTop const):
+ (WebCore::InlineIterator::LineBox::inkOverflowBottom const):
+ * layout/integration/InlineIteratorLineBoxLegacyPath.h:
+ (WebCore::InlineIterator::LineBoxIteratorLegacyPath::inkOverflowTop const):
+ (WebCore::InlineIterator::LineBoxIteratorLegacyPath::inkOverflowBottom const):
+ * layout/integration/InlineIteratorLineBoxModernPath.h:
+ (WebCore::InlineIterator::LineBoxIteratorModernPath::inkOverflowTop const):
+ (WebCore::InlineIterator::LineBoxIteratorModernPath::inkOverflowBottom const):
+ * layout/integration/LayoutIntegrationLineLayout.cpp:
+ (WebCore::LayoutIntegration::LineLayout::hasVisualOverflow const):
+ * layout/integration/LayoutIntegrationLineLayout.h:
+ (WebCore::LayoutIntegration::LineLayout::isPaginated const):
+ (WebCore::LayoutIntegration::LineLayout::inlineContent const): Deleted.
+ * rendering/RenderBlockFlow.cpp:
+ (WebCore::RenderBlockFlow::layoutModernLines):
+
2022-04-11 Myles C. Maxfield <mmaxfield@apple.com>
[WebGPU] Hook up device.queue to the IDL
diff --git a/Source/WebCore/layout/integration/InlineIteratorLineBox.h b/Source/WebCore/layout/integration/InlineIteratorLineBox.h
index 73d8c97..10f9831 100644
--- a/Source/WebCore/layout/integration/InlineIteratorLineBox.h
+++ b/Source/WebCore/layout/integration/InlineIteratorLineBox.h
@@ -67,6 +67,9 @@
float contentLogicalTopAdjustedForPrecedingLineBox() const;
float contentLogicalBottomAdjustedForFollowingLineBox() const;
+ float inkOverflowTop() const;
+ float inkOverflowBottom() const;
+
const RenderBlockFlow& containingBlock() const;
RenderFragmentContainer* containingFragment() const;
@@ -180,6 +183,20 @@
});
}
+inline float LineBox::inkOverflowTop() const
+{
+ return WTF::switchOn(m_pathVariant, [](const auto& path) {
+ return path.inkOverflowTop();
+ });
+}
+
+inline float LineBox::inkOverflowBottom() const
+{
+ return WTF::switchOn(m_pathVariant, [](const auto& path) {
+ return path.inkOverflowBottom();
+ });
+}
+
inline float LineBox::contentLogicalLeft() const
{
return WTF::switchOn(m_pathVariant, [](const auto& path) {
diff --git a/Source/WebCore/layout/integration/InlineIteratorLineBoxLegacyPath.h b/Source/WebCore/layout/integration/InlineIteratorLineBoxLegacyPath.h
index 15924c3..f48e31b 100644
--- a/Source/WebCore/layout/integration/InlineIteratorLineBoxLegacyPath.h
+++ b/Source/WebCore/layout/integration/InlineIteratorLineBoxLegacyPath.h
@@ -49,6 +49,8 @@
float contentLogicalBottomAdjustedForFollowingLineBox() const { return m_rootInlineBox->selectionBottom().toFloat(); }
float top() const { return m_rootInlineBox->lineBoxTop().toFloat(); }
float bottom() const { return m_rootInlineBox->lineBoxBottom().toFloat(); }
+ float inkOverflowTop() const { return m_rootInlineBox->logicalTopVisualOverflow(); }
+ float inkOverflowBottom() const { return m_rootInlineBox->logicalBottomVisualOverflow(); }
float contentLogicalLeft() const { return m_rootInlineBox->logicalLeft(); }
float contentLogicalRight() const { return m_rootInlineBox->logicalRight(); }
diff --git a/Source/WebCore/layout/integration/InlineIteratorLineBoxModernPath.h b/Source/WebCore/layout/integration/InlineIteratorLineBoxModernPath.h
index 70bbbb4..afb2c0d 100644
--- a/Source/WebCore/layout/integration/InlineIteratorLineBoxModernPath.h
+++ b/Source/WebCore/layout/integration/InlineIteratorLineBoxModernPath.h
@@ -53,6 +53,8 @@
float contentLogicalBottom() const { return line().enclosingContentBottom(); }
float top() const { return line().lineBoxTop(); }
float bottom() const { return line().lineBoxBottom(); }
+ float inkOverflowTop() const { return line().inkOverflow().y(); }
+ float inkOverflowBottom() const { return line().inkOverflow().maxY(); }
float contentLogicalTopAdjustedForPrecedingLineBox() const { return !m_lineIndex ? contentLogicalTop() : LineBoxIteratorModernPath(*m_inlineContent, m_lineIndex - 1).contentLogicalBottomAdjustedForFollowingLineBox(); }
// FIXME: Implement.
diff --git a/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp b/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp
index 2a86049..f4d5808 100644
--- a/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp
+++ b/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp
@@ -492,6 +492,11 @@
return m_inlineContent->lines.size();
}
+bool LineLayout::hasVisualOverflow() const
+{
+ return m_inlineContent && m_inlineContent->hasVisualOverflow();
+}
+
LayoutUnit LineLayout::firstLinePhysicalBaseline() const
{
if (!m_inlineContent || m_inlineContent->lines.isEmpty()) {
diff --git a/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.h b/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.h
index 7367ce3..311419c 100644
--- a/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.h
+++ b/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.h
@@ -91,21 +91,22 @@
std::pair<LayoutUnit, LayoutUnit> computeIntrinsicWidthConstraints();
void layout();
-
- LayoutUnit contentLogicalHeight() const;
- size_t lineCount() const;
-
- LayoutUnit firstLinePhysicalBaseline() const;
- LayoutUnit lastLineLogicalBaseline() const;
-
- void adjustForPagination();
- void collectOverflow();
-
- const InlineContent* inlineContent() const { return m_inlineContent.get(); }
- bool isPaginated() const { return m_isPaginatedContent; }
-
void paint(PaintInfo&, const LayoutPoint& paintOffset);
bool hitTest(const HitTestRequest&, HitTestResult&, const HitTestLocation&, const LayoutPoint& accumulatedOffset, HitTestAction);
+ void adjustForPagination();
+
+ void collectOverflow();
+ LayoutRect visualOverflowBoundingBoxRectFor(const RenderInline&) const;
+ Vector<FloatRect> collectInlineBoxRects(const RenderInline&) const;
+
+ bool isPaginated() const { return m_isPaginatedContent; }
+ LayoutUnit contentLogicalHeight() const;
+ size_t lineCount() const;
+ bool hasVisualOverflow() const;
+ LayoutUnit firstLinePhysicalBaseline() const;
+ LayoutUnit lastLineLogicalBaseline() const;
+ LayoutRect firstInlineBoxRect(const RenderInline&) const;
+ LayoutRect enclosingBorderBoxRectFor(const RenderInline&) const;
InlineIterator::TextBoxIterator textBoxesFor(const RenderText&) const;
InlineIterator::LeafBoxIterator boxFor(const RenderElement&) const;
@@ -114,11 +115,6 @@
InlineIterator::LineBoxIterator firstLineBox() const;
InlineIterator::LineBoxIterator lastLineBox() const;
- LayoutRect firstInlineBoxRect(const RenderInline&) const;
- LayoutRect enclosingBorderBoxRectFor(const RenderInline&) const;
- LayoutRect visualOverflowBoundingBoxRectFor(const RenderInline&) const;
- Vector<FloatRect> collectInlineBoxRects(const RenderInline&) const;
-
const RenderObject& rendererForLayoutBox(const Layout::Box&) const;
const RenderBlockFlow& flow() const { return m_boxTree.flow(); }
RenderBlockFlow& flow() { return m_boxTree.flow(); }
diff --git a/Source/WebCore/rendering/RenderBlockFlow.cpp b/Source/WebCore/rendering/RenderBlockFlow.cpp
index 1adfd97..83cf5a6 100644
--- a/Source/WebCore/rendering/RenderBlockFlow.cpp
+++ b/Source/WebCore/rendering/RenderBlockFlow.cpp
@@ -3645,13 +3645,11 @@
repaintLogicalBottom = std::max(oldBorderBoxBottom, newBorderBoxBottom);
auto inflateRepaintTopAndBottomWithInkOverflow = [&] {
- auto* inlineContent = layoutFormattingContextLineLayout.inlineContent();
- if (!inlineContent || !inlineContent->hasVisualOverflow())
+ if (!layoutFormattingContextLineLayout.hasVisualOverflow())
return;
- for (auto& line : inlineContent->lines) {
- auto inkOverflow = LayoutRect { line.inkOverflow() };
- repaintLogicalTop = std::min(repaintLogicalTop, inkOverflow.y());
- repaintLogicalBottom = std::max(repaintLogicalBottom, inkOverflow.maxY());
+ for (auto lineBox = InlineIterator::firstLineBoxFor(*this); lineBox; lineBox.traverseNext()) {
+ repaintLogicalTop = std::min(repaintLogicalTop, LayoutUnit { lineBox->inkOverflowTop() });
+ repaintLogicalBottom = std::max(repaintLogicalBottom, LayoutUnit { lineBox->inkOverflowBottom() });
}
};
inflateRepaintTopAndBottomWithInkOverflow();