diff options
author | Andreas L. Delmelle <adelmelle@apache.org> | 2009-08-20 21:15:52 +0000 |
---|---|---|
committer | Andreas L. Delmelle <adelmelle@apache.org> | 2009-08-20 21:15:52 +0000 |
commit | b0ece6c49dde5f2ddc6c38338e51a1e8d9131264 (patch) | |
tree | 49e4efdbb75ee673574cee45ed47496e171cf960 | |
parent | fddf572a55a9b159af1820d2ba2f199bd5c2503c (diff) | |
download | xmlgraphics-fop-b0ece6c49dde5f2ddc6c38338e51a1e8d9131264.tar.gz xmlgraphics-fop-b0ece6c49dde5f2ddc6c38338e51a1e8d9131264.zip |
Bugzilla 47710: White-space handling in retrieved markers throws a NullPointerException in some cases.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@806361 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/java/org/apache/fop/fo/FOTreeBuilder.java | 8 | ||||
-rw-r--r-- | src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java | 12 | ||||
-rw-r--r-- | status.xml | 6 | ||||
-rw-r--r-- | test/layoutengine/standard-testcases/marker_white-space_npe.xml | 77 |
4 files changed, 101 insertions, 2 deletions
diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java index 7c77f0697..b1fe3bc13 100644 --- a/src/java/org/apache/fop/fo/FOTreeBuilder.java +++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java @@ -39,6 +39,7 @@ import org.apache.fop.apps.FormattingResults; import org.apache.fop.area.AreaTreeHandler; import org.apache.fop.fo.ElementMapping.Maker; import org.apache.fop.fo.extensions.ExtensionElementMapping; +import org.apache.fop.fo.extensions.pdf.PDFExtensionElementMapping; import org.apache.fop.fo.pagination.Root; import org.apache.fop.util.ContentHandlerFactory; import org.apache.fop.util.ContentHandlerFactory.ObjectBuiltListener; @@ -263,7 +264,8 @@ public class FOTreeBuilder extends DefaultHandler { } } else { // check that incoming node is valid for currentFObj if (currentFObj.getNamespaceURI().equals(FOElementMapping.URI) - || currentFObj.getNamespaceURI().equals(ExtensionElementMapping.URI)) { + || currentFObj.getNamespaceURI().equals(ExtensionElementMapping.URI) + || currentFObj.getNamespaceURI().equals(PDFExtensionElementMapping.URI)) { currentFObj.validateChildNode(locator, namespaceURI, localName); } } @@ -277,6 +279,7 @@ public class FOTreeBuilder extends DefaultHandler { rootFObj.setBuilderContext(builderContext); rootFObj.setFOEventHandler(foEventHandler); } + builderContext.foIndex++; propertyList = foNode.createPropertyList( currentPropertyList, foEventHandler); foNode.processNode(localName, getEffectiveLocator(), @@ -288,6 +291,9 @@ public class FOTreeBuilder extends DefaultHandler { builderContext.switchMarkerContext(true); } } + if (foNode.getNameId() == Constants.FO_PAGE_SEQUENCE) { + builderContext.getXMLWhiteSpaceHandler().reset(); + } } catch (IllegalArgumentException e) { throw new SAXException(e); } diff --git a/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java b/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java index cad9fb729..51e84551c 100644 --- a/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java +++ b/src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java @@ -234,6 +234,18 @@ public class XMLWhiteSpaceHandler { } /** + * Reset the handler, release all references + */ + protected final void reset() { + if (pendingInlines != null) { + pendingInlines.clear(); + } + nestedBlockStack.clear(); + charIter = null; + firstWhiteSpaceInSeq = null; + } + + /** * Handle white-space for the fo that is passed in, starting at * firstTextNode (when a nested FO is encountered) * @param fo the FO for which to handle white-space diff --git a/status.xml b/status.xml index 17787f883..57ea52204 100644 --- a/status.xml +++ b/status.xml @@ -58,8 +58,12 @@ documents. Example: the fix of marks layering will be such a case when it's done. --> <release version="FOP Trunk" date="TBD"> + <action context="Code" dev="AD" type="fix" fixes-bug="47710"> + White-space handling in markers with inline-content throws a NullPointerException + in some cases. + </action> <action context="Renderers" dev="CB" type="fix" fixes-bug="47694"> - Dithered Background Shading can produce illegal AFP if objects are very small + Dithered Background Shading can produce illegal AFP if objects are very small </action> <action context="Renderers" dev="CB" type="add"> AFP Output: Added support for IMM Extension on fo:simple-page-master. diff --git a/test/layoutengine/standard-testcases/marker_white-space_npe.xml b/test/layoutengine/standard-testcases/marker_white-space_npe.xml new file mode 100644 index 000000000..f9f8e0313 --- /dev/null +++ b/test/layoutengine/standard-testcases/marker_white-space_npe.xml @@ -0,0 +1,77 @@ +<?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 for a potential NPE after white-space handling
+ for retrieved markers with only inline content.
+ </p>
+ </info>
+ <fo>
+ <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master margin-right="6mm" margin-left="7mm" margin-bottom="4mm" margin-top="5mm" page-width="210mm" page-height="297mm" master-name="letterPageFront">
+ <fo:region-body margin-right="59mm" margin-left="8mm" margin-top="53mm" margin-bottom="57mm" region-name="letterPageBody"/>
+ <fo:region-after precedence="false" extent="52mm" region-name="letterPageFooter"/>
+ <fo:region-end precedence="true" extent="49mm" region-name="letterPageSidebar"/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence initial-page-number="1" page-break-before="right" master-reference="letterPageFront">
+ <fo:flow flow-name="letterPageBody">
+ <fo:block>page 1</fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ <fo:page-sequence master-reference="letterPageFront">
+ <fo:static-content flow-name="letterPageFooter">
+ <fo:block text-align="right" margin-right="1cm" margin-left="8mm">
+ <fo:retrieve-marker retrieve-position="last-ending-within-page" retrieve-boundary="page-sequence" retrieve-class-name="statementFooterMarker"/>
+ </fo:block>
+ </fo:static-content>
+ <fo:flow flow-name="letterPageBody">
+ <fo:block>
+ <fo:block font="bold 16pt Arial">
+ <fo:block>
+ <fo:marker marker-class-name="statementFooterMarker">
+ <fo:inline font-family="HelveticaNeue-LightCond" font-size="11pt" line-height="13pt" text-align="right">Test Marker</fo:inline>
+ </fo:marker>
+ </fo:block>
+ </fo:block>
+ <fo:block break-before="page">
+ <fo:block>
+ <fo:marker marker-class-name="statementFooterMarker"/>
+ </fo:block>
+ </fo:block>
+ </fo:block>
+ <fo:block id="TH_LastPage"/>
+ </fo:flow>
+ </fo:page-sequence>
+ <fo:page-sequence master-reference="letterPageFront">
+ <fo:static-content flow-name="letterPageSidebar">
+ <fo:block-container height="284mm">
+ <fo:block> </fo:block>
+ </fo:block-container>
+ </fo:static-content>
+ <fo:flow break-before="odd-page" flow-name="letterPageBody">
+ <fo:block>last page</fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </fo:root>
+ </fo>
+ <checks /><!-- none except the default; simply check for non-occurrence of NPE -->
+</testcase>
|