NPAPI的简介
NPAPI全称为:Netscape Plugin Application Programming Interface (NPAPI),Netscape Navigator浏览器早已离我们远去,但Netscape plug-in却还顽强的活着,并且成为绝大多数浏览器都支持的跨平台插件标准,其中最常见的N插件莫过于Flash了,想想满世界的类“Youtube”你就知道了。现在Qt 4.5中支持了N插件,最直观的改变就是在Qt Demo Browser中原本应该显示Flash的位置不会再是一片空白了。(这段是抄袭别人的^_^).
现在支持NPAPI的浏览器有,
Epiphany Google Chrome Safari
Konqueror Mozilla project applications, including
Camino Firefox Mozilla Application Suite
Seamonkey Netscape Navigator and Communicator
Opera Internet Explorer up to 5.5SP2
在linux下,必须实现的接口函数
char*            NP_GetMIMEDescription()
NPError        NP_GetValue()
NPError        NP_Initialize()
NPError        NP_Shutdown()
如何下载javascript我们看看npfunctions.h头文件里面怎么定义这些函数的
#if defined(XP_MACOSX)
typedef void
(*BP_CreatePluginMIMETypesPreferencesFuncPtr)(void); typedef NPError (*MainFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*, NPP_ShutdownProcPtr*);
#endif
#if defined(XP_UNIX)
typedef EXPORTED_CALLBACK(NPError,
NP_InitializeFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*); typedef EXPORTED_CALLBACK(char*,
NP_GetMIMEDescriptionFuncPtr)(void);
#elif defined(ANDROID_PLUGINS)
typedef EXPORTED_CALLBACK(NPError,
NP_InitializeFuncPtr)(NPNetscapeFuncs*, NPPluginFuncs*, JNIEnv *java_environment, jobject application_context); typedef EXPORTED_CALLBACK(char*,
NP_GetMIMEDescriptionFuncPtr)(void);
#else
typedef EXPORTED_CALLBACK(NPError,
NP_InitializeFuncPtr)(NPNetscapeFuncs*);
#endif
不同的操作系统,用不同的参数.
浏览器开始加载的函数NPError        NP_Initialize()
这个函数不同的环境如下:
Windows
#include <npapi.h>    NPError WINAPI
NP_Initialize(NPNetscapeFuncs *aNPNFuncs)
Unix
#include <npapi.h>    NPError NP_Initialize(NPNetscapeFuncs *aNPNFuncs, NPPluginFuncs *aNPPFuncs)
Returns
If successful, the function returns NPERR_NO_ERROR.
∙
If unsuccessful, the plug-in is not loaded and the function
∙
returns an error code. For possible values, see Error Codes
当插件被加载时,浏览器只调用一次这个函数,在这个函数里面保留浏览器的函数指针结构aNPNFuncs,填充插件函数指针结构.
NPAPI插件
使用HTML和JavaScript开发新扩展是十分容易的事情,不过如果你想在扩展中重用已经开发完成的代码和功能,你可以通过使用NPAPI插件到达目的。NPAPI插件使JavaScript代码能够调用本地二进制代码。
警告
NPAPI是重型武器,当别的方法无法到达你的目的时,才建议使用。
运行在NPAPI插件中的代码拥有当前用户的全部权限,不能利用Google Chrome的沙箱技术和其他安全防护技术。在处理不可信任的输入,如content scripts和XMLHttpRequest时,你必须格外小心。
鉴于使用NPAPI可能引入的风险,使用了NPAPI的扩展在提交给web store或者extension gallery时要经过人工审核。
更多信息
如何开发一个NPAPI插件超出了本文的范畴,具体请参看:Mozilla's NPAPI plugin reference以获得更多帮助。
如果你已经拥有一个NPAPI插件,通过如下步骤,你的扩展将能够调用它。
1.  在你扩展的manifest.json文件中加入一个节,描述如何到你的插件,以及其
他一些信息,:
2.  {
3.    "name": "My extension",
4.    ...
5. "plugins": [
6.    { "path": "content_plugin.dll", "public": true },
7.    { "path": "extension_plugin.dll" }
8.    ],
9.    ...
}
"path"属性用于描述如何到你的插件,路径是相对于manifest文件位置的。"public"属性指明是否允许普通页面加载你的插件,默认是false,也就是只有你的扩展才能加载这个插件。
10.创建一个HTML文件,mime-type为:application/x-my-extension",用于加载
你的插件。
11.<embed type="application/x-my-extension" id="pluginId">
12.<script>
13.  var plugin = ElementById("pluginId");
14.  var result = PluginMethod();  // call a method
in your plugin
15.  console.log("my plugin returned: " + result);
</script>
这个页面可以被后台页面包含,或者任何你扩展会用到的其他页面。如果你的插件的"public"属性是true,,你可以通过脚本在页面中直接使用它。
安全注意事项
在你的扩展中包含一个NPAPI插件是一件危险的事情。因为NPAPI插件拥有访问你本地机器的完全权限而不受控制。如果你的插件不够健壮,包含漏洞,黑客可以通过溢出攻击利用漏洞来安装恶意软件到用户的机器。有鉴于此,请尽可能的避免在扩展中使用NPAPI插件。
将NPAPI的"public"属性设置为true,也会增加你扩展受到攻击的可能性。因为这样一来,插件直接暴露给了页面内容,恶意网站能通过页面直接操纵你的插件。有鉴于此,尽量避免将"public"属性设置为true。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。