ExternalInterface # chamada em um loop mortal (__flash__toXML)

No momento, estou construindo um aplicativo rails com um pequeno widget de flash para capturar e codificar quadros de webcam em alguns quadros jpeg. Quando o aplicativo flash tiver concluído todas as tarefas, quero mostrar uma janela de agradecimento em html modal com alguns links.

Para realizar a comunicação de flash para JS preciso de algum tipo de ponte. ExternalInterface é a solução certa. Chame seu método JS assim.

ExternalInterface.call("method",args..)

fácil, não é?

Minha chamada concreta é assim:

ExternalInterface.call("window.App.flash.openThankYouDialog")

No Google Chrome, vejo um intervalo entre pressionar o botão do flash e abrir a janela modal. No Firefox, ele PENDURA completamente pedindo para interromper um script de longa execução.

Com uma pequena sessão de criação de perfil, vejo uma pilha eeeeeeendlessss de chamadas toXML em flash que se parece com isso.

__flash__toXML
__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

__flash__toXML

Então, o que diabos está acontecendo? Eu sei que essa função é criada dinamicamente pelo flash para preparar a chamada do flash para uma avaliação do mal. Mas não há argumentos que eu passo e não é a primeira vez que usei um caminho com espaço de nomes para uma função. Então, o que há de errado agora? Eu testei e depurei e testei e depurei e então tive meu momento !!

O problema está de alguma forma relacionado ao coffescript. SIM coffescript. Veja minha implementação JS de openThankYouDialog

class SomeApp.Views.FlashApplication extends Backbone.View
openThankYouDialog
:->
@trigger('showThankYou')

_getFlashAppp
:->
$
(@el).get(0)

Esta Visualização de Backbone é algum tipo de mediador para meu aplicativo Flash. O ‘el’ do backbone aponta diretamente para o objeto flash / tag embed.

Quando chamado pelo flash, openThankYouDialog retorna uma referência à visualização atual. Isso ocorre porque o coffescript cria um retorno implícito e o gatilho retorna o objeto atual, portanto, a Visualização Backbone atual.

E o que o flash está fazendo? Ele tenta analisar todo o ‘SomeApp.Views.FlashApplication’ com flash toXML. Em algum momento, o flash toXML tentará analisar o próprio objeto flash / tag embed. E acho que aqui começa a jornada novamente. Acho que uma referência a flash toXML foi encontrada lá e flash toXML chama flash toXML e mata meu script.

Solução:

class SomeApp.Views.FlashApplication extends Backbone.View
openThankYouDialog
:->
@trigger('showThankYou')
return

Sim, um simples retorno vazio. Obrigado, coffescript! (psst, eu ainda te amo!)