[Laszlo-dev] suggested improvement for loadJS in SWF9 runtime

Raju Bitter rajubitter at me.com
Tue Nov 10 02:36:27 PST 2009


It calls DojoExternalInterface.call.apply(), which is a file from  
Dojo. Based on the comment in that file it's a wrapper around Flash8  
ExternalInterface, but I guess the comment is not up to date. Max?

http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/LzBrowserKernel.lzs
> /**
>   * Runs a Javascript method in the browser, returning the result
>   * @keywords flashspecific
>   */
> static function callJS (...args) :* {
>     var js:String = args[0];// String js: Browser javascript to  
> execute
>     var callback:* = args[1];
>     //DojoExternalInterface.call.apply(null, args);
>     if (LzBrowserKernel.jsready != true) {
>         LzBrowserKernel.__jslocked = true;
>     }
>     if (LzBrowserKernel.__jslocked == true) {
>         if (callback != false) {
>             var o:Array = [];
>             for (var i:int = 0; i < args.length; i++) {
>                 o[i] = args[i];
>             }
>             LzBrowserKernel.__jscallq.push(o);
>             //Debug.write('queued',  
> LzBrowserKernel.__jscallq.length, o);
>         }
>         return null;
>     }
>
>     LzBrowserKernel.__jscallback = callback;
>
>     args[1] = LzBrowserKernel.callJSReturn;
>
>     //LzBrowserKernel.__jslocked = true;
>     //Debug.write('calling with args real', args);
>     DojoExternalInterface.call.apply(null, args);
>
>     if (callback == false) {
>         LzBrowserKernel._dequeueJS();
>     }
>     return null;
> }

http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/lfc/kernel/swf9/DojoExternalInterface.as
>     function call(...args) :void {
>         var methodName:String = args[0];
>         var resultsCallback:Function = args[1];
>
>         var parameters:Array = [];
>         for(var i:int = 0; i < args.length; i++){
>             if(i != 1){ // skip the callback
>                 parameters.push(args[i]);
>             }
>         }
>
>         // we might have any number of optional arguments, so we  
> have to
>         // pass them in dynamically; strip out the results callback
>         //Debug.write('Calling', parameters);
>         var results:* = ExternalInterface.call.apply(null,  
> parameters);
>
>         // immediately give the results back, since  
> ExternalInterface is
>         // synchronous
>         if(resultsCallback != null && typeof resultsCallback !=  
> "undefined"){
>             resultsCallback.call(null, results);
>         }
>     }



On Nov 10, 2009, at 4:39 AM, Henry Minsky wrote:

> Did you try the callJS method? I believe it uses the  
> ExternalInterface calls.
>
> On Mon, Nov 9, 2009 at 10:12 PM, Chris Kohlhardt <chrisk at gliffy.com>  
> wrote:
> Hey there.  It's been a while.   :)
>
> We're migrating our massive laszlo application to SWF9.  We do  
> several javascript calls in our app, and I was having issues calling  
> lz.Browser.loadJS() several times in a row.  Basically, not all the  
> calls were making it through to the browser's javascript.
>
> Anyway, after much trial and error, I discovered that as3 has  
> ExternalInterface.call() for this purpose, and sure enough, using  
> this native call directly works.
>
> So.... not sure if this is the right place to suggest this, but you  
> might consider updating loadJS() in kernel/swf9/LzBrowserKernel.lzs  
> with  ExternalInterface.call().
>
> -chris
>
>
>
> -- 
> Henry Minsky
> Software Architect
> hminsky at laszlosystems.com
>
>



More information about the Laszlo-dev mailing list