WebKit Bugzilla
Attachment 348483 Details for
Bug 189143
: [LFC][Floating] Use non-computed horizontal margins when intersecting floats with float avoiders.
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
Patch.txt (text/plain), 6.85 KB, created by
zalan
on 2018-08-29 21:18:37 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2018-08-29 21:18:37 PDT
Size:
6.85 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 5d3ea44e271..e6f86c7287d 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,28 @@ >+2018-08-29 Zalan Bujtas <zalan@apple.com> >+ >+ [LFC][Floating] Use non-computed horizontal margins when intersecting floats with float avoiders. >+ https://bugs.webkit.org/show_bug.cgi?id=189143 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * layout/Verification.cpp: >+ (WebCore::Layout::LayoutContext::verifyAndOutputMismatchingLayoutTree const): >+ * layout/floats/FloatAvoider.cpp: >+ (WebCore::Layout::FloatAvoider::setHorizontalConstraints): >+ (WebCore::Layout::FloatAvoider::initialHorizontalPosition const): >+ * layout/floats/FloatAvoider.h: >+ (WebCore::Layout::FloatAvoider::marginTop const): >+ (WebCore::Layout::FloatAvoider::marginBottom const): >+ (WebCore::Layout::FloatAvoider::marginLeft const): >+ (WebCore::Layout::FloatAvoider::marginRight const): >+ (WebCore::Layout::FloatAvoider::marginBoxWidth const): >+ * layout/floats/FloatBox.cpp: >+ (WebCore::Layout::FloatBox::rect const): >+ (WebCore::Layout::FloatBox::horizontalPositionCandidate): >+ (WebCore::Layout::FloatBox::verticalPositionCandidate): >+ (WebCore::Layout::FloatBox::initialVerticalPosition const): >+ * layout/floats/FloatBox.h: >+ > 2018-08-29 Zalan Bujtas <zalan@apple.com> > > [LFC][Margins] Add non-computed horizontal margins to DisplayBox >diff --git a/Source/WebCore/layout/floats/FloatAvoider.cpp b/Source/WebCore/layout/floats/FloatAvoider.cpp >index 3f79df790bd..af52d344685 100644 >--- a/Source/WebCore/layout/floats/FloatAvoider.cpp >+++ b/Source/WebCore/layout/floats/FloatAvoider.cpp >@@ -61,10 +61,9 @@ void FloatAvoider::setHorizontalConstraints(HorizontalConstraints horizontalCons > auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft(); > auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth(); > // Align it with the containing block's left edge first. >- left = std::max(containingBlockContentBoxLeft + m_absoluteDisplayBox.marginLeft(), left); >+ left = std::max(containingBlockContentBoxLeft + marginLeft(), left); > // Make sure it does not overflow the containing block on the right. >- auto marginBoxSize = m_absoluteDisplayBox.marginBox().width(); >- left = std::min(left, containingBlockContentBoxRight - marginBoxSize + m_absoluteDisplayBox.marginLeft()); >+ left = std::min(left, containingBlockContentBoxRight - marginBoxWidth() + marginLeft()); > > return left; > }; >@@ -99,8 +98,8 @@ PositionInContextRoot FloatAvoider::initialHorizontalPosition() const > auto containingBlockContentBoxLeft = m_containingBlockAbsoluteDisplayBox.left() + m_containingBlockAbsoluteDisplayBox.contentBoxLeft(); > auto containingBlockContentBoxRight = containingBlockContentBoxLeft + m_containingBlockAbsoluteDisplayBox.contentBoxWidth(); > >- auto left = isLeftAligned() ? containingBlockContentBoxLeft : containingBlockContentBoxRight - m_absoluteDisplayBox.marginBox().width(); >- left += m_absoluteDisplayBox.marginLeft(); >+ auto left = isLeftAligned() ? containingBlockContentBoxLeft : containingBlockContentBoxRight - marginBoxWidth(); >+ left += marginLeft(); > > return left; > } >diff --git a/Source/WebCore/layout/floats/FloatAvoider.h b/Source/WebCore/layout/floats/FloatAvoider.h >index 55562ea0014..ce91d9c91c1 100644 >--- a/Source/WebCore/layout/floats/FloatAvoider.h >+++ b/Source/WebCore/layout/floats/FloatAvoider.h >@@ -68,6 +68,13 @@ protected: > virtual PositionInContextRoot horizontalPositionCandidate(HorizontalConstraints); > virtual PositionInContextRoot verticalPositionCandidate(PositionInContextRoot); > >+ LayoutUnit marginTop() const { return displayBox().marginTop(); } >+ LayoutUnit marginBottom() const { return displayBox().marginBottom(); } >+ LayoutUnit marginLeft() const { return displayBox().nonComputedMarginLeft(); } >+ LayoutUnit marginRight() const { return displayBox().nonComputedMarginRight(); } >+ >+ LayoutUnit marginBoxWidth() const { return marginLeft() + displayBox().width() + marginRight(); } >+ > const FloatingState& floatingState() const { return m_floatingState; } > const Box& layoutBox() const { return *m_layoutBox; } > const Display::Box& displayBox() const { return m_absoluteDisplayBox; } >diff --git a/Source/WebCore/layout/floats/FloatBox.cpp b/Source/WebCore/layout/floats/FloatBox.cpp >index 290736fa8ff..27ab3418a56 100644 >--- a/Source/WebCore/layout/floats/FloatBox.cpp >+++ b/Source/WebCore/layout/floats/FloatBox.cpp >@@ -40,27 +40,33 @@ FloatBox::FloatBox(const Box& layoutBox, const FloatingState& floatingState, con > { > } > >+Display::Box::Rect FloatBox::rect() const >+{ >+ auto rect = displayBox().rect(); >+ return { rect.top() - marginTop(), rect.left() - marginLeft(), marginLeft() + rect.width() + marginRight(), marginTop() + rect.height() + marginBottom() }; >+} >+ > PositionInContextRoot FloatBox::horizontalPositionCandidate(HorizontalConstraints horizontalConstraints) > { > auto positionCandidate = isLeftAligned() ? *horizontalConstraints.left : *horizontalConstraints.right - rect().width(); >- positionCandidate += displayBox().marginLeft(); >+ positionCandidate += marginLeft(); > > return positionCandidate; > } > > PositionInContextRoot FloatBox::verticalPositionCandidate(PositionInContextRoot verticalConstraint) > { >- return verticalConstraint + displayBox().marginTop(); >+ return verticalConstraint + marginTop(); > } > > PositionInContextRoot FloatBox::initialVerticalPosition() const > { > // Incoming float cannot be placed higher than existing floats (margin box of the last float). > // Take the static position (where the box would go if it wasn't floating) and adjust it with the last float. >- auto top = FloatAvoider::initialVerticalPosition() - displayBox().marginTop(); >+ auto top = FloatAvoider::initialVerticalPosition() - marginTop(); > if (auto lastFloat = floatingState().last()) > top = std::max(top, lastFloat->rectWithMargin().top()); >- top += displayBox().marginTop(); >+ top += marginTop(); > > return top; > } >diff --git a/Source/WebCore/layout/floats/FloatBox.h b/Source/WebCore/layout/floats/FloatBox.h >index ed7edae2454..32fb3c2018c 100644 >--- a/Source/WebCore/layout/floats/FloatBox.h >+++ b/Source/WebCore/layout/floats/FloatBox.h >@@ -43,7 +43,7 @@ class FloatBox : public FloatAvoider { > public: > FloatBox(const Box&, const FloatingState&, const LayoutContext&); > >- Display::Box::Rect rect() const final { return displayBox().rectWithMargin(); } >+ Display::Box::Rect rect() const final; > > private: > bool isLeftAligned() const final { return layoutBox().isLeftFloatingPositioned(); }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
koivisto
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 189143
: 348483