2009-12-19 12 views
8

मैं एक वेब ब्राउज़र प्लगइन लिख रहा हूँ (NPAPI।) से जावास्क्रिप्ट घटनाओं asyncउत्पन्न ब्राउज़र प्लगइन (NPAPI)

मेरे प्लगइन एक कार्यकर्ता धागा शुरू होता है, और के रूप में कार्यकर्ता की प्रगति, मैं घटनाओं वापस पारित करने के लिए करना चाहते हैं जावास्क्रिप्ट के लिए। लेकिन एनपीएपीआई थ्रेडिंग मॉडल की वजह से, कार्यकर्ता धागे को सीधे एनपीएपीआई में वापस कॉल करने के लिए कानूनी नहीं है, इसलिए कार्यकर्ता धागा जावास्क्रिप्ट का आह्वान नहीं कर सकता है।

इसका एक समाधान एनपीएन_PluginThreadAsyncCall फ़ंक्शन है। लेकिन यह एक अपेक्षाकृत नया काम है। उदाहरण के लिए, यह केवल फ़ायरफ़ॉक्स 3 से समर्थित है।

क्या NPN_PluginThreadAsyncCall का उपयोग किये बिना एनपीएपीआई प्लगइन से एसिंक घटना वितरण/जावास्क्रिप्ट निष्पादन प्राप्त करने का कोई तरीका है? इस समारोह को जोड़ने से पहले लोगों ने क्या किया?

उत्तर

5

जवाब है हां ... और कोई ...

आप पुराने ब्राउज़र (पूर्व फ़ायरफ़ॉक्स 3) का समर्थन करने की जरूरत है, तो आप लागू कर सकते हैं NPN_PluginThreadAsyncCall खुद के कार्य करते हैं। विंडोज़ पर, आप डेटा संरचना बनाकर ऐसा कर सकते हैं जो फ़ंक्शन पॉइंटर और शून्य * अपारदर्शी सूचक को पकड़ सकता है, और उसके बाद मुख्य विंडो पर एक कस्टम संदेश पोस्ट कर सकता है जिसमें आपकी डेटा संरचना में LPARAM के रूप में पॉइंटर होता है।

मुख्य विंडो WINPPROC यूआई थ्रेड पर चलता है, जो थ्रेड है जो जावास्क्रिप्ट से बात कर सकता है। इसलिए, जब आप अपने संदेश को अपने WINPROC में प्राप्त करते हैं, तो आप बस LPARAM को पॉइंटर पर डाल देते हैं, विधि को अपारदर्शी डेटा के साथ कॉल करते हैं, और फिर डेटा संरचना को मुक्त करते हैं।

मैक पर, आप घटनाओं को स्टोर करने के लिए कतार के साथ एक ही चीज कर सकते हैं, और उसके बाद नल इवेंट (जिसे प्रत्येक टिक के बारे में मैक ओएस द्वारा भेजा जाता है) पर यह देखने के लिए जांचें कि इसमें कुछ भी है या नहीं। यदि ऐसा है, तो इसे बंद करें, विधि को कॉल करें, इसे मुक्त करें, और जारी रखें।

शायद लिनक्स पर भी ऐसा करने का एक तरीका है, लेकिन मुझे नहीं पता कि यह क्या है।

आप firebreath project में विंडोज संस्करण का एक उदाहरण पा सकते हैं। https://github.com/firebreath/FireBreath/blob/master/src/PluginWindow/Win/PluginWindowWin.cpp

घटना और डेटा संरचना अपने हेडर फाइल में परिभाषित कर रहे हैं:

winproc संदेश की हैंडलिंग इस फ़ाइल में है 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)); 
} 
+1

धन्यवाद! यह जानना बेहद उपयोगी है कि प्लेटफार्म जीयूआई इवेंट लूप थ्रेड एनपीएपीआई कॉल के लिए सुरक्षित है। और मैं निश्चित रूप से फायरब्रीथ की जांच करूंगा। मैक पर FWIW, यदि आप कोको पर निर्भर कर सकते हैं, तो GUI थ्रेड पर कोड चलाने का एक आसान तरीका एनएसओब्जेक्ट विधि प्रदर्शन चयनकर्ताऑनमेन थ्रेड है। – Geoff

+0

हाँ, मुझे लगता है कि किसी ने मुझे निष्पादकऑनमेन थ्रेड के बारे में बताया, लेकिन मुझे अब तक इसका उपयोग करने की आवश्यकता नहीं है। फ़ायरफ़ॉक्स 2 पर अभी भी उपयोगकर्ताओं का प्रतिशत इतना छोटा है कि मैंने अभी फैसला नहीं किया है कि अब इसका समर्थन न करें। फायरब्रेट के साथ, अगर किसी को इसे बुरी तरह से आवश्यक (या वे कर सकते हैं) तो हम समर्थन जोड़ सकते हैं, लेकिन मुझे इसकी किसी भी सामग्री के लिए इसकी आवश्यकता नहीं है। =] कई वास्तव में अच्छी विशेषताएं हैं जिन्हें फ़ायरफ़ॉक्स 2 तक लागू नहीं किया गया था; उदाहरण के लिए, NPN_Enumerate और NPN_Construct। इसके अलावा, फ़ायरफ़ॉक्स 2 में एक ज्ञात बग है कि यह विंडोज़ में एचकेसीयू में पंजीकृत प्लगइन्स नहीं देख सकता है, इसलिए आपको व्यवस्थापक होना होगा। – taxilian

संबंधित मुद्दे