Skip to content

Commit 79e8eb9

Browse files
committed
Prevent null from being passed as occupied area in case of FULL
In case result is updated to be FULL, result's occupied area could be null: one should check the splitRenderer's occupied area instead. DEVSIX-5237
1 parent 9fadebf commit 79e8eb9

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

layout/src/main/java/com/itextpdf/layout/renderer/FlexContainerRenderer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ This file is part of the iText (R) project.
4646
import com.itextpdf.kernel.geom.Rectangle;
4747
import com.itextpdf.layout.borders.Border;
4848
import com.itextpdf.layout.element.Div;
49+
import com.itextpdf.layout.layout.LayoutArea;
4950
import com.itextpdf.layout.layout.LayoutContext;
5051
import com.itextpdf.layout.layout.LayoutResult;
5152
import com.itextpdf.layout.margincollapse.MarginsCollapseHandler;
@@ -235,7 +236,8 @@ LayoutResult processNotFullChildResult(LayoutContext layoutContext,
235236
if (splitRenderer != null) {
236237
splitRenderer.setChildRenderers(getChildRenderers());
237238
}
238-
return new LayoutResult(LayoutResult.FULL, result.getOccupiedArea(), splitRenderer, null, null);
239+
return new LayoutResult(LayoutResult.FULL,
240+
getOccupiedAreaInCaseNothingWasWrappedWithFull(result, splitRenderer), splitRenderer, null, null);
239241
} else {
240242
applyPaddings(occupiedArea.getBBox(), paddings, true);
241243
applyBorderBox(occupiedArea.getBBox(), borders, true);
@@ -250,6 +252,11 @@ LayoutResult processNotFullChildResult(LayoutContext layoutContext,
250252
}
251253
}
252254

255+
// TODO DEVSIX-5238 Consider this fix (perhaps it should be improved or unified) while working on the ticket
256+
LayoutArea getOccupiedAreaInCaseNothingWasWrappedWithFull(LayoutResult result, IRenderer splitRenderer) {
257+
return null != result.getOccupiedArea() ? result.getOccupiedArea() : splitRenderer.getOccupiedArea();
258+
}
259+
253260
@Override
254261
boolean stopLayoutingChildrenIfChildResultNotFull(LayoutResult returnResult) {
255262
return returnResult.getStatus() != LayoutResult.FULL;

layout/src/test/java/com/itextpdf/layout/renderer/FlexContainerRendererTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,17 @@ This file is part of the iText (R) project.
2222
*/
2323
package com.itextpdf.layout.renderer;
2424

25+
import com.itextpdf.kernel.geom.Rectangle;
2526
import com.itextpdf.layout.borders.SolidBorder;
2627
import com.itextpdf.layout.element.Div;
28+
import com.itextpdf.layout.layout.LayoutArea;
29+
import com.itextpdf.layout.layout.LayoutContext;
30+
import com.itextpdf.layout.layout.LayoutResult;
2731
import com.itextpdf.layout.property.Property;
2832
import com.itextpdf.layout.property.UnitValue;
2933
import com.itextpdf.test.ExtendedITextTest;
3034
import com.itextpdf.test.annotations.type.UnitTest;
35+
3136
import org.junit.Assert;
3237
import org.junit.Test;
3338
import org.junit.experimental.categories.Category;
@@ -176,6 +181,17 @@ public void widthSetToChildManyChildrenFlexRendererWithMinWidthTest() {
176181
Assert.assertEquals(125F, flexRenderer.getMinMaxWidth().getMaxWidth(), EPS);
177182
}
178183

184+
185+
@Test
186+
public void decreaseLayoutBoxAfterChildPlacementResultsOccupiedAreaNull() {
187+
FlexContainerRenderer splitRenderer = new FlexContainerRenderer(new Div());
188+
splitRenderer.occupiedArea = new LayoutArea(0, new Rectangle(0, 0));
189+
190+
LayoutResult nothing = new LayoutResult(LayoutResult.NOTHING, null, splitRenderer, null);
191+
Assert.assertNotNull(new FlexContainerRenderer(new Div())
192+
.getOccupiedAreaInCaseNothingWasWrappedWithFull(nothing, splitRenderer));
193+
}
194+
179195
@Test
180196
public void widthSetToChildManyChildrenFlexRendererWithMinWidthBiggerThanMaxWidthTest() {
181197
FlexContainerRenderer flexRenderer = new FlexContainerRenderer(new Div());

0 commit comments

Comments
 (0)