]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-3105: Infinite loop when using page break with changing ipd
authorSimon Steiner <ssteiner@apache.org>
Wed, 2 Nov 2022 09:01:56 +0000 (09:01 +0000)
committerSimon Steiner <ssteiner@apache.org>
Wed, 2 Nov 2022 09:01:56 +0000 (09:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1904996 13f79535-47bb-0310-9956-ffa450edef68

fop-core/src/main/java/org/apache/fop/layoutmgr/BlockLayoutManager.java
fop-core/src/main/java/org/apache/fop/layoutmgr/RestartAtLM.java
fop-core/src/main/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
fop/test/layoutengine/standard-testcases/flow_changing-ipd_7.xml [new file with mode: 0644]

index ac0da5f6a019ca069d78deb12f9b0118e3bfc16b..92fac64c45fb37afe65c9a0b1b0766d9822b3aad 100644 (file)
@@ -141,7 +141,9 @@ public class BlockLayoutManager extends SpacedBorderedPaddedBlockLayoutManager
             return childLM.getNextKnuthElements(childLC, alignment);
         } else {
             if (childLM instanceof LineLayoutManager) {
-                assert (restartPosition instanceof LeafPosition);
+                if (!(restartPosition instanceof LeafPosition)) {
+                    restartPosition = null;
+                }
                 return ((LineLayoutManager) childLM).getNextKnuthElements(childLC, alignment,
                         (LeafPosition) restartPosition);
             } else {
index 9c8aa82526f0d0ae93ed6dbf7a0adb1377aacabe..6dd80075d62e6f492ccf67f20ad9c8ad0d4a6495 100644 (file)
@@ -92,8 +92,10 @@ class RestartAtLM {
                     position = position.getPosition();
                 }
                 if (position.getPosition() == null) {
-                    position.getLM().getFObj().setForceKeepTogether(true);
-                    invalidPosition = true;
+                    if (!position.getLM().getFObj().isForceKeepTogether()) {
+                        position.getLM().getFObj().setForceKeepTogether(true);
+                        invalidPosition = true;
+                    }
                     return null;
                 }
                 restartAtLM = position.getPosition().getLM();
index d19642ab5aabee6dc8e8d6d63d7b3fca42f775aa..60d05b58126502bf9e95cfc68a8b04d65deba84d 100644 (file)
@@ -651,8 +651,13 @@ public class LineLayoutManager extends InlineStackingLayoutManager
      */
     public List getNextKnuthElements(LayoutContext context, int alignment,
             LeafPosition restartPosition) {
-        log.trace("Restarting line breaking from index " + restartPosition.getIndex());
-        int parIndex = restartPosition.getLeafPos();
+        int parIndex = 0;
+        int restartPositionIdx = 0;
+        if (restartPosition != null) {
+            log.trace("Restarting line breaking from index " + restartPosition.getIndex());
+            parIndex = restartPosition.getLeafPos();
+            restartPositionIdx = restartPosition.getIndex();
+        }
 
         for (int i = 0; i < parIndex; i++) {
             knuthParagraphs.remove(0);
@@ -664,7 +669,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
             ((Paragraph) paragraph).ignoreAtStart = 0;
             isFirstInBlock = false;
         }
-        paragraph.subList(0, restartPosition.getIndex() + 1).clear();
+        paragraph.subList(0, restartPositionIdx + 1).clear();
         Iterator<KnuthElement> iter = paragraph.iterator();
         while (iter.hasNext() && !iter.next().isBox()) {
             iter.remove();
diff --git a/fop/test/layoutengine/standard-testcases/flow_changing-ipd_7.xml b/fop/test/layoutengine/standard-testcases/flow_changing-ipd_7.xml
new file mode 100644 (file)
index 0000000..9da3cd0
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+  <info>
+    <p>
+      This test checks that a list can be relaid out when a change in ipd happens across pages.
+    </p>
+  </info>
+  <fo>
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="PageFront" page-width="8.5in" page-height="11in" margin-bottom="0in" margin-right="0in" margin-top="0in" margin-left="0in">
+      <fo:region-body margin-bottom="1in" margin-right="3.1in" margin-top="4.5in" margin-left="1in" region-name="letterPageBody"/>     
+    </fo:simple-page-master>
+    <fo:simple-page-master master-name="PageRest" page-width="8.5in" page-height="11in" margin-bottom="0in" margin-right="0in" margin-top="0in" margin-left="0in">
+      <fo:region-body margin-bottom="1in" margin-right="1in" margin-top="1in" margin-left="1in" region-name="letterPageBody"/>
+    </fo:simple-page-master>
+    <fo:page-sequence-master master-name="LetterPages">
+      <fo:repeatable-page-master-alternatives>
+        <fo:conditional-page-master-reference page-position="first" master-reference="PageFront"/>
+        <fo:conditional-page-master-reference page-position="rest" master-reference="PageRest"/>
+        <fo:conditional-page-master-reference page-position="last" master-reference="PageRest"/>
+      </fo:repeatable-page-master-alternatives>
+    </fo:page-sequence-master>
+  </fo:layout-master-set>
+  <fo:page-sequence format="1" id="th_default_sequence6" initial-page-number="auto" master-reference="LetterPages">
+    <fo:flow flow-name="letterPageBody">
+      <fo:block>        
+        <fo:block>
+          <fo:inline>
+            <fo:leader/>
+            <fo:block break-before="page"/>Call if you need us</fo:inline>
+        </fo:block>
+        <fo:block>
+          <fo:block break-before="page"/>
+        </fo:block>
+      </fo:block>
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
+  </fo>
+  <checks>
+    <eval expected="4" xpath="count(//pageViewport)" />
+    <eval expected="Call" xpath="//pageViewport[3]//word[1]" />
+  </checks>
+</testcase>