La respuesta es sí ... y no ...
Si tiene que soportar los navegadores antiguos (pre Firefox 3), se puede implementar el NPN_PluginThreadAsyncCall función manualmente. 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 en, y luego en el evento NULL (que se envía por Mac OS acerca de cada marca) comprobar para ver si hay algo en él. Si es así, sáquelo, llame al método, libérelo y continúe.
Probablemente también haya una manera de hacerlo en Linux, pero no sé lo que es.
Puede encontrar un ejemplo de la versión de Windows en el firebreath project.
El tratamiento del mensaje winproc es 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 el archivo de cabecera: https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.h
Y el método para la cocción de 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));
}
¡Gracias! Es extremadamente útil saber que la secuencia del bucle de eventos de la GUI de la plataforma es segura para las llamadas NPAPI. Y definitivamente revisaré Firebreath. FWIW, en Mac, si puede confiar en Cocoa, una forma sencilla de ejecutar código en el hilo de la GUI es el método NSObject performSelectorOnMainThread. – Geoff
Sí, creo que alguien me habló de performSelectorOnMainThread, pero no he necesitado usarlo hasta ahora. El porcentaje de usuarios que todavía están en Firefox 2 es tan pequeño en estos días que simplemente decidí no soportarlo más. Con FireBreath, podríamos agregar soporte si alguien lo necesitara lo suficiente (o podría), pero no lo necesito para nada de mi material. =] Hay varias características realmente agradables que no se implementaron hasta Firefox 2; NPN_Enumerate y NPN_Construct, por ejemplo. Además, Firefox 2 tiene un error conocido que no puede ver los complementos registrados en HKCU en Windows, por lo que debe ser administrador. – taxilian