Uploaded image for project: 'Batik'
  1. Batik
  2. BATIK-1144

a text animation faults with null pointer exception, when scripting with java

    XMLWordPrintableJSON

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.

      Attachments

        Activity

          People

            Unassigned Unassigned
            mitchb mitchell bass
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: