-
Notifications
You must be signed in to change notification settings - Fork 2

Description
Replicate
-
Create an SVG file with an unused reference. This can happen by editing an SVG created in Adobe Illustrator with Inkscape and removing objects. See e.svg.txt. Essentially:
<clipPath id="SVGID_00000145770309263158979710000005844928936766913719_"> <use xlink:href="#SVGID_00000072257059765744298700000011011170644502566322_" id="use3" /> </clipPath>
-
Rasterize the file using EchoSVG.
Expected
The unused reference is ignored and rasterizing continues. This is the behaviour that Inkscape takes, which permits it to load the image:
Actual
Exception is thrown and the image is not rasterized.
io.sf.carte.echosvg.bridge.BridgeException: file:community.svg:-1
Cannot find the referenced element:
"#SVGID_00000072257059765744298700000011011170644502566322_"
specified on the element <use> - may be a problem of 'id'
The root cause is BridgeContext.java
, line 752, where it is assumed incorrectly that all such Element
instances have a valid Node
reference:
Node ref = ur.getNode(uri, e);
if (ref == null) {
throw new BridgeException(this, e, ERR_URI_BAD_TARGET, new Object[] { uri });
This exception is caught by SVGAbstractTransformer
at line 261 and wrapped into a new exception:
throw new TranscoderException(ex);
By the time it is wrapped and re-thrown as a TranscoderException
, it's too late to intervene. Perhaps instead of creating a BridgeException
, there needs to be an UndefinedReferenceException
subclass of BridgeException
? That way the exception can still be caught by SVGAbstractTransformer
yet passed along to the ErrorHandler
instead of being wrapped and re-thrown?
Another idea would be to create an "Empty" node/element to represent a missing reference, but that would needlessly clutter the DOM or have any number of unintended side-effects, I imagine, because getReferencedNode
is used in many places.