Modified: trunk/Source/WebCore/ChangeLog (270447 => 270448)
--- trunk/Source/WebCore/ChangeLog 2020-12-04 20:03:53 UTC (rev 270447)
+++ trunk/Source/WebCore/ChangeLog 2020-12-04 20:05:59 UTC (rev 270448)
@@ -1,3 +1,19 @@
+2020-12-04 Zalan Bujtas <za...@apple.com>
+
+ [LFC][IFC] Move float constraint logic from initialConstraintsForLine to a dedicated function
+ https://bugs.webkit.org/show_bug.cgi?id=219526
+
+ Reviewed by Antti Koivisto.
+
+ We are going to call this new function whenever the line stretches vertically and not just once at the very beginning.
+
+ * layout/inlineformatting/InlineLineBuilder.cpp:
+ (WebCore::Layout::LineBuilder::floatConstraints const):
+ (WebCore::Layout::LineBuilder::initialConstraintsForLine const):
+ (WebCore::Layout::LineBuilder::initialConstraintsForLine): Deleted.
+ * layout/inlineformatting/InlineLineBuilder.h:
+ (WebCore::Layout::LineBuilder::floatingState const):
+
2020-12-04 Kate Cheney <katherine_che...@apple.com>
Create API to enable/disable text interaction gestures in WKWebView
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp (270447 => 270448)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp 2020-12-04 20:03:53 UTC (rev 270447)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.cpp 2020-12-04 20:05:59 UTC (rev 270448)
@@ -360,42 +360,53 @@
return lineRange;
}
-LineBuilder::UsedConstraints LineBuilder::initialConstraintsForLine(const InlineRect& lineLogicalConstraints, bool isFirstLine)
+Optional<HorizontalConstraints> LineBuilder::floatConstraints(const InlineRect& lineLogicalRect) const
{
- auto lineLogicalLeft = lineLogicalConstraints.left();
- auto lineLogicalTop = lineLogicalConstraints.top();
- auto lineLogicalRight = lineLogicalLeft + lineLogicalConstraints.width();
- auto lineIsConstrainedByFloat = false;
+ auto* floatingState = this->floatingState();
+ if (!floatingState || floatingState->floats().isEmpty())
+ return { };
// Check for intruding floats and adjust logical left/available width for this line accordingly.
- if (auto* floatingState = this->floatingState()) {
- auto floatingContext = FloatingContext { formattingContext(), *floatingState };
- if (!floatingContext.isEmpty()) {
- // FIXME: Add support for variable line height, where the floats should be probed as the line height grows.
- auto floatConstraints = floatingContext.constraints(toLayoutUnit(lineLogicalTop), toLayoutUnit(lineLogicalTop + lineLogicalConstraints.height()));
- // Check if these values actually constrain the line.
- if (floatConstraints.left && floatConstraints.left->x <= lineLogicalLeft)
- floatConstraints.left = { };
+ auto floatingContext = FloatingContext { formattingContext(), *floatingState };
+ auto constraints = floatingContext.constraints(toLayoutUnit(lineLogicalRect.top()), toLayoutUnit(lineLogicalRect.bottom()));
+ // Check if these values actually constrain the line.
+ if (constraints.left && constraints.left->x <= lineLogicalRect.left())
+ constraints.left = { };
- if (floatConstraints.right && floatConstraints.right->x >= lineLogicalRight)
- floatConstraints.right = { };
+ if (constraints.right && constraints.right->x >= lineLogicalRect.right())
+ constraints.right = { };
- lineIsConstrainedByFloat = floatConstraints.left || floatConstraints.right;
+ if (!constraints.left && !constraints.right)
+ return { };
- if (floatConstraints.left && floatConstraints.right) {
- ASSERT(floatConstraints.left->x <= floatConstraints.right->x);
- lineLogicalRight = floatConstraints.right->x;
- lineLogicalLeft = floatConstraints.left->x;
- } else if (floatConstraints.left) {
- ASSERT(floatConstraints.left->x >= lineLogicalLeft);
- lineLogicalLeft = floatConstraints.left->x;
- } else if (floatConstraints.right) {
- // Right float boxes may overflow the containing block on the left.
- lineLogicalRight = std::max<InlineLayoutUnit>(lineLogicalLeft, floatConstraints.right->x);
- }
- }
+ auto lineLogicalLeft = lineLogicalRect.left();
+ auto lineLogicalRight = lineLogicalRect.right();
+ if (constraints.left && constraints.right) {
+ ASSERT(constraints.left->x <= constraints.right->x);
+ lineLogicalRight = constraints.right->x;
+ lineLogicalLeft = constraints.left->x;
+ } else if (constraints.left) {
+ ASSERT(constraints.left->x >= lineLogicalLeft);
+ lineLogicalLeft = constraints.left->x;
+ } else if (constraints.right) {
+ // Right float boxes may overflow the containing block on the left.
+ lineLogicalRight = std::max<InlineLayoutUnit>(lineLogicalLeft, constraints.right->x);
}
+ return HorizontalConstraints { toLayoutUnit(lineLogicalLeft), toLayoutUnit(lineLogicalRight - lineLogicalLeft) };
+}
+LineBuilder::UsedConstraints LineBuilder::initialConstraintsForLine(const InlineRect& initialLineLogicalRect, bool isFirstLine) const
+{
+ auto lineLogicalLeft = initialLineLogicalRect.left();
+ auto lineLogicalRight = initialLineLogicalRect.right();
+ auto lineIsConstrainedByFloat = false;
+
+ if (auto lineConstraints = floatConstraints(initialLineLogicalRect)) {
+ lineLogicalLeft = lineConstraints->logicalLeft;
+ lineLogicalRight = lineConstraints->logicalRight();
+ lineIsConstrainedByFloat = true;
+ }
+
auto computedTextIndent = [&]() -> InlineLayoutUnit {
// text-indent property specifies the indentation applied to lines of inline content in a block.
// The indent is treated as a margin applied to the start edge of the line box.
@@ -431,10 +442,10 @@
auto textIndent = root.style().textIndent();
if (textIndent == RenderStyle::initialTextIndent())
return { };
- return { minimumValueForLength(textIndent, lineLogicalConstraints.width()) };
+ return { minimumValueForLength(textIndent, initialLineLogicalRect.width()) };
};
lineLogicalLeft += computedTextIndent();
- return UsedConstraints { { lineLogicalTop, lineLogicalLeft, lineLogicalRight - lineLogicalLeft, lineLogicalConstraints.height() }, lineIsConstrainedByFloat };
+ return UsedConstraints { { initialLineLogicalRect.top(), lineLogicalLeft, lineLogicalRight - lineLogicalLeft, initialLineLogicalRect.height() }, lineIsConstrainedByFloat };
}
void LineBuilder::candidateContentForLine(LineCandidate& lineCandidate, size_t currentInlineItemIndex, const InlineItemRange& layoutRange, size_t partialLeadingContentLength, InlineLayoutUnit currentLogicalRight)
Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h (270447 => 270448)
--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h 2020-12-04 20:03:53 UTC (rev 270447)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBuilder.h 2020-12-04 20:05:59 UTC (rev 270448)
@@ -87,7 +87,9 @@
InlineRect logicalRect;
bool isConstrainedByFloat { false };
};
- UsedConstraints initialConstraintsForLine(const InlineRect& initialLineConstraints, bool isFirstLine);
+ UsedConstraints initialConstraintsForLine(const InlineRect& initialLineLogicalRect, bool isFirstLine) const;
+ Optional<HorizontalConstraints> floatConstraints(const InlineRect& lineLogicalRect) const;
+
void handleFloatContent(const InlineItem&);
Result handleInlineContent(InlineContentBreaker&, const InlineItemRange& needsLayoutRange, const LineCandidate&);
size_t rebuildLine(const InlineItemRange& needsLayoutRange, const InlineItem& lastInlineItemToAdd);
@@ -107,6 +109,7 @@
const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
InlineFormattingState* formattingState() { return m_inlineFormattingState; }
FloatingState* floatingState() { return m_floatingState; }
+ const FloatingState* floatingState() const { return m_floatingState; }
const ContainerBox& root() const;
const LayoutState& layoutState() const;