-
betravis@adobe.com authored
[css exclusions] Dynamically removing shape-inside should cause relayout of child blocks' inline content https://bugs.webkit.org/show_bug.cgi?id=111029 Reviewed by David Hyatt. Source/WebCore: Preserve a removed ExclusionShapeInsideInfo for one additional layout pass so that it can notify descendant inline content to relayout. This patch adds a new 'needsRemoval' boolean to ExclusionShapeInsideInfo, which is set when a style change removes but does not replace a shape-inside. When determining whether a block needs to relayout inline children, ExclusionShapeInsideInfos with the needsRemoval boolean set are included, but at other times (such as during inline layout), they are ignored. Added tests to the existing dynamic shape testfile fast/exclusions/shape-inside/shape-inside-dynamic-nested.html * rendering/ExclusionShapeInsideInfo.h: (WebCore::ExclusionShapeInsideInfo::setNeedsRemoval): Get/Set the needsRemoval boolean. (WebCore::ExclusionShapeInsideInfo::needsRemoval): Ditto. (ExclusionShapeInsideInfo): (WebCore::ExclusionShapeInsideInfo::ExclusionShapeInsideInfo): Initialize the needsRemoval boolean. * rendering/LayoutState.cpp: (WebCore::LayoutState::LayoutState): Propagate removed shape insides for layout correctly. You only need to track one at a time, and a removed shape inside should not take precedence over a set shape-inside. * rendering/RenderBlock.cpp: (WebCore::RenderBlock::updateExclusionShapeInsideInfoAfterStyleChange): Set the ExclusionShapeInsideInfo needsRemoval boolean, rather than immediately removing the info. (WebCore::exclusionInfoRequiresRelayout): Account for the needsRemoval boolean as another way of requiring relayout. (WebCore::RenderBlock::updateRegionsAndExclusionsBeforeChildLayout): Look up whether an ExclusionShapeInsideInfo has been removed. (WebCore::RenderBlock::updateRegionsAndExclusionsAfterChildLayout): Remove any ExclusionShapeInsides marked for removal after a layout pass. (WebCore): (WebCore::RenderBlock::layoutBlock): Call the new updateRegionsAndExclusions Before/After methods. * rendering/RenderBlock.h: (WebCore::RenderBlock::exclusionShapeInsideInfo): Filter the result based on whether it should include removed infos. (RenderBlock): * rendering/RenderBlockLineLayout.cpp: (WebCore::RenderBlock::layoutExclusionShapeInsideInfo): Ditto. * rendering/RenderDeprecatedFlexibleBox.cpp: (WebCore::RenderDeprecatedFlexibleBox::layoutBlock): Same as RenderBlock::layoutBlock. * rendering/RenderFlexibleBox.cpp: (WebCore::RenderFlexibleBox::layoutBlock): Ditto. * rendering/RenderGrid.cpp: (WebCore::RenderGrid::layoutBlock): Ditto. LayoutTests: Test that removed shape-insides correctly cause relayout in their blocks' inline content. * fast/exclusions/shape-inside/shape-inside-dynamic-nested-expected.html: * fast/exclusions/shape-inside/shape-inside-dynamic-nested.html: git-svn-id: http://svn.webkit.org/repository/webkit/trunk@147758 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1e4305c2