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

  最近項目中須要我編寫跨平臺的瀏覽器控件供JavaScript調用,通過幾天折騰,個人插件已經可以很好的工做在Windows、Linux、Mac平臺上的主流瀏覽器上,和JavaScript也能夠很好的進行交互通知,下面就介紹一下主要的NPAPI插件開發流程和一些須要特別注意的地方。api

  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
    }
相關文章
相關標籤/搜索