/** Tries to build a GVTFontFamily from a URL reference */ 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 = AbstractNode.getBaseURI(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 ref = ctx.getReferencedElement(e, purlStr); if (!ref.getNamespaceURI().equals(SVG_NAMESPACE_URI) || !ref.getLocalName().equals(SVG_FONT_TAG)) { return null; } SVGDocument doc = (SVGDocument) e.getOwnerDocument(); SVGDocument rdoc = (SVGDocument) ref.getOwnerDocument(); Element fontElt = ref; if (doc != rdoc) { fontElt = (Element) doc.importNode(ref, true); String base = AbstractNode.getBaseURI(ref); Element g = doc.createElementNS(SVG_NAMESPACE_URI, SVG_G_TAG); g.appendChild(fontElt); g.setAttributeNS(XMLConstants.XML_NAMESPACE_URI, "xml:base", base); CSSUtilities.computeStyleAndURIs(ref, fontElt, purlStr); } // Search for a font-face element Element fontFaceElt = null; for (Node n = fontElt.getFirstChild(); n != null; n = n.getNextSibling()) { if ((n.getNodeType() == Node.ELEMENT_NODE) && n.getNamespaceURI().equals(SVG_NAMESPACE_URI) && n.getLocalName().equals(SVG_FONT_FACE_TAG)) { fontFaceElt = (Element) n; break; } } // todo : if the above loop fails to find a fontFaceElt, a null is passed to createFontFace() SVGFontFaceElementBridge fontFaceBridge; fontFaceBridge = (SVGFontFaceElementBridge) ctx.getBridge(SVG_NAMESPACE_URI, SVG_FONT_FACE_TAG); GVTFontFace gff = fontFaceBridge.createFontFace(ctx, fontFaceElt); return new SVGFontFamily(gff, fontElt, ctx); } // Must be a reference to a 'Web Font'. try { return ctx.getFontFamilyResolver().loadFont(purl.openStream(), this); } catch (Exception ex) { } return null; }