El plugin ActiveX de Macromedia Flash, al menos en la versión 7.0.19, retorna el valor -1, cuándo se invoca a getBytesTotal(), y el sistema todavía no sabe que peso tiene el recurso que estamos intentando cargar. Una vez se han obtenido las cabeceras HTTP, el valor retornado, es ya el tamaño real del archivo.

Por contra, la otra versión del reproductor para Windows, válida para Netscape, Mozilla, Firefox, y Opera, retorna 0 cuando todavía no se conoce el tamaño del archivo.

Esto hace que las típicas fórmulas que se usan en los preloaders para calcular el porcentaje de carga, den un valor NaN (Not a Number), durante el comienzo del proceso de carga en estos navegadores.

La documentación de ActionScript, no menciona en ningún lado esta diferencia de comportamiento. Tanto es así, que hasta el propio ejemplo que incluyen, fallaría en los navegadores alternativos a Internet Explorer (intentaría escalar un MovieClip a NaN).

En mi opinión, que todavía no se sepa el tamaño del archivo, es una condición excepcional, y por ello estoy de acuerdo en señalarla con -1 como hace el control ActiveX. Si se retorna 0, entonces no hay manera de saber si es que el tamaño del fichero son 0 bytes, o es que todavía no se conoce el valor.

Es lógico suponer, que el reproductor de Flash, no parte del mismo código en la versión Internet Explorer que en la versión Netscape. No me refiero únicamente a que la especificación del propio plugin sea diferente, sino que además es probable que se deleguen ciertas tareas al navegador sobre el que trabajan. Si esto es cierto, querría decir que Flash, solicita al navegador la carga de un recurso HTTP, y el propio navegador es el encargado de gestionar el proceso y darle el resultado. Por tanto, puede que simplemente el plugin de Flash, no corrija el valor de bytes totales retornado por cada uno de los navegadores, que permitirían tener un criterio unificado entre distintas plataformas.

La versión 7.0.19 es la última disponible hasta el momento, por lo que probablemente con ediciones más antiguas, ocurrirá lo mismo. En plataformas no Windows, no tengo datos del comportamiento.

Para solucionar este problema, a la espera de que Macromedia se encargue de unificar los criterios, y devolver a Flash la portabilidad que claman a bombo y platillo, antes de acceder a getBytesTotal(), deberéis aseguraros que no es 0.

A continuación un ejemplo de preloader tradicional, y la versión apta también para Firefox/Seamonkey/Netscape/Opera:

Versión no portable

iPercent=getBytesLoaded()*100/getBytesTotal();
if (iPercent>=100)
{
...
}
...

Versión portable

if (getBytesTotal()>0)
{
iPercent=getBytesLoaded()*100/getBytesTotal();
}
else
{
iPercent=0;
}
if (iPercent>=100)
{
...
}
...

Como detelle curioso, el reproductor de Flash standalone, así como los proyectores que creamos (EXE), en estos casos, retorna -1, por lo que no da problemas de compatibilidad.