2012-12-09 28 views
1

我正在開發一個NPAPI插件,我需要從瀏覽器的主線程運行一些代碼。來自NPAPI插件的瀏覽器主線程

NPAPI插件的線程模型是什麼? NPAPI執行的默認線程是什麼?我怎樣才能從瀏覽器的主線程運行我的代碼?

回答

2

線程模型是瀏覽器將在主線程中調用您的插件,並且您必須從主線程調用NPN_*方法。

+0

哇;我做了下面所有的工作,甚至沒有+1幫助澄清?苛刻。 – taxilian

4

正如smorgan所說,瀏覽器的線程模型是任何對瀏覽器的調用都必須在主線程上進行。有一個或兩個奇怪的例外,但支持有點不一致。

NPN_PluginThreadAsyncCall被引入來解決這個問題;它接受一個函數指針和一個void *來傳遞數據,並在主線程中調用該函數。當然,這裏有一些棘手的事情發生,因爲如果在插件關閉期間由於固有的競爭條件而致電NPN_PluginThreadAsyncCall,則無法保證您的函數將被調用。 FireBreath做一些相當異乎尋常的巫術來照顧這一點,並防止內存泄漏。

當你開始嘗試支持除FireFox之外的其他瀏覽器時,事情會變得更加粗糙; AFAIK FireFox支持所有版本的API調用,但至少某些版本的Safari(特別是64位)不支持NPN_PluginThreadAsyncCall;最有趣的是,他們有時似乎支持它,但最終會遇到一個糟糕的函數指針,當你嘗試使用它時會崩潰。這可能是在一個非常新的版本中修復的,我不知道,因爲我們很久以前就改用Mac上的NSTimer來避免無法正確檢測它是否被支持的問題。另外,Opera上的Windows已知不支持它。 FireBreath使用消息HWND並且在PostMessage上對Windows瀏覽器的主線程進行調用,但不支持它。

我不知道在Linux上的任何地方是否存在類似的問題;你沒有指定你關心的平臺。我還沒有聽說過Linux上的任何問題,但這可能或不一定意味着什麼。

其它問題,值得一讀的題目 Generating async Javascript events from browser plugin (NPAPI) How to callback plugin thread on Safari 5.1 on OSX?

好運