Title: [246479] trunk/Source/WebCore
Revision
246479
Author
[email protected]
Date
2019-06-16 12:33:18 -0700 (Sun, 16 Jun 2019)

Log Message

[LFC] Add Layout::Box::isContainingBlockDescendantOf
https://bugs.webkit.org/show_bug.cgi?id=198888
<rdar://problem/51776466>

Reviewed by Antti Koivisto.

Box::isDescendantOf indicates simple ancestor - descendant relationship, while
isContainingBlockDescendantOf checks the containing block chain.

* layout/FormattingContext.cpp:
(WebCore::Layout::mapHorizontalPositionToAncestor):
(WebCore::Layout::FormattingContext::mapBoxToAncestor):
(WebCore::Layout::FormattingContext::mapTopToAncestor):
(WebCore::Layout::FormattingContext::mapPointToAncestor):
* layout/floats/FloatingState.h:
(WebCore::Layout::FloatingState::FloatItem::isDescendantOfFormattingRoot const):
* layout/layouttree/LayoutBox.cpp:
(WebCore::Layout::Box::isDescendantOf const):
(WebCore::Layout::Box::isContainingBlockDescendantOf const):
* layout/layouttree/LayoutBox.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246478 => 246479)


--- trunk/Source/WebCore/ChangeLog	2019-06-16 19:32:52 UTC (rev 246478)
+++ trunk/Source/WebCore/ChangeLog	2019-06-16 19:33:18 UTC (rev 246479)
@@ -1,5 +1,28 @@
 2019-06-16  Zalan Bujtas  <[email protected]>
 
+        [LFC] Add Layout::Box::isContainingBlockDescendantOf
+        https://bugs.webkit.org/show_bug.cgi?id=198888
+        <rdar://problem/51776466>
+
+        Reviewed by Antti Koivisto.
+
+        Box::isDescendantOf indicates simple ancestor - descendant relationship, while
+        isContainingBlockDescendantOf checks the containing block chain.
+
+        * layout/FormattingContext.cpp:
+        (WebCore::Layout::mapHorizontalPositionToAncestor):
+        (WebCore::Layout::FormattingContext::mapBoxToAncestor):
+        (WebCore::Layout::FormattingContext::mapTopToAncestor):
+        (WebCore::Layout::FormattingContext::mapPointToAncestor):
+        * layout/floats/FloatingState.h:
+        (WebCore::Layout::FloatingState::FloatItem::isDescendantOfFormattingRoot const):
+        * layout/layouttree/LayoutBox.cpp:
+        (WebCore::Layout::Box::isDescendantOf const):
+        (WebCore::Layout::Box::isContainingBlockDescendantOf const):
+        * layout/layouttree/LayoutBox.h:
+
+2019-06-16  Zalan Bujtas  <[email protected]>
+
         [LFC][IFC] Remove Line::Content::isVisuallyEmpty
         https://bugs.webkit.org/show_bug.cgi?id=198892
         <rdar://problem/51780345>

Modified: trunk/Source/WebCore/layout/FormattingContext.cpp (246478 => 246479)


--- trunk/Source/WebCore/layout/FormattingContext.cpp	2019-06-16 19:32:52 UTC (rev 246478)
+++ trunk/Source/WebCore/layout/FormattingContext.cpp	2019-06-16 19:33:18 UTC (rev 246479)
@@ -170,7 +170,7 @@
     // "horizontalPosition" is in the coordinate system of the "containingBlock". -> map from containingBlock to ancestor.
     if (&containingBlock == &ancestor)
         return horizontalPosition;
-    ASSERT(containingBlock.isDescendantOf(ancestor));
+    ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor));
     for (auto* container = &containingBlock; container && container != &ancestor; container = container->containingBlock())
         horizontalPosition += layoutState.displayBoxForLayoutBox(*container).left();
     return horizontalPosition;
@@ -191,20 +191,12 @@
 
 Display::Box FormattingContext::mapBoxToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)
 {
-    ASSERT(layoutBox.isDescendantOf(ancestor));
-
+    ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor));
     auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox);
     auto topLeft = displayBox.topLeft();
