Cross-browser NPAPI extensions for plugin scriptability

原文出处: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直接通讯的方式,实现起来稍微有点麻烦,等我以后有时间再写吧...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值