Cross-browser NPAPI extensions for plugin scriptability
2009-08-25 18:43
218 查看
原文出处:http://board.mozest.com/viewthread.php?tid=6759&highlight=NPAPI
这不是一个文档翻译,而是按照我个人的理解,将NPAPI extensions的使用做一简单的描述,NPAPI的基础部分我在这里就不说来
代码
NPPVpluginScriptableNPObject = 15
typedef unsigned int uint32_t;
struct NPObject;
typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj);
typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj);
typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj,
const NPVariant *args,
uint32_t argCount,
NPVariant *result);
typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
NPVariant *result);
typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *value);
typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj,
NPIdentifier name);
struct NPClass
{
uint32_t structVersion;
NPAllocateFunctionPtr allocate;
NPDeallocateFunctionPtr deallocate;
NPInvalidateFunctionPtr invalidate;
NPHasMethodFunctionPtr hasMethod;
NPInvokeFunctionPtr invoke;
NPInvokeDefaultFunctionPtr invokeDefault;
NPHasPropertyFunctionPtr hasProperty;
NPGetPropertyFunctionPtr getProperty;
NPSetPropertyFunctionPtr setProperty;
NPRemovePropertyFunctionPtr removeProperty;
};
struct NPObject {
NPClass *_class;
uint32_t referenceCount;
/*
* Additional space may be allocated here by types of NPObjects
*/
};
具体实现:
代码
NPError NPP_GetValue(NPP instance, NPPVariable variable,void *value)
{
if(instance==NULL)
return NPERR_INVALID_INSTANCE_ERROR;
if(variable==NPPVpluginScriptableNPObject)
{
*((void**)value)=/*此处是一个NPObject实例的指针*/
return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
}
下面说一下几个回调函数的具体意义
NPAllocateFunction:NPObject实例创建函数,我感觉没什么用处,因为Gecko不会使用此函数,而实例的创建一般人不会兜个大圈子来用这个东西。
DeallocateFunction:NPObject实例释放函数,这个很重要,Gecko要使用这个函数来释放实例,只有在这里,才可以释放以前创建的NPObject实例
InvalidateFunction:NPObject实例释放之前此函数会被调用,一般来说用处不是很大
HasMethodFunction:Gecko询问plugin是否支持指定的函数,参数NPIdentifier name,需要转换成字符串
下面是当前Gecko支持的_NPNetscapeFuncs结构的头文件
npupp.rar (7.55 KB)
使用NPN_IdentifierIsString判断name是否是一个字串,如果是,再使用NPN_UTF8FromIdentifier获得这个字串,格式是UTF-8的,使用完毕后要用NPN_MemFree释放内存。如果判断是你plugin支持的函数,那么就返回true,否则返回false;
NPInvokeFunction:如果上面那个函数返回true,那么Gecko会立即调用这个函数来执行Function,通过NPIdentifier name获得函数名,NPVariant *args是参数数组,uint32_t argCount是参数个数,NPVariant *result是函数执行完毕后的返回值。NPInvokeFunction本身也有一个返回值,表示这个函数执行是否成功
代码
typedef enum {
NPVariantType_Void,
NPVariantType_Null,
NPVariantType_Bool,
NPVariantType_Int32,
NPVariantType_Double,
NPVariantType_String,
NPVariantType_Object
} NPVariantType;
typedef struct _NPVariant {
NPVariantType type;
union {
bool boolValue;
uint32_t intValue;
double_t doubleValue;
NPString stringValue;
NPObject *objectValue;
} value;
} NPVariant;
有关这个结构我就不用说了吧,一眼就能看明白
如果NPVariantType==NPVariantType_String;那么stringValue.utf8characters要使用NPN_MemAlloc来申请内存,使用完毕的NPVariant使用NPN_ReleaseVariantValue释放
以下的函数同上面的类似,就简单写
InvokeDefaultFunction:调用默认函数
HasPropertyFunction:是否有指定的属性
GetPropertyFunction:获得属性
SetPropertyFunction:设置属性
RemovePropertyFunction:移除属性
不知道我理解上是否有误差,反正我写的plugin工作还算是正常的...
最后说要说的两点就是NPObject在意义上和基本NPAPI中的NPP instance意义差不多,不过使用plugin自定义的创建和销毁函数,虽然在旧版API中NPP_New函数的argn和argv参数定义是char,但实际上是UTF-8,这也是为什么有些plugin不支持中文的缘故,字符串转换错了...
写得比较乱...还有就是event的实现,因为我没有在文档中找到可以直接使用的方法,所以我是利用扩展接口,使用XPCOM,与Gecko直接通讯的方式,实现起来稍微有点麻烦,等我以后有时间再写吧...
这不是一个文档翻译,而是按照我个人的理解,将NPAPI extensions的使用做一简单的描述,NPAPI的基础部分我在这里就不说来
代码
NPPVpluginScriptableNPObject = 15
typedef unsigned int uint32_t;
struct NPObject;
typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
typedef void (*NPDeallocateFunctionPtr)(NPObject *npobj);
typedef void (*NPInvalidateFunctionPtr)(NPObject *npobj);
typedef bool (*NPHasMethodFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPInvokeFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result);
typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj,
const NPVariant *args,
uint32_t argCount,
NPVariant *result);
typedef bool (*NPHasPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
typedef bool (*NPGetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
NPVariant *result);
typedef bool (*NPSetPropertyFunctionPtr)(NPObject *npobj, NPIdentifier name,
const NPVariant *value);
typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj,
NPIdentifier name);
struct NPClass
{
uint32_t structVersion;
NPAllocateFunctionPtr allocate;
NPDeallocateFunctionPtr deallocate;
NPInvalidateFunctionPtr invalidate;
NPHasMethodFunctionPtr hasMethod;
NPInvokeFunctionPtr invoke;
NPInvokeDefaultFunctionPtr invokeDefault;
NPHasPropertyFunctionPtr hasProperty;
NPGetPropertyFunctionPtr getProperty;
NPSetPropertyFunctionPtr setProperty;
NPRemovePropertyFunctionPtr removeProperty;
};
struct NPObject {
NPClass *_class;
uint32_t referenceCount;
/*
* Additional space may be allocated here by types of NPObjects
*/
};
具体实现:
代码
NPError NPP_GetValue(NPP instance, NPPVariable variable,void *value)
{
if(instance==NULL)
return NPERR_INVALID_INSTANCE_ERROR;
if(variable==NPPVpluginScriptableNPObject)
{
*((void**)value)=/*此处是一个NPObject实例的指针*/
return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
}
下面说一下几个回调函数的具体意义
NPAllocateFunction:NPObject实例创建函数,我感觉没什么用处,因为Gecko不会使用此函数,而实例的创建一般人不会兜个大圈子来用这个东西。
DeallocateFunction:NPObject实例释放函数,这个很重要,Gecko要使用这个函数来释放实例,只有在这里,才可以释放以前创建的NPObject实例
InvalidateFunction:NPObject实例释放之前此函数会被调用,一般来说用处不是很大
HasMethodFunction:Gecko询问plugin是否支持指定的函数,参数NPIdentifier name,需要转换成字符串
下面是当前Gecko支持的_NPNetscapeFuncs结构的头文件
npupp.rar (7.55 KB)
使用NPN_IdentifierIsString判断name是否是一个字串,如果是,再使用NPN_UTF8FromIdentifier获得这个字串,格式是UTF-8的,使用完毕后要用NPN_MemFree释放内存。如果判断是你plugin支持的函数,那么就返回true,否则返回false;
NPInvokeFunction:如果上面那个函数返回true,那么Gecko会立即调用这个函数来执行Function,通过NPIdentifier name获得函数名,NPVariant *args是参数数组,uint32_t argCount是参数个数,NPVariant *result是函数执行完毕后的返回值。NPInvokeFunction本身也有一个返回值,表示这个函数执行是否成功
代码
typedef enum {
NPVariantType_Void,
NPVariantType_Null,
NPVariantType_Bool,
NPVariantType_Int32,
NPVariantType_Double,
NPVariantType_String,
NPVariantType_Object
} NPVariantType;
typedef struct _NPVariant {
NPVariantType type;
union {
bool boolValue;
uint32_t intValue;
double_t doubleValue;
NPString stringValue;
NPObject *objectValue;
} value;
} NPVariant;
有关这个结构我就不用说了吧,一眼就能看明白
如果NPVariantType==NPVariantType_String;那么stringValue.utf8characters要使用NPN_MemAlloc来申请内存,使用完毕的NPVariant使用NPN_ReleaseVariantValue释放
以下的函数同上面的类似,就简单写
InvokeDefaultFunction:调用默认函数
HasPropertyFunction:是否有指定的属性
GetPropertyFunction:获得属性
SetPropertyFunction:设置属性
RemovePropertyFunction:移除属性
不知道我理解上是否有误差,反正我写的plugin工作还算是正常的...
最后说要说的两点就是NPObject在意义上和基本NPAPI中的NPP instance意义差不多,不过使用plugin自定义的创建和销毁函数,虽然在旧版API中NPP_New函数的argn和argv参数定义是char,但实际上是UTF-8,这也是为什么有些plugin不支持中文的缘故,字符串转换错了...
写得比较乱...还有就是event的实现,因为我没有在文档中找到可以直接使用的方法,所以我是利用扩展接口,使用XPCOM,与Gecko直接通讯的方式,实现起来稍微有点麻烦,等我以后有时间再写吧...
相关文章推荐
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- MvvmCross for WPF File Plugin
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- Tools For Local Cross Browser Testing
- Socket.IO: the cross-browser WebSocket for realtime apps.
- jquery crossdomain post plugin i changed bit test code suite for my env,due to the windows env is not familiar with github operation,i didn't forked form the original resposeritoy
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- Could not get the value for parameter encoding for plugin execution default-resources Plugin org.apa
- A TensorBoard plugin for visualizing arbitrary tensors in a video as your network trains.
- GeckoFX内核浏览器开发--关闭浏览器提示Plugin Container for Nightly 已停止工作解决方案 转
- Java Decompiler Plugin For Eclipse IDE
- AKVIS MultiBrush Plugin for Mac(PS人像照片增强和优化修饰插件) v9.0.1631.14151破解版
- Neural Social Collaborative Ranking (NSCR) for the new task of cross-domain social recommendation
- NHibernate Plugin for Visual Studio 2005
- How to Cross Compile the Bash shell for Android 1.5 (为Android平台编译Bash shell)
- No plugin found for prefix 'jetty' in the current project and in the plugin groups
- Handler-Socket Plugin for MySQL – SQL的功能、NoSQL的性能
- Cross Compile libdnet and Python for Montavista/PowerPC