Changeset 200953 in webkit
- Timestamp:
- May 16, 2016, 11:44:02 AM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r200945 r200953 1 2016-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 1 29 2016-05-16 Brent Fulgham <bfulgham@apple.com> 2 30 -
trunk/Source/WebCore/dom/Element.cpp
r200934 r200953 977 977 978 978 // This renderer may have positioned descendants whose containing block is some ancestor. 979 if (auto containingBlock = containingBlockForAbsolutePosition(&renderer)) {979 if (auto containingBlock = renderer.containingBlockForAbsolutePosition()) { 980 980 if (auto positionedObjects = containingBlock->positionedObjects()) { 981 981 for (RenderBox* it : *positionedObjects) { -
trunk/Source/WebCore/rendering/LogicalSelectionOffsetCaches.h
r198701 r200953 89 89 ASSERT(rootBlock.isSelectionRoot()); 90 90 #endif 91 auto parent = rootBlock.parent();92 93 91 // 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); 97 95 } 98 96 -
trunk/Source/WebCore/rendering/RenderElement.cpp
r200593 r200953 2244 2244 #endif // ENABLE(IOS_TEXT_AUTOSIZING) 2245 2245 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 489 489 } 490 490 491 RenderBlock* containingBlockForFixedPosition(const RenderElement*);492 RenderBlock* containingBlockForAbsolutePosition(const RenderElement*);493 RenderBlock* containingBlockForObjectInFlow(const RenderElement*);494 491 } // namespace WebCore 495 492 -
trunk/Source/WebCore/rendering/RenderInline.cpp
r200671 r200953 172 172 if (canContainAbsolutelyPositionedObjects() && newStyle.position() == StaticPosition) { 173 173 // RenderInlines forward their absolute positioned descendants to their (non-anonymous) containing block. 174 auto* container = containingBlockForAbsolutePosition( this);174 auto* container = containingBlockForAbsolutePosition(); 175 175 if (container && !container->canContainAbsolutelyPositionedObjects()) 176 176 container->removePositionedObjects(nullptr, NewContainingBlock); -
trunk/Source/WebCore/rendering/RenderLineBreak.cpp
r200567 r200953 242 242 } 243 243 244 auto* containingBlock = containingBlockForObjectInFlow( this);244 auto* containingBlock = containingBlockForObjectInFlow(); 245 245 // Map rect, extended left to leftOffset, and right to rightOffset, through transforms to get minX and maxX. 246 246 LogicalSelectionOffsetCaches cache(*containingBlock); -
trunk/Source/WebCore/rendering/RenderObject.cpp
r200781 r200953 623 623 RenderBlock* RenderObject::containingBlock() const 624 624 { 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 626 635 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 646 RenderBlock* 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 656 RenderBlock* 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 677 RenderBlock* 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); 638 683 } 639 684 -
trunk/Source/WebCore/rendering/RenderObject.h
r200593 r200953 648 648 // returns the containing block level element for this element. 649 649 RenderBlock* containingBlock() const; 650 RenderBlock* containingBlockForFixedPosition() const; 651 RenderBlock* containingBlockForAbsolutePosition() const; 652 RenderBlock* containingBlockForObjectInFlow() const; 650 653 651 654 // 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.