从Javascript向Chrome插件传递int参数的问题
来源:互联网 发布:四层横移编程 编辑:程序博客网 时间:2024/05/22 21:00
使用NPAPI编写了一个插件,其中有一个方法是获取从JS代码中传入的数值与字符串并将其显示出来。该方法在FireFox下工作比较正常,但是在Chrome下会出现两个问题:
- 从JS代码传入任意整数,希望其识别为int,但实际上被认作了double。导致后面取值的时候int值为0。
- 从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);
}
}
- 从Javascript向Chrome插件传递int参数的问题
- 向用户控件传递参数的问题
- 向用户控件传递参数的问题
- JavaScript向php传递参数
- django bootstrap 向modal插件传递参数
- javascript函数参数的传递问题
- 从UI向服务器传递参数
- 从JCL向PROGRAM传递参数
- 关于向方法中传递参数的问题
- javascript函数传递参数-----按值传递(google chrome)
- javascript+attachEvent传递参数问题
- 解决javascript通过url向Jsp页面传递中文参数乱码问题
- CAS向客户端传递参数乱码问题
- CAS向客户端传递参数乱码问题
- CAS向客户端传递参数乱码问题
- chrome 插件-消息传递
- int 0x13中断的参数传递
- Javascript 传递中文参数 乱码问题 的解决
- 2017多校第二场 HDU 6052 To my boyfriend 思维,计数题
- 根据动态二维数组输出一个稀疏矩阵,根据我自己想输入的稀疏矩阵来输出对应的三元组
- MySql问题积累
- C++写时拷贝
- 1067. Sort with Swap(0,*) (25)
- 从Javascript向Chrome插件传递int参数的问题
- C语言:gets/puts输入输出字符串
- 【unity3d学习笔记】RPG 中控制相机距离拉近拉远以及旋转相机视角
- 软件设计原则-- 开放-封闭原则
- 浪里个浪 FZU
- HDU_【2017 Multi-University Training Contest 1】——1001 Add More Zero
- STL之迭代器与traits编程技法
- 11、Bootstrap--图片样式、辅助类样式及CSS组件
- JavaScript对象中的属性能否有对象类型