Changeset 200953 in webkit


Ignore:
Timestamp:
May 16, 2016, 11:44:02 AM (9 years ago)
Author:
Alan Bujtas
Message:

containingBlockFor*Position functions should take the renderer instead of the parent.
https://bugs.webkit.org/show_bug.cgi?id=157659

Reviewed by Simon Fraser.

containingBlockForFixedPosition, containingBlockForAbsolutePosition and containingBlockForObjectInFlow functions
expect the renderer's parent to be passed in (unless it is a RenderInline!). It is rather misleading and highly error-prone.
We should call them with the renderer itself instead.

  • dom/Element.cpp:

(WebCore::layoutOverflowRectContainsAllDescendants): This expects ancestor containing block.

  • rendering/LogicalSelectionOffsetCaches.h:

(WebCore::LogicalSelectionOffsetCaches::LogicalSelectionOffsetCaches):

  • rendering/RenderElement.cpp:

(WebCore::containingBlockForFixedPosition):
(WebCore::containingBlockForAbsolutePosition):
(WebCore::containingBlockForObjectInFlow):

  • rendering/RenderElement.h:
  • rendering/RenderInline.cpp:

(WebCore::RenderInline::styleWillChange):

  • rendering/RenderLineBreak.cpp:

(WebCore::RenderLineBreak::collectSelectionRects): Not a behaviour change.

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::containingBlock): RenderScrollbarPart renderer now returns
the containing block based on its owning renderer's style.

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r200945 r200953  
     12016-05-16  Zalan Bujtas  <zalan@apple.com>
     2
     3        containingBlockFor*Position functions should take the renderer instead of the parent.
     4        https://bugs.webkit.org/show_bug.cgi?id=157659
     5
     6        Reviewed by Simon Fraser.
     7
     8        containingBlockForFixedPosition, containingBlockForAbsolutePosition and containingBlockForObjectInFlow functions
     9        expect the renderer's parent to be passed in (unless it is a RenderInline!). It is rather misleading and highly error-prone.
     10        We should call them with the renderer itself instead.
     11
     12        * dom/Element.cpp:
     13        (WebCore::layoutOverflowRectContainsAllDescendants): This expects ancestor containing block.
     14        * rendering/LogicalSelectionOffsetCaches.h:
     15        (WebCore::LogicalSelectionOffsetCaches::LogicalSelectionOffsetCaches):
     16        * rendering/RenderElement.cpp:
     17        (WebCore::containingBlockForFixedPosition):
     18        (WebCore::containingBlockForAbsolutePosition):
     19        (WebCore::containingBlockForObjectInFlow):
     20        * rendering/RenderElement.h:
     21        * rendering/RenderInline.cpp:
     22        (WebCore::RenderInline::styleWillChange):
     23        * rendering/RenderLineBreak.cpp:
     24        (WebCore::RenderLineBreak::collectSelectionRects): Not a behaviour change.
     25        * rendering/RenderObject.cpp:
     26        (WebCore::RenderObject::containingBlock): RenderScrollbarPart renderer now returns
     27        the containing block based on its owning renderer's style.
     28
    1292016-05-16  Brent Fulgham  <bfulgham@apple.com>
    230
  • trunk/Source/WebCore/dom/Element.cpp

    r200934 r200953  
    977977
    978978    // This renderer may have positioned descendants whose containing block is some ancestor.
    979     if (auto containingBlock = containingBlockForAbsolutePosition(&renderer)) {
     979    if (auto containingBlock = renderer.containingBlockForAbsolutePosition()) {
    980980        if (auto positionedObjects = containingBlock->positionedObjects()) {
    981981            for (RenderBox* it : *positionedObjects) {
  • trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h

    r198701 r200953  
    8989        ASSERT(rootBlock.isSelectionRoot());
    9090#endif
    91         auto parent = rootBlock.parent();
    92 
    9391        // LogicalSelectionOffsetCaches should not be used on an orphaned tree.
    94         m_containingBlockForFixedPosition.setBlock(containingBlockForFixedPosition(parent), nullptr);
    95         m_containingBlockForAbsolutePosition.setBlock(containingBlockForAbsolutePosition(parent), nullptr);
    96         m_containingBlockForInflowPosition.setBlock(containingBlockForObjectInFlow(parent), nullptr);
     92        m_containingBlockForFixedPosition.setBlock(rootBlock.containingBlockForFixedPosition(), nullptr);
     93        m_containingBlockForAbsolutePosition.setBlock(rootBlock.containingBlockForAbsolutePosition(), nullptr);
     94        m_containingBlockForInflowPosition.setBlock(rootBlock.containingBlockForObjectInFlow(), nullptr);
    9795    }
    9896
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r200593 r200953  
    22442244#endif // ENABLE(IOS_TEXT_AUTOSIZING)
    22452245
    2246 RenderBlock* containingBlockForFixedPosition(const RenderElement* element)
    2247 {
    2248     const auto* object = element;
    2249     while (object && !object->canContainFixedPositionObjects())
    2250         object = object->parent();
    2251 
    2252     ASSERT(!object || !object->isAnonymousBlock());
    2253     return const_cast<RenderBlock*>(downcast<RenderBlock>(object));
    2254 }
    2255 
    2256 RenderBlock* containingBlockForAbsolutePosition(const RenderElement* element)
    2257 {
    2258     const auto* object = element;
    2259     while (object && !object->canContainAbsolutelyPositionedObjects())
    2260         object = object->parent();
    2261 
    2262     // For a relatively positioned inline, return its nearest non-anonymous containing block,
    2263     // not the inline itself, to avoid having a positioned objects list in all RenderInlines
    2264     // and use RenderBlock* as RenderElement::containingBlock's return type.
    2265     // Use RenderBlock::container() to obtain the inline.
    2266     if (object && !is<RenderBlock>(*object))
    2267         object = object->containingBlock();
    2268 
    2269     while (object && object->isAnonymousBlock())
    2270         object = object->containingBlock();
    2271 
    2272     return const_cast<RenderBlock*>(downcast<RenderBlock>(object));
    2273 }
    2274 
    2275 RenderBlock* containingBlockForObjectInFlow(const RenderElement* element)
    2276 {
    2277     const auto* object = element;
    2278     while (object && ((object->isInline() && !object->isReplaced()) || !object->isRenderBlock()))
    2279         object = object->parent();
    2280     return const_cast<RenderBlock*>(downcast<RenderBlock>(object));
    2281 }
    2282 
    2283 }
     2246}
  • trunk/Source/WebCore/rendering/RenderElement.h

    r200534 r200953  
    489489}
    490490
    491 RenderBlock* containingBlockForFixedPosition(const RenderElement*);
    492 RenderBlock* containingBlockForAbsolutePosition(const RenderElement*);
    493 RenderBlock* containingBlockForObjectInFlow(const RenderElement*);
    494491} // namespace WebCore
    495492
  • trunk/Source/WebCore/rendering/RenderInline.cpp

    r200671 r200953  
    172172    if (canContainAbsolutelyPositionedObjects() && newStyle.position() == StaticPosition) {
    173173        // RenderInlines forward their absolute positioned descendants to their (non-anonymous) containing block.
    174         auto* container = containingBlockForAbsolutePosition(this);
     174        auto* container = containingBlockForAbsolutePosition();
    175175        if (container && !container->canContainAbsolutelyPositionedObjects())
    176176            container->removePositionedObjects(nullptr, NewContainingBlock);
  • trunk/Source/WebCore/rendering/RenderLineBreak.cpp

    r200567 r200953  
    242242    }
    243243
    244     auto* containingBlock = containingBlockForObjectInFlow(this);
     244    auto* containingBlock = containingBlockForObjectInFlow();
    245245    // Map rect, extended left to leftOffset, and right to rightOffset, through transforms to get minX and maxX.
    246246    LogicalSelectionOffsetCaches cache(*containingBlock);
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r200781 r200953  
    623623RenderBlock* RenderObject::containingBlock() const
    624624{
    625     auto* parent = this->parent();
     625    auto containingBlockForRenderer = [](const RenderObject& renderer)
     626    {
     627        auto& style = renderer.style();
     628        if (style.position() == AbsolutePosition)
     629            return renderer.containingBlockForAbsolutePosition();
     630        if (style.position() == FixedPosition)
     631            return renderer.containingBlockForFixedPosition();
     632        return renderer.containingBlockForObjectInFlow();
     633    };
     634
    626635    if (is<RenderText>(*this))
    627         return containingBlockForObjectInFlow(parent);
    628 
    629     if (!parent && is<RenderScrollbarPart>(*this))
    630         parent = downcast<RenderScrollbarPart>(*this).rendererOwningScrollbar();
    631 
    632     auto& style = this->style();
    633     if (style.position() == AbsolutePosition)
    634         return containingBlockForAbsolutePosition(parent);
    635     if (style.position() == FixedPosition)
    636         return containingBlockForFixedPosition(parent);
    637     return containingBlockForObjectInFlow(parent);
     636        return containingBlockForObjectInFlow();
     637
     638    if (!parent() && is<RenderScrollbarPart>(*this)) {
     639        if (auto* renderer = downcast<RenderScrollbarPart>(*this).rendererOwningScrollbar())
     640            return containingBlockForRenderer(*renderer);
     641        return nullptr;
     642    }
     643    return containingBlockForRenderer(*this);
     644}
     645
     646RenderBlock* RenderObject::containingBlockForFixedPosition() const
     647{
     648    auto* renderer = parent();
     649    while (renderer && !renderer->canContainFixedPositionObjects())
     650        renderer = renderer->parent();
     651
     652    ASSERT(!renderer || !renderer->isAnonymousBlock());
     653    return downcast<RenderBlock>(renderer);
     654}
     655
     656RenderBlock* RenderObject::containingBlockForAbsolutePosition() const
     657{
     658    // RenderInlines forward their absolute positioned descendants to the containing block, so
     659    // we need to start searching from 'this' and not from 'parent()'.
     660    auto* renderer = isRenderInline() ? const_cast<RenderElement*>(downcast<RenderElement>(this)) : parent();
     661    while (renderer && !renderer->canContainAbsolutelyPositionedObjects())
     662        renderer = renderer->parent();
     663
     664    // For a relatively positioned inline, return its nearest non-anonymous containing block,
     665    // not the inline itself, to avoid having a positioned objects list in all RenderInlines
     666    // and use RenderBlock* as RenderElement::containingBlock's return type.
     667    // Use RenderBlock::container() to obtain the inline.
     668    if (renderer && !is<RenderBlock>(*renderer))
     669        renderer = renderer->containingBlock();
     670
     671    while (renderer && renderer->isAnonymousBlock())
     672        renderer = renderer->containingBlock();
     673
     674    return downcast<RenderBlock>(renderer);
     675}
     676
     677RenderBlock* RenderObject::containingBlockForObjectInFlow() const
     678{
     679    auto* renderer = parent();
     680    while (renderer && ((renderer->isInline() && !renderer->isReplaced()) || !renderer->isRenderBlock()))
     681        renderer = renderer->parent();
     682    return downcast<RenderBlock>(renderer);
    638683}
    639684
  • trunk/Source/WebCore/rendering/RenderObject.h

    r200593 r200953  
    648648    // returns the containing block level element for this element.
    649649    RenderBlock* containingBlock() const;
     650    RenderBlock* containingBlockForFixedPosition() const;
     651    RenderBlock* containingBlockForAbsolutePosition() const;
     652    RenderBlock* containingBlockForObjectInFlow() const;
    650653
    651654    // Convert the given local point to absolute coordinates. If MapCoordinatesFlags includes UseTransforms, take transforms into account.
Note: See TracChangeset for help on using the changeset viewer.