From edc438ad1be4e89a17d1669bd8dd41b1b6adcf49 Mon Sep 17 00:00:00 2001 From: danfickle Date: Sun, 5 Sep 2021 17:34:15 +1000 Subject: [PATCH] #364 Ban footnotes inside page margins. --- .../com/openhtmltopdf/layout/BoxBuilder.java | 7 ++-- .../com/openhtmltopdf/render/PageBox.java | 2 ++ .../footnote/issue-364-page-margins.pdf | Bin 0 -> 1875 bytes .../html/footnote/issue-364-page-margins.html | 32 ++++++++++++++++++ .../FootnoteVisualRegressionTest.java | 13 +++++++ 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 openhtmltopdf-examples/src/main/resources/visualtest/expected/footnote/issue-364-page-margins.pdf create mode 100644 openhtmltopdf-examples/src/main/resources/visualtest/html/footnote/issue-364-page-margins.html diff --git a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/layout/BoxBuilder.java b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/layout/BoxBuilder.java index e2905a141..9403d851c 100644 --- a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/layout/BoxBuilder.java +++ b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/layout/BoxBuilder.java @@ -138,7 +138,7 @@ public static void createChildren(LayoutContext c, BlockBox parent) { CalculatedStyle parentStyle = parent.getStyle(); boolean oldAllowFootnotes = c.isFootnoteAllowed(); - if (parentStyle.isFixed()) { + if (parentStyle.isFixed() || parentStyle.isRunning()) { c.setFootnoteAllowed(false); } @@ -1309,6 +1309,7 @@ private static boolean isValidFootnote( return c.isPrint() && (style.isInline() || style.isSpecifiedAsBlock()) && !style.isPostionedOrFloated() && + !style.isRunning() && !c.getSharedContext().getReplacedElementFactory().isReplacedElement(element); } @@ -1322,8 +1323,8 @@ private static void logInvalidFootnoteStyle( cause = "The footnote element must not be floated"; } else if (c.getSharedContext().getReplacedElementFactory().isReplacedElement(element)) { cause = "The footnote element must not be replaced (such as )"; - } else if (style.isPositioned()) { - cause = "The footnote element must have position: static (not absolute, relative or fixed)"; + } else if (style.isPositioned() || style.isRunning()) { + cause = "The footnote element must have position: static (not absolute, relative, running or fixed)"; } XRLog.log(Level.WARNING, LogMessageId.LogMessageId1Param.GENERAL_FOOTNOTE_INVALID, cause); diff --git a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/PageBox.java b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/PageBox.java index 1fe84f420..b46163bb0 100644 --- a/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/PageBox.java +++ b/openhtmltopdf-core/src/main/java/com/openhtmltopdf/render/PageBox.java @@ -570,6 +570,7 @@ private void retrievePageMetadata(LayoutContext c) { } private void layoutMarginAreas(LayoutContext c) { + c.setFootnoteAllowed(false); RectPropertySet margin = getMargin(c); for (int i = 0; i < MARGIN_AREA_DEFS.length; i++) { MarginArea area = MARGIN_AREA_DEFS[i]; @@ -598,6 +599,7 @@ private void layoutMarginAreas(LayoutContext c) { _marginAreas[i] = new MarginAreaContainer(area, table); } } + c.setFootnoteAllowed(true); } public boolean isLeftPage() { diff --git a/openhtmltopdf-examples/src/main/resources/visualtest/expected/footnote/issue-364-page-margins.pdf b/openhtmltopdf-examples/src/main/resources/visualtest/expected/footnote/issue-364-page-margins.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a3b30d636d60fb35a2e681d21347fe0c855250a GIT binary patch literal 1875 zcmeHI%}(1u5WbJZJIo~lRAKLrf8q)ukpxS$MNLCg4iN_vZ-P;>OKqpnzHBdjhMs!p ztX)&b(9%PXb>vlcJm1Xhd^5AX@hCpvjt9MOU%!6=jttG!4ICbVJNbdavNB6> z->baHj7FC`A-LmYsR|UNK7penP&&0R*@6#qm6QY+C8ff>(M!PuXA$#xD47?%;B1$% z-F>o@n{+c*IqsQTrLW8Nsx-Ih!kL@(e#^9VwH;X%0=TcUw7{8XBSGJ;m*5V~MwcjB zaQpo+9NaUNX34C>l!XV|0dReV(nYM^$Bfx(b+S7uvnQp zoY&MlO%U&3$5wrv-KPF+6*Mfw1VGC1c86FZ8;yo1(f`krCA(tnuXyTL_0i%OiF)kL*(m4iD-3RMN+PP4Tt z4kl)uXmC&T+@zUaqI;3)V_js8pf$|ybG4wB + + + + +
+Invalid 2 +
+ Invalid 3 +
+
+ +Page 1 in-flow content. + +
+Page 2 content +
+ + diff --git a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/FootnoteVisualRegressionTest.java b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/FootnoteVisualRegressionTest.java index 735bd20ca..09d063af9 100644 --- a/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/FootnoteVisualRegressionTest.java +++ b/openhtmltopdf-examples/src/test/java/com/openhtmltopdf/visualregressiontests/FootnoteVisualRegressionTest.java @@ -209,4 +209,17 @@ public void testIssue364CalledFromPositioned() throws IOException { assertTrue(vt.runTest("issue-364-called-from-positioned")); } + /** + * Tests that footnotes inside page margins are treated as normal + * content (and warning is logged). + */ + @Test + public void testIssue364FootnotesInsidePageMargins() throws IOException { + TestSupport.withLog((log, builder) -> { + assertTrue(vt.runTest("issue-364-page-margins", builder)); + assertThat(log, hasItem(LogMessageId.LogMessageId0Param.GENERAL_NO_FOOTNOTES_INSIDE_FOOTNOTES)); + assertThat(log, hasItem(LogMessageId.LogMessageId1Param.GENERAL_FOOTNOTE_INVALID)); + }); + } + }