Home Page

16 Dicembre 2006

getURL in Flash projector

Utilizzando il comando getURL() per aprire un file HTML da un SWF caricato tramite lo standalone Player di Flash (com ad esempio un projector EXE su un CD-rom) abbiamo riscontrato difficoltà di funzionamento soprattutto quando il browser predefinito è Firefox. Invocando il getURL(”modules/mia_pagina.html”) non viene aperta la pagina richiesta… vediamo perché…

Prendiamo in considerazione la situazione in cui un Flash projector (pubblicato come tale da Flash) contiene una chiamata di tipo getURL() a un file HTML: in questo modo non ci addentriamo nella casistica degli SWF in locale per i quali entra in ballo tutta la questione riguardante le security restrictions introdotte nelle varie versioni. Un movie Flash pubblicato come eseguibile invece non è soggetto a queste restrizioni di sicurezza come descritto nella documentazione ufficiale.
Detto questo procediamo con il nostro esempio e vediamo cosa succede quando un pulsante (che ha come instance name “myButton”) contenuto nel Flash projector invoca un getURL, o l’equivalente navigateToURL in AS3.0, a una pagina HTML:

myButton.onRelease = function() {
	getURL("modules/mia_pagina.html", "_blank");
};

Se il browser predefinito sul computer dell’utente è Internet Explorer, o una versione di Netscape/Mozilla precedente Firefox, tendenzialmente il comando avrà effetto e si aprirà la pagina “mia_pagina.html”.
Però se il browser di default è Firefox allora succedono cose strane e imprevedibili: sulle piattaforme testate ad esempio capita che Firefox si apre con due tab di cui uno _blank e uno in cui viene visualizzata la pagina di ricerca di default (ad esempio Google).
Un bel problema! Così sono partite le miee ricerche e i test più svariati fino a capire che non si tratta di un bug del Flash Player ma di Firefox, o meglio, di come Firefox gestisce le Url passate sulla command line.
Chiudete tutti i browser e provate a scrivere sulla command line il comando:

firefox -url "http://www.yahoo.com/|http://www.google.com/"

Noterete che viene aperto Firefox con due tab: una per Yahoo e una per Google.
Torniamo a Flash ora… quando in un projector invochiamo un getURL(”modules/mia_pagina.html”, “_blank”), quindi a una pagina relativa, il Flash Player traduce questo path in assoluto. Se ad esempio il projector è su un CD-dom identificato con la lettera D, e il file mia_pagina.html posizionato nella directory “modules”, il path assoluto tradotto dal Flash Player sarà del tipo:

file:///D|\modules\mia_pagina.html

Notate che è presente in questa stringa il carattere “|” (che si legge “pipe”) ed è proprio qui il problema. Quando Firefox riceve questo path, come nell’esempio fatto per la command line, cerca di aprire due tab e visualizzare le pagine specificate prima e dopo il “pipe”. Nel nostro caso tenterà di aprire senza successo le pagine “file:///d:” e “\modules\mia_pagina.html” che, non essendoci corrispondenza con reali pagine, provocano l’errore.

La soluzione è quindi quella di tradurre il path assoluto da inviare al browser in modo da evitare la presenza del carattere “pipe” e l’insorgere del problema, che ricordiamo è limitato solo agli utenti Firefox… ma come ben sappiamo sono (siamo) una crescente realta da non sottovalutare.
Per fare questo ci viene in aiuto la proprietà _url di AS2.0 o la proprieà url di loaderInfo in AS3.0). Per un SWF in una pagina web questa proprietà corrisponde alla url del file SWF, mentre per un SWF standalone in locale come un projector/eseguibile questo restituisce il path assoluto “file:///” dell’SWF nel file system.

Facciamo una prova e creiamo un projector SWF con un textField sullo stage a cui diamo come instance name “tf”:

// AS2
tf.text = this._url;

// AS3
tf.text = this.loaderInfo.url;

Facendo un test nel nostro textField apparirà un testo tipo: “file:///D|/projector.exe”.
Quindi quello che dovremo fare nel nostro caso è sostituire il “pipe” con “:” e il nome del projector con il percorso relativo al file HTML da aprire. Ci facciamo aiutare da indexOf() e lastIndexOf() per individuare rispettivamente la posizione del carattere “pipe” | e dellultimo slash (/) che chiude il path del projector. Ed ecco il codice risultante in Actionscript 2.0:

 

var swfUrl:String = _root._url;
var lastSlashIndex:Number = swfUrl.lastIndexOf("/");
var pipeIndex:Number = swfUrl.indexOf("|");
var baseUrl:String;
if (pipeIndex >= 0) {
	baseUrl = swfUrl.substring(0, pipeIndex);
	baseUrl += ":";
} else {
	baseUrl = "";
}
baseUrl += swfUrl.substring(pipeIndex + 1, lastSlashIndex + 1);
myButton.onRelease = function() {
	var targetUrl:String = baseUrl + "modules/mia_pagina.html";
	getURL(targetUrl, "_blank");
};

Pubblicato in Flash, Browser, Actionscript

2 Commenti a “getURL in Flash projector”

  1. Alberto scrive:

    Grazie della dritta! Spiegazione esauriente e non prolissa. Complimenti!

  2. Stefano scrive:

    Spiegazione perfetta per un baco di firefox che mi stava spaccando la testa già da un paio di ore… Grazie, e inserito il sito nei preferiti ;-)

Scrivi un commento

TROVA:

Abbonati ai Feed RSS di questo Blog Abbonati ai Feed RSS di questo Blog Informazioni su questo blog Informazioni su questo blog Scarica lo screen saver di shines Scarica lo screen saver di shines