توليد جافا سكريبت غير المتزامنة الأحداث من متصفح البرنامج المساعد (NPAPI)

StackOverflow https://stackoverflow.com/questions/1931883

سؤال

أنا أكتب مستعرض ويب المساعد (NPAPI.)

بلدي المساعد يبدأ ترابط نشيطة تقدم ، أود أن تمر الأحداث تعود إلى جافا سكريبت.ولكن بسبب NPAPI طراز مؤشر الترابط, انها ليست قانونية للعامل موضوع للاتصال مرة أخرى إلى NPAPI مباشرة ، حيث ترابط لا يمكن الاحتجاج جافا سكريبت.

حل واحد أن هذا هو NPN_PluginThreadAsyncCall وظيفة.ولكن هذا هو الجديد نسبيا وظيفة.على سبيل المثال, انها تدعم فقط من فايرفوكس 3.

هل هناك أي طريقة للحصول على المتزامن تسليم الحدث/تنفيذ جافا سكريبت من NPAPI المساعد دون استخدام NPN_PluginThreadAsyncCall?ماذا يفعل الناس قبل هذه الوظيفة المضافة ؟

هل كانت مفيدة؟

المحلول

الجواب هو نعم...و لا...

إذا كنت بحاجة إلى دعم المتصفحات القديمة (ما قبل فايرفوكس 3), يمكنك تنفيذ NPN_PluginThreadAsyncCall وظيفة نفسك.على ويندوز, يمكنك القيام بذلك عن طريق إنشاء بنية البيانات التي يمكن أن تعقد مؤشر الدالة و الفراغ* مبهمة المؤشر ، ثم بعد رسالة مخصصة إلى النافذة الرئيسية مع مؤشر إلى البيانات الخاصة بك هيكل LPARAM.

النافذة الرئيسية WINPPROC يعمل على واجهة المستخدم الخيط الذي هو الخيط الذي يمكن أن نتحدث إلى جافا سكريبت.لذلك عندما تحصل على تلك الرسالة في WINPROC ، يمكنك ببساطة يلقي LPARAM إلى مؤشر استدعاء الأسلوب مع بيانات مبهمة ثم مجانية بنية البيانات.

على ماك, يمكنك أن تفعل شيئا مماثلا مع طابور لتخزين الأحداث ثم على باطل الحدث (التي يتم إرسالها من قبل نظام التشغيل Mac OS عن كل علامة) تحقق لمعرفة ما إذا كان أي شيء في ذلك.إذا كان الأمر كذلك ، البوب ، استدعاء الأسلوب مجانا و الاستمرار.

ربما هناك طريقة للقيام بذلك على لينكس فضلا, ولكن أنا لا أعرف ما هو عليه.

يمكنك العثور على مثال على نسخة ويندوز في firebreath المشروع.

التعامل مع winproc رسالة في هذا الملف:https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.cpp

الحدث بنية البيانات تم تعريفها في ملف الرأس:https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.h

وطريقة إطلاق هذا الحدث هو هنا:

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));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top