Skip to content

Commit b35c28b

Browse files
committed
Fix NPE when dealing with margins collapsing
DEVSIX-8419
1 parent ca150c3 commit b35c28b

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

layout/src/main/java/com/itextpdf/layout/margincollapse/MarginsCollapseHandler.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ This file is part of the iText (R) project.
3333
import com.itextpdf.layout.renderer.BlockFormattingContextUtil;
3434
import com.itextpdf.layout.renderer.BlockRenderer;
3535
import com.itextpdf.layout.renderer.CellRenderer;
36+
import com.itextpdf.layout.renderer.GridContainerRenderer;
3637
import com.itextpdf.layout.renderer.IRenderer;
3738
import com.itextpdf.layout.renderer.LineRenderer;
3839
import com.itextpdf.layout.renderer.TableRenderer;
@@ -227,7 +228,9 @@ public void endMarginsCollapse(Rectangle layoutBox) {
227228
}
228229

229230
MarginsCollapse ownCollapseAfter;
230-
boolean lastChildMarginJoinedToParent = prevChildMarginInfo != null && prevChildMarginInfo.isIgnoreOwnMarginBottom() && !lastKidCollapsedAfterHasClearanceApplied;
231+
final boolean lastChildMarginJoinedToParent = prevChildMarginInfo != null
232+
&& prevChildMarginInfo.isIgnoreOwnMarginBottom()
233+
&& !lastKidCollapsedAfterHasClearanceApplied;
231234
if (lastChildMarginJoinedToParent) {
232235
ownCollapseAfter = prevChildMarginInfo.getOwnCollapseAfter();
233236
} else {
@@ -486,7 +489,10 @@ private static boolean lastChildMarginAdjoinedToParent(IRenderer parent) {
486489
}
487490

488491
private static boolean isBlockElement(IRenderer renderer) {
489-
return renderer instanceof BlockRenderer || renderer instanceof TableRenderer;
492+
// GridContainerRenderer is inherited from BlockRenderer but only not to copy/paste some overloads.
493+
// It doesn't use BlockRenderer#layout internally.
494+
return (renderer instanceof BlockRenderer || renderer instanceof TableRenderer)
495+
&& !(renderer instanceof GridContainerRenderer);
490496
}
491497

492498
private static boolean hasHeightProp(IRenderer renderer) {

layout/src/test/java/com/itextpdf/layout/element/GridContainerTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,4 +909,23 @@ public void autoRepeatPaddingsBordersMarginsTest() throws IOException, Interrupt
909909
}
910910
Assert.assertNull(new CompareTool().compareByContent(filename, cmpName, DESTINATION_FOLDER, "diff_"));
911911
}
912+
913+
@Test
914+
public void marginsCollapsingIssueTest() throws IOException, InterruptedException {
915+
String filename = DESTINATION_FOLDER + "marginsCollapsingIssueTest.pdf";
916+
String cmpName = SOURCE_FOLDER + "cmp_marginsCollapsingIssueTest.pdf";
917+
918+
try (Document document = new Document(new PdfDocument(new PdfWriter(filename)))) {
919+
Div grid = new GridContainer().setBackgroundColor(ColorConstants.BLUE);
920+
grid.add(new Paragraph("some grid text"));
921+
Div div = new Div()
922+
.setBackgroundColor(ColorConstants.RED)
923+
.add(new Paragraph("some div text"))
924+
.add(grid);
925+
div.setProperty(Property.COLLAPSING_MARGINS, Boolean.TRUE);
926+
927+
document.add(div);
928+
}
929+
Assert.assertNull(new CompareTool().compareByContent(filename, cmpName, DESTINATION_FOLDER, "diff_"));
930+
}
912931
}

0 commit comments

Comments
 (0)