使用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
    }
相关文章
相关标签/搜索