1. 程式人生 > >使用NPAPI編寫跨平臺(Windows/Linux/Mac)跨瀏覽器(Chrome/Firefox/Safari)的外掛

使用NPAPI編寫跨平臺(Windows/Linux/Mac)跨瀏覽器(Chrome/Firefox/Safari)的外掛

最近專案中需要我編寫跨平臺的瀏覽器控制元件供JavaScript呼叫,經過幾天折騰,我的外掛已經能夠很好的工作在Windows、Linux、Mac平臺上的主流瀏覽器上,和JavaScript也可以很好的進行互動通知,下面就介紹一下主要的NPAPI外掛開發流程和一些需要特別注意的地方。

  1. 下載NPAPI-SDK,裡面有4個檔案npapi.h、npfunctions.h、npruntime.h、nptypes.h,我們不需要改動它們。
  2. http://mxr.mozilla.org/seamonkey/source/modules/plugin/samples/npruntime/下載np_entry.cpp、npn_gate.cpp、npp_gate.cpp,我們需要利用它們實現外掛指令碼化支援。np_entry.cpp和npn_gate.cpp我們不用修改,最主要的就是npp_gate.cpp裡面的這3個函式:NPP_GetMIMEDescription、NPP_New和NPP_GetValue,對於Windows版本的外掛重要的還有NPP_SetWindow,我們將使用作為引數傳進來的視窗控制代碼實現外掛自己的訊息迴圈,在和JavaScript進行通訊的時候我們會使用到。
  3. 修改NPP_GetMIMEDescription,Linux版的外掛必須實現該函式,返回值必須為指定的格式:
    NP_GetMIMEDescription()
    {
      return "application/basic-plugin:bsc:Basic plugin";
    }
    application/basic-plugin便是該外掛的MIME TYPE了,每個NPAPI外掛必須定義自己的的MIME TYPE,這樣JavaScript就可以通過MIME TYPE載入外掛了,Windows版的外掛MIME TYPE是通過.rc資原始檔裡定義的"MIMEType"欄位返回的,Mac版的外掛則是通過Info.plist裡的WebPluginMIMETypes欄位返回的,具體可以參見
    NPAPI-SDK
    裡的samples裡面的例子。
  4. 我們需要在NPP_New裡建立我們的外掛例項,並使用instance->pdata儲存,以便在其他NPP_*函式裡可以使用我們的外掛例項。另外Mac平臺下需要設定NPPVpluginEventModel使用NPEventModelCocoa,否則Chrome瀏覽器無法正常載入外掛。 複製程式碼
    NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved)
    {
    
    if(instance->pdata == NULL) instance->pdata = new CPlugin(); #ifdef XP_MACOSX NPN_SetValue(instance, NPPVpluginEventModel, (void *)NPEventModelCocoa); #endif }