-
-    auto* containingBlock = layoutBox.containingBlock();
-    for (; containingBlock && containingBlock != &ancestor; containingBlock = containingBlock->containingBlock())
+    for (auto* containingBlock = layoutBox.containingBlock(); containingBlock && containingBlock != &ancestor; containingBlock = containingBlock->containingBlock())
         topLeft.moveBy(layoutState.displayBoxForLayoutBox(*containingBlock).topLeft());
 
-    if (!containingBlock) {
-        ASSERT_NOT_REACHED();
-        return Display::Box(displayBox);
-    }
-
     auto mappedDisplayBox = Display::Box(displayBox);
     mappedDisplayBox.setTopLeft(topLeft);
     return mappedDisplayBox;
@@ -212,10 +204,9 @@
 
 LayoutUnit FormattingContext::mapTopToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)
 {
-    ASSERT(layoutBox.isDescendantOf(ancestor));
+    ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor));
     auto top = layoutState.displayBoxForLayoutBox(layoutBox).top();
-    auto* container = layoutBox.containingBlock();
-    for (; container && container != &ancestor; container = container->containingBlock())
+    for (auto* container = layoutBox.containingBlock(); container && container != &ancestor; container = container->containingBlock())
         top += layoutState.displayBoxForLayoutBox(*container).top();
     return top;
 }
@@ -222,16 +213,12 @@
 
 Point FormattingContext::mapPointToAncestor(const LayoutState& layoutState, Point position, const Container& containingBlock, const Container& ancestor)
 {
+    if (&containingBlock == &ancestor)
+        return position;
+    ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor));
     auto mappedPosition = position;
-    auto* container = &containingBlock;
-    for (; container && container != &ancestor; container = container->containingBlock())
+    for (auto* container = &containingBlock; container && container != &ancestor; container = container->containingBlock())
         mappedPosition.moveBy(layoutState.displayBoxForLayoutBox(*container).topLeft());
-
-    if (!container) {
-        ASSERT_NOT_REACHED();
-        return position;
-    }
-
     return mappedPosition;
 }
 

Modified: trunk/Source/WebCore/layout/floats/FloatingState.h (246478 => 246479)


--- trunk/Source/WebCore/layout/floats/FloatingState.h	2019-06-16 19:32:52 UTC (rev 246478)
+++ trunk/Source/WebCore/layout/floats/FloatingState.h	2019-06-16 19:33:18 UTC (rev 246479)
@@ -121,7 +121,7 @@
     ASSERT(formattingContextRoot.establishesFormattingContext());
     if (!is<Container>(formattingContextRoot))
         return false;
-    return m_layoutBox->isDescendantOf(downcast<Container>(formattingContextRoot));
+    return m_layoutBox->isContainingBlockDescendantOf(downcast<Container>(formattingContextRoot));
 }
 
 }

Modified: trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp (246478 => 246479)


--- trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp	2019-06-16 19:32:52 UTC (rev 246478)
+++ trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp	2019-06-16 19:33:18 UTC (rev 246479)
@@ -197,10 +197,19 @@
     return *parent;
 }
 
-bool Box::isDescendantOf(const Container& container) const
+bool Box::isDescendantOf(const Container& ancestorCandidate) const
+{
+    for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
+        if (ancestor == &ancestorCandidate)
+            return true;
+    }
+    return false;
+}
+
+bool Box::isContainingBlockDescendantOf(const Container& ancestorCandidate) const
 { 
     for (auto* ancestor = containingBlock(); ancestor; ancestor = ancestor->containingBlock()) {
-        if (ancestor == &container)
+        if (ancestor == &ancestorCandidate)
             return true;
     }
     return false;

Modified: trunk/Source/WebCore/layout/layouttree/LayoutBox.h (246478 => 246479)


--- trunk/Source/WebCore/layout/layouttree/LayoutBox.h	2019-06-16 19:32:52 UTC (rev 246478)
+++ trunk/Source/WebCore/layout/layouttree/LayoutBox.h	2019-06-16 19:33:18 UTC (rev 246479)
@@ -101,6 +101,7 @@
     const Container& initialContainingBlock() const;
 
     bool isDescendantOf(const Container&) const;
+    bool isContainingBlockDescendantOf(const Container&) const;
 
     bool isAnonymous() const { return !m_elementAttributes; }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to