NPAPI开发常识

其实,就在几天前,我根本不知道什么是NPAPI插件。因为最近的项目中用到需要在非IE下检测客户端是否安装,最终找到浏览器插件NPAPI。

以下资料来源于网络收集,以此给那些和我一样迷茫的人。本文的目的不是将网络上资源拼凑出来,而是在于寻找资料的途径及好资料链接。并希望大家以后,无论在找什么资料都可以找到最核心最有用的。

NPAPI是什么

所谓NPAPI,就是指网景插件应用程序接口(Netscape Plugin Application Programming Interface)[1][2],是一种外部程序作为插件和浏览器共同完成网页展示的调用通道

?

为什么使用NPAPI插件?插件就相当于运行在网页上的应用程序。比如你想在网页上播放音乐,在网页上使用<embed>标签,浏览器会自动调用Windows Media Player运行,又如pdf等。还有,也可以用作在浏览器检测和启动客户端应用程序。

?

我们通常称为"火狐插件",真实意思是基于火狐内核的插件,火狐是Gecko引擎,因此基于Gecko引擎的插件开发类似,以下将火狐浏览器称作Gecko。火狐插件NPAPI,在页面上<embed>标签,对应于IE的ActiveX插件,页面上用<object>标签。

?

NPAPI 原本是由 Netscape 所制定的一组单纯的 C Plugin API,起初是无法支持 Scriptability;于是到了 2004 年底,各家 Browser ( IE , Opera, Mozilla 等) 都同意支持NPRuntime 延伸 API 以支持 Scriptability,所以目前若是想写 Plugin则应该以 NPRuntime API 才能跨不同的 Browsers

?

尽管这种插件在当时很流行,但自从HTML5出来后似乎就被排挤了。谷歌将会从2014年1月开始禁用大部分的Chrome插件。Mozilla也计划在2013年12月阻挡NPAPI插件的使用.

?

Netscape插件的生命周期

当用户用Gecko引擎的浏览器打开一个包括embed标签的网页时,浏览器会响应以下行为:

  1. 检测带有MIME type的插件
  2. 加载插件代码到内存中
  3. 初始化插件
  4. 创建插件的实例

Gecko引擎可以加载同一插件的多个实例在一个网页上,或者同时在几个打开的窗口。当用户离开或关闭窗口,插件实例被删除。当最后一个实例被删除,插件代码从内存中卸载。

?

所以在火狐中需要标注插件的mime类型,而在IE下,因为在系统中以COM方式注册,所以只需要classid。差异如下如下:


浏览器


用法


IE(Trident引擎)


<object classid="clsid:7017318C-BC50-4DAF-9E4A-10AC8364C315" > </object>


Firefox,chrome

(Gecko引擎)


<embed id=iStylePDF type=application/npistyleax />

请注意区分,浏览器插件和浏览器扩展是不同的。浏览器插件是利用给出的api嵌入的一种插件,而扩展则是基于浏览器实现的扩展功能。

如果只是想检测用的话,一个简单的demo足够,但是如果你还想偷懒,连一个简单的demo也不想做,只是向注册表注册mime类型,并用别人的dll,这是不允许的。

插件检测

Gecko引擎以特定的顺序查找不同地方的插件(Plug-ins).

Gecko如果发现NPAPI插件

当一个基于Gecko引擎的浏览器启动时,它会检测某些路径以查找插件,按以下顺序:

Windows:

直接由环境变量MOZ_PLUGIN_PATH指定的路径

%APPDATA%\Mozilla\plugins,此处" %APPDATA%"指每个用户应用程序数据目录

在工具包内的插件

Profile directory\plugins,

由HKEY_CURRENT_USER\Software\MozillaPlugins\*\Path 注册表值指定,其中*可以是任何名字,通常这里是插件的名称。

由HKEY_
LOCAL_MACHINE\Software\MozillaPlugins\*\Path 注册表值指定,其中*可以是任何名字,通常这里是插件的名称。

Mac OS X

~/Library/Internet Plug-Ins.

/Library/Internet Plug-Ins.

/System/Library/Frameworks/JavaVM.framework/Versions/Current/Resources.

在工具包内的插件

Profile directory/plugins, where Profile directory is a user profile directory

?

Linux

由MOZ_PLUGIN_PATH 环境变量指定路径.

~/.mozilla/plugins.

/usr/lib/mozilla/plugins (on 64-bit systems, /usr/lib64/mozilla/plugins is used instead).

在工具包内的插件.

Profile directory/plugins, where Profile directory is a user profile directory.

?

为了找出当前注册了哪些插件,可以在Firefox中输入"about:plugins".Gecko引擎会显示一个页面列出所有注册的插件和它们所用的MIME类型,还有插件提供的可选的描述信息。

在windows,注册的插件是自动配置处理它们支持的MIME类型。如果多个插件处理相同的MIME类型,则由第一个注册的插件处理。

?

通过MIME类型检测插件

启用的插件的属性在JavaScript中可以用来确定一个特定的MIME类型使用哪个插件。尽管插件也许支持多个MIME类型,而且每个MIME类型也许被多个插件支持,但是只有一个插件可以被识别为特定的一个MIME类型。启用插件的属性是插件实例的一个参考

如下例子利用JavaScript来确定Adobe Flash是否注册。如果注册了,则显示一个movie。


// Can we display Adobe Flash movies?

var mimetype = navigator.mimeTypes["application/x-shockwave-flash"];

?

if
(mimetype)
{

// Yes, so can we display with a plug-in?

var plugin = mimetype.enabledPlugin;

if
(plugin)
{

// Yes, so show the data in-line

document.writeln("Here\‘s a movie: <object data=‘mymovie.swf‘ height=‘100‘ width=‘100‘></object>");

}
else
{

// No, so provide a link to the data

document.writeln("<a href=‘mymovie.swf‘>Click here</a> to see a movie.");

}

}
else
{

// No, so tell them so

document.writeln("Sorry, can‘t show you this movie.");

}

?

开发Netscape插件的一般方法

尽管开发netscape插件有不少可用框架。但是开发一个典型的netscape插件主要要做的工作有以下:

1.编写一个动态链接库。 插件的表现形式就是一个动态链接库,所以首先编写一个dll文件或者.so文件供浏览器调用。注意,插件的名称应该以np开头,NPAPI标准的默认规则。

2.添加dll导出接口。 在xx.def文件中添加dll的导出函数,如图

上面导出了三个NP_函数,供浏览器调用。这三个函数的作用前面已经说过,不再细述

3.添加插件的mimetype。首先为插件添加一个.rc文件,注意该资源文件的默认语言应该是英文,简体中文的话浏览器识别不出,然后在.rc文件中添加mimetype属性。

如图

4.实现npapi.h中声明的NPP函数。

5.在Np_GetEntryPoints中将NPP_函数地址赋值给传出参数。

6..在NP_Initialize中保存传入的NPNetscapeFuncs对象指针,供插件后续调用

7.在Np_Shutdown中处理反初始化操作。

8.对NPClass中的函数进行实现

?

要下班了,就先写到这里吧。各位想看更多资料查看下面链接吧。

?

更多信息请参考:

首先是MDN火狐开发者中心官网的资料最可靠。

火狐插件基础:

https://developer.mozilla.org/en-US/Add-ons/Plugins/Gecko_Plugin_API_Reference/Plug-in_Basics#How_Gecko_Finds_Plug-ins

MDN扩展开发:

https://developer.mozilla.org/en-US/Add-ons

其它参考:

http://colonelpanic.net/2009/03/building-a-firefox-plugin-part-one/

http://www-archive.mozilla.org/owners.html

?

?

?

时间: 2024-10-23 20:26:48

NPAPI开发常识的相关文章

android开发常识(转)

转载于:http://blog.sina.cn/dpool/blog/s/blog_6c234ba90100wj1t.html 如何成为高手?成为一名真正的Android高手必须掌握和遵循的一些准则:1)学会懒惰 aDon't Reinvent the Wheel(不要重复发明轮子). bInventing the Wheel(发明轮子). cDon't Reinvent the Wheel(不要重复发明轮子). “轮子理论”,也即“不要重复发明轮子”,这是西方国家的一句谚语,原话是:Don't

在NPAPI开发火狐浏览器插件在NPAPI插件

1.插件是什么 插件是一种遵循一定规范的应用程序接口编写出来的程序.插件必须依附于一个宿主程序,为宿主程序提供增强功能.插件的种类有很多,这里主要讨论浏览器插件. IE下利用OLE和COM技术开发的浏览器插件称为ActiveX控件.一般以.ocx为扩展名.IE浏览器通过OLE标准与ActiveX控件之间进行交互,完成对现有功能的扩充. IE和OLE技术都是微软出的,所以如果在非IE浏览器下开发插件,就不能使用现有的COM技术标准.NPAPI技术提供了一种新的开发浏览器下插件的标准.浏览器和插件共

iOS开发常识

一.NSString 创建字符串.  NSString *astring = @"This is a String!"; 创建空字符串,给予赋值.  NSString *astring = [[NSString alloc] init]; astring = @"This is a String!"; NSLog(@"astring:%@",astring); string release]; 使用变量初始化  NSString *name = 

iOS开发——常识swift篇&amp;随机数获取

随机数获取 arc4random()这个全局函数会生成9位数的随机整数 1,下面是使用arc4random函数求一个1~100的随机数(包括1和100) 1 var temp:Int = Int(arc4random()%100)+1 2,下面是使用arc4random_uniform函数求一个1~100的随机数(包括1和100) 1 var temp:Int = Int(arc4random_uniform(100))+1

iOS开发-开发常识[尺寸图标和图像的尺寸(像素)]

尺寸图标和图像的尺寸(像素) 所有的图像和图标建议用png格式,需要避免使用交错型的png文件格式.标准的图标和图像的位深(每像素占用的字节)是24位,红,绿,蓝通道分别为8位,再加上透明通道的8位,总共有32位.你不需要把你的调色板限制在web安全色里.

NPAPI火狐插件VS2013开发示例

NPAPI火狐插件VS2013开发示例 下面是我根据网上开发示例自己做的一个demo,并提供代码下载. 开发环境 Windows 8.1 x64 Visual studio 2013 准备工作 首先需要从官网下载火狐源码(也可以下载其它版本),里面有开发插件所需要的头文件. 官网下载地址:,http://download.cdn.mozilla.net/pub/mozilla.org/firefox/releases/33.0/source/firefox-33.0.source.tar.bz2

我眼中软件工程里的常识

来源:https://segmentfault.com/a/1190000006636138 作者:https://segmentfault.com/u/leftstick 背景 说起工程人员/团队应该具备的"常识",真正促使我认真思考这个问题,还是因为知乎的一篇贴跟没有常识的人聊天是一种怎样的体验?,里面笑料百出,各种由于"常识"不足导致的尴尬癌真真是忍俊不禁.但笑过之后我发现,所谓的"没常识",可能由多种原因导致,这点在知乎里多位答主都提到过

ppapi,npapi

PPAPI也就是Pepper Plugin API,是在原有网景NPAPI(Netscape Plugin API)基础上发展而来的.NPAPI是当今最流行的插件架构,几乎所有浏览器都支持,不过存在很大的安全隐患,插件可以窃取系统底层权限,发起恶意攻击.2010年,Google开发了新的PPAPI,将外挂插件全部放到沙盒里运行,2012年Windows.Mac版本的Chrome浏览器先后升级了PPAPI Flash Player,并希望今年底之前彻底淘汰NPAPI.现在,所有使用PPAPI接口的

Android之——利用系统权限实现手机重启

在应用开发时经常会有这样的需求,如何在应用里用代码让手机重启,另外,我们知道在重启之后,我们的应用可以注册广播接收者,以保证我们的应用会第一个将我们的服务开启起来,这样我们的代码就可以第一个接收到接收短信的广播事件.好了,现在就让我们一起来实现一个利用系统权限实现手机重启的示例吧. 一.实现 我们实现很简单,就是给界面一个按钮,然后设置按钮的点击事情,在点击事件里完成手机重启操作. 1.布局文件 布局文件很简单,就是放置了一个Button按钮,设置点击事件. 具体代码如下: <LinearLay