que - Generación de eventos Javascript asíncronos desde el complemento del navegador(NPAPI)
preventdefault javascript para que sirve (1)
La respuesta es sí y no...
Si necesita admitir navegadores más antiguos (pre firefox 3), puede implementar la función NPN_PluginThreadAsyncCall usted mismo. En Windows, puede hacerlo creando una estructura de datos que pueda contener el puntero de función y el puntero opaco void * y luego publique un mensaje personalizado en la ventana principal con un puntero a su estructura de datos como LPARAM.
La ventana principal WINPPROC se ejecuta en el subproceso UI, que es el hilo que puede hablar con Javascript. Entonces, cuando recibes ese mensaje en tu WINPROC, simplemente vuelves a lanzar el LPARAM al puntero, llamas al método con los datos opacos y luego liberas la estructura de datos.
En Mac, puede hacer algo similar con una cola para almacenar los eventos, y luego en el evento NULL (que se envía por Mac OS sobre cada tic) verifique si hay algo en él. Si es así, sáquelo, llame al método, libérelo y continúe.
Probablemente también haya una forma de hacerlo en Linux, pero no sé qué es.
Puede encontrar un ejemplo de la versión de Windows en el proyecto Firebreath .
El manejo del mensaje de winproc está en este archivo: https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.cpp
El evento y la estructura de datos se definen en su archivo de encabezado: https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.h
Y el método para activar ese evento está aquí:
void ActiveXBrowserHost::ScheduleAsyncCall(void (*func)(void *), void *userData)
{
if (m_hWnd != NULL)
::PostMessage(m_hWnd, WM_ASYNCTHREADINVOKE, NULL,
(LPARAM)new FB::WINDOWS_ASYNC_EVENT(func, userData));
}
Estoy escribiendo un complemento de navegador web (NPAPI).
Mi complemento inicia un hilo de trabajo y, a medida que el trabajador progresa, me gustaría pasar los eventos a Javascript. Pero debido al modelo de subprocesamiento NPAPI, no es legal que el subproceso de trabajo vuelva a llamar directamente a NPAPI, por lo que el subproceso de trabajo no puede invocar Javascript.
Una solución para esto es la función NPN_PluginThreadAsyncCall. Pero esta es una función relativamente nueva. Por ejemplo, solo es compatible con Firefox 3 en adelante.
¿Hay alguna forma de obtener la ejecución de eventos asincrónicos / javascript desde un plugin NPAPI sin usar NPN_PluginThreadAsyncCall? ¿Qué hizo la gente antes de agregar esta función?