关闭

使用NPAPI编写跨平台(Windows/Linux/Mac)跨浏览器(Chrome/Firefox/Safari)的插件

945人阅读 评论(1) 收藏 举报
分类:

 最近项目中需要我编写跨平台的浏览器控件供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
    }

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

基于Chrome,foxfire(WeiKit内核)浏览器的密码安全控件插件开发(NPAPI)

经过几番努力,IE版本的安全控件成功开推。
  • song_0962
  • song_0962
  • 2014-08-03 16:24
  • 2637

使用iCloud让Safari与Chrome/FireFox/IE的书签保持同步

随着现在Mac电脑的普及程度越来越高,很多人都会像笔者一样,在公司和家里用着不同种类的操作系统。 而浏览器又是一个不可或缺的存在,根据笔者的使用习惯,在Mac上会使用Safari浏览器,而在Windo...
  • sch0120
  • sch0120
  • 2015-10-24 21:23
  • 11965

浏览器的跨域问题以及解决方案

1、为什么会有跨域问题的存在?   JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象,即同源政策。 2、什么是同源?   1995年,同源政策由 Netscape 公司引入浏览...
  • u013084331
  • u013084331
  • 2016-04-10 22:37
  • 20254

跨浏览器总结(IE7/IE8/IE9/Safari/Chrome/Firefox)

最近在做项目的升级工作,主要是跨浏览器这块,遇到了一些问题并且做了总结,贴出来与大家分享一下,如果你也遇到类似的问题,希望对你有一定的帮助。闲话少叙,进入正题,按照我总结的顺序来吧。 1、获取浏览器的...
  • jcx5083761
  • jcx5083761
  • 2013-04-03 11:30
  • 3900

根据User Agent参数的各个字段Mozilla/5.0/4.0-AppleWebKit/Chrome/Safari/Firefox/Opera/MSIE来确定/判断客户端使用什么浏览器

原文章地址:点击打开链接 如何根据User Agent参数字符串的各个字段Mozilla/5.0/4.0-AppleWebKit/Chrome/Safari/Firefox/Opera/MSIE...
  • xumesang
  • xumesang
  • 2016-10-09 16:13
  • 1634

js + php 读取、播放视频流 兼容firefox,chrome,ie,mac的safari,ios的safari,ios的微信浏览器(curl读取文件流篇)

1、选用jwplayer6作为前端播放器 2、前端动态加载jwplayer视频盒子 3、前端加载的视频非视频的物理地址,而是通过php读取的视频流 4、php读取的视频流的源文件是一个物理地址的...
  • snow_finland
  • snow_finland
  • 2014-04-22 11:59
  • 2869

并行编程之跨平台使用SSE、AVX指令集心得——以单精度浮点数组求和为例(支持vc、gcc,兼容Windows、Linux、Mac)

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这...
  • lien0906
  • lien0906
  • 2015-04-14 15:53
  • 727

跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个...
  • ceasar11
  • ceasar11
  • 2014-01-09 10:17
  • 1047

[C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个...
  • zyl910
  • zyl910
  • 2012-10-22 22:28
  • 3032

JS 实现浏览器的 title 闪烁、滚动、声音提示、chrome、Firefox、Safari等系统通知

  • 2018-01-10 16:16
  • 277KB
  • 下载
    个人资料
    • 访问:217947次
    • 积分:3725
    • 等级:
    • 排名:第10045名
    • 原创:148篇
    • 转载:135篇
    • 译文:3篇
    • 评论:10条