Changeset 258904 in webkit
- Timestamp:
- Mar 23, 2020 9:09:30 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r258899 r258904 1 2020-03-23 Zalan Bujtas <zalan@apple.com> 2 3 [LFC] Layout::Box::initialContainingBlock() should return const InitialContainingBlock& 4 https://bugs.webkit.org/show_bug.cgi?id=209406 5 <rdar://problem/60749715> 6 7 Reviewed by Antti Koivisto. 8 9 Use is<InitialContainingBlock> where applicable. 10 11 * layout/FormattingContext.cpp: 12 (WebCore::Layout::FormattingContext::geometryForBox const): 13 (WebCore::Layout::FormattingContext::collectOutOfFlowDescendantsIfNeeded): 14 * layout/FormattingContextQuirks.cpp: 15 (WebCore::Layout::FormattingContext::Quirks::heightValueOfNearestContainingBlockWithFixedHeight): 16 * layout/blockformatting/BlockFormattingContextQuirks.cpp: 17 * layout/displaytree/DisplayPainter.cpp: 18 (WebCore::Display::absoluteDisplayBox): 19 * layout/invalidation/InvalidationState.cpp: 20 (WebCore::Layout::InvalidationState::markNeedsUpdate): 21 * layout/layouttree/LayoutBox.cpp: 22 (WebCore::Layout::Box::establishesBlockFormattingContext const): 23 (WebCore::Layout::Box::containingBlock const): 24 (WebCore::Layout::Box::formattingContextRoot const): 25 (WebCore::Layout::Box::initialContainingBlock const): 26 (WebCore::Layout::Box::isInFormattingContextOf const): 27 (WebCore::Layout::Box::isOverflowVisible const): 28 * layout/layouttree/LayoutBox.h: 29 (WebCore::Layout::Box::isInitialContainingBlock const): 30 (WebCore::Layout::Box::isInlineTextBox const): 31 (WebCore::Layout::Box::isLineBreakBox const): 32 (WebCore::Layout::Box::isReplacedBox const): 33 * layout/layouttree/LayoutInitialContainingBlock.cpp: 34 (WebCore::Layout::InitialContainingBlock::InitialContainingBlock): 35 * layout/layouttree/LayoutInlineTextBox.cpp: 36 (WebCore::Layout::InlineTextBox::InlineTextBox): 37 * layout/layouttree/LayoutLineBreakBox.cpp: 38 (WebCore::Layout::LineBreakBox::LineBreakBox): 39 * layout/layouttree/LayoutReplacedBox.cpp: 40 (WebCore::Layout::ReplacedBox::ReplacedBox): 41 * layout/layouttree/LayoutTreeBuilder.cpp: 42 (WebCore::Layout::outputLayoutBox): 43 1 44 2020-03-23 Justin Fan <justin_fan@apple.com> 2 45 -
trunk/Source/WebCore/layout/FormattingContext.cpp
r258864 r258904 36 36 #include "LayoutContext.h" 37 37 #include "LayoutDescendantIterator.h" 38 #include "LayoutInitialContainingBlock.h" 38 39 #include "LayoutReplacedBox.h" 39 40 #include "LayoutState.h" … … 193 194 #if ASSERT_ENABLED 194 195 auto isOkToAccessDisplayBox = [&] { 195 if (! layoutBox.isInitialContainingBlock() && &layoutBox.formattingContextRoot() == &root()) {196 if (!is<InitialContainingBlock>(layoutBox) && &layoutBox.formattingContextRoot() == &root()) { 196 197 // This is the non-escape case of accessing a box's geometry information within the same formatting context. 197 198 return true; … … 205 206 if (*escapeReason == EscapeReason::DocumentBoxStrechesToViewportQuirk) { 206 207 ASSERT(layoutState().inQuirksMode()); 207 return layoutBox.isInitialContainingBlock();208 return is<InitialContainingBlock>(layoutBox); 208 209 } 209 210 210 211 if (*escapeReason == EscapeReason::BodyStrechesToViewportQuirk) { 211 212 ASSERT(layoutState().inQuirksMode()); 212 return layoutBox.isInitialContainingBlock() || layoutBox.isDocumentBox();213 return is<InitialContainingBlock>(layoutBox) || layoutBox.isDocumentBox(); 213 214 214 215 } 215 216 216 217 if (*escapeReason == EscapeReason::StrokeOverflowNeedsViewportGeometry) 217 return layoutBox.isInitialContainingBlock();218 return is<InitialContainingBlock>(layoutBox); 218 219 219 220 if (*escapeReason == EscapeReason::NeedsGeometryFromEstablishedFormattingContext) { … … 244 245 // Find the first containing block with fixed height quirk. See Quirks::heightValueOfNearestContainingBlockWithFixedHeight. 245 246 // This is only to check if the targetFormattingRoot is an ancestor formatting root. 246 if ( layoutBox.isInitialContainingBlock())247 if (is<InitialContainingBlock>(layoutBox)) 247 248 return true; 248 249 auto& targetFormattingRoot = layoutBox.formattingContextRoot(); … … 252 253 return true; 253 254 ancestorFormattingContextRoot = &ancestorFormattingContextRoot->formattingContextRoot(); 254 if ( ancestorFormattingContextRoot->isInitialContainingBlock())255 if (is<InitialContainingBlock>(*ancestorFormattingContextRoot)) 255 256 return true; 256 257 } … … 281 282 if (!root.hasChild()) 282 283 return; 283 if (!root.isPositioned() && ! root.isInitialContainingBlock())284 if (!root.isPositioned() && !is<InitialContainingBlock>(root)) 284 285 return; 285 286 // Collect the out-of-flow descendants at the formatting root level (as opposed to at the containing block level, though they might be the same). -
trunk/Source/WebCore/layout/FormattingContextQuirks.cpp
r258864 r258904 31 31 #include "DisplayBox.h" 32 32 #include "LayoutBox.h" 33 #include "LayoutInitialContainingBlock.h" 33 34 34 35 namespace WebCore { … … 60 61 } 61 62 62 if ( containingBlock->isInitialContainingBlock())63 if (is<InitialContainingBlock>(*containingBlock)) 63 64 break; 64 65 containingBlock = &containingBlock->containingBlock(); -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextQuirks.cpp
r258864 r258904 33 33 #include "LayoutBox.h" 34 34 #include "LayoutContainerBox.h" 35 #include "LayoutInitialContainingBlock.h" 35 36 #include "LayoutState.h" 36 37 -
trunk/Source/WebCore/layout/displaytree/DisplayPainter.cpp
r258864 r258904 37 37 #include "IntRect.h" 38 38 #include "LayoutContainerBox.h" 39 #include "LayoutInitialContainingBlock.h" 39 40 #include "LayoutState.h" 40 41 #include "RenderStyle.h" … … 146 147 if (!layoutState.hasDisplayBox(layoutBox)) 147 148 return { }; 148 if ( layoutBox.isInitialContainingBlock())149 if (is<Layout::InitialContainingBlock>(layoutBox)) 149 150 return layoutState.displayBoxForLayoutBox(layoutBox); 150 151 151 152 auto absoluteBox = Box { layoutState.displayBoxForLayoutBox(layoutBox) }; 152 for (auto* containingBlock = &layoutBox.containingBlock(); ! containingBlock->isInitialContainingBlock(); containingBlock = &containingBlock->containingBlock())153 for (auto* containingBlock = &layoutBox.containingBlock(); !is<Layout::InitialContainingBlock>(*containingBlock); containingBlock = &containingBlock->containingBlock()) 153 154 absoluteBox.moveBy(layoutState.displayBoxForLayoutBox(*containingBlock).topLeft()); 154 155 return absoluteBox; -
trunk/Source/WebCore/layout/invalidation/InvalidationState.cpp
r258864 r258904 43 43 { 44 44 // We never lay out the initial containing block. It always has pre-determined geometry. 45 ASSERT(! layoutBox.isInitialContainingBlock());45 ASSERT(!is<InitialContainingBlock>(layoutBox)); 46 46 // FIXME: This is just a placeholder implementation. 47 47 m_formattingContextRoots.add(&layoutBox.formattingContextRoot()); -
trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp
r258864 r258904 31 31 #include "DisplayBox.h" 32 32 #include "LayoutContainerBox.h" 33 #include "LayoutInitialContainingBlock.h" 33 34 #include "LayoutPhase.h" 34 35 #include "LayoutState.h" … … 71 72 { 72 73 // ICB always creates a new (inital) block formatting context. 73 if (is InitialContainingBlock())74 if (is<InitialContainingBlock>(*this)) 74 75 return true; 75 76 … … 184 185 ASSERT(!Phase::isInTreeBuilding()); 185 186 // If we ever end up here with the ICB, we must be doing something not-so-great. 186 RELEASE_ASSERT(!is InitialContainingBlock());187 RELEASE_ASSERT(!is<InitialContainingBlock>(*this)); 187 188 // The containing block in which the root element lives is a rectangle called the initial containing block. 188 189 // For other elements, if the element's position is 'relative' or 'static', the containing block is formed by the … … 193 194 if (!isPositioned() || isInFlowPositioned()) { 194 195 auto* ancestor = parent(); 195 for (; ! ancestor->isInitialContainingBlock(); ancestor = ancestor->parent()) {196 for (; !is<InitialContainingBlock>(*ancestor); ancestor = ancestor->parent()) { 196 197 if (ancestor->isBlockContainerBox() || ancestor->establishesFormattingContext()) 197 198 return *ancestor; … … 202 203 if (isFixedPositioned()) { 203 204 auto* ancestor = parent(); 204 for (; ! ancestor->isInitialContainingBlock(); ancestor = ancestor->parent()) {205 for (; !is<InitialContainingBlock>(*ancestor); ancestor = ancestor->parent()) { 205 206 if (ancestor->style().hasTransform()) 206 207 return *ancestor; … … 211 212 if (isOutOfFlowPositioned()) { 212 213 auto* ancestor = parent(); 213 for (; ! ancestor->isInitialContainingBlock(); ancestor = ancestor->parent()) {214 for (; !is<InitialContainingBlock>(*ancestor); ancestor = ancestor->parent()) { 214 215 if (ancestor->isPositioned() || ancestor->style().hasTransform()) 215 216 return *ancestor; … … 227 228 ASSERT(!Phase::isInTreeBuilding()); 228 229 // We should never need to ask this question on the ICB. 229 ASSERT(!is InitialContainingBlock());230 ASSERT(!is<InitialContainingBlock>(*this)); 230 231 // A box lives in the same formatting context as its containing block unless the containing block establishes a formatting context. 231 232 // However relatively positioned (inflow) inline container lives in the formatting context where its parent lives unless … … 241 242 } 242 243 243 const ContainerBox& Box::initialContainingBlock() const244 { 245 if (is InitialContainingBlock())246 return downcast< ContainerBox>(*this);244 const InitialContainingBlock& Box::initialContainingBlock() const 245 { 246 if (is<InitialContainingBlock>(*this)) 247 return downcast<InitialContainingBlock>(*this); 247 248 248 249 auto* ancestor = parent(); 249 250 for (; ancestor->parent(); ancestor = ancestor->parent()) { } 250 251 251 return *ancestor;252 return downcast<InitialContainingBlock>(*ancestor); 252 253 } 253 254 … … 255 256 { 256 257 ASSERT(formattingContextRoot.establishesFormattingContext()); 257 ASSERT(!is InitialContainingBlock());258 ASSERT(!is<InitialContainingBlock>(*this)); 258 259 auto* ancestor = &containingBlock(); 259 260 while (ancestor) { 260 261 if (ancestor == &formattingContextRoot) 261 262 return true; 262 if ( ancestor->isInitialContainingBlock())263 if (is<InitialContainingBlock>(*ancestor)) 263 264 return false; 264 265 ancestor = &ancestor->containingBlock(); … … 361 362 return true; 362 363 } 363 if (is InitialContainingBlock()) {364 if (is<InitialContainingBlock>(*this)) { 364 365 auto* documentBox = downcast<ContainerBox>(*this).firstChild(); 365 366 if (!documentBox || !documentBox->isDocumentBox() || !is<ContainerBox>(documentBox)) -
trunk/Source/WebCore/layout/layouttree/LayoutBox.h
r258864 r258904 41 41 42 42 class ContainerBox; 43 class InitialContainingBlock; 43 44 class LayoutState; 44 45 class TreeBuilder; … … 62 63 63 64 enum BaseTypeFlag { 64 BoxFlag = 1 << 0,65 InlineTextBox = 1 << 1,66 LineBreakBox = 1 << 2,67 ReplacedBox = 1 << 3,68 InitialContainingBlock = 1 << 4,69 ContainerBoxFlag = 1 << 565 BoxFlag = 1 << 0, 66 InlineTextBoxFlag = 1 << 1, 67 LineBreakBoxFlag = 1 << 2, 68 ReplacedBoxFlag = 1 << 3, 69 InitialContainingBlockFlag = 1 << 4, 70 ContainerBoxFlag = 1 << 5 70 71 }; 71 72 typedef unsigned BaseTypeFlags; … … 97 98 const ContainerBox& containingBlock() const; 98 99 const ContainerBox& formattingContextRoot() const; 99 const ContainerBox& initialContainingBlock() const;100 const InitialContainingBlock& initialContainingBlock() const; 100 101 101 102 bool isInFormattingContextOf(const ContainerBox&) const; … … 110 111 bool isInlineTableBox() const; 111 112 bool isBlockContainerBox() const; 112 bool isInitialContainingBlock() const { return m_baseTypeFlags & InitialContainingBlock ; }113 bool isInitialContainingBlock() const { return m_baseTypeFlags & InitialContainingBlockFlag; } 113 114 114 115 bool isDocumentBox() const { return m_elementAttributes && m_elementAttributes.value().elementType == ElementType::Document; } … … 139 140 140 141 bool isContainerBox() const { return m_baseTypeFlags & ContainerBoxFlag; } 141 bool isInlineTextBox() const { return m_baseTypeFlags & InlineTextBox ; }142 bool isLineBreakBox() const { return m_baseTypeFlags & LineBreakBox ; }143 bool isReplacedBox() const { return m_baseTypeFlags & ReplacedBox ; }142 bool isInlineTextBox() const { return m_baseTypeFlags & InlineTextBoxFlag; } 143 bool isLineBreakBox() const { return m_baseTypeFlags & LineBreakBoxFlag; } 144 bool isReplacedBox() const { return m_baseTypeFlags & ReplacedBoxFlag; } 144 145 145 146 bool isPaddingApplicable() const; -
trunk/Source/WebCore/layout/layouttree/LayoutInitialContainingBlock.cpp
r258864 r258904 38 38 39 39 InitialContainingBlock::InitialContainingBlock(RenderStyle&& style) 40 : ContainerBox({ }, WTFMove(style), Box::InitialContainingBlock )40 : ContainerBox({ }, WTFMove(style), Box::InitialContainingBlockFlag) 41 41 { 42 42 } -
trunk/Source/WebCore/layout/layouttree/LayoutInlineTextBox.cpp
r258864 r258904 38 38 39 39 InlineTextBox::InlineTextBox(String content, bool canUseSimplifiedContentMeasuring, RenderStyle&& style) 40 : Box({ }, WTFMove(style), Box::InlineTextBox )40 : Box({ }, WTFMove(style), Box::InlineTextBoxFlag) 41 41 , m_content(content) 42 42 , m_canUseSimplifiedContentMeasuring(canUseSimplifiedContentMeasuring) -
trunk/Source/WebCore/layout/layouttree/LayoutLineBreakBox.cpp
r258864 r258904 38 38 39 39 LineBreakBox::LineBreakBox(bool isOptional, RenderStyle&& style) 40 : Box({ }, WTFMove(style), Box::LineBreakBox )40 : Box({ }, WTFMove(style), Box::LineBreakBoxFlag) 41 41 , m_isOptional(isOptional) 42 42 { -
trunk/Source/WebCore/layout/layouttree/LayoutReplacedBox.cpp
r258864 r258904 38 38 39 39 ReplacedBox::ReplacedBox(RenderStyle&& style) 40 : Box({ }, WTFMove(style), Box::ReplacedBox )40 : Box({ }, WTFMove(style), Box::ReplacedBoxFlag) 41 41 { 42 42 } -
trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp
r258864 r258904 395 395 stream << "[float] "; 396 396 397 if ( layoutBox.isInitialContainingBlock())397 if (is<InitialContainingBlock>(layoutBox)) 398 398 stream << "Initial containing block"; 399 399 else if (layoutBox.isDocumentBox())
Note: See TracChangeset
for help on using the changeset viewer.