从Javascript向Chrome插件传递int参数的问题

在Firefox下,一个使用NPAPI编写的插件能正常接收JS传递的数值和字符串,但在Chrome下,整数被识别为double导致取值错误,字符串后面出现乱码。问题1的解决方法是修改npruntime.h,将宏NPVARIANT_TO_INT32改为强制转换为int。问题2是由于缺少,通过在UTF8Length位置添加或自定义转换方法NPVARIANT_TO_LPTSTR来修复。
摘要由CSDN通过智能技术生成


使用NPAPI编写了一个插件,其中有一个方法是获取从JS代码中传入的数值与字符串并将其显示出来。该方法在FireFox下工作比较正常,但是在Chrome下会出现两个问题:

  1. 从JS代码传入任意整数,希望其识别为int,但实际上被认作了double。导致后面取值的时候int值为0。
  2. 从JS代码传入任意字符串,发现得到的stringValue中,UTF8Length数值正常,但UTF8Characters在原本的字符串后面加上了一些乱码。

之前我以为这两个问题都是JS代码向Webkit浏览器传递参数时的问题,解决方案应该是一样的。后来才发现,实际上这是两个不同的问题,问题原因与解决方式并不相同。

 

对于问题1,实际上JS代码本身并没有能力指出int类型与double类型(即使使用了parseInt这种方法也没用),因此如何识别就依靠于浏览器。Firefox可以正确的将整数123识别为intValue,但是Chrome、Safari等Webkit核的浏览器就做不到这一点,将其当成了doubleValue。在网上搜索这个问题的时候,有人表示在之前Chrome是能够正常识别的,因此认为目前不能正常识别了是个Bug。嗯……是不是Bug我不知道- = 反正嘛,要解决这一问题,有一种简单粗暴的方式:直接对npruntime.h文件进行修改,找到宏NPVARIANT_TO_INT32(_v),将其改为:

#define NPVARIANT_TO_INT32(_v)   (NPVARIANT_IS_INT32(_v)?(_v).value.intValue:(_v).value.doubleValue)

这样就可以了。

当然,这种方式要求使用者明确自己所调用的必须是Int类型的数值,不然得到的结果就可能会不太理想。

 

 

对于问题2,明眼人一下子就能看出来,是因为缺少了\0。FireFox这方面做得还比较好,而Chrome就不会自动添加\0了。既然UTF8length读取到的值是正确的,那么我们可以在UTF8Length的位置上写一个\0,这样就正常了。依然是在npruntime.h中进行修改。我在里面添加了一个方法:

复制代码
 1 // Created by liuwei @ 2013.8.15
 2 // 添加方法getStringValueFromNPVariant
 3 // 为NPVariant的stringValue在合适的位置上添加\0
 4 inline char* getStringValueFromNPVariant(NPVariant v){
 5     if(!NPVARIANT_IS_STRING(v))
 6         return NULL;
 7     char* srcStr = (char *)(v.value.stringValue.UTF8Characters);
 8     int strLen = v.value.stringValue.UTF8Length;
 9     char* destStr = (char *)NPN_MemAlloc(strLen + 1);
10     memcpy(destStr, srcStr, strLen+1);
11     destStr[strLen] = NULL;
12     return destStr;
13 }
复制代码

然后添加一个宏 NPVARIANT_TO_LPTSTR:

#define NPVARIANT_TO_LPTSTR(_v)        getStringValueFromNPVariant(_v)

除过以上方法还可以这么做:

int CPluginObject::NPVariantToInt(const NPVariant* args, const int index)
{
    if (NPVARIANT_IS_INT32(args[index]))
    {
        return NPVARIANT_TO_INT32(args[index]);
    }
    else
    {
        return atoi((char*)NPVARIANT_TO_STRING(args[index]).UTF8Characters);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值