Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
1.8
-
None
-
None
-
first noticed on windows 7, jdk 1.8
Description
when trying to dynamically animate a color change for a text element, got a null pointer exception in the SVGOMAnimationElement:beginElement() method because getSvgContext was returning null.
introspection with a debugger turned up the fact that in SVGTextElementBridge.handleDOMNodeInsertedEvent(MutationEvent evt) the setting of the svg context was not being done. this is called when the animation element is appended as a child to the text element.
SVGTextElementBridge extends AbstractGraphicsNodeBridge and in particular overrides handleDOMNodeInsertedEvent(MutationEvent evt) which would normally set the svg context.
as a local fix changing SVGTextElementBridge.handleDOMNodeInsertedEvent(MutationEvent evt) and how it handles an ELEMENT node from:
public void handleDOMNodeInsertedEvent(MutationEvent evt) { Node childNode = (Node)evt.getTarget(); //check the type of the node inserted before discard the layout //in the case of <title> or <desc> or <metadata>, the layout //is unchanged switch(childNode.getNodeType()) { case Node.TEXT_NODE: // fall-through is intended case Node.CDATA_SECTION_NODE: laidoutText = null; break; case Node.ELEMENT_NODE: { Element childElement = (Element)childNode; if (isTextChild(childElement)) { addContextToChild(ctx, childElement); laidoutText = null; } break; } } if (laidoutText == null) { computeLaidoutText(ctx, e, getTextNode()); } }
–
to fix, added else to isTextChild conditional, to:
public void handleDOMNodeInsertedEvent(MutationEvent evt) { Node childNode = (Node)evt.getTarget(); //check the type of the node inserted before discard the layout //in the case of <title> or <desc> or <metadata>, the layout //is unchanged switch(childNode.getNodeType()) { case Node.TEXT_NODE: // fall-through is intended case Node.CDATA_SECTION_NODE: laidoutText = null; break; case Node.ELEMENT_NODE: { Element childElement = (Element)childNode; if (isTextChild(childElement)) { addContextToChild(ctx, childElement); laidoutText = null; } // ADDED ELSE so animation nodes get std treatment else { super.handleDOMNodeInsertedEvent(evt); } break; } } if (laidoutText == null) { computeLaidoutText(ctx, e, getTextNode()); } }
–
not clear that this is a complete fix or not.