[Laszlo-dev] swf9 ExternalInterface.addCallback

Sarah Allen sarah at ultrasaurus.com
Sat Jun 20 13:10:37 PDT 2009


Can I just declare a method on the canvas and call it with:
value =  
lz.embed.lzapp.callMethod('globalreference.canvas.anyMethod(...)')

Also, do I need all the lz embed stuff to do this?  I was just using  
swfobject_tag in rails...  and then I would just call the method on  
the object in javascript.

Sarah

On Jun 20, 2009, at 12:59 PM, Max Carlson wrote:

> It just means you need a top-level instance with an ID.  You can do  
> this in a script if you want to...
>
> Sarah Allen wrote:
>> What does this mean:  "You can call any available method in the  
>> application as long as 'globalreference' can be found in the global  
>> scope." ?
>> Do I need to define "globalreference" in a script tag?
>> Thanks,
>> Sarah
>> On Jun 19, 2009, at 1:20 PM, Max Carlson wrote:
>>> Yes!  See the docs for any app with lzt=deployment, e.g.:
>>> http://labs.openlaszlo.org/trunk-nightly/my-apps/copy-of-hello.lzx?lzt=deployment
>>>
>>> To call a method in an application, use:
>>>
>>> value =  
>>> lz 
>>> .embed.lzapp.callMethod('globalreference.reference.anyMethod(...)')
>>>
>>> passing a string representation of the method and any arguments  
>>> you wish to pass. You can call any available method in the  
>>> application as long as 'globalreference' can be found in the  
>>> global scope.
>>>
>>> To call a method in all applications on the page, use:
>>>
>>> lz.embed.callMethod('globalreference.reference.anyMethod(...)')
>>>
>>> Sarah Allen wrote:
>>>> So, is there any native-LZX way to do this?  or is the Flash API  
>>>> the best I can do for now?
>>>> Thanks!
>>>> Sarah
>>>> On Jun 12, 2009, at 10:12 AM, Henry Minsky wrote:
>>>>> You're looking at out of date docs, the new docs say it has two  
>>>>> args.
>>>>>
>>>>> See the docs at http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/
>>>>>
>>>>> addCallback    ()    method
>>>>>
>>>>> | public static function addCallback(functionName:String <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/String.html 
>>>>> >, closure:Function <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Function.html 
>>>>> >):void <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/specialTypes.html#void 
>>>>> >|
>>>>> * Language Version : *    ActionScript 3.0
>>>>>
>>>>> * Runtime Versions : *    AIR 1.0, Flash Player 9
>>>>>
>>>>> Registers an ActionScript method as callable from the container.  
>>>>> After a successful invocation of |addCallBack()|, the registered  
>>>>> function in Flash Player can be called by JavaScript or ActiveX  
>>>>> code in the container.
>>>>>
>>>>> *Note:* For /local/ content running in a browser, calls to the | 
>>>>> ExternalInterface.addCallback()| method work only if the SWF  
>>>>> file and the containing web page are in the local-trusted  
>>>>> security sandbox. For more information, see the following:
>>>>>
>>>>>   * The security chapter
>>>>>     <http://www.adobe.com/go/flashCS3_progAS3_security> in the
>>>>>     /Programming ActionScript 3.0/ book and the latest comments on
>>>>>     LiveDocs
>>>>>   * The Flash Player 9 Security white paper
>>>>>     <http://www.adobe.com/go/fp9_0_security>
>>>>>
>>>>> Parameters
>>>>>
>>>>>
>>>>>    |functionName:String <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/String.html 
>>>>> >| — The name by which the container can invoke the function.
>>>>>
>>>>>    |closure:Function <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Function.html 
>>>>> >| — The function closure to invoke. This could be a free- 
>>>>> standing function, or it could be a method closure referencing a  
>>>>> method of an object instance. By passing a method closure, you  
>>>>> can direct the callback at a method of a particular object  
>>>>> instance.
>>>>>
>>>>>
>>>>> Throws
>>>>>
>>>>>    |Error <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Error.html 
>>>>> > | — The container does not support incoming calls. Incoming  
>>>>> calls are supported only in Internet Explorer for Windows and  
>>>>> browsers that use the NPRuntime API such as Mozilla 1.7.5 and  
>>>>> later or Firefox 1.0 and later.
>>>>>
>>>>>    |SecurityError <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/SecurityError.html 
>>>>> > | — A callback with the specified name has already been added  
>>>>> by ActionScript in a sandbox to which you do not have access;  
>>>>> you cannot overwrite that callback. To work around this problem,  
>>>>> rewrite the ActionScript that originally called the | 
>>>>> addCallback()| method so that it also calls the | 
>>>>> Security.allowDomain()| method.
>>>>>
>>>>>    |SecurityError <http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/SecurityError.html 
>>>>> > | — The containing environment belongs to a security sandbox  
>>>>> to which the calling code does not have access. To fix this  
>>>>> problem, follow these steps:
>>>>>
>>>>>  1. In the |object| tag for the SWF file in the containing HTML
>>>>>     page, set the following parameter:
>>>>>
>>>>>     |<param name="allowScriptAccess" value="always" />|
>>>>>
>>>>>  2. In the SWF file, add the following ActionScript:
>>>>>
>>>>>     |flash.system.Security.allowDomain(/sourceDomain/)|
>>>>>
>>>>> See also
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Jun 12, 2009 at 12:51 PM, Sarah Allen <sarah at ultrasaurus.com 
>>>>>  <mailto:sarah at ultrasaurus.com>> wrote:
>>>>>
>>>>>   I'm seeing a weird compiler error in trunk... might be recent
>>>>>   regression (it is possible, but unlikely that I somehow left  
>>>>> this
>>>>>   code in a state that had a compiler error a couple of months ago
>>>>>   when I last looked at this app)  I'll be looking at this more,  
>>>>> but
>>>>>   I wanted to send a note in case anyone else is seeing something
>>>>>   similar or has any ideas.
>>>>>
>>>>>   org.openlaszlo.sc.CompilerError: main.lzx: 41: Error: Incorrect
>>>>>   number of arguments. Expected no more than 2, in line:
>>>>>   flash.external.ExternalInterface.addCallback("playMedia", null,
>>>>>   playMedia)
>>>>>
>>>>>   The Flash docs indicate that there are three arguments:
>>>>>   http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001653.html
>>>>>   <http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001653.html 
>>>>> >
>>>>>
>>>>>   Also, is there any LZX-native way that I should be making this
>>>>>   call instead of devolving into calling Flash directly?
>>>>>
>>>>>   Thanks in advance,
>>>>>   Sarah
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> Henry Minsky
>>>>> Software Architect
>>>>> hminsky at laszlosystems.com <mailto:hminsky at laszlosystems.com>
>>>>>
>>>>>
>>>> http://www.ultrasaurus.com
>>>
>>> -- 
>>> Regards,
>>> Max Carlson
>>> OpenLaszlo.org
>> http://www.ultrasaurus.com
>
> -- 
> Regards,
> Max Carlson
> OpenLaszlo.org

http://www.ultrasaurus.com






More information about the Laszlo-dev mailing list