Diff
Modified: trunk/Source/WebCore/ChangeLog (232256 => 232257)
--- trunk/Source/WebCore/ChangeLog 2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/ChangeLog 2018-05-29 15:19:49 UTC (rev 232257)
@@ -1,3 +1,38 @@
+2018-05-29 Zalan Bujtas <[email protected]>
+
+ [LFC] Miscellaneous fixes to ensure no assertion in LayoutContext::layout
+ https://bugs.webkit.org/show_bug.cgi?id=186052
+
+ Reviewed by Antti Koivisto.
+
+ With this patch, LayoutContext::layout() does not assert on <html><body><div></div></body></html> anymore.
+
+ * layout/LayoutContext.cpp:
+ (WebCore::Layout::LayoutContext::initializeRoot): New context root is always a layout root.
+ * layout/LayoutContext.h:
+ * layout/Verification.cpp:
+ (WebCore::Layout::outputMismatchingBoxInformationIfNeeded):
+ * layout/blockformatting/BlockFormattingContext.cpp:
+ (WebCore::Layout::BlockFormattingContext::layout const): we need computed margin/border/padding for width computation
+ * layout/displaytree/DisplayBox.cpp: Add clone() method to be able to carry over the 'hasValid*' bits.
+ (WebCore::Display::Box::Style::Style):
+ (WebCore::Display::Box::borderBox const):
+ (WebCore::Display::Box::contentBox const):
+ * layout/displaytree/DisplayBox.h:
+ (WebCore::Display::Box::Rect::operator LayoutRect const):
+ (WebCore::Display::Box::setSize):
+ (WebCore::Display::Box::setHasValidMargin):
+ (WebCore::Display::Box::setHasValidBorder):
+ (WebCore::Display::Box::setHasValidPadding):
+ (WebCore::Display::Box::Rect::setHasValidPosition):
+ (WebCore::Display::Box::Rect::setHasValidSize):
+ (WebCore::Display::Box::Rect::setSize):
+ (WebCore::Display::Box::Rect::clone const):
+ (WebCore::Display::Box::setMargin):
+ (WebCore::Display::Box::setBorder):
+ (WebCore::Display::Box::setPadding):
+ (WebCore::Display::Box::Rect::Rect): Deleted.
+
2018-05-29 Wenson Hsieh <[email protected]>
[Extra zoom mode] "Significant area painted" rendering progress event is rarely fired
Modified: trunk/Source/WebCore/layout/LayoutContext.cpp (232256 => 232257)
--- trunk/Source/WebCore/layout/LayoutContext.cpp 2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/LayoutContext.cpp 2018-05-29 15:19:49 UTC (rev 232257)
@@ -51,12 +51,13 @@
void LayoutContext::initializeRoot(const Container& root, const LayoutSize& containerSize)
{
+ ASSERT(root.establishesFormattingContext());
+
m_root = makeWeakPtr(const_cast<Container&>(root));
auto& displayBox = createDisplayBox(root);
// Root is always at 0 0 with no margin
displayBox.setTopLeft({ });
- displayBox.setWidth(containerSize.width());
- displayBox.setHeight(containerSize.height());
+ displayBox.setSize(containerSize);
displayBox.setMargin({ });
auto& style = root.style();
@@ -66,8 +67,8 @@
style.borderLeft().width(),
style.borderBottom().width(),
style.borderRight().width()
+ });
- });
displayBox.setPadding({
valueForLength(style.paddingTop(), containerSize.width()),
valueForLength(style.paddingLeft(), containerSize.width()),
@@ -74,6 +75,8 @@
valueForLength(style.paddingBottom(), containerSize.width()),
valueForLength(style.paddingRight(), containerSize.width())
});
+
+ m_formattingContextRootListForLayout.add(&root);
}
void LayoutContext::updateLayout()
Modified: trunk/Source/WebCore/layout/LayoutContext.h (232256 => 232257)
--- trunk/Source/WebCore/layout/LayoutContext.h 2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/LayoutContext.h 2018-05-29 15:19:49 UTC (rev 232257)
@@ -77,12 +77,12 @@
FormattingState& establishedFormattingState(const Box& formattingContextRoot, const FormattingContext&);
std::unique_ptr<FormattingContext> formattingContext(const Box& formattingContextRoot);
+ Display::Box& createDisplayBox(const Box&);
+ Display::Box* displayBoxForLayoutBox(const Box& layoutBox) const { return m_layoutToDisplayBox.get(&layoutBox); }
+
// For testing purposes only
void verifyAndOutputMismatchingLayoutTree(const RenderView&) const;
- Display::Box& createDisplayBox(const Box&);
- Display::Box* displayBoxForLayoutBox(const Box& layoutBox) const { return m_layoutToDisplayBox.get(&layoutBox); }
-
private:
WeakPtr<Container> m_root;
HashSet<const Container*> m_formattingContextRootListForLayout;
Modified: trunk/Source/WebCore/layout/Verification.cpp (232256 => 232257)
--- trunk/Source/WebCore/layout/Verification.cpp 2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/Verification.cpp 2018-05-29 15:19:49 UTC (rev 232257)
@@ -56,7 +56,7 @@
auto* displayBox = context.displayBoxForLayoutBox(layoutBox);
ASSERT(displayBox);
- if (renderer.marginBoxRect() != displayBox->marginBox())
+ if (renderer.frameRect() != displayBox->rect())
outputRect("frameBox", renderer.frameRect(), displayBox->rect());
if (renderer.marginBoxRect() != displayBox->marginBox())
Modified: trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp (232256 => 232257)
--- trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/blockformatting/BlockFormattingContext.cpp 2018-05-29 15:19:49 UTC (rev 232257)
@@ -73,10 +73,10 @@
auto& layoutBox = layoutPair.layoutBox;
auto& displayBox = layoutPair.displayBox;
- computeWidth(layoutContext, layoutBox, displayBox);
computeMargin(layoutContext, layoutBox, displayBox);
computeBorderAndPadding(layoutContext, layoutBox, displayBox);
computeStaticPosition(layoutContext, layoutBox, displayBox);
+ computeWidth(layoutContext, layoutBox, displayBox);
if (layoutBox.establishesFormattingContext()) {
auto formattingContext = layoutContext.formattingContext(layoutBox);
formattingContext->layout(layoutContext, layoutContext.establishedFormattingState(layoutBox, *formattingContext));
Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp (232256 => 232257)
--- trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp 2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.cpp 2018-05-29 15:19:49 UTC (rev 232257)
@@ -48,7 +48,6 @@
Box::Style::Style(const RenderStyle& style)
: boxSizing(style.boxSizing())
{
-
}
Box::Rect Box::marginBox() const
@@ -66,15 +65,17 @@
Box::Rect Box::borderBox() const
{
+ auto rect = m_rect.clone();
+ rect.setTopLeft({ });
+
if (m_style.boxSizing == BoxSizing::BorderBox)
- return Box::Rect( { }, size());
+ return rect;
// Width is content box.
ASSERT(m_hasValidBorder);
ASSERT(m_hasValidPadding);
- auto borderBoxSize = size();
- borderBoxSize.expand(borderLeft() + paddingLeft() + paddingRight() + borderRight(), borderTop() + paddingTop() + paddingBottom() + borderBottom());
- return Box::Rect( { }, borderBoxSize);
+ rect.expand(borderLeft() + paddingLeft() + paddingRight() + borderRight(), borderTop() + paddingTop() + paddingBottom() + borderBottom());
+ return rect;
}
Box::Rect Box::paddingBox() const
@@ -92,8 +93,11 @@
Box::Rect Box::contentBox() const
{
- if (m_style.boxSizing == BoxSizing::ContentBox)
- return Box::Rect(LayoutPoint(0, 0), size());
+ if (m_style.boxSizing == BoxSizing::ContentBox) {
+ auto rect = m_rect.clone();
+ rect.setTopLeft({ });
+ return rect;
+ }
// Width is border box.
ASSERT(m_hasValidPadding);
Modified: trunk/Source/WebCore/layout/displaytree/DisplayBox.h (232256 => 232257)
--- trunk/Source/WebCore/layout/displaytree/DisplayBox.h 2018-05-29 15:00:09 UTC (rev 232256)
+++ trunk/Source/WebCore/layout/displaytree/DisplayBox.h 2018-05-29 15:19:49 UTC (rev 232257)
@@ -55,7 +55,6 @@
class Rect {
public:
Rect() = default;
- Rect(const LayoutPoint&, const LayoutSize&);
LayoutUnit top() const;
LayoutUnit left() const;
@@ -74,6 +73,7 @@
void setTopLeft(const LayoutPoint&);
void setWidth(LayoutUnit);
void setHeight(LayoutUnit);
+ void setSize(const LayoutSize&);
void shiftLeftTo(LayoutUnit);
void shiftRightTo(LayoutUnit);
@@ -82,7 +82,8 @@
void expand(LayoutUnit, LayoutUnit);
- operator LayoutRect() const { return m_rect; }
+ Rect clone() const;
+ operator LayoutRect() const;
private:
#if !ASSERT_DISABLED
@@ -97,6 +98,7 @@
bool hasValidGeometry() const { return hasValidPosition() && hasValidSize(); }
void setHasValidPosition();
+ void setHasValidSize();
bool m_hasValidTop { false };
bool m_hasValidLeft { false };
@@ -156,6 +158,7 @@
void setLeft(LayoutUnit left) { m_rect.setLeft(left); }
void setWidth(LayoutUnit width) { m_rect.setWidth(width); }
void setHeight(LayoutUnit height) { m_rect.setHeight(height); }
+ void setSize(const LayoutSize& size) { m_rect.setSize(size); }
struct Edges {
Edges() = default;
@@ -180,9 +183,9 @@
void invalidateBorder() { m_hasValidBorder = false; }
void invalidatePadding() { m_hasValidPadding = false; }
- void setHasValidMargin();
- void setHasValidBorder();
- void setHasValidPadding();
+ void setHasValidMargin() { m_hasValidMargin = true; }
+ void setHasValidBorder() { m_hasValidBorder = true; }
+ void setHasValidPadding() { m_hasValidPadding = true; }
#endif
const Style m_style;
@@ -212,13 +215,13 @@
m_hasValidTop = true;
m_hasValidLeft = true;
}
-#endif
-inline Box::Rect::Rect(const LayoutPoint& topLeft, const LayoutSize& size)
- : m_rect(topLeft, size)
+inline void Box::Rect::setHasValidSize()
{
-
+ m_hasValidWidth = true;
+ m_hasValidHeight = true;
}
+#endif
inline LayoutUnit Box::Rect::top() const
{
@@ -316,6 +319,14 @@
m_rect.setHeight(height);
}
+inline void Box::Rect::setSize(const LayoutSize& size)
+{
+#if !ASSERT_DISABLED
+ setHasValidSize();
+#endif
+ m_rect.setSize(size);
+}
+
inline void Box::Rect::shiftLeftTo(LayoutUnit left)
{
ASSERT(m_hasValidLeft);
@@ -346,10 +357,29 @@
m_rect.expand(width, height);
}
+inline Box::Rect Box::Rect::clone() const
+{
+ Rect rect;
+#if !ASSERT_DISABLED
+ rect.m_hasValidTop = m_hasValidTop;
+ rect.m_hasValidLeft = m_hasValidLeft;
+ rect.m_hasValidWidth = m_hasValidWidth;
+ rect.m_hasValidHeight = m_hasValidHeight;
+#endif
+ rect.m_rect = m_rect;
+ return rect;
+}
+
+inline Box::Rect::operator LayoutRect() const
+{
+ ASSERT(hasValidGeometry());
+ return m_rect;
+}
+
inline void Box::setMargin(Edges margin)
{
#if !ASSERT_DISABLED
- void setHasValidMargin();
+ setHasValidMargin();
#endif
m_margin = margin;
}
@@ -357,7 +387,7 @@
inline void Box::setBorder(Edges border)
{
#if !ASSERT_DISABLED
- void setHasValidBorder();
+ setHasValidBorder();
#endif
m_border = border;
}
@@ -365,7 +395,7 @@
inline void Box::setPadding(Edges padding)
{
#if !ASSERT_DISABLED
- void setHasValidPadding();
+ setHasValidPadding();
#endif
m_padding = padding;
}