⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 246479 in webkit


Ignore:
Timestamp:
Jun 16, 2019, 12:33:18 PM (7 years ago)
Author:
Alan Bujtas
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:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r246478 r246479  
     12019-06-16  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC] Add Layout::Box::isContainingBlockDescendantOf
     4        https://bugs.webkit.org/show_bug.cgi?id=198888
     5        <rdar://problem/51776466>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        Box::isDescendantOf indicates simple ancestor - descendant relationship, while
     10        isContainingBlockDescendantOf checks the containing block chain.
     11
     12        * layout/FormattingContext.cpp:
     13        (WebCore::Layout::mapHorizontalPositionToAncestor):
     14        (WebCore::Layout::FormattingContext::mapBoxToAncestor):
     15        (WebCore::Layout::FormattingContext::mapTopToAncestor):
     16        (WebCore::Layout::FormattingContext::mapPointToAncestor):
     17        * layout/floats/FloatingState.h:
     18        (WebCore::Layout::FloatingState::FloatItem::isDescendantOfFormattingRoot const):
     19        * layout/layouttree/LayoutBox.cpp:
     20        (WebCore::Layout::Box::isDescendantOf const):
     21        (WebCore::Layout::Box::isContainingBlockDescendantOf const):
     22        * layout/layouttree/LayoutBox.h:
     23
    1242019-06-16  Zalan Bujtas  <zalan@apple.com>
    225
  • trunk/Source/WebCore/layout/FormattingContext.cpp

    r246468 r246479  
    171171    if (&containingBlock == &ancestor)
    172172        return horizontalPosition;
    173     ASSERT(containingBlock.isDescendantOf(ancestor));
     173    ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor));
    174174    for (auto* container = &containingBlock; container && container != &ancestor; container = container->containingBlock())
    175175        horizontalPosition += layoutState.displayBoxForLayoutBox(*container).left();
     
    192192Display::Box FormattingContext::mapBoxToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)
    193193{
    194     ASSERT(layoutBox.isDescendantOf(ancestor));
    195 
     194    ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor));
    196195    auto& displayBox = layoutState.displayBoxForLayoutBox(layoutBox);
    197196    auto topLeft = displayBox.topLeft();
    198 
    199     auto* containingBlock = layoutBox.containingBlock();
    200     for (; containingBlock && containingBlock != &ancestor; containingBlock = containingBlock->containingBlock())
     197    for (auto* containingBlock = layoutBox.containingBlock(); containingBlock && containingBlock != &ancestor; containingBlock = containingBlock->containingBlock())
    201198        topLeft.moveBy(layoutState.displayBoxForLayoutBox(*containingBlock).topLeft());
    202 
    203     if (!containingBlock) {
    204         ASSERT_NOT_REACHED();
    205         return Display::Box(displayBox);
    206     }
    207199
    208200    auto mappedDisplayBox = Display::Box(displayBox);
     
    213205LayoutUnit FormattingContext::mapTopToAncestor(const LayoutState& layoutState, const Box& layoutBox, const Container& ancestor)
    214206{
    215     ASSERT(layoutBox.isDescendantOf(ancestor));
     207    ASSERT(layoutBox.isContainingBlockDescendantOf(ancestor));
    216208    auto top = layoutState.displayBoxForLayoutBox(layoutBox).top();
    217     auto* container = layoutBox.containingBlock();
    218     for (; container && container != &ancestor; container = container->containingBlock())
     209    for (auto* container = layoutBox.containingBlock(); container && container != &ancestor; container = container->containingBlock())
    219210        top += layoutState.displayBoxForLayoutBox(*container).top();
    220211    return top;
     
    223214Point FormattingContext::mapPointToAncestor(const LayoutState& layoutState, Point position, const Container& containingBlock, const Container& ancestor)
    224215{
     216    if (&containingBlock == &ancestor)
     217        return position;
     218    ASSERT(containingBlock.isContainingBlockDescendantOf(ancestor));
    225219    auto mappedPosition = position;
    226     auto* container = &containingBlock;
    227     for (; container && container != &ancestor; container = container->containingBlock())
     220    for (auto* container = &containingBlock; container && container != &ancestor; container = container->containingBlock())
    228221        mappedPosition.moveBy(layoutState.displayBoxForLayoutBox(*container).topLeft());
    229 
    230     if (!container) {
    231         ASSERT_NOT_REACHED();
    232         return position;
    233     }
    234 
    235222    return mappedPosition;
    236223}
  • trunk/Source/WebCore/layout/floats/FloatingState.h

    r245776 r246479  
    122122    if (!is<Container>(formattingContextRoot))
    123123        return false;
    124     return m_layoutBox->isDescendantOf(downcast<Container>(formattingContextRoot));
     124    return m_layoutBox->isContainingBlockDescendantOf(downcast<Container>(formattingContextRoot));
    125125}
    126126
  • trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp

    r246468 r246479  
    198198}
    199199
    200 bool Box::isDescendantOf(const Container& container) const
     200bool Box::isDescendantOf(const Container& ancestorCandidate) const
     201{
     202    for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
     203        if (ancestor == &ancestorCandidate)
     204            return true;
     205    }
     206    return false;
     207}
     208
     209bool Box::isContainingBlockDescendantOf(const Container& ancestorCandidate) const
    201210{
    202211    for (auto* ancestor = containingBlock(); ancestor; ancestor = ancestor->containingBlock()) {
    203         if (ancestor == &container)
     212        if (ancestor == &ancestorCandidate)
    204213            return true;
    205214    }
  • trunk/Source/WebCore/layout/layouttree/LayoutBox.h

    r246468 r246479  
    102102
    103103    bool isDescendantOf(const Container&) const;
     104    bool isContainingBlockDescendantOf(const Container&) const;
    104105
    105106    bool isAnonymous() const { return !m_elementAttributes; }
Note: See TracChangeset for help on using the changeset viewer.