Applets y LiveConnect en Firefox

Holas. Ultimamente estuve metiendo mano en un Applet de Java embebido en un Sistema Web, que entre otras cosas, lo que hacía era ejecutar lo siguiente:

import java.applet.Applet;
import netscape.javascript.JSException;
import netscape.javascript.JSObject;

public class imprimesecescape01 extends Applet {
  public void paint(Graphics g) {
      // .... código Java haciendo lo que hace el Applet ...
      // Al finalizar:
      try {
          JSObject jsobject = JSObject.getWindow(this);

          // windowClose es una función Javascript que
          // está en el HTML que sólo llama a window.close();
          jsobject.call("windowClose", null);

      } catch(JSException jsexception) {
          g.drawString("caught JS: " + jsexception, 20, 20);
      }
  }
}

Es decir, este Applet utiliza las clases de LiveConnect del navegador para llamar a la función JavaScript windowClose() residente en el HTML, que a su vez llama a window.close(). Todo para que, una vez que se ejecutó el código del applet, se cierre la ventana.

Esto en IE (previamente el único navegador soportado por el sistema) funciona. Pero en Firefox no. Después de investigar, tenía un problema y un bug en mi applet:

1- Un bug en el applet: El applet no se ejecutaba a menos que el tag APPLET especificara algo mayor a 0 en el width y el height. Encontré este bug, pero aparece como RESOLVED. Al principio, pensé que había una regresión del bug. Revisando y pensando un poquito, el comportamiento que mostraba Firefox estaba bien, mientras que el de IE estaba mal.

Por qué? Simple:
Pregunta: cuándo se ejecuta el método paint()?
Respuesta: cuando hay que dibujar el applet en su área asignada en la página.

Entonces, si el área a dibujar es de 0 pixeles de ancho y 0 de alto, para qué ejecutar el método paint? Justamente, Firefox no debía dibujar nada, entonces no llamaba a paint()… mientras que IE lo ejecutaba igual… grrr..

Al final, fue tanto como mudar el ćodigo de paint() a start() (que se ejecuta únicamente cuando el navegador arranca el applet), y listo el pollo. 😀

2- Un problema: El código que está arriba (el del applet), que llama a windowClose(), colgaba el firefox! Encontré este otro bug (del 2001!), que tiene un workaround:

try {
  JSObject jsobject = JSObject.getWindow(this);
  jsobject.eval("setTimeout(\"windowClose()\",100)");
} catch(JSException jsexception) {
  g.drawString("caught JS: " + jsexception, 20, 20);
}

Si claro, es un hack, pero funciona tanto en Firefox como en Explorer, así que ahora mi applet funciona y el sistema ahora está «portado» a Firefox/Linux también! 😀

«Todo sea por un cacho más de libertad» 😛

Marcelo


Comentarios

2 respuestas a «Applets y LiveConnect en Firefox»

  1. Avatar de Rachmaninov
    Rachmaninov

    ¡Cordial saludos Marcelo!

    Agradezco sinceramente la información prestada en esta entrada, me fue de mucha utilidad. Debo agregar, que el problema no es sólo con el método «paint», ocurre también con los métodos «init» y «startup», es decir, el Applet parece simplemente no responder con su tamaño en cero. El ambiente de ejecución donde se me presentó el inconveniente es Firefox 2.0.0.6 en Linux/Ubuntu 7.10.

    El asunto es muy complicado de juzgar a primera vista, no sé si el grupo Mozilla/Firefox hace bien asumir que el Applet es un elemento gráfico y al no tener tamaño es invisible y por lo tanto no debe tener funcionamiento alguno ó los de Microsoft/IE hacen bien asumir que un Applet puede ser invisible y contener una funcionalidad. Personalmente me inclino por la idea de Firefox.

  2. Avatar de Marcelo

    Hola!
    Bueno, si bien hace mucho que postié esto, no sabía que el bug sucedía con el resto de los métodos.

    Somos presos de los navegadores, je. 🙂

    Saludos!
    Marcelo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *