Package test.shared

Source Code of test.shared.TestScriptInsertion

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package test.shared;

import java.io.Serializable;
import org.itsnat.core.ClientDocument;
import org.itsnat.core.ItsNatDocument;
import org.itsnat.core.event.ItsNatEvent;
import org.itsnat.core.http.ItsNatHttpSession;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.html.HTMLDocument;

/**
*
* @author jmarranz
*/
public abstract class TestScriptInsertion implements EventListener,Serializable
{
    protected ItsNatDocument itsNatDoc;

    public TestScriptInsertion(ItsNatDocument itsNatDoc)
    {
        this.itsNatDoc = itsNatDoc;
    }

    public abstract void addLoadEventListener();

    public void handleEvent(Event evt)
    {
        EventListener listener = new EventListenerSerial()
        {
            public void handleEvent(Event evt)
            {
                testAddScripts();
            }
        };

        // Evitamos ejecutar el test como parte del evento load pues en el evento load el contexto es window (el currentTarget)
        // y queremos probar que el contexto sea autom�ticamente window
        ClientDocument clientDoc = ((ItsNatEvent)evt).getClientDocument();
        clientDoc.addContinueEventListener(null, listener);
    }

    public void testAddScripts()
    {
        testAddScript(true);
        testAddScript(false);
    }

    public void testAddScript(boolean before)
    {
        Document doc = itsNatDoc.getDocument();
        Element script = createScriptElement();
        // No usamos window.itsNatTestScript para comprobar que el contexto
        // de ejecuci�n del <script> es window pues as� vemos si
        // una funci�n declarada en el <script> ser� visible a nivel de window (globalmente).
        StringBuilder code = new StringBuilder();
        code.append("if ((typeof window.itsNatTestScript != 'undefined') && window.itsNatTestScript) alert('ERROR: TestScriptInsertion, duplicated execution ' + window.itsNatTestScript);");
        code.append("itsNatTestScript = true; ");
        Node text;
        //if ("text/html".equals(itsNatDoc.getItsNatDocumentTemplate().getMIME()))
        if (doc instanceof HTMLDocument) // MIME HTML y XHTML
            text = doc.createTextNode(code.toString());
        else // SVG, XUL
            text = doc.createCDATASection(code.toString());

        Element rootElem = getScriptParentElement();
        if (before)
        {
            script.appendChild(text);
            rootElem.appendChild(script);
        }
        else
        {
            rootElem.appendChild(script);
            script.appendChild(text);
        }

        itsNatDoc.addCodeToSend("if (!window.itsNatTestScript) { alert('ERROR TestScriptInsertion'); throw 'ERROR'; } \n");
        itsNatDoc.addCodeToSend("window.itsNatTestScript = false; "); // Para detectar doble ejecuci�n
        itsNatDoc.addCodeToSend("try{ delete window.itsNatTestScript; } catch(e){ }\n"); // Quitamos la propiedad, el try/catch es por si acaso el delete no vale.

        rootElem.removeChild(script);
    }

    public abstract Element getScriptParentElement();

    public abstract Element createScriptElement();
}
TOP

Related Classes of test.shared.TestScriptInsertion

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.