deweese 2003/08/27 16:33:22 Modified: samples/tests/spec/scripting eventAttrAdd.svg sources/org/apache/batik/bridge FontFace.java SVGAltGlyphHandler.java test-resources/org/apache/batik/bridge externalResourcesAccess.svg unitTesting.xml test-sources/org/apache/batik/bridge ExternalResourcesTest.java Log: 1) Better user notification when fetching a font face fails for security reasons. 2) Improved the external resource access test. Revision Changes Path 1.2 +7 -2 xml-batik/samples/tests/spec/scripting/eventAttrAdd.svg Index: eventAttrAdd.svg =================================================================== RCS file: /home/cvs/xml-batik/samples/tests/spec/scripting/eventAttrAdd.svg,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- eventAttrAdd.svg 14 Aug 2003 00:53:51 -0000 1.1 +++ eventAttrAdd.svg 27 Aug 2003 23:33:22 -0000 1.2 @@ -95,7 +95,12 @@ root.removeAttributeNS(null, "onzoom"); setRect('c', 'gold'); // It should stay gold. root.currentScale = 1.0; - if (inRegard) + if (inRegard) { + setTimeout(done, 500); + } + } + + function done() { regardTestInstance.scriptDone(); } 1.4 +36 -3 xml-batik/sources/org/apache/batik/bridge/FontFace.java Index: FontFace.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/FontFace.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- FontFace.java 9 Aug 2003 16:58:37 -0000 1.3 +++ FontFace.java 27 Aug 2003 23:33:22 -0000 1.4 @@ -75,7 +75,8 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Bella Robinson</a> * @version $Id$ */ -public abstract class FontFace extends GVTFontFace { +public abstract class FontFace extends GVTFontFace + implements ErrorConstants { static Set fontSet; static { @@ -153,6 +154,14 @@ GVTFontFamily ff = getFontFamily(ctx, (ParsedURL)o); if (ff != null) return ff; + } catch (SecurityException ex) { + // Security violation notify the user but keep going. + ctx.getUserAgent().displayError(ex); + } catch (BridgeException ex) { + // If Security violation notify + // the user but keep going. + if (ERR_URI_UNSECURE.equals(ex.getCode())) + ctx.getUserAgent().displayError(ex); } catch (Throwable t) { // Do nothing couldn't get Referenced URL. } @@ -168,9 +177,33 @@ protected GVTFontFamily getFontFamily(BridgeContext ctx, ParsedURL purl) { String purlStr = purl.toString(); + + Element e = getBaseElement(ctx); + SVGDocument svgDoc = (SVGDocument)e.getOwnerDocument(); + String docURL = svgDoc.getURL(); + ParsedURL pDocURL = null; + if (docURL != null) + pDocURL = new ParsedURL(docURL); + + // try to load an SVG document + String baseURI = XMLBaseSupport.getCascadedXMLBase(e); + purl = new ParsedURL(baseURI, purlStr); + UserAgent userAgent = ctx.getUserAgent(); + + try { + userAgent.checkLoadExternalResource(purl, pDocURL); + } catch (SecurityException ex) { + // Can't load font - Security violation. + // We should not throw the error that is for certain, just + // move down the font list, but do we display the error or not??? + // I'll vote yes just because it is a security exception (other + // exceptions like font not available etc I would skip). + userAgent.displayError(ex); + return null; + } + if (purl.getRef() != null) { // Reference must be to a SVGFont. - Element e = getBaseElement(ctx); Element ref = ctx.getReferencedElement(e, purlStr); if (!ref.getNamespaceURI().equals(SVG_NAMESPACE_URI) || !ref.getLocalName().equals(SVG_FONT_TAG)) { 1.8 +6 -5 xml-batik/sources/org/apache/batik/bridge/SVGAltGlyphHandler.java Index: SVGAltGlyphHandler.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGAltGlyphHandler.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- SVGAltGlyphHandler.java 8 Aug 2003 11:38:51 -0000 1.7 +++ SVGAltGlyphHandler.java 27 Aug 2003 23:33:22 -0000 1.8 @@ -93,14 +93,15 @@ * @return The GVTGlyphVector containing the alternate glyphs, or null if * the alternate glyphs could not be found. */ - public GVTGlyphVector createGlyphVector(FontRenderContext frc, float fontSize, - AttributedCharacterIterator aci) { + public GVTGlyphVector createGlyphVector + (FontRenderContext frc, float fontSize, + AttributedCharacterIterator aci) { try { if (textElement.getTagName().equals(SVG_ALT_GLYPH_TAG)) { SVGAltGlyphElementBridge altGlyphBridge = (SVGAltGlyphElementBridge)ctx.getBridge(textElement); - Glyph[] glyphArray - = altGlyphBridge.createAltGlyphArray(ctx, textElement, fontSize, aci); + Glyph[] glyphArray = altGlyphBridge.createAltGlyphArray + (ctx, textElement, fontSize, aci); if (glyphArray != null) { return new SVGGVTGlyphVector(null, glyphArray, frc); } 1.3 +2 -2 xml-batik/test-resources/org/apache/batik/bridge/externalResourcesAccess.svg Index: externalResourcesAccess.svg =================================================================== RCS file: /home/cvs/xml-batik/test-resources/org/apache/batik/bridge/externalResourcesAccess.svg,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- externalResourcesAccess.svg 8 Aug 2003 11:39:42 -0000 1.2 +++ externalResourcesAccess.svg 27 Aug 2003 23:33:22 -0000 1.3 @@ -65,7 +65,7 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:test="http://xml.apache.org/batik/test" width="450" height="500" viewBox="0 0 450 500" - test:targetids="use, image, feImage, tref, textPath, color-profile, linearGradientA, linearGradientB, radialGradientA, radialGradientB, patternA, patternB, filterA, filterB , font-face-uri"> + test:targetids="use, image, feImage, tref, textPath, color-profile, linearGradientA, linearGradientB, radialGradientA, radialGradientB, patternA, patternB, filterA,filterB , font-face-uri, altGlyph, glyphRef"> <script><![CDATA[ 1.8 +3 -3 xml-batik/test-resources/org/apache/batik/bridge/unitTesting.xml Index: unitTesting.xml =================================================================== RCS file: /home/cvs/xml-batik/test-resources/org/apache/batik/bridge/unitTesting.xml,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- unitTesting.xml 8 Aug 2003 11:39:42 -0000 1.7 +++ unitTesting.xml 27 Aug 2003 23:33:22 -0000 1.8 @@ -116,10 +116,10 @@ value="false" /> </test> - <test id="externalResourcesAccess" + <test id="externalResourcesAccess.secure" class="org.apache.batik.bridge.ExternalResourcesTest" /> - <test id="externalResourcesAccess" + <test id="externalResourcesAccess.unsecure" class="org.apache.batik.bridge.ExternalResourcesTest" > <property name="Secure" class="java.lang.Boolean" value="false" /> 1.5 +83 -37 xml-batik/test-sources/org/apache/batik/bridge/ExternalResourcesTest.java Index: ExternalResourcesTest.java =================================================================== RCS file: /home/cvs/xml-batik/test-sources/org/apache/batik/bridge/ExternalResourcesTest.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- ExternalResourcesTest.java 9 Aug 2003 16:58:43 -0000 1.4 +++ ExternalResourcesTest.java 27 Aug 2003 23:33:22 -0000 1.5 @@ -62,6 +62,7 @@ import org.w3c.dom.Node; import org.apache.batik.dom.svg.SAXSVGDocumentFactory; +import org.apache.batik.gvt.GraphicsNode; import org.apache.batik.test.AbstractTest; import org.apache.batik.test.DefaultTestReport; import org.apache.batik.test.TestReport; @@ -93,7 +94,8 @@ * @version $Id$ */ -public class ExternalResourcesTest extends AbstractTest { +public class ExternalResourcesTest extends AbstractTest + implements ErrorConstants { /** * Error when the input file cannot be loaded into a * Document object @@ -179,6 +181,11 @@ public static final String INSERTION_POINT_ID = "insertionPoint"; /** + * Location of test files in filesystem. + */ + public static final String FILE_DIR = + "test-resources/org/apache/batik/bridge/"; + /** * Controls whether the test works in secure mode or not */ protected boolean secure = true; @@ -187,7 +194,12 @@ public void setId(String id){ super.setId(id); - svgURL = resolveURL("test-resources/org/apache/batik/bridge/" + id + ".svg"); + String file = id; + int idx = file.indexOf('.'); + if (idx != -1) { + file = file.substring(0,idx); + } + svgURL = resolveURL(FILE_DIR + file + ".svg"); } public Boolean getSecure(){ @@ -267,32 +279,40 @@ // Do an initial processing to validate that the external // stylesheet causes a SecurityException // - UserAgent userAgent = buildUserAgent(); + MyUserAgent userAgent = buildUserAgent(); GVTBuilder builder = new GVTBuilder(); BridgeContext ctx = new BridgeContext(userAgent); ctx.setDynamic(true); // We expect either a SecurityException or a BridgeException // with ERR_URI_UNSECURE. + Throwable th = null; try { - builder.build(ctx, doc); - if (secure) { - failures.addElement(EXTERNAL_STYLESHEET_ID); - } + GraphicsNode gn = builder.build(ctx, doc); + gn.getBounds(); + th = userAgent.getDisplayError(); } catch (BridgeException e){ - if (!secure - || - (secure && !ErrorConstants.ERR_URI_UNSECURE.equals(e.getCode()))) { + th = e; + } catch (SecurityException e) { + th = e; + } catch (Throwable t) { + th = t; + } + if (th == null) { + if (secure) + failures.addElement(EXTERNAL_STYLESHEET_ID); + } else if (th instanceof SecurityException) { + if (!secure) + failures.addElement(EXTERNAL_STYLESHEET_ID); + } else if (th instanceof BridgeException) { + BridgeException be = (BridgeException)th; + if (!secure || + (secure && !ERR_URI_UNSECURE.equals(be.getCode()))) { report.setErrorCode(ERROR_WHILE_PROCESSING_SVG_DOCUMENT); report.addDescriptionEntry(ENTRY_KEY_ERROR_DESCRIPTION, - e.getMessage()); + be.getMessage()); report.setPassed(false); return report; - } - - } catch (SecurityException e) { - if (!secure) { - failures.addElement(EXTERNAL_STYLESHEET_ID); } } @@ -355,29 +375,43 @@ } insertionPoint.appendChild(target); - + th = null; try { - builder.build(ctx, cloneDoc); - if (secure) { - // If we get here, it means that no SecurityException - // was thrown, which is wrong. - failures.addElement(id); - } + GraphicsNode gn = builder.build(ctx, cloneDoc); + gn.getBounds(); + th = userAgent.getDisplayError(); } catch (BridgeException e){ - if (!secure - || - (secure && !ErrorConstants.ERR_URI_UNSECURE.equals(e.getCode()))) { + th = e; + } catch (SecurityException e) { + th = e; + } catch (Throwable t) { + th = t; + } + if (th == null) { + if (secure) + failures.addElement(id); + } else if (th instanceof SecurityException) { + if (!secure) + failures.addElement(id); + } else if (th instanceof BridgeException) { + BridgeException be = (BridgeException)th; + if (!secure || + (secure && !ERR_URI_UNSECURE.equals(be.getCode()))) { report.setErrorCode(ERROR_WHILE_PROCESSING_SVG_DOCUMENT); report.addDescriptionEntry(ENTRY_KEY_ERROR_DESCRIPTION, - e.getMessage()); + be.getMessage()); report.setPassed(false); return report; } - } catch (SecurityException e) { - if (!secure) { - failures.addElement(id); - } + } else { + // Some unknown exception was displayed... + report.setErrorCode(ERROR_WHILE_PROCESSING_SVG_DOCUMENT); + report.addDescriptionEntry(ENTRY_KEY_ERROR_DESCRIPTION, + th.getMessage()); + report.setPassed(false); + return report; } + } if (failures.size() == 0) { @@ -402,7 +436,11 @@ return report; } - protected UserAgent buildUserAgent(){ + protected interface MyUserAgent extends UserAgent { + public Exception getDisplayError(); + } + + protected MyUserAgent buildUserAgent(){ if (secure) { return new SecureUserAgent(); } else { @@ -410,17 +448,26 @@ } } - class SecureUserAgent extends UserAgentAdapter { + class MyUserAgentAdapter extends UserAgentAdapter implements MyUserAgent { + Exception ex = null; + public void displayError(Exception ex) { + this.ex = ex; + super.displayError(ex); + } + + public Exception getDisplayError() { return ex; } + } + + class SecureUserAgent extends MyUserAgentAdapter { public ExternalResourceSecurity getExternalResourceSecurity(ParsedURL resourcePURL, ParsedURL docPURL){ return new NoLoadExternalResourceSecurity(); } - } - class RelaxedUserAgent extends UserAgentAdapter { + class RelaxedUserAgent extends MyUserAgentAdapter { public ExternalResourceSecurity getExternalResourceSecurity(ParsedURL resourcePURL, ParsedURL docPURL){ @@ -428,7 +475,6 @@ docPURL); } - } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]