Changeset 238119 in webkit
- Timestamp:
- Nov 12, 2018, 6:38:06 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 7 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/inline/marker-list-item-move-should-not-crash-expected.txt (added)
-
LayoutTests/fast/inline/marker-list-item-move-should-not-crash.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/rendering/updating/RenderTreeBuilder.cpp (modified) (2 diffs)
-
Source/WebCore/rendering/updating/RenderTreeBuilder.h (modified) (1 diff)
-
Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp (modified) (4 diffs)
-
Source/WebCore/rendering/updating/RenderTreeBuilderBlock.h (modified) (1 diff)
-
Source/WebCore/rendering/updating/RenderTreeBuilderList.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r238112 r238119 1 2018-11-12 Zalan Bujtas <zalan@apple.com> 2 3 Do not collapse the soon-to-be-parent anon block when we shuffle around the marker item renderer. 4 https://bugs.webkit.org/show_bug.cgi?id=191554 5 <rdar://problem/45825265> 6 7 Reviewed by Antti Koivisto. 8 9 * fast/inline/marker-list-item-move-should-not-crash-expected.txt: Added. 10 * fast/inline/marker-list-item-move-should-not-crash.html: Added. 11 1 12 2018-11-12 Sihui Liu <sihui_liu@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r238118 r238119 1 2018-11-12 Zalan Bujtas <zalan@apple.com> 2 3 Do not collapse the soon-to-be-parent anon block when we shuffle around the marker item renderer. 4 https://bugs.webkit.org/show_bug.cgi?id=191554 5 <rdar://problem/45825265> 6 7 Reviewed by Antti Koivisto. 8 9 While moving the marker item renderer to its correct subtree, we accidentally remove the soon-to-be parent anonymous block. 10 Moving a renderer is a 2 step process: 11 1. Detach the renderer from its current parent 12 2. Attach it to its new parent. 13 During step #1, we check if there is a chance to collapse anonymous blocks. In this case the soon-to-be-parent is a sibling anonymous block which, after detaching the marker sibling 14 is not needed anymore (except we use it as the new parent). 15 16 Test: fast/inline/marker-list-item-move-should-not-crash.html 17 18 * rendering/updating/RenderTreeBuilder.cpp: 19 (WebCore::RenderTreeBuilder::detach): 20 * rendering/updating/RenderTreeBuilder.h: 21 * rendering/updating/RenderTreeBuilderBlock.cpp: 22 (WebCore::RenderTreeBuilder::Block::detach): 23 * rendering/updating/RenderTreeBuilderBlock.h: 24 * rendering/updating/RenderTreeBuilderList.cpp: 25 (WebCore::RenderTreeBuilder::List::updateItemMarker): 26 1 27 2018-11-12 Javier Fernandez <jfernandez@igalia.com> 2 28 -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp
r233056 r238119 318 318 } 319 319 320 RenderPtr<RenderObject> RenderTreeBuilder::detach(RenderElement& parent, RenderObject& child )320 RenderPtr<RenderObject> RenderTreeBuilder::detach(RenderElement& parent, RenderObject& child, CanCollapseAnonymousBlock canCollapseAnonymousBlock) 321 321 { 322 322 if (is<RenderRubyAsInline>(parent)) … … 351 351 352 352 if (is<RenderBlockFlow>(parent)) 353 return blockBuilder().detach(downcast<RenderBlockFlow>(parent), child );353 return blockBuilder().detach(downcast<RenderBlockFlow>(parent), child, canCollapseAnonymousBlock); 354 354 355 355 if (is<RenderBlock>(parent)) 356 return blockBuilder().detach(downcast<RenderBlock>(parent), child );356 return blockBuilder().detach(downcast<RenderBlock>(parent), child, canCollapseAnonymousBlock); 357 357 358 358 return detachFromRenderElement(parent, child); -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.h
r232064 r238119 45 45 void attach(RenderElement& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr); 46 46 47 RenderPtr<RenderObject> detach(RenderElement&, RenderObject&) WARN_UNUSED_RETURN; 47 enum class CanCollapseAnonymousBlock { No, Yes }; 48 RenderPtr<RenderObject> detach(RenderElement&, RenderObject&, CanCollapseAnonymousBlock = CanCollapseAnonymousBlock::Yes) WARN_UNUSED_RETURN; 48 49 49 50 void destroy(RenderObject& renderer); -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp
r235586 r238119 273 273 } 274 274 275 RenderPtr<RenderObject> RenderTreeBuilder::Block::detach(RenderBlock& parent, RenderObject& oldChild )275 RenderPtr<RenderObject> RenderTreeBuilder::Block::detach(RenderBlock& parent, RenderObject& oldChild, CanCollapseAnonymousBlock canCollapseAnonymousBlock) 276 276 { 277 277 // No need to waste time in merging or removing empty anonymous blocks. … … 330 330 } 331 331 332 RenderObject* child = prev ? prev.get() : next.get();333 if (canMergeAnonymousBlocks && child && !child->previousSibling() && !child->nextSibling() && parent.canDropAnonymousBlockChild()) {334 // The removal has knocked us down to containing only a single anonymous335 //box. We can pull the content right back up into our box.336 dropAnonymousBoxChild(parent, downcast<RenderBlock>(*child));337 } else if (((prev && prev->isAnonymousBlock()) || (next && next->isAnonymousBlock())) && parent.canDropAnonymousBlockChild()) {338 // It's possible that the removal has knocked us down to a single anonymous339 // block with floating siblings.340 RenderBlock& anonBlock = downcast<RenderBlock>((prev && prev->isAnonymousBlock()) ? *prev : *next);341 if (canDropAnonymousBlock(anonBlock)) {342 bool dropAnonymousBlock = true;343 for (auto& sibling : childrenOfType<RenderObject>(parent)) {344 if (&sibling == &anonBlock)345 continue;346 if (!sibling.isFloating()) {347 dropAnonymousBlock = false;348 break;332 if (canCollapseAnonymousBlock == CanCollapseAnonymousBlock::Yes && parent.canDropAnonymousBlockChild()) { 333 RenderObject* child = prev ? prev.get() : next.get(); 334 if (canMergeAnonymousBlocks && child && !child->previousSibling() && !child->nextSibling()) { 335 // The removal has knocked us down to containing only a single anonymous box. We can pull the content right back up into our box. 336 dropAnonymousBoxChild(parent, downcast<RenderBlock>(*child)); 337 } else if ((prev && prev->isAnonymousBlock()) || (next && next->isAnonymousBlock())) { 338 // It's possible that the removal has knocked us down to a single anonymous block with floating siblings. 339 RenderBlock& anonBlock = downcast<RenderBlock>((prev && prev->isAnonymousBlock()) ? *prev : *next); 340 if (canDropAnonymousBlock(anonBlock)) { 341 bool dropAnonymousBlock = true; 342 for (auto& sibling : childrenOfType<RenderObject>(parent)) { 343 if (&sibling == &anonBlock) 344 continue; 345 if (!sibling.isFloating()) { 346 dropAnonymousBlock = false; 347 break; 348 } 349 349 } 350 if (dropAnonymousBlock) 351 dropAnonymousBoxChild(parent, anonBlock); 350 352 } 351 if (dropAnonymousBlock)352 dropAnonymousBoxChild(parent, anonBlock);353 353 } 354 354 } … … 374 374 } 375 375 376 RenderPtr<RenderObject> RenderTreeBuilder::Block::detach(RenderBlockFlow& parent, RenderObject& child )376 RenderPtr<RenderObject> RenderTreeBuilder::Block::detach(RenderBlockFlow& parent, RenderObject& child, CanCollapseAnonymousBlock canCollapseAnonymousBlock) 377 377 { 378 378 if (!parent.renderTreeBeingDestroyed()) { … … 381 381 m_builder.multiColumnBuilder().multiColumnRelativeWillBeRemoved(*fragmentedFlow, child); 382 382 } 383 return detach(static_cast<RenderBlock&>(parent), child );384 } 385 386 } 383 return detach(static_cast<RenderBlock&>(parent), child, canCollapseAnonymousBlock); 384 } 385 386 } -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.h
r228954 r238119 38 38 void attachIgnoringContinuation(RenderBlock& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild); 39 39 40 RenderPtr<RenderObject> detach(RenderBlock& parent, RenderObject& oldChild ) WARN_UNUSED_RETURN;41 RenderPtr<RenderObject> detach(RenderBlockFlow& parent, RenderObject& child ) WARN_UNUSED_RETURN;40 RenderPtr<RenderObject> detach(RenderBlock& parent, RenderObject& oldChild, CanCollapseAnonymousBlock = CanCollapseAnonymousBlock::Yes) WARN_UNUSED_RETURN; 41 RenderPtr<RenderObject> detach(RenderBlockFlow& parent, RenderObject& child, CanCollapseAnonymousBlock = CanCollapseAnonymousBlock::Yes) WARN_UNUSED_RETURN; 42 42 43 43 void dropAnonymousBoxChild(RenderBlock& parent, RenderBlock& child); -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderList.cpp
r232178 r238119 116 116 117 117 if (currentParent) 118 m_builder.attach(*newParent, m_builder.detach(*currentParent, *markerRenderer ), firstNonMarkerChild(*newParent));118 m_builder.attach(*newParent, m_builder.detach(*currentParent, *markerRenderer, RenderTreeBuilder::CanCollapseAnonymousBlock::No), firstNonMarkerChild(*newParent)); 119 119 else 120 120 m_builder.attach(*newParent, WTFMove(newMarkerRenderer), firstNonMarkerChild(*newParent));
Note:
See TracChangeset
for help on using the changeset viewer.