[LFC][Floating] Add FloatingState::bottom() to enable content height computation...
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Aug 2018 02:32:24 +0000 (02:32 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Aug 2018 02:32:24 +0000 (02:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=188294

Reviewed by Simon Fraser.

"10.6.7 'Auto' heights for block formatting context roots
...
In addition, if the element has any floating descendants whose bottom margin edge is below the element's bottom content edge,
then the height is increased to include those edges. Only floats that participate in this block formatting context are taken into
account, e.g., floats inside absolutely positioned descendants or other floats are not..."

* layout/FloatingState.cpp:
(WebCore::Layout::FloatingState::bottom const):
* layout/FloatingState.h:
* layout/FormattingContextGeometry.cpp:
(WebCore::Layout::contentHeightForFormattingContextRoot):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@234536 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/layout/FloatingState.cpp
Source/WebCore/layout/FloatingState.h
Source/WebCore/layout/FormattingContextGeometry.cpp

index 7202fcc..b6cf833 100644 (file)
@@ -1,3 +1,22 @@
+2018-08-02  Zalan Bujtas  <zalan@apple.com>
+
+        [LFC][Floating] Add FloatingState::bottom() to enable content height computation for formatting roots.
+        https://bugs.webkit.org/show_bug.cgi?id=188294
+
+        Reviewed by Simon Fraser.
+
+        "10.6.7 'Auto' heights for block formatting context roots
+        ...
+        In addition, if the element has any floating descendants whose bottom margin edge is below the element's bottom content edge,
+        then the height is increased to include those edges. Only floats that participate in this block formatting context are taken into
+        account, e.g., floats inside absolutely positioned descendants or other floats are not..."
+
+        * layout/FloatingState.cpp:
+        (WebCore::Layout::FloatingState::bottom const):
+        * layout/FloatingState.h:
+        * layout/FormattingContextGeometry.cpp:
+        (WebCore::Layout::contentHeightForFormattingContextRoot):
+
 2018-08-02  Jer Noble  <jer.noble@apple.com>
 
         Control center controls disappear when pausing, locking device.
index 2cca39e..be0ddd0 100644 (file)
@@ -90,6 +90,29 @@ void FloatingState::append(const Box& layoutBox)
     m_floats.append({ layoutBox, *this });
 }
 
+std::optional<LayoutUnit> FloatingState::bottom(const Box& formattingContextRoot) const
+{
+    if (m_floats.isEmpty())
+        return { };
+
+    // TODO: Currently this is only called once for each formatting context root with floats per layout.
+    // Cache the value if we end up calling it more frequently (and update it at append/remove).
+    std::optional<LayoutUnit> bottom;
+    for (auto& floatItem : m_floats) {
+        // Ignore floats from other formatting contexts when the floating state is inherited.
+        if (&formattingContextRoot != &floatItem.layoutBox().formattingContextRoot())
+            continue;
+
+        auto floatsBottom = floatItem.displayBox().rectWithMargin().bottom();
+        if (bottom) {
+            bottom = std::max(*bottom, floatsBottom);
+            continue;
+        }
+        bottom = floatsBottom;
+    }
+    return bottom;
+}
+
 }
 }
 #endif
index cfb2e00..62cf25d 100644 (file)
@@ -51,6 +51,7 @@ public:
     void remove(const Box& layoutBox);
 
     bool isEmpty() const { return m_floats.isEmpty(); }
+    std::optional<LayoutUnit> bottom(const Box& formattingContextRoot) const;
 
     class FloatItem {
     public:
index fbffe73..7313388 100644 (file)
@@ -24,7 +24,9 @@
  */
 
 #include "config.h"
+#include "FloatingState.h"
 #include "FormattingContext.h"
+#include "FormattingState.h"
 
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
@@ -53,10 +55,12 @@ static LayoutUnit contentHeightForFormattingContextRoot(LayoutContext& layoutCon
 
     auto* firstDisplayBox = layoutContext.displayBoxForLayoutBox(*formattingRootContainer.firstInFlowChild());
     auto* lastDisplayBox = layoutContext.displayBoxForLayoutBox(*formattingRootContainer.lastInFlowChild());
+    auto floatsBottom = layoutContext.establishedFormattingState(layoutBox).floatingState().bottom(layoutBox);
 
     auto top = firstDisplayBox->marginBox().top();
     auto bottom = lastDisplayBox->marginBox().bottom();
-    // FIXME: add floating support.
+    if (floatsBottom)
+        bottom = std::max(*floatsBottom, bottom);
     auto computedHeight = bottom - top;
     LOG_WITH_STREAM(FormattingContextLayout, stream << "[Height] -> content height for formatting context root -> height(" << computedHeight << "px) layoutBox("<< &layoutBox << ")");
     return computedHeight;