Diff
Modified: trunk/Source/WebCore/ChangeLog (285955 => 285956)
--- trunk/Source/WebCore/ChangeLog 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/ChangeLog 2021-11-17 22:55:08 UTC (rev 285956)
@@ -1,3 +1,29 @@
+2021-11-17 Alan Bujtas <[email protected]>
+
+ [LFC][IFC] Introduce enum class IntrinsicWidthMode
+ https://bugs.webkit.org/show_bug.cgi?id=233277
+
+ Reviewed by Antti Koivisto.
+
+ This is in preparation for being able to apply different glyph hanging behavior for min and max intrinsic width computation.
+
+ * layout/formattingContexts/FormattingConstraints.h:
+ * layout/formattingContexts/inline/InlineContentBreaker.cpp:
+ (WebCore::Layout::InlineContentBreaker::InlineContentBreaker):
+ * layout/formattingContexts/inline/InlineContentBreaker.h:
+ (WebCore::Layout::InlineContentBreaker::isInIntrinsicWidthMode const):
+ * layout/formattingContexts/inline/InlineFormattingContext.cpp:
+ (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthConstraints):
+ (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):
+ * layout/formattingContexts/inline/InlineFormattingContext.h:
+ * layout/formattingContexts/inline/InlineLineBuilder.cpp:
+ (WebCore::Layout::LineBuilder::LineBuilder):
+ (WebCore::Layout::LineBuilder::computedIntrinsicWidth):
+ (WebCore::Layout::LineBuilder::placeInlineContent):
+ * layout/formattingContexts/inline/InlineLineBuilder.h:
+ (WebCore::Layout::LineBuilder::intrinsicWidthMode const):
+ (WebCore::Layout::LineBuilder::isInIntrinsicWidthMode const):
+
2021-11-17 Chris Dumez <[email protected]>
Web Locks API does get enabled in Service Workers when running layout tests
Modified: trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h (285955 => 285956)
--- trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h 2021-11-17 22:55:08 UTC (rev 285956)
@@ -87,6 +87,11 @@
{
}
+enum class IntrinsicWidthMode {
+ Minimum,
+ Maximum
+};
+
struct IntrinsicWidthConstraints {
void expand(LayoutUnit horizontalValue);
IntrinsicWidthConstraints& operator+=(const IntrinsicWidthConstraints&);
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp (285955 => 285956)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp 2021-11-17 22:55:08 UTC (rev 285956)
@@ -125,8 +125,8 @@
return { };
}
-InlineContentBreaker::InlineContentBreaker(bool isInIntrinsicWidthMode)
- : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode)
+InlineContentBreaker::InlineContentBreaker(std::optional<IntrinsicWidthMode> intrinsicWidthMode)
+ : m_intrinsicWidthMode(intrinsicWidthMode)
{
}
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h (285955 => 285956)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h 2021-11-17 22:55:08 UTC (rev 285956)
@@ -27,6 +27,7 @@
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
+#include "FormattingConstraints.h"
#include "LayoutUnits.h"
#include "RenderStyle.h"
@@ -38,7 +39,7 @@
class InlineContentBreaker {
public:
- InlineContentBreaker(bool isInIntrinsicWidthMode);
+ InlineContentBreaker(std::optional<IntrinsicWidthMode>);
struct PartialRun {
size_t length { 0 };
@@ -150,9 +151,9 @@
};
OptionSet<WordBreakRule> wordBreakBehavior(const RenderStyle&, bool hasWrapOpportunityAtPreviousPosition) const;
bool shouldKeepEndOfLineWhitespace(const ContinuousContent&) const;
- bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
+ bool isInIntrinsicWidthMode() const { return !!m_intrinsicWidthMode; }
- bool m_isInIntrinsicWidthMode { false };
+ std::optional<IntrinsicWidthMode> m_intrinsicWidthMode;
bool n_hyphenationIsDisabled { false };
};
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp (285955 => 285956)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp 2021-11-17 22:55:08 UTC (rev 285956)
@@ -397,34 +397,34 @@
collectContentIfNeeded();
- auto maximumLineWidth = [&](auto availableWidth) {
+ auto maximumLineWidth = [&](auto intrinsicWidthMode) {
// Switch to the min/max formatting root width values before formatting the lines.
for (auto* formattingRoot : formattingContextRootList) {
auto intrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).intrinsicWidthConstraintsForBox(*formattingRoot);
auto& boxGeometry = formattingState().boxGeometry(*formattingRoot);
- auto contentWidth = (availableWidth ? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding();
+ auto contentWidth = (intrinsicWidthMode == IntrinsicWidthMode::Maximum ? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding();
boxGeometry.setContentBoxWidth(contentWidth);
}
- return computedIntrinsicWidthForConstraint(availableWidth);
+ return computedIntrinsicWidthForConstraint(intrinsicWidthMode);
};
- auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth(0));
- auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth(maxInlineLayoutUnit()));
+ auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Minimum));
+ auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Maximum));
auto constraints = formattingGeometry().constrainByMinMaxWidth(root(), { minimumContentWidth, maximumContentWidth });
formattingState().setIntrinsicWidthConstraints(constraints);
return constraints;
}
-InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const
+InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(IntrinsicWidthMode intrinsicWidthMode) const
{
auto& inlineItems = formattingState().inlineItems();
- auto lineBuilder = LineBuilder { *this, inlineItems };
+ auto lineBuilder = LineBuilder { *this, inlineItems, intrinsicWidthMode };
auto layoutRange = LineBuilder::InlineItemRange { 0 , inlineItems.size() };
auto maximumLineWidth = InlineLayoutUnit { };
auto maximumFloatWidth = LayoutUnit { };
auto isFirstLine = true;
while (!layoutRange.isEmpty()) {
- auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, availableWidth, isFirstLine);
+ auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, isFirstLine);
layoutRange.start = intrinsicContent.inlineItemRange.end;
maximumLineWidth = std::max(maximumLineWidth, intrinsicContent.logicalWidth);
isFirstLine = false;
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h (285955 => 285956)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h 2021-11-17 22:55:08 UTC (rev 285956)
@@ -65,7 +65,7 @@
void computeStaticPositionForOutOfFlowContent(const FormattingState::OutOfFlowBoxList&);
void computeIntrinsicWidthForFormattingRoot(const Box&);
- InlineLayoutUnit computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const;
+ InlineLayoutUnit computedIntrinsicWidthForConstraint(IntrinsicWidthMode) const;
void computeHorizontalMargin(const Box&, const HorizontalConstraints&);
void computeHeightAndMargin(const Box&, const HorizontalConstraints&);
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp (285955 => 285956)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp 2021-11-17 22:55:08 UTC (rev 285956)
@@ -269,8 +269,8 @@
return boxGeometry.marginBoxWidth();
}
-LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
- : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
+LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode)
+ : m_intrinsicWidthMode(intrinsicWidthMode)
, m_inlineFormattingContext(inlineFormattingContext)
, m_inlineFormattingState(&inlineFormattingContext.formattingState())
, m_floatingState(&floatingState)
@@ -280,8 +280,8 @@
{
}
-LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
- : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
+LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode)
+ : m_intrinsicWidthMode(intrinsicWidthMode)
, m_inlineFormattingContext(inlineFormattingContext)
, m_line(inlineFormattingContext)
, m_inlineItems(inlineItems)
@@ -326,9 +326,11 @@
, lineRuns };
}
-LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, InlineLayoutUnit availableWidth, bool isFirstLine)
+LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, bool isFirstLine)
{
- auto lineConstraints = initialConstraintsForLine({ 0, 0, availableWidth, 0 }, isFirstLine);
+ ASSERT(isInIntrinsicWidthMode());
+ auto lineLogicalWidth = *intrinsicWidthMode() == IntrinsicWidthMode::Maximum ? maxInlineLayoutUnit() : 0.f;
+ auto lineConstraints = initialConstraintsForLine({ 0, 0, lineLogicalWidth, 0 }, isFirstLine);
initialize(lineConstraints, isFirstLine, needsLayoutRange.start, { }, { });
auto committedContent = placeInlineContent(needsLayoutRange);
@@ -393,7 +395,7 @@
LineBuilder::CommittedContent LineBuilder::placeInlineContent(const InlineItemRange& needsLayoutRange)
{
auto lineCandidate = LineCandidate { layoutState().shouldIgnoreTrailingLetterSpacing() };
- auto inlineContentBreaker = InlineContentBreaker { isInIntrinsicWidthMode() };
+ auto inlineContentBreaker = InlineContentBreaker { intrinsicWidthMode() };
auto currentItemIndex = needsLayoutRange.start;
size_t committedInlineItemCount = 0;
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h (285955 => 285956)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h 2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h 2021-11-17 22:55:08 UTC (rev 285956)
@@ -27,6 +27,7 @@
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
+#include "FormattingConstraints.h"
#include "InlineContentBreaker.h"
#include "InlineFormattingState.h"
#include "InlineLine.h"
@@ -39,9 +40,8 @@
class LineBuilder {
public:
- enum class IsInIntrinsicWidthMode { No, Yes };
- LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::No);
- LineBuilder(const InlineFormattingContext&, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::Yes);
+ LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, std::optional<IntrinsicWidthMode> = std::nullopt);
+ LineBuilder(const InlineFormattingContext&, const InlineItems&, std::optional<IntrinsicWidthMode>);
struct InlineItemRange {
bool isEmpty() const { return start == end; }
@@ -72,7 +72,7 @@
InlineLayoutUnit logicalWidth { 0 };
const FloatList& floats;
};
- IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, InlineLayoutUnit availableWidth, bool isFirstLine);
+ IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, bool isFirstLine);
private:
void candidateContentForLine(LineCandidate&, size_t inlineItemIndex, const InlineItemRange& needsLayoutRange, InlineLayoutUnit currentLogicalRight);
@@ -112,7 +112,8 @@
InlineLayoutUnit inlineItemWidth(const InlineItem&, InlineLayoutUnit contentLogicalLeft) const;
bool isLastLineWithInlineContent(const InlineItemRange& lineRange, size_t lastInlineItemIndex, bool hasPartialTrailingContent) const;
- bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
+ std::optional<IntrinsicWidthMode> intrinsicWidthMode() const { return m_intrinsicWidthMode; }
+ bool isInIntrinsicWidthMode() const { return !!intrinsicWidthMode(); }
const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
InlineFormattingState* formattingState() { return m_inlineFormattingState; }
@@ -123,7 +124,7 @@
private:
bool m_isFirstLine { false };
- bool m_isInIntrinsicWidthMode { false };
+ std::optional<IntrinsicWidthMode> m_intrinsicWidthMode;
const InlineFormattingContext& m_inlineFormattingContext;
InlineFormattingState* m_inlineFormattingState { nullptr };
FloatingState* m_floatingState { nullptr };