Skip to content

Commit c2a8720

Browse files
committed
Fix NPE and infinite loop if using display: inline-block with display: flex on page split
DEVSIX-8951
1 parent 78bf75b commit c2a8720

File tree

35 files changed

+776
-23
lines changed

35 files changed

+776
-23
lines changed

src/test/java/com/itextpdf/html2pdf/css/flex/DisplayFlexTest.java

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,15 @@ This file is part of the iText (R) project.
4646
import com.itextpdf.test.LogLevelConstants;
4747
import com.itextpdf.test.annotations.LogMessage;
4848
import com.itextpdf.test.annotations.LogMessages;
49+
import org.junit.jupiter.api.Assertions;
50+
import org.junit.jupiter.api.BeforeAll;
51+
import org.junit.jupiter.api.Tag;
52+
import org.junit.jupiter.api.Test;
4953

5054
import java.io.File;
5155
import java.io.FileInputStream;
5256
import java.io.IOException;
5357
import java.util.List;
54-
import org.junit.jupiter.api.Assertions;
55-
import org.junit.jupiter.api.BeforeAll;
56-
import org.junit.jupiter.api.Disabled;
57-
import org.junit.jupiter.api.Tag;
58-
import org.junit.jupiter.api.Test;
5958

6059
@Tag("IntegrationTest")
6160
public class DisplayFlexTest extends ExtendedHtmlConversionITextTest {
@@ -64,7 +63,6 @@ public class DisplayFlexTest extends ExtendedHtmlConversionITextTest {
6463
private static final String SOURCE_FOLDER = "./src/test/resources/com/itextpdf/html2pdf/css/flex/DisplayFlexTest/";
6564
private static final String DESTINATION_FOLDER = "./target/test/com/itextpdf/html2pdf/css/flex/DisplayFlexTest/";
6665

67-
6866
@BeforeAll
6967
public static void beforeClass() {
7068
createDestinationFolder(DESTINATION_FOLDER);
@@ -623,7 +621,7 @@ public void displayFlexWithRobotoFontTest() throws IOException, InterruptedExcep
623621
String outFile = DESTINATION_FOLDER + "displayFlexWithRobotoFont.pdf";
624622
String cmpFile = SOURCE_FOLDER + "cmp_displayFlexWithRobotoFont.pdf";
625623
String htmlFile = SOURCE_FOLDER + "displayFlexWithRobotoFont.html";
626-
String robotoFont ="./src/test/resources/com/itextpdf/html2pdf/fonts/Roboto-Regular.ttf";
624+
String robotoFont = "./src/test/resources/com/itextpdf/html2pdf/fonts/Roboto-Regular.ttf";
627625

628626
PdfWriter writer = new PdfWriter(new File(outFile));
629627
PdfDocument pdfDocument = new PdfDocument(writer);
@@ -639,26 +637,72 @@ public void displayFlexWithRobotoFontTest() throws IOException, InterruptedExcep
639637
}
640638

641639
@Test
642-
@LogMessages(messages = {
643-
@LogMessage(messageTemplate = LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA),
644-
})
645-
// TODO DEVSIX-8951 Nullpointer exception if using display: inline-block with display: flex on page split
646-
public void inlineBlockInsideFlexWithFixedSizeSiblingTest() {
647-
String html = "inlineBlockInsideFlexWithFixedSizeSibling";
648-
File htmlFile = new File(SOURCE_FOLDER + html + ".html");
649-
File output = new File(DESTINATION_FOLDER + html + ".pdf");
650-
Assertions.assertThrows(Exception.class, () -> HtmlConverter.convertToPdf(htmlFile, output));
640+
public void inlineBlockInsideFlexWithFixedSizeSiblingTest() throws IOException, InterruptedException {
641+
convertToPdfAndCompare("inlineBlockInsideFlexWithFixedSizeSibling", SOURCE_FOLDER, DESTINATION_FOLDER);
642+
}
643+
644+
@Test
645+
public void inlineBlockInsideFlexWithFixedWidthOnlySiblingTest() throws IOException, InterruptedException {
646+
convertToPdfAndCompare("inlineBlockInsideFlexWithFixedWidthOnlySibling", SOURCE_FOLDER, DESTINATION_FOLDER);
647+
}
648+
649+
@Test
650+
// TODO DEVSIX-9509 Move flex container to the next page since inline-block flex item is not fit and not 1st
651+
public void inlineBlockInsideFlexWithFixedWidthOnlySiblingAfterParagraphTest() throws IOException, InterruptedException {
652+
convertToPdfAndCompare("inlineBlockInsideFlexWithFixedWidthOnlySiblingAfterParagraph", SOURCE_FOLDER, DESTINATION_FOLDER);
653+
}
654+
655+
@Test
656+
// TODO DEVSIX-9509 Move flex container to the next page since inline-block flex item is not fit and not 1st
657+
public void inlineBlockInsideFlexAfterParagraphTest() throws IOException, InterruptedException {
658+
convertToPdfAndCompare("inlineBlockInsideFlexAfterParagraph", SOURCE_FOLDER, DESTINATION_FOLDER);
659+
}
660+
661+
@Test
662+
public void inlineBlockInsideFlexSingleItemTest() throws IOException, InterruptedException {
663+
convertToPdfAndCompare("inlineBlockInsideFlexSingleItem", SOURCE_FOLDER, DESTINATION_FOLDER);
651664
}
652665

653666
@Test
654-
@Disabled("TODO DEVSIX-8951 Infinite loop if using display: inline-block with display: flex on page split")
655-
public void inlineBlockInsideFlexWithFixedWidthOnlySiblingTest() throws IOException {
656-
String html = "inlineBlockInsideFlexWithFixedWidthOnlySibling";
657-
File htmlFile = new File(SOURCE_FOLDER + html + ".html");
658-
File output = new File(DESTINATION_FOLDER + html + ".pdf");
659-
HtmlConverter.convertToPdf(htmlFile, output);
667+
public void inlineBlockInsideFlexFirstItemTest() throws IOException, InterruptedException {
668+
convertToPdfAndCompare("inlineBlockInsideFlexFirstItem", SOURCE_FOLDER, DESTINATION_FOLDER);
660669
}
661-
670+
671+
@Test
672+
public void inlineBlockInsideFlexSplitTest() throws IOException, InterruptedException {
673+
convertToPdfAndCompare("inlineBlockInsideFlexSplit", SOURCE_FOLDER, DESTINATION_FOLDER);
674+
}
675+
676+
@Test
677+
public void inlineBlockInsideFlexSeveralItemsTest() throws IOException, InterruptedException {
678+
convertToPdfAndCompare("inlineBlockInsideFlexSeveralItems", SOURCE_FOLDER, DESTINATION_FOLDER);
679+
}
680+
681+
@Test
682+
public void inlineBlockInsideFlexWrapTest() throws IOException, InterruptedException {
683+
convertToPdfAndCompare("inlineBlockInsideFlexWrap", SOURCE_FOLDER, DESTINATION_FOLDER);
684+
}
685+
686+
@Test
687+
public void inlineBlockInsideFlexColumnTest() throws IOException, InterruptedException {
688+
convertToPdfAndCompare("inlineBlockInsideFlexColumn", SOURCE_FOLDER, DESTINATION_FOLDER);
689+
}
690+
691+
@Test
692+
public void inlineBlockInsideFlexColumnReverseTest() throws IOException, InterruptedException {
693+
convertToPdfAndCompare("inlineBlockInsideFlexColumnReverse", SOURCE_FOLDER, DESTINATION_FOLDER);
694+
}
695+
696+
@Test
697+
public void blockInsideFlexSimpleColumnTest() throws IOException, InterruptedException {
698+
convertToPdfAndCompare("blockInsideFlexSimpleColumn", SOURCE_FOLDER, DESTINATION_FOLDER);
699+
}
700+
701+
@Test
702+
public void inlineBlockInsideFlexSimpleColumnTest() throws IOException, InterruptedException {
703+
convertToPdfAndCompare("inlineBlockInsideFlexSimpleColumn", SOURCE_FOLDER, DESTINATION_FOLDER);
704+
}
705+
662706
@Test
663707
// TODO DEVSIX-7402 Add display:flex support for all relevant tags
664708
public void displayFlexOnHeaderTagTest() throws IOException, InterruptedException {

src/test/java/com/itextpdf/html2pdf/css/grid/GridItemPlacementTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,17 @@ public void noTemplate2Test() throws IOException, InterruptedException {
222222
runTest("noTemplate2");
223223
}
224224

225+
@Test
226+
public void blockInsideGridTest() throws IOException, InterruptedException {
227+
runTest("blockInsideGrid");
228+
}
229+
230+
@Test
231+
// TODO DEVSIX-9509 Move inline-block item to the next page
232+
public void inlineBlockInsideGridTest() throws IOException, InterruptedException {
233+
runTest("inlineBlockInsideGrid");
234+
}
235+
225236
private void runTest(String testName) throws IOException, InterruptedException {
226237
convertToPdfAndCompare(testName, SOURCE_FOLDER, DESTINATION_FOLDER, false,
227238
new ConverterProperties().setBaseUri(SOURCE_FOLDER));

src/test/java/com/itextpdf/html2pdf/css/multicol/ColumnCountTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,16 @@ public void shortHandResolverTest01() throws IOException, InterruptedException {
433433
runTest("shortHandResolverTest01");
434434
}
435435

436+
@Test
437+
public void blockInsideMulticolTest() throws IOException, InterruptedException {
438+
runTest("blockInsideMulticol");
439+
}
440+
441+
@Test
442+
public void inlineBlockInsideMulticolTest() throws IOException, InterruptedException {
443+
runTest("inlineBlockInsideMulticol");
444+
}
445+
436446
private void runTest(String testName) throws IOException, InterruptedException {
437447
convertToPdfAndCompare(testName,
438448
SOURCE_FOLDER, DESTINATION_FOLDER, false,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<style>
5+
.flex {
6+
display: flex;
7+
flex-direction: column;
8+
}
9+
10+
</style>
11+
</head>
12+
<body>
13+
14+
<div class="flex">
15+
<div style="width: 25px;height:25px;background-color: green;"></div>
16+
<div>
17+
<div>
18+
19+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec pellentesque nunc<br/>, a sagittis erat. Vivamus eu odio sagittis, aliquam augue eu, suscipit nibh.<br/> Donec lacinia ultrices auctor. Etiam nec mauris vitae felis sodales congue.<br/> Mauris dolor augue, eleifend sit amet diam tristique, convallis varius tortor.<br/> Cras tristique commodo aliquet. Donec eu velit vitae tortor tempor aliquet in at dui.<br/>
20+
21+
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.<br/> Donec erat odio, semper vitae eros condimentum, volutpat iaculis lorem.<br/> Sed mollis mi lacus, ut suscipit dui maximus congue. Etiam varius nulla eget scelerisque laoreet. <br/>Sed elementum, magna id pharetra aliquam, elit justo finibus sapien, a tempor arcu velit et justo. <br/>Integer eu placerat diam. Sed efficitur lacinia sapien sed tincidunt.<br/> Cras nisl sem, maximus eget arcu eget, bibendum convallis lectus. Aliquam a sodales neque.<br/> Maecenas risus velit, malesuada quis porta vel, efficitur sit amet nunc. <br/>Suspendisse suscipit mi vitae dui dignissim, id gravida lacus euismod.<br/> Aenean volutpat sodales ligula, egestas tincidunt sem venenatis in.<br/> Vestibulum bibendum erat dolor, eget bibendum lacus lobortis lobortis. Maecenas a aliquet sapien,<br/> eu viverra felis. Suspendisse a orci quis eros volutpat placerat fermentum eu velit. <br/>Quisque magna nulla, elementum cursus odio.
22+
23+
<br/>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec pellentesque nunc<br/>, a sagittis erat. Vivamus eu odio sagittis, aliquam augue eu, suscipit nibh.<br/> Donec lacinia ultrices auctor. Etiam nec mauris vitae felis sodales congue.<br/> Mauris dolor augue, eleifend sit amet diam tristique, convallis varius tortor.<br/> Cras tristique commodo aliquet. Donec eu velit vitae tortor tempor aliquet in at dui.<br/>
24+
25+
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.<br/> Donec erat odio, semper vitae eros condimentum, volutpat iaculis lorem.<br/> Sed mollis mi lacus, ut suscipit dui maximus congue. Etiam varius nulla eget scelerisque laoreet. <br/>Sed elementum, magna id pharetra aliquam, elit justo finibus sapien, a tempor arcu velit et justo. <br/>Integer eu placerat diam. Sed efficitur lacinia sapien sed tincidunt.<br/> Cras nisl sem, maximus eget arcu eget, bibendum convallis lectus. Aliquam a sodales neque.<br/> Maecenas risus velit, malesuada quis porta vel, efficitur sit amet nunc. <br/>Suspendisse suscipit mi vitae dui dignissim, id gravida lacus euismod.<br/> Aenean volutpat sodales ligula, egestas tincidunt sem venenatis in.<br/> Vestibulum bibendum erat dolor, eget bibendum lacus lobortis lobortis. Maecenas a aliquet sapien,<br/> eu viverra felis. Suspendisse a orci quis eros volutpat placerat fermentum eu velit. <br/>Quisque magna nulla, elementum cursus odio.
26+
27+
<br/>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec pellentesque nunc<br/>, a sagittis erat. Vivamus eu odio sagittis, aliquam augue eu, suscipit nibh.<br/> Donec lacinia ultrices auctor. Etiam nec mauris vitae felis sodales congue.<br/> Mauris dolor augue, eleifend sit amet diam tristique, convallis varius tortor.<br/> Cras tristique commodo aliquet. Donec eu velit vitae tortor tempor aliquet in at dui.<br/>
28+
29+
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.<br/> Donec erat odio, semper vitae eros condimentum, volutpat iaculis lorem.<br/> Sed mollis mi lacus, ut suscipit dui maximus congue. Etiam varius nulla eget scelerisque laoreet. <br/>Sed elementum, magna id pharetra aliquam, elit justo finibus sapien, a tempor arcu velit et justo. <br/>Integer eu placerat diam. Sed efficitur lacinia sapien sed tincidunt.<br/> Cras nisl sem, maximus eget arcu eget, bibendum convallis lectus. Aliquam a sodales neque.<br/> Maecenas risus velit, malesuada quis porta vel, efficitur sit amet nunc. <br/>Suspendisse suscipit mi vitae dui dignissim, id gravida lacus euismod.<br/> Aenean volutpat sodales ligula, egestas tincidunt sem venenatis in.<br/> Vestibulum bibendum erat dolor, eget bibendum lacus lobortis lobortis. Maecenas a aliquet sapien,<br/> eu viverra felis. Suspendisse a orci quis eros volutpat placerat fermentum eu velit. <br/>Quisque magna nulla, elementum cursus odio.
30+
31+
<br/>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec pellentesque nunc<br/>, a sagittis erat. Vivamus eu odio sagittis, aliquam augue eu, suscipit nibh.<br/> Donec lacinia ultrices auctor. Etiam nec mauris vitae felis sodales congue.<br/> Mauris dolor augue, eleifend sit amet diam tristique, convallis varius tortor.<br/> Cras tristique commodo aliquet. Donec eu velit vitae tortor tempor aliquet in at dui.<br/>
32+
33+
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.<br/> Donec erat odio, semper vitae eros condimentum, volutpat iaculis lorem.<br/> Sed mollis mi lacus, ut suscipit dui maximus congue. Etiam varius nulla eget scelerisque laoreet. <br/>Sed elementum, magna id pharetra aliquam, elit justo finibus sapien, a tempor arcu velit et justo. <br/>Integer eu placerat diam. Sed efficitur lacinia sapien sed tincidunt.<br/> Cras nisl sem, maximus eget arcu eget, bibendum convallis lectus. Aliquam a sodales neque.<br/> Maecenas risus velit, malesuada quis porta vel, efficitur sit amet nunc. <br/>Suspendisse suscipit mi vitae dui dignissim, id gravida lacus euismod.<br/> Aenean volutpat sodales ligula, egestas tincidunt sem venenatis in.<br/> Vestibulum bibendum erat dolor, eget bibendum lacus lobortis lobortis. Maecenas a aliquet sapien,<br/> eu viverra felis. Suspendisse a orci quis eros volutpat placerat fermentum eu velit. <br/>Quisque magna nulla, elementum cursus odio.
34+
35+
36+
</div>
37+
</div>
38+
</div>
39+
</body>
40+
</html>

0 commit comments

Comments
 (0)