Changeset 220858 in webkit
- Timestamp:
- Aug 17, 2017 8:19:38 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r220853 r220858 1 2017-08-17 Antti Koivisto <antti@apple.com> 2 3 RenderListItem - Avoid render tree mutation during layout 4 https://bugs.webkit.org/show_bug.cgi?id=175666 5 6 Reviewed by Andreas Kling. 7 8 Changes in render tree dumps that don't affect rendering. 9 10 * platform/ios/fast/doctypes/002-expected.txt: 11 * platform/ios/fast/lists/marker-before-empty-inline-expected.txt: 12 * platform/mac/css2.1/t0805-c5520-brdr-b-01-e-expected.txt: 13 * platform/mac/fast/doctypes/002-expected.txt: 14 * platform/mac/fast/lists/marker-before-empty-inline-expected.txt: 15 1 16 2017-08-17 Ms2ger <Ms2ger@gmail.com> 2 17 -
trunk/LayoutTests/platform/ios/fast/doctypes/002-expected.txt
r179104 r220858 13 13 RenderBlock {UL} at (0,0) size 744x20 14 14 RenderListItem {LI} at (40,0) size 704x20 15 RenderListMarker at (-18,0) size 7x19: white bullet 15 16 RenderListMarker at (-58,0) size 7x19: bullet 16 RenderListMarker at (-18,0) size 7x19: white bullet17 17 RenderText {#text} at (0,0) size 256x19 18 18 text run at (0,0) width 256: "Both bullets should be on the same line." -
trunk/LayoutTests/platform/ios/fast/lists/marker-before-empty-inline-expected.txt
r179104 r220858 80 80 RenderBlock {UL} at (0,0) size 744x20 81 81 RenderListItem {LI} at (40,0) size 704x20 82 RenderListMarker at (-18,0) size 7x19: white bullet 82 83 RenderListMarker at (-58,0) size 7x19: bullet 83 RenderListMarker at (-18,0) size 7x19: white bullet84 84 RenderText {#text} at (0,0) size 29x19 85 85 text run at (0,0) width 29: "item" … … 92 92 RenderBlock {UL} at (0,0) size 744x20 93 93 RenderListItem {LI} at (40,0) size 704x20 94 RenderListMarker at (-18,0) size 7x19: white bullet 94 95 RenderListMarker at (-58,0) size 7x19: bullet 95 RenderListMarker at (-18,0) size 7x19: white bullet96 96 RenderText {#text} at (0,0) size 29x19 97 97 text run at (0,0) width 29: "item" -
trunk/LayoutTests/platform/mac/css2.1/t0805-c5520-brdr-b-01-e-expected.txt
r191623 r220858 37 37 RenderBlock {UL} at (0,0) size 744x54 38 38 RenderListItem {LI} at (40,0) size 704x18 39 RenderListMarker at (-17,0) size 7x18: white bullet 39 40 RenderListMarker at (-57,0) size 7x18: bullet 40 RenderListMarker at (-17,0) size 7x18: white bullet41 41 RenderText {#text} at (0,0) size 77x18 42 42 text run at (0,0) width 77: "dummy text" -
trunk/LayoutTests/platform/mac/fast/doctypes/002-expected.txt
r177774 r220858 13 13 RenderBlock {UL} at (0,0) size 744x18 14 14 RenderListItem {LI} at (40,0) size 704x18 15 RenderListMarker at (-17,0) size 7x18: white bullet 15 16 RenderListMarker at (-57,0) size 7x18: bullet 16 RenderListMarker at (-17,0) size 7x18: white bullet17 17 RenderText {#text} at (0,0) size 256x18 18 18 text run at (0,0) width 256: "Both bullets should be on the same line." -
trunk/LayoutTests/platform/mac/fast/lists/marker-before-empty-inline-expected.txt
r177774 r220858 80 80 RenderBlock {UL} at (0,0) size 744x18 81 81 RenderListItem {LI} at (40,0) size 704x18 82 RenderListMarker at (-17,0) size 7x18: white bullet 82 83 RenderListMarker at (-57,0) size 7x18: bullet 83 RenderListMarker at (-17,0) size 7x18: white bullet84 84 RenderText {#text} at (0,0) size 29x18 85 85 text run at (0,0) width 29: "item" … … 92 92 RenderBlock {UL} at (0,0) size 744x18 93 93 RenderListItem {LI} at (40,0) size 704x18 94 RenderListMarker at (-17,0) size 7x18: white bullet 94 95 RenderListMarker at (-57,0) size 7x18: bullet 95 RenderListMarker at (-17,0) size 7x18: white bullet96 96 RenderText {#text} at (0,0) size 29x18 97 97 text run at (0,0) width 29: "item" -
trunk/Source/WebCore/ChangeLog
r220857 r220858 1 2017-08-17 Antti Koivisto <antti@apple.com> 2 3 RenderListItem - Avoid render tree mutation during layout 4 https://bugs.webkit.org/show_bug.cgi?id=175666 5 6 Reviewed by Andreas Kling. 7 8 Mutations should be done by RenderTreeUpdater only. 9 10 * rendering/RenderListItem.cpp: 11 (WebCore::RenderListItem::updateMarkerRenderer): 12 13 This is now called by RenderTreeUpdater only. 14 Remove code dealing with this being called at layout time. 15 Merged marker construction code from styleDidChange here and renamed for clarity. 16 17 (WebCore::RenderListItem::layout): 18 (WebCore::RenderListItem::computePreferredLogicalWidths): 19 20 Remove mutating calls. 21 22 (WebCore::RenderListItem::styleDidChange): Deleted. 23 (WebCore::RenderListItem::insertOrMoveMarkerRendererIfNeeded): Deleted. 24 * rendering/RenderListItem.h: 25 * rendering/TextAutoSizing.cpp: 26 (WebCore::TextAutoSizingValue::adjustTextNodeSizes): 27 28 Call updateMarkerRenderer. 29 30 * style/RenderTreeUpdater.cpp: 31 (WebCore::RenderTreeUpdater::popParent): 32 (WebCore::RenderTreeUpdater::updateBeforeOrAfterPseudoElement): 33 34 Call updateMarkerRenderer. 35 1 36 2017-08-17 Don Olmstead <don.olmstead@sony.com> 2 37 -
trunk/Source/WebCore/rendering/RenderListItem.cpp
r220207 r220858 97 97 } 98 98 99 void RenderListItem::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)100 {101 RenderBlockFlow::styleDidChange(diff, oldStyle);102 103 if (style().listStyleType() == NoneListStyle && (!style().listStyleImage() || style().listStyleImage()->errorOccurred())) {104 if (m_marker) {105 m_marker->destroy();106 ASSERT(!m_marker);107 }108 return;109 }110 111 auto newStyle = computeMarkerStyle();112 if (m_marker)113 m_marker->setStyle(WTFMove(newStyle));114 else {115 m_marker = createRenderer<RenderListMarker>(*this, WTFMove(newStyle)).leakPtr();116 m_marker->initializeStyle();117 }118 }119 120 99 void RenderListItem::insertedIntoTree() 121 100 { … … 294 273 } 295 274 296 void RenderListItem::insertOrMoveMarkerRendererIfNeeded() 297 { 298 // Sanity check the location of our marker. 299 if (!m_marker) 300 return; 301 302 // FIXME: Do not even try to reposition the marker when we are not in layout 303 // until after we fixed webkit.org/b/163789. 304 if (!view().frameView().isInRenderTreeLayout()) 305 return; 275 void RenderListItem::updateMarkerRenderer() 276 { 277 ASSERT_WITH_SECURITY_IMPLICATION(!view().layoutState()); 278 279 if (style().listStyleType() == NoneListStyle && (!style().listStyleImage() || style().listStyleImage()->errorOccurred())) { 280 if (m_marker) { 281 m_marker->destroy(); 282 ASSERT(!m_marker); 283 } 284 return; 285 } 286 287 auto newStyle = computeMarkerStyle(); 288 if (m_marker) 289 m_marker->setStyle(WTFMove(newStyle)); 290 else { 291 m_marker = createRenderer<RenderListMarker>(*this, WTFMove(newStyle)).leakPtr(); 292 m_marker->initializeStyle(); 293 } 306 294 307 295 RenderElement* currentParent = m_marker->parent(); … … 321 309 322 310 if (newParent != currentParent) { 323 // Removing and adding the marker can trigger repainting in324 // containers other than ourselves, so we need to disable LayoutState.325 LayoutStateDisabler layoutStateDisabler(view());326 // Mark the parent dirty so that when the marker gets inserted into the tree327 // and dirties ancestors, it stops at the parent.328 newParent->setChildNeedsLayout(MarkOnlyThis);329 m_marker->setNeedsLayout(MarkOnlyThis);330 331 311 m_marker->removeFromParent(); 332 312 newParent->addChild(m_marker, firstNonMarkerChild(*newParent)); 333 m_marker->updateMarginsAndContent();334 313 // If current parent is an anonymous block that has lost all its children, destroy it. 335 314 if (currentParent && currentParent->isAnonymousBlock() && !currentParent->firstChild() && !downcast<RenderBlock>(*currentParent).continuation()) 336 315 currentParent->destroy(); 337 316 } 338 339 317 } 340 318 … … 342 320 { 343 321 StackStats::LayoutCheckPoint layoutCheckPoint; 344 ASSERT(needsLayout()); 345 346 insertOrMoveMarkerRendererIfNeeded(); 322 ASSERT(needsLayout()); 323 347 324 #if !ASSERT_DISABLED 348 325 SetForScope<bool> inListItemLayout(m_inLayout, true); … … 359 336 void RenderListItem::computePreferredLogicalWidths() 360 337 { 361 #ifndef NDEBUG 362 // FIXME: We shouldn't be modifying the tree in computePreferredLogicalWidths. 363 // Instead, we should insert the marker soon after the tree construction. 364 // This is similar case to RenderCounter::computePreferredLogicalWidths() 365 // See https://bugs.webkit.org/show_bug.cgi?id=104829 366 SetLayoutNeededForbiddenScope layoutForbiddenScope(this, false); 367 #endif 368 insertOrMoveMarkerRendererIfNeeded(); 338 // FIXME: RenderListMarker::updateMargins() mutates margin style which affects preferred widths. 339 if (m_marker && m_marker->preferredLogicalWidthsDirty()) 340 m_marker->updateMarginsAndContent(); 341 369 342 RenderBlockFlow::computePreferredLogicalWidths(); 370 343 } -
trunk/Source/WebCore/rendering/RenderListItem.h
r220207 r220858 57 57 void didDestroyListMarker() { m_marker = nullptr; } 58 58 59 void updateMarkerRenderer(); 60 59 61 #if !ASSERT_DISABLED 60 62 bool inLayout() const { return m_inLayout; } … … 77 79 void positionListMarker(); 78 80 79 void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override;80 81 81 void addOverflowFromChildren() override; 82 82 void computePreferredLogicalWidths() override; 83 83 84 void insertOrMoveMarkerRendererIfNeeded();85 84 inline int calcValue() const; 86 85 void updateValueNow() const; -
trunk/Source/WebCore/rendering/TextAutoSizing.cpp
r220795 r220858 34 34 #include "Logging.h" 35 35 #include "RenderBlock.h" 36 #include "RenderListItem.h" 36 37 #include "RenderListMarker.h" 37 38 #include "RenderText.h" … … 157 158 newParentStyle.fontCascade().update(&node->document().fontSelector()); 158 159 parentRenderer->setStyle(WTFMove(newParentStyle)); 160 161 if (is<RenderListItem>(*parentRenderer)) 162 downcast<RenderListItem>(*parentRenderer).updateMarkerRenderer(); 159 163 } 160 164 -
trunk/Source/WebCore/style/RenderTreeUpdater.cpp
r220795 r220858 40 40 #include "RenderDescendantIterator.h" 41 41 #include "RenderFullScreen.h" 42 #include "RenderListItem.h" 42 43 #include "RenderNamedFlowThread.h" 43 44 #include "RenderQuote.h" … … 234 235 updateBeforeOrAfterPseudoElement(*parent.element, AFTER); 235 236 236 auto* renderer = parent.element->renderer(); 237 if (is<RenderBlock>(renderer)) 238 FirstLetter::update(downcast<RenderBlock>(*renderer)); 239 240 if (parent.element->hasCustomStyleResolveCallbacks() && parent.styleChange == Style::Detach && renderer) 241 parent.element->didAttachRenderers(); 237 if (auto* renderer = parent.element->renderer()) { 238 if (is<RenderBlock>(*renderer)) 239 FirstLetter::update(downcast<RenderBlock>(*renderer)); 240 if (is<RenderListItem>(*renderer)) 241 downcast<RenderListItem>(*renderer).updateMarkerRenderer(); 242 243 if (parent.element->hasCustomStyleResolveCallbacks() && parent.styleChange == Style::Detach) 244 parent.element->didAttachRenderers(); 245 } 242 246 } 243 247 m_parentStack.removeLast(); … … 567 571 updateQuotesUpTo(&child); 568 572 } 573 if (is<RenderListItem>(*pseudoRenderer)) 574 downcast<RenderListItem>(*pseudoRenderer).updateMarkerRenderer(); 569 575 } 570 576
Note: See TracChangeset
for help on using the changeset viewer